diff --git a/etc/migracao/migra.py b/etc/migracao/migra.py index dc0cfff..b7f99e6 100755 --- a/etc/migracao/migra.py +++ b/etc/migracao/migra.py @@ -71,7 +71,7 @@ def migra_assembleias(filename): bairro = aux_end[1].replace(' ', '', 1) else: bairro = '' - casa = CasaLegislativa( + casa = Orgao( municipio=municipio, nome=line[NOME_COL], tipo=tipo_casa, @@ -160,7 +160,7 @@ def migra_casas(filename): bairro = '' if(aux_end.__len__() > 1): bairro = aux_end[1].replace(' ', '', 1) - casa = CasaLegislativa( + casa = Orgao( municipio=municipio, nome='Câmara Municipal de ' + line[NOME_COL], tipo=tipo_casa, @@ -214,11 +214,11 @@ def migra_cnpj(filename): linenum += 1 try: - casa = CasaLegislativa.objects.get(municipio__codigo_tse=line[COD_TSE_COL]) - except CasaLegislativa.DoesNotExist: + casa = Orgao.objects.get(municipio__codigo_tse=line[COD_TSE_COL]) + except Orgao.DoesNotExist: print ERROR_MSG_1 % (filename, linenum) continue - except CasaLegislativa.MultipleObjectsReturned: + except Orgao.MultipleObjectsReturned: print ERROR_MSG_1 % (filename, linenum) continue except ValueError: @@ -271,12 +271,12 @@ def migra_convenios_casas(filename): linenum += 1 try: - casa = CasaLegislativa.objects.get(municipio__codigo_ibge=line[COD_IBGE_COL]) - except CasaLegislativa.DoesNotExist: + casa = Orgao.objects.get(municipio__codigo_ibge=line[COD_IBGE_COL]) + except Orgao.DoesNotExist: print "Erro ao inserir convênio. Casa não existe" print ERROR_MSG_1 % (filename, linenum) continue - except CasaLegislativa.MultipleObjectsReturned: + except Orgao.MultipleObjectsReturned: print ERROR_MSG_1 % (filename, linenum) continue except ValueError: @@ -373,11 +373,11 @@ def migra_convenios_assembleias(filename): linenum += 1 try: - assembleia = CasaLegislativa.objects.get(municipio__uf__sigla=line[SIGLA_COL], tipo=tipo_casa) - except CasaLegislativa.DoesNotExist: + assembleia = Orgao.objects.get(municipio__uf__sigla=line[SIGLA_COL], tipo=tipo_casa) + except Orgao.DoesNotExist: print ERROR_MSG_1 % (filename, linenum) continue - except CasaLegislativa.MultipleObjectsReturned: + except Orgao.MultipleObjectsReturned: print ERROR_MSG_1 % (filename, linenum) continue except ValueError: diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index f7e49aa..709a9fe 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -901,7 +901,7 @@ msgid "Data de Aceite" msgstr "" #: sigi/apps/convenios/reports.py:143 -msgid "CasaLegislativa: " +msgid "Orgao: " msgstr "" #: sigi/apps/convenios/reports.py:250 diff --git a/scripts/importa_pesquisa.py b/scripts/importa_pesquisa.py index cac1c32..ad0c9c4 100644 --- a/scripts/importa_pesquisa.py +++ b/scripts/importa_pesquisa.py @@ -26,16 +26,16 @@ import csv import urlparse from datetime import datetime -from sigi.apps.casas.models import CasaLegislativa +from sigi.apps.casas.models import Orgao from sigi.apps.servidores.models import Servidor def importa(file_list): - ''' Este script importa dados de um arquivo CSV e dá carga no model casas.CasaLegislativa + ''' Este script importa dados de um arquivo CSV e dá carga no model casas.Orgao O arquivo CSV esperado tem um cabeçalho de campos na primeira linha, com os seguintes campos: - + Indicação de data e hora,Pesquisador,Câmara,Possui portal,Portal Modelo,URL,Observações - + Indicação de data e hora: Uma string datetime no formato %d/%m/%y %H:%M Pesquisador: O nome do servidor que realizou a pesquisa, conforme cadastrado no SIGI Câmara: A sigla da UF seguida de um espaço, seguido de um caracter - seguido de um espaço seguido do nome do município, @@ -43,19 +43,19 @@ def importa(file_list): Possui portal: Deve constar "sim" ou "não" indicando se a casa possui ou não portal. Portal Modelo: Deve constar "sim" ou "não" indicando se o portal da casa é o portal modelo ou não. URL: Deve conter a URL do portal da Casa. Opcionalmente pode ter alguma observação do pesquisador - Observações: Deve conter as observações do pesquisador, caso existam.''' - + Observações: Deve conter as observações do pesquisador, caso existam.''' + for filename in file_list: print 'Importando '+filename+'.csv' with open(filename+'.csv', 'rb') as infile: with open(filename+'.out', 'wb') as outfile: indata = csv.reader(infile, delimiter=',', quotechar='"') outdata = csv.writer(outfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL) - + head = next(indata) head.append('Erros encontrados') outdata.writerow(head) - + for row in indata: data = row[0].strip() pesquisador = row[1].strip() @@ -64,32 +64,32 @@ def importa(file_list): pmodelo = row[4].strip() url = row[5].strip() obs = row[6].strip() - + if data == '': data = None else: data = datetime.strptime(data, '%d/%m/%y %H:%M') - + uf = uf_cidade[:2] cidade = uf_cidade[5:] - + if tem_portal.lower() == 'não': - inclusao = CasaLegislativa.INCLUSAO_DIGITAL_CHOICES[1][0] + inclusao = Orgao.INCLUSAO_DIGITAL_CHOICES[1][0] elif pmodelo.lower() == 'não': - inclusao = CasaLegislativa.INCLUSAO_DIGITAL_CHOICES[3][0] + inclusao = Orgao.INCLUSAO_DIGITAL_CHOICES[3][0] else: - inclusao = CasaLegislativa.INCLUSAO_DIGITAL_CHOICES[2][0] - + inclusao = Orgao.INCLUSAO_DIGITAL_CHOICES[2][0] + l = url.splitlines() url = '' - + for s in l: p = urlparse.urlparse(s) if p.netloc: url = s else: obs = obs + '\n' + s - + if pesquisador == '': servidor = None else: @@ -101,8 +101,8 @@ def importa(file_list): continue else: servidor = servidor[0] - - casa = CasaLegislativa.objects.filter(tipo_id=1, municipio__uf__sigla=uf, municipio__nome__iexact=cidade) + + casa = Orgao.objects.filter(tipo_id=1, municipio__uf__sigla=uf, municipio__nome__iexact=cidade) cc = casa.count() if cc == 0: row.append('Municipio nao foi encontrado') @@ -114,18 +114,18 @@ def importa(file_list): continue else: casa = casa[0] - + casa.inclusao_digital = inclusao casa.data_levantamento = data casa.pesquisador = servidor - + if casa.pagina_web == '': casa.pagina_web = url else: obs = url + '\n' + obs - + casa.obs_pesquisa = obs casa.save() - - print 'O arquivo '+filename+'.out foi criado com os registros que nao puderam ser importados' - + + print 'O arquivo '+filename+'.out foi criado com os registros que nao puderam ser importados' + diff --git a/scripts/verificacao_arquivos_faltando_media.py b/scripts/verificacao_arquivos_faltando_media.py index 90cc79f..367b6f6 100644 --- a/scripts/verificacao_arquivos_faltando_media.py +++ b/scripts/verificacao_arquivos_faltando_media.py @@ -9,7 +9,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse from terminaltables import AsciiTable -from sigi.apps.casas.models import CasaLegislativa +from sigi.apps.casas.models import Orgao from sigi.apps.convenios.models import Anexo as AnexoConvenios from sigi.apps.diagnosticos.models import Anexo as AnexoDiagnosticos from sigi.apps.ocorrencias.models import Anexo as AnexoOcorrencias @@ -31,7 +31,7 @@ def url(obj): # IMAGENS FALTANDO imagens_faltando = [[u"SITUAÇÃO DO ARQUIVO DA FOTO ", "URL", "OBJETO"]] -for cl in (CasaLegislativa, Parlamentar, Servidor): +for cl in (Orgao, Parlamentar, Servidor): for a in cl.objects.all(): if a.foto: imagens_faltando.append([ diff --git a/sigi/apps/casas/admin.py b/sigi/apps/casas/admin.py index ed511d9..7cd039e 100644 --- a/sigi/apps/casas/admin.py +++ b/sigi/apps/casas/admin.py @@ -8,18 +8,18 @@ from django.shortcuts import render from django.utils.translation import ugettext as _ from image_cropping import ImageCroppingMixin -from sigi.apps.casas.forms import CasaLegislativaForm -from sigi.apps.casas.models import CasaLegislativa, Presidente, Funcionario, TipoOrgao +from sigi.apps.casas.forms import OrgaoForm +from sigi.apps.casas.models import Orgao, Presidente, Funcionario, TipoOrgao from sigi.apps.casas.views import report_complete, labels_report, export_csv, \ labels_report_sem_presidente, report, \ adicionar_casas_carrinho from sigi.apps.contatos.models import Telefone from sigi.apps.convenios.models import Convenio, Projeto -from sigi.apps.diagnosticos.models import Diagnostico -from sigi.apps.inventario.models import Bem +# from sigi.apps.diagnosticos.models import Diagnostico +# from sigi.apps.inventario.models import Bem from sigi.apps.metas.models import PlanoDiretor from sigi.apps.ocorrencias.models import Ocorrencia -from sigi.apps.parlamentares.models import Legislatura +# from sigi.apps.parlamentares.models import Legislatura from sigi.apps.servicos.models import Servico, TipoServico from sigi.apps.servidores.models import Servidor from sigi.apps.utils import queryset_ascii @@ -129,7 +129,7 @@ class ConveniosInline(admin.TabularInline): return "" status = obj.get_status() - if status in [u"Vencido", u"Desistência"]: + if status in [u"Vencido", u"Desistência", u"Cancelado"]: label = r"danger" elif status == u"Vigente": label = r"success" @@ -164,51 +164,47 @@ class ConveniosInline(admin.TabularInline): link_sigad.short_description = _("Processo no Senado") link_sigad.allow_tags = True - -class LegislaturaInline(admin.TabularInline): - model = Legislatura - fields = ['numero', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares', 'link_parlamentares', ] - readonly_fields = ['link_parlamentares', ] - - def link_parlamentares(self, obj): - if obj.pk is None: - return "" - from django.core.urlresolvers import reverse - url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk]) - url = url + '?_popup=1' - return """ - - Editar - """ % (obj.pk, obj.pk, url) - - link_parlamentares.short_description = _(u'Parlamentares') - link_parlamentares.allow_tags = True - - -class DiagnosticoInline(admin.TabularInline): - model = Diagnostico - fields = ['data_visita_inicio', 'data_visita_fim', 'publicado', 'data_publicacao', 'responsavel', 'link_diagnostico', ] - readonly_fields = ['data_visita_inicio', 'data_visita_fim', 'publicado', 'data_publicacao', 'responsavel', 'link_diagnostico', ] - extra = 0 - max_num = 0 - can_delete = False - - def link_diagnostico(self, obj): - if obj.pk is None: - return "" - url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=["%s.pdf" % obj.pk]) - return """ - - Abrir PDF - """ % (obj.pk, obj.pk, url) - - link_diagnostico.short_description = _(u'Ver PDF') - link_diagnostico.allow_tags = True - - -class BemInline(admin.TabularInline): - model = Bem - +# class LegislaturaInline(admin.TabularInline): +# model = Legislatura +# fields = ['numero', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares', 'link_parlamentares', ] +# readonly_fields = ['link_parlamentares', ] + +# def link_parlamentares(self, obj): +# if obj.pk is None: +# return "" +# from django.core.urlresolvers import reverse +# url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk]) +# url = url + '?_popup=1' +# return """ +# +# Editar +# """ % (obj.pk, obj.pk, url) + +# link_parlamentares.short_description = _(u'Parlamentares') +# link_parlamentares.allow_tags = True + +# class DiagnosticoInline(admin.TabularInline): +# model = Diagnostico +# fields = ['data_visita_inicio', 'data_visita_fim', 'publicado', 'data_publicacao', 'responsavel', 'link_diagnostico', ] +# readonly_fields = ['data_visita_inicio', 'data_visita_fim', 'publicado', 'data_publicacao', 'responsavel', 'link_diagnostico', ] +# extra = 0 +# max_num = 0 +# can_delete = False + +# def link_diagnostico(self, obj): +# if obj.pk is None: +# return "" +# url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=["%s.pdf" % obj.pk]) +# return """ +# +# Abrir PDF +# """ % (obj.pk, obj.pk, url) + +# link_diagnostico.short_description = _(u'Ver PDF') +# link_diagnostico.allow_tags = True + +# class BemInline(admin.TabularInline): +# model = Bem class ServicoInline(admin.TabularInline): model = Servico @@ -218,10 +214,8 @@ class ServicoInline(admin.TabularInline): max_num = 0 can_delete = False - -class PlanoDiretorInline(admin.TabularInline): - model = PlanoDiretor - +# class PlanoDiretorInline(admin.TabularInline): +# model = PlanoDiretor class OcorrenciaInline(admin.TabularInline): model = Ocorrencia @@ -309,12 +303,11 @@ class ServicoFilter(admin.SimpleListFilter): return queryset.distinct('municipio__uf__nome', 'nome') -class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin): - form = CasaLegislativaForm +class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin): + form = OrgaoForm actions = ['adicionar_casas', ] inlines = (TelefonesInline, PresidenteInline, FuncionariosInline, - ConveniosInline, LegislaturaInline, DiagnosticoInline, BemInline, - ServicoInline, PlanoDiretorInline, OcorrenciaInline,) + ConveniosInline, ServicoInline, OcorrenciaInline,) list_display = ('nome', 'get_uf', 'get_gerentes', 'get_convenios', 'get_servicos') list_display_links = ('nome',) @@ -342,7 +335,7 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin): }), ) raw_id_fields = ('municipio',) - readonly_fields = ['num_parlamentares', ] + readonly_fields = ['num_parlamentares', 'gerentes_interlegis',] search_fields = ('search_text', 'cnpj', 'bairro', 'logradouro', 'cep', 'municipio__nome', 'municipio__uf__nome', 'municipio__codigo_ibge', 'pagina_web', 'observacoes') @@ -374,14 +367,17 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin): get_servicos.allow_tags = True def changelist_view(self, request, extra_context=None): - return super(CasaLegislativaAdmin, self).changelist_view( + return super(OrgaoAdmin, self).changelist_view( request, extra_context={'query_str': '?' + request.META['QUERY_STRING']} ) def lookup_allowed(self, lookup, value): - return super(CasaLegislativaAdmin, self).lookup_allowed(lookup, value) or \ - lookup in ['municipio__uf__codigo_ibge__exact', 'convenio__projeto__id__exact'] + return (super(OrgaoAdmin, self).lookup_allowed(lookup, value) or + lookup in ['tipo__legislativo__exact', + 'tipo__sigla__exact', + 'municipio__uf__codigo_ibge__exact', + 'convenio__projeto__id__exact']) def etiqueta(self, request, queryset): return labels_report(request, queryset=queryset) @@ -426,11 +422,11 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin): adicionar_casas.short_description = _(u"Armazenar casas no carrinho para exportar") def get_actions(self, request): - actions = super(CasaLegislativaAdmin, self).get_actions(request) + actions = super(OrgaoAdmin, self).get_actions(request) if 'delete_selected' in actions: del actions['delete_selected'] return actions -admin.site.register(CasaLegislativa, CasaLegislativaAdmin) +admin.site.register(Orgao, OrgaoAdmin) admin.site.register(TipoOrgao) diff --git a/sigi/apps/casas/forms.py b/sigi/apps/casas/forms.py index fcaf3a5..dca4889 100644 --- a/sigi/apps/casas/forms.py +++ b/sigi/apps/casas/forms.py @@ -3,11 +3,11 @@ from django import forms from django.utils.translation import ugettext as _ from localflavor.br.forms import BRZipCodeField -from sigi.apps.casas.models import CasaLegislativa +from sigi.apps.casas.models import Orgao from sigi.apps.servidores.models import Servidor -class CasaLegislativaForm(forms.ModelForm): +class OrgaoForm(forms.ModelForm): # cnpj = BRCNPJField( # label=_(u'CNPJ'), # required=False, @@ -16,9 +16,16 @@ class CasaLegislativaForm(forms.ModelForm): cep = BRZipCodeField(label=_(u'CEP'), help_text=_(u'Formato') + ': XXXXX-XXX.') class Meta: - model = CasaLegislativa + model = Orgao fields = '__all__' - + + # def clean(self): + # cleaned_data = super(OrgaoForm, self).clean() + # tipo = cleaned_data.get('tipo') + # municipio = cleaned_data.get('municipio') + # if tipo.legislativo: + # if Orgao.objects.filter(tipo=tipo) + class PortfolioForm(forms.Form): ACAO_CHOICES = ( ('ADD', _(u"Adicionar")), @@ -34,7 +41,7 @@ class PortfolioForm(forms.Form): queryset=Servidor.objects.all(), label=_(u"Atribuir para") ) - + # O label precisa ser trocado dependendo da região que se está visualizando def __init__(self, label=_(u"Atribuir para"), *args, **kwargs): super(PortfolioForm, self).__init__(*args, **kwargs) diff --git a/sigi/apps/casas/management/commands/importa_gerentes.py b/sigi/apps/casas/management/commands/importa_gerentes.py index 5994980..ce3d009 100644 --- a/sigi/apps/casas/management/commands/importa_gerentes.py +++ b/sigi/apps/casas/management/commands/importa_gerentes.py @@ -25,41 +25,41 @@ import csv import os from django.core.management.base import BaseCommand, CommandError -from sigi.apps.casas.models import CasaLegislativa +from sigi.apps.casas.models import Orgao from sigi.apps.servidores.models import Servidor from sigi.apps.contatos.models import Municipio class Command(BaseCommand): args = u"data_file.csv" help = u"""Importa dados de atribuição de gerencia de relacionamentos de um arquivo CSV. - + A primeira linha do arquivo deve possuir um cabeçalho com os seguintes campos obrigatórios: - cod_municipio : Código IBGE do município - user_id : Nome de usuário (usado no login) do gerente de relacionamento da Casa - + * Os nomes dos campos devem ser grafados exatamente como descrito.""" - + campos = {'cod_municipio', 'user_id'} - + def handle(self, *args, **options): if len(args) != 1: raise CommandError(u"Informe UM arquivo csv a importar") - + file_name = args[0] - + if not os.path.isfile(file_name): raise CommandError(u"Arquivo %s não encontrado" % [file_name,]) - + with open(file_name, 'rb') as csvfile: reader = csv.DictReader(csvfile) - + if not self.campos.issubset(reader.fieldnames): raise CommandError(u"O arquivo não possui todos os campos obrigatórios") - - CasaLegislativa.gerentes_interlegis.through.objects.all().delete() - + + Orgao.gerentes_interlegis.through.objects.all().delete() + erros = 0 - + for reg in reader: try: municipio = Municipio.objects.get( @@ -86,13 +86,13 @@ class Command(BaseCommand): ) erros = erros + 1 continue - - for casa in municipio.casalegislativa_set.filter( + + for casa in municipio.orgao_set.filter( tipo__sigla__in=['AL', 'CM']): casa.gerentes_interlegis.add(gerente) casa.save() - + self.stdout.write(u"Importação concluída. {erros} erros em {linhas}" - u" linhas".format(erros=erros, + u" linhas".format(erros=erros, linhas=reader.line_num) ) \ No newline at end of file diff --git a/sigi/apps/casas/migrations/0014_auto_20210406_1945.py b/sigi/apps/casas/migrations/0014_auto_20210406_1945.py new file mode 100644 index 0000000..32ee5a2 --- /dev/null +++ b/sigi/apps/casas/migrations/0014_auto_20210406_1945.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import image_cropping.fields +import sigi.apps.utils + + +class Migration(migrations.Migration): + + dependencies = [ + # ('metas', '0002_auto_20210406_1945'), + ('contatos', '0002_auto_20151104_0810'), + ('servidores', '0001_initial'), + # ('parlamentares', '0002_auto_20210406_1945'), + # ('servicos', '0005_auto_20210406_1945'), + ('servicos', '0004_delete_casaatendida'), + # ('inventario', '0002_auto_20210406_1945'), + # ('convenios', '0003_auto_20210406_1945'), + # ('ocorrencias', '0003_auto_20210406_1945'), + # ('diagnosticos', '0004_auto_20210406_1945'), + # ('eventos', '0005_auto_20210406_1945'), + ('casas', '0013_auto_20210406_1428'), + ] + + operations = [ + migrations.RenameModel( + old_name='CasaLegislativa', + new_name='Orgao', + ), + ] diff --git a/sigi/apps/casas/migrations/0015_auto_20210407_0801.py b/sigi/apps/casas/migrations/0015_auto_20210407_0801.py new file mode 100644 index 0000000..93f7b4b --- /dev/null +++ b/sigi/apps/casas/migrations/0015_auto_20210407_0801.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('casas', '0014_auto_20210406_1945'), + ] + + operations = [ + migrations.AlterModelOptions( + name='orgao', + options={'ordering': ('nome',), 'verbose_name': '\xd3rg\xe3o', 'verbose_name_plural': '\xd3rg\xe3os'}, + ), + migrations.AddField( + model_name='tipoorgao', + name='legislativo', + field=models.BooleanField(default=False, verbose_name='Poder legislativo'), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='orgao', + unique_together=set([]), + ), + ] diff --git a/sigi/apps/casas/migrations/0016_auto_20210407_1559.py b/sigi/apps/casas/migrations/0016_auto_20210407_1559.py new file mode 100644 index 0000000..91b5347 --- /dev/null +++ b/sigi/apps/casas/migrations/0016_auto_20210407_1559.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('casas', '0015_auto_20210407_0801'), + ] + + operations = [ + migrations.AlterField( + model_name='orgao', + name='gerentes_interlegis', + field=models.ManyToManyField(related_name='casas_que_gerencia', verbose_name='Gerentes Interlegis', to='servidores.Servidor', blank=True), + preserve_default=True, + ), + ] diff --git a/sigi/apps/casas/models.py b/sigi/apps/casas/models.py index 71939c0..38548fd 100644 --- a/sigi/apps/casas/models.py +++ b/sigi/apps/casas/models.py @@ -3,6 +3,7 @@ from datetime import datetime import random from string import ascii_uppercase from unicodedata import normalize +from django.core.exceptions import ValidationError from django.utils.translation import ugettext as _ from django.contrib.contenttypes import generic from django.db import models @@ -12,9 +13,7 @@ from sigi.apps.contatos.models import Municipio from sigi.apps.servidores.models import Servidor from sigi.apps.utils import SearchField - class TipoOrgao(models.Model): - """ Modelo para representar o tipo da Casa Legislativa Geralmente: Câmara Municipal, Assembléia Legislativa, @@ -23,6 +22,7 @@ class TipoOrgao(models.Model): sigla = models.CharField(_(u"Sigla"), max_length=5) nome = models.CharField(_(u"Nome"), max_length=100) + legislativo = models.BooleanField(_(u"Poder legislativo"), default=False) class Meta: verbose_name = _(u"Tipo de órgão") @@ -31,9 +31,7 @@ class TipoOrgao(models.Model): def __unicode__(self): return self.nome - -class CasaLegislativa(models.Model): - +class Orgao(models.Model): """ Modelo para representar uma Casa Legislativa """ @@ -72,7 +70,8 @@ class CasaLegislativa(models.Model): gerentes_interlegis = models.ManyToManyField( Servidor, verbose_name=_(u"Gerentes Interlegis"), - related_name='casas_que_gerencia' + related_name='casas_que_gerencia', + blank=True, ) # Informações de contato @@ -143,9 +142,8 @@ class CasaLegislativa(models.Model): class Meta: ordering = ('nome',) - unique_together = ('municipio', 'tipo') - verbose_name = _(u'Casa Legislativa') - verbose_name_plural = _(u'Casas Legislativas') + verbose_name = _(u'Órgão') + verbose_name_plural = _(u'Órgãos') def lista_gerentes(self, fmt='html'): if not self.gerentes_interlegis.exists(): @@ -210,7 +208,7 @@ class CasaLegislativa(models.Model): if codigo == '': if self.tipo.sigla == 'AL': # Assembléias são tratadas a parte codigo = 'A' + self.municipio.uf.sigla - if CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() <= 0: + if Orgao.objects.filter(codigo_interlegis=codigo).count() <= 0: # Só grava o código se ele for inédito self.codigo_interlegis = codigo self.save() @@ -243,7 +241,7 @@ class CasaLegislativa(models.Model): cityName = cityName.replace(' ', '') ultima = len(cityName) - while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ + while Orgao.objects.filter(codigo_interlegis=codigo). \ count() > 0 and ultima > 0: codigo = codigo[:2] + cityName[ultima - 1: ultima] ultima -= 1 @@ -252,11 +250,11 @@ class CasaLegislativa(models.Model): # não gerou um código único, então vamos compor o nome usando as # três primeiras consoantes. - if CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() > 0: + if Orgao.objects.filter(codigo_interlegis=codigo).count() > 0: codigo_cons = cityName.replace('A', '').replace('E', '').\ replace('I', '').replace('O', '').replace('U', '')[:3] if len(codigo_cons) == 3 and \ - CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() > 0: + Orgao.objects.filter(codigo_interlegis=codigo).count() > 0: codigo = codigo_cons # Se ainda não gerou um nome único, vamos colocar dígitos no @@ -264,7 +262,7 @@ class CasaLegislativa(models.Model): i = 'A' - while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ + while Orgao.objects.filter(codigo_interlegis=codigo). \ count() > 0 and i <= 'Z': codigo = codigo[:2] + str(i) i = chr(ord(i) + 1) @@ -275,7 +273,7 @@ class CasaLegislativa(models.Model): i = 0 - while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ + while Orgao.objects.filter(codigo_interlegis=codigo). \ count() > 0 and i < 100: codigo = random.choice(cityName) + random.choice(cityName) + \ random.choice(cityName) @@ -286,10 +284,8 @@ class CasaLegislativa(models.Model): i = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ - count() > 0: - codigo = random.choice(i) + random.choice(i) + \ - random.choice(i) + while Orgao.objects.filter(codigo_interlegis=codigo).count() > 0: + codigo = random.choice(i) + random.choice(i) + random.choice(i) self.codigo_interlegis = codigo self.save() @@ -299,11 +295,22 @@ class CasaLegislativa(models.Model): def __unicode__(self): return self.nome + def clean(self): + if (hasattr(self, 'tipo') and hasattr(self, 'municipio') + and self.tipo.legislativo): + if Orgao.objects.filter( + tipo=self.tipo, + municipio=self.municipio).exclude(pk=self.pk).exists(): + raise ValidationError( + _(u"Já existe um(a) %(tipo)s em %(municipio)s"), + code='integrity', + params={'tipo': self.tipo, 'municipio': self.municipio}) + def save(self, *args, **kwargs): address_changed = False if self.pk is not None: - original = CasaLegislativa.objects.get(pk=self.pk) + original = Orgao.objects.get(pk=self.pk) if (self.logradouro != original.logradouro or self.bairro != original.bairro or self.municipio != original.municipio or @@ -315,7 +322,7 @@ class CasaLegislativa(models.Model): if address_changed: self.ult_alt_endereco = datetime.now() - return super(CasaLegislativa, self).save(*args, **kwargs) + return super(Orgao, self).save(*args, **kwargs) class Funcionario(models.Model): @@ -343,7 +350,7 @@ class Funcionario(models.Model): ("F", _(u"Feminino")) ] - casa_legislativa = models.ForeignKey(CasaLegislativa) + casa_legislativa = models.ForeignKey(Orgao) nome = models.CharField(_(u'nome completo'), max_length=60, blank=False) # nome.alphabetic_filter = True sexo = models.CharField( diff --git a/sigi/apps/casas/reports.py b/sigi/apps/casas/reports.py index e6e27c3..c2a380a 100644 --- a/sigi/apps/casas/reports.py +++ b/sigi/apps/casas/reports.py @@ -52,7 +52,7 @@ class CasasLegislativasLabels(Report): Usage example:: >>> from geraldo.generators import PDFGenerator - >>> queryset = CasaLegislativa.objects.filter(municipio__uf__sigla='MG') + >>> queryset = Orgao.objects.filter(municipio__uf__sigla='MG') >>> report = LabelsReport(queryset) >>> report.generate_by(PDFGenerator, filename='./inline-detail-report.pdf') diff --git a/sigi/apps/casas/templates/casas/lista_casas_carteira_snippet.html b/sigi/apps/casas/templates/casas/lista_casas_carteira_snippet.html index bcd53a4..0b2e4d7 100644 --- a/sigi/apps/casas/templates/casas/lista_casas_carteira_snippet.html +++ b/sigi/apps/casas/templates/casas/lista_casas_carteira_snippet.html @@ -31,26 +31,26 @@
{{ casa.nome }} | +{{ casa.nome }} | {{ casa.municipio.uf.get_regiao_display }} | {{ casa.municipio.uf }} | {{ casa.municipio.microrregiao.mesorregiao }} | diff --git a/sigi/apps/casas/test_casas.py b/sigi/apps/casas/test_casas.py index fe491ab..a2026ec 100644 --- a/sigi/apps/casas/test_casas.py +++ b/sigi/apps/casas/test_casas.py @@ -1,7 +1,7 @@ import pytest from django_dynamic_fixture import G -from sigi.apps.casas.models import CasaLegislativa +from sigi.apps.casas.models import Orgao @pytest.fixture @@ -14,4 +14,4 @@ def some_parliaments(): def parliaments_from_names(names): - return [G(CasaLegislativa, nome=name, foto=None,) for name in names] + return [G(Orgao, nome=name, foto=None,) for name in names] diff --git a/sigi/apps/casas/urls.py b/sigi/apps/casas/urls.py index 5381364..df6bf9f 100644 --- a/sigi/apps/casas/urls.py +++ b/sigi/apps/casas/urls.py @@ -6,33 +6,33 @@ urlpatterns = patterns( 'sigi.apps.casas.views', # Informacoes de uma casa legislativa - url(r'^casalegislativa/report_complete/$', 'report_complete', name='report-complete-all'), - url(r'^casalegislativa/(?P