From 5cdd0a2dac3617c078aeb96bb3a78f542d9eb99b Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 18 Sep 2014 16:28:57 -0300 Subject: [PATCH] Codigo refatorado para seguir a pep8 autopep8 -r --in-place --exclude 'urls.py' --ignore E501 . --- etc/data/ibge/sigi-import-ibge-2009.py | 65 +- etc/migracao/migra.py | 87 ++- sigi/apps/casas/admin.py | 76 +-- sigi/apps/casas/forms.py | 2 +- sigi/apps/casas/models.py | 75 +-- sigi/apps/casas/reports.py | 553 +++++++++--------- sigi/apps/casas/views.py | 180 +++--- sigi/apps/contatos/admin.py | 5 +- sigi/apps/contatos/filters.py | 8 +- sigi/apps/contatos/models.py | 120 ++-- sigi/apps/convenios/admin.py | 65 +- sigi/apps/convenios/models.py | 19 +- sigi/apps/convenios/reports.py | 270 ++++----- sigi/apps/convenios/views.py | 160 ++--- sigi/apps/diagnosticos/admin.py | 53 +- sigi/apps/diagnosticos/decorators.py | 1 + sigi/apps/diagnosticos/forms.py | 41 +- sigi/apps/diagnosticos/models.py | 68 ++- .../diagnosticos/templatetags/smart_if.py | 13 +- sigi/apps/diagnosticos/views.py | 28 +- sigi/apps/diagnosticos/widgets.py | 11 +- sigi/apps/financeiro/admin.py | 5 +- sigi/apps/financeiro/forms.py | 2 +- sigi/apps/financeiro/models.py | 6 +- sigi/apps/inventario/admin.py | 12 +- sigi/apps/inventario/models.py | 6 + sigi/apps/mesas/admin.py | 29 +- sigi/apps/mesas/models.py | 15 +- sigi/apps/metas/admin.py | 38 +- sigi/apps/metas/forms.py | 2 +- .../management/commands/gera_map_data.py | 4 +- sigi/apps/metas/models.py | 71 ++- sigi/apps/metas/templatetags/mapa_tags.py | 12 +- sigi/apps/metas/views.py | 78 +-- sigi/apps/ocorrencias/admin.py | 4 +- sigi/apps/ocorrencias/models.py | 18 +- sigi/apps/parlamentares/admin.py | 29 +- sigi/apps/parlamentares/models.py | 1 - sigi/apps/parlamentares/reports.py | 543 ++++++++--------- sigi/apps/parlamentares/views.py | 77 ++- sigi/apps/relatorios/reports.py | 66 +-- sigi/apps/servicos/admin.py | 55 +- .../commands/atualiza_uso_servico.py | 6 +- sigi/apps/servicos/models.py | 37 +- sigi/apps/servicos/views.py | 10 +- sigi/apps/servidores/admin.py | 41 +- sigi/apps/servidores/forms.py | 7 +- .../servidores/management/commands/migra.py | 143 ++--- .../management/commands/sync_ldap.py | 64 +- sigi/apps/servidores/models.py | 62 +- sigi/apps/servidores/views.py | 19 +- sigi/apps/utils/__init__.py | 7 +- sigi/apps/utils/admin_widgets.py | 6 +- sigi/apps/utils/alphabetic_filter.py | 11 +- sigi/apps/utils/decorators.py | 4 +- sigi/apps/utils/email.py | 2 +- sigi/context_processors.py | 28 +- sigi/shortcuts.py | 4 +- 58 files changed, 1808 insertions(+), 1616 deletions(-) diff --git a/etc/data/ibge/sigi-import-ibge-2009.py b/etc/data/ibge/sigi-import-ibge-2009.py index ad81d45..01fc9b4 100644 --- a/etc/data/ibge/sigi-import-ibge-2009.py +++ b/etc/data/ibge/sigi-import-ibge-2009.py @@ -1,40 +1,43 @@ -import sys, csv +import sys +import csv """ """ _root_dict = None -def getUFdict( root, ufid ): - return( root[ ufid ] ) - -def getCidadesDict( macrodict, microid ): - if macrodict = None: - return( None ) - microdoct = macrodict[ '__children' ] - if microdict = None: - microdict = {} - macrodict[ '__children' ] = microdict - -def main( ): - argc = len( sys.argv ) - arquivo = open( 'geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/DTB_05_05_2009.csv', 'r' ) - # despreza o cabecalho - arquivo.readline( ) - - lnum=0 - csv_reader = csv.reader( arquivo, delimiter=',', quotechar='"' ) - for registro in csv_reader: - if uf[ registro[ 0 ] ] = None: - uf[ registro[ 0 ] ] = {} - uf[ registro[ 0 ] ][ 'nome' ] = registro[ 1 ] - uf[ registro[ 0 ] ][ 'macrorregioes' ] = {} + +def getUFdict(root, ufid): + return(root[ufid]) + + +def getCidadesDict(macrodict, microid): + if macrodict = None: + return(None) + microdoct = macrodict['__children'] + if microdict = None: + microdict = {} + macrodict['__children'] = microdict + + +def main(): + argc = len(sys.argv) + arquivo = open('geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/DTB_05_05_2009.csv', 'r') + # despreza o cabecalho + arquivo.readline() + + lnum = 0 + csv_reader = csv.reader(arquivo, delimiter=',', quotechar='"') + for registro in csv_reader: + if uf[registro[0]] = None: + uf[registro[0]] = {} + uf[registro[0]]['nome'] = registro[1] + uf[registro[0]]['macrorregioes'] = {} # print "lnum: %s - %s" % ( lnum, registro ) - lnum = lnum + 1 - if lnum >= 10: - break + lnum = lnum + 1 + if lnum >= 10: + break if __name__ = "__main__": - main( ) - dumpdicts( ) - + main() + dumpdicts() diff --git a/etc/migracao/migra.py b/etc/migracao/migra.py index 5dd1777..a39a3f6 100755 --- a/etc/migracao/migra.py +++ b/etc/migracao/migra.py @@ -40,6 +40,7 @@ ERROR_MSG_1 = (' %s[%s]: erro ao inserir item, será necessário inserçã 'manual.') OBS_CONVENIO = ('Convênio sem termo de adesão') + def migra_assembleias(filename): # identificação das colunas nos arquivo CSV UF_COL = 5 @@ -61,14 +62,13 @@ def migra_assembleias(filename): header = reader.next() tipo_casa = TipoCasaLegislativa.objects.filter(sigla='AL').get() - for line in reader: uf = UnidadeFederativa.objects.get(sigla=line[UF_COL]) municipio = Municipio.objects.get(uf=uf, is_capital=True) aux_end = line[ENDERECO_COL].split('-') bairro = '' - if(aux_end.__len__()>1): + if(aux_end.__len__() > 1): bairro = aux_end[1].replace(' ', '', 1) else: bairro = '' @@ -139,12 +139,11 @@ def migra_casas(filename): PRESIDENTE_COL = 39 EMAIL_PRESIDENTE_COL = 43 REPRESENTANTE_COL = 85 - reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) header = reader.next() tipo_casa = TipoCasaLegislativa.objects.filter(sigla='CM').get() - + linenum = 1 for line in reader: linenum += 1 @@ -160,14 +159,14 @@ def migra_casas(filename): aux_end = line[ENDERECO_COL].split('-') bairro = '' - if(aux_end.__len__()>1): + if(aux_end.__len__() > 1): bairro = aux_end[1].replace(' ', '', 1) casa = CasaLegislativa( municipio=municipio, nome='Câmara Municipal de ' + line[NOME_COL], tipo=tipo_casa, logradouro=aux_end[0], - bairro=bairro, + bairro=bairro, cep=line[CEP_COL], email=line[EMAIL_COL], pagina_web=line[PAGINA_COL], @@ -202,6 +201,7 @@ def migra_casas(filename): representante = Contato(nome=line[REPRESENTANTE_COL], content_object=casa) representante.save() + def migra_cnpj(filename): # identificação das colunas no arquivo CSV COD_TSE_COL = 0 @@ -228,6 +228,7 @@ def migra_cnpj(filename): casa.cnpj = line[COD_CNPJ1_COL] if not 'EM BRANCO' in line[COD_CNPJ1_COL] else line[COD_CNPJ2_COL] casa.save() + def migra_convenios_casas(filename): def get_datetime_obj(data): ldata = data.split('-') @@ -235,9 +236,6 @@ def migra_convenios_casas(filename): return None return datetime(int(ldata[0]), int(ldata[1]), int(ldata[2])) - - - # identificação das colunas no arquivo CSV # No arquivo CSV colunas que contém _100 são do Programa Interlegis COD_IBGE_COL = 1 @@ -251,24 +249,23 @@ def migra_convenios_casas(filename): DATA_PUB_DIARIO = 30 DATA_DEV_VIA_CONV_CM = 32 - DATA_ADESAO_100_COL = 11 DATA_TERMO_ACEITE_100_COL = 22 NUM_CONVENIO_100_COL = 24 NUM_PROCESSO_SF_100_COL = 25 DATA_RETORNO_ASSINATURA_100_COL = 29 DATA_PUB_DIARIO_100_COL = 31 - #DATA_DEV_VIA_CONV_CM_100 = 32 Não foi registrado para as 100 + # DATA_DEV_VIA_CONV_CM_100 = 32 Não foi registrado para as 100 #DATA_POSTAGEM_CORREIO_100 = 26 reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) header = reader.next() linenum = 1 ###Geração de arquivos para análise### - import codecs - f1 = codecs.open('file1.txt','w' , encoding="utf-8") + import codecs + f1 = codecs.open('file1.txt', 'w', encoding="utf-8") f1.write(u'Casas que não tem Número Processo Senado Federal\n') - f2 = codecs.open('file2.txt','w', encoding="utf-8") + f2 = codecs.open('file2.txt', 'w', encoding="utf-8") f2.write(u'Casas que não tem data de adesão e não tem convênio mas recebeu equipamentos\n') ###### for line in reader: @@ -290,13 +287,13 @@ def migra_convenios_casas(filename): # Se o convênio não tiver data de adesão mas tiver data retorno assinatura copiar essa data para a data de adesão. obs = '' projeto = None - convenio1=None - convenio2=None - if line[DATA_ADESAO_COL]=='1001-01-01' and line[DATA_RETORNO_ASSINATURA].__len__()!=0: + convenio1 = None + convenio2 = None + if line[DATA_ADESAO_COL] == '1001-01-01' and line[DATA_RETORNO_ASSINATURA].__len__() != 0: line[DATA_ADESAO_COL] = line[DATA_RETORNO_ASSINATURA] obs = OBS_CONVENIO - - if line[DATA_ADESAO_COL]!='1001-01-01': + + if line[DATA_ADESAO_COL] != '1001-01-01': projeto = Projeto.objects.get(id=1) if projeto: @@ -314,41 +311,44 @@ def migra_convenios_casas(filename): observacao=obs,) ###Relatório### - if( (projeto or line[DATA_TERMO_ACEITE_COL]) and line[NUM_PROCESSO_SF_COL].__len__()==0): - f1.write(casa.nome+","+casa.municipio.uf.sigla+"\n") - if(projeto==None and line[DATA_TERMO_ACEITE_COL].__len__()!=0): - f2.write(casa.nome+","+casa.municipio.uf.sigla+"\n") - ###### - projeto=None + if((projeto or line[DATA_TERMO_ACEITE_COL]) and line[NUM_PROCESSO_SF_COL].__len__() == 0): + f1.write(casa.nome + "," + casa.municipio.uf.sigla + "\n") + if(projeto == None and line[DATA_TERMO_ACEITE_COL].__len__() != 0): + f2.write(casa.nome + "," + casa.municipio.uf.sigla + "\n") + ###### + projeto = None obs = '' - if line[DATA_ADESAO_100_COL]=='1001-01-01' and line[DATA_RETORNO_ASSINATURA_100_COL].__len__()!=0: + if line[DATA_ADESAO_100_COL] == '1001-01-01' and line[DATA_RETORNO_ASSINATURA_100_COL].__len__() != 0: line[DATA_ADESAO_100_COL] = line[DATA_RETORNO_ASSINATURA_100_COL] obs = OBS_CONVENIO - if line[DATA_ADESAO_100_COL]!='1001-01-01': + if line[DATA_ADESAO_100_COL] != '1001-01-01': projeto = Projeto.objects.get(id=2) - + if projeto: convenio2 = Convenio( - casa_legislativa=casa, - projeto=projeto, - num_processo_sf=line[NUM_PROCESSO_SF_100_COL], - num_convenio=line[NUM_CONVENIO_100_COL], - data_adesao=get_datetime_obj(line[DATA_ADESAO_100_COL]), - data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_100_COL]), - data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA_100_COL]), - data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO_100_COL]), - observacao=obs, + casa_legislativa=casa, + projeto=projeto, + num_processo_sf=line[NUM_PROCESSO_SF_100_COL], + num_convenio=line[NUM_CONVENIO_100_COL], + data_adesao=get_datetime_obj(line[DATA_ADESAO_100_COL]), + data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_100_COL]), + data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA_100_COL]), + data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO_100_COL]), + observacao=obs, ) try: - if convenio1: convenio1.save() - if convenio2: convenio2.save() + if convenio1: + convenio1.save() + if convenio2: + convenio2.save() except: print "Erro ao inserir convênio" print ERROR_MSG_0 % (filename, linenum) continue f1.close() - f2.close() + f2.close() + def migra_convenios_assembleias(filename): def get_datetime_obj(data): @@ -365,7 +365,7 @@ def migra_convenios_assembleias(filename): NUM_PROCESSO_SF_COL = 26 DATA_RETORNO_ASSINATURA = 27 DATA_PUB_DIARIO = 29 - + reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) header = reader.next() linenum = 1 @@ -394,7 +394,7 @@ def migra_convenios_assembleias(filename): data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_COL]), data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA]), data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO]), - ) + ) try: convenio.save() except: @@ -402,6 +402,7 @@ def migra_convenios_assembleias(filename): print convenio continue + def popula(): """ Será preciso cadastrar no banco os seguintes Projeto: @@ -423,8 +424,6 @@ def popula(): tipo2.save() tipo3 = TipoCasaLegislativa(sigla='CT', nome='Câmara Distrital') tipo3.save() - - if __name__ == '__main__': diff --git a/sigi/apps/casas/admin.py b/sigi/apps/casas/admin.py index 27ff3c4..8869d02 100644 --- a/sigi/apps/casas/admin.py +++ b/sigi/apps/casas/admin.py @@ -7,8 +7,8 @@ from django.http import HttpResponseRedirect from sigi.apps.casas.forms import CasaLegislativaForm from sigi.apps.casas.models import CasaLegislativa, Presidente, Funcionario, TipoCasaLegislativa from sigi.apps.casas.views import report_complete, labels_report, export_csv, \ - labels_report_sem_presidente, report, \ - adicionar_casas_carrinho + labels_report_sem_presidente, report, \ + adicionar_casas_carrinho from sigi.apps.utils import queryset_ascii from sigi.apps.contatos.models import Telefone from sigi.apps.convenios.models import Convenio @@ -28,7 +28,7 @@ class TelefonesInline(generic.GenericTabularInline): class PresidenteInline(admin.StackedInline): model = Presidente - exclude = ['cargo','funcao'] + exclude = ['cargo', 'funcao'] readonly_fields = ('ult_alteracao',) extra = 1 max_num = 1 @@ -38,11 +38,12 @@ class PresidenteInline(admin.StackedInline): class FuncionariosInline(admin.StackedInline): model = Funcionario fieldsets = ((None, { - 'fields': (('nome', 'sexo', 'nota', 'email'), ('cargo', 'funcao', 'setor', 'tempo_de_servico'), 'ult_alteracao') - }),) + 'fields': (('nome', 'sexo', 'nota', 'email'), ('cargo', 'funcao', 'setor', 'tempo_de_servico'), 'ult_alteracao') + }),) readonly_fields = ('ult_alteracao',) extra = 1 inlines = (TelefonesInline,) + def get_queryset(self, request): return self.model.objects.exclude(cargo="Presidente") @@ -50,15 +51,16 @@ class FuncionariosInline(admin.StackedInline): class ConveniosInline(admin.StackedInline): model = Convenio fieldsets = ( - (None, {'fields': (('link_convenio', 'num_processo_sf','num_convenio','projeto','observacao'), + (None, {'fields': (('link_convenio', 'num_processo_sf', 'num_convenio', 'projeto', 'observacao'), ('data_adesao', 'data_retorno_assinatura', 'data_termo_aceite', 'data_pub_diario', 'data_devolucao_via', 'data_postagem_correio'), - ('data_devolucao_sem_assinatura','data_retorno_sem_assinatura',), + ('data_devolucao_sem_assinatura', 'data_retorno_sem_assinatura',), ('get_tramitacoes', 'get_anexos', 'get_equipamentos',), )} - ), + ), ) - readonly_fields = ['get_tramitacoes', 'get_anexos', 'get_equipamentos', 'link_convenio',] + readonly_fields = ['get_tramitacoes', 'get_anexos', 'get_equipamentos', 'link_convenio', ] extra = 0 + def get_tramitacoes(self, obj): return '
'.join([t.__unicode__() for t in obj.tramitacao_set.all()]) get_tramitacoes.short_description = 'Tramitações' @@ -78,7 +80,7 @@ class ConveniosInline(admin.StackedInline): 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 = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk]) url = url + '?_popup=1' return """ @@ -91,14 +93,14 @@ class ConveniosInline(admin.StackedInline): class LegislaturaInline(admin.TabularInline): model = Legislatura - fields = ['numero', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares', 'link_parlamentares',] - readonly_fields = ['link_parlamentares',] + 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 = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk]) url = url + '?_popup=1' return """ @@ -111,8 +113,8 @@ class LegislaturaInline(admin.TabularInline): 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',] + 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 @@ -121,7 +123,7 @@ class DiagnosticoInline(admin.TabularInline): 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=["%s.pdf" % obj.pk] ) + url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=["%s.pdf" % obj.pk]) return """ Abrir PDF @@ -161,13 +163,13 @@ class CasaLegislativaAdmin(admin.ModelAdmin): form = CasaLegislativaForm change_form_template = 'casas/change_form.html' change_list_template = 'casas/change_list.html' - actions = ['adicionar_casas',] + actions = ['adicionar_casas', ] inlines = (TelefonesInline, PresidenteInline, FuncionariosInline, ConveniosInline, LegislaturaInline, DiagnosticoInline, BemInline, ServicoInline, PlanoDiretorInline, OcorrenciaInline, ) - list_display = ('nome','municipio','logradouro', 'ult_alt_endereco', 'get_convenios') + list_display = ('nome', 'municipio', 'logradouro', 'ult_alt_endereco', 'get_convenios') list_display_links = ('nome',) list_filter = ('tipo', 'municipio__uf__nome', 'convenio__projeto') - ordering = ('nome','municipio__uf') + ordering = ('nome', 'municipio__uf') queyrset = queryset_ascii fieldsets = ( (None, { @@ -175,7 +177,7 @@ class CasaLegislativaAdmin(admin.ModelAdmin): }), ('Endereço', { 'fields': ('data_instalacao', 'logradouro', 'bairro', - 'municipio', 'cep', 'pagina_web','email', 'ult_alt_endereco'), + 'municipio', 'cep', 'pagina_web', 'email', 'ult_alt_endereco'), }), ('Outras informações', { 'classes': ('collapse',), @@ -183,15 +185,15 @@ class CasaLegislativaAdmin(admin.ModelAdmin): }), ) raw_id_fields = ('municipio',) - readonly_fields = ['num_parlamentares',] - search_fields = ('search_text','cnpj', 'bairro', 'logradouro', + readonly_fields = ['num_parlamentares', ] + search_fields = ('search_text', 'cnpj', 'bairro', 'logradouro', 'cep', 'municipio__nome', 'municipio__uf__nome', 'municipio__codigo_ibge', 'pagina_web', 'observacoes') def get_convenios(self, obj): return '
    ' + ''.join(['
  • %s
  • ' % c.__unicode__() for c in obj.convenio_set.all()]) + '
' get_convenios.short_description = u'Convênios' - get_convenios.allow_tags= True + get_convenios.allow_tags = True def changelist_view(self, request, extra_context=None): return super(CasaLegislativaAdmin, self).changelist_view( @@ -203,45 +205,43 @@ class CasaLegislativaAdmin(admin.ModelAdmin): return super(CasaLegislativaAdmin, self).lookup_allowed(lookup, value) or \ lookup in ['municipio__uf__codigo_ibge__exact', 'convenio__projeto__id__exact'] - - def etiqueta(self,request,queryset): - return labels_report(request,queryset=queryset) + def etiqueta(self, request, queryset): + return labels_report(request, queryset=queryset) etiqueta.short_description = "Gerar etiqueta(s) da(s) casa(s) selecionada(s)" - def etiqueta_sem_presidente(self,request,queryset): - return labels_report_sem_presidente(request,queryset=queryset) + def etiqueta_sem_presidente(self, request, queryset): + return labels_report_sem_presidente(request, queryset=queryset) etiqueta_sem_presidente.short_description = "Gerar etiqueta(s) sem presidente da(s) casa(s) selecionada(s)" - def relatorio(self,request,queryset): - return report(request,queryset=queryset) + def relatorio(self, request, queryset): + return report(request, queryset=queryset) relatorio.short_description = u"Exportar a(s) casa(s) selecionada(s) para PDF" - def relatorio_completo(self,request,queryset): - return report_complete(request,queryset=queryset) + def relatorio_completo(self, request, queryset): + return report_complete(request, queryset=queryset) relatorio_completo.short_description = u"Gerar relatório completo da(s) casa(s) selecionada(s)" - def relatorio_csv(self,request,queryset): + def relatorio_csv(self, request, queryset): return export_csv(request) relatorio_csv.short_description = u"Exportar casa(s) selecionada(s) para CSV" def adicionar_casas(self, request, queryset): if 'carrinho_casas' in request.session: - #if request.session.has_key('carrinho_casas'): + # if request.session.has_key('carrinho_casas'): q1 = len(request.session['carrinho_casas']) else: q1 = 0 - response = adicionar_casas_carrinho(request,queryset=queryset) + response = adicionar_casas_carrinho(request, queryset=queryset) q2 = len(request.session['carrinho_casas']) quant = q2 - q1 if quant: - self.message_user(request,str(q2-q1)+" Casas Legislativas adicionadas no carrinho" ) + self.message_user(request, str(q2 - q1) + " Casas Legislativas adicionadas no carrinho") else: - self.message_user(request,"As Casas Legislativas selecionadas já foram adicionadas anteriormente" ) + self.message_user(request, "As Casas Legislativas selecionadas já foram adicionadas anteriormente") return HttpResponseRedirect('.') adicionar_casas.short_description = u"Armazenar casas no carrinho para exportar" - def get_actions(self, request): actions = super(CasaLegislativaAdmin, self).get_actions(request) if 'delete_selected' in actions: diff --git a/sigi/apps/casas/forms.py b/sigi/apps/casas/forms.py index 1941c4c..1d48fcc 100644 --- a/sigi/apps/casas/forms.py +++ b/sigi/apps/casas/forms.py @@ -5,7 +5,7 @@ from sigi.apps.casas.models import CasaLegislativa class CasaLegislativaForm(forms.ModelForm): - #cnpj = BRCNPJField( + # cnpj = BRCNPJField( # label='CNPJ', # required=False, # help_text='Utilize o formato XX.XXX.XXX/XXXX-XX ou ' diff --git a/sigi/apps/casas/models.py b/sigi/apps/casas/models.py index 7504160..2891609 100644 --- a/sigi/apps/casas/models.py +++ b/sigi/apps/casas/models.py @@ -9,7 +9,9 @@ from django.contrib.contenttypes import generic from sigi.apps.utils import SearchField from sigi.apps.servidores.models import Servidor + class TipoCasaLegislativa(models.Model): + """ Modelo para representar o tipo da Casa Legislativa Geralmente: Câmara Municipal, Assembléia Legislativa, @@ -22,11 +24,13 @@ class TipoCasaLegislativa(models.Model): nome = models.CharField( max_length=100 ) + def __unicode__(self): return self.nome class CasaLegislativa(models.Model): + """ Modelo para representar uma Casa Legislativa """ nome = models.CharField( @@ -135,7 +139,7 @@ class CasaLegislativa(models.Model): codigo = self.codigo_interlegis if codigo == '': - if self.tipo.sigla == 'AL': # Assembléias são tratadas a parte + 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: # Só grava o código se ele for inédito @@ -144,23 +148,23 @@ class CasaLegislativa(models.Model): return codigo # Se já existe, então trata a Assembleia como uma Casa qualquer. - cityName = normalize('NFKD', unicode(self.municipio.nome)).encode('ascii','ignore') + cityName = normalize('NFKD', unicode(self.municipio.nome)).encode('ascii', 'ignore') cityName = cityName.upper().strip() - cityName = cityName.replace(' DA ',' ') - cityName = cityName.replace(' DE ',' ') - cityName = cityName.replace(' DO ',' ') + cityName = cityName.replace(' DA ', ' ') + cityName = cityName.replace(' DE ', ' ') + cityName = cityName.replace(' DO ', ' ') # estratégia 1 - Pegar as 1ª letra de cada nome da cidade - codigo = ''.join([x[0] for x in cityName.split(' ')[:3]]) + codigo = ''.join([x[0] for x in cityName.split(' ')[:3]]) # Se o código ficou com menos que três letras, pegar as 2 primeiras if len(codigo) < 3: - codigo = ''.join([x[0:2] for x in cityName.split(' ')[:3]])[:3] + codigo = ''.join([x[0:2] for x in cityName.split(' ')[:3]])[:3] # Se ainda ficou com menos de três letras, então o nome da cidade só # tem uma palavra. Pegue as três primeiras letras da palavra if len(codigo) < 3: - codigo = cityName[:3] + codigo = cityName[:3] # Se o código já existir, substituir a última letra do código pela # última letra do nome da cidade, e ir recuando, letra a letra, @@ -170,7 +174,7 @@ class CasaLegislativa(models.Model): ultima = len(cityName) while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ - count() > 0 and ultima > 0: + count() > 0 and ultima > 0: codigo = codigo[:2] + cityName[ultima - 1: ultima] ultima -= 1 @@ -179,10 +183,10 @@ class CasaLegislativa(models.Model): # três primeiras consoantes. if CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() > 0: - codigo_cons = cityName.replace('A','').replace('E','').\ - replace('I','').replace('O','').replace('U','')[:3] + 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: + CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() > 0: codigo = codigo_cons # Se ainda não gerou um nome único, vamos colocar dígitos no @@ -191,7 +195,7 @@ class CasaLegislativa(models.Model): i = 'A' while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ - count() > 0 and i <= 'Z': + count() > 0 and i <= 'Z': codigo = codigo[:2] + str(i) i = chr(ord(i) + 1) @@ -202,7 +206,7 @@ class CasaLegislativa(models.Model): i = 0 while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ - count() > 0 and i < 100: + count() > 0 and i < 100: codigo = random.choice(cityName) + random.choice(cityName) + \ random.choice(cityName) i += 1 @@ -213,7 +217,7 @@ class CasaLegislativa(models.Model): i = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ - count() > 0: + count() > 0: codigo = random.choice(i) + random.choice(i) + \ random.choice(i) @@ -231,9 +235,9 @@ class CasaLegislativa(models.Model): if self.pk is not None: original = CasaLegislativa.objects.get(pk=self.pk) if (self.logradouro != original.logradouro or - self.bairro != original.bairro or - self.municipio != original.municipio or - self.cep != original.cep): + self.bairro != original.bairro or + self.municipio != original.municipio or + self.cep != original.cep): address_changed = True else: address_changed = True @@ -243,27 +247,29 @@ class CasaLegislativa(models.Model): return super(CasaLegislativa, self).save(*args, **kwargs) + class Funcionario(models.Model): + """ Modelo para registrar contatos vinculados às Casas Legislativas """ SETOR_CHOICES = [ - ("presidente","Presidente"), - ("contato_interlegis","Contato Interlegis"), - ("infraestrutura_fisica","Infraestrutura Física"), - ("estrutura_de_ti","Estrutura de TI"), - ("organizacao_do_processo_legislativo","Organização do Processo Legislativo"), - ("producao_legislativa","Produção Legislativa"), - ("estrutura_de_comunicacao_social","Estrutura de Comunicação Social"), - ("estrutura_de_recursos_humanos","Estrutura de Recursos Humanos"), - ("gestao","Gestão"), - ("outros","Outros"), - ] + ("presidente", "Presidente"), + ("contato_interlegis", "Contato Interlegis"), + ("infraestrutura_fisica", "Infraestrutura Física"), + ("estrutura_de_ti", "Estrutura de TI"), + ("organizacao_do_processo_legislativo", "Organização do Processo Legislativo"), + ("producao_legislativa", "Produção Legislativa"), + ("estrutura_de_comunicacao_social", "Estrutura de Comunicação Social"), + ("estrutura_de_recursos_humanos", "Estrutura de Recursos Humanos"), + ("gestao", "Gestão"), + ("outros", "Outros"), + ] SEXO_CHOICES = [ ("M", "Masculino"), ("F", "Feminino") - ] + ] casa_legislativa = models.ForeignKey(CasaLegislativa) nome = models.CharField('nome completo', max_length=60, blank=False) @@ -275,7 +281,7 @@ class Funcionario(models.Model): endereco = generic.GenericRelation('contatos.Endereco') cargo = models.CharField(max_length=100, null=True, blank=True) funcao = models.CharField(u'função', max_length=100, null=True, blank=True) - setor = models.CharField(max_length=100, choices = SETOR_CHOICES, default="outros") + setor = models.CharField(max_length=100, choices=SETOR_CHOICES, default="outros") tempo_de_servico = models.CharField(u'tempo de serviço', max_length=50, null=True, blank=True) ult_alteracao = models.DateTimeField(u'Última alteração', null=True, blank=True, editable=True, auto_now=False) @@ -287,21 +293,24 @@ class Funcionario(models.Model): def __unicode__(self): return self.nome + class PresidenteManager(models.Manager): + def get_queryset(self): qs = super(PresidenteManager, self).get_queryset() qs = qs.filter(setor='presidente') return qs + class Presidente(Funcionario): + class Meta: proxy = True - objects = PresidenteManager() + objects = PresidenteManager() def save(self, *args, **kwargs): self.setor = 'presidente' self.cargo = 'Presidente' self.funcao = 'Presidente' return super(Presidente, self).save(*args, **kwargs) - diff --git a/sigi/apps/casas/reports.py b/sigi/apps/casas/reports.py index 483dc3d..d2b05f9 100644 --- a/sigi/apps/casas/reports.py +++ b/sigi/apps/casas/reports.py @@ -3,47 +3,48 @@ from reportlab.lib.pagesizes import A4 from reportlab.lib.units import cm from reportlab.lib.enums import TA_CENTER, TA_RIGHT from geraldo import Report, DetailBand, Label, ObjectValue, ManyElements, \ - ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH,SystemField + ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH, SystemField from sigi.apps.relatorios.reports import ReportDefault -from sigi.settings import STATICFILES_DIRS +from sigi.settings import STATICFILES_DIRS from geraldo.graphics import Image + def string_to_cm(texto): tamanho = 0 minEspeciais = { - 'f':0.1, - 'i':0.05, - 'j':0.05, - 'l':0.05, - 'm':0.2, - 'r':0.1, - 't':0.15, + 'f': 0.1, + 'i': 0.05, + 'j': 0.05, + 'l': 0.05, + 'm': 0.2, + 'r': 0.1, + 't': 0.15, } maiuEspeciais = { - 'I':0.05, - 'J':0.15, - 'L':0.15, - 'P':0.15, + 'I': 0.05, + 'J': 0.15, + 'L': 0.15, + 'P': 0.15, } for c in texto: - if c > 'a' and c<'z': - if c in minEspeciais: - tamanho += minEspeciais[c] - else: - tamanho += 0.17 + if c > 'a' and c < 'z': + if c in minEspeciais: + tamanho += minEspeciais[c] + else: + tamanho += 0.17 else: - if c in maiuEspeciais: - tamanho += maiuEspeciais[c] - else: - tamanho += 0.2 + if c in maiuEspeciais: + tamanho += maiuEspeciais[c] + else: + tamanho += 0.2 return tamanho - class CasasLegislativasLabels(Report): + """ Usage example:: @@ -62,37 +63,37 @@ class CasasLegislativasLabels(Report): tamanho_fonte = 6 delta = start = 0.5 - def __init__(self, queryset, formato): + def __init__(self, queryset, formato): super(CasasLegislativasLabels, self).__init__(queryset=queryset) self.formato = formato self.page_size = A4 if formato == '3x9_etiqueta': - self.margin_top = 0.25*cm - self.margin_bottom = 0.0*cm - self.margin_left = 0.2*cm - self.margin_right = 0.0*cm + self.margin_top = 0.25 * cm + self.margin_bottom = 0.0 * cm + self.margin_left = 0.2 * cm + self.margin_right = 0.0 * cm self.delta = 0.3 self.start = 0 self.label_margin_top = 0.35 self.label_margin_left = 0.4 self.label_margin_right = 0.2 else: - self.margin_top = 0.8*cm - self.margin_bottom = 0.8*cm - self.margin_left = 0.4*cm - self.margin_right = 0.4*cm + self.margin_top = 0.8 * cm + self.margin_bottom = 0.8 * cm + self.margin_left = 0.4 * cm + self.margin_right = 0.4 * cm self.largura_etiqueta = 9.9 self.altura_etiqueta = 5.6 self.tamanho_fonte = 11 self.label_margin_top = 0.5 self.label_margin_left = 0.5 self.label_margin_right = 0.5 - - calc_width = (self.largura_etiqueta-self.label_margin_left-self.label_margin_right)*cm - calc_height = lambda rows: (self.delta*rows)*cm - calc_top = lambda row: (self.label_margin_top+row*self.delta)*cm - calc_left = self.label_margin_left*cm + + calc_width = (self.largura_etiqueta - self.label_margin_left - self.label_margin_right) * cm + calc_height = lambda rows: (self.delta * rows) * cm + calc_top = lambda row: (self.label_margin_top + row * self.delta) * cm + calc_left = self.label_margin_left * cm my_elements = [ Label( @@ -116,7 +117,7 @@ class CasasLegislativasLabels(Report): top=calc_top(4), left=calc_left, width=calc_width, height=calc_height(2), get_value=lambda instance: "%s - %s - %s." % (instance.logradouro, instance.bairro, instance.municipio), - ), + ), ObjectValue( attribute_name='cep', @@ -124,23 +125,24 @@ class CasasLegislativasLabels(Report): get_value=lambda instance: "CEP: %s" % instance.cep ), - ] + ] self.band_detail = DetailBand( - width=(self.largura_etiqueta)*cm, - height=(self.altura_etiqueta)*cm, + width=(self.largura_etiqueta) * cm, + height=(self.altura_etiqueta) * cm, elements=my_elements, - display_inline=True, + display_inline=True, default_style={'fontName': 'Helvetica', 'fontSize': self.tamanho_fonte}) class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels): - def __init__(self, queryset, formato): + + def __init__(self, queryset, formato): super(CasasLegislativasLabelsSemPresidente, self).__init__(queryset=queryset, formato=formato) - calc_width = (self.largura_etiqueta-self.label_margin_left-self.label_margin_right)*cm - calc_height = lambda rows: (self.delta*rows)*cm - calc_top = lambda row: (self.label_margin_top+row*self.delta)*cm - calc_left = self.label_margin_left*cm + calc_width = (self.largura_etiqueta - self.label_margin_left - self.label_margin_right) * cm + calc_height = lambda rows: (self.delta * rows) * cm + calc_top = lambda row: (self.label_margin_top + row * self.delta) * cm + calc_left = self.label_margin_left * cm my_elements = [ Label( @@ -158,7 +160,7 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels): top=calc_top(3), left=calc_left, width=calc_width, height=calc_height(2), get_value=lambda instance: "%s - %s - %s." % (instance.logradouro, instance.bairro, instance.municipio), - ), + ), ObjectValue( attribute_name='cep', @@ -166,411 +168,410 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels): get_value=lambda instance: "CEP: %s" % instance.cep ), - ] + ] self.band_detail = DetailBand( - width=(self.largura_etiqueta)*cm, - height=(self.altura_etiqueta)*cm, + width=(self.largura_etiqueta) * cm, + height=(self.altura_etiqueta) * cm, elements=my_elements, - display_inline=True, + display_inline=True, default_style={'fontName': 'Helvetica', 'fontSize': self.tamanho_fonte}) class CasasLegislativasReport(ReportDefault): title = u'Relatório de Casas Legislativas' - height = 80*cm + height = 80 * cm page_size = landscape(A4) class band_page_header(ReportDefault.band_page_header): label_top = ReportDefault.band_page_header.label_top - label_left = [0.3,1,5.5,11,17,22] + label_left = [0.3, 1, 5.5, 11, 17, 22] elements = list(ReportDefault.band_page_header.elements) elements = [ - Image(filename= '%s/img/logo-interlegis.jpg' % STATICFILES_DIRS, - left=23.5*cm,right=1*cm,top=0.1*cm,bottom=1*cm, - width=4.2*cm,height=3*cm, - ), - Image(filename= '%s/img/logo-senado.png' % STATICFILES_DIRS, - left=1*cm,right=1*cm,top=0.1*cm,bottom=1*cm, - width=3*cm,height=3*cm, - ), - Label(text="SENADO FEDERAL",top=1*cm,left=0,width=BAND_WIDTH, - style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} - ), - Label(text="SINTER - Secretaria Especial do Interlegis",top=1.5*cm,left=0,width=BAND_WIDTH, - style={'fontName': 'Helvetica-Bold','fontSize':13, 'alignment': TA_CENTER} - ), + Image(filename='%s/img/logo-interlegis.jpg' % STATICFILES_DIRS, + left=23.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, + width=4.2 * cm, height=3 * cm, + ), + Image(filename='%s/img/logo-senado.png' % STATICFILES_DIRS, + left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, + width=3 * cm, height=3 * cm, + ), + Label(text="SENADO FEDERAL", top=1 * cm, left=0, width=BAND_WIDTH, + style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} + ), + Label(text="SINTER - Secretaria Especial do Interlegis", top=1.5 * cm, left=0, width=BAND_WIDTH, + style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER} + ), SystemField( - expression='%(report_title)s',top=2.5*cm,left=0,width=BAND_WIDTH, - style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} + expression='%(report_title)s', top=2.5 * cm, left=0, width=BAND_WIDTH, + style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} ), Label( text="UF", - left=label_left[0]*cm, + left=label_left[0] * cm, top=label_top, ), Label( text="Municipio", - left=label_left[1]*cm, + left=label_left[1] * cm, top=label_top, - ), + ), Label( text="Presidente", - left=label_left[2]*cm, - top=label_top, + left=label_left[2] * cm, + top=label_top, ), Label( text="Endereço", - left=label_left[3]*cm, - top=label_top, + left=label_left[3] * cm, + top=label_top, ), - Label( + Label( text="Endereço na Internet", - left=label_left[4]*cm, + left=label_left[4] * cm, top=label_top, ), - Label( + Label( text="Email", - left=label_left[5]*cm, + left=label_left[5] * cm, top=label_top, ), - - ] - + ] class band_page_footer(ReportDefault.band_page_footer): pass class band_detail(ReportDefault.band_detail): - label_left = [0.3,1,5.5,11,17,22] + label_left = [0.3, 1, 5.5, 11, 17, 22] - elements=[ + elements = [ ObjectValue( attribute_name='municipio.uf.sigla', - left=label_left[0]*cm, - width=1*cm, + left=label_left[0] * cm, + width=1 * cm, ), ObjectValue( attribute_name='municipio.nome', - left=label_left[1]*cm, - ), + left=label_left[1] * cm, + ), ObjectValue( attribute_name='presidente', - left=label_left[2]*cm, + left=label_left[2] * cm, ), ObjectValue( attribute_name='logradouro', - left=label_left[3]*cm, - get_value=lambda instance: instance.logradouro + ' - '+ instance.bairro, + left=label_left[3] * cm, + get_value=lambda instance: instance.logradouro + ' - ' + instance.bairro, ), - ObjectValue( + ObjectValue( attribute_name='pagina_web', - left=label_left[4]*cm, + left=label_left[4] * cm, ), ObjectValue( attribute_name='email', - left=label_left[5]*cm, + left=label_left[5] * cm, ), ] groups = [ ReportGroup(attribute_name='municipio.uf', - band_header=ReportBand( - height=0.7*cm, - elements= [ - ObjectValue(attribute_name='municipio.uf') - ], - borders={'top': True}, - ) - ) + band_header=ReportBand( + height=0.7 * cm, + elements=[ + ObjectValue(attribute_name='municipio.uf') + ], + borders={'top': True}, + ) + ) ] class CasasSemConvenioReport(CasasLegislativasReport): title = u'Relatório de Casas Legislativas sem Convênio' + class InfoCasaLegislativa(ReportDefault): title = u'Casa legislativa' + class band_summary(ReportBand): pass + class band_page_footer(ReportBand): - height = 1*cm + height = 1 * cm elements = [ - SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3*cm), + SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3 * cm), ] - + class band_detail(ReportDefault.band_detail): - + posicao_left = [ - 0,1.3, #Tipo - 0,1.8, #Regiao - 5.5,6.8, #U.F. - 0,2.3, #Municipio - 0,2.4, #Endereco - 0,1.6, #Bairro - 0,1.3, #CEP - 0,1.6, #CNPJ - 0,2.3, #Telefone - 0,2.7, #Presidente + 0, 1.3, # Tipo + 0, 1.8, # Regiao + 5.5, 6.8, # U.F. + 0, 2.3, # Municipio + 0, 2.4, # Endereco + 0, 1.6, # Bairro + 0, 1.3, # CEP + 0, 1.6, # CNPJ + 0, 2.3, # Telefone + 0, 2.7, # Presidente ] posicao_top = [ - 0.5, #Tipo - 1.3, #Regiao - 1.3, #U.F. - 2.1, #Municipio - 2.9, #Logradouro - 3.7, #Bairro - 4.5, #CEP - 5.3, #CNPJ - 6.1, #Telefone - 6.9, #Presidente + 0.5, # Tipo + 1.3, # Regiao + 1.3, # U.F. + 2.1, # Municipio + 2.9, # Logradouro + 3.7, # Bairro + 4.5, # CEP + 5.3, # CNPJ + 6.1, # Telefone + 6.9, # Presidente ] - height=30*cm + height = 30 * cm + + display_inline = True + default_style = {'fontName': 'Helvetica', 'fontSize': 14} - display_inline = True - default_style = {'fontName': 'Helvetica', 'fontSize':14} - elements = [ Label( text="Tipo: ", - left=posicao_left[0]*cm, - top=posicao_top[0]*cm, + left=posicao_left[0] * cm, + top=posicao_top[0] * cm, ), ObjectValue( attribute_name='tipo.nome', - left=posicao_left[1]*cm, - top=posicao_top[0]*cm, - width=6*cm, + left=posicao_left[1] * cm, + top=posicao_top[0] * cm, + width=6 * cm, ), Label( text="Região: ", - left=posicao_left[2]*cm, - top=posicao_top[1]*cm, - ), + left=posicao_left[2] * cm, + top=posicao_top[1] * cm, + ), ObjectValue( attribute_name='municipio.uf.regiao', - left=posicao_left[3]*cm, - top=posicao_top[1]*cm, + left=posicao_left[3] * cm, + top=posicao_top[1] * cm, get_value=lambda instance: - {'SL': 'Sul','SD': 'Sudeste','CO': 'Centro-Oeste','NE': 'Nordeste','NO': 'Norte',} - [instance.municipio.uf.regiao] + {'SL': 'Sul', 'SD': 'Sudeste', 'CO': 'Centro-Oeste', 'NE': 'Nordeste', 'NO': 'Norte', } + [instance.municipio.uf.regiao] ), Label( text="U.F.: ", - left=posicao_left[4]*cm, - top=posicao_top[2]*cm, + left=posicao_left[4] * cm, + top=posicao_top[2] * cm, ), ObjectValue( attribute_name='municipio.uf', - left=posicao_left[5]*cm, - top=posicao_top[2]*cm, - ), + left=posicao_left[5] * cm, + top=posicao_top[2] * cm, + ), Label( text="Município: ", - left=posicao_left[6]*cm, - top=posicao_top[3]*cm, + left=posicao_left[6] * cm, + top=posicao_top[3] * cm, ), ObjectValue( attribute_name='municipio.nome', - left=posicao_left[7]*cm, - top=posicao_top[3]*cm, - width=20*cm, + left=posicao_left[7] * cm, + top=posicao_top[3] * cm, + width=20 * cm, ), # Linha 3 Label( text="Endereço: ", - left=posicao_left[8]*cm, - top=posicao_top[4]*cm, + left=posicao_left[8] * cm, + top=posicao_top[4] * cm, ), ObjectValue( attribute_name='logradouro', - left=posicao_left[9]*cm, - top=posicao_top[4]*cm, - width=20*cm, + left=posicao_left[9] * cm, + top=posicao_top[4] * cm, + width=20 * cm, ), Label( text="Bairro: ", - left=posicao_left[10]*cm, - top=posicao_top[5]*cm, + left=posicao_left[10] * cm, + top=posicao_top[5] * cm, ), ObjectValue( attribute_name='bairro', - left=posicao_left[11]*cm, - top=posicao_top[5]*cm, + left=posicao_left[11] * cm, + top=posicao_top[5] * cm, ), Label( text="CEP: ", - left=posicao_left[12]*cm, - top=posicao_top[6]*cm, + left=posicao_left[12] * cm, + top=posicao_top[6] * cm, ), ObjectValue( attribute_name='cep', - left=posicao_left[13]*cm, - top=posicao_top[6]*cm, + left=posicao_left[13] * cm, + top=posicao_top[6] * cm, ), Label( text="CNPJ: ", - left=posicao_left[14]*cm, - top=posicao_top[7]*cm, + left=posicao_left[14] * cm, + top=posicao_top[7] * cm, ), ObjectValue( attribute_name='cnpj', - left=posicao_left[15]*cm, - top=posicao_top[7]*cm, + left=posicao_left[15] * cm, + top=posicao_top[7] * cm, ), Label( text="Telefone: ", - left=posicao_left[16]*cm, - top=posicao_top[8]*cm, + left=posicao_left[16] * cm, + top=posicao_top[8] * cm, ), ObjectValue( attribute_name='telefone', - left=posicao_left[17]*cm, - top=posicao_top[8]*cm, + left=posicao_left[17] * cm, + top=posicao_top[8] * cm, ), Label( text="Presidente: ", - left=posicao_left[18]*cm, - top=posicao_top[9]*cm, + left=posicao_left[18] * cm, + top=posicao_top[9] * cm, ), ObjectValue( attribute_name='presidente', - left=posicao_left[19]*cm, - top=posicao_top[9]*cm, - width=20*cm, + left=posicao_left[19] * cm, + top=posicao_top[9] * cm, + width=20 * cm, ), - ] + ] # Telefones - tel_top = 2*cm - tel_left = [0,3,5] + tel_top = 2 * cm + tel_left = [0, 3, 5] # Contato - cont_top = 2*cm - cont_left = [0,6,9] + cont_top = 2 * cm + cont_left = [0, 6, 9] # Convenios - convenio_top = 2*cm - convenio_left = [0,1.8,4.5,8,10.5,13,15.5,18] + convenio_top = 2 * cm + convenio_left = [0, 1.8, 4.5, 8, 10.5, 13, 15.5, 18] subreports = [ - # Telefones + # Telefones SubReport( - queryset_string = '%(object)s.telefones.all()', - band_header = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':12 }, - height=2.5*cm, - elements = [ + queryset_string='%(object)s.telefones.all()', + band_header=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 12}, + height=2.5 * cm, + elements=[ Label( text="Telefone(s)", - style = {'fontSize':14,'alignment': TA_CENTER}, + style={'fontSize': 14, 'alignment': TA_CENTER}, width=BAND_WIDTH, - top=1*cm, + top=1 * cm, ), - Label(text="Número",left=tel_left[0]*cm,top=tel_top), - Label(text="Tipo",left=tel_left[1]*cm,top=tel_top), - Label(text="Nota",left=tel_left[2]*cm,top=tel_top), + Label(text="Número", left=tel_left[0] * cm, top=tel_top), + Label(text="Tipo", left=tel_left[1] * cm, top=tel_top), + Label(text="Nota", left=tel_left[2] * cm, top=tel_top), ], - borders = {'bottom': True}, - ), - band_detail = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':11}, - height=0.5*cm, - elements= [ - ObjectValue(attribute_name='__unicode__',left=tel_left[0]*cm), - ObjectValue(attribute_name='tipo',left=tel_left[1]*cm, - get_value = lambda instance: - {'F':'Fixo','M':u'Móvel','X':'Fax','I':'Indefinido'}[instance.tipo], - ), - ObjectValue(attribute_name='nota',left=tel_left[2]*cm), + borders={'bottom': True}, + ), + band_detail=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 11}, + height=0.5 * cm, + elements=[ + ObjectValue(attribute_name='__unicode__', left=tel_left[0] * cm), + ObjectValue(attribute_name='tipo', left=tel_left[1] * cm, + get_value=lambda instance: + {'F': 'Fixo', 'M': u'Móvel', 'X': 'Fax', 'I': 'Indefinido'}[instance.tipo], + ), + ObjectValue(attribute_name='nota', left=tel_left[2] * cm), ], #borders = {'all':True}, ), ), - #Contatos + # Contatos SubReport( - queryset_string = '%(object)s.funcionario_set.all()', - band_header = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':12 }, - height=2.5*cm, - elements = [ + queryset_string='%(object)s.funcionario_set.all()', + band_header=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 12}, + height=2.5 * cm, + elements=[ Label( text="Contato(s)", - style = {'fontSize':14,'alignment': TA_CENTER}, + style={'fontSize': 14, 'alignment': TA_CENTER}, width=BAND_WIDTH, - top=1*cm, + top=1 * cm, ), - Label(text="Nome",left=cont_left[0]*cm,top=cont_top), - Label(text="Nota",left=cont_left[1]*cm,top=cont_top), - Label(text="E-mail",left=cont_left[2]*cm,top=cont_top), + Label(text="Nome", left=cont_left[0] * cm, top=cont_top), + Label(text="Nota", left=cont_left[1] * cm, top=cont_top), + Label(text="E-mail", left=cont_left[2] * cm, top=cont_top), ], - borders = {'bottom': True,'top':True}, - ), - band_detail = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':11}, - height=0.5*cm, - elements= [ - ObjectValue(attribute_name='nome',left=cont_left[0]*cm), - ObjectValue(attribute_name='nota',left=cont_left[1]*cm), - ObjectValue(attribute_name='email',left=cont_left[2]*cm), + borders={'bottom': True, 'top': True}, + ), + band_detail=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 11}, + height=0.5 * cm, + elements=[ + ObjectValue(attribute_name='nome', left=cont_left[0] * cm), + ObjectValue(attribute_name='nota', left=cont_left[1] * cm), + ObjectValue(attribute_name='email', left=cont_left[2] * cm), ], #borders = {'all':True}, ), ), - #Convenios + # Convenios SubReport( - queryset_string = '%(object)s.convenio_set.all()', - band_header = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':12 }, - height=2.5*cm, - elements=[ - Label( - text="Convênio(s)", - style = {'fontSize':14,'alignment': TA_CENTER}, - width=BAND_WIDTH, - top=1*cm, - ), - Label(text="Projeto",left=convenio_left[0]*cm,top=convenio_top), - Label(text="Nº Convenio",left=convenio_left[1]*cm,top=convenio_top), - Label(text="Nº Processo SF",left=convenio_left[2]*cm,top=convenio_top), - Label(text="Adesão",left=convenio_left[3]*cm,top=convenio_top), - Label(text="Convênio",left=convenio_left[4]*cm,top=convenio_top), - Label(text="Equipada",left=convenio_left[5]*cm,top=convenio_top), - Label(text="Data D.O.",left=convenio_left[6]*cm,top=convenio_top), - ], - borders = {'bottom': True} - ), - band_detail = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':11}, - height=0.5*cm, - elements=[ - ObjectValue(attribute_name='projeto.sigla',left=convenio_left[0]*cm), - ObjectValue(attribute_name='num_convenio',left=convenio_left[1]*cm), - ObjectValue(attribute_name='num_processo_sf',left=convenio_left[2]*cm), - ObjectValue(attribute_name='data_adesao',left=convenio_left[3]*cm, - get_value=lambda instance: + queryset_string='%(object)s.convenio_set.all()', + band_header=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 12}, + height=2.5 * cm, + elements=[ + Label( + text="Convênio(s)", + style={'fontSize': 14, 'alignment': TA_CENTER}, + width=BAND_WIDTH, + top=1 * cm, + ), + Label(text="Projeto", left=convenio_left[0] * cm, top=convenio_top), + Label(text="Nº Convenio", left=convenio_left[1] * cm, top=convenio_top), + Label(text="Nº Processo SF", left=convenio_left[2] * cm, top=convenio_top), + Label(text="Adesão", left=convenio_left[3] * cm, top=convenio_top), + Label(text="Convênio", left=convenio_left[4] * cm, top=convenio_top), + Label(text="Equipada", left=convenio_left[5] * cm, top=convenio_top), + Label(text="Data D.O.", left=convenio_left[6] * cm, top=convenio_top), + ], + borders={'bottom': True} + ), + band_detail=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 11}, + height=0.5 * cm, + elements=[ + ObjectValue(attribute_name='projeto.sigla', left=convenio_left[0] * cm), + ObjectValue(attribute_name='num_convenio', left=convenio_left[1] * cm), + ObjectValue(attribute_name='num_processo_sf', left=convenio_left[2] * cm), + ObjectValue(attribute_name='data_adesao', left=convenio_left[3] * cm, + get_value=lambda instance: instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-' - ), - ObjectValue(attribute_name='data_retorno_assinatura',left=convenio_left[4]*cm, - get_value=lambda instance: + ), + ObjectValue(attribute_name='data_retorno_assinatura', left=convenio_left[4] * cm, + get_value=lambda instance: instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-' - ), - ObjectValue(attribute_name='data_termo_aceite',left=convenio_left[5]*cm, - get_value=lambda instance: + ), + ObjectValue(attribute_name='data_termo_aceite', left=convenio_left[5] * cm, + get_value=lambda instance: instance.data_termo_aceite.strftime('%d/%m/%Y') if instance.data_termo_aceite != None else '-' - ), - ObjectValue(attribute_name='data_pub_diario',left=convenio_left[6]*cm, - get_value=lambda instance: + ), + ObjectValue(attribute_name='data_pub_diario', left=convenio_left[6] * cm, + get_value=lambda instance: instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-' - ), - ], - #borders = {'all':True}, - ), + ), + ], + #borders = {'all':True}, + ), ) ] - - diff --git a/sigi/apps/casas/views.py b/sigi/apps/casas/views.py index 4651af4..1214cac 100644 --- a/sigi/apps/casas/views.py +++ b/sigi/apps/casas/views.py @@ -20,6 +20,8 @@ import csv # @param qs: queryset # @param o: (int) number of order field + + def query_ordena(qs, o): from sigi.apps.casas.admin import CasaLegislativaAdmin list_display = CasaLegislativaAdmin.list_display @@ -36,37 +38,40 @@ def query_ordena(qs, o): qs = qs.order_by(*order_fields) return qs -def get_for_qs(get,qs): + +def get_for_qs(get, qs): """ Verifica atributos do GET e retorna queryset correspondente """ kwargs = {} - for k,v in get.iteritems(): + for k, v in get.iteritems(): if str(k) not in ('page', 'pop', 'q', '_popup', 'o', 'ot'): kwargs[str(k)] = v qs = qs.filter(**kwargs) if 'o' in get: - qs = query_ordena(qs,get['o']) + qs = query_ordena(qs, get['o']) return qs + def carrinhoOrGet_for_qs(request): """ Verifica se existe casas na sessão se não verifica get e retorna qs correspondente. - """ + """ if request.session.has_key('carrinho_casas'): - ids = request.session['carrinho_casas'] - qs = CasaLegislativa.objects.filter(pk__in=ids) + ids = request.session['carrinho_casas'] + qs = CasaLegislativa.objects.filter(pk__in=ids) else: - qs = CasaLegislativa.objects.all() + qs = CasaLegislativa.objects.all() if request.GET: - qs = get_for_qs(request.GET,qs) + qs = get_for_qs(request.GET, qs) return qs -def adicionar_casas_carrinho(request,queryset=None,id=None): + +def adicionar_casas_carrinho(request, queryset=None, id=None): if request.method == 'POST': - ids_selecionados = request.POST.getlist('_selected_action') + ids_selecionados = request.POST.getlist('_selected_action') if not request.session.has_key('carrinho_casas'): request.session['carrinho_casas'] = ids_selecionados else: @@ -74,17 +79,16 @@ def adicionar_casas_carrinho(request,queryset=None,id=None): # Verifica se id já não está adicionado for id in ids_selecionados: if not id in lista: - lista.append(id) - request.session['carrinho_casas'] = lista - + lista.append(id) + request.session['carrinho_casas'] = lista def visualizar_carrinho(request): - + qs = carrinhoOrGet_for_qs(request) - + paginator = Paginator(qs, 100) - + # Make sure page request is an int. If not, deliver first page. # Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página. try: @@ -97,60 +101,60 @@ def visualizar_carrinho(request): paginas = paginator.page(page) except (EmptyPage, InvalidPage): paginas = paginator.page(paginator.num_pages) - + carrinhoIsEmpty = not(request.session.has_key('carrinho_casas')) - + return render_to_response( 'casas/carrinho.html', { - 'MEDIA_URL':settings.MEDIA_URL, - 'carIsEmpty':carrinhoIsEmpty, - 'paginas':paginas, - 'query_str':'?'+request.META['QUERY_STRING'] + 'MEDIA_URL': settings.MEDIA_URL, + 'carIsEmpty': carrinhoIsEmpty, + 'paginas': paginas, + 'query_str': '?' + request.META['QUERY_STRING'] } ) + def excluir_carrinho(request): if request.session.has_key('carrinho_casas'): del request.session['carrinho_casas'] return HttpResponseRedirect('.') + def deleta_itens_carrinho(request): if request.method == 'POST': - ids_selecionados = request.POST.getlist('_selected_action') - if request.session.has_key('carrinho_casas'): - lista = request.session['carrinho_casas'] + ids_selecionados = request.POST.getlist('_selected_action') + if request.session.has_key('carrinho_casas'): + lista = request.session['carrinho_casas'] for item in ids_selecionados: lista.remove(item) - if lista: + if lista: request.session['carrinho_casas'] = lista else: - del lista; - del request.session['carrinho_casas'] - + del lista + del request.session['carrinho_casas'] + return HttpResponseRedirect('.') - - def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'): """ TODO: adicionar suporte para resultado de pesquisa do admin. - """ - + """ + if request.POST: if request.POST.has_key('tipo_etiqueta'): tipo = request.POST['tipo_etiqueta'] if request.POST.has_key('tamanho_etiqueta'): formato = request.POST['tamanho_etiqueta'] - - if tipo =='sem_presidente': + + if tipo == 'sem_presidente': return labels_report_sem_presidente(request, id, formato) - + if id: - qs = CasaLegislativa.objects.filter(pk=id) - else: + qs = CasaLegislativa.objects.filter(pk=id) + else: qs = carrinhoOrGet_for_qs(request) - + if not qs: return HttpResponseRedirect('../') @@ -161,24 +165,24 @@ def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'): return response + def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'): """ TODO: adicionar suporte para resultado de pesquisa do admin. - """ - + """ + if request.POST: if request.POST.has_key('tamanho_etiqueta'): formato = request.POST['tamanho_etiqueta'] - - + if id: legislaturas = [c.legislatura_set.latest('data_inicio') for c in CasaLegislativa.objects.filter(pk__in=id, legislatura__id__isnull=False).distinct()] mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas]) parlamentares = [m.parlamentar for m in mandatos] qs = parlamentares - else: + else: qs = carrinhoOrGet_for_parlamentar_qs(request) - + if not qs: return HttpResponseRedirect('../') @@ -189,10 +193,11 @@ def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'): return response + def carrinhoOrGet_for_parlamentar_qs(request): """ Verifica se existe parlamentares na sessão se não verifica get e retorna qs correspondente. - """ + """ if request.session.has_key('carrinho_casas'): ids = request.session['carrinho_casas'] legislaturas = [c.legislatura_set.latest('data_inicio') for c in CasaLegislativa.objects.filter(pk__in=ids, legislatura__id__isnull=False).distinct()] @@ -205,18 +210,19 @@ def carrinhoOrGet_for_parlamentar_qs(request): parlamentares = [m.parlamentar for m in mandatos] qs = parlamentares if request.GET: - qs = get_for_qs(request.GET,qs) + qs = get_for_qs(request.GET, qs) return qs + def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'): """ TODO: adicionar suporte para resultado de pesquisa do admin. """ if id: - qs = CasaLegislativa.objects.filter(pk=id) - else: + qs = CasaLegislativa.objects.filter(pk=id) + else: qs = carrinhoOrGet_for_qs(request) - + if not qs: return HttpResponseRedirect('../') @@ -228,56 +234,56 @@ def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'): return response -def report(request, id=None,tipo=None): - +def report(request, id=None, tipo=None): + if request.POST: if request.POST.has_key('tipo_relatorio'): tipo = request.POST['tipo_relatorio'] - - if tipo =='completo': + + if tipo == 'completo': return report_complete(request, id) - - + if id: - qs = CasaLegislativa.objects.filter(pk=id) - else: + qs = CasaLegislativa.objects.filter(pk=id) + else: qs = carrinhoOrGet_for_qs(request) if not qs: return HttpResponseRedirect('../') - - #qs.order_by('municipio__uf','nome') + + # qs.order_by('municipio__uf','nome') response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=casas.pdf' report = CasasLegislativasReport(queryset=qs) report.generate_by(PDFGenerator, filename=response) return response -def report_complete(request,id=None): - + +def report_complete(request, id=None): + if id: - qs = CasaLegislativa.objects.filter(pk=id) - else: + qs = CasaLegislativa.objects.filter(pk=id) + else: qs = carrinhoOrGet_for_qs(request) - + if not qs: return HttpResponseRedirect('../') - response = HttpResponse(mimetype='application/pdf') + response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=casas.pdf' # Gera um relatorio para cada casa e concatena os relatorios cont = 0 - canvas = None - quant = qs.count() - if quant > 1: + canvas = None + quant = qs.count() + if quant > 1: for i in qs: cont += 1 - #queryset deve ser uma lista + # queryset deve ser uma lista lista = (i,) if cont == 1: report = InfoCasaLegislativa(queryset=lista) - canvas = report.generate_by(PDFGenerator, return_canvas=True,filename=response,) + canvas = report.generate_by(PDFGenerator, return_canvas=True, filename=response,) else: report = InfoCasaLegislativa(queryset=lista) if cont == quant: @@ -286,35 +292,35 @@ def report_complete(request,id=None): canvas = report.generate_by(PDFGenerator, canvas=canvas, return_canvas=True) else: report = InfoCasaLegislativa(queryset=qs) - report.generate_by(PDFGenerator,filename=response) - + report.generate_by(PDFGenerator, filename=response) + return response + def casas_sem_convenio_report(request): - qs = CasaLegislativa.objects.filter(convenio=None).order_by('municipio__uf','nome') - + qs = CasaLegislativa.objects.filter(convenio=None).order_by('municipio__uf', 'nome') + if request.GET: - qs = get_for_qs(request.GET,qs) + qs = get_for_qs(request.GET, qs) if not qs: return HttpResponseRedirect('../') - + response = HttpResponse(mimetype='application/pdf') report = CasasSemConvenioReport(queryset=qs) report.generate_by(PDFGenerator, filename=response) return response - def export_csv(request): response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; filename=casas.csv' - + writer = csv.writer(response) casas = carrinhoOrGet_for_qs(request) if not casas or not request.POST: return HttpResponseRedirect('../') - + atributos = request.POST.getlist("itens_csv_selected") atributos2 = [s.encode("utf-8") for s in atributos] @@ -322,9 +328,9 @@ def export_csv(request): atributos2.insert(atributos2.index('Município'), u'UF') except ValueError: pass - + writer.writerow(atributos2) - + for casa in casas: lista = [] contatos = casa.funcionario_set.filter(setor="contato_interlegis") @@ -341,10 +347,10 @@ def export_csv(request): lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8")) lista.append(unicode(casa.municipio.nome).encode("utf-8")) elif u"Presidente" == atributo: - #TODO: Esse encode deu erro em 25/04/2012. Comentei para que o usuário pudesse continuar seu trabalho + # TODO: Esse encode deu erro em 25/04/2012. Comentei para que o usuário pudesse continuar seu trabalho # É preciso descobrir o porque do erro e fazer a correção definitiva. -# lista.append(str(casa.presidente or "").encode("utf-8")) - lista.append(str(casa.presidente or "")) + # lista.append(str(casa.presidente or "").encode("utf-8")) + lista.append(str(casa.presidente or "")) elif u"Logradouro" == atributo: lista.append(casa.logradouro.encode("utf-8")) elif u"Bairro" == atributo: @@ -378,7 +384,7 @@ def export_csv(request): lista.append('') else: pass - + writer.writerow(lista) - + return response diff --git a/sigi/apps/contatos/admin.py b/sigi/apps/contatos/admin.py index d6476ff..646788c 100644 --- a/sigi/apps/contatos/admin.py +++ b/sigi/apps/contatos/admin.py @@ -11,9 +11,10 @@ class UnidadeFederativaAdmin(admin.ModelAdmin): list_display = ('codigo_ibge', 'nome', 'sigla', 'regiao', 'populacao') list_display_links = ('codigo_ibge', 'nome') list_filter = ('regiao', 'populacao', PopulationFilter,) - search_fields = ('search_text', 'codigo_ibge', 'sigla', 'regiao') + search_fields = ('search_text', 'codigo_ibge', 'sigla', 'regiao') get_queryset = queryset_ascii + class MunicipioAdmin(admin.ModelAdmin): actions = None list_display = ('codigo_ibge', 'codigo_tse', 'nome', 'uf', 'is_capital', 'populacao', 'is_polo', 'idh', 'pib_ano', @@ -34,6 +35,7 @@ class MunicipioAdmin(admin.ModelAdmin): search_fields = ('search_text', 'codigo_ibge', 'codigo_tse', 'codigo_mesorregiao', 'codigo_microrregiao', 'uf__sigla') + class TelefoneAdmin(admin.ModelAdmin): list_display = ('numero', 'tipo', 'nota') list_display_links = ('numero',) @@ -41,6 +43,7 @@ class TelefoneAdmin(admin.ModelAdmin): radio_fields = {'tipo': admin.VERTICAL} search_fields = ('numero', 'tipo', 'nota') + class ContatoAdmin(admin.ModelAdmin): list_display = ('nome', 'nota', 'email', 'municipio') list_display_links = ('nome',) diff --git a/sigi/apps/contatos/filters.py b/sigi/apps/contatos/filters.py index a2c674b..8bf5b77 100644 --- a/sigi/apps/contatos/filters.py +++ b/sigi/apps/contatos/filters.py @@ -19,10 +19,10 @@ class PopulationFilter(admin.SimpleListFilter): in the right sidebar. """ return ( - ( '1', '< 100 Mil'), - ( '2', '100 Mil a 1 Milhão'), - ( '3', '1 Milhão a 100 Milhões'), - ( '4', '> 100 Milhões'), + ('1', '< 100 Mil'), + ('2', '100 Mil a 1 Milhão'), + ('3', '1 Milhão a 100 Milhões'), + ('4', '> 100 Milhões'), ) def queryset(self, request, queryset): diff --git a/sigi/apps/contatos/models.py b/sigi/apps/contatos/models.py index 846f468..f651474 100644 --- a/sigi/apps/contatos/models.py +++ b/sigi/apps/contatos/models.py @@ -6,8 +6,8 @@ from sigi.apps.utils import SearchField from django.core.validators import MaxValueValidator, MinValueValidator - class UnidadeFederativa(models.Model): + """ Modelo que representa um estado brasileiro """ REGIAO_CHOICES = ( @@ -42,7 +42,9 @@ class UnidadeFederativa(models.Model): def __unicode__(self): return self.nome + class Municipio(models.Model): + """ Modelo para representar as cidades brasileiras """ codigo_ibge = models.PositiveIntegerField( @@ -97,11 +99,11 @@ class Municipio(models.Model): blank=True, help_text='Exemplo: -45,426.' ) - - idh = models.DecimalField(u'IDH', help_text=u'Índice de desenvolvimento Humano', max_digits=4, decimal_places=3, + + idh = models.DecimalField(u'IDH', help_text=u'Índice de desenvolvimento Humano', max_digits=4, decimal_places=3, validators=[MinValueValidator(0), MaxValueValidator(1)]) idh.list_filter_range = [0.500, 0.800] - + pib_total = models.DecimalField(u'PIB total', max_digits=18, decimal_places=3, blank=True, null=True) pib_percapita = models.DecimalField(u'PIB per capita', max_digits=18, decimal_places=3, blank=True, null=True) pib_ano = models.IntegerField(u'Ano de apuração do PIB', blank=True, null=True) @@ -118,7 +120,9 @@ class Municipio(models.Model): return "http://maps.google.com.br/maps/mm?ie=UTF8&hl=pt-BR&t=h&ll=%s,%s&spn=1.61886,1.812744&z=9&source=embed" % \ (self.latitude, self.longitude) + class Telefone(models.Model): + """ Modelo genérico para agrupar telefones dos modulos do sistema """ TELEFONE_CHOICES = ( @@ -129,16 +133,16 @@ class Telefone(models.Model): ) numero = models.CharField( 'número', - max_length=64, # TODO: diminuir tamanho de campo após migração de dados + max_length=64, # TODO: diminuir tamanho de campo após migração de dados help_text='Exemplo: (31)8851-9898.', ) tipo = models.CharField( max_length=1, choices=TELEFONE_CHOICES, - default= 'I' + default='I' ) nota = models.CharField(max_length=70, null=True, blank=True) - ult_alteracao = models.DateTimeField(u'Última alteração', null=True, blank=True, editable=False, auto_now=True) + ult_alteracao = models.DateTimeField(u'Última alteração', null=True, blank=True, editable=False, auto_now=True) # guarda o tipo do objeto (classe) vinculado a esse registro content_type = models.ForeignKey(ContentType) @@ -153,7 +157,9 @@ class Telefone(models.Model): def __unicode__(self): return unicode(self.numero) + class Contato(models.Model): + """ Modelo generico para registrar contatos vinculados aos modulos do sistema """ @@ -185,63 +191,64 @@ class Contato(models.Model): def __unicode__(self): return self.nome + class Endereco(models.Model): TIPO_CHOICES = ( - ('aeroporto','Aeroporto'), - ('alameda','Alameda'), - ('area',u'Área'), - ('avenida','Avenida'), - ('campo','Campo'), - ('chacara',u'Chácara'), - ('colonia',u'Colônia'), - ('condominio',u'Condomínio'), - ('conjunto','Conjunto'), - ('distrito','Distrito'), - ('esplanada','Esplanada'), - ('estacao',u'Estação'), - ('estrada','Estrada'), - ('favela','Favela'), - ('fazenda','Fazenda'), - ('feira','Feira'), - ('jardim','Jardim'), - ('ladeira','Ladeira'), - ('lago','Lago'), - ('lagoa','Lagoa'), - ('largo','Largo'), - ('loteamento','Loteamento'), - ('morro','Morro'), - ('nucleo',u'Núcleo'), - ('parque','Parque'), - ('passarela','Passarela'), - ('patio',u'Pátio'), - ('praca',u'Praça'), - ('quadra','Quadra'), - ('recanto','Recanto'), - ('residencial','Residencial'), - ('rodovia','Rodovia'), - ('rua','Rua'), - ('setor','Setor'), - ('sitio',u'Sítio'), - ('travessa','Travessa'), - ('trecho','Trecho'), - ('trevo','Trevo'), - ('vale','Vale'), - ('vereda','Vereda'), - ('via','Via'), - ('viaduto','Viaduto'), - ('viela','Viela'), - ('vila','Vila'), - ('outro','Outro'), + ('aeroporto', 'Aeroporto'), + ('alameda', 'Alameda'), + ('area', u'Área'), + ('avenida', 'Avenida'), + ('campo', 'Campo'), + ('chacara', u'Chácara'), + ('colonia', u'Colônia'), + ('condominio', u'Condomínio'), + ('conjunto', 'Conjunto'), + ('distrito', 'Distrito'), + ('esplanada', 'Esplanada'), + ('estacao', u'Estação'), + ('estrada', 'Estrada'), + ('favela', 'Favela'), + ('fazenda', 'Fazenda'), + ('feira', 'Feira'), + ('jardim', 'Jardim'), + ('ladeira', 'Ladeira'), + ('lago', 'Lago'), + ('lagoa', 'Lagoa'), + ('largo', 'Largo'), + ('loteamento', 'Loteamento'), + ('morro', 'Morro'), + ('nucleo', u'Núcleo'), + ('parque', 'Parque'), + ('passarela', 'Passarela'), + ('patio', u'Pátio'), + ('praca', u'Praça'), + ('quadra', 'Quadra'), + ('recanto', 'Recanto'), + ('residencial', 'Residencial'), + ('rodovia', 'Rodovia'), + ('rua', 'Rua'), + ('setor', 'Setor'), + ('sitio', u'Sítio'), + ('travessa', 'Travessa'), + ('trecho', 'Trecho'), + ('trevo', 'Trevo'), + ('vale', 'Vale'), + ('vereda', 'Vereda'), + ('via', 'Via'), + ('viaduto', 'Viaduto'), + ('viela', 'Viela'), + ('vila', 'Vila'), + ('outro', 'Outro'), ) # tipo do endereço obtido no site dos correios - tipo = models.CharField(max_length=15,choices=TIPO_CHOICES) + tipo = models.CharField(max_length=15, choices=TIPO_CHOICES) logradouro = models.CharField( max_length=100, ) logradouro.alphabetic_filter = True - numero= models.CharField(max_length=15, blank=True) - complemento= models.CharField(max_length=15, blank=True) + numero = models.CharField(max_length=15, blank=True) + complemento = models.CharField(max_length=15, blank=True) # campo de texto livre referencia = models.CharField(max_length=100, blank=True) bairro = models.CharField(max_length=100, blank=True) @@ -275,5 +282,4 @@ class Endereco(models.Model): def __unicode__(self): return self.tipo + ' ' + self.logradouro + ', ' + self.numero \ - + ' ' + self.complemento + ' - ' + self.bairro - + + ' ' + self.complemento + ' - ' + self.bairro diff --git a/sigi/apps/convenios/admin.py b/sigi/apps/convenios/admin.py index aad5e10..a7796ac 100644 --- a/sigi/apps/convenios/admin.py +++ b/sigi/apps/convenios/admin.py @@ -11,57 +11,62 @@ from geraldo.generators import PDFGenerator from sigi.apps.convenios.views import adicionar_convenios_carrinho + class TramitacaoInline(admin.TabularInline): model = Tramitacao extra = 1 + class AnexosInline(admin.TabularInline): model = Anexo extra = 2 - exclude = ['data_pub',] + exclude = ['data_pub', ] + class EquipamentoPrevistoInline(admin.TabularInline): model = EquipamentoPrevisto extra = 2 raw_id_fields = ('equipamento',) + class AnexoAdmin(admin.ModelAdmin): date_hierarchy = 'data_pub' - exclude = ['data_pub',] + exclude = ['data_pub', ] list_display = ('arquivo', 'descricao', 'data_pub', 'convenio') raw_id_fields = ('convenio',) search_fields = ('descricao', 'convenio__id', 'arquivo', 'convenio__casa_legislativa__nome') + class ConvenioAdmin(admin.ModelAdmin): change_list_template = 'convenios/change_list.html' fieldsets = ( (None, {'fields': ('casa_legislativa', 'num_processo_sf', 'num_convenio', 'projeto', 'observacao')} - ), + ), ('Datas', {'fields': ('data_adesao', 'data_retorno_assinatura', 'data_termo_aceite', 'data_pub_diario', 'data_devolucao_via', 'data_postagem_correio')} - ), - ('Datas - Convenio sem assinatura', - {'fields': ('data_devolucao_sem_assinatura','data_retorno_sem_assinatura',)} - ), + ), + ('Datas - Convenio sem assinatura', + {'fields': ('data_devolucao_sem_assinatura', 'data_retorno_sem_assinatura',)} + ), ) actions = ['adicionar_convenios'] inlines = (TramitacaoInline, AnexosInline, EquipamentoPrevistoInline) list_display = ('num_convenio', 'casa_legislativa', 'get_uf', - 'data_adesao','data_retorno_assinatura','data_pub_diario','data_termo_aceite', + 'data_adesao', 'data_retorno_assinatura', 'data_pub_diario', 'data_termo_aceite', 'projeto', ) - list_display_links = ('num_convenio','casa_legislativa',) - list_filter = ('projeto', 'casa_legislativa__municipio__uf', 'casa_legislativa','conveniada', 'equipada') + list_display_links = ('num_convenio', 'casa_legislativa',) + list_filter = ('projeto', 'casa_legislativa__municipio__uf', 'casa_legislativa', 'conveniada', 'equipada') #date_hierarchy = 'data_adesao' - ordering = ('casa_legislativa__tipo__sigla','casa_legislativa__municipio__uf','casa_legislativa') + ordering = ('casa_legislativa__tipo__sigla', 'casa_legislativa__municipio__uf', 'casa_legislativa') raw_id_fields = ('casa_legislativa',) get_queryset = queryset_ascii - search_fields = ('id', 'search_text',#'casa_legislativa__nome', - 'num_processo_sf','num_convenio') + search_fields = ('id', 'search_text', # 'casa_legislativa__nome', + 'num_processo_sf', 'num_convenio') def get_uf(self, obj): return obj.casa_legislativa.municipio.uf.sigla @@ -70,31 +75,32 @@ class ConvenioAdmin(admin.ModelAdmin): def changelist_view(self, request, extra_context=None): import re - request.GET._mutable=True + request.GET._mutable = True if 'data_retorno_assinatura__gte' in request.GET: - value = request.GET.get('data_retorno_assinatura__gte','') + value = request.GET.get('data_retorno_assinatura__gte', '') if value == '': del request.GET['data_retorno_assinatura__gte'] - elif re.match('^\d*$', value): # Year only - request.GET['data_retorno_assinatura__gte'] = "%s-01-01" % value #Complete with january 1st - elif re.match('^\d*\D\d*$', value): # Year and month - request.GET['data_retorno_assinatura__gte'] = '%s-01' % value #Complete with 1st day of month + elif re.match('^\d*$', value): # Year only + request.GET['data_retorno_assinatura__gte'] = "%s-01-01" % value # Complete with january 1st + elif re.match('^\d*\D\d*$', value): # Year and month + request.GET['data_retorno_assinatura__gte'] = '%s-01' % value # Complete with 1st day of month if 'data_retorno_assinatura__lte' in request.GET: - value = request.GET.get('data_retorno_assinatura__lte','') + value = request.GET.get('data_retorno_assinatura__lte', '') if value == '': del request.GET['data_retorno_assinatura__lte'] - elif re.match('^\d*$', value): # Year only - request.GET['data_retorno_assinatura__lte'] = "%s-01-01" % value #Complete with january 1st - elif re.match('^\d*\D\d*$', value): # Year and month - request.GET['data_retorno_assinatura__lte'] = '%s-01' % value #Complete with 1st day of month - request.GET._mutable=False + elif re.match('^\d*$', value): # Year only + request.GET['data_retorno_assinatura__lte'] = "%s-01-01" % value # Complete with january 1st + elif re.match('^\d*\D\d*$', value): # Year and month + request.GET['data_retorno_assinatura__lte'] = '%s-01' % value # Complete with 1st day of month + request.GET._mutable = False return super(ConvenioAdmin, self).changelist_view( request, extra_context={'query_str': '?' + request.META['QUERY_STRING']} ) + def relatorio(self, request, queryset): - #queryset.order_by('casa_legislativa__municipio__uf') + # queryset.order_by('casa_legislativa__municipio__uf') response = HttpResponse(mimetype='application/pdf') report = ConvenioReport(queryset=queryset) report.generate_by(PDFGenerator, filename=response) @@ -106,13 +112,13 @@ class ConvenioAdmin(admin.ModelAdmin): q1 = len(request.session['carrinho_convenios']) else: q1 = 0 - adicionar_convenios_carrinho(request,queryset=queryset) + adicionar_convenios_carrinho(request, queryset=queryset) q2 = len(request.session['carrinho_convenios']) quant = q2 - q1 if quant: - self.message_user(request,str(q2-q1)+" Convênios adicionados no carrinho" ) + self.message_user(request, str(q2 - q1) + " Convênios adicionados no carrinho") else: - self.message_user(request,"Os Convênios selecionados já foram adicionadas anteriormente" ) + self.message_user(request, "Os Convênios selecionados já foram adicionadas anteriormente") return HttpResponseRedirect('.') adicionar_convenios.short_description = u"Armazenar convênios no carrinho para exportar" @@ -126,6 +132,7 @@ class ConvenioAdmin(admin.ModelAdmin): return super(ConvenioAdmin, self).lookup_allowed(lookup, value) or \ lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact'] + class EquipamentoPrevistoAdmin(admin.ModelAdmin): list_display = ('convenio', 'equipamento', 'quantidade') list_display_links = ('convenio', 'equipamento') diff --git a/sigi/apps/convenios/models.py b/sigi/apps/convenios/models.py index 0297a22..beb9135 100644 --- a/sigi/apps/convenios/models.py +++ b/sigi/apps/convenios/models.py @@ -1,4 +1,4 @@ -#style="list-style-type: noneo -*- coding: utf-8 -*- +# style="list-style-type: noneo -*- coding: utf-8 -*- from datetime import datetime from django.db import models from django.contrib.contenttypes import generic @@ -6,6 +6,7 @@ from sigi.apps.utils import SearchField class Projeto(models.Model): + """ Modelo para representar os projetos do programa Interlegis """ @@ -17,6 +18,7 @@ class Projeto(models.Model): class Convenio(models.Model): + """ Modelo que representa um convênio do Interlegis com uma Casa Legislativa. @@ -90,7 +92,7 @@ class Convenio(models.Model): help_text=u'Data do retorno do convênio sem assinatura', ) observacao = models.CharField( - null=True, + null=True, blank=True, max_length=100, ) @@ -98,24 +100,24 @@ class Convenio(models.Model): equipada = models.BooleanField() def save(self, *args, **kwargs): - self.conveniada = self.data_retorno_assinatura!=None - self.equipada = self.data_termo_aceite!=None + self.conveniada = self.data_retorno_assinatura != None + self.equipada = self.data_termo_aceite != None super(Convenio, self).save(*args, **kwargs) - class Meta: get_latest_by = 'id' ordering = ('id',) verbose_name = u'convênio' def __unicode__(self): - if self.data_retorno_assinatura != None: + if self.data_retorno_assinatura != None: return u"Convênio nº %s - projeto %s, em %s" % (self.num_convenio, self.projeto.sigla, self.data_retorno_assinatura) else: return u"Adesão ao projeto %s, em %s" % (self.projeto.sigla, self.data_adesao) class EquipamentoPrevisto(models.Model): + """ Modelo utilizado para registrar os equipamentos disponibilizados para as Casas Legislativas (foi usado na prmeira etapa do programa) @@ -133,6 +135,7 @@ class EquipamentoPrevisto(models.Model): class Anexo(models.Model): + """ Modelo para giardar os documentos gerados no processo de convênio """ @@ -151,7 +154,9 @@ class Anexo(models.Model): def __unicode__(self): return unicode("%s publicado em %s" % (self.descricao, self.data_pub)) + class UnidadeAdministrativa(models.Model): + """ Modelo para representar uma Unidade Administrativa que pode ser um servivo do próprio Interlegis, assim como uma unidade do Senado Federal @@ -164,6 +169,7 @@ class UnidadeAdministrativa(models.Model): class Tramitacao(models.Model): + """ Modelo para registrar as vias do processo de convênio e a Unidade responsável pelo tramite (ex. colher assinaturas do secretário do senado) """ @@ -185,4 +191,3 @@ class Tramitacao(models.Model): return unicode("%s em %s (%s)" % (self.unid_admin, self.data, self.observacao)) else: return unicode("%s em %s" % (self.unid_admin, self.data)) - diff --git a/sigi/apps/convenios/reports.py b/sigi/apps/convenios/reports.py index 36dd7a4..74fabf2 100644 --- a/sigi/apps/convenios/reports.py +++ b/sigi/apps/convenios/reports.py @@ -3,8 +3,8 @@ import os from ctypes import alignment from operator import attrgetter from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \ - landscape,SystemField, BAND_WIDTH,ReportGroup, \ - FIELD_ACTION_SUM, FIELD_ACTION_COUNT, FIELD_ACTION_AVG + landscape, SystemField, BAND_WIDTH, ReportGroup, \ + FIELD_ACTION_SUM, FIELD_ACTION_COUNT, FIELD_ACTION_AVG from geraldo.graphics import Image from reportlab.lib.units import cm @@ -15,302 +15,306 @@ from sigi.apps.relatorios.reports import ReportDefault #from abc import ABCMeta + class CasasAderidasReport(object): pass + class CasasNaoAderidasReport(object): pass + class CasasComEquipamentosReport(object): pass + class SemEquipamentosReport(object): pass + class ConvenioReport(ReportDefault): title = u'Relatório de Convênios' class band_page_header(ReportDefault.band_page_header): label_top = ReportDefault.band_page_header.label_top - label_left = [0,1.5,7,9,11,13,15,17] + label_left = [0, 1.5, 7, 9, 11, 13, 15, 17] elements = list(ReportDefault.band_page_header.elements) - height = 4.7*cm + height = 4.7 * cm elements += [ Label( text="UF", - left=label_left[0]*cm, - top=label_top + 0.4*cm, + left=label_left[0] * cm, + top=label_top + 0.4 * cm, ), Label( text="Municipio", - left=label_left[1]*cm, - top=label_top + 0.4*cm, - ), + left=label_left[1] * cm, + top=label_top + 0.4 * cm, + ), Label( text="Data de Adesão", - left=label_left[2]*cm, + left=label_left[2] * cm, top=label_top, - width=2*cm, + width=2 * cm, ), Label( text="Número do Convênio", - left=label_left[3]*cm, + left=label_left[3] * cm, top=label_top, - width=2*cm, + width=2 * cm, ), Label( text="Data do Convênio", - left=label_left[4]*cm, + left=label_left[4] * cm, top=label_top, - width=2*cm, - ), + width=2 * cm, + ), Label( text="Data de Publicação", - left=label_left[5]*cm, + left=label_left[5] * cm, top=label_top, - width=2*cm, + width=2 * cm, ), Label( text="Data de Aceite", - left=label_left[6]*cm, + left=label_left[6] * cm, top=label_top, - width=2*cm, + width=2 * cm, ), Label( text="Projeto", - left=label_left[7]*cm, - top=label_top + 0.4*cm, - width=2*cm, + left=label_left[7] * cm, + top=label_top + 0.4 * cm, + width=2 * cm, ), ] - - class band_page_footer(ReportDefault.band_page_footer): pass class band_detail(ReportDefault.band_detail): - label_left = [0,1.5,7,9,11,13,15,17] + label_left = [0, 1.5, 7, 9, 11, 13, 15, 17] - elements=[ + elements = [ ObjectValue( attribute_name='casa_legislativa.municipio.uf.sigla', - left=label_left[0]*cm + left=label_left[0] * cm ), ObjectValue( attribute_name='casa_legislativa.municipio.nome', - left=label_left[1]*cm - ), + left=label_left[1] * cm + ), ObjectValue( attribute_name='data_adesao', - left=label_left[2]*cm, + left=label_left[2] * cm, get_value=lambda instance: instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-' ), ObjectValue( attribute_name='num_convenio', - left=label_left[3]*cm + left=label_left[3] * cm ), ObjectValue( attribute_name='data_retorno_assinatura', - left=label_left[4]*cm, + left=label_left[4] * cm, get_value=lambda instance: instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-' - ), + ), ObjectValue( attribute_name='data_pub_diario', - left=label_left[5]*cm, + left=label_left[5] * cm, get_value=lambda instance: instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-' ), ObjectValue( attribute_name='data_termo_aceite', - left=label_left[6]*cm, + left=label_left[6] * cm, get_value=lambda instance: instance.data_termo_aceite.strftime('%d/%m/%Y') if instance.data_termo_aceite != None else '-' ), ObjectValue( attribute_name='projeto.sigla', - left=label_left[7]*cm + left=label_left[7] * cm ), - ] + ] groups = [ ReportGroup(attribute_name='casa_legislativa.municipio.uf', - band_header=ReportBand( - height=0.7*cm, - elements= [ - ObjectValue(attribute_name='casa_legislativa.municipio.uf', - get_Value= lambda instance: 'CasaLegislativa: '+ (instance.casa_legislativa.uf) + band_header=ReportBand( + height=0.7 * cm, + elements=[ + ObjectValue(attribute_name='casa_legislativa.municipio.uf', + get_Value=lambda instance: 'CasaLegislativa: ' + (instance.casa_legislativa.uf) + ) + ], + borders={'top': True}, + ) ) - ], - borders={'top': True}, - ) - ) ] - + + class ConvenioReportSemAceite(ConvenioReport): + class band_page_header(ReportDefault.band_page_header): label_top = ReportDefault.band_page_header.label_top - label_left = [0,1.5,7,9,11,13,15,17] + label_left = [0, 1.5, 7, 9, 11, 13, 15, 17] elements = list(ReportDefault.band_page_header.elements) - height = 4.7*cm + height = 4.7 * cm elements += [ Label( text="UF", - left=label_left[0]*cm, - top=label_top + 0.4*cm, + left=label_left[0] * cm, + top=label_top + 0.4 * cm, ), Label( text="Município", - left=label_left[1]*cm, - top=label_top + 0.4*cm, - ), + left=label_left[1] * cm, + top=label_top + 0.4 * cm, + ), Label( text="Data de Adesão", - left=label_left[3]*cm, + left=label_left[3] * cm, top=label_top, - width=2*cm, + width=2 * cm, ), Label( text="Número do Convênio", - left=label_left[4]*cm, + left=label_left[4] * cm, top=label_top, - width=2*cm, + width=2 * cm, ), Label( text="Data do Convênio", - left=label_left[5]*cm, + left=label_left[5] * cm, top=label_top, - width=2*cm, - ), + width=2 * cm, + ), Label( text="Data de Publicação", - left=label_left[6]*cm, + left=label_left[6] * cm, top=label_top, - width=2*cm, - ), + width=2 * cm, + ), Label( text="Projeto", - left=label_left[7]*cm, - top=label_top + 0.4*cm, - width=2*cm, + left=label_left[7] * cm, + top=label_top + 0.4 * cm, + width=2 * cm, ), ] - class band_detail(ReportDefault.band_detail): - label_left = [0,1.5,7,9,11,13,15,17] + label_left = [0, 1.5, 7, 9, 11, 13, 15, 17] - elements=[ + elements = [ ObjectValue( attribute_name='casa_legislativa.municipio.uf.sigla', - left=label_left[0]*cm + left=label_left[0] * cm ), ObjectValue( attribute_name='casa_legislativa.municipio.nome', - left=label_left[1]*cm - ), + left=label_left[1] * cm + ), ObjectValue( attribute_name='data_adesao', - left=label_left[3]*cm, + left=label_left[3] * cm, get_value=lambda instance: instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-' ), ObjectValue( attribute_name='num_convenio', - left=label_left[4]*cm + left=label_left[4] * cm ), ObjectValue( attribute_name='data_retorno_assinatura', - left=label_left[5]*cm, + left=label_left[5] * cm, get_value=lambda instance: instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-' - ), + ), ObjectValue( attribute_name='data_pub_diario', - left=label_left[6]*cm, + left=label_left[6] * cm, get_value=lambda instance: instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-' - ), + ), ObjectValue( attribute_name='projeto.sigla', - left=label_left[7]*cm + left=label_left[7] * cm ), - ] - - - - + ] + + +float_duas_casas = lambda instance: '%.2f' % (instance) + -float_duas_casas = lambda instance: '%.2f' % (instance) class ConvenioReportRegiao(ReportDefault): title = u'Relatório de Convênios por Região' class band_page_header(ReportDefault.band_page_header): - label_top = ReportDefault.band_page_header.label_top - label_left = [0.5,6,8,10,12,14] - map(lambda x:x-0.4,label_left) - - elements = list(ReportDefault.band_page_header.elements) - - elements += [ - Label(text="UF", left=label_left[0]*cm,top=label_top,), - Label(text="Total", left=label_left[1]*cm,top=label_top,), - Label(text="Aderidas", left=label_left[2]*cm,top=label_top,), - Label(text="%", left=label_left[3]*cm,top=label_top), - Label(text="Ñ Aderidas", left=label_left[4]*cm,top=label_top,), - Label(text="%", left=label_left[5]*cm,top=label_top), + label_top = ReportDefault.band_page_header.label_top + label_left = [0.5, 6, 8, 10, 12, 14] + map(lambda x: x - 0.4, label_left) + + elements = list(ReportDefault.band_page_header.elements) + + elements += [ + Label(text="UF", left=label_left[0] * cm, top=label_top,), + Label(text="Total", left=label_left[1] * cm, top=label_top,), + Label(text="Aderidas", left=label_left[2] * cm, top=label_top,), + Label(text="%", left=label_left[3] * cm, top=label_top), + Label(text="Ñ Aderidas", left=label_left[4] * cm, top=label_top,), + Label(text="%", left=label_left[5] * cm, top=label_top), ] + class band_detail(ReportDefault.band_detail): - label_left = [0.5,6,8,10,12,14] + label_left = [0.5, 6, 8, 10, 12, 14] display_inline = True - float_duas_casas = lambda instance: '%.2f' % (instance.porc_casas_aderidas) + float_duas_casas = lambda instance: '%.2f' % (instance.porc_casas_aderidas) default_style = {'fontName': 'Helvetica', 'fontSize': 11} - elements=[ - ObjectValue(attribute_name='estado', left=label_left[0]*cm, ), - ObjectValue(attribute_name='quant_casas', left=label_left[1]*cm,), - ObjectValue(attribute_name='quant_casas_aderidas', left=label_left[2]*cm), - ObjectValue(attribute_name='porc_casas_aderidas', left=label_left[3]*cm), - ObjectValue(attribute_name='quant_casas_nao_aderidas', left=label_left[4]*cm), - ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,), - ] - - class band_summary(ReportBand): - label_left = [0.5,6,8,10,12,14] elements = [ - Label(text="Total", top=0.1*cm, left=label_left[0]*cm), - ObjectValue(attribute_name='quant_casas', action=FIELD_ACTION_SUM, left=label_left[1]*cm, ), - ObjectValue(attribute_name='quant_casas_aderidas', action=FIELD_ACTION_SUM, left=label_left[2]*cm), -# ObjectValue(attribute_name='porc_casas_aderidas', action=FIELD_ACTION_AVG, left=label_left[3]*cm, -# #get_value= lambda instance : lambda instance: '%.2f' % (instance.porc_casas_aderidas), -# ), - ObjectValue(attribute_name='quant_casas_nao_aderidas', action=FIELD_ACTION_SUM, left=label_left[4]*cm), -# ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm, -# get_value=lambda x: teste(), -# ), - ] - borders = {'top':True} - - - - - + ObjectValue(attribute_name='estado', left=label_left[0] * cm, ), + ObjectValue(attribute_name='quant_casas', left=label_left[1] * cm,), + ObjectValue(attribute_name='quant_casas_aderidas', left=label_left[2] * cm), + ObjectValue(attribute_name='porc_casas_aderidas', left=label_left[3] * cm), + ObjectValue(attribute_name='quant_casas_nao_aderidas', left=label_left[4] * cm), + ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5] * cm,), + ] + + class band_summary(ReportBand): + label_left = [0.5, 6, 8, 10, 12, 14] + elements = [ + Label(text="Total", top=0.1 * cm, left=label_left[0] * cm), + ObjectValue(attribute_name='quant_casas', action=FIELD_ACTION_SUM, left=label_left[1] * cm, ), + ObjectValue(attribute_name='quant_casas_aderidas', action=FIELD_ACTION_SUM, left=label_left[2] * cm), + # ObjectValue(attribute_name='porc_casas_aderidas', action=FIELD_ACTION_AVG, left=label_left[3]*cm, + # get_value= lambda instance : lambda instance: '%.2f' % (instance.porc_casas_aderidas), + # ), + ObjectValue(attribute_name='quant_casas_nao_aderidas', action=FIELD_ACTION_SUM, left=label_left[4] * cm), + # ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm, + # get_value=lambda x: teste(), + # ), + ] + borders = {'top': True} + + class ConvenioPorCMReport(ConvenioReport): title = u'Relatório de Convênios por Câmara Municipal' + class ConvenioPorALReport(ConvenioReport): title = u'Relatório de Convênios por Assembléia Legislativa' - + + class ConvenioReportSemAceiteCM(ConvenioReportSemAceite): title = u'Relatório de Convênios por Câmara Municipal' - + + class ConvenioReportSemAceiteAL(ConvenioReportSemAceite): - title = u'Relatório de Convênios por Assembléia Legislativa' \ No newline at end of file + title = u'Relatório de Convênios por Assembléia Legislativa' diff --git a/sigi/apps/convenios/views.py b/sigi/apps/convenios/views.py index a06f195..aa93b0a 100644 --- a/sigi/apps/convenios/views.py +++ b/sigi/apps/convenios/views.py @@ -4,10 +4,10 @@ from django.shortcuts import render_to_response, get_list_or_404 from geraldo.generators import PDFGenerator from sigi.apps.convenios.models import Convenio, Projeto from sigi.apps.convenios.reports import ConvenioReport \ - ,ConvenioPorCMReport \ - ,ConvenioPorALReport \ - ,ConvenioReportSemAceiteAL \ - ,ConvenioReportSemAceiteCM + , ConvenioPorCMReport \ + , ConvenioPorALReport \ + , ConvenioReportSemAceiteAL \ + , ConvenioReportSemAceiteCM from sigi.apps.casas.models import CasaLegislativa from sigi.apps.contatos.models import UnidadeFederativa @@ -22,56 +22,60 @@ import datetime import csv -def query_ordena(qs,o,ot): + +def query_ordena(qs, o, ot): list_display = ('num_convenio', 'casa_legislativa', - 'data_adesao','data_retorno_assinatura','data_termo_aceite', + 'data_adesao', 'data_retorno_assinatura', 'data_termo_aceite', 'projeto', ) - aux = list_display[(int(o)-1)] - if ot =='asc': + aux = list_display[(int(o) - 1)] + if ot == 'asc': qs = qs.order_by(aux) else: - qs = qs.order_by("-"+aux) + qs = qs.order_by("-" + aux) return qs -def get_for_qs(get,qs): + +def get_for_qs(get, qs): kwargs = {} ids = 0 - for k,v in get.iteritems(): + for k, v in get.iteritems(): if k not in ['page', 'pop', 'q', '_popup']: if not k == 'o': if k == "ot": - qs = query_ordena(qs,get["o"],get["ot"]) + qs = query_ordena(qs, get["o"], get["ot"]) else: kwargs[str(k)] = v - if(str(k)=='ids'): + if(str(k) == 'ids'): ids = 1 break qs = qs.filter(**kwargs) if ids: - query = 'id IN ('+ kwargs['ids'].__str__()+')' + query = 'id IN (' + kwargs['ids'].__str__() + ')' qs = Convenio.objects.extra(where=[query]) return qs + def carrinhoOrGet_for_qs(request): """ Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente. - """ + """ if request.session.has_key('carrinho_convenios'): - ids = request.session['carrinho_convenios'] - qs = Convenio.objects.filter(pk__in=ids) + ids = request.session['carrinho_convenios'] + qs = Convenio.objects.filter(pk__in=ids) else: - qs = Convenio.objects.all() + qs = Convenio.objects.all() if request.GET: - qs = qs.order_by("casa_legislativa__municipio__uf","casa_legislativa__municipio") - qs = get_for_qs(request.GET,qs) + qs = qs.order_by("casa_legislativa__municipio__uf", "casa_legislativa__municipio") + qs = get_for_qs(request.GET, qs) return qs -def adicionar_convenios_carrinho(request,queryset=None,id=None): + +def adicionar_convenios_carrinho(request, queryset=None, id=None): if request.method == 'POST': - ids_selecionados = request.POST.getlist('_selected_action') + ids_selecionados = request.POST.getlist('_selected_action') if not request.session.has_key('carrinho_convenios'): request.session['carrinho_convenios'] = ids_selecionados else: @@ -79,35 +83,38 @@ def adicionar_convenios_carrinho(request,queryset=None,id=None): # Verifica se id já não está adicionado for id in ids_selecionados: if not id in lista: - lista.append(id) - request.session['carrinho_convenios'] = lista - + lista.append(id) + request.session['carrinho_convenios'] = lista + + def excluir_carrinho(request): if request.session.has_key('carrinho_convenios'): del request.session['carrinho_convenios'] return HttpResponseRedirect('.') + def deleta_itens_carrinho(request): if request.method == 'POST': - ids_selecionados = request.POST.getlist('_selected_action') - if request.session.has_key('carrinho_convenios'): - lista = request.session['carrinho_convenios'] + ids_selecionados = request.POST.getlist('_selected_action') + if request.session.has_key('carrinho_convenios'): + lista = request.session['carrinho_convenios'] for item in ids_selecionados: lista.remove(item) - if lista: + if lista: request.session['carrinho_convenios'] = lista else: - del lista; - del request.session['carrinho_convenios'] - + del lista + del request.session['carrinho_convenios'] + return HttpResponseRedirect('.') + def visualizar_carrinho(request): - + qs = carrinhoOrGet_for_qs(request) - + paginator = Paginator(qs, 100) - + # Make sure page request is an int. If not, deliver first page. # Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página. try: @@ -120,33 +127,34 @@ def visualizar_carrinho(request): paginas = paginator.page(page) except (EmptyPage, InvalidPage): paginas = paginator.page(paginator.num_pages) - + carrinhoIsEmpty = not(request.session.has_key('carrinho_convenios')) - + return render_to_response( 'convenios/carrinho.html', { - 'MEDIA_URL':settings.MEDIA_URL, - 'carIsEmpty':carrinhoIsEmpty, - 'paginas':paginas, - 'query_str':'?'+request.META['QUERY_STRING'] + 'MEDIA_URL': settings.MEDIA_URL, + 'carIsEmpty': carrinhoIsEmpty, + 'paginas': paginas, + 'query_str': '?' + request.META['QUERY_STRING'] } ) - -def report(request, id=None): - + + +def report(request, id=None): + if id: qs = Convenio.objects.filter(pk=id) else: - qs = carrinhoOrGet_for_qs(request) - + qs = carrinhoOrGet_for_qs(request) + if not qs: return HttpResponseRedirect('../') - + tipo = '' data_aceite_has = '' report = None - if request.POST: + if request.POST: if request.POST.has_key('filtro_casa'): tipo = request.POST['filtro_casa'] if request.POST.has_key('data_aceite'): @@ -160,24 +168,23 @@ def report(request, id=None): else: report = ConvenioPorALReport(queryset=qs) else: - qs = qs.filter(casa_legislativa__tipo__sigla='CM') + qs = qs.filter(casa_legislativa__tipo__sigla='CM') if data_aceite_has == 'nao': report = ConvenioReportSemAceiteCM(queryset=qs) else: report = ConvenioPorCMReport(queryset=qs) - - + response = HttpResponse(mimetype='application/pdf') - if report: + if report: report.generate_by(PDFGenerator, filename=response) else: - return HttpResponseRedirect('../') + return HttpResponseRedirect('../') return response -def casas_estado_to_tabela(casas,convenios,regiao): +def casas_estado_to_tabela(casas, convenios, regiao): - estados = get_list_or_404(UnidadeFederativa,regiao=regiao) + estados = get_list_or_404(UnidadeFederativa, regiao=regiao) class LinhaEstado(): pass @@ -208,7 +215,7 @@ def casas_estado_to_tabela(casas,convenios,regiao): linha.estado = estado lista.append(linha) - + casas_regiao = casas.filter(municipio__uf__regiao=regiao) convenios_regiao = convenios.filter(casa_legislativa__municipio__uf__regiao=regiao) convenios_regiao_publicados = convenios_regiao.exclude(data_pub_diario=None) @@ -225,19 +232,20 @@ def casas_estado_to_tabela(casas,convenios,regiao): u'UF', u'Câmaras municipais', u'Não Aderidas', - u'Aderidas', + u'Aderidas', u'Conveniadas', u'Equipadas' - ) + ) return { - "linhas":lista, - "cabecalho":cabecalho_topo, - "sumario":sumario, + "linhas": lista, + "cabecalho": cabecalho_topo, + "sumario": sumario, } -def report_regiao(request,regiao='NE'): - + +def report_regiao(request, regiao='NE'): + if request.POST: if request.POST.has_key('regiao'): regiao = request.POST['regiao'] @@ -249,39 +257,40 @@ def report_regiao(request,regiao='NE'): 'NE': 'Nordeste', 'NO': 'Norte', } - + projetos = Projeto.objects.all() - + camaras = CasaLegislativa.objects.filter(tipo__sigla='CM') tabelas = list() # Geral - convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM') - tabela = casas_estado_to_tabela(camaras,convenios,regiao) + convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM') + tabela = casas_estado_to_tabela(camaras, convenios, regiao) tabela["projeto"] = "Geral" tabelas.append(tabela) for projeto in projetos: convenios_proj = convenios.filter(projeto=projeto) - tabela = casas_estado_to_tabela(camaras, convenios_proj,regiao) + tabela = casas_estado_to_tabela(camaras, convenios_proj, regiao) tabela["projeto"] = projeto.nome tabelas.append(tabela) - + data = datetime.datetime.now().strftime('%d/%m/%Y') - hora = datetime.datetime.now().strftime('%H:%M') + hora = datetime.datetime.now().strftime('%H:%M') pisa.showLogging() response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=RelatorioRegiao_' + regiao + '.pdf' #tabelas = ({'projeto':"PI"},{'projeto':"PML"},) t = loader.get_template('convenios/tabela_regiao.html') - c = Context({'tabelas':tabelas,'regiao':REGIAO_CHOICES[regiao],'data':data,'hora':hora}) - pdf = pisa.CreatePDF(t.render(c),response) + c = Context({'tabelas': tabelas, 'regiao': REGIAO_CHOICES[regiao], 'data': data, 'hora': hora}) + pdf = pisa.CreatePDF(t.render(c), response) if not pdf.err: pisa.startViewer(response) return response + def export_csv(request): response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; filename=convenios.csv' @@ -291,16 +300,16 @@ def export_csv(request): if not convenios: return HttpResponseRedirect('../') - atributos = [ u"No. Processo", u"No. Convênio", u"Projeto", u"Casa Legislativa", u"Data de Adesão", u"Data de Convênio", + atributos = [u"No. Processo", u"No. Convênio", u"Projeto", u"Casa Legislativa", u"Data de Adesão", u"Data de Convênio", u"Data da Publicacao no D.O.", u"Data Equipada", ] if request.POST: atributos = request.POST.getlist("itens_csv_selected") - + col_titles = atributos if u"Casa Legislativa" in col_titles: pos = col_titles.index(u"Casa Legislativa") + 1 - col_titles.insert(pos, u"uf") + col_titles.insert(pos, u"uf") csv_writer.writerow([s.encode("utf-8") for s in col_titles]) for convenio in convenios: @@ -341,4 +350,3 @@ def export_csv(request): csv_writer.writerow(lista) return response - diff --git a/sigi/apps/diagnosticos/admin.py b/sigi/apps/diagnosticos/admin.py index db2f10a..da15f9d 100644 --- a/sigi/apps/diagnosticos/admin.py +++ b/sigi/apps/diagnosticos/admin.py @@ -6,17 +6,18 @@ from sigi.apps.diagnosticos.models import Diagnostico, Pergunta, Escolha, Equipe from sigi.apps.diagnosticos.forms import DiagnosticoForm from sigi.apps.contatos.models import UnidadeFederativa + def publicar_diagnostico(self, request, queryset): for registro in queryset: diagnostico = Diagnostico.objects.get(pk=registro.id) diagnostico.publicado = True - diagnostico.data_publicacao= datetime.now() + diagnostico.data_publicacao = datetime.now() diagnostico.save() # Enviando o email avisando que o diagnóstico foi publicado email = diagnostico.responsavel.user.email if email: - diagnostico.email_diagnostico_publicado(email, request.get_host()) + diagnostico.email_diagnostico_publicado(email, request.get_host()) self.message_user(request, "Diagnóstico(s) publicado(s) com sucesso!") publicar_diagnostico.short_description = u""" Definir diagnósticos como publicado""" @@ -27,14 +28,17 @@ def despublicar_diagnostico(self, request, queryset): despublicar_diagnostico.short_description = u""" Definir diagnósticos como não publicado""" + class EquipeInline(admin.TabularInline): model = Equipe + class AnexosInline(admin.TabularInline): model = Anexo extra = 2 exclude = ['data_pub', ] + class AnexoAdmin(admin.ModelAdmin): date_hierarchy = 'data_pub' exclude = ['data_pub', ] @@ -43,13 +47,14 @@ class AnexoAdmin(admin.ModelAdmin): search_fields = ('descricao', 'diagnostico__id', 'arquivo', 'diagnostico__casa_legislativa__nome') + class DiagnosticoAdmin(BaseEntityAdmin): form = DiagnosticoForm actions = [publicar_diagnostico, despublicar_diagnostico] inlines = (EquipeInline, AnexosInline) search_fields = ('casa_legislativa__nome',) - list_display = ('casa_legislativa','get_uf', 'data_visita_inicio', 'data_visita_fim', 'responsavel', 'publicado') - list_filter = ('publicado', 'casa_legislativa__municipio__uf__nome', 'casa_legislativa', 'data_publicacao', 'data_visita_inicio', 'data_visita_fim') + list_display = ('casa_legislativa', 'get_uf', 'data_visita_inicio', 'data_visita_fim', 'responsavel', 'publicado') + list_filter = ('publicado', 'casa_legislativa__municipio__uf__nome', 'casa_legislativa', 'data_publicacao', 'data_visita_inicio', 'data_visita_fim') raw_id_fields = ('casa_legislativa',) ordering = ('casa_legislativa',) @@ -57,7 +62,7 @@ class DiagnosticoAdmin(BaseEntityAdmin): (u'00. Identificação do Diagnóstico', {'fields': ('responsavel', 'data_visita_inicio', 'data_visita_fim',)}), (u'01. Identificação da Casa Legislativa', {'fields': ('casa_legislativa',)}), (u'02. Identificação de Competências da Casa Legislativa', {'fields': ()}) - ) + ) # popula o eav fieldsets ordenando as categorias e as perguntas # para serem exibidas no admin @@ -67,49 +72,50 @@ class DiagnosticoAdmin(BaseEntityAdmin): perguntas = [pergunta[1] for pergunta in sorted(perguntas_by_title)] eav_fieldsets += ((categoria, { - 'fields': tuple(perguntas), - 'classes': ['collapse'] - }),) - + 'fields': tuple(perguntas), + 'classes': ['collapse'] + }),) def get_uf(self, obj): return '%s' % (obj.casa_legislativa.municipio.uf) get_uf.short_description = 'UF' get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome' - + def lookup_allowed(self, lookup, value): return super(DiagnosticoAdmin, self).lookup_allowed(lookup, value) or \ lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact'] def changelist_view(self, request, extra_context=None): import re - request.GET._mutable=True + request.GET._mutable = True if 'data_visita_inicio__gte' in request.GET: - value = request.GET.get('data_visita_inicio__gte','') + value = request.GET.get('data_visita_inicio__gte', '') if value == '': del request.GET['data_visita_inicio__gte'] - elif re.match('^\d*$', value): # Year only - request.GET['data_visita_inicio__gte'] = "%s-01-01" % value #Complete with january 1st - elif re.match('^\d*\D\d*$', value): # Year and month - request.GET['data_visita_inicio__gte'] = '%s-01' % value #Complete with 1st day of month + elif re.match('^\d*$', value): # Year only + request.GET['data_visita_inicio__gte'] = "%s-01-01" % value # Complete with january 1st + elif re.match('^\d*\D\d*$', value): # Year and month + request.GET['data_visita_inicio__gte'] = '%s-01' % value # Complete with 1st day of month if 'data_visita_inicio__lte' in request.GET: - value = request.GET.get('data_visita_inicio__lte','') + value = request.GET.get('data_visita_inicio__lte', '') if value == '': del request.GET['data_visita_inicio__lte'] - elif re.match('^\d*$', value): # Year only - request.GET['data_visita_inicio__lte'] = "%s-01-01" % value #Complete with january 1st - elif re.match('^\d*\D\d*$', value): # Year and month - request.GET['data_visita_inicio__lte'] = '%s-01' % value #Complete with 1st day of month - request.GET._mutable=False - + elif re.match('^\d*$', value): # Year only + request.GET['data_visita_inicio__lte'] = "%s-01-01" % value # Complete with january 1st + elif re.match('^\d*\D\d*$', value): # Year and month + request.GET['data_visita_inicio__lte'] = '%s-01' % value # Complete with 1st day of month + request.GET._mutable = False + return super(DiagnosticoAdmin, self).changelist_view(request, extra_context) + class EscolhaAdmin(admin.ModelAdmin): search_fields = ('title',) list_display = ('title', 'schema', 'schema_to_open') raw_id_fields = ('schema', 'schema_to_open') ordering = ('schema', 'title') + class EscolhaInline(admin.TabularInline): model = Escolha fk_name = 'schema' @@ -117,6 +123,7 @@ class EscolhaInline(admin.TabularInline): verbose_name = 'Escolhas (apenas para choices ou multiple choices)' extra = 0 + class PerguntaAdmin (BaseSchemaAdmin): search_fields = ('title', 'help_text', 'name',) list_display = ('title', 'categoria', 'datatype', 'help_text', 'required') diff --git a/sigi/apps/diagnosticos/decorators.py b/sigi/apps/diagnosticos/decorators.py index f568ea7..c246505 100644 --- a/sigi/apps/diagnosticos/decorators.py +++ b/sigi/apps/diagnosticos/decorators.py @@ -4,6 +4,7 @@ from django.template import RequestContext from django.shortcuts import render_to_response from sigi.apps.diagnosticos.models import Diagnostico + def validate_diagnostico(func): def decorator(request, id_diagnostico, *args, **kwargs): """ Retorna 404 caso o diagnostico esteja publicado diff --git a/sigi/apps/diagnosticos/forms.py b/sigi/apps/diagnosticos/forms.py index a322e9e..038d346 100644 --- a/sigi/apps/diagnosticos/forms.py +++ b/sigi/apps/diagnosticos/forms.py @@ -16,6 +16,7 @@ from eav.fields import RangeField class DiagnosticoForm(BaseDynamicEntityForm): + """Classe responsável por contruir o formulário, vinculando ao modelo Diagnostico """ @@ -26,9 +27,11 @@ class DiagnosticoForm(BaseDynamicEntityForm): for k, f in self.fields.iteritems(): if isinstance(f, CharField): - f.widget = forms.widgets.Textarea(attrs={'cols':'80'}) + f.widget = forms.widgets.Textarea(attrs={'cols': '80'}) + class DiagnosticoMobileForm(BaseDynamicEntityForm): + """Classe responsável por construir o formulário para ser usado no ambiente mobile, a partir do do modelo Diagnostico, como também organizar sua @@ -51,17 +54,18 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm): } FIELD_WIDGET = { - 'consideracoes_gerais' : {'widget': Textarea}, - 'descreva_5_cursos_prioritarios_para_treinamento_de_parlamentares_da_camara_municipal' : {'widget': Textarea}, - 'descreva_5_cursos_prioritarios_para_treinamento_de_servidores_da_camara_municipal' : {'widget': Textarea}, - 'sugestoes_para_a_area_de_capacitacao' : {'widget': Textarea}, - 'sugestoes_para_a_area_de_comunicacao' : {'widget': Textarea}, - 'sugestoes_para_a_area_de_informacao' : {'widget': Textarea}, - 'sugestoes_para_a_area_de_ti' : {'widget': Textarea}, - 'inscricoes_para_lista_gitec' : {'widget': Textarea}, - 'inscricoes_para_lista_gial' : {'widget': Textarea}, - 'inscricoes_para_lista_gicom' : {'widget': Textarea}, + 'consideracoes_gerais': {'widget': Textarea}, + 'descreva_5_cursos_prioritarios_para_treinamento_de_parlamentares_da_camara_municipal': {'widget': Textarea}, + 'descreva_5_cursos_prioritarios_para_treinamento_de_servidores_da_camara_municipal': {'widget': Textarea}, + 'sugestoes_para_a_area_de_capacitacao': {'widget': Textarea}, + 'sugestoes_para_a_area_de_comunicacao': {'widget': Textarea}, + 'sugestoes_para_a_area_de_informacao': {'widget': Textarea}, + 'sugestoes_para_a_area_de_ti': {'widget': Textarea}, + 'inscricoes_para_lista_gitec': {'widget': Textarea}, + 'inscricoes_para_lista_gial': {'widget': Textarea}, + 'inscricoes_para_lista_gicom': {'widget': Textarea}, } + class Meta: model = Diagnostico fields = '__all__' @@ -94,8 +98,8 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm): for schema in self.instance.get_schemata(int(category)): defaults = { - 'label': schema.title, - 'required': schema.required, + 'label': schema.title, + 'required': schema.required, 'help_text': schema.help_text, } @@ -127,8 +131,8 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm): class CasaLegislativaMobileForm(forms.ModelForm): - data_instalacao = forms.DateField(label = u'Data de instalação da Casa Legislativa', required=False) - data_criacao = forms.DateField() + data_instalacao = forms.DateField(label=u'Data de instalação da Casa Legislativa', required=False) + data_criacao = forms.DateField() class Meta: model = CasaLegislativa @@ -137,9 +141,9 @@ class CasaLegislativaMobileForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(CasaLegislativaMobileForm, self).__init__(*args, **kwargs) self.fields['data_criacao'] = forms.DateField( - label = u'Data de criação do Município', - initial = self.instance.municipio.data_criacao, - required=False) + label=u'Data de criação do Município', + initial=self.instance.municipio.data_criacao, + required=False) def save(self, commit=True): super(CasaLegislativaMobileForm, self).save(commit=True) @@ -151,6 +155,7 @@ class CasaLegislativaMobileForm(forms.ModelForm): class TelefoneMobileForm(forms.ModelForm): pass + class Meta: model = Telefone fields = ('numero', 'tipo') diff --git a/sigi/apps/diagnosticos/models.py b/sigi/apps/diagnosticos/models.py index 2392e1b..f26160c 100644 --- a/sigi/apps/diagnosticos/models.py +++ b/sigi/apps/diagnosticos/models.py @@ -9,6 +9,7 @@ from eav.models import BaseChoice, BaseEntity, BaseSchema, BaseAttribute class Diagnostico(BaseEntity): + """ Modelo para representar unm diagnostico realizado em uma Casa Legislativa """ @@ -38,7 +39,7 @@ class Diagnostico(BaseEntity): ) responsavel = models.ForeignKey('servidores.Servidor', - verbose_name=u'responsável') + verbose_name=u'responsável') class Meta: verbose_name, verbose_name_plural = u'diagnóstico', u'diagnósticos' @@ -85,15 +86,15 @@ class Diagnostico(BaseEntity): construção do endereço do diagnóstico """ enviar_email(from_email, u"Diagnóstico publicado", - 'diagnosticos/email_diagnostico_publicado.txt', - { - 'responsavel': self.responsavel.nome_completo, - 'casa_legislativa': self.casa_legislativa, - 'data_diagnostico': self.data_visita_inicio, - 'host': host, - 'url_diagnostico': self.get_absolute_url(), - 'status': u"Publicado", - }) + 'diagnosticos/email_diagnostico_publicado.txt', + { + 'responsavel': self.responsavel.nome_completo, + 'casa_legislativa': self.casa_legislativa, + 'data_diagnostico': self.data_visita_inicio, + 'host': host, + 'url_diagnostico': self.get_absolute_url(), + 'status': u"Publicado", + }) def email_diagnostico_alterado(self, from_email, host): """Enviando email quando o status do diagnóstico @@ -103,24 +104,23 @@ class Diagnostico(BaseEntity): construção do endereço do diagnóstico """ enviar_email(from_email, u"Diagnóstico alterado", - 'diagnosticos/email_diagnostico_alterado.txt', - { - 'servidor': self.responsavel.nome_completo, - 'casa_legislativa': self.casa_legislativa, - 'data_diagnostico': self.data_visita_inicio, - 'host': host, - 'url_diagnostico': self.get_absolute_url(), - 'status': "Alterado", - }) - + 'diagnosticos/email_diagnostico_alterado.txt', + { + 'servidor': self.responsavel.nome_completo, + 'casa_legislativa': self.casa_legislativa, + 'data_diagnostico': self.data_visita_inicio, + 'host': host, + 'url_diagnostico': self.get_absolute_url(), + 'status': "Alterado", + }) def get_schemata(self, category=None, *args, **kwargs): """ Se existir uma categoria retorna apenas as questões dessa. """ - schemas = super(Diagnostico,self).get_schemata(*args, **kwargs) + schemas = super(Diagnostico, self).get_schemata(*args, **kwargs) if category: - schemas = [s for s in schemas if s.categoria_id == category] - schemas= sorted(schemas, lambda x,y: cmp(x.title, y.title)) + schemas = [s for s in schemas if s.categoria_id == category] + schemas = sorted(schemas, lambda x, y: cmp(x.title, y.title)) return schemas @@ -136,6 +136,7 @@ class Diagnostico(BaseEntity): class Categoria(models.Model): + """ Modelo para representar a categoria de uma pergunta e sua ordem na hora de exibir no formulário """ @@ -149,6 +150,7 @@ class Categoria(models.Model): class Pergunta(BaseSchema): + """ Modelo que representa uma pergunta no questionário e sua ordem dentro da categoria @@ -168,8 +170,8 @@ class Pergunta(BaseSchema): """, [self.id]) return [ - (Escolha.objects.get(id=int(row[0])), row[1]) - for row in cursor.fetchall() + (Escolha.objects.get(id=int(row[0])), row[1]) + for row in cursor.fetchall() ] def total_anwsers(self): @@ -190,34 +192,37 @@ class Pergunta(BaseSchema): class Escolha(BaseChoice): + """ Perguntas de multiplas escolhas tem as opções cadastradas neste modelo """ schema = models.ForeignKey(Pergunta, - related_name='choices', verbose_name='pergunta') + related_name='choices', verbose_name='pergunta') schema_to_open = models.ForeignKey(Pergunta, related_name='', - verbose_name='pergunta para abrir', blank=True, null=True) + verbose_name='pergunta para abrir', blank=True, null=True) ordem = models.PositiveIntegerField(blank=True, null=True) class Meta: - ordering = ('schema','ordem') + ordering = ('schema', 'ordem') verbose_name, verbose_name_plural = 'escolha', 'escolhas' class Resposta(BaseAttribute): + """ Modelo para guardar as respostas das perguntas de um diagnosico """ schema = models.ForeignKey(Pergunta, related_name='attrs', - verbose_name='pergunta') + verbose_name='pergunta') choice = models.ForeignKey(Escolha, verbose_name='escolha', - blank=True, null=True) + blank=True, null=True) class Meta: verbose_name, verbose_name_plural = 'resposta', 'respostas' class Equipe(models.Model): + """ Modelo que representa a equipe de um diagnóstico """ diagnostico = models.ForeignKey(Diagnostico) @@ -231,6 +236,7 @@ class Equipe(models.Model): class Anexo(models.Model): + """ Modelo para representar os documentos levantados no processo de diagnóstico. Podem ser fotos, contratos, etc. """ @@ -238,7 +244,7 @@ class Anexo(models.Model): arquivo = models.FileField(upload_to='apps/diagnostico/anexo/arquivo',) descricao = models.CharField('descrição', max_length='70') data_pub = models.DateTimeField('data da publicação do anexo', - default=datetime.now) + default=datetime.now) class Meta: ordering = ('-data_pub',) diff --git a/sigi/apps/diagnosticos/templatetags/smart_if.py b/sigi/apps/diagnosticos/templatetags/smart_if.py index a8fc194..2c38a69 100644 --- a/sigi/apps/diagnosticos/templatetags/smart_if.py +++ b/sigi/apps/diagnosticos/templatetags/smart_if.py @@ -19,6 +19,7 @@ register = template.Library() #============================================================================== class BaseCalc(object): + def __init__(self, var1, var2=None, negate=False): self.var1 = var1 self.var2 = var2 @@ -43,31 +44,37 @@ class BaseCalc(object): class Or(BaseCalc): + def calculate(self, var1, var2): return var1 or var2 class And(BaseCalc): + def calculate(self, var1, var2): return var1 and var2 class Equals(BaseCalc): + def calculate(self, var1, var2): return var1 == var2 class Greater(BaseCalc): + def calculate(self, var1, var2): return var1 > var2 class GreaterOrEqual(BaseCalc): + def calculate(self, var1, var2): return var1 >= var2 class In(BaseCalc): + def calculate(self, var1, var2): return var1 in var2 @@ -77,10 +84,12 @@ class In(BaseCalc): #============================================================================== class TestVar(object): + """ A basic self-resolvable object similar to a Django template variable. Used to assist with tests. """ + def __init__(self, value): self.value = value @@ -89,6 +98,7 @@ class TestVar(object): class SmartIfTests(unittest.TestCase): + def setUp(self): self.true = TestVar(True) self.false = TestVar(False) @@ -142,7 +152,7 @@ class SmartIfTests(unittest.TestCase): self.assertCalcFalse(GreaterOrEqual(self.low, self.high)) def test_in(self): - list_ = TestVar([1,2,3]) + list_ = TestVar([1, 2, 3]) invalid_list = TestVar(None) self.assertCalc(In(self.low, list_)) self.assertCalcFalse(In(self.low, invalid_list)) @@ -337,6 +347,7 @@ class TemplateIfParser(IfParser): class SmartIfNode(template.Node): + def __init__(self, var, nodelist_true, nodelist_false=None): self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false self.var = var diff --git a/sigi/apps/diagnosticos/views.py b/sigi/apps/diagnosticos/views.py index c291996..21f01d8 100644 --- a/sigi/apps/diagnosticos/views.py +++ b/sigi/apps/diagnosticos/views.py @@ -3,7 +3,7 @@ from itertools import cycle from django.http import HttpResponse -import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo +import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo from django.shortcuts import render_to_response, get_object_or_404 from django.template import RequestContext from django.views.decorators.cache import never_cache @@ -173,10 +173,10 @@ def categoria_contatos(request, id_diagnostico): resposta = { 'mensagem': 'sucesso', - 'erros' : {}, - 'fones' : {}, - 'clean' : (), - } + 'erros': {}, + 'fones': {}, + 'clean': (), + } # valida e salva um formulario por vez for form in forms: @@ -199,8 +199,8 @@ def categoria_contatos(request, id_diagnostico): for form_telefones in form.telefones.forms: if not form_telefones.is_valid(): if (form_telefones.fields['id'].initial is not None - and form_telefones.fields['tipo'].initial == 'I' - and form_telefones.fields['numero'].initial is None): + and form_telefones.fields['tipo'].initial == 'I' + and form_telefones.fields['numero'].initial is None): if Telefone.objects.filter(pk=form_telefones.fields['id'].initial).exists(): Telefone.objects.get(pk=form_telefones.fields['id'].initial).delete() if not resposta['fones'].has_key(form.prefix): @@ -251,31 +251,31 @@ def diagnostico_pdf(request, id_diagnostico): schema.value = data schemas.append(schema) - schemas_by_categoria.append((categoria,schemas)) + schemas_by_categoria.append((categoria, schemas)) context = RequestContext(request, { - 'pagesize':'A4', + 'pagesize': 'A4', 'casa_legislativa': casa_legislativa, 'funcionarios': funcionarios, 'diagnostico': diagnostico, 'schemas_by_categoria': schemas_by_categoria, - }) + }) return render_to_pdf('diagnosticos/diagnostico_pdf.html', context) - #return render_to_response('diagnosticos/diagnostico_pdf.html', context) + # return render_to_response('diagnosticos/diagnostico_pdf.html', context) def graficos(request): categorias = Categoria.objects.all() - sel_categoria = int(request.REQUEST.get("categoria","3")) + sel_categoria = int(request.REQUEST.get("categoria", "3")) perguntas = Pergunta.objects.filter(categoria=sel_categoria).all() context = RequestContext(request, { 'categorias': categorias, 'sel_categoria': sel_categoria, 'perguntas': perguntas, - }) + }) return render_to_response('diagnosticos/graficos.html', context) @@ -337,7 +337,7 @@ def municipios_diagnosticados(self): for d in Diagnostico.objects.all(): m = d.casa_legislativa.municipio municipio = {'nome': d.casa_legislativa.nome + ', ' + m.uf.sigla, 'lat': str(m.latitude), 'lng': str(m.longitude), 'inicio': d.data_visita_inicio, - 'fim': d.data_visita_fim, 'equipe': "
  • " + "
  • ".join([m.user.get_full_name() for m in d.membros]) + "
",} + 'fim': d.data_visita_fim, 'equipe': "
  • " + "
  • ".join([m.user.get_full_name() for m in d.membros]) + "
", } municipios.append(municipio) return HttpResponse(simplejson.dumps(municipios), mimetype="application/json") diff --git a/sigi/apps/diagnosticos/widgets.py b/sigi/apps/diagnosticos/widgets.py index a9d630b..63eed4b 100644 --- a/sigi/apps/diagnosticos/widgets.py +++ b/sigi/apps/diagnosticos/widgets.py @@ -5,9 +5,12 @@ from django.utils.encoding import force_unicode from django.utils.safestring import mark_safe from sigi.apps.diagnosticos.models import Escolha + class EavCheckboxSelectMultiple(CheckboxSelectMultiple): + def render(self, name, value, attrs=None, choices=()): - if value is None: value = [] + if value is None: + value = [] final_attrs = self.build_attrs(attrs, name=name) output = [u'
    '] str_values = set([force_unicode(v) for v in value]) @@ -29,7 +32,9 @@ class EavCheckboxSelectMultiple(CheckboxSelectMultiple): output.append(u'
') return mark_safe(u'\n'.join(output)) + class EavRadioFieldRenderer(RadioFieldRenderer): + def __iter__(self): for i, choice in enumerate(self.choices): final_attrs = self.attrs.copy() @@ -54,8 +59,8 @@ class EavRadioFieldRenderer(RadioFieldRenderer): if schema_to_open: final_attrs['schema_to_open'] = schema_to_open.name - return RadioInput(self.name, self.value,final_attrs, choice, idx) + return RadioInput(self.name, self.value, final_attrs, choice, idx) + class EavRadioSelect(RadioSelect): renderer = EavRadioFieldRenderer - diff --git a/sigi/apps/financeiro/admin.py b/sigi/apps/financeiro/admin.py index c9e25c4..b5b47e9 100644 --- a/sigi/apps/financeiro/admin.py +++ b/sigi/apps/financeiro/admin.py @@ -2,10 +2,11 @@ from django.contrib import admin from sigi.apps.financeiro.models import Desembolso + class DesembolsoAdmin(admin.ModelAdmin): list_display = ('projeto', 'descricao', 'data', 'valor_reais', 'valor_dolar',) - fields = ('projeto', 'descricao', 'data', 'valor_reais', 'valor_dolar', ) + fields = ('projeto', 'descricao', 'data', 'valor_reais', 'valor_dolar', ) list_filter = ('projeto',) date_hierarchy = 'data' -admin.site.register(Desembolso, DesembolsoAdmin) \ No newline at end of file +admin.site.register(Desembolso, DesembolsoAdmin) diff --git a/sigi/apps/financeiro/forms.py b/sigi/apps/financeiro/forms.py index 6b477f9..c3927a7 100644 --- a/sigi/apps/financeiro/forms.py +++ b/sigi/apps/financeiro/forms.py @@ -1,3 +1,3 @@ from django import forms -# place form definition here \ No newline at end of file +# place form definition here diff --git a/sigi/apps/financeiro/models.py b/sigi/apps/financeiro/models.py index 35f291b..0b7d70b 100644 --- a/sigi/apps/financeiro/models.py +++ b/sigi/apps/financeiro/models.py @@ -2,17 +2,17 @@ from django.db import models from sigi.apps.convenios.models import Projeto + class Desembolso(models.Model): projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto') descricao = models.CharField(u'Descrição da despesa', max_length=100) data = models.DateField(u'Data do desembolso') valor_reais = models.DecimalField(u'Valor em R$', max_digits=18, decimal_places=2) valor_dolar = models.DecimalField(u'Valor em US$', max_digits=18, decimal_places=2) - + class Meta: verbose_name = 'Desembolso' verbose_name_plural = 'Desembolsos' - + def __unicode__(self): return u"%s (US$ %s)" % (self.descricao, self.valor_dolar) - \ No newline at end of file diff --git a/sigi/apps/inventario/admin.py b/sigi/apps/inventario/admin.py index fb03b6b..341aed6 100644 --- a/sigi/apps/inventario/admin.py +++ b/sigi/apps/inventario/admin.py @@ -6,15 +6,18 @@ from sigi.apps.inventario.models import (Fornecedor, Fabricante, Equipamento, TipoEquipamento, ModeloEquipamento, Bem) + class ContatosInline(generic.GenericTabularInline): model = Contato extra = 2 raw_id_fields = ('municipio',) + class TelefonesInline(generic.GenericTabularInline): model = Telefone extra = 2 + class FornecedorAdmin(admin.ModelAdmin): inlines = (TelefonesInline, ContatosInline) list_display = ('id', 'nome', 'email', 'pagina_web') @@ -22,18 +25,21 @@ class FornecedorAdmin(admin.ModelAdmin): list_filter = ('nome',) search_fields = ('id', 'nome', 'email', 'pagina_web') + class FabricanteAdmin(admin.ModelAdmin): list_display = ('id', 'nome') list_display_links = list_display list_filter = ('nome',) search_fields = ('id', 'nome') + class TipoEquipamentoAdmin(admin.ModelAdmin): list_display = ('id', 'tipo') list_display_links = list_display list_filter = ('tipo',) search_fields = ('id', 'tipo') + class ModeloEquipamentoAdmin(admin.ModelAdmin): list_display = ('id', 'tipo', 'modelo') list_filter = ('tipo', 'modelo') @@ -41,10 +47,11 @@ class ModeloEquipamentoAdmin(admin.ModelAdmin): search_fields = ('id', 'tipo', 'modelo') raw_id_fields = ('tipo',) + class EquipamentoAdmin(admin.ModelAdmin): list_display = ('id', 'fabricante', 'modelo', 'get_tipo') list_display_links = ('id',) - list_filter = ('fabricante',) + list_filter = ('fabricante',) ordering = ('fabricante', 'modelo') raw_id_fields = ('fabricante', 'modelo') search_fields = ('id', 'modelo', 'fabricante') @@ -53,6 +60,7 @@ class EquipamentoAdmin(admin.ModelAdmin): return obj.modelo.tipo.tipo get_tipo.short_description = 'tipo' + class BemAdmin(admin.ModelAdmin): list_display = ('equipamento', 'fornecedor', 'num_serie', 'casa_legislativa') @@ -66,6 +74,6 @@ class BemAdmin(admin.ModelAdmin): admin.site.register(Fornecedor, FornecedorAdmin) admin.site.register(Fabricante, FabricanteAdmin) admin.site.register(TipoEquipamento, TipoEquipamentoAdmin) -admin.site.register(ModeloEquipamento,ModeloEquipamentoAdmin) +admin.site.register(ModeloEquipamento, ModeloEquipamentoAdmin) admin.site.register(Equipamento, EquipamentoAdmin) admin.site.register(Bem, BemAdmin) diff --git a/sigi/apps/inventario/models.py b/sigi/apps/inventario/models.py index e93dc54..396b522 100644 --- a/sigi/apps/inventario/models.py +++ b/sigi/apps/inventario/models.py @@ -2,6 +2,7 @@ from django.db import models from django.contrib.contenttypes import generic + class Fornecedor(models.Model): nome = models.CharField(max_length=40) nome.alphabetic_filter = True @@ -17,6 +18,7 @@ class Fornecedor(models.Model): def __unicode__(self): return self.nome + class Fabricante(models.Model): nome = models.CharField(max_length=40, unique=True) nome.alphabetic_filter = True @@ -27,6 +29,7 @@ class Fabricante(models.Model): def __unicode__(self): return self.nome + class TipoEquipamento(models.Model): tipo = models.CharField(max_length=40) @@ -38,6 +41,7 @@ class TipoEquipamento(models.Model): def __unicode__(self): return self.tipo + class ModeloEquipamento(models.Model): tipo = models.ForeignKey( TipoEquipamento, @@ -53,6 +57,7 @@ class ModeloEquipamento(models.Model): def __unicode__(self): return self.modelo + class Equipamento(models.Model): fabricante = models.ForeignKey(Fabricante) modelo = models.ForeignKey(ModeloEquipamento) @@ -64,6 +69,7 @@ class Equipamento(models.Model): return unicode('%s %s %s' % (self.modelo.tipo, self.fabricante.nome, self.modelo.modelo)) + class Bem(models.Model): casa_legislativa = models.ForeignKey('casas.CasaLegislativa') equipamento = models.ForeignKey(Equipamento) diff --git a/sigi/apps/mesas/admin.py b/sigi/apps/mesas/admin.py index 6aada65..3e8a5a4 100644 --- a/sigi/apps/mesas/admin.py +++ b/sigi/apps/mesas/admin.py @@ -1,25 +1,27 @@ # -*- coding: utf-8 -*- from django.contrib import admin from django.http import HttpResponse -from django.utils.html import escape +from django.utils.html import escape from sigi.apps.mesas.models import (Legislatura, Coligacao, ComposicaoColigacao, SessaoLegislativa, MesaDiretora, Cargo, MembroMesaDiretora) from sigi.apps.parlamentares.models import Mandato + class MandatoInline(admin.TabularInline): model = Mandato - raw_id_fields = ['parlamentar',] - + raw_id_fields = ['parlamentar', ] + + class LegislaturaAdmin(admin.ModelAdmin): date_hierarchy = 'data_inicio' list_display = ('numero', 'casa_legislativa', 'uf', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares') raw_id_fields = ('casa_legislativa',) list_display_links = ('numero',) list_filter = ('casa_legislativa__municipio__uf', ) - search_fields = ('casa_legislativa__nome', 'casa_legislativa__municipio__nome' ) + search_fields = ('casa_legislativa__nome', 'casa_legislativa__municipio__nome') inlines = (MandatoInline,) - + def uf(self, obj): return obj.casa_legislativa.municipio.uf.sigla uf.short_description = 'UF' @@ -28,21 +30,23 @@ class LegislaturaAdmin(admin.ModelAdmin): def lookup_allowed(self, lookup, value): return super(LegislaturaAdmin, self).lookup_allowed(lookup, value) or \ lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact'] - + def response_change(self, request, obj): - response = super(LegislaturaAdmin, self).response_change(request, obj) + response = super(LegislaturaAdmin, self).response_change(request, obj) if request.POST.has_key("_popup"): - response = HttpResponse('' % \ - # escape() calls force_unicode. - (escape(obj.pk), escapejs(obj))) + response = HttpResponse('' % + # escape() calls force_unicode. + (escape(obj.pk), escapejs(obj))) return response + class ColigacaoAdmin(admin.ModelAdmin): list_display = ('nome', 'legislatura', 'numero_votos') list_display_links = ('nome',) raw_id_fields = ('legislatura',) search_fields = ('nome', 'legislatura__numero') + class ComposicaoColigacaoAdmin(admin.ModelAdmin): list_display = ('coligacao', 'partido') list_display_links = ('coligacao', 'partido') @@ -50,6 +54,7 @@ class ComposicaoColigacaoAdmin(admin.ModelAdmin): raw_id_fields = ('coligacao', 'partido') search_fields = ('coligacao__nome', 'partido__nome', 'partido__sigla') + class SessaoLegislativaAdmin(admin.ModelAdmin): list_display = ('numero', 'mesa_diretora', 'legislatura', 'tipo', 'data_inicio', 'data_fim') @@ -68,16 +73,19 @@ class SessaoLegislativaAdmin(admin.ModelAdmin): raw_id_fields = ('mesa_diretora', 'legislatura') search_fields = ('numero', 'mesa_diretora__casa_legislativa__nome') + class CargoAdmin(admin.ModelAdmin): list_display = ('descricao',) search_fields = ('descricao',) + class MembroMesaDiretoraInline(admin.TabularInline): model = MembroMesaDiretora max_num = 11 extra = 4 raw_id_fields = ('parlamentar', 'cargo') + class MembroMesaDiretoraAdmin(admin.ModelAdmin): list_display = ('parlamentar', 'cargo', 'mesa_diretora') list_display_links = ('parlamentar',) @@ -87,6 +95,7 @@ class MembroMesaDiretoraAdmin(admin.ModelAdmin): 'parlamentar__nome_parlamentar', 'mesa_diretora__casa_legislativa__nome') + class MesaDiretoraAdmin(admin.ModelAdmin): inlines = (MembroMesaDiretoraInline,) raw_id_fields = ('casa_legislativa',) diff --git a/sigi/apps/mesas/models.py b/sigi/apps/mesas/models.py index 1bbd5c9..957e26f 100644 --- a/sigi/apps/mesas/models.py +++ b/sigi/apps/mesas/models.py @@ -2,6 +2,7 @@ from django.db import models from sigi.apps.casas.models import CasaLegislativa + class Legislatura(models.Model): casa_legislativa = models.ForeignKey(CasaLegislativa) numero = models.PositiveSmallIntegerField(u'número legislatura') @@ -9,10 +10,10 @@ class Legislatura(models.Model): data_fim = models.DateField(u'fim') data_eleicao = models.DateField(u'data da eleição') total_parlamentares = models.PositiveIntegerField(u"Total de parlamentares") - + casa_legislativa.convenio_uf_filter = True casa_legislativa.convenio_cl_tipo_filter = True - + def meta(self): unique_together = (('casa_legislativa', 'numero')) ordering = ['casa_legislativa__municipio__uf__sigla', '-data_inicio'] @@ -20,6 +21,7 @@ class Legislatura(models.Model): def __unicode__(self): return u"%sª legislatura da %s (%s-%s)" % (self.numero, self.casa_legislativa.__unicode__(), self.data_inicio.year, self.data_fim.year) + class Coligacao(models.Model): nome = models.CharField(max_length=50) legislatura = models.ForeignKey(Legislatura) @@ -37,6 +39,7 @@ class Coligacao(models.Model): def __unicode__(self): return self.nome + class ComposicaoColigacao(models.Model): coligacao = models.ForeignKey(Coligacao, verbose_name='coligação') partido = models.ForeignKey('parlamentares.Partido') @@ -48,6 +51,7 @@ class ComposicaoColigacao(models.Model): def __unicode__(self): return str(self.id) + class SessaoLegislativa(models.Model): SESSAO_CHOICES = ( ('O', 'Ordinária'), @@ -65,7 +69,7 @@ class SessaoLegislativa(models.Model): default='O' ) data_inicio = models.DateField(u'início') - data_fim = models.DateField('fim') + data_fim = models.DateField('fim') data_inicio_intervalo = models.DateField( u'início de intervalo', blank=True, @@ -85,11 +89,12 @@ class SessaoLegislativa(models.Model): def __unicode__(self): return str(self.numero) + class MesaDiretora(models.Model): casa_legislativa = models.ForeignKey( 'casas.CasaLegislativa', verbose_name='Casa Legislativa' - ) + ) class Meta: verbose_name = 'Mesa Diretora' @@ -98,6 +103,7 @@ class MesaDiretora(models.Model): def __unicode__(self): return 'Mesa Diretora da %s' % unicode(self.casa_legislativa) + class Cargo(models.Model): descricao = models.CharField(u'descrição', max_length=30) @@ -107,6 +113,7 @@ class Cargo(models.Model): def __unicode__(self): return self.descricao + class MembroMesaDiretora(models.Model): parlamentar = models.ForeignKey('parlamentares.Parlamentar') cargo = models.ForeignKey(Cargo) diff --git a/sigi/apps/metas/admin.py b/sigi/apps/metas/admin.py index 51fe864..e5dece0 100644 --- a/sigi/apps/metas/admin.py +++ b/sigi/apps/metas/admin.py @@ -2,47 +2,49 @@ from django.contrib import admin from sigi.apps.metas.models import Meta, PlanoDiretor + class MetaAdmin(admin.ModelAdmin): list_display = ('projeto', 'titulo', 'data_inicio', 'data_fim', 'valor_meta', 'valor_executado', 'percentual_concluido',) fields = ('projeto', 'titulo', 'descricao', 'data_inicio', 'data_fim', 'algoritmo', 'valor_meta',) list_filter = ('projeto',) - + + class PlanoDiretorAdmin(admin.ModelAdmin): list_display = ('projeto', 'casa_legislativa', 'get_uf', 'status', 'data_entrega', 'data_implantacao',) fields = ('projeto', 'casa_legislativa', 'status', 'data_entrega', 'data_implantacao',) raw_id_fields = ('casa_legislativa',) list_filter = ('projeto', 'status', 'casa_legislativa', 'casa_legislativa__municipio__uf__nome') - + def get_uf(self, obj): return obj.casa_legislativa.municipio.uf.nome get_uf.short_description = u"UF" get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome' - + def lookup_allowed(self, lookup, value): return super(PlanoDiretorAdmin, self).lookup_allowed(lookup, value) or \ lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact'] - + def changelist_view(self, request, extra_context=None): import re - request.GET._mutable=True + request.GET._mutable = True if 'data_entrega__gte' in request.GET: - value = request.GET.get('data_entrega__gte','') + value = request.GET.get('data_entrega__gte', '') if value == '': del request.GET['data_entrega__gte'] - elif re.match('^\d*$', value): # Year only - request.GET['data_entrega__gte'] = "%s-01-01" % value #Complete with january 1st - elif re.match('^\d*\D\d*$', value): # Year and month - request.GET['data_entrega__gte'] = '%s-01' % value #Complete with 1st day of month + elif re.match('^\d*$', value): # Year only + request.GET['data_entrega__gte'] = "%s-01-01" % value # Complete with january 1st + elif re.match('^\d*\D\d*$', value): # Year and month + request.GET['data_entrega__gte'] = '%s-01' % value # Complete with 1st day of month if 'data_entrega__lte' in request.GET: - value = request.GET.get('data_entrega__lte','') + value = request.GET.get('data_entrega__lte', '') if value == '': del request.GET['data_entrega__lte'] - elif re.match('^\d*$', value): # Year only - request.GET['data_entrega__lte'] = "%s-01-01" % value #Complete with january 1st - elif re.match('^\d*\D\d*$', value): # Year and month - request.GET['data_entrega__lte'] = '%s-01' % value #Complete with 1st day of month - request.GET._mutable=False - + elif re.match('^\d*$', value): # Year only + request.GET['data_entrega__lte'] = "%s-01-01" % value # Complete with january 1st + elif re.match('^\d*\D\d*$', value): # Year and month + request.GET['data_entrega__lte'] = '%s-01' % value # Complete with 1st day of month + request.GET._mutable = False + return super(PlanoDiretorAdmin, self).changelist_view(request, extra_context) -admin.site.register(PlanoDiretor, PlanoDiretorAdmin) \ No newline at end of file +admin.site.register(PlanoDiretor, PlanoDiretorAdmin) diff --git a/sigi/apps/metas/forms.py b/sigi/apps/metas/forms.py index 6b477f9..c3927a7 100644 --- a/sigi/apps/metas/forms.py +++ b/sigi/apps/metas/forms.py @@ -1,3 +1,3 @@ from django import forms -# place form definition here \ No newline at end of file +# place form definition here diff --git a/sigi/apps/metas/management/commands/gera_map_data.py b/sigi/apps/metas/management/commands/gera_map_data.py index a797da2..4b9e687 100644 --- a/sigi/apps/metas/management/commands/gera_map_data.py +++ b/sigi/apps/metas/management/commands/gera_map_data.py @@ -24,8 +24,10 @@ from django.core.management.base import BaseCommand from sigi.apps.metas.views import gera_map_data_file + class Command(BaseCommand): help = u'Gera arquivo de dados de plotagem do mapa de atuação do Interlegis.' + def handle(self, *args, **options): result = gera_map_data_file(cronjob=True) - self.stdout.write(result+"\n") \ No newline at end of file + self.stdout.write(result + "\n") diff --git a/sigi/apps/metas/models.py b/sigi/apps/metas/models.py index 66aa116..31303bc 100644 --- a/sigi/apps/metas/models.py +++ b/sigi/apps/metas/models.py @@ -6,6 +6,7 @@ from sigi.apps.diagnosticos.models import Diagnostico from sigi.apps.casas.models import CasaLegislativa from sigi.apps.financeiro.models import Desembolso + class Meta(models.Model): ALGORITMO_CHOICES = ( ('SUM_GASTOS', u'Soma dos desembolsos'), @@ -15,21 +16,21 @@ class Meta(models.Model): ('COUNT_PDIR', u'Quantidade de planos diretores'), ('COUNT_CONV', u'Quantidade de casas conveniadas'), ) - projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto', help_text=u'Projeto ao qual a meta se refere') + projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto', help_text=u'Projeto ao qual a meta se refere') titulo = models.CharField(u'Título', max_length=40, help_text=u'Título da meta que aparecerá no dashboard') descricao = models.TextField(u'Descrição') data_inicio = models.DateField(u'Data inicial', help_text=u'Início do período de cômputo da meta') data_fim = models.DateField(u'Data final', help_text=u'Prazo final para cumprimento da meta') algoritmo = models.CharField(u'Algoritmo de cálculo', max_length=10, choices=ALGORITMO_CHOICES) valor_meta = models.FloatField(u'Valor da meta', help_text=u'Valor que deve ser atingido até o prazo final da meta') - + class Meta: verbose_name = 'Meta BID' verbose_name_plural = 'Metas BID' - + def __unicode__(self): - return self.titulo; - + return self.titulo + @property def valor_executado(self): """ @@ -42,11 +43,11 @@ class Meta(models.Model): except: valor = 0.0 return valor - + @property def percentual_concluido(self): return round(float(self.valor_executado) / float(self.valor_meta) * 100.0, 2) - + @property def valor_desejado(self): total_dias = (self.data_fim - self.data_inicio).days + 1 @@ -56,57 +57,56 @@ class Meta(models.Model): @property def percentual_desejado_low(self): - return (self.valor_desejado / self.valor_meta) - 0.05 # 5% abaixo do desejado - + return (self.valor_desejado / self.valor_meta) - 0.05 # 5% abaixo do desejado + @property def percentual_desejado_high(self): - return (self.valor_desejado / self.valor_meta) + 0.05 # 5% acima do desejado - + return (self.valor_desejado / self.valor_meta) + 0.05 # 5% acima do desejado + @property def saude(self): - percentual_concluido = self.percentual_concluido / 100.0 + percentual_concluido = self.percentual_concluido / 100.0 if percentual_concluido >= 1: - return 'A2BBED' # Blue + return 'A2BBED' # Blue if percentual_concluido > self.percentual_desejado_high: - return '89D7AF' # Green - + return '89D7AF' # Green + if percentual_concluido > self.percentual_desejado_low: - return 'FFDB6E' # Orange - - return 'E74A69' # Red - + return 'FFDB6E' # Orange + + return 'E74A69' # Red + def sum_gastos(self): valor = Desembolso.objects.filter(projeto=self.projeto, data__gte=self.data_inicio, data__lte=self.data_fim) \ - .aggregate(total_dolar=models.Sum('valor_dolar')) - valor = valor['total_dolar'] + .aggregate(total_dolar=models.Sum('valor_dolar')) + valor = valor['total_dolar'] return valor - + def count_equi(self): - valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', equipada=True, projeto__pk=3, data_termo_aceite__gte= - self.data_inicio, data_termo_aceite__lte=self.data_fim).exclude(data_termo_aceite=None).count() + valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', equipada=True, projeto__pk=3, data_termo_aceite__gte=self.data_inicio, data_termo_aceite__lte=self.data_fim).exclude(data_termo_aceite=None).count() return valor - + def count_ader(self): valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', projeto=self.projeto, data_adesao__gte=self.data_inicio, - data_adesao__lte=self.data_fim).exclude(data_adesao=None).count() + data_adesao__lte=self.data_fim).exclude(data_adesao=None).count() return valor def count_diag(self): valor = Diagnostico.objects.filter(data_visita_inicio__gte=self.data_inicio, data_visita_inicio__lte=self.data_fim, - publicado=True).count() + publicado=True).count() return valor - + def count_pdir(self): valor = PlanoDiretor.objects.filter(projeto=self.projeto, data_entrega__gte=self.data_inicio, - data_entrega__lte=self.data_fim).count() + data_entrega__lte=self.data_fim).count() return valor - + def count_conv(self): - valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', projeto=self.projeto, data_retorno_assinatura__gte= - self.data_inicio, data_retorno_assinatura__lte=self.data_fim).exclude(data_retorno_assinatura=None).count() + valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', projeto=self.projeto, data_retorno_assinatura__gte=self.data_inicio, data_retorno_assinatura__lte=self.data_fim).exclude(data_retorno_assinatura=None).count() return valor - + + class PlanoDiretor(models.Model): STATUS_CHOICE = ( ('E', u'Entregue'), @@ -122,7 +122,6 @@ class PlanoDiretor(models.Model): class Meta: verbose_name = 'Plano Diretor' verbose_name_plural = 'Planos Diretores' - + def __unicode__(self): - return self.casa_legislativa.nome ; - \ No newline at end of file + return self.casa_legislativa.nome diff --git a/sigi/apps/metas/templatetags/mapa_tags.py b/sigi/apps/metas/templatetags/mapa_tags.py index 236cd9c..4357a16 100644 --- a/sigi/apps/metas/templatetags/mapa_tags.py +++ b/sigi/apps/metas/templatetags/mapa_tags.py @@ -6,16 +6,17 @@ from sigi.apps.casas.models import CasaLegislativa register = template.Library() + @register.filter(name='map_desc_serv') def descricao_servicos(value): if not isinstance(value, CasaLegislativa): return "" - + result = "" for sv in value.servico_set.all(): result += u'
  • %s ativado em %s
  • ' % (sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y')) - + for cv in value.convenio_set.all(): if (cv.data_retorno_assinatura is None) and (cv.equipada and cv.data_termo_aceite is not None): result += u"
  • Equipada em %s pelo %s
  • " % (cv.data_termo_aceite.strftime('%d/%m/%Y'), cv.projeto.sigla) @@ -23,13 +24,12 @@ def descricao_servicos(value): result += u"
  • Conveniada ao %s em %s
  • " % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y')) if (cv.data_retorno_assinatura is not None) and (cv.equipada and cv.data_termo_aceite is not None): result += u"
  • Conveniada ao %s em %s e equipada em %s
  • " % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y'), cv.data_termo_aceite.strftime('%d/%m/%Y')) - + for dg in value.diagnostico_set.all(): result += u'
  • Diagnosticada no período de %s a %s
  • ' % (dg.data_visita_inicio.strftime('%d/%m/%Y') if dg.data_visita_inicio - else u"<< sem data inicial >>", + else u"<< sem data inicial >>", dg.data_visita_fim.strftime('%d/%m/%Y') if dg.data_visita_fim else u"<< sem data final >>") - + return mark_safe(result) descricao_servicos.is_safe = True - \ No newline at end of file diff --git a/sigi/apps/metas/views.py b/sigi/apps/metas/views.py index 3c59a24..17c8e06 100644 --- a/sigi/apps/metas/views.py +++ b/sigi/apps/metas/views.py @@ -4,7 +4,7 @@ import os from django.http import HttpResponse from django.core.exceptions import PermissionDenied -import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo +import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo from django.utils.datastructures import SortedDict from django.shortcuts import render_to_response from django.template import RequestContext @@ -24,8 +24,8 @@ from sigi.apps.metas.templatetags.mapa_tags import descricao_servicos JSON_FILE_NAME = os.path.join(MEDIA_ROOT, 'apps/metas/map_data.json') -@login_required +@login_required def dashboard(request): if request.user.groups.filter(name__in=['SPDT-Servidores', 'SSPLF']).count() <= 0: raise PermissionDenied @@ -56,6 +56,7 @@ def dashboard(request): extra_context = {'desembolsos': matriz, 'desembolsos_max': desembolsos_max, 'meses': meses, 'colors': ','.join(colors[:len(matriz)])} return render_to_response('metas/dashboard.html', extra_context, context_instance=RequestContext(request)) + def mapa(request): """ Mostra o mapa com filtros carregados com valores default @@ -66,12 +67,12 @@ def mapa(request): servico_choices = TipoServico.objects.all() projeto_choices = Projeto.objects.all() - seit = [ ts.sigla for ts in servico_choices] - convenios = ['PML'] # Apenas o ultimo #hardcoded #fixme - equipadas = [] #[p.sigla for p in projeto_choices] - diagnosticos = ['P'] # choices: ["A", "P"] - regioes = [r[0] for r in regiao_choices] - estados = [] + seit = [ts.sigla for ts in servico_choices] + convenios = ['PML'] # Apenas o ultimo #hardcoded #fixme + equipadas = [] # [p.sigla for p in projeto_choices] + diagnosticos = ['P'] # choices: ["A", "P"] + regioes = [r[0] for r in regiao_choices] + estados = [] extra_context = { 'seit': seit, @@ -89,7 +90,7 @@ def mapa(request): return render_to_response('metas/mapa.html', extra_context, context_instance=RequestContext(request)) -@cache_page(1800) # Cache de 30min +@cache_page(1800) # Cache de 30min def map_data(request): """ Retorna json com todos os dados dos municípios que têm relação com o Interlegis @@ -105,6 +106,7 @@ def map_data(request): return HttpResponse(json, mimetype="application/json") + def map_search(request): response = {'result': 'NOT_FOUND'} if 'q' in request.GET: @@ -119,7 +121,8 @@ def map_search(request): return HttpResponse(simplejson.dumps(response), mimetype="application/json") -@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos) + +@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos) def map_sum(request): # Filtrar Casas de acordo com os parâmetros param = get_params(request) @@ -154,7 +157,6 @@ def map_sum(request): 'convenios': tot_projetos.copy(), 'equipadas': tot_projetos.copy(), 'diagnosticos': tot_diagnosticos.copy()} - # Processar as casas filtradas for casa in casas.distinct(): uf = casa.municipio.uf @@ -192,7 +194,8 @@ def map_sum(request): } return render_to_pdf('metas/map_sum.html', extra_context) -@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos) + +@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos) def map_list(request): # Filtrar Casas de acordo com os parâmetros param = get_params(request) @@ -213,24 +216,24 @@ def map_list(request): for pr in Projeto.objects.all(): cnv[pr.id] = pr.sigla - writer.writerow([u'codigo_ibge', u'nome_casa', u'municipio', u'uf', u'regiao',] + [x for x in srv.values()] + - reduce(lambda x,y: x+y, [['conveniada ao %s' % x, 'equipada por %s' % x] for x in cnv.values()])) + writer.writerow([u'codigo_ibge', u'nome_casa', u'municipio', u'uf', u'regiao', ] + [x for x in srv.values()] + + reduce(lambda x, y: x + y, [['conveniada ao %s' % x, 'equipada por %s' % x] for x in cnv.values()])) for casa in casas: row = [casa.municipio.codigo_ibge, casa.nome, casa.municipio.nome, casa.municipio.uf.sigla, - casa.municipio.uf.get_regiao_display(),] + casa.municipio.uf.get_regiao_display(), ] for id in srv.keys(): try: sv = casa.servico_set.get(tipo_servico__id=id) - row += [sv.data_ativacao,] + row += [sv.data_ativacao, ] except: - row += [None,] + row += [None, ] for id in cnv.keys(): try: cv = casa.convenio_set.get(projeto__id=id) - row += [cv.data_retorno_assinatura, cv.data_termo_aceite if cv.equipada else None,] + row += [cv.data_retorno_assinatura, cv.data_termo_aceite if cv.equipada else None, ] except: - row += [None, None,] + row += [None, None, ] writer.writerow(row) return response @@ -245,21 +248,22 @@ def map_list(request): def get_params(request): ''' Pegar parâmetros da pesquisa ''' return { - 'seit' : request.GET.getlist('seit'), - 'convenios' : request.GET.getlist('convenios'), - 'equipadas' : request.GET.getlist('equipadas'), - 'diagnosticos' : request.GET.getlist('diagnosticos'), - 'regioes' : request.GET.getlist('regioes'), - 'estados' : request.GET.getlist('estados'), + 'seit': request.GET.getlist('seit'), + 'convenios': request.GET.getlist('convenios'), + 'equipadas': request.GET.getlist('equipadas'), + 'diagnosticos': request.GET.getlist('diagnosticos'), + 'regioes': request.GET.getlist('regioes'), + 'estados': request.GET.getlist('estados'), } + def filtrar_casas(seit, convenios, equipadas, regioes, estados, diagnosticos): ''' Filtrar Casas que atendem aos parâmetros de pesquisa ''' - qServico = Q(servico__tipo_servico__sigla__in=seit) + qServico = Q(servico__tipo_servico__sigla__in=seit) qConvenio = Q(convenio__projeto__sigla__in=convenios) qEquipada = Q(convenio__projeto__sigla__in=equipadas, convenio__equipada=True) - qRegiao = Q(municipio__uf__regiao__in=regioes) - qEstado = Q(municipio__uf__sigla__in=estados) + qRegiao = Q(municipio__uf__regiao__in=regioes) + qEstado = Q(municipio__uf__sigla__in=estados) if diagnosticos: qDiagnostico = Q(diagnostico__publicado__in=[p == 'P' for p in diagnosticos]) @@ -270,6 +274,7 @@ def filtrar_casas(seit, convenios, equipadas, regioes, estados, diagnosticos): return casas + def gera_map_data_file(cronjob=False): ''' Criar um arquivo json em {settings.MEDIA_ROOT}/apps/metas/ com o nome de map_data.json Este arquivo será consumido pela view de dados de mapa. @@ -284,7 +289,8 @@ def gera_map_data_file(cronjob=False): for c in CasaLegislativa.objects.select_related('servico', 'convenio', 'diagnostico').all().distinct(): if c.servico_set.count() == 0 and c.convenio_set.count() == 0 and c.diagnostico_set.count() == 0: - continue; # Salta essa casa, pois ela não tem nada com o Interlegis + continue + # Salta essa casa, pois ela não tem nada com o Interlegis if not casas.has_key(c.pk): casa = { @@ -303,8 +309,8 @@ def gera_map_data_file(cronjob=False): for sv in c.servico_set.all(): casa['info'].append(u"%s ativado em %s
    link" % ( - sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y') if sv.data_ativacao else - u'', sv.url, STATIC_URL)) + sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y') if sv.data_ativacao else + u'', sv.url, STATIC_URL)) casa['seit'].append(sv.tipo_servico.sigla) for cv in c.convenio_set.all(): @@ -322,8 +328,8 @@ def gera_map_data_file(cronjob=False): for dg in c.diagnostico_set.all(): casa['diagnosticos'].append('P' if dg.publicado else 'A') casa['info'].append(u'Diagnosticada no período de %s a %s' % (dg.data_visita_inicio.strftime('%d/%m/%Y') if - dg.data_visita_inicio is not None else u"", - dg.data_visita_fim.strftime('%d/%m/%Y') if dg.data_visita_fim else u"")) + dg.data_visita_inicio is not None else u"", + dg.data_visita_fim.strftime('%d/%m/%Y') if dg.data_visita_fim else u"")) casa['info'] = "
    ".join(casa['info']) @@ -335,11 +341,11 @@ def gera_map_data_file(cronjob=False): file = open(JSON_FILE_NAME, 'w') file.write(json_data) file.close() - except Exception as e: # A gravação não foi bem sucedida ... - if cronjob: # ... o chamador deseja a mensagem de erro + except Exception as e: # A gravação não foi bem sucedida ... + if cronjob: # ... o chamador deseja a mensagem de erro return str(e) else: - pass # ... ou os dados poderão ser usados de qualquer forma + pass # ... ou os dados poderão ser usados de qualquer forma if cronjob: return "Arquivo %s gerado em %d segundos" % (JSON_FILE_NAME, time.time() - start) diff --git a/sigi/apps/ocorrencias/admin.py b/sigi/apps/ocorrencias/admin.py index ca9e794..b7334e2 100644 --- a/sigi/apps/ocorrencias/admin.py +++ b/sigi/apps/ocorrencias/admin.py @@ -29,7 +29,7 @@ class ComentarioInline(admin.StackedInline): class AnexosInline(admin.TabularInline): model = Anexo extra = 2 - readonly_fields = ['data_pub',] + readonly_fields = ['data_pub', ] class OcorrenciaChangeList(ChangeList): @@ -77,7 +77,7 @@ class OcorrenciaAdmin(admin.ModelAdmin): fields = list(self.readonly_fields) if obj is not None: fields.extend(['casa_legislativa', 'categoria', 'tipo_contato', 'assunto', 'status', 'descricao', ]) - if obj.status in [3, 4, 5]: #Fechados + if obj.status in [3, 4, 5]: # Fechados fields.append('prioridade') return fields diff --git a/sigi/apps/ocorrencias/models.py b/sigi/apps/ocorrencias/models.py index 4d364e4..c6e259a 100644 --- a/sigi/apps/ocorrencias/models.py +++ b/sigi/apps/ocorrencias/models.py @@ -3,23 +3,23 @@ from django.db import models class Categoria(models.Model): - nome= models.CharField(u"Nome Categoria", max_length=50) + nome = models.CharField(u"Nome Categoria", max_length=50) descricao = models.TextField(u'descrição', blank=True, null=True) setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=u"Setor responsável") - + class Meta: - verbose_name, verbose_name_plural = u'Categoria', u'Categorias' + verbose_name, verbose_name_plural = u'Categoria', u'Categorias' def __unicode__(self): return self.nome - + class TipoContato(models.Model): descricao = models.CharField(u"Descrição", max_length=50) - + class Meta: verbose_name, verbose_name_plural = u"Tipo de contato", u"Tipos de contato" - + def __unicode__(self): return self.descricao @@ -61,7 +61,7 @@ class Ocorrencia(models.Model): class Meta: verbose_name, verbose_name_plural = u'ocorrência', u'ocorrências' ordering = ['prioridade', 'data_modificacao', 'data_criacao', ] - + def __unicode__(self): return u"%(casa_legislativa)s: %(assunto)s" % {'assunto': self.assunto, 'casa_legislativa': self.casa_legislativa} @@ -79,11 +79,11 @@ class Anexo(models.Model): ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência') arquivo = models.FileField(u'Arquivo anexado', upload_to='apps/ocorrencia/anexo/arquivo',) descricao = models.CharField(u'descrição do anexo', max_length='70') - data_pub = models.DateTimeField( u'data da publicação do anexo', null=True, blank=True, auto_now_add=True) + data_pub = models.DateTimeField(u'data da publicação do anexo', null=True, blank=True, auto_now_add=True) class Meta: ordering = ('-data_pub',) - verbose_name, verbose_name_plural = u'Anexo', u'Anexos' + verbose_name, verbose_name_plural = u'Anexo', u'Anexos' def __unicode__(self): return u"%(arquivo_name)s: %(descricao)s" % {'arquivo_name': self.arquivo.name, 'descricao': self.descricao} diff --git a/sigi/apps/parlamentares/admin.py b/sigi/apps/parlamentares/admin.py index 15c171a..00cc264 100644 --- a/sigi/apps/parlamentares/admin.py +++ b/sigi/apps/parlamentares/admin.py @@ -10,15 +10,18 @@ from sigi.apps.parlamentares.models import Partido, Parlamentar, Mandato from sigi.apps.parlamentares.views import adicionar_parlamentar_carrinho from sigi.apps.utils.alphabetic_filter import AlphabeticFilter + class MandatosInline(admin.TabularInline): model = Mandato extra = 1 raw_id_fields = ('legislatura', 'partido') + class TelefonesInline(generic.GenericTabularInline): model = Telefone extra = 2 + class PartidoAdmin(admin.ModelAdmin): list_display = ('nome', 'sigla') list_display_links = ('nome', 'sigla') @@ -26,8 +29,8 @@ class PartidoAdmin(admin.ModelAdmin): class ParlamentarNomeCompletoFilter(AlphabeticFilter): - title = 'Nome Completo do Parlamentar' - parameter_name = 'nome_completo' + title = 'Nome Completo do Parlamentar' + parameter_name = 'nome_completo' class ParlamentarAdmin(admin.ModelAdmin): @@ -35,14 +38,14 @@ class ParlamentarAdmin(admin.ModelAdmin): list_display = ('nome_completo', 'nome_parlamentar', 'sexo') list_display_links = ('nome_completo', 'nome_parlamentar') list_filter = ('nome_parlamentar', ParlamentarNomeCompletoFilter) - actions = ['adiciona_parlamentar',] + actions = ['adiciona_parlamentar', ] fieldsets = ( (None, { 'fields': ('nome_completo', 'nome_parlamentar', 'sexo'), }), -# ('Endereço', { -# 'fields': ('logradouro', 'bairro', 'municipio', 'cep'), -# }), + # ('Endereço', { + # 'fields': ('logradouro', 'bairro', 'municipio', 'cep'), + # }), ('Outras informações', { 'fields': ('data_nascimento', 'email', 'pagina_web', 'foto'), }), @@ -51,23 +54,23 @@ class ParlamentarAdmin(admin.ModelAdmin): # raw_id_fields = ('municipio',) search_fields = ('nome_completo', 'nome_parlamentar', 'email', 'pagina_web',) - + def adiciona_parlamentar(self, request, queryset): if request.session.has_key('carrinho_parlametar'): q1 = len(request.session['carrinho_parlamentar']) else: - q1 = 0 - adicionar_parlamentar_carrinho(request,queryset=queryset) + q1 = 0 + adicionar_parlamentar_carrinho(request, queryset=queryset) q2 = len(request.session['carrinho_parlamentar']) quant = q2 - q1 if quant: - self.message_user(request,"%s Parlamentares adicionados no carrinho" % (quant) ) + self.message_user(request, "%s Parlamentares adicionados no carrinho" % (quant)) else: - self.message_user(request,"Os parlamentares selecionadas já foram adicionadas anteriormente" ) + self.message_user(request, "Os parlamentares selecionadas já foram adicionadas anteriormente") return HttpResponseRedirect('.') - + adiciona_parlamentar.short_description = u"Armazenar parlamentar no carrinho para exportar" - + class MandatoAdmin(admin.ModelAdmin): list_display = ('parlamentar', 'legislatura', 'partido', diff --git a/sigi/apps/parlamentares/models.py b/sigi/apps/parlamentares/models.py index 71206ea..59cc199 100644 --- a/sigi/apps/parlamentares/models.py +++ b/sigi/apps/parlamentares/models.py @@ -75,6 +75,5 @@ class Mandato(models.Model): # choices=SUPLENCIA_CHOICES, # ) - def __unicode__(self): return str(self.id) diff --git a/sigi/apps/parlamentares/reports.py b/sigi/apps/parlamentares/reports.py index 2574e99..3859175 100644 --- a/sigi/apps/parlamentares/reports.py +++ b/sigi/apps/parlamentares/reports.py @@ -3,43 +3,46 @@ from reportlab.lib.pagesizes import A4 from reportlab.lib.units import cm from reportlab.lib.enums import TA_CENTER, TA_RIGHT from geraldo import Report, DetailBand, Label, ObjectValue, ManyElements, \ - ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH,SystemField + ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH, SystemField from sigi.apps.relatorios.reports import ReportDefault from geraldo.graphics import Image + def string_to_cm(texto): tamanho = 0 minEspeciais = { - 'f':0.1, - 'i':0.05, - 'j':0.05, - 'l':0.05, - 'm':0.2, - 'r':0.1, - 't':0.15, + 'f': 0.1, + 'i': 0.05, + 'j': 0.05, + 'l': 0.05, + 'm': 0.2, + 'r': 0.1, + 't': 0.15, } maiuEspeciais = { - 'I':0.05, - 'J':0.15, - 'L':0.15, - 'P':0.15, + 'I': 0.05, + 'J': 0.15, + 'L': 0.15, + 'P': 0.15, } for c in texto: - if c > 'a' and c<'z': - if c in minEspeciais: - tamanho += minEspeciais[c] - else: - tamanho += 0.17 + if c > 'a' and c < 'z': + if c in minEspeciais: + tamanho += minEspeciais[c] + else: + tamanho += 0.17 else: - if c in maiuEspeciais: - tamanho += maiuEspeciais[c] - else: - tamanho += 0.2 + if c in maiuEspeciais: + tamanho += maiuEspeciais[c] + else: + tamanho += 0.2 return tamanho + class ParlamentaresLabels(Report): + """ Usage example:: @@ -54,26 +57,26 @@ class ParlamentaresLabels(Report): largura_etiqueta = 7 altura_etiqueta = 3.3 tamanho_fonte = 6.4 - altura_dados = 0.3 #logradouro, bairro, municipio, cep + altura_dados = 0.3 # logradouro, bairro, municipio, cep delta = start = 0.5 - def __init__(self, queryset, formato): + def __init__(self, queryset, formato): super(ParlamentaresLabels, self).__init__(queryset=queryset) self.formato = formato self.page_size = A4 if formato == '3x9_etiqueta': - self.margin_top = 0.0*cm - self.margin_bottom = 0.0*cm - self.margin_left = -1*cm - self.margin_right = 0.0*cm - self.delta = 0.4 # espaçamento entre as "strings/linhas" da etiqueta - self.start = 0.2 # valor entre a margin top e a etiqueta + self.margin_top = 0.0 * cm + self.margin_bottom = 0.0 * cm + self.margin_left = -1 * cm + self.margin_right = 0.0 * cm + self.delta = 0.4 # espaçamento entre as "strings/linhas" da etiqueta + self.start = 0.2 # valor entre a margin top e a etiqueta else: - self.margin_top = 0.8*cm - self.margin_bottom = 0.8*cm - self.margin_left = 0.4*cm - self.margin_right = 0.4*cm + self.margin_top = 0.8 * cm + self.margin_bottom = 0.8 * cm + self.margin_left = 0.4 * cm + self.margin_right = 0.4 * cm self.largura_etiqueta = 9.9 self.altura_etiqueta = 5.6 self.tamanho_fonte = 11 @@ -83,457 +86,461 @@ class ParlamentaresLabels(Report): my_elements = [ Label( text=u'A Sua Excelência o(a) Senhor(a)', - top=(self.start + self.delta)*cm, left=self.y*cm, width=(self.largura_etiqueta-self.y)*cm, + top=(self.start + self.delta) * cm, left=self.y * cm, width=(self.largura_etiqueta - self.y) * cm, ), ObjectValue( attribute_name='nome_completo', - top=(self.start + 2*self.delta)*cm, left=self.y*cm, width=(self.largura_etiqueta-self.y)*cm, + top=(self.start + 2 * self.delta) * cm, left=self.y * cm, width=(self.largura_etiqueta - self.y) * cm, get_value=lambda instance: instance.nome_completo or "" ), ObjectValue( attribute_name='logradouro', - top=(self.start + 3*self.delta)*cm, left=self.y*cm, width=(self.largura_etiqueta-self.y)*cm, + top=(self.start + 3 * self.delta) * cm, left=self.y * cm, width=(self.largura_etiqueta - self.y) * cm, get_value=lambda instance: logradouro_parlamentar(instance) ), ObjectValue( attribute_name='bairro', - top=(self.start + 4*self.delta)*cm, left=self.y*cm, width=(self.largura_etiqueta-self.y)*cm, + top=(self.start + 4 * self.delta) * cm, left=self.y * cm, width=(self.largura_etiqueta - self.y) * cm, get_value=lambda instance: bairro_parlamentar(instance) ), ObjectValue( attribute_name='municipio', - top=(self.start + 5*self.delta)*cm, left=self.y*cm, width=(self.largura_etiqueta-self.y)*cm, + top=(self.start + 5 * self.delta) * cm, left=self.y * cm, width=(self.largura_etiqueta - self.y) * cm, get_value=lambda instance: municipio_parlamentar(instance) ), ObjectValue( attribute_name='cep', - top=(self.start + 6*self.delta)*cm, left=self.y*cm, width=(self.largura_etiqueta-self.y)*cm, + top=(self.start + 6 * self.delta) * cm, left=self.y * cm, width=(self.largura_etiqueta - self.y) * cm, get_value=lambda instance: cep_parlamentar(instance) ), - ] - self.band_detail = DetailBand(width=(self.largura_etiqueta)*cm, height=(self.altura_etiqueta)*cm, margin_left = 0, margin_top = 0, margin_bottom=0.0*cm, margin_right = 0, elements=my_elements,display_inline=True, default_style={'fontName': 'Helvetica', 'fontSize': self.tamanho_fonte}) + ] + self.band_detail = DetailBand(width=(self.largura_etiqueta) * cm, height=(self.altura_etiqueta) * cm, margin_left = 0, margin_top = 0, margin_bottom=0.0 * cm, margin_right = 0, elements=my_elements, display_inline=True, default_style={'fontName': 'Helvetica', 'fontSize': self.tamanho_fonte}) + def logradouro_parlamentar(instance): try: return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.logradouro except: return u"<>" - + + def bairro_parlamentar(instance): try: return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.bairro except: return u"<>" - + + def municipio_parlamentar(instance): try: return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.municipio except: return u"<>" - + + def cep_parlamentar(instance): try: return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.cep except: return u"<>" - + class CasasLegislativasReport(ReportDefault): title = u'Relatório de Casas Legislativas' - height = 80*cm + height = 80 * cm page_size = landscape(A4) class band_page_header(ReportDefault.band_page_header): label_top = ReportDefault.band_page_header.label_top - label_left = [0.3,1,5.5,11,17,22] + label_left = [0.3, 1, 5.5, 11, 17, 22] elements = list(ReportDefault.band_page_header.elements) elements = [ - Image(filename= ReportDefault.band_page_header.BASE_DIR + '/media/images/logo-interlegis.jpg', - left=23.5*cm,right=1*cm,top=0.1*cm,bottom=1*cm, - width=4.2*cm,height=3*cm, - ), - Image(filename= ReportDefault.band_page_header.BASE_DIR + '/media/images/logo-senado.png', - left=1*cm,right=1*cm,top=0.1*cm,bottom=1*cm, - width=3*cm,height=3*cm, - ), - Label(text=u"SENADO FEDERAL",top=1*cm,left=0,width=BAND_WIDTH, - style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} - ), - Label(text=u"SINTER - Secretaria Especial do Interlegis",top=1.5*cm,left=0,width=BAND_WIDTH, - style={'fontName': 'Helvetica-Bold','fontSize':13, 'alignment': TA_CENTER} - ), + Image(filename=ReportDefault.band_page_header.BASE_DIR + '/media/images/logo-interlegis.jpg', + left=23.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, + width=4.2 * cm, height=3 * cm, + ), + Image(filename=ReportDefault.band_page_header.BASE_DIR + '/media/images/logo-senado.png', + left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, + width=3 * cm, height=3 * cm, + ), + Label(text=u"SENADO FEDERAL", top=1 * cm, left=0, width=BAND_WIDTH, + style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} + ), + Label(text=u"SINTER - Secretaria Especial do Interlegis", top=1.5 * cm, left=0, width=BAND_WIDTH, + style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER} + ), SystemField( - expression='%(report_title)s',top=2.5*cm,left=0,width=BAND_WIDTH, - style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} + expression='%(report_title)s', top=2.5 * cm, left=0, width=BAND_WIDTH, + style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} ), Label( text=u"UF", - left=label_left[0]*cm, + left=label_left[0] * cm, top=label_top, ), Label( text=u"Municipio", - left=label_left[1]*cm, + left=label_left[1] * cm, top=label_top, - ), + ), Label( text=u"Presidente", - left=label_left[2]*cm, - top=label_top, + left=label_left[2] * cm, + top=label_top, ), Label( text=u"Endereço", - left=label_left[3]*cm, - top=label_top, + left=label_left[3] * cm, + top=label_top, ), - Label( + Label( text=u"Endereço na Internet", - left=label_left[4]*cm, + left=label_left[4] * cm, top=label_top, ), - Label( + Label( text=u"Email", - left=label_left[5]*cm, + left=label_left[5] * cm, top=label_top, ), - - ] - + ] class band_page_footer(ReportDefault.band_page_footer): pass class band_detail(ReportDefault.band_detail): - label_left = [0.3,1,5.5,11,17,22] + label_left = [0.3, 1, 5.5, 11, 17, 22] - elements=[ + elements = [ ObjectValue( attribute_name='municipio.uf.sigla', - left=label_left[0]*cm, - width=1*cm, + left=label_left[0] * cm, + width=1 * cm, ), ObjectValue( attribute_name='municipio.nome', - left=label_left[1]*cm, - ), + left=label_left[1] * cm, + ), ObjectValue( attribute_name='presidente', - left=label_left[2]*cm, + left=label_left[2] * cm, ), ObjectValue( attribute_name='logradouro', - left=label_left[3]*cm, - get_value=lambda instance: instance.logradouro + ' - '+ instance.bairro, + left=label_left[3] * cm, + get_value=lambda instance: instance.logradouro + ' - ' + instance.bairro, ), - ObjectValue( + ObjectValue( attribute_name='pagina_web', - left=label_left[4]*cm, + left=label_left[4] * cm, ), ObjectValue( attribute_name='email', - left=label_left[5]*cm, + left=label_left[5] * cm, ), ] groups = [ ReportGroup(attribute_name='municipio.uf', - band_header=ReportBand( - height=0.7*cm, - elements= [ - ObjectValue(attribute_name='municipio.uf') - ], - borders={'top': True}, - ) - ) + band_header=ReportBand( + height=0.7 * cm, + elements=[ + ObjectValue(attribute_name='municipio.uf') + ], + borders={'top': True}, + ) + ) ] class InfoCasaLegislativa(ReportDefault): title = u'Casa legislativa' + class band_summary(ReportBand): pass + class band_page_footer(ReportBand): - height = 1*cm + height = 1 * cm elements = [ - SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3*cm), + SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3 * cm), ] - + class band_detail(ReportDefault.band_detail): - + posicao_left = [ - 0,1.3, #Tipo - 0,1.8, #Regiao - 5.5,6.8, #U.F. - 0,2.3, #Municipio - 0,2.4, #Endereco - 0,1.6, #Bairro - 0,1.3, #CEP - 0,1.6, #CNPJ - 0,2.3, #Telefone - 0,2.7, #Presidente + 0, 1.3, # Tipo + 0, 1.8, # Regiao + 5.5, 6.8, # U.F. + 0, 2.3, # Municipio + 0, 2.4, # Endereco + 0, 1.6, # Bairro + 0, 1.3, # CEP + 0, 1.6, # CNPJ + 0, 2.3, # Telefone + 0, 2.7, # Presidente ] posicao_top = [ - 0.5, #Tipo - 1.3, #Regiao - 1.3, #U.F. - 2.1, #Municipio - 2.9, #Logradouro - 3.7, #Bairro - 4.5, #CEP - 5.3, #CNPJ - 6.1, #Telefone - 6.9, #Presidente + 0.5, # Tipo + 1.3, # Regiao + 1.3, # U.F. + 2.1, # Municipio + 2.9, # Logradouro + 3.7, # Bairro + 4.5, # CEP + 5.3, # CNPJ + 6.1, # Telefone + 6.9, # Presidente ] - height=30*cm + height = 30 * cm + + display_inline = True + default_style = {'fontName': 'Helvetica', 'fontSize': 14} - display_inline = True - default_style = {'fontName': 'Helvetica', 'fontSize':14} - elements = [ Label( text=u"Tipo: ", - left=posicao_left[0]*cm, - top=posicao_top[0]*cm, + left=posicao_left[0] * cm, + top=posicao_top[0] * cm, ), ObjectValue( attribute_name='tipo.nome', - left=posicao_left[1]*cm, - top=posicao_top[0]*cm, - width=6*cm, + left=posicao_left[1] * cm, + top=posicao_top[0] * cm, + width=6 * cm, ), Label( text=u"Região: ", - left=posicao_left[2]*cm, - top=posicao_top[1]*cm, - ), + left=posicao_left[2] * cm, + top=posicao_top[1] * cm, + ), ObjectValue( attribute_name='municipio.uf.regiao', - left=posicao_left[3]*cm, - top=posicao_top[1]*cm, + left=posicao_left[3] * cm, + top=posicao_top[1] * cm, get_value=lambda instance: - {'SL': 'Sul','SD': 'Sudeste','CO': 'Centro-Oeste','NE': 'Nordeste','NO': 'Norte',} - [instance.municipio.uf.regiao] + {'SL': 'Sul', 'SD': 'Sudeste', 'CO': 'Centro-Oeste', 'NE': 'Nordeste', 'NO': 'Norte', } + [instance.municipio.uf.regiao] ), Label( text=u"U.F.: ", - left=posicao_left[4]*cm, - top=posicao_top[2]*cm, + left=posicao_left[4] * cm, + top=posicao_top[2] * cm, ), ObjectValue( attribute_name='municipio.uf', - left=posicao_left[5]*cm, - top=posicao_top[2]*cm, - ), + left=posicao_left[5] * cm, + top=posicao_top[2] * cm, + ), Label( text=u"Município: ", - left=posicao_left[6]*cm, - top=posicao_top[3]*cm, + left=posicao_left[6] * cm, + top=posicao_top[3] * cm, ), ObjectValue( attribute_name='municipio.nome', - left=posicao_left[7]*cm, - top=posicao_top[3]*cm, - width=20*cm, + left=posicao_left[7] * cm, + top=posicao_top[3] * cm, + width=20 * cm, ), # Linha 3 Label( text=u"Endereço: ", - left=posicao_left[8]*cm, - top=posicao_top[4]*cm, + left=posicao_left[8] * cm, + top=posicao_top[4] * cm, ), ObjectValue( attribute_name='logradouro', - left=posicao_left[9]*cm, - top=posicao_top[4]*cm, - width=20*cm, + left=posicao_left[9] * cm, + top=posicao_top[4] * cm, + width=20 * cm, ), Label( text=u"Bairro: ", - left=posicao_left[10]*cm, - top=posicao_top[5]*cm, + left=posicao_left[10] * cm, + top=posicao_top[5] * cm, ), ObjectValue( attribute_name='bairro', - left=posicao_left[11]*cm, - top=posicao_top[5]*cm, + left=posicao_left[11] * cm, + top=posicao_top[5] * cm, ), Label( text=u"CEP: ", - left=posicao_left[12]*cm, - top=posicao_top[6]*cm, + left=posicao_left[12] * cm, + top=posicao_top[6] * cm, ), ObjectValue( attribute_name='cep', - left=posicao_left[13]*cm, - top=posicao_top[6]*cm, + left=posicao_left[13] * cm, + top=posicao_top[6] * cm, ), Label( text=u"CNPJ: ", - left=posicao_left[14]*cm, - top=posicao_top[7]*cm, + left=posicao_left[14] * cm, + top=posicao_top[7] * cm, ), ObjectValue( attribute_name='cnpj', - left=posicao_left[15]*cm, - top=posicao_top[7]*cm, + left=posicao_left[15] * cm, + top=posicao_top[7] * cm, ), Label( text=u"Telefone: ", - left=posicao_left[16]*cm, - top=posicao_top[8]*cm, + left=posicao_left[16] * cm, + top=posicao_top[8] * cm, ), ObjectValue( attribute_name='telefone', - left=posicao_left[17]*cm, - top=posicao_top[8]*cm, + left=posicao_left[17] * cm, + top=posicao_top[8] * cm, ), Label( text=u"Presidente: ", - left=posicao_left[18]*cm, - top=posicao_top[9]*cm, + left=posicao_left[18] * cm, + top=posicao_top[9] * cm, ), ObjectValue( attribute_name='presidente', - left=posicao_left[19]*cm, - top=posicao_top[9]*cm, - width=20*cm, + left=posicao_left[19] * cm, + top=posicao_top[9] * cm, + width=20 * cm, ), - ] + ] # Telefones - tel_top = 2*cm - tel_left = [0,3,5] + tel_top = 2 * cm + tel_left = [0, 3, 5] # Contato - cont_top = 2*cm - cont_left = [0,6,9] + cont_top = 2 * cm + cont_left = [0, 6, 9] # Convenios - convenio_top = 2*cm - convenio_left = [0,1.8,4.5,8,10.5,13,15.5,18] + convenio_top = 2 * cm + convenio_left = [0, 1.8, 4.5, 8, 10.5, 13, 15.5, 18] subreports = [ - # Telefones + # Telefones SubReport( - queryset_string = '%(object)s.telefones.all()', - band_header = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':12 }, - height=2.5*cm, - elements = [ + queryset_string='%(object)s.telefones.all()', + band_header=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 12}, + height=2.5 * cm, + elements=[ Label( text=u"Telefone(s)", - style = {'fontSize':14,'alignment': TA_CENTER}, + style={'fontSize': 14, 'alignment': TA_CENTER}, width=BAND_WIDTH, - top=1*cm, + top=1 * cm, ), - Label(text=u"Número",left=tel_left[0]*cm,top=tel_top), - Label(text=u"Tipo",left=tel_left[1]*cm,top=tel_top), - Label(text=u"Nota",left=tel_left[2]*cm,top=tel_top), + Label(text=u"Número", left=tel_left[0] * cm, top=tel_top), + Label(text=u"Tipo", left=tel_left[1] * cm, top=tel_top), + Label(text=u"Nota", left=tel_left[2] * cm, top=tel_top), ], - borders = {'bottom': True}, - ), - band_detail = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':11}, - height=0.5*cm, - elements= [ - ObjectValue(attribute_name='__unicode__',left=tel_left[0]*cm), - ObjectValue(attribute_name='tipo',left=tel_left[1]*cm, - get_value = lambda instance: - {'F':'Fixo','M':u'Móvel','X':'Fax','I':'Indefinido'}[instance.tipo], - ), - ObjectValue(attribute_name='nota',left=tel_left[2]*cm), + borders={'bottom': True}, + ), + band_detail=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 11}, + height=0.5 * cm, + elements=[ + ObjectValue(attribute_name='__unicode__', left=tel_left[0] * cm), + ObjectValue(attribute_name='tipo', left=tel_left[1] * cm, + get_value=lambda instance: + {'F': 'Fixo', 'M': u'Móvel', 'X': 'Fax', 'I': 'Indefinido'}[instance.tipo], + ), + ObjectValue(attribute_name='nota', left=tel_left[2] * cm), ], #borders = {'all':True}, ), ), - #Contatos + # Contatos SubReport( - queryset_string = '%(object)s.funcionario_set.all()', - band_header = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':12 }, - height=2.5*cm, - elements = [ + queryset_string='%(object)s.funcionario_set.all()', + band_header=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 12}, + height=2.5 * cm, + elements=[ Label( text=u"Contato(s)", - style = {'fontSize':14,'alignment': TA_CENTER}, + style={'fontSize': 14, 'alignment': TA_CENTER}, width=BAND_WIDTH, - top=1*cm, + top=1 * cm, ), - Label(text=u"Nome",left=cont_left[0]*cm,top=cont_top), - Label(text=u"Nota",left=cont_left[1]*cm,top=cont_top), - Label(text=u"E-mail",left=cont_left[2]*cm,top=cont_top), + Label(text=u"Nome", left=cont_left[0] * cm, top=cont_top), + Label(text=u"Nota", left=cont_left[1] * cm, top=cont_top), + Label(text=u"E-mail", left=cont_left[2] * cm, top=cont_top), ], - borders = {'bottom': True,'top':True}, - ), - band_detail = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':11}, - height=0.5*cm, - elements= [ - ObjectValue(attribute_name='nome',left=cont_left[0]*cm), - ObjectValue(attribute_name='nota',left=cont_left[1]*cm), - ObjectValue(attribute_name='email',left=cont_left[2]*cm), + borders={'bottom': True, 'top': True}, + ), + band_detail=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 11}, + height=0.5 * cm, + elements=[ + ObjectValue(attribute_name='nome', left=cont_left[0] * cm), + ObjectValue(attribute_name='nota', left=cont_left[1] * cm), + ObjectValue(attribute_name='email', left=cont_left[2] * cm), ], #borders = {'all':True}, ), ), - #Convenios + # Convenios SubReport( - queryset_string = '%(object)s.convenio_set.all()', - band_header = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':12 }, - height=2.5*cm, - elements=[ - Label( - text=u"Convênio(s)", - style = {'fontSize':14,'alignment': TA_CENTER}, - width=BAND_WIDTH, - top=1*cm, - ), - Label(text=u"Projeto",left=convenio_left[0]*cm,top=convenio_top), - Label(text=u"Nº Convenio",left=convenio_left[1]*cm,top=convenio_top), - Label(text=u"Nº Processo SF",left=convenio_left[2]*cm,top=convenio_top), - Label(text=u"Adesão",left=convenio_left[3]*cm,top=convenio_top), - Label(text=u"Convênio",left=convenio_left[4]*cm,top=convenio_top), - Label(text=u"Equipada",left=convenio_left[5]*cm,top=convenio_top), - Label(text=u"Data D.O.",left=convenio_left[6]*cm,top=convenio_top), - ], - borders = {'bottom': True} - ), - band_detail = ReportBand( - default_style = {'fontName': 'Helvetica', 'fontSize':11}, - height=0.5*cm, - elements=[ - ObjectValue(attribute_name='projeto.sigla',left=convenio_left[0]*cm), - ObjectValue(attribute_name='num_convenio',left=convenio_left[1]*cm), - ObjectValue(attribute_name='num_processo_sf',left=convenio_left[2]*cm), - ObjectValue(attribute_name='data_adesao',left=convenio_left[3]*cm, - get_value=lambda instance: + queryset_string='%(object)s.convenio_set.all()', + band_header=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 12}, + height=2.5 * cm, + elements=[ + Label( + text=u"Convênio(s)", + style={'fontSize': 14, 'alignment': TA_CENTER}, + width=BAND_WIDTH, + top=1 * cm, + ), + Label(text=u"Projeto", left=convenio_left[0] * cm, top=convenio_top), + Label(text=u"Nº Convenio", left=convenio_left[1] * cm, top=convenio_top), + Label(text=u"Nº Processo SF", left=convenio_left[2] * cm, top=convenio_top), + Label(text=u"Adesão", left=convenio_left[3] * cm, top=convenio_top), + Label(text=u"Convênio", left=convenio_left[4] * cm, top=convenio_top), + Label(text=u"Equipada", left=convenio_left[5] * cm, top=convenio_top), + Label(text=u"Data D.O.", left=convenio_left[6] * cm, top=convenio_top), + ], + borders={'bottom': True} + ), + band_detail=ReportBand( + default_style={'fontName': 'Helvetica', 'fontSize': 11}, + height=0.5 * cm, + elements=[ + ObjectValue(attribute_name='projeto.sigla', left=convenio_left[0] * cm), + ObjectValue(attribute_name='num_convenio', left=convenio_left[1] * cm), + ObjectValue(attribute_name='num_processo_sf', left=convenio_left[2] * cm), + ObjectValue(attribute_name='data_adesao', left=convenio_left[3] * cm, + get_value=lambda instance: instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-' - ), - ObjectValue(attribute_name='data_retorno_assinatura',left=convenio_left[4]*cm, - get_value=lambda instance: + ), + ObjectValue(attribute_name='data_retorno_assinatura', left=convenio_left[4] * cm, + get_value=lambda instance: instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-' - ), - ObjectValue(attribute_name='data_termo_aceite',left=convenio_left[5]*cm, - get_value=lambda instance: + ), + ObjectValue(attribute_name='data_termo_aceite', left=convenio_left[5] * cm, + get_value=lambda instance: instance.data_termo_aceite.strftime('%d/%m/%Y') if instance.data_termo_aceite != None else '-' - ), - ObjectValue(attribute_name='data_pub_diario',left=convenio_left[6]*cm, - get_value=lambda instance: + ), + ObjectValue(attribute_name='data_pub_diario', left=convenio_left[6] * cm, + get_value=lambda instance: instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-' - ), - ], - #borders = {'all':True}, - ), + ), + ], + #borders = {'all':True}, + ), ) - ] \ No newline at end of file + ] diff --git a/sigi/apps/parlamentares/views.py b/sigi/apps/parlamentares/views.py index 350e31e..015034b 100644 --- a/sigi/apps/parlamentares/views.py +++ b/sigi/apps/parlamentares/views.py @@ -18,9 +18,9 @@ from sigi.apps.parlamentares.reports import ParlamentaresLabels from geraldo.generators import PDFGenerator -def adicionar_parlamentar_carrinho(request,queryset=None,id=None): +def adicionar_parlamentar_carrinho(request, queryset=None, id=None): if request.method == 'POST': - ids_selecionados = request.POST.getlist('_selected_action') + ids_selecionados = request.POST.getlist('_selected_action') if not request.session.has_key('carrinho_parlametar'): request.session['carrinho_parlamentar'] = ids_selecionados else: @@ -28,17 +28,17 @@ def adicionar_parlamentar_carrinho(request,queryset=None,id=None): # Verifica se id já não está adicionado for id in ids_selecionados: if not id in lista: - lista.append(id) + lista.append(id) request.session['carrinho_parlamentar'] = lista - - -@csrf_protect + + +@csrf_protect def visualizar_carrinho(request): - + qs = carrinhoOrGet_for_qs(request) - + paginator = Paginator(qs, 100) - + # Make sure page request is an int. If not, deliver first page. # Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página. try: @@ -51,52 +51,52 @@ def visualizar_carrinho(request): paginas = paginator.page(page) except (EmptyPage, InvalidPage): paginas = paginator.page(paginator.num_pages) - + carrinhoIsEmpty = not(request.session.has_key('carrinho_parlamentares')) - + return render_to_response('parlamentares/carrinho.html', - {'MEDIA_URL':settings.MEDIA_URL, - 'carIsEmpty':carrinhoIsEmpty, - 'paginas':paginas, - 'query_str':'?'+request.META['QUERY_STRING']}, + {'MEDIA_URL': settings.MEDIA_URL, + 'carIsEmpty': carrinhoIsEmpty, + 'paginas': paginas, + 'query_str': '?' + request.META['QUERY_STRING']}, context_instance=RequestContext(request)) def carrinhoOrGet_for_qs(request): """ Verifica se existe parlamentares na sessão se não verifica get e retorna qs correspondente. - """ + """ if request.session.has_key('carrinho_parlamentar'): ids = request.session['carrinho_parlamentar'] qs = Parlamentar.objects.filter(pk__in=ids) else: qs = Parlamentar.objects.all() if request.GET: - qs = get_for_qs(request.GET,qs) + qs = get_for_qs(request.GET, qs) return qs -def query_ordena(qs,o,ot): +def query_ordena(qs, o, ot): list_display = ('nome_completo',) - aux = list_display[(int(o)-1)] - if ot =='asc': + aux = list_display[(int(o) - 1)] + if ot == 'asc': qs = qs.order_by(aux) else: - qs = qs.order_by("-"+aux) + qs = qs.order_by("-" + aux) return qs -def get_for_qs(get,qs): +def get_for_qs(get, qs): """ Verifica atributos do GET e retorna queryset correspondente """ kwargs = {} - for k,v in get.iteritems(): - if not (k == 'page' or k == 'pop' or k == 'q'): + for k, v in get.iteritems(): + if not (k == 'page' or k == 'pop' or k == 'q'): if not k == 'o': if k == "ot": - qs = query_ordena(qs,get["o"],get["ot"]) + qs = query_ordena(qs, get["o"], get["ot"]) else: kwargs[str(k)] = v qs = qs.filter(**kwargs) @@ -108,35 +108,34 @@ def deleta_itens_carrinho(request): Deleta itens selecionados do carrinho """ if request.method == 'POST': - ids_selecionados = request.POST.getlist('_selected_action') - if request.session.has_key('carrinho_parlamentar'): - lista = request.session['carrinho_parlamentar'] + ids_selecionados = request.POST.getlist('_selected_action') + if request.session.has_key('carrinho_parlamentar'): + lista = request.session['carrinho_parlamentar'] for item in ids_selecionados: lista.remove(item) - if lista: + if lista: request.session['carrinho_parlamentar'] = lista else: - del lista; - del request.session['carrinho_parlamentar'] - + del lista + del request.session['carrinho_parlamentar'] + return HttpResponseRedirect('.') def labels_report(request, id=None, formato='3x9_etiqueta'): """ TODO: adicionar suporte para resultado de pesquisa do admin. - """ - + """ + if request.POST: if request.POST.has_key('tipo_etiqueta'): tipo = request.POST['tipo_etiqueta'] - - + if id: qs = Parlamentar.objects.filter(pk=id) - else: + else: qs = carrinhoOrGet_for_qs(request) - + if not qs: return HttpResponseRedirect('../') @@ -145,4 +144,4 @@ def labels_report(request, id=None, formato='3x9_etiqueta'): report = ParlamentaresLabels(queryset=qs, formato=formato) report.generate_by(PDFGenerator, filename=response) - return response \ No newline at end of file + return response diff --git a/sigi/apps/relatorios/reports.py b/sigi/apps/relatorios/reports.py index a22bf7c..c3c0a5c 100644 --- a/sigi/apps/relatorios/reports.py +++ b/sigi/apps/relatorios/reports.py @@ -2,8 +2,8 @@ import os from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \ - landscape,SystemField, BAND_WIDTH,ReportGroup, \ - FIELD_ACTION_SUM, FIELD_ACTION_COUNT, Line + landscape, SystemField, BAND_WIDTH, ReportGroup, \ + FIELD_ACTION_SUM, FIELD_ACTION_COUNT, Line from geraldo.graphics import Image from reportlab.lib.units import cm from reportlab.lib.pagesizes import A4 @@ -19,58 +19,56 @@ class ReportDefault(Report): page_size = A4 class band_page_header(ReportBand): - height = 4.2*cm - label_top = 3.7*cm - default_style = {'fontName': 'Helvetica', 'fontSize':9} + height = 4.2 * cm + label_top = 3.7 * cm + default_style = {'fontName': 'Helvetica', 'fontSize': 9} BASE_DIR = os.path.abspath(os.path.dirname(__file__) + '../../../../') #BASE_DIR = os.path.abspath(os.getcwd() + '../..') elements = [ - Image(filename= BASE_DIR + '/media/images/logo-interlegis.jpg', - left=15.5*cm,right=1*cm,top=0.1*cm,bottom=1*cm, - width=4.2*cm,height=3*cm, - ), - Image(filename= BASE_DIR + '/media/images/logo-senado.png', - left=1*cm,right=1*cm,top=0.1*cm,bottom=1*cm, - width=3*cm,height=3*cm, - ), - Label(text="SENADO FEDERAL",top=1*cm,left=0,width=BAND_WIDTH, - style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} - ), - Label(text="SINTER - Secretaria Especial do Interlegis",top=1.5*cm,left=0,width=BAND_WIDTH, - style={'fontName': 'Helvetica-Bold','fontSize':13, 'alignment': TA_CENTER} - ), + Image(filename=BASE_DIR + '/media/images/logo-interlegis.jpg', + left=15.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, + width=4.2 * cm, height=3 * cm, + ), + Image(filename=BASE_DIR + '/media/images/logo-senado.png', + left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, + width=3 * cm, height=3 * cm, + ), + Label(text="SENADO FEDERAL", top=1 * cm, left=0, width=BAND_WIDTH, + style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} + ), + Label(text="SINTER - Secretaria Especial do Interlegis", top=1.5 * cm, left=0, width=BAND_WIDTH, + style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER} + ), SystemField( - expression='%(report_title)s',top=2.5*cm,left=0,width=BAND_WIDTH, - style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} + expression='%(report_title)s', top=2.5 * cm, left=0, width=BAND_WIDTH, + style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} ), ] borders = {'bottom': True} class band_page_footer(ReportBand): - height = 1*cm + height = 1 * cm elements = [ - SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3*cm), - SystemField(expression=u'Página %(page_number)d de %(page_count)d', top=0.3*cm, - width=BAND_WIDTH, style={'alignment': TA_RIGHT} - ), + SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3 * cm), + SystemField(expression=u'Página %(page_number)d de %(page_count)d', top=0.3 * cm, + width=BAND_WIDTH, style={'alignment': TA_RIGHT} + ), ] #borders = {'top': True} class band_detail(DetailBand): - height = 0.5*cm + height = 0.5 * cm default_style = {'fontName': 'Helvetica', 'fontSize': 8} auto_expand_height = True - + class band_summary(ReportBand): - height = 0.8*cm + height = 0.8 * cm elements = [ - Label(text="Total:", top=0.1*cm, left=0), - ObjectValue(attribute_name='id', top=0.1*cm, left=1*cm,\ - action=FIELD_ACTION_COUNT, display_format='%s'), + Label(text="Total:", top=0.1 * cm, left=0), + ObjectValue(attribute_name='id', top=0.1 * cm, left=1 * cm, + action=FIELD_ACTION_COUNT, display_format='%s'), ] borders = {'top': Line(stroke_color=navy, stroke_width=2)} - - diff --git a/sigi/apps/servicos/admin.py b/sigi/apps/servicos/admin.py index a607483..467b360 100644 --- a/sigi/apps/servicos/admin.py +++ b/sigi/apps/servicos/admin.py @@ -17,6 +17,7 @@ class LogServicoInline(admin.StackedInline): class ServicoFormAdmin(ModelForm): + class Meta: model = Servico fields = '__all__' @@ -50,21 +51,21 @@ class TipoServicoAdmin(admin.ModelAdmin): class ServicoAdmin(admin.ModelAdmin): form = ServicoFormAdmin - actions = ['calcular_data_uso',] + actions = ['calcular_data_uso', ] list_display = ('casa_legislativa', 'get_codigo_interlegis', 'get_uf', 'tipo_servico', 'hospedagem_interlegis', 'data_ativacao', 'data_desativacao', 'getUrl', 'data_ultimo_uso', 'get_link_erro') - fieldsets = (( None, { - 'fields': ('casa_legislativa', 'data_ativacao',) - }), - ( 'Serviço', { - 'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),) - }), - ( 'Contatos', { - 'fields': ('contato_tecnico', 'contato_administrativo',) - }), - ( 'Alterações', { - 'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',) - })) + fieldsets = ((None, { + 'fields': ('casa_legislativa', 'data_ativacao',) + }), + ('Serviço', { + 'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),) + }), + ('Contatos', { + 'fields': ('contato_tecnico', 'contato_administrativo',) + }), + ('Alterações', { + 'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',) + })) readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao') list_filter = ('tipo_servico', 'hospedagem_interlegis', 'data_ultimo_uso', 'casa_legislativa__municipio__uf', ) list_display_links = [] @@ -102,7 +103,7 @@ class ServicoAdmin(admin.ModelAdmin): def calcular_data_uso(self, request, queryset): for servico in queryset: servico.atualiza_data_uso() - self.message_user(request, "Atualização concluída. Os sites que não responderam foram deixados com a data em branco" ) + self.message_user(request, "Atualização concluída. Os sites que não responderam foram deixados com a data em branco") return HttpResponseRedirect('.') calcular_data_uso.short_description = u"Atualizar a data do último uso do(s) serviço(s)" @@ -110,15 +111,14 @@ class ServicoAdmin(admin.ModelAdmin): from django.utils.datastructures import SortedDict actions = [self.get_action(action) for action in self.actions] actions = filter(None, actions) - actions.sort(lambda a,b: cmp(a[2].lower(), b[2].lower())) - actions = SortedDict([ (name, (func, name, desc)) for func, name, desc in actions ]) + actions.sort(lambda a, b: cmp(a[2].lower(), b[2].lower())) + actions = SortedDict([(name, (func, name, desc)) for func, name, desc in actions]) return actions def lookup_allowed(self, lookup, value): return super(ServicoAdmin, self).lookup_allowed(lookup, value) or \ lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact'] - def add_view(self, request, form_url='', extra_context=None): id_casa = request.GET.get('id_casa', None) @@ -154,7 +154,7 @@ class ServicoAdmin(admin.ModelAdmin): return super(ServicoAdmin, self).response_change(request, obj) def save_form(self, request, form, change): - obj = super( ServicoAdmin, self).save_form(request, form, change) + obj = super(ServicoAdmin, self).save_form(request, form, change) if not change: id_casa = request.GET.get('id_casa', None) @@ -168,7 +168,7 @@ class ServicoAdmin(admin.ModelAdmin): class ContatosInline(FuncionariosInline): - can_delete = False # Equipe do SEIT não pode excluir pessoas de contato + can_delete = False # Equipe do SEIT não pode excluir pessoas de contato class CasaAtendidaAdmin(admin.ModelAdmin): @@ -176,15 +176,14 @@ class CasaAtendidaAdmin(admin.ModelAdmin): list_display = ('codigo_interlegis', 'nome', 'get_servicos',) ordering = ['nome'] fieldsets = ( - ('Casa legislativa', { - 'fields': (('codigo_interlegis', 'nome'), ('logradouro', 'bairro', 'municipio', 'cep'), ('email', 'pagina_web')) - }) - ,) - readonly_fields = ('nome', 'logradouro', 'bairro', 'municipio', 'cep') + ('Casa legislativa', { + 'fields': (('codigo_interlegis', 'nome'), ('logradouro', 'bairro', 'municipio', 'cep'), ('email', 'pagina_web')) + }),) + readonly_fields = ('nome', 'logradouro', 'bairro', 'municipio', 'cep') inlines = (ContatosInline,) list_filter = ('tipo', 'servico__tipo_servico', 'municipio__uf__nome', 'servico__casa_legislativa__convenio__projeto') - search_fields = ('search_text','cnpj', 'bairro', 'logradouro', + search_fields = ('search_text', 'cnpj', 'bairro', 'logradouro', 'cep', 'municipio__nome', 'municipio__uf__nome', 'municipio__codigo_ibge', 'pagina_web', 'observacoes') @@ -192,7 +191,7 @@ class CasaAtendidaAdmin(admin.ModelAdmin): result = [] for servico in obj.servico_set.all(): result.append(u"%s (%s). Contato: %s" % (servico.tipo_servico.nome, 'ativo' if servico.data_desativacao is None - else 'Desativado', servico.contato_administrativo.nome)) + else 'Desativado', servico.contato_administrativo.nome)) return "
    • " + "
    • ".join(result) + "
    " get_servicos.allow_tags = True @@ -213,10 +212,10 @@ class CasaAtendidaAdmin(admin.ModelAdmin): return super(CasaAtendidaAdmin, self).change_view(request, object_id, extra_context=extra_context) def has_add_permission(self, request): - return False # Nunca é permitido inserir uma nova Casa Legislativa por aqui + return False # Nunca é permitido inserir uma nova Casa Legislativa por aqui def has_delete_permission(self, request, obj=None): - return False # Nunca deletar casas por aqui + return False # Nunca deletar casas por aqui admin.site.register(Servico, ServicoAdmin) admin.site.register(TipoServico, TipoServicoAdmin) diff --git a/sigi/apps/servicos/management/commands/atualiza_uso_servico.py b/sigi/apps/servicos/management/commands/atualiza_uso_servico.py index 17e84da..5c3b9be 100644 --- a/sigi/apps/servicos/management/commands/atualiza_uso_servico.py +++ b/sigi/apps/servicos/management/commands/atualiza_uso_servico.py @@ -24,12 +24,14 @@ from django.core.management.base import BaseCommand from sigi.apps.servicos.models import Servico + class Command(BaseCommand): help = u'Atualiza a informação de data de último serviço dos serviços SEIT hospedados no Interlegis.' + def handle(self, *args, **options): verbosity = int(options['verbosity']) queryset = Servico.objects.exclude(url="").exclude(tipo_servico__string_pesquisa="") - for obj in queryset: + for obj in queryset: obj.atualiza_data_uso() if ((verbosity == 1) and (obj.data_ultimo_uso is None)) or (verbosity > 1): - self.stdout.write(u"%s \t %s \t %s\n" % (obj.url, obj.data_ultimo_uso, obj.erro_atualizacao)) \ No newline at end of file + self.stdout.write(u"%s \t %s \t %s\n" % (obj.url, obj.data_ultimo_uso, obj.erro_atualizacao)) diff --git a/sigi/apps/servicos/models.py b/sigi/apps/servicos/models.py index 0cee2e5..c12c683 100644 --- a/sigi/apps/servicos/models.py +++ b/sigi/apps/servicos/models.py @@ -5,6 +5,7 @@ from datetime import date from django.core.mail import send_mail from sigi.settings import DEFAULT_FROM_EMAIL + class TipoServico(models.Model): email_help = u'''Use:
    {url} para incluir a URL do serviço,
    @@ -12,10 +13,10 @@ class TipoServico(models.Model): nome = models.CharField(u'Nome', max_length=60) sigla = models.CharField(u'Sigla', max_length='12') string_pesquisa = models.CharField(u'String de pesquisa', blank=True, max_length=200, - help_text=u'Sufixo para pesquisa RSS para averiguar a data da última atualização do serviço') - template_email_ativa = models.TextField(u'Template de email de ativação', help_text = email_help, blank=True) - template_email_altera = models.TextField(u'Template de email de alteração', help_text = email_help, blank=True) - template_email_desativa = models.TextField(u'Template de email de desativação', help_text = email_help + u'
    {motivo} para incluir o motivo da desativação do serviço', blank=True) + help_text=u'Sufixo para pesquisa RSS para averiguar a data da última atualização do serviço') + template_email_ativa = models.TextField(u'Template de email de ativação', help_text=email_help, blank=True) + template_email_altera = models.TextField(u'Template de email de alteração', help_text=email_help, blank=True) + template_email_desativa = models.TextField(u'Template de email de desativação', help_text=email_help + u'
    {motivo} para incluir o motivo da desativação do serviço', blank=True) @property def qtde_casas_atendidas(self): @@ -27,7 +28,8 @@ class TipoServico(models.Model): verbose_name_plural = u'Tipos de serviço' def __unicode__(self): - return self.nome; + return self.nome + class Servico(models.Model): casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=u'Casa legislativa') @@ -37,7 +39,7 @@ class Servico(models.Model): url = models.URLField(u'URL do serviço', blank=True) hospedagem_interlegis = models.BooleanField(u'Hospedagem no Interlegis?') nome_servidor = models.CharField(u'Hospedado em', max_length=60, blank=True, - help_text=u'Se hospedado no Interlegis, informe o nome do servidor.
    Senão, informe o nome do provedor de serviços.') + help_text=u'Se hospedado no Interlegis, informe o nome do servidor.
    Senão, informe o nome do provedor de serviços.') porta_servico = models.PositiveSmallIntegerField(u'Porta de serviço (instância)', blank=True, null=True) senha_inicial = models.CharField(u'Senha inicial', max_length=33, blank=True) data_ativacao = models.DateField(u'Data de ativação', default=date.today) @@ -45,9 +47,9 @@ class Servico(models.Model): data_desativacao = models.DateField(u'Data de desativação', blank=True, null=True) motivo_desativacao = models.TextField(u'Motivo da desativação', blank=True) data_ultimo_uso = models.DateField(u'Data da última utilização', blank=True, null=True, - help_text=u'Data em que o serviço foi utilizado pela Casa Legislativa pela última vez
    NÃO É ATUALIZADO AUTOMATICAMENTE!') + help_text=u'Data em que o serviço foi utilizado pela Casa Legislativa pela última vez
    NÃO É ATUALIZADO AUTOMATICAMENTE!') erro_atualizacao = models.CharField(u"Erro na atualização", blank=True, max_length=200, - help_text=u"Erro ocorrido na última tentativa de atualizar a data de último acesso") + help_text=u"Erro ocorrido na última tentativa de atualizar a data de último acesso") # casa_legislativa.casa_uf_filter = True @@ -77,10 +79,10 @@ class Servico(models.Model): import urllib2 from xml.dom.minidom import parseString - try: # Captura erros de conexão - try: # Tentar conxão sem proxy + try: # Captura erros de conexão + try: # Tentar conxão sem proxy req = urllib2.urlopen(url=url, timeout=5) - except: # Tentar com proxy + except: # Tentar com proxy proxy = urllib2.ProxyHandler() opener = urllib2.build_opener(proxy) req = opener.open(fullurl=url, timeout=5) @@ -102,7 +104,7 @@ class Servico(models.Model): date_list = first_item.getElementsByTagName('dc:date') date_item = date_list[0] date_text = date_item.firstChild.nodeValue - self.data_ultimo_uso = date_text[:10] # Apenas YYYY-MM-DD + self.data_ultimo_uso = date_text[:10] # Apenas YYYY-MM-DD self.erro_atualizacao = "" self.save() except Exception as e: @@ -138,7 +140,7 @@ class Servico(models.Model): else: # Salvar o Servico super(Servico, self).save(*args, **kwargs) - return # sem enviar email + return # sem enviar email # Prepara e envia o email body = body.replace('{url}', self.url) \ @@ -153,6 +155,7 @@ class Servico(models.Model): return + class LogServico(models.Model): servico = models.ForeignKey(Servico, verbose_name='Serviço') descricao = models.CharField('Breve descrição da ação', max_length=60) @@ -166,18 +169,23 @@ class LogServico(models.Model): verbose_name = 'Log do serviço' verbose_name_plural = 'Logs do serviço' + class CasaAtendidaManager(models.Manager): + def get_queryset(self): qs = super(CasaAtendidaManager, self).get_queryset() qs = qs.exclude(codigo_interlegis='') return qs + class CasaAtendida(CasaLegislativa): + class Meta: proxy = True verbose_name_plural = 'Casas atendidas' - objects = CasaAtendidaManager() + objects = CasaAtendidaManager() + class CasaManifesta(models.Model): casa_legislativa = models.OneToOneField(CasaLegislativa) @@ -187,6 +195,7 @@ class CasaManifesta(models.Model): cargo = models.CharField(u'Cargo do informante', max_length=100, blank=True) email = models.EmailField(u'E-mail de contato', blank=True) + class ServicoManifesto(models.Model): casa_manifesta = models.ForeignKey(CasaManifesta) servico = models.ForeignKey(TipoServico) diff --git a/sigi/apps/servicos/views.py b/sigi/apps/servicos/views.py index aa41aea..2cfd34a 100644 --- a/sigi/apps/servicos/views.py +++ b/sigi/apps/servicos/views.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django import forms from django.http import HttpResponse -import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo +import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo from django.shortcuts import render_to_response, get_object_or_404 from django.db.models import Q from sigi.apps.servicos.models import TipoServico, CasaAtendida, CasaManifesta, ServicoManifesto @@ -44,11 +44,12 @@ def municipios_atendidos(self, servico): municipio = {'nome': casa.nome + ', ' + m.uf.sigla, 'lat': str(m.latitude), 'lng': str(m.longitude), - 'servicos': "
    • " + "
    • ".join([s.tipo_servico.nome for s in casa.servico_set.filter(query)]) + "
    ",} + 'servicos': "
    • " + "
    • ".join([s.tipo_servico.nome for s in casa.servico_set.filter(query)]) + "
    ", } municipios.append(municipio) return HttpResponse(simplejson.dumps(municipios), mimetype="application/json") + class CasaManifestaProtoForm(forms.Form): fieldsets = None informante = forms.CharField(max_length=100, required=False) @@ -71,6 +72,7 @@ class CasaManifestaProtoForm(forms.Form): result.append({'name': name, 'lines': field_lines},) self.fieldsets = result + def casa_manifesta_view(request): if 'casa_id' in request.GET: casa_id = request.GET.get('casa_id') @@ -85,7 +87,7 @@ def casa_manifesta_view(request): campos['possui_%s' % ts.pk] = forms.BooleanField(label=u'Possui o serviço de %s' % ts.nome, required=False) campos['url_%s' % ts.pk] = forms.URLField(label=u'Informe a URL', required=False) campos['hospedagem_interlegis_%s' % ts.pk] = forms.BooleanField(label=u'Serviço está hospedado no Interlegis', required=False) - fieldsets += ((ts.nome, ('possui_%s' % ts.pk, 'url_%s' % ts.pk, 'hospedagem_interlegis_%s' % ts.pk )),) + fieldsets += ((ts.nome, ('possui_%s' % ts.pk, 'url_%s' % ts.pk, 'hospedagem_interlegis_%s' % ts.pk)),) CasaManifestaForm = type('', (CasaManifestaProtoForm,), campos) @@ -108,7 +110,7 @@ def casa_manifesta_view(request): sm.hospedagem_interlegis = cmf.cleaned_data['hospedagem_interlegis_%s' % ts.pk] sm.save() thanks.append((ts.nome, u'Possui o serviço acessível em %s %s' % (sm.url, u'hospedado no Interlegis' if - sm.hospedagem_interlegis else ''))) + sm.hospedagem_interlegis else ''))) else: ServicoManifesto.objects.filter(casa_manifesta=cm, servico=ts).delete() thanks.append((ts.nome, u'Não possui')) diff --git a/sigi/apps/servidores/admin.py b/sigi/apps/servidores/admin.py index facde37..d7c6b4b 100644 --- a/sigi/apps/servidores/admin.py +++ b/sigi/apps/servidores/admin.py @@ -11,8 +11,8 @@ from sigi.apps.utils.alphabetic_filter import AlphabeticFilter class FuncaoAdmin(admin.ModelAdmin): form = FuncaoForm - list_display = ('servidor', 'funcao', 'cargo','inicio_funcao', 'fim_funcao') - list_filter = ('inicio_funcao', 'fim_funcao') + list_display = ('servidor', 'funcao', 'cargo', 'inicio_funcao', 'fim_funcao') + list_filter = ('inicio_funcao', 'fim_funcao') search_fields = ('funcao', 'cargo', 'descricao', 'servidor__nome_completo', 'servidor__obs', 'servidor__apontamentos', 'servidor__user__email', 'servidor__user__first_name', @@ -22,7 +22,7 @@ class FuncaoAdmin(admin.ModelAdmin): class FeriasAdmin(admin.ModelAdmin): form = FeriasForm list_display = ('servidor', 'inicio_ferias', 'fim_ferias') - list_filter = ('inicio_ferias', 'fim_ferias') + list_filter = ('inicio_ferias', 'fim_ferias') search_fields = ('obs', 'servidor__nome_completo', 'servidor__email_pessoal', 'servidor__user__email', 'servidor__user__username') @@ -36,14 +36,14 @@ class ServidorFilter(AlphabeticFilter): class LicencaAdmin(admin.ModelAdmin): form = LicencaForm list_display = ('servidor', 'inicio_licenca', 'fim_licenca') - list_filter = (ServidorFilter, 'inicio_licenca', 'fim_licenca') + list_filter = (ServidorFilter, 'inicio_licenca', 'fim_licenca') search_fields = ('obs', 'servidor__nome_completo', 'servidor__email_pessoal', 'servidor__user__email', 'servidor__user__username') def lookup_allowed(self, lookup, value): return super(LicencaAdmin, self).lookup_allowed(lookup, value) or \ - lookup in ['servidor__nome_completo'] + lookup in ['servidor__nome_completo'] class EnderecoInline(generic.GenericStackedInline): @@ -58,6 +58,7 @@ class TelefonesInline(generic.GenericTabularInline): class ServidorAdmin(admin.ModelAdmin): + def is_active(self, servidor): return servidor.user.is_active is_active.admin_order_field = 'user__is_active' @@ -65,25 +66,25 @@ class ServidorAdmin(admin.ModelAdmin): is_active.short_description = 'ativo' list_display = ('nome_completo', 'is_active', 'foto', 'servico', ) - list_filter = ('user__is_active', 'sexo', 'servico',) + list_filter = ('user__is_active', 'sexo', 'servico',) search_fields = ('nome_completo', 'obs', 'apontamentos', 'user__email', 'user__first_name', 'user__last_name', 'user__username') raw_id_fields = ('user',) - inlines= (TelefonesInline,EnderecoInline) + inlines = (TelefonesInline, EnderecoInline) fieldsets = ( - (u'Autenticação', { - 'fields': ('user',), - }), - ('Cadastro', { - 'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal', 'data_nomeacao', 'ato_numero', 'ato_exoneracao') - }), - ('Lotação', { - 'fields': ('servico', 'turno', 'de_fora'), - }), - (u'Observações', { - 'fields': ('apontamentos', 'obs'), - }), + (u'Autenticação', { + 'fields': ('user',), + }), + ('Cadastro', { + 'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal', 'data_nomeacao', 'ato_numero', 'ato_exoneracao') + }), + ('Lotação', { + 'fields': ('servico', 'turno', 'de_fora'), + }), + (u'Observações', { + 'fields': ('apontamentos', 'obs'), + }), ) def lookup_allowed(self, lookup, value): @@ -98,7 +99,7 @@ class ServidorAdmin(admin.ModelAdmin): request = kwargs.pop("request", None) kwargs['widget'] = AdminImageWidget return db_field.formfield(**kwargs) - return super(ServidorAdmin,self).formfield_for_dbfield(db_field, **kwargs) + return super(ServidorAdmin, self).formfield_for_dbfield(db_field, **kwargs) admin.site.register(Servidor, ServidorAdmin) diff --git a/sigi/apps/servidores/forms.py b/sigi/apps/servidores/forms.py index af5c7a1..c23fcdd 100644 --- a/sigi/apps/servidores/forms.py +++ b/sigi/apps/servidores/forms.py @@ -8,6 +8,7 @@ from sigi.apps.servidores.models import Ferias, Licenca, Funcao, Servidor class FeriasForm(forms.ModelForm): + class Meta: model = Ferias fields = '__all__' @@ -21,6 +22,7 @@ class FeriasForm(forms.ModelForm): class LicencaForm(forms.ModelForm): + class Meta: model = Licenca fields = '__all__' @@ -34,6 +36,7 @@ class LicencaForm(forms.ModelForm): class FuncaoForm(forms.ModelForm): + class Meta: model = Funcao fields = '__all__' @@ -55,8 +58,8 @@ class FuncaoForm(forms.ModelForm): funcao_anterior = servidor.funcao_set.all()[0] if valida_periodo_data(funcao_anterior.inicio_funcao, - funcao_anterior.fim_funcao, data.get('inicio_funcao'), - data.get('fim_funcao')): + funcao_anterior.fim_funcao, data.get('inicio_funcao'), + data.get('fim_funcao')): raise forms.ValidationError(u"""Você não pode exercer uma função no mesmo período que a anterior, como também, não pode ser entre o período da mesma.""") diff --git a/sigi/apps/servidores/management/commands/migra.py b/sigi/apps/servidores/management/commands/migra.py index ba505ad..daa87b2 100644 --- a/sigi/apps/servidores/management/commands/migra.py +++ b/sigi/apps/servidores/management/commands/migra.py @@ -8,16 +8,18 @@ from django.contrib.auth.models import User from sigi.apps.servidores.models import Servidor, Servico, Subsecretaria, Funcao, Ferias, Licenca from sigi.apps.contatos.models import Municipio -#Funcao.objects.all().delete() -#Ferias.objects.all().delete() -#Licenca.objects.all().delete() -#for u in User.objects.filter(date_joined__gte=datetime(2011, 12, 9, 10, 58, 49, 83734)).all(): +# Funcao.objects.all().delete() +# Ferias.objects.all().delete() +# Licenca.objects.all().delete() +# for u in User.objects.filter(date_joined__gte=datetime(2011, 12, 9, 10, 58, 49, 83734)).all(): # u.servidor_set.all().delete() # u.delete() + class MigrationError(Exception): pass + class Command(BaseCommand): help = 'Migra usuários do antigo Sistema de RH' @@ -40,12 +42,12 @@ class Command(BaseCommand): user = None if not p['email']: - username = '' + username = '' email = '' - elif not ('@interlegis' in p['email']): + elif not ('@interlegis' in p['email']): username = p['email'].split('@')[0].strip().lower() email = '' - else: + else: username = p['email'].split('@')[0].strip().lower() email = username + '@interlegis.gov.br' @@ -53,17 +55,23 @@ class Command(BaseCommand): try: # procuro o usuario por email do interlegis if email: - try: user = User.objects.get(email=email) + try: + user = User.objects.get(email=email) except User.DoesNotExist: - email = username + '@interlegis.leg.br' - try: user = User.objects.get(email=email) - except User.DoesNotExist: pass + email = username + '@interlegis.leg.br' + try: + user = User.objects.get(email=email) + except User.DoesNotExist: + pass if not user and username: - try: user = User.objects.get(username=username) - except User.DoesNotExist: - try: user = User.objects.get(username=username + "__") - except User.DoesNotExist: pass + try: + user = User.objects.get(username=username) + except User.DoesNotExist: + try: + user = User.objects.get(username=username + "__") + except User.DoesNotExist: + pass if not user: if not username: @@ -79,18 +87,18 @@ class Command(BaseCommand): last_name = " ".join(names[1:]) user = User.objects.create( - username = username, - email = email, - first_name = first_name, - last_name = last_name[:30], - is_active= False - ) + username=username, + email=email, + first_name=first_name, + last_name=last_name[:30], + is_active=False + ) servidor = user.servidor except Servidor.DoesNotExist: servidor = Servidor.objects.create( user=user, - nome_completo= "%s %s" % (user.first_name, user.last_name) + nome_completo="%s %s" % (user.first_name, user.last_name) ) except MigrationError, e: print ", ".join(row) @@ -107,15 +115,15 @@ class Command(BaseCommand): servidor.ramal = p['ramal'] if p['email'] and not '@interlegis' in p['email']: - servidor.email_pessoal= p['email'] + servidor.email_pessoal = p['email'] - if p['inativo']=="-1": + if p['inativo'] == "-1": servidor.user.is_active = False else: servidor.user.is_active = True servidor.user.save() - if p['de_fora']=="-1": + if p['de_fora'] == "-1": servidor.de_fora = True else: servidor.de_fora = False @@ -125,11 +133,11 @@ class Command(BaseCommand): elif p['sexo'].upper() == 'F': servidor.sexo = 'F' - if p['turno']=="1": + if p['turno'] == "1": servidor.turno = 'M' - elif p['turno']=="2": + elif p['turno'] == "2": servidor.turno = 'T' - elif p['turno']=="3": + elif p['turno'] == "3": servidor.turno = 'N' if p['aniversario']: @@ -145,9 +153,9 @@ class Command(BaseCommand): secretaria_nome = p['secretaria_nome'] secretaria = Subsecretaria.objects.get_or_create( - sigla = p['secretaria_sigla'], - nome = secretaria_nome - )[0] + sigla=p['secretaria_sigla'], + nome=secretaria_nome + )[0] if ' - ' in p['servico_nome']: servico_nome = p['servico_nome'].split(' - ')[1] @@ -155,48 +163,48 @@ class Command(BaseCommand): servico_nome = p['servico_nome'] servico = Servico.objects.get_or_create( - sigla = p['servico_sigla'], - nome = servico_nome - )[0] + sigla=p['servico_sigla'], + nome=servico_nome + )[0] servico.subsecretaria = secretaria servico.save() servidor.servico = servico if p['telefone']: - try: - t = servidor.telefones.get(numero=p['telefone']) - except: - t = servidor.telefones.create(numero=p['telefone']) - t.tipo = 'F' - t.save() + try: + t = servidor.telefones.get(numero=p['telefone']) + except: + t = servidor.telefones.create(numero=p['telefone']) + t.tipo = 'F' + t.save() if p['celular']: - try: - t = servidor.telefones.get(numero=p['celular']) - except: - t = servidor.telefones.create(numero=p['celular']) - t.tipo = 'M' - t.save() + try: + t = servidor.telefones.get(numero=p['celular']) + except: + t = servidor.telefones.create(numero=p['celular']) + t.tipo = 'M' + t.save() if p['endereco']: - try: - e = servidor.endereco.get(logradouro=p['endereco']) - except: - e = servidor.endereco.create(logradouro=p['endereco']) - e.municipio = BRASILIA - e.bairro = p['cidade'] # bizarro mas é isso mesmo - e.cep = re.sub("\D", "", p['cep']) - e.save() + try: + e = servidor.endereco.get(logradouro=p['endereco']) + except: + e = servidor.endereco.create(logradouro=p['endereco']) + e.municipio = BRASILIA + e.bairro = p['cidade'] # bizarro mas é isso mesmo + e.cep = re.sub("\D", "", p['cep']) + e.save() servidor.apontamentos = p['apontamentos'] servidor.obs = p['obs'] if p['cargo'] or p['funcao']: funcao = servidor.funcao_set.get_or_create( - funcao = p['funcao'], - cargo = p['cargo'], - )[0] + funcao=p['funcao'], + cargo=p['cargo'], + )[0] if p['data_bap_entrada']: funcao.data_bap_entrada = self.to_date(p['data_bap_entrada']) @@ -214,23 +222,22 @@ class Command(BaseCommand): funcao.bap_saida = p['bap_saida'] funcao.save() - if re.search(r'estagi.ri[o|a]',p['cargo'],re.I): - #TODO inserir dados de estagio + if re.search(r'estagi.ri[o|a]', p['cargo'], re.I): + # TODO inserir dados de estagio pass if p['inicio_ferias'] and p['final_ferias']: servidor.ferias_set.get_or_create( - inicio_ferias = self.to_date(p['inicio_ferias']), - fim_ferias = self.to_date(p['final_ferias']), - obs = p['obs_ferias'] - ) + inicio_ferias=self.to_date(p['inicio_ferias']), + fim_ferias=self.to_date(p['final_ferias']), + obs=p['obs_ferias'] + ) if p['inicio_licenca'] and p['fim_licenca']: servidor.licenca_set.get_or_create( - inicio_licenca = self.to_date(p['inicio_licenca']), - fim_licenca = self.to_date(p['fim_licenca']), - obs = p['obs_licenca'] - ) + inicio_licenca=self.to_date(p['inicio_licenca']), + fim_licenca=self.to_date(p['fim_licenca']), + obs=p['obs_licenca'] + ) servidor.save() - diff --git a/sigi/apps/servidores/management/commands/sync_ldap.py b/sigi/apps/servidores/management/commands/sync_ldap.py index 2ece5a7..0f1719d 100644 --- a/sigi/apps/servidores/management/commands/sync_ldap.py +++ b/sigi/apps/servidores/management/commands/sync_ldap.py @@ -5,6 +5,7 @@ from django.contrib.auth.models import User, Group from sigi.settings import * from sigi.apps.servidores.models import Servidor + class Command(BaseCommand): help = u'Sincroniza Usuários e Servidores com o LDAP' @@ -14,10 +15,10 @@ class Command(BaseCommand): def get_ldap_groups(self): filter = "(&(objectclass=Group))" - values = ['cn',] + values = ['cn', ] l = ldap.initialize(AUTH_LDAP_SERVER_URI) l.protocol_version = ldap.VERSION3 - l.simple_bind_s(AUTH_LDAP_BIND_DN.encode('utf-8'),AUTH_LDAP_BIND_PASSWORD) + l.simple_bind_s(AUTH_LDAP_BIND_DN.encode('utf-8'), AUTH_LDAP_BIND_PASSWORD) result_id = l.search(AUTH_LDAP_GROUP, ldap.SCOPE_SUBTREE, filter, values) result_type, result_data = l.result(result_id, 1) l.unbind() @@ -25,10 +26,10 @@ class Command(BaseCommand): def get_ldap_users(self): filter = "(&(objectclass=user))" - values = ['sAMAccountName', 'userPrincipalName', 'givenName', 'sn', 'cn' ] + values = ['sAMAccountName', 'userPrincipalName', 'givenName', 'sn', 'cn'] l = ldap.initialize(AUTH_LDAP_SERVER_URI) l.protocol_version = ldap.VERSION3 - l.simple_bind_s(AUTH_LDAP_BIND_DN.encode('utf-8'),AUTH_LDAP_BIND_PASSWORD) + l.simple_bind_s(AUTH_LDAP_BIND_DN.encode('utf-8'), AUTH_LDAP_BIND_PASSWORD) result_id = l.search(AUTH_LDAP_USER.encode('utf-8'), ldap.SCOPE_SUBTREE, filter, values) result_type, result_data = l.result(result_id, 1) l.unbind() @@ -37,10 +38,13 @@ class Command(BaseCommand): def sync_groups(self): ldap_groups = self.get_ldap_groups() for ldap_group in ldap_groups: - try: group_name = ldap_group[1]['cn'][0] - except: pass + try: + group_name = ldap_group[1]['cn'][0] + except: + pass else: - try: group = Group.objects.get(name=group_name) + try: + group = Group.objects.get(name=group_name) except Group.DoesNotExist: group = Group(name=group_name) group.save() @@ -50,37 +54,49 @@ class Command(BaseCommand): def sync_users(self): ldap_users = self.get_ldap_users() for ldap_user in ldap_users: - try: username = ldap_user[1]['sAMAccountName'][0] - except: pass + try: + username = ldap_user[1]['sAMAccountName'][0] + except: + pass else: - try: email = ldap_user[1]['userPrincipalName'][0] - except: email = '' - try: first_name = ldap_user[1]['givenName'][0] - except: first_name = username - try: last_name = ldap_user[1]['sn'][0][:30] - except: last_name = '' - try: user = User.objects.get(username=username) + try: + email = ldap_user[1]['userPrincipalName'][0] + except: + email = '' + try: + first_name = ldap_user[1]['givenName'][0] + except: + first_name = username + try: + last_name = ldap_user[1]['sn'][0][:30] + except: + last_name = '' + try: + user = User.objects.get(username=username) except User.DoesNotExist: try: user = User.objects.get(email=email) user.username = username except User.DoesNotExist: user = User.objects.create_user( - username = username, - email = email + username=username, + email=email ) user.first_name = first_name user.last_name = last_name print "User '%s' created." % username - try: nome_completo = ldap_user[1]['cn'][0] - except: nome_completo = '' - try: + try: + nome_completo = ldap_user[1]['cn'][0] + except: + nome_completo = '' + try: servidor = user.servidor if not servidor.nome_completo == nome_completo.decode('utf8'): - servidor.nome_completo = nome_completo + servidor.nome_completo = nome_completo print "Servidor '%s' updated." % nome_completo except Servidor.DoesNotExist: - try: servidor = Servidor.objects.get(nome_completo=nome_completo) + try: + servidor = Servidor.objects.get(nome_completo=nome_completo) except Servidor.DoesNotExist: servidor = user.servidor_set.create(nome_completo=nome_completo) print "Servidor '%s' created." % nome_completo @@ -94,7 +110,7 @@ class Command(BaseCommand): if not user.last_name == last_name.decode('utf8'): user.last_name = last_name print "User '%s' last name updated." % username - servidor.user = user + servidor.user = user servidor.save() user.save() print "Users are synchronized." diff --git a/sigi/apps/servidores/models.py b/sigi/apps/servidores/models.py index 0cb8722..78aad58 100644 --- a/sigi/apps/servidores/models.py +++ b/sigi/apps/servidores/models.py @@ -4,7 +4,9 @@ from django.db.models.signals import post_save from django.contrib.contenttypes import generic from django.contrib.auth.models import User + class Subsecretaria(models.Model): + """ Modelo para representação das Subsecretarias do Interlegis """ @@ -19,7 +21,9 @@ class Subsecretaria(models.Model): def __unicode__(self): return '%s (%s)' % (unicode(self.nome), unicode(self.sigla)) + class Servico(models.Model): + """ Modelo para representação dos Serviços de uma Subsecretaria """ @@ -39,6 +43,7 @@ class Servico(models.Model): class Servidor(models.Model): + """ Modelo para representação de um Servidor. Um servidor pertence a um Serviço e uma Subsecretaria os campos @@ -82,7 +87,7 @@ class Servidor(models.Model): ) servico = models.ForeignKey('servidores.Servico', blank=True, null=True) matricula = models.CharField(u'matrícula', max_length=25, blank=True, null=True) - turno= models.CharField( + turno = models.CharField( max_length=1, choices=TURNO_CHOICES, blank=True, @@ -90,8 +95,8 @@ class Servidor(models.Model): ) de_fora = models.BooleanField(default=False) data_nomeacao = models.DateField(u'data de nomeação', blank=True, null=True) - ato_exoneracao = models.CharField(u'ato de exoneração',max_length=150, blank=True, null=True) - ato_numero = models.CharField(u'ato de exoneração',max_length=150, blank=True, null=True) + ato_exoneracao = models.CharField(u'ato de exoneração', max_length=150, blank=True, null=True) + ato_numero = models.CharField(u'ato de exoneração', max_length=150, blank=True, null=True) cpf = models.CharField('CPF', max_length=11, blank=True, null=True) rg = models.CharField('RG', max_length=25, blank=True, null=True) obs = models.TextField(u'observação', blank=True, null=True) @@ -108,22 +113,22 @@ class Servidor(models.Model): verbose_name_plural = 'servidores' def is_chefe(self): - """ Verifica se o servidor é chefe ou diretor - """ - pass + """ Verifica se o servidor é chefe ou diretor + """ + pass def data_entrada(self): - """ Verifica a data de entrada da função mais antiga - """ - pass + """ Verifica a data de entrada da função mais antiga + """ + pass def data_saida(self): - """ Verifica a data de saída da função mais recente - de um servidor desativado + """ Verifica a data de saída da função mais recente + de um servidor desativado - Caso o usuário esteja ativo retorna None - """ - pass + Caso o usuário esteja ativo retorna None + """ + pass @property def diagnosticos(self): @@ -147,16 +152,20 @@ User.servidor = property(lambda user: Servidor.objects.get(user=user)) # Sinal para ao criar um usuário criar um servidor # baseado no nome contino no LDAP + + def create_user_profile(sender, instance, created, **kwargs): if created: Servidor.objects.create( - user=instance, - nome_completo= "%s %s" % (instance.first_name, instance.last_name) - ) + user=instance, + nome_completo="%s %s" % (instance.first_name, instance.last_name) + ) post_save.connect(create_user_profile, sender=User) + class Funcao(models.Model): + """ Modelo para guardar o histórico de funções dos servidores no Interlegis """ @@ -167,10 +176,10 @@ class Funcao(models.Model): fim_funcao = models.DateField(u'fim da função', blank=True, null=True) descricao = models.TextField(u'descrição', blank=True, null=True) - bap_entrada = models.CharField('BAP de entrada',max_length=50, blank=True, null=True) + bap_entrada = models.CharField('BAP de entrada', max_length=50, blank=True, null=True) data_bap_entrada = models.DateField('data BAP de entrada', blank=True, null=True) - bap_saida = models.CharField(u'BAP de saída',max_length=50, blank=True, null=True) + bap_saida = models.CharField(u'BAP de saída', max_length=50, blank=True, null=True) data_bap_saida = models.DateField(u'data BAP de saída', blank=True, null=True) class Meta: @@ -182,6 +191,7 @@ class Funcao(models.Model): class Licenca(models.Model): + """ Modelo que representa as licenças tiradas pelos servidores """ servidor = models.ForeignKey(Servidor) @@ -194,14 +204,16 @@ class Licenca(models.Model): verbose_name_plural = u'licenças' def days(): - """ Calcula a quantidade de dias da licença - """ - pass + """ Calcula a quantidade de dias da licença + """ + pass def __unicode__(self): return str(self.id) + class Ferias(models.Model): + """ Modelo que representa as férias tiradas pelos servidores """ servidor = models.ForeignKey(Servidor) @@ -214,9 +226,9 @@ class Ferias(models.Model): verbose_name_plural = u'férias' def days(): - """ Calcula a quantidade de dias das férias - """ - pass + """ Calcula a quantidade de dias das férias + """ + pass def __unicode__(self): return str(self.id) diff --git a/sigi/apps/servidores/views.py b/sigi/apps/servidores/views.py index bef9289..ea88bcf 100644 --- a/sigi/apps/servidores/views.py +++ b/sigi/apps/servidores/views.py @@ -7,27 +7,28 @@ from django.db.models import Avg, Max, Min, Count from sigi.apps.servidores.models import Servidor, Funcao from sigi.shortcuts import render_to_pdf + def servidores_por_funcao(request): report = Funcao.objects.values('funcao').annotate(funcao__count=Count('funcao')).order_by('funcao__count') total = Funcao.objects.count() context = RequestContext(request, { - 'pagesize':'A4', - 'report': report, - 'total': total - }) + 'pagesize': 'A4', + 'report': report, + 'total': total + }) return render_to_pdf('servidores/servidores_por_funcao.html', context) + def servidores_por_cargo(request): report = Funcao.objects.values('cargo').annotate(cargo__count=Count('cargo')).order_by('cargo__count') total = Funcao.objects.count() context = RequestContext(request, { - 'pagesize':'A4', - 'report': report, - 'total': total - }) + 'pagesize': 'A4', + 'report': report, + 'total': total + }) return render_to_pdf('servidores/servidores_por_cargo.html', context) - diff --git a/sigi/apps/utils/__init__.py b/sigi/apps/utils/__init__.py index 769abaa..eac5367 100644 --- a/sigi/apps/utils/__init__.py +++ b/sigi/apps/utils/__init__.py @@ -3,7 +3,9 @@ from django.contrib import admin from django.db import models from unicodedata import normalize + class SearchField(models.TextField): + def pre_save(self, model_instance, add): search_text = [] for field_name in self.field_names: @@ -12,17 +14,20 @@ class SearchField(models.TextField): value = u' '.join(search_text) setattr(model_instance, self.name, value) return value + def __init__(self, field_names, *args, **kwargs): self.field_names = field_names kwargs['editable'] = False super(self.__class__, self).__init__(*args, **kwargs) + def to_ascii(txt, codif='utf-8'): if not isinstance(txt, basestring): txt = unicode(txt) if isinstance(txt, unicode): txt = txt.encode('utf-8') - return normalize('NFKD', txt.decode(codif)).encode('ASCII','ignore') + return normalize('NFKD', txt.decode(codif)).encode('ASCII', 'ignore') + def queryset_ascii(self, request): if 'q' in request.GET: diff --git a/sigi/apps/utils/admin_widgets.py b/sigi/apps/utils/admin_widgets.py index 3590a2b..db49889 100644 --- a/sigi/apps/utils/admin_widgets.py +++ b/sigi/apps/utils/admin_widgets.py @@ -2,15 +2,17 @@ from django.contrib.admin.widgets import AdminFileWidget from django.utils.translation import ugettext as _ from django.utils.safestring import mark_safe + class AdminImageWidget(AdminFileWidget): + def render(self, name, value, attrs=None): output = [] if value and getattr(value, "url", None): image_url = value.url - file_name=str(value) + file_name = str(value) output.append( u''' %s
    %s''' % \ + height="100" alt="%s"/>
    %s''' % (image_url, image_url, file_name, _('Change:'))) output.append(super(AdminFileWidget, self).render(name, value, attrs)) return mark_safe(u''.join(output)) diff --git a/sigi/apps/utils/alphabetic_filter.py b/sigi/apps/utils/alphabetic_filter.py index 22fef35..0551776 100644 --- a/sigi/apps/utils/alphabetic_filter.py +++ b/sigi/apps/utils/alphabetic_filter.py @@ -2,8 +2,9 @@ import string from django.contrib import admin + class AlphabeticFilter(admin.SimpleListFilter): - # Human-readable title which will be displayed in the + # Human-readable title which will be displayed in the # right admin sidebar just above the filter options. title = '' @@ -11,7 +12,7 @@ class AlphabeticFilter(admin.SimpleListFilter): parameter_name = '' def lookups(self, request, model_admin): - """ + """ Returns a list of tuples. The first element in each tuple is the coded value for the option that will appear in the URL query. The second element is the @@ -21,10 +22,10 @@ class AlphabeticFilter(admin.SimpleListFilter): return ((letter, letter,) for letter in string.ascii_uppercase) def queryset(self, request, queryset): - """ + """ Returns the filtered queryset based on the value provided in the query string and retrievable via `self.value()`. """ - if self.value(): - return queryset.filter( ( self.parameter_name + '__istartswith', self.value() ) ) \ No newline at end of file + if self.value(): + return queryset.filter((self.parameter_name + '__istartswith', self.value())) diff --git a/sigi/apps/utils/decorators.py b/sigi/apps/utils/decorators.py index 736d527..5ec215a 100644 --- a/sigi/apps/utils/decorators.py +++ b/sigi/apps/utils/decorators.py @@ -37,10 +37,10 @@ def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIE # If the login url is the same scheme and net location then just # use the path as the "next" url. login_scheme, login_netloc = urlparse.urlparse(login_url or - settings.LOGIN_URL)[:2] + settings.LOGIN_URL)[:2] current_scheme, current_netloc = urlparse.urlparse(path)[:2] if ((not login_scheme or login_scheme == current_scheme) and - (not login_netloc or login_netloc == current_netloc)): + (not login_netloc or login_netloc == current_netloc)): path = request.get_full_path() from django.contrib.auth.views import redirect_to_login return redirect_to_login(path, login_url, redirect_field_name) diff --git a/sigi/apps/utils/email.py b/sigi/apps/utils/email.py index 5ccda83..5a1e9cb 100644 --- a/sigi/apps/utils/email.py +++ b/sigi/apps/utils/email.py @@ -29,5 +29,5 @@ def enviar_email(from_email, subject, template, tags): # Enviando a mensagem email = EmailMessage(settings.EMAIL_SUBJECT_PREFIX + " " + subject, mensagem, - from_email, [from_email]) + from_email, [from_email]) email.send() diff --git a/sigi/context_processors.py b/sigi/context_processors.py index 8551a5a..1626fc4 100644 --- a/sigi/context_processors.py +++ b/sigi/context_processors.py @@ -28,7 +28,7 @@ def charts_data(request): 'tabela_resumo_diagnostico': tabela_resumo_diagnostico, 'dados_graficos_convenio_projeto': dados_graficos_convenio_projeto, 'metas': Meta.objects.all(), - } + } def busca_informacoes_camara(): @@ -69,7 +69,7 @@ def busca_informacoes_camara(): cabecalho_topo.append(projeto.sigla) lista_total.append(camaras.filter(convenio__projeto=projeto).count()) - lista_nao_aderidas.append(camaras.filter(convenio__in=conv_sem_adesao_proj).count() ) + lista_nao_aderidas.append(camaras.filter(convenio__in=conv_sem_adesao_proj).count()) lista_aderidas.append(camaras.filter(convenio__in=conv_com_adesao_proj).count()) lista_convenios_assinados.append(camaras.filter(convenio__in=conv_assinados_proj).count()) lista_convenios_em_andamento.append(camaras.filter(convenio__in=conv_em_andamento_proj).count()) @@ -104,7 +104,7 @@ def busca_informacoes_camara(): # Unindo as duas listass para que o cabecalho da esquerda fique junto com sua # respectiva linha - lista_zip = zip(cabecalho_esquerda,linhas) + lista_zip = zip(cabecalho_esquerda, linhas) # Retornando listas em forma de dicionario return { @@ -112,21 +112,21 @@ def busca_informacoes_camara(): u'lista_zip': lista_zip, u'total_camaras': camaras.count(), u'camaras_sem_processo': camaras_sem_processo.count(), - } + } def grafico_convenio_projeto(convenios): colors = cycle(['#7cb5ec', - '#434348', - '#90ed7d', - '#f7a35c', - '#8085e9', - '#f15c80', - '#e4d354', - '#8085e8', - '#8d4653', - '#91e8e1', ]) + '#434348', + '#90ed7d', + '#f7a35c', + '#8085e9', + '#f15c80', + '#e4d354', + '#8085e8', + '#8d4653', + '#91e8e1', ]) highlights = cycle(['#B0D3F4', '#8E8E91', @@ -180,4 +180,4 @@ def busca_informacoes_diagnostico(): return [ {'title': 'Diagnósticos digitados', 'count': Diagnostico.objects.count()}, {'title': 'Diagnósticos publicados', 'count': Diagnostico.objects.filter(publicado=True).count()}, - ] + ] diff --git a/sigi/shortcuts.py b/sigi/shortcuts.py index ddd7a15..0238e28 100644 --- a/sigi/shortcuts.py +++ b/sigi/shortcuts.py @@ -12,14 +12,14 @@ def fetch_resources(uri, rel): path = os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, "")) return path + def render_to_pdf(template_src, context_dict): template = get_template(template_src) context = Context(context_dict) - html = template.render(context) + html = template.render(context) result = StringIO.StringIO() pdf = pisa.pisaDocument(StringIO.StringIO(html.encode('utf-8')), result, link_callback=fetch_resources) if not pdf.err: return HttpResponse(result.getvalue(), mimetype='application/pdf') return HttpResponse('We had some errors
    %s
    ' % escape(html)) -