Browse Source

Codigo refatorado para seguir a pep8

autopep8 -r --in-place --exclude 'urls.py' --ignore E501 .
producao
Marcio Mazza 10 years ago
parent
commit
5cdd0a2dac
  1. 43
      etc/data/ibge/sigi-import-ibge-2009.py
  2. 51
      etc/migracao/migra.py
  3. 66
      sigi/apps/casas/admin.py
  4. 2
      sigi/apps/casas/forms.py
  5. 45
      sigi/apps/casas/models.py
  6. 427
      sigi/apps/casas/reports.py
  7. 64
      sigi/apps/casas/views.py
  8. 3
      sigi/apps/contatos/admin.py
  9. 8
      sigi/apps/contatos/filters.py
  10. 108
      sigi/apps/contatos/models.py
  11. 49
      sigi/apps/convenios/admin.py
  12. 15
      sigi/apps/convenios/models.py
  13. 194
      sigi/apps/convenios/reports.py
  14. 78
      sigi/apps/convenios/views.py
  15. 29
      sigi/apps/diagnosticos/admin.py
  16. 1
      sigi/apps/diagnosticos/decorators.py
  17. 33
      sigi/apps/diagnosticos/forms.py
  18. 14
      sigi/apps/diagnosticos/models.py
  19. 13
      sigi/apps/diagnosticos/templatetags/smart_if.py
  20. 16
      sigi/apps/diagnosticos/views.py
  21. 11
      sigi/apps/diagnosticos/widgets.py
  22. 1
      sigi/apps/financeiro/admin.py
  23. 2
      sigi/apps/financeiro/models.py
  24. 10
      sigi/apps/inventario/admin.py
  25. 6
      sigi/apps/inventario/models.py
  26. 15
      sigi/apps/mesas/admin.py
  27. 7
      sigi/apps/mesas/models.py
  28. 18
      sigi/apps/metas/admin.py
  29. 4
      sigi/apps/metas/management/commands/gera_map_data.py
  30. 13
      sigi/apps/metas/models.py
  31. 2
      sigi/apps/metas/templatetags/mapa_tags.py
  32. 42
      sigi/apps/metas/views.py
  33. 4
      sigi/apps/ocorrencias/admin.py
  34. 4
      sigi/apps/ocorrencias/models.py
  35. 17
      sigi/apps/parlamentares/admin.py
  36. 1
      sigi/apps/parlamentares/models.py
  37. 419
      sigi/apps/parlamentares/reports.py
  38. 29
      sigi/apps/parlamentares/views.py
  39. 48
      sigi/apps/relatorios/reports.py
  40. 25
      sigi/apps/servicos/admin.py
  41. 2
      sigi/apps/servicos/management/commands/atualiza_uso_servico.py
  42. 17
      sigi/apps/servicos/models.py
  43. 6
      sigi/apps/servicos/views.py
  44. 7
      sigi/apps/servidores/admin.py
  45. 3
      sigi/apps/servidores/forms.py
  46. 81
      sigi/apps/servidores/management/commands/migra.py
  47. 58
      sigi/apps/servidores/management/commands/sync_ldap.py
  48. 24
      sigi/apps/servidores/models.py
  49. 7
      sigi/apps/servidores/views.py
  50. 7
      sigi/apps/utils/__init__.py
  51. 6
      sigi/apps/utils/admin_widgets.py
  52. 3
      sigi/apps/utils/alphabetic_filter.py
  53. 4
      sigi/context_processors.py
  54. 2
      sigi/shortcuts.py

43
etc/data/ibge/sigi-import-ibge-2009.py

@ -1,40 +1,43 @@
import sys, csv import sys
import csv
""" """
""" """
_root_dict = None _root_dict = None
def getUFdict( root, ufid ):
return( root[ ufid ] )
def getCidadesDict( macrodict, microid ): def getUFdict(root, ufid):
return(root[ufid])
def getCidadesDict(macrodict, microid):
if macrodict = None: if macrodict = None:
return( None ) return(None)
microdoct = macrodict[ '__children' ] microdoct = macrodict['__children']
if microdict = None: if microdict = None:
microdict = {} microdict = {}
macrodict[ '__children' ] = microdict macrodict['__children'] = microdict
def main( ):
argc = len( sys.argv ) def main():
arquivo = open( 'geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/DTB_05_05_2009.csv', 'r' ) argc = len(sys.argv)
arquivo = open('geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/DTB_05_05_2009.csv', 'r')
# despreza o cabecalho # despreza o cabecalho
arquivo.readline( ) arquivo.readline()
lnum=0 lnum = 0
csv_reader = csv.reader( arquivo, delimiter=',', quotechar='"' ) csv_reader = csv.reader(arquivo, delimiter=',', quotechar='"')
for registro in csv_reader: for registro in csv_reader:
if uf[ registro[ 0 ] ] = None: if uf[registro[0]] = None:
uf[ registro[ 0 ] ] = {} uf[registro[0]] = {}
uf[ registro[ 0 ] ][ 'nome' ] = registro[ 1 ] uf[registro[0]]['nome'] = registro[1]
uf[ registro[ 0 ] ][ 'macrorregioes' ] = {} uf[registro[0]]['macrorregioes'] = {}
# print "lnum: %s - %s" % ( lnum, registro ) # print "lnum: %s - %s" % ( lnum, registro )
lnum = lnum + 1 lnum = lnum + 1
if lnum >= 10: if lnum >= 10:
break break
if __name__ = "__main__": if __name__ = "__main__":
main( ) main()
dumpdicts( ) dumpdicts()

51
etc/migracao/migra.py

@ -40,6 +40,7 @@ ERROR_MSG_1 = ('<ERRO> %s[%s]: erro ao inserir item, será necessário inserçã
'manual.') 'manual.')
OBS_CONVENIO = ('Convênio sem termo de adesão') OBS_CONVENIO = ('Convênio sem termo de adesão')
def migra_assembleias(filename): def migra_assembleias(filename):
# identificação das colunas nos arquivo CSV # identificação das colunas nos arquivo CSV
UF_COL = 5 UF_COL = 5
@ -62,13 +63,12 @@ def migra_assembleias(filename):
tipo_casa = TipoCasaLegislativa.objects.filter(sigla='AL').get() tipo_casa = TipoCasaLegislativa.objects.filter(sigla='AL').get()
for line in reader: for line in reader:
uf = UnidadeFederativa.objects.get(sigla=line[UF_COL]) uf = UnidadeFederativa.objects.get(sigla=line[UF_COL])
municipio = Municipio.objects.get(uf=uf, is_capital=True) municipio = Municipio.objects.get(uf=uf, is_capital=True)
aux_end = line[ENDERECO_COL].split('-') aux_end = line[ENDERECO_COL].split('-')
bairro = '' bairro = ''
if(aux_end.__len__()>1): if(aux_end.__len__() > 1):
bairro = aux_end[1].replace(' ', '', 1) bairro = aux_end[1].replace(' ', '', 1)
else: else:
bairro = '' bairro = ''
@ -140,7 +140,6 @@ def migra_casas(filename):
EMAIL_PRESIDENTE_COL = 43 EMAIL_PRESIDENTE_COL = 43
REPRESENTANTE_COL = 85 REPRESENTANTE_COL = 85
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True)
header = reader.next() header = reader.next()
tipo_casa = TipoCasaLegislativa.objects.filter(sigla='CM').get() tipo_casa = TipoCasaLegislativa.objects.filter(sigla='CM').get()
@ -160,7 +159,7 @@ def migra_casas(filename):
aux_end = line[ENDERECO_COL].split('-') aux_end = line[ENDERECO_COL].split('-')
bairro = '' bairro = ''
if(aux_end.__len__()>1): if(aux_end.__len__() > 1):
bairro = aux_end[1].replace(' ', '', 1) bairro = aux_end[1].replace(' ', '', 1)
casa = CasaLegislativa( casa = CasaLegislativa(
municipio=municipio, municipio=municipio,
@ -202,6 +201,7 @@ def migra_casas(filename):
representante = Contato(nome=line[REPRESENTANTE_COL], content_object=casa) representante = Contato(nome=line[REPRESENTANTE_COL], content_object=casa)
representante.save() representante.save()
def migra_cnpj(filename): def migra_cnpj(filename):
# identificação das colunas no arquivo CSV # identificação das colunas no arquivo CSV
COD_TSE_COL = 0 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.cnpj = line[COD_CNPJ1_COL] if not 'EM BRANCO' in line[COD_CNPJ1_COL] else line[COD_CNPJ2_COL]
casa.save() casa.save()
def migra_convenios_casas(filename): def migra_convenios_casas(filename):
def get_datetime_obj(data): def get_datetime_obj(data):
ldata = data.split('-') ldata = data.split('-')
@ -235,9 +236,6 @@ def migra_convenios_casas(filename):
return None return None
return datetime(int(ldata[0]), int(ldata[1]), int(ldata[2])) return datetime(int(ldata[0]), int(ldata[1]), int(ldata[2]))
# identificação das colunas no arquivo CSV # identificação das colunas no arquivo CSV
# No arquivo CSV colunas que contém _100 são do Programa Interlegis # No arquivo CSV colunas que contém _100 são do Programa Interlegis
COD_IBGE_COL = 1 COD_IBGE_COL = 1
@ -251,14 +249,13 @@ def migra_convenios_casas(filename):
DATA_PUB_DIARIO = 30 DATA_PUB_DIARIO = 30
DATA_DEV_VIA_CONV_CM = 32 DATA_DEV_VIA_CONV_CM = 32
DATA_ADESAO_100_COL = 11 DATA_ADESAO_100_COL = 11
DATA_TERMO_ACEITE_100_COL = 22 DATA_TERMO_ACEITE_100_COL = 22
NUM_CONVENIO_100_COL = 24 NUM_CONVENIO_100_COL = 24
NUM_PROCESSO_SF_100_COL = 25 NUM_PROCESSO_SF_100_COL = 25
DATA_RETORNO_ASSINATURA_100_COL = 29 DATA_RETORNO_ASSINATURA_100_COL = 29
DATA_PUB_DIARIO_100_COL = 31 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 #DATA_POSTAGEM_CORREIO_100 = 26
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True)
@ -266,9 +263,9 @@ def migra_convenios_casas(filename):
linenum = 1 linenum = 1
###Geração de arquivos para análise### ###Geração de arquivos para análise###
import codecs import codecs
f1 = codecs.open('file1.txt','w' , encoding="utf-8") f1 = codecs.open('file1.txt', 'w', encoding="utf-8")
f1.write(u'Casas que não tem Número Processo Senado Federal\n') 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') 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: 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. # 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 = '' obs = ''
projeto = None projeto = None
convenio1=None convenio1 = None
convenio2=None convenio2 = None
if line[DATA_ADESAO_COL]=='1001-01-01' and line[DATA_RETORNO_ASSINATURA].__len__()!=0: if line[DATA_ADESAO_COL] == '1001-01-01' and line[DATA_RETORNO_ASSINATURA].__len__() != 0:
line[DATA_ADESAO_COL] = line[DATA_RETORNO_ASSINATURA] line[DATA_ADESAO_COL] = line[DATA_RETORNO_ASSINATURA]
obs = OBS_CONVENIO 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) projeto = Projeto.objects.get(id=1)
if projeto: if projeto:
@ -314,17 +311,17 @@ def migra_convenios_casas(filename):
observacao=obs,) observacao=obs,)
###Relatório### ###Relatório###
if( (projeto or line[DATA_TERMO_ACEITE_COL]) and line[NUM_PROCESSO_SF_COL].__len__()==0): 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") f1.write(casa.nome + "," + casa.municipio.uf.sigla + "\n")
if(projeto==None and line[DATA_TERMO_ACEITE_COL].__len__()!=0): if(projeto == None and line[DATA_TERMO_ACEITE_COL].__len__() != 0):
f2.write(casa.nome+","+casa.municipio.uf.sigla+"\n") f2.write(casa.nome + "," + casa.municipio.uf.sigla + "\n")
###### ######
projeto=None projeto = None
obs = '' 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] line[DATA_ADESAO_100_COL] = line[DATA_RETORNO_ASSINATURA_100_COL]
obs = OBS_CONVENIO 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) projeto = Projeto.objects.get(id=2)
if projeto: if projeto:
@ -341,8 +338,10 @@ def migra_convenios_casas(filename):
) )
try: try:
if convenio1: convenio1.save() if convenio1:
if convenio2: convenio2.save() convenio1.save()
if convenio2:
convenio2.save()
except: except:
print "Erro ao inserir convênio" print "Erro ao inserir convênio"
print ERROR_MSG_0 % (filename, linenum) print ERROR_MSG_0 % (filename, linenum)
@ -350,6 +349,7 @@ def migra_convenios_casas(filename):
f1.close() f1.close()
f2.close() f2.close()
def migra_convenios_assembleias(filename): def migra_convenios_assembleias(filename):
def get_datetime_obj(data): def get_datetime_obj(data):
ldata = data.split('-') ldata = data.split('-')
@ -402,6 +402,7 @@ def migra_convenios_assembleias(filename):
print convenio print convenio
continue continue
def popula(): def popula():
""" """
Será preciso cadastrar no banco os seguintes Projeto: Será preciso cadastrar no banco os seguintes Projeto:
@ -425,8 +426,6 @@ def popula():
tipo3.save() tipo3.save()
if __name__ == '__main__': if __name__ == '__main__':
popula() popula()
print "<iniciando migração das assembléias legislativas>" print "<iniciando migração das assembléias legislativas>"

66
sigi/apps/casas/admin.py

@ -28,7 +28,7 @@ class TelefonesInline(generic.GenericTabularInline):
class PresidenteInline(admin.StackedInline): class PresidenteInline(admin.StackedInline):
model = Presidente model = Presidente
exclude = ['cargo','funcao'] exclude = ['cargo', 'funcao']
readonly_fields = ('ult_alteracao',) readonly_fields = ('ult_alteracao',)
extra = 1 extra = 1
max_num = 1 max_num = 1
@ -43,6 +43,7 @@ class FuncionariosInline(admin.StackedInline):
readonly_fields = ('ult_alteracao',) readonly_fields = ('ult_alteracao',)
extra = 1 extra = 1
inlines = (TelefonesInline,) inlines = (TelefonesInline,)
def get_queryset(self, request): def get_queryset(self, request):
return self.model.objects.exclude(cargo="Presidente") return self.model.objects.exclude(cargo="Presidente")
@ -50,15 +51,16 @@ class FuncionariosInline(admin.StackedInline):
class ConveniosInline(admin.StackedInline): class ConveniosInline(admin.StackedInline):
model = Convenio model = Convenio
fieldsets = ( 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_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',), ('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 extra = 0
def get_tramitacoes(self, obj): def get_tramitacoes(self, obj):
return '<br/>'.join([t.__unicode__() for t in obj.tramitacao_set.all()]) return '<br/>'.join([t.__unicode__() for t in obj.tramitacao_set.all()])
get_tramitacoes.short_description = 'Tramitações' get_tramitacoes.short_description = 'Tramitações'
@ -78,7 +80,7 @@ class ConveniosInline(admin.StackedInline):
if obj.pk is None: if obj.pk is None:
return "" return ""
from django.core.urlresolvers import reverse 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' url = url + '?_popup=1'
return """<input id="edit_convenio-%s" type="hidden"/> return """<input id="edit_convenio-%s" type="hidden"/>
<a id="lookup_edit_convenio-%s" href="%s" class="changelink" onclick="return showRelatedObjectLookupPopup(this)"> <a id="lookup_edit_convenio-%s" href="%s" class="changelink" onclick="return showRelatedObjectLookupPopup(this)">
@ -91,14 +93,14 @@ class ConveniosInline(admin.StackedInline):
class LegislaturaInline(admin.TabularInline): class LegislaturaInline(admin.TabularInline):
model = Legislatura model = Legislatura
fields = ['numero', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares', 'link_parlamentares',] fields = ['numero', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares', 'link_parlamentares', ]
readonly_fields = ['link_parlamentares',] readonly_fields = ['link_parlamentares', ]
def link_parlamentares(self, obj): def link_parlamentares(self, obj):
if obj.pk is None: if obj.pk is None:
return "" return ""
from django.core.urlresolvers import reverse 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' url = url + '?_popup=1'
return """<input id="edit_legislatura-%s" type="hidden"/> return """<input id="edit_legislatura-%s" type="hidden"/>
<a id="lookup_edit_legislatura-%s" href="%s" class="changelink" onclick="return showRelatedObjectLookupPopup(this)"> <a id="lookup_edit_legislatura-%s" href="%s" class="changelink" onclick="return showRelatedObjectLookupPopup(this)">
@ -111,8 +113,8 @@ class LegislaturaInline(admin.TabularInline):
class DiagnosticoInline(admin.TabularInline): class DiagnosticoInline(admin.TabularInline):
model = Diagnostico model = Diagnostico
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',] readonly_fields = ['data_visita_inicio', 'data_visita_fim', 'publicado', 'data_publicacao', 'responsavel', 'link_diagnostico', ]
extra = 0 extra = 0
max_num = 0 max_num = 0
can_delete = False can_delete = False
@ -121,7 +123,7 @@ class DiagnosticoInline(admin.TabularInline):
if obj.pk is None: if obj.pk is None:
return "" return ""
from django.core.urlresolvers import reverse 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 """<input id="edit_diagnostico-%s" type="hidden"/> return """<input id="edit_diagnostico-%s" type="hidden"/>
<a id="lookup_edit_diagnostico-%s" href="%s" class="button" target="_blank"> <a id="lookup_edit_diagnostico-%s" href="%s" class="button" target="_blank">
Abrir PDF Abrir PDF
@ -161,13 +163,13 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
form = CasaLegislativaForm form = CasaLegislativaForm
change_form_template = 'casas/change_form.html' change_form_template = 'casas/change_form.html'
change_list_template = 'casas/change_list.html' change_list_template = 'casas/change_list.html'
actions = ['adicionar_casas',] actions = ['adicionar_casas', ]
inlines = (TelefonesInline, PresidenteInline, FuncionariosInline, ConveniosInline, LegislaturaInline, inlines = (TelefonesInline, PresidenteInline, FuncionariosInline, ConveniosInline, LegislaturaInline,
DiagnosticoInline, BemInline, ServicoInline, PlanoDiretorInline, OcorrenciaInline, ) 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_display_links = ('nome',)
list_filter = ('tipo', 'municipio__uf__nome', 'convenio__projeto') list_filter = ('tipo', 'municipio__uf__nome', 'convenio__projeto')
ordering = ('nome','municipio__uf') ordering = ('nome', 'municipio__uf')
queyrset = queryset_ascii queyrset = queryset_ascii
fieldsets = ( fieldsets = (
(None, { (None, {
@ -175,7 +177,7 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
}), }),
('Endereço', { ('Endereço', {
'fields': ('data_instalacao', 'logradouro', 'bairro', 'fields': ('data_instalacao', 'logradouro', 'bairro',
'municipio', 'cep', 'pagina_web','email', 'ult_alt_endereco'), 'municipio', 'cep', 'pagina_web', 'email', 'ult_alt_endereco'),
}), }),
('Outras informações', { ('Outras informações', {
'classes': ('collapse',), 'classes': ('collapse',),
@ -183,15 +185,15 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
}), }),
) )
raw_id_fields = ('municipio',) raw_id_fields = ('municipio',)
readonly_fields = ['num_parlamentares',] readonly_fields = ['num_parlamentares', ]
search_fields = ('search_text','cnpj', 'bairro', 'logradouro', search_fields = ('search_text', 'cnpj', 'bairro', 'logradouro',
'cep', 'municipio__nome', 'municipio__uf__nome', 'cep', 'municipio__nome', 'municipio__uf__nome',
'municipio__codigo_ibge', 'pagina_web', 'observacoes') 'municipio__codigo_ibge', 'pagina_web', 'observacoes')
def get_convenios(self, obj): def get_convenios(self, obj):
return '<ul>' + ''.join(['<li>%s</li>' % c.__unicode__() for c in obj.convenio_set.all()]) + '</ul>' return '<ul>' + ''.join(['<li>%s</li>' % c.__unicode__() for c in obj.convenio_set.all()]) + '</ul>'
get_convenios.short_description = u'Convênios' 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): def changelist_view(self, request, extra_context=None):
return super(CasaLegislativaAdmin, self).changelist_view( return super(CasaLegislativaAdmin, self).changelist_view(
@ -203,45 +205,43 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
return super(CasaLegislativaAdmin, self).lookup_allowed(lookup, value) or \ return super(CasaLegislativaAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['municipio__uf__codigo_ibge__exact', 'convenio__projeto__id__exact'] lookup in ['municipio__uf__codigo_ibge__exact', 'convenio__projeto__id__exact']
def etiqueta(self, request, queryset):
def etiqueta(self,request,queryset): return labels_report(request, queryset=queryset)
return labels_report(request,queryset=queryset)
etiqueta.short_description = "Gerar etiqueta(s) da(s) casa(s) selecionada(s)" etiqueta.short_description = "Gerar etiqueta(s) da(s) casa(s) selecionada(s)"
def etiqueta_sem_presidente(self,request,queryset): def etiqueta_sem_presidente(self, request, queryset):
return labels_report_sem_presidente(request,queryset=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)" etiqueta_sem_presidente.short_description = "Gerar etiqueta(s) sem presidente da(s) casa(s) selecionada(s)"
def relatorio(self,request,queryset): def relatorio(self, request, queryset):
return report(request,queryset=queryset) return report(request, queryset=queryset)
relatorio.short_description = u"Exportar a(s) casa(s) selecionada(s) para PDF" relatorio.short_description = u"Exportar a(s) casa(s) selecionada(s) para PDF"
def relatorio_completo(self,request,queryset): def relatorio_completo(self, request, queryset):
return report_complete(request,queryset=queryset) return report_complete(request, queryset=queryset)
relatorio_completo.short_description = u"Gerar relatório completo da(s) casa(s) selecionada(s)" 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) return export_csv(request)
relatorio_csv.short_description = u"Exportar casa(s) selecionada(s) para CSV" relatorio_csv.short_description = u"Exportar casa(s) selecionada(s) para CSV"
def adicionar_casas(self, request, queryset): def adicionar_casas(self, request, queryset):
if 'carrinho_casas' in request.session: 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']) q1 = len(request.session['carrinho_casas'])
else: else:
q1 = 0 q1 = 0
response = adicionar_casas_carrinho(request,queryset=queryset) response = adicionar_casas_carrinho(request, queryset=queryset)
q2 = len(request.session['carrinho_casas']) q2 = len(request.session['carrinho_casas'])
quant = q2 - q1 quant = q2 - q1
if quant: 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: 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('.') return HttpResponseRedirect('.')
adicionar_casas.short_description = u"Armazenar casas no carrinho para exportar" adicionar_casas.short_description = u"Armazenar casas no carrinho para exportar"
def get_actions(self, request): def get_actions(self, request):
actions = super(CasaLegislativaAdmin, self).get_actions(request) actions = super(CasaLegislativaAdmin, self).get_actions(request)
if 'delete_selected' in actions: if 'delete_selected' in actions:

2
sigi/apps/casas/forms.py

@ -5,7 +5,7 @@ from sigi.apps.casas.models import CasaLegislativa
class CasaLegislativaForm(forms.ModelForm): class CasaLegislativaForm(forms.ModelForm):
#cnpj = BRCNPJField( # cnpj = BRCNPJField(
# label='CNPJ', # label='CNPJ',
# required=False, # required=False,
# help_text='Utilize o formato <em>XX.XXX.XXX/XXXX-XX</em> ou ' # help_text='Utilize o formato <em>XX.XXX.XXX/XXXX-XX</em> ou '

45
sigi/apps/casas/models.py

@ -9,7 +9,9 @@ from django.contrib.contenttypes import generic
from sigi.apps.utils import SearchField from sigi.apps.utils import SearchField
from sigi.apps.servidores.models import Servidor from sigi.apps.servidores.models import Servidor
class TipoCasaLegislativa(models.Model): class TipoCasaLegislativa(models.Model):
""" Modelo para representar o tipo da Casa Legislativa """ Modelo para representar o tipo da Casa Legislativa
Geralmente: Câmara Municipal, Assembléia Legislativa, Geralmente: Câmara Municipal, Assembléia Legislativa,
@ -22,11 +24,13 @@ class TipoCasaLegislativa(models.Model):
nome = models.CharField( nome = models.CharField(
max_length=100 max_length=100
) )
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class CasaLegislativa(models.Model): class CasaLegislativa(models.Model):
""" Modelo para representar uma Casa Legislativa """ Modelo para representar uma Casa Legislativa
""" """
nome = models.CharField( nome = models.CharField(
@ -144,11 +148,11 @@ class CasaLegislativa(models.Model):
return codigo return codigo
# Se já existe, então trata a Assembleia como uma Casa qualquer. # 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.upper().strip()
cityName = cityName.replace(' DA ',' ') cityName = cityName.replace(' DA ', ' ')
cityName = cityName.replace(' DE ',' ') cityName = cityName.replace(' DE ', ' ')
cityName = cityName.replace(' DO ',' ') cityName = cityName.replace(' DO ', ' ')
# estratégia 1 - Pegar as 1ª letra de cada nome da cidade # 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]])
@ -179,8 +183,8 @@ class CasaLegislativa(models.Model):
# três primeiras consoantes. # três primeiras consoantes.
if CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() > 0: if CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() > 0:
codigo_cons = cityName.replace('A','').replace('E','').\ codigo_cons = cityName.replace('A', '').replace('E', '').\
replace('I','').replace('O','').replace('U','')[:3] replace('I', '').replace('O', '').replace('U', '')[:3]
if len(codigo_cons) == 3 and \ 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 codigo = codigo_cons
@ -243,22 +247,24 @@ class CasaLegislativa(models.Model):
return super(CasaLegislativa, self).save(*args, **kwargs) return super(CasaLegislativa, self).save(*args, **kwargs)
class Funcionario(models.Model): class Funcionario(models.Model):
""" Modelo para registrar contatos vinculados às """ Modelo para registrar contatos vinculados às
Casas Legislativas Casas Legislativas
""" """
SETOR_CHOICES = [ SETOR_CHOICES = [
("presidente","Presidente"), ("presidente", "Presidente"),
("contato_interlegis","Contato Interlegis"), ("contato_interlegis", "Contato Interlegis"),
("infraestrutura_fisica","Infraestrutura Física"), ("infraestrutura_fisica", "Infraestrutura Física"),
("estrutura_de_ti","Estrutura de TI"), ("estrutura_de_ti", "Estrutura de TI"),
("organizacao_do_processo_legislativo","Organização do Processo Legislativo"), ("organizacao_do_processo_legislativo", "Organização do Processo Legislativo"),
("producao_legislativa","Produção Legislativa"), ("producao_legislativa", "Produção Legislativa"),
("estrutura_de_comunicacao_social","Estrutura de Comunicação Social"), ("estrutura_de_comunicacao_social", "Estrutura de Comunicação Social"),
("estrutura_de_recursos_humanos","Estrutura de Recursos Humanos"), ("estrutura_de_recursos_humanos", "Estrutura de Recursos Humanos"),
("gestao","Gestão"), ("gestao", "Gestão"),
("outros","Outros"), ("outros", "Outros"),
] ]
SEXO_CHOICES = [ SEXO_CHOICES = [
("M", "Masculino"), ("M", "Masculino"),
@ -275,7 +281,7 @@ class Funcionario(models.Model):
endereco = generic.GenericRelation('contatos.Endereco') endereco = generic.GenericRelation('contatos.Endereco')
cargo = models.CharField(max_length=100, null=True, blank=True) cargo = models.CharField(max_length=100, null=True, blank=True)
funcao = models.CharField(u'função', 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) 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) ult_alteracao = models.DateTimeField(u'Última alteração', null=True, blank=True, editable=True, auto_now=False)
@ -287,13 +293,17 @@ class Funcionario(models.Model):
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class PresidenteManager(models.Manager): class PresidenteManager(models.Manager):
def get_queryset(self): def get_queryset(self):
qs = super(PresidenteManager, self).get_queryset() qs = super(PresidenteManager, self).get_queryset()
qs = qs.filter(setor='presidente') qs = qs.filter(setor='presidente')
return qs return qs
class Presidente(Funcionario): class Presidente(Funcionario):
class Meta: class Meta:
proxy = True proxy = True
@ -304,4 +314,3 @@ class Presidente(Funcionario):
self.cargo = 'Presidente' self.cargo = 'Presidente'
self.funcao = 'Presidente' self.funcao = 'Presidente'
return super(Presidente, self).save(*args, **kwargs) return super(Presidente, self).save(*args, **kwargs)

427
sigi/apps/casas/reports.py

@ -3,7 +3,7 @@ from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm from reportlab.lib.units import cm
from reportlab.lib.enums import TA_CENTER, TA_RIGHT from reportlab.lib.enums import TA_CENTER, TA_RIGHT
from geraldo import Report, DetailBand, Label, ObjectValue, ManyElements, \ 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.apps.relatorios.reports import ReportDefault
from sigi.settings import STATICFILES_DIRS from sigi.settings import STATICFILES_DIRS
@ -11,25 +11,26 @@ from sigi.settings import STATICFILES_DIRS
from geraldo.graphics import Image from geraldo.graphics import Image
def string_to_cm(texto): def string_to_cm(texto):
tamanho = 0 tamanho = 0
minEspeciais = { minEspeciais = {
'f':0.1, 'f': 0.1,
'i':0.05, 'i': 0.05,
'j':0.05, 'j': 0.05,
'l':0.05, 'l': 0.05,
'm':0.2, 'm': 0.2,
'r':0.1, 'r': 0.1,
't':0.15, 't': 0.15,
} }
maiuEspeciais = { maiuEspeciais = {
'I':0.05, 'I': 0.05,
'J':0.15, 'J': 0.15,
'L':0.15, 'L': 0.15,
'P':0.15, 'P': 0.15,
} }
for c in texto: for c in texto:
if c > 'a' and c<'z': if c > 'a' and c < 'z':
if c in minEspeciais: if c in minEspeciais:
tamanho += minEspeciais[c] tamanho += minEspeciais[c]
else: else:
@ -42,8 +43,8 @@ def string_to_cm(texto):
return tamanho return tamanho
class CasasLegislativasLabels(Report): class CasasLegislativasLabels(Report):
""" """
Usage example:: Usage example::
@ -68,20 +69,20 @@ class CasasLegislativasLabels(Report):
self.page_size = A4 self.page_size = A4
if formato == '3x9_etiqueta': if formato == '3x9_etiqueta':
self.margin_top = 0.25*cm self.margin_top = 0.25 * cm
self.margin_bottom = 0.0*cm self.margin_bottom = 0.0 * cm
self.margin_left = 0.2*cm self.margin_left = 0.2 * cm
self.margin_right = 0.0*cm self.margin_right = 0.0 * cm
self.delta = 0.3 self.delta = 0.3
self.start = 0 self.start = 0
self.label_margin_top = 0.35 self.label_margin_top = 0.35
self.label_margin_left = 0.4 self.label_margin_left = 0.4
self.label_margin_right = 0.2 self.label_margin_right = 0.2
else: else:
self.margin_top = 0.8*cm self.margin_top = 0.8 * cm
self.margin_bottom = 0.8*cm self.margin_bottom = 0.8 * cm
self.margin_left = 0.4*cm self.margin_left = 0.4 * cm
self.margin_right = 0.4*cm self.margin_right = 0.4 * cm
self.largura_etiqueta = 9.9 self.largura_etiqueta = 9.9
self.altura_etiqueta = 5.6 self.altura_etiqueta = 5.6
self.tamanho_fonte = 11 self.tamanho_fonte = 11
@ -89,10 +90,10 @@ class CasasLegislativasLabels(Report):
self.label_margin_left = 0.5 self.label_margin_left = 0.5
self.label_margin_right = 0.5 self.label_margin_right = 0.5
calc_width = (self.largura_etiqueta-self.label_margin_left-self.label_margin_right)*cm calc_width = (self.largura_etiqueta - self.label_margin_left - self.label_margin_right) * cm
calc_height = lambda rows: (self.delta*rows)*cm calc_height = lambda rows: (self.delta * rows) * cm
calc_top = lambda row: (self.label_margin_top+row*self.delta)*cm calc_top = lambda row: (self.label_margin_top + row * self.delta) * cm
calc_left = self.label_margin_left*cm calc_left = self.label_margin_left * cm
my_elements = [ my_elements = [
Label( Label(
@ -126,21 +127,22 @@ class CasasLegislativasLabels(Report):
), ),
] ]
self.band_detail = DetailBand( self.band_detail = DetailBand(
width=(self.largura_etiqueta)*cm, width=(self.largura_etiqueta) * cm,
height=(self.altura_etiqueta)*cm, height=(self.altura_etiqueta) * cm,
elements=my_elements, elements=my_elements,
display_inline=True, display_inline=True,
default_style={'fontName': 'Helvetica', 'fontSize': self.tamanho_fonte}) default_style={'fontName': 'Helvetica', 'fontSize': self.tamanho_fonte})
class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels): class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
def __init__(self, queryset, formato): def __init__(self, queryset, formato):
super(CasasLegislativasLabelsSemPresidente, self).__init__(queryset=queryset, formato=formato) super(CasasLegislativasLabelsSemPresidente, self).__init__(queryset=queryset, formato=formato)
calc_width = (self.largura_etiqueta-self.label_margin_left-self.label_margin_right)*cm calc_width = (self.largura_etiqueta - self.label_margin_left - self.label_margin_right) * cm
calc_height = lambda rows: (self.delta*rows)*cm calc_height = lambda rows: (self.delta * rows) * cm
calc_top = lambda row: (self.label_margin_top+row*self.delta)*cm calc_top = lambda row: (self.label_margin_top + row * self.delta) * cm
calc_left = self.label_margin_left*cm calc_left = self.label_margin_left * cm
my_elements = [ my_elements = [
Label( Label(
@ -168,8 +170,8 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
), ),
] ]
self.band_detail = DetailBand( self.band_detail = DetailBand(
width=(self.largura_etiqueta)*cm, width=(self.largura_etiqueta) * cm,
height=(self.altura_etiqueta)*cm, height=(self.altura_etiqueta) * cm,
elements=my_elements, elements=my_elements,
display_inline=True, display_inline=True,
default_style={'fontName': 'Helvetica', 'fontSize': self.tamanho_fonte}) default_style={'fontName': 'Helvetica', 'fontSize': self.tamanho_fonte})
@ -177,103 +179,101 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
class CasasLegislativasReport(ReportDefault): class CasasLegislativasReport(ReportDefault):
title = u'Relatório de Casas Legislativas' title = u'Relatório de Casas Legislativas'
height = 80*cm height = 80 * cm
page_size = landscape(A4) page_size = landscape(A4)
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top 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 = list(ReportDefault.band_page_header.elements)
elements = [ elements = [
Image(filename= '%s/img/logo-interlegis.jpg' % STATICFILES_DIRS, Image(filename='%s/img/logo-interlegis.jpg' % STATICFILES_DIRS,
left=23.5*cm,right=1*cm,top=0.1*cm,bottom=1*cm, left=23.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=4.2*cm,height=3*cm, width=4.2 * cm, height=3 * cm,
), ),
Image(filename= '%s/img/logo-senado.png' % STATICFILES_DIRS, Image(filename='%s/img/logo-senado.png' % STATICFILES_DIRS,
left=1*cm,right=1*cm,top=0.1*cm,bottom=1*cm, left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=3*cm,height=3*cm, width=3 * cm, height=3 * cm,
), ),
Label(text="SENADO FEDERAL",top=1*cm,left=0,width=BAND_WIDTH, Label(text="SENADO FEDERAL", top=1 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} 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, 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} style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER}
), ),
SystemField( SystemField(
expression='%(report_title)s',top=2.5*cm,left=0,width=BAND_WIDTH, expression='%(report_title)s', top=2.5 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}
), ),
Label( Label(
text="UF", text="UF",
left=label_left[0]*cm, left=label_left[0] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text="Municipio", text="Municipio",
left=label_left[1]*cm, left=label_left[1] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text="Presidente", text="Presidente",
left=label_left[2]*cm, left=label_left[2] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text="Endereço", text="Endereço",
left=label_left[3]*cm, left=label_left[3] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text="Endereço na Internet", text="Endereço na Internet",
left=label_left[4]*cm, left=label_left[4] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text="Email", text="Email",
left=label_left[5]*cm, left=label_left[5] * cm,
top=label_top, top=label_top,
), ),
] ]
class band_page_footer(ReportDefault.band_page_footer): class band_page_footer(ReportDefault.band_page_footer):
pass pass
class band_detail(ReportDefault.band_detail): 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( ObjectValue(
attribute_name='municipio.uf.sigla', attribute_name='municipio.uf.sigla',
left=label_left[0]*cm, left=label_left[0] * cm,
width=1*cm, width=1 * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='municipio.nome', attribute_name='municipio.nome',
left=label_left[1]*cm, left=label_left[1] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='presidente', attribute_name='presidente',
left=label_left[2]*cm, left=label_left[2] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='logradouro', attribute_name='logradouro',
left=label_left[3]*cm, left=label_left[3] * cm,
get_value=lambda instance: instance.logradouro + ' - '+ instance.bairro, get_value=lambda instance: instance.logradouro + ' - ' + instance.bairro,
), ),
ObjectValue( ObjectValue(
attribute_name='pagina_web', attribute_name='pagina_web',
left=label_left[4]*cm, left=label_left[4] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='email', attribute_name='email',
left=label_left[5]*cm, left=label_left[5] * cm,
), ),
] ]
@ -281,8 +281,8 @@ class CasasLegislativasReport(ReportDefault):
groups = [ groups = [
ReportGroup(attribute_name='municipio.uf', ReportGroup(attribute_name='municipio.uf',
band_header=ReportBand( band_header=ReportBand(
height=0.7*cm, height=0.7 * cm,
elements= [ elements=[
ObjectValue(attribute_name='municipio.uf') ObjectValue(attribute_name='municipio.uf')
], ],
borders={'top': True}, borders={'top': True},
@ -294,276 +294,279 @@ class CasasLegislativasReport(ReportDefault):
class CasasSemConvenioReport(CasasLegislativasReport): class CasasSemConvenioReport(CasasLegislativasReport):
title = u'Relatório de Casas Legislativas sem Convênio' title = u'Relatório de Casas Legislativas sem Convênio'
class InfoCasaLegislativa(ReportDefault): class InfoCasaLegislativa(ReportDefault):
title = u'Casa legislativa' title = u'Casa legislativa'
class band_summary(ReportBand): class band_summary(ReportBand):
pass pass
class band_page_footer(ReportBand): class band_page_footer(ReportBand):
height = 1*cm height = 1 * cm
elements = [ 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): class band_detail(ReportDefault.band_detail):
posicao_left = [ posicao_left = [
0,1.3, #Tipo 0, 1.3, # Tipo
0,1.8, #Regiao 0, 1.8, # Regiao
5.5,6.8, #U.F. 5.5, 6.8, # U.F.
0,2.3, #Municipio 0, 2.3, # Municipio
0,2.4, #Endereco 0, 2.4, # Endereco
0,1.6, #Bairro 0, 1.6, # Bairro
0,1.3, #CEP 0, 1.3, # CEP
0,1.6, #CNPJ 0, 1.6, # CNPJ
0,2.3, #Telefone 0, 2.3, # Telefone
0,2.7, #Presidente 0, 2.7, # Presidente
] ]
posicao_top = [ posicao_top = [
0.5, #Tipo 0.5, # Tipo
1.3, #Regiao 1.3, # Regiao
1.3, #U.F. 1.3, # U.F.
2.1, #Municipio 2.1, # Municipio
2.9, #Logradouro 2.9, # Logradouro
3.7, #Bairro 3.7, # Bairro
4.5, #CEP 4.5, # CEP
5.3, #CNPJ 5.3, # CNPJ
6.1, #Telefone 6.1, # Telefone
6.9, #Presidente 6.9, # Presidente
] ]
height=30*cm height = 30 * cm
display_inline = True display_inline = True
default_style = {'fontName': 'Helvetica', 'fontSize':14} default_style = {'fontName': 'Helvetica', 'fontSize': 14}
elements = [ elements = [
Label( Label(
text="Tipo: ", text="Tipo: ",
left=posicao_left[0]*cm, left=posicao_left[0] * cm,
top=posicao_top[0]*cm, top=posicao_top[0] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='tipo.nome', attribute_name='tipo.nome',
left=posicao_left[1]*cm, left=posicao_left[1] * cm,
top=posicao_top[0]*cm, top=posicao_top[0] * cm,
width=6*cm, width=6 * cm,
), ),
Label( Label(
text="Região: ", text="Região: ",
left=posicao_left[2]*cm, left=posicao_left[2] * cm,
top=posicao_top[1]*cm, top=posicao_top[1] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='municipio.uf.regiao', attribute_name='municipio.uf.regiao',
left=posicao_left[3]*cm, left=posicao_left[3] * cm,
top=posicao_top[1]*cm, top=posicao_top[1] * cm,
get_value=lambda instance: get_value=lambda instance:
{'SL': 'Sul','SD': 'Sudeste','CO': 'Centro-Oeste','NE': 'Nordeste','NO': 'Norte',} {'SL': 'Sul', 'SD': 'Sudeste', 'CO': 'Centro-Oeste', 'NE': 'Nordeste', 'NO': 'Norte', }
[instance.municipio.uf.regiao] [instance.municipio.uf.regiao]
), ),
Label( Label(
text="U.F.: ", text="U.F.: ",
left=posicao_left[4]*cm, left=posicao_left[4] * cm,
top=posicao_top[2]*cm, top=posicao_top[2] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='municipio.uf', attribute_name='municipio.uf',
left=posicao_left[5]*cm, left=posicao_left[5] * cm,
top=posicao_top[2]*cm, top=posicao_top[2] * cm,
), ),
Label( Label(
text="Município: ", text="Município: ",
left=posicao_left[6]*cm, left=posicao_left[6] * cm,
top=posicao_top[3]*cm, top=posicao_top[3] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='municipio.nome', attribute_name='municipio.nome',
left=posicao_left[7]*cm, left=posicao_left[7] * cm,
top=posicao_top[3]*cm, top=posicao_top[3] * cm,
width=20*cm, width=20 * cm,
), ),
# Linha 3 # Linha 3
Label( Label(
text="Endereço: ", text="Endereço: ",
left=posicao_left[8]*cm, left=posicao_left[8] * cm,
top=posicao_top[4]*cm, top=posicao_top[4] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='logradouro', attribute_name='logradouro',
left=posicao_left[9]*cm, left=posicao_left[9] * cm,
top=posicao_top[4]*cm, top=posicao_top[4] * cm,
width=20*cm, width=20 * cm,
), ),
Label( Label(
text="Bairro: ", text="Bairro: ",
left=posicao_left[10]*cm, left=posicao_left[10] * cm,
top=posicao_top[5]*cm, top=posicao_top[5] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='bairro', attribute_name='bairro',
left=posicao_left[11]*cm, left=posicao_left[11] * cm,
top=posicao_top[5]*cm, top=posicao_top[5] * cm,
), ),
Label( Label(
text="CEP: ", text="CEP: ",
left=posicao_left[12]*cm, left=posicao_left[12] * cm,
top=posicao_top[6]*cm, top=posicao_top[6] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='cep', attribute_name='cep',
left=posicao_left[13]*cm, left=posicao_left[13] * cm,
top=posicao_top[6]*cm, top=posicao_top[6] * cm,
), ),
Label( Label(
text="CNPJ: ", text="CNPJ: ",
left=posicao_left[14]*cm, left=posicao_left[14] * cm,
top=posicao_top[7]*cm, top=posicao_top[7] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='cnpj', attribute_name='cnpj',
left=posicao_left[15]*cm, left=posicao_left[15] * cm,
top=posicao_top[7]*cm, top=posicao_top[7] * cm,
), ),
Label( Label(
text="Telefone: ", text="Telefone: ",
left=posicao_left[16]*cm, left=posicao_left[16] * cm,
top=posicao_top[8]*cm, top=posicao_top[8] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='telefone', attribute_name='telefone',
left=posicao_left[17]*cm, left=posicao_left[17] * cm,
top=posicao_top[8]*cm, top=posicao_top[8] * cm,
), ),
Label( Label(
text="Presidente: ", text="Presidente: ",
left=posicao_left[18]*cm, left=posicao_left[18] * cm,
top=posicao_top[9]*cm, top=posicao_top[9] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='presidente', attribute_name='presidente',
left=posicao_left[19]*cm, left=posicao_left[19] * cm,
top=posicao_top[9]*cm, top=posicao_top[9] * cm,
width=20*cm, width=20 * cm,
), ),
] ]
# Telefones # Telefones
tel_top = 2*cm tel_top = 2 * cm
tel_left = [0,3,5] tel_left = [0, 3, 5]
# Contato # Contato
cont_top = 2*cm cont_top = 2 * cm
cont_left = [0,6,9] cont_left = [0, 6, 9]
# Convenios # Convenios
convenio_top = 2*cm convenio_top = 2 * cm
convenio_left = [0,1.8,4.5,8,10.5,13,15.5,18] convenio_left = [0, 1.8, 4.5, 8, 10.5, 13, 15.5, 18]
subreports = [ subreports = [
# Telefones # Telefones
SubReport( SubReport(
queryset_string = '%(object)s.telefones.all()', queryset_string='%(object)s.telefones.all()',
band_header = ReportBand( band_header=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':12 }, default_style={'fontName': 'Helvetica', 'fontSize': 12},
height=2.5*cm, height=2.5 * cm,
elements = [ elements=[
Label( Label(
text="Telefone(s)", text="Telefone(s)",
style = {'fontSize':14,'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1*cm, top=1 * cm,
), ),
Label(text="Número",left=tel_left[0]*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="Tipo", left=tel_left[1] * cm, top=tel_top),
Label(text="Nota",left=tel_left[2]*cm,top=tel_top), Label(text="Nota", left=tel_left[2] * cm, top=tel_top),
], ],
borders = {'bottom': True}, borders={'bottom': True},
), ),
band_detail = ReportBand( band_detail=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':11}, default_style={'fontName': 'Helvetica', 'fontSize': 11},
height=0.5*cm, height=0.5 * cm,
elements= [ elements=[
ObjectValue(attribute_name='__unicode__',left=tel_left[0]*cm), ObjectValue(attribute_name='__unicode__', left=tel_left[0] * cm),
ObjectValue(attribute_name='tipo',left=tel_left[1]*cm, ObjectValue(attribute_name='tipo', left=tel_left[1] * cm,
get_value = lambda instance: get_value=lambda instance:
{'F':'Fixo','M':u'Móvel','X':'Fax','I':'Indefinido'}[instance.tipo], {'F': 'Fixo', 'M': u'Móvel', 'X': 'Fax', 'I': 'Indefinido'}[instance.tipo],
), ),
ObjectValue(attribute_name='nota',left=tel_left[2]*cm), ObjectValue(attribute_name='nota', left=tel_left[2] * cm),
], ],
#borders = {'all':True}, #borders = {'all':True},
), ),
), ),
#Contatos # Contatos
SubReport( SubReport(
queryset_string = '%(object)s.funcionario_set.all()', queryset_string='%(object)s.funcionario_set.all()',
band_header = ReportBand( band_header=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':12 }, default_style={'fontName': 'Helvetica', 'fontSize': 12},
height=2.5*cm, height=2.5 * cm,
elements = [ elements=[
Label( Label(
text="Contato(s)", text="Contato(s)",
style = {'fontSize':14,'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1*cm, top=1 * cm,
), ),
Label(text="Nome",left=cont_left[0]*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="Nota", left=cont_left[1] * cm, top=cont_top),
Label(text="E-mail",left=cont_left[2]*cm,top=cont_top), Label(text="E-mail", left=cont_left[2] * cm, top=cont_top),
], ],
borders = {'bottom': True,'top':True}, borders={'bottom': True, 'top': True},
), ),
band_detail = ReportBand( band_detail=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':11}, default_style={'fontName': 'Helvetica', 'fontSize': 11},
height=0.5*cm, height=0.5 * cm,
elements= [ elements=[
ObjectValue(attribute_name='nome',left=cont_left[0]*cm), ObjectValue(attribute_name='nome', left=cont_left[0] * cm),
ObjectValue(attribute_name='nota',left=cont_left[1]*cm), ObjectValue(attribute_name='nota', left=cont_left[1] * cm),
ObjectValue(attribute_name='email',left=cont_left[2]*cm), ObjectValue(attribute_name='email', left=cont_left[2] * cm),
], ],
#borders = {'all':True}, #borders = {'all':True},
), ),
), ),
#Convenios # Convenios
SubReport( SubReport(
queryset_string = '%(object)s.convenio_set.all()', queryset_string='%(object)s.convenio_set.all()',
band_header = ReportBand( band_header=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':12 }, default_style={'fontName': 'Helvetica', 'fontSize': 12},
height=2.5*cm, height=2.5 * cm,
elements=[ elements=[
Label( Label(
text="Convênio(s)", text="Convênio(s)",
style = {'fontSize':14,'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1*cm, top=1 * cm,
), ),
Label(text="Projeto",left=convenio_left[0]*cm,top=convenio_top), 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º Convenio", left=convenio_left[1] * cm, top=convenio_top),
Label(text="Nº Processo SF",left=convenio_left[2]*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="Adesão", left=convenio_left[3] * cm, top=convenio_top),
Label(text="Convênio",left=convenio_left[4]*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="Equipada", left=convenio_left[5] * cm, top=convenio_top),
Label(text="Data D.O.",left=convenio_left[6]*cm,top=convenio_top), Label(text="Data D.O.", left=convenio_left[6] * cm, top=convenio_top),
], ],
borders = {'bottom': True} borders={'bottom': True}
), ),
band_detail = ReportBand( band_detail=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':11}, default_style={'fontName': 'Helvetica', 'fontSize': 11},
height=0.5*cm, height=0.5 * cm,
elements=[ elements=[
ObjectValue(attribute_name='projeto.sigla',left=convenio_left[0]*cm), ObjectValue(attribute_name='projeto.sigla', left=convenio_left[0] * cm),
ObjectValue(attribute_name='num_convenio',left=convenio_left[1]*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='num_processo_sf', left=convenio_left[2] * cm),
ObjectValue(attribute_name='data_adesao',left=convenio_left[3]*cm, ObjectValue(attribute_name='data_adesao', left=convenio_left[3] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-' instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-'
), ),
ObjectValue(attribute_name='data_retorno_assinatura',left=convenio_left[4]*cm, ObjectValue(attribute_name='data_retorno_assinatura', left=convenio_left[4] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-' 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, ObjectValue(attribute_name='data_termo_aceite', left=convenio_left[5] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_termo_aceite.strftime('%d/%m/%Y') if instance.data_termo_aceite != None else '-' 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, ObjectValue(attribute_name='data_pub_diario', left=convenio_left[6] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-' instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-'
), ),
@ -572,5 +575,3 @@ class InfoCasaLegislativa(ReportDefault):
), ),
) )
] ]

64
sigi/apps/casas/views.py

@ -20,6 +20,8 @@ import csv
# @param qs: queryset # @param qs: queryset
# @param o: (int) number of order field # @param o: (int) number of order field
def query_ordena(qs, o): def query_ordena(qs, o):
from sigi.apps.casas.admin import CasaLegislativaAdmin from sigi.apps.casas.admin import CasaLegislativaAdmin
list_display = CasaLegislativaAdmin.list_display list_display = CasaLegislativaAdmin.list_display
@ -36,21 +38,23 @@ def query_ordena(qs, o):
qs = qs.order_by(*order_fields) qs = qs.order_by(*order_fields)
return qs return qs
def get_for_qs(get,qs):
def get_for_qs(get, qs):
""" """
Verifica atributos do GET e retorna queryset correspondente Verifica atributos do GET e retorna queryset correspondente
""" """
kwargs = {} kwargs = {}
for k,v in get.iteritems(): for k, v in get.iteritems():
if str(k) not in ('page', 'pop', 'q', '_popup', 'o', 'ot'): if str(k) not in ('page', 'pop', 'q', '_popup', 'o', 'ot'):
kwargs[str(k)] = v kwargs[str(k)] = v
qs = qs.filter(**kwargs) qs = qs.filter(**kwargs)
if 'o' in get: if 'o' in get:
qs = query_ordena(qs,get['o']) qs = query_ordena(qs, get['o'])
return qs return qs
def carrinhoOrGet_for_qs(request): def carrinhoOrGet_for_qs(request):
""" """
Verifica se existe casas na sessão se não verifica get e retorna qs correspondente. Verifica se existe casas na sessão se não verifica get e retorna qs correspondente.
@ -61,10 +65,11 @@ def carrinhoOrGet_for_qs(request):
else: else:
qs = CasaLegislativa.objects.all() qs = CasaLegislativa.objects.all()
if request.GET: if request.GET:
qs = get_for_qs(request.GET,qs) qs = get_for_qs(request.GET, qs)
return 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': 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'): if not request.session.has_key('carrinho_casas'):
@ -78,7 +83,6 @@ def adicionar_casas_carrinho(request,queryset=None,id=None):
request.session['carrinho_casas'] = lista request.session['carrinho_casas'] = lista
def visualizar_carrinho(request): def visualizar_carrinho(request):
qs = carrinhoOrGet_for_qs(request) qs = carrinhoOrGet_for_qs(request)
@ -103,18 +107,20 @@ def visualizar_carrinho(request):
return render_to_response( return render_to_response(
'casas/carrinho.html', 'casas/carrinho.html',
{ {
'MEDIA_URL':settings.MEDIA_URL, 'MEDIA_URL': settings.MEDIA_URL,
'carIsEmpty':carrinhoIsEmpty, 'carIsEmpty': carrinhoIsEmpty,
'paginas':paginas, 'paginas': paginas,
'query_str':'?'+request.META['QUERY_STRING'] 'query_str': '?' + request.META['QUERY_STRING']
} }
) )
def excluir_carrinho(request): def excluir_carrinho(request):
if request.session.has_key('carrinho_casas'): if request.session.has_key('carrinho_casas'):
del request.session['carrinho_casas'] del request.session['carrinho_casas']
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
def deleta_itens_carrinho(request): def deleta_itens_carrinho(request):
if request.method == 'POST': if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action') ids_selecionados = request.POST.getlist('_selected_action')
@ -125,14 +131,12 @@ def deleta_itens_carrinho(request):
if lista: if lista:
request.session['carrinho_casas'] = lista request.session['carrinho_casas'] = lista
else: else:
del lista; del lista
del request.session['carrinho_casas'] del request.session['carrinho_casas']
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'): def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'):
""" TODO: adicionar suporte para resultado de pesquisa do admin. """ TODO: adicionar suporte para resultado de pesquisa do admin.
""" """
@ -143,7 +147,7 @@ def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'):
if request.POST.has_key('tamanho_etiqueta'): if request.POST.has_key('tamanho_etiqueta'):
formato = request.POST['tamanho_etiqueta'] formato = request.POST['tamanho_etiqueta']
if tipo =='sem_presidente': if tipo == 'sem_presidente':
return labels_report_sem_presidente(request, id, formato) return labels_report_sem_presidente(request, id, formato)
if id: if id:
@ -161,6 +165,7 @@ def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'):
return response return response
def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'): def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
""" TODO: adicionar suporte para resultado de pesquisa do admin. """ TODO: adicionar suporte para resultado de pesquisa do admin.
""" """
@ -169,7 +174,6 @@ def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
if request.POST.has_key('tamanho_etiqueta'): if request.POST.has_key('tamanho_etiqueta'):
formato = request.POST['tamanho_etiqueta'] formato = request.POST['tamanho_etiqueta']
if id: if id:
legislaturas = [c.legislatura_set.latest('data_inicio') for c in CasaLegislativa.objects.filter(pk__in=id, legislatura__id__isnull=False).distinct()] 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]) mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
@ -189,6 +193,7 @@ def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
return response return response
def carrinhoOrGet_for_parlamentar_qs(request): def carrinhoOrGet_for_parlamentar_qs(request):
""" """
Verifica se existe parlamentares na sessão se não verifica get e retorna qs correspondente. Verifica se existe parlamentares na sessão se não verifica get e retorna qs correspondente.
@ -205,9 +210,10 @@ def carrinhoOrGet_for_parlamentar_qs(request):
parlamentares = [m.parlamentar for m in mandatos] parlamentares = [m.parlamentar for m in mandatos]
qs = parlamentares qs = parlamentares
if request.GET: if request.GET:
qs = get_for_qs(request.GET,qs) qs = get_for_qs(request.GET, qs)
return qs return qs
def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'): def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'):
""" TODO: adicionar suporte para resultado de pesquisa do admin. """ TODO: adicionar suporte para resultado de pesquisa do admin.
""" """
@ -228,16 +234,15 @@ def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'):
return response return response
def report(request, id=None,tipo=None): def report(request, id=None, tipo=None):
if request.POST: if request.POST:
if request.POST.has_key('tipo_relatorio'): if request.POST.has_key('tipo_relatorio'):
tipo = request.POST['tipo_relatorio'] tipo = request.POST['tipo_relatorio']
if tipo =='completo': if tipo == 'completo':
return report_complete(request, id) return report_complete(request, id)
if id: if id:
qs = CasaLegislativa.objects.filter(pk=id) qs = CasaLegislativa.objects.filter(pk=id)
else: else:
@ -246,14 +251,15 @@ def report(request, id=None,tipo=None):
if not qs: if not qs:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
#qs.order_by('municipio__uf','nome') # qs.order_by('municipio__uf','nome')
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=casas.pdf' response['Content-Disposition'] = 'attachment; filename=casas.pdf'
report = CasasLegislativasReport(queryset=qs) report = CasasLegislativasReport(queryset=qs)
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response
def report_complete(request,id=None):
def report_complete(request, id=None):
if id: if id:
qs = CasaLegislativa.objects.filter(pk=id) qs = CasaLegislativa.objects.filter(pk=id)
@ -273,11 +279,11 @@ def report_complete(request,id=None):
if quant > 1: if quant > 1:
for i in qs: for i in qs:
cont += 1 cont += 1
#queryset deve ser uma lista # queryset deve ser uma lista
lista = (i,) lista = (i,)
if cont == 1: if cont == 1:
report = InfoCasaLegislativa(queryset=lista) 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: else:
report = InfoCasaLegislativa(queryset=lista) report = InfoCasaLegislativa(queryset=lista)
if cont == quant: if cont == quant:
@ -286,15 +292,16 @@ def report_complete(request,id=None):
canvas = report.generate_by(PDFGenerator, canvas=canvas, return_canvas=True) canvas = report.generate_by(PDFGenerator, canvas=canvas, return_canvas=True)
else: else:
report = InfoCasaLegislativa(queryset=qs) report = InfoCasaLegislativa(queryset=qs)
report.generate_by(PDFGenerator,filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response
def casas_sem_convenio_report(request): 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: if request.GET:
qs = get_for_qs(request.GET,qs) qs = get_for_qs(request.GET, qs)
if not qs: if not qs:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
@ -304,7 +311,6 @@ def casas_sem_convenio_report(request):
return response return response
def export_csv(request): def export_csv(request):
response = HttpResponse(mimetype='text/csv') response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=casas.csv' response['Content-Disposition'] = 'attachment; filename=casas.csv'
@ -341,9 +347,9 @@ def export_csv(request):
lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8")) lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8"))
lista.append(unicode(casa.municipio.nome).encode("utf-8")) lista.append(unicode(casa.municipio.nome).encode("utf-8"))
elif u"Presidente" == atributo: 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. # É 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 "").encode("utf-8"))
lista.append(str(casa.presidente or "")) lista.append(str(casa.presidente or ""))
elif u"Logradouro" == atributo: elif u"Logradouro" == atributo:
lista.append(casa.logradouro.encode("utf-8")) lista.append(casa.logradouro.encode("utf-8"))

3
sigi/apps/contatos/admin.py

@ -14,6 +14,7 @@ class UnidadeFederativaAdmin(admin.ModelAdmin):
search_fields = ('search_text', 'codigo_ibge', 'sigla', 'regiao') search_fields = ('search_text', 'codigo_ibge', 'sigla', 'regiao')
get_queryset = queryset_ascii get_queryset = queryset_ascii
class MunicipioAdmin(admin.ModelAdmin): class MunicipioAdmin(admin.ModelAdmin):
actions = None actions = None
list_display = ('codigo_ibge', 'codigo_tse', 'nome', 'uf', 'is_capital', 'populacao', 'is_polo', 'idh', 'pib_ano', 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', search_fields = ('search_text', 'codigo_ibge', 'codigo_tse', 'codigo_mesorregiao',
'codigo_microrregiao', 'uf__sigla') 'codigo_microrregiao', 'uf__sigla')
class TelefoneAdmin(admin.ModelAdmin): class TelefoneAdmin(admin.ModelAdmin):
list_display = ('numero', 'tipo', 'nota') list_display = ('numero', 'tipo', 'nota')
list_display_links = ('numero',) list_display_links = ('numero',)
@ -41,6 +43,7 @@ class TelefoneAdmin(admin.ModelAdmin):
radio_fields = {'tipo': admin.VERTICAL} radio_fields = {'tipo': admin.VERTICAL}
search_fields = ('numero', 'tipo', 'nota') search_fields = ('numero', 'tipo', 'nota')
class ContatoAdmin(admin.ModelAdmin): class ContatoAdmin(admin.ModelAdmin):
list_display = ('nome', 'nota', 'email', 'municipio') list_display = ('nome', 'nota', 'email', 'municipio')
list_display_links = ('nome',) list_display_links = ('nome',)

8
sigi/apps/contatos/filters.py

@ -19,10 +19,10 @@ class PopulationFilter(admin.SimpleListFilter):
in the right sidebar. in the right sidebar.
""" """
return ( return (
( '1', '< 100 Mil'), ('1', '< 100 Mil'),
( '2', '100 Mil a 1 Milhão'), ('2', '100 Mil a 1 Milhão'),
( '3', '1 Milhão a 100 Milhões'), ('3', '1 Milhão a 100 Milhões'),
( '4', '> 100 Milhões'), ('4', '> 100 Milhões'),
) )
def queryset(self, request, queryset): def queryset(self, request, queryset):

108
sigi/apps/contatos/models.py

@ -6,8 +6,8 @@ from sigi.apps.utils import SearchField
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import MaxValueValidator, MinValueValidator
class UnidadeFederativa(models.Model): class UnidadeFederativa(models.Model):
""" Modelo que representa um estado brasileiro """ Modelo que representa um estado brasileiro
""" """
REGIAO_CHOICES = ( REGIAO_CHOICES = (
@ -42,7 +42,9 @@ class UnidadeFederativa(models.Model):
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class Municipio(models.Model): class Municipio(models.Model):
""" Modelo para representar as cidades brasileiras """ Modelo para representar as cidades brasileiras
""" """
codigo_ibge = models.PositiveIntegerField( codigo_ibge = models.PositiveIntegerField(
@ -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" % \ 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) (self.latitude, self.longitude)
class Telefone(models.Model): class Telefone(models.Model):
""" Modelo genérico para agrupar telefones dos modulos do sistema """ Modelo genérico para agrupar telefones dos modulos do sistema
""" """
TELEFONE_CHOICES = ( TELEFONE_CHOICES = (
@ -135,7 +139,7 @@ class Telefone(models.Model):
tipo = models.CharField( tipo = models.CharField(
max_length=1, max_length=1,
choices=TELEFONE_CHOICES, choices=TELEFONE_CHOICES,
default= 'I' default='I'
) )
nota = models.CharField(max_length=70, null=True, blank=True) 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)
@ -153,7 +157,9 @@ class Telefone(models.Model):
def __unicode__(self): def __unicode__(self):
return unicode(self.numero) return unicode(self.numero)
class Contato(models.Model): class Contato(models.Model):
""" Modelo generico para registrar contatos vinculados aos """ Modelo generico para registrar contatos vinculados aos
modulos do sistema modulos do sistema
""" """
@ -185,63 +191,64 @@ class Contato(models.Model):
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class Endereco(models.Model): class Endereco(models.Model):
TIPO_CHOICES = ( TIPO_CHOICES = (
('aeroporto','Aeroporto'), ('aeroporto', 'Aeroporto'),
('alameda','Alameda'), ('alameda', 'Alameda'),
('area',u'Área'), ('area', u'Área'),
('avenida','Avenida'), ('avenida', 'Avenida'),
('campo','Campo'), ('campo', 'Campo'),
('chacara',u'Chácara'), ('chacara', u'Chácara'),
('colonia',u'Colônia'), ('colonia', u'Colônia'),
('condominio',u'Condomínio'), ('condominio', u'Condomínio'),
('conjunto','Conjunto'), ('conjunto', 'Conjunto'),
('distrito','Distrito'), ('distrito', 'Distrito'),
('esplanada','Esplanada'), ('esplanada', 'Esplanada'),
('estacao',u'Estação'), ('estacao', u'Estação'),
('estrada','Estrada'), ('estrada', 'Estrada'),
('favela','Favela'), ('favela', 'Favela'),
('fazenda','Fazenda'), ('fazenda', 'Fazenda'),
('feira','Feira'), ('feira', 'Feira'),
('jardim','Jardim'), ('jardim', 'Jardim'),
('ladeira','Ladeira'), ('ladeira', 'Ladeira'),
('lago','Lago'), ('lago', 'Lago'),
('lagoa','Lagoa'), ('lagoa', 'Lagoa'),
('largo','Largo'), ('largo', 'Largo'),
('loteamento','Loteamento'), ('loteamento', 'Loteamento'),
('morro','Morro'), ('morro', 'Morro'),
('nucleo',u'Núcleo'), ('nucleo', u'Núcleo'),
('parque','Parque'), ('parque', 'Parque'),
('passarela','Passarela'), ('passarela', 'Passarela'),
('patio',u'Pátio'), ('patio', u'Pátio'),
('praca',u'Praça'), ('praca', u'Praça'),
('quadra','Quadra'), ('quadra', 'Quadra'),
('recanto','Recanto'), ('recanto', 'Recanto'),
('residencial','Residencial'), ('residencial', 'Residencial'),
('rodovia','Rodovia'), ('rodovia', 'Rodovia'),
('rua','Rua'), ('rua', 'Rua'),
('setor','Setor'), ('setor', 'Setor'),
('sitio',u'Sítio'), ('sitio', u'Sítio'),
('travessa','Travessa'), ('travessa', 'Travessa'),
('trecho','Trecho'), ('trecho', 'Trecho'),
('trevo','Trevo'), ('trevo', 'Trevo'),
('vale','Vale'), ('vale', 'Vale'),
('vereda','Vereda'), ('vereda', 'Vereda'),
('via','Via'), ('via', 'Via'),
('viaduto','Viaduto'), ('viaduto', 'Viaduto'),
('viela','Viela'), ('viela', 'Viela'),
('vila','Vila'), ('vila', 'Vila'),
('outro','Outro'), ('outro', 'Outro'),
) )
# tipo do endereço obtido no site dos correios # 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( logradouro = models.CharField(
max_length=100, max_length=100,
) )
logradouro.alphabetic_filter = True logradouro.alphabetic_filter = True
numero= models.CharField(max_length=15, blank=True) numero = models.CharField(max_length=15, blank=True)
complemento= models.CharField(max_length=15, blank=True) complemento = models.CharField(max_length=15, blank=True)
# campo de texto livre # campo de texto livre
referencia = models.CharField(max_length=100, blank=True) referencia = models.CharField(max_length=100, blank=True)
bairro = models.CharField(max_length=100, blank=True) bairro = models.CharField(max_length=100, blank=True)
@ -276,4 +283,3 @@ class Endereco(models.Model):
def __unicode__(self): def __unicode__(self):
return self.tipo + ' ' + self.logradouro + ', ' + self.numero \ return self.tipo + ' ' + self.logradouro + ', ' + self.numero \
+ ' ' + self.complemento + ' - ' + self.bairro + ' ' + self.complemento + ' - ' + self.bairro

49
sigi/apps/convenios/admin.py

@ -11,28 +11,33 @@ from geraldo.generators import PDFGenerator
from sigi.apps.convenios.views import adicionar_convenios_carrinho from sigi.apps.convenios.views import adicionar_convenios_carrinho
class TramitacaoInline(admin.TabularInline): class TramitacaoInline(admin.TabularInline):
model = Tramitacao model = Tramitacao
extra = 1 extra = 1
class AnexosInline(admin.TabularInline): class AnexosInline(admin.TabularInline):
model = Anexo model = Anexo
extra = 2 extra = 2
exclude = ['data_pub',] exclude = ['data_pub', ]
class EquipamentoPrevistoInline(admin.TabularInline): class EquipamentoPrevistoInline(admin.TabularInline):
model = EquipamentoPrevisto model = EquipamentoPrevisto
extra = 2 extra = 2
raw_id_fields = ('equipamento',) raw_id_fields = ('equipamento',)
class AnexoAdmin(admin.ModelAdmin): class AnexoAdmin(admin.ModelAdmin):
date_hierarchy = 'data_pub' date_hierarchy = 'data_pub'
exclude = ['data_pub',] exclude = ['data_pub', ]
list_display = ('arquivo', 'descricao', 'data_pub', 'convenio') list_display = ('arquivo', 'descricao', 'data_pub', 'convenio')
raw_id_fields = ('convenio',) raw_id_fields = ('convenio',)
search_fields = ('descricao', 'convenio__id', 'arquivo', search_fields = ('descricao', 'convenio__id', 'arquivo',
'convenio__casa_legislativa__nome') 'convenio__casa_legislativa__nome')
class ConvenioAdmin(admin.ModelAdmin): class ConvenioAdmin(admin.ModelAdmin):
change_list_template = 'convenios/change_list.html' change_list_template = 'convenios/change_list.html'
fieldsets = ( fieldsets = (
@ -45,23 +50,23 @@ class ConvenioAdmin(admin.ModelAdmin):
'data_devolucao_via', 'data_postagem_correio')} 'data_devolucao_via', 'data_postagem_correio')}
), ),
('Datas - Convenio sem assinatura', ('Datas - Convenio sem assinatura',
{'fields': ('data_devolucao_sem_assinatura','data_retorno_sem_assinatura',)} {'fields': ('data_devolucao_sem_assinatura', 'data_retorno_sem_assinatura',)}
), ),
) )
actions = ['adicionar_convenios'] actions = ['adicionar_convenios']
inlines = (TramitacaoInline, AnexosInline, EquipamentoPrevistoInline) inlines = (TramitacaoInline, AnexosInline, EquipamentoPrevistoInline)
list_display = ('num_convenio', 'casa_legislativa', 'get_uf', 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', 'projeto',
) )
list_display_links = ('num_convenio','casa_legislativa',) list_display_links = ('num_convenio', 'casa_legislativa',)
list_filter = ('projeto', 'casa_legislativa__municipio__uf', 'casa_legislativa','conveniada', 'equipada') list_filter = ('projeto', 'casa_legislativa__municipio__uf', 'casa_legislativa', 'conveniada', 'equipada')
#date_hierarchy = 'data_adesao' #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',) raw_id_fields = ('casa_legislativa',)
get_queryset = queryset_ascii get_queryset = queryset_ascii
search_fields = ('id', 'search_text',#'casa_legislativa__nome', search_fields = ('id', 'search_text', # 'casa_legislativa__nome',
'num_processo_sf','num_convenio') 'num_processo_sf', 'num_convenio')
def get_uf(self, obj): def get_uf(self, obj):
return obj.casa_legislativa.municipio.uf.sigla return obj.casa_legislativa.municipio.uf.sigla
@ -70,31 +75,32 @@ class ConvenioAdmin(admin.ModelAdmin):
def changelist_view(self, request, extra_context=None): def changelist_view(self, request, extra_context=None):
import re import re
request.GET._mutable=True request.GET._mutable = True
if 'data_retorno_assinatura__gte' in request.GET: 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 == '': if value == '':
del request.GET['data_retorno_assinatura__gte'] del request.GET['data_retorno_assinatura__gte']
elif re.match('^\d*$', value): # Year only elif re.match('^\d*$', value): # Year only
request.GET['data_retorno_assinatura__gte'] = "%s-01-01" % value #Complete with january 1st request.GET['data_retorno_assinatura__gte'] = "%s-01-01" % value # Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month 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 request.GET['data_retorno_assinatura__gte'] = '%s-01' % value # Complete with 1st day of month
if 'data_retorno_assinatura__lte' in request.GET: 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 == '': if value == '':
del request.GET['data_retorno_assinatura__lte'] del request.GET['data_retorno_assinatura__lte']
elif re.match('^\d*$', value): # Year only elif re.match('^\d*$', value): # Year only
request.GET['data_retorno_assinatura__lte'] = "%s-01-01" % value #Complete with january 1st request.GET['data_retorno_assinatura__lte'] = "%s-01-01" % value # Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month 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['data_retorno_assinatura__lte'] = '%s-01' % value # Complete with 1st day of month
request.GET._mutable=False request.GET._mutable = False
return super(ConvenioAdmin, self).changelist_view( return super(ConvenioAdmin, self).changelist_view(
request, request,
extra_context={'query_str': '?' + request.META['QUERY_STRING']} extra_context={'query_str': '?' + request.META['QUERY_STRING']}
) )
def relatorio(self, request, queryset): def relatorio(self, request, queryset):
#queryset.order_by('casa_legislativa__municipio__uf') # queryset.order_by('casa_legislativa__municipio__uf')
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
report = ConvenioReport(queryset=queryset) report = ConvenioReport(queryset=queryset)
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
@ -106,13 +112,13 @@ class ConvenioAdmin(admin.ModelAdmin):
q1 = len(request.session['carrinho_convenios']) q1 = len(request.session['carrinho_convenios'])
else: else:
q1 = 0 q1 = 0
adicionar_convenios_carrinho(request,queryset=queryset) adicionar_convenios_carrinho(request, queryset=queryset)
q2 = len(request.session['carrinho_convenios']) q2 = len(request.session['carrinho_convenios'])
quant = q2 - q1 quant = q2 - q1
if quant: 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: 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('.') return HttpResponseRedirect('.')
adicionar_convenios.short_description = u"Armazenar convênios no carrinho para exportar" 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 \ return super(ConvenioAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact'] lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact']
class EquipamentoPrevistoAdmin(admin.ModelAdmin): class EquipamentoPrevistoAdmin(admin.ModelAdmin):
list_display = ('convenio', 'equipamento', 'quantidade') list_display = ('convenio', 'equipamento', 'quantidade')
list_display_links = ('convenio', 'equipamento') list_display_links = ('convenio', 'equipamento')

15
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 datetime import datetime
from django.db import models from django.db import models
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
@ -6,6 +6,7 @@ from sigi.apps.utils import SearchField
class Projeto(models.Model): class Projeto(models.Model):
""" Modelo para representar os projetos do programa """ Modelo para representar os projetos do programa
Interlegis Interlegis
""" """
@ -17,6 +18,7 @@ class Projeto(models.Model):
class Convenio(models.Model): class Convenio(models.Model):
""" Modelo que representa um convênio do Interlegis """ Modelo que representa um convênio do Interlegis
com uma Casa Legislativa. com uma Casa Legislativa.
@ -98,11 +100,10 @@ class Convenio(models.Model):
equipada = models.BooleanField() equipada = models.BooleanField()
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.conveniada = self.data_retorno_assinatura!=None self.conveniada = self.data_retorno_assinatura != None
self.equipada = self.data_termo_aceite!=None self.equipada = self.data_termo_aceite != None
super(Convenio, self).save(*args, **kwargs) super(Convenio, self).save(*args, **kwargs)
class Meta: class Meta:
get_latest_by = 'id' get_latest_by = 'id'
ordering = ('id',) ordering = ('id',)
@ -116,6 +117,7 @@ class Convenio(models.Model):
class EquipamentoPrevisto(models.Model): class EquipamentoPrevisto(models.Model):
""" Modelo utilizado para registrar os equipamentos """ Modelo utilizado para registrar os equipamentos
disponibilizados para as Casas Legislativas disponibilizados para as Casas Legislativas
(foi usado na prmeira etapa do programa) (foi usado na prmeira etapa do programa)
@ -133,6 +135,7 @@ class EquipamentoPrevisto(models.Model):
class Anexo(models.Model): class Anexo(models.Model):
""" Modelo para giardar os documentos gerados """ Modelo para giardar os documentos gerados
no processo de convênio no processo de convênio
""" """
@ -151,7 +154,9 @@ class Anexo(models.Model):
def __unicode__(self): def __unicode__(self):
return unicode("%s publicado em %s" % (self.descricao, self.data_pub)) return unicode("%s publicado em %s" % (self.descricao, self.data_pub))
class UnidadeAdministrativa(models.Model): class UnidadeAdministrativa(models.Model):
""" Modelo para representar uma Unidade Administrativa """ Modelo para representar uma Unidade Administrativa
que pode ser um servivo do próprio Interlegis, assim como que pode ser um servivo do próprio Interlegis, assim como
uma unidade do Senado Federal uma unidade do Senado Federal
@ -164,6 +169,7 @@ class UnidadeAdministrativa(models.Model):
class Tramitacao(models.Model): class Tramitacao(models.Model):
""" Modelo para registrar as vias do processo de convênio e a Unidade """ 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) 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)) return unicode("%s em %s (%s)" % (self.unid_admin, self.data, self.observacao))
else: else:
return unicode("%s em %s" % (self.unid_admin, self.data)) return unicode("%s em %s" % (self.unid_admin, self.data))

194
sigi/apps/convenios/reports.py

@ -3,7 +3,7 @@ import os
from ctypes import alignment from ctypes import alignment
from operator import attrgetter from operator import attrgetter
from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \ from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \
landscape,SystemField, BAND_WIDTH,ReportGroup, \ landscape, SystemField, BAND_WIDTH, ReportGroup, \
FIELD_ACTION_SUM, FIELD_ACTION_COUNT, FIELD_ACTION_AVG FIELD_ACTION_SUM, FIELD_ACTION_COUNT, FIELD_ACTION_AVG
from geraldo.graphics import Image from geraldo.graphics import Image
@ -15,136 +15,139 @@ from sigi.apps.relatorios.reports import ReportDefault
#from abc import ABCMeta #from abc import ABCMeta
class CasasAderidasReport(object): class CasasAderidasReport(object):
pass pass
class CasasNaoAderidasReport(object): class CasasNaoAderidasReport(object):
pass pass
class CasasComEquipamentosReport(object): class CasasComEquipamentosReport(object):
pass pass
class SemEquipamentosReport(object): class SemEquipamentosReport(object):
pass pass
class ConvenioReport(ReportDefault): class ConvenioReport(ReportDefault):
title = u'Relatório de Convênios' title = u'Relatório de Convênios'
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top 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) elements = list(ReportDefault.band_page_header.elements)
height = 4.7*cm height = 4.7 * cm
elements += [ elements += [
Label( Label(
text="UF", text="UF",
left=label_left[0]*cm, left=label_left[0] * cm,
top=label_top + 0.4*cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text="Municipio", text="Municipio",
left=label_left[1]*cm, left=label_left[1] * cm,
top=label_top + 0.4*cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text="Data de Adesão", text="Data de Adesão",
left=label_left[2]*cm, left=label_left[2] * cm,
top=label_top, top=label_top,
width=2*cm, width=2 * cm,
), ),
Label( Label(
text="Número do Convênio", text="Número do Convênio",
left=label_left[3]*cm, left=label_left[3] * cm,
top=label_top, top=label_top,
width=2*cm, width=2 * cm,
), ),
Label( Label(
text="Data do Convênio", text="Data do Convênio",
left=label_left[4]*cm, left=label_left[4] * cm,
top=label_top, top=label_top,
width=2*cm, width=2 * cm,
), ),
Label( Label(
text="Data de Publicação", text="Data de Publicação",
left=label_left[5]*cm, left=label_left[5] * cm,
top=label_top, top=label_top,
width=2*cm, width=2 * cm,
), ),
Label( Label(
text="Data de Aceite", text="Data de Aceite",
left=label_left[6]*cm, left=label_left[6] * cm,
top=label_top, top=label_top,
width=2*cm, width=2 * cm,
), ),
Label( Label(
text="Projeto", text="Projeto",
left=label_left[7]*cm, left=label_left[7] * cm,
top=label_top + 0.4*cm, top=label_top + 0.4 * cm,
width=2*cm, width=2 * cm,
), ),
] ]
class band_page_footer(ReportDefault.band_page_footer): class band_page_footer(ReportDefault.band_page_footer):
pass pass
class band_detail(ReportDefault.band_detail): 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( ObjectValue(
attribute_name='casa_legislativa.municipio.uf.sigla', attribute_name='casa_legislativa.municipio.uf.sigla',
left=label_left[0]*cm left=label_left[0] * cm
), ),
ObjectValue( ObjectValue(
attribute_name='casa_legislativa.municipio.nome', attribute_name='casa_legislativa.municipio.nome',
left=label_left[1]*cm left=label_left[1] * cm
), ),
ObjectValue( ObjectValue(
attribute_name='data_adesao', attribute_name='data_adesao',
left=label_left[2]*cm, left=label_left[2] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-' instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-'
), ),
ObjectValue( ObjectValue(
attribute_name='num_convenio', attribute_name='num_convenio',
left=label_left[3]*cm left=label_left[3] * cm
), ),
ObjectValue( ObjectValue(
attribute_name='data_retorno_assinatura', attribute_name='data_retorno_assinatura',
left=label_left[4]*cm, left=label_left[4] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-' instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-'
), ),
ObjectValue( ObjectValue(
attribute_name='data_pub_diario', attribute_name='data_pub_diario',
left=label_left[5]*cm, left=label_left[5] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-' instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-'
), ),
ObjectValue( ObjectValue(
attribute_name='data_termo_aceite', attribute_name='data_termo_aceite',
left=label_left[6]*cm, left=label_left[6] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_termo_aceite.strftime('%d/%m/%Y') if instance.data_termo_aceite != None else '-' instance.data_termo_aceite.strftime('%d/%m/%Y') if instance.data_termo_aceite != None else '-'
), ),
ObjectValue( ObjectValue(
attribute_name='projeto.sigla', attribute_name='projeto.sigla',
left=label_left[7]*cm left=label_left[7] * cm
), ),
] ]
groups = [ groups = [
ReportGroup(attribute_name='casa_legislativa.municipio.uf', ReportGroup(attribute_name='casa_legislativa.municipio.uf',
band_header=ReportBand( band_header=ReportBand(
height=0.7*cm, height=0.7 * cm,
elements= [ elements=[
ObjectValue(attribute_name='casa_legislativa.municipio.uf', ObjectValue(attribute_name='casa_legislativa.municipio.uf',
get_Value= lambda instance: 'CasaLegislativa: '+ (instance.casa_legislativa.uf) get_Value=lambda instance: 'CasaLegislativa: ' + (instance.casa_legislativa.uf)
) )
], ],
borders={'top': True}, borders={'top': True},
@ -152,165 +155,166 @@ class ConvenioReport(ReportDefault):
) )
] ]
class ConvenioReportSemAceite(ConvenioReport): class ConvenioReportSemAceite(ConvenioReport):
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top 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) elements = list(ReportDefault.band_page_header.elements)
height = 4.7*cm height = 4.7 * cm
elements += [ elements += [
Label( Label(
text="UF", text="UF",
left=label_left[0]*cm, left=label_left[0] * cm,
top=label_top + 0.4*cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text="Município", text="Município",
left=label_left[1]*cm, left=label_left[1] * cm,
top=label_top + 0.4*cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text="Data de Adesão", text="Data de Adesão",
left=label_left[3]*cm, left=label_left[3] * cm,
top=label_top, top=label_top,
width=2*cm, width=2 * cm,
), ),
Label( Label(
text="Número do Convênio", text="Número do Convênio",
left=label_left[4]*cm, left=label_left[4] * cm,
top=label_top, top=label_top,
width=2*cm, width=2 * cm,
), ),
Label( Label(
text="Data do Convênio", text="Data do Convênio",
left=label_left[5]*cm, left=label_left[5] * cm,
top=label_top, top=label_top,
width=2*cm, width=2 * cm,
), ),
Label( Label(
text="Data de Publicação", text="Data de Publicação",
left=label_left[6]*cm, left=label_left[6] * cm,
top=label_top, top=label_top,
width=2*cm, width=2 * cm,
), ),
Label( Label(
text="Projeto", text="Projeto",
left=label_left[7]*cm, left=label_left[7] * cm,
top=label_top + 0.4*cm, top=label_top + 0.4 * cm,
width=2*cm, width=2 * cm,
), ),
] ]
class band_detail(ReportDefault.band_detail): 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( ObjectValue(
attribute_name='casa_legislativa.municipio.uf.sigla', attribute_name='casa_legislativa.municipio.uf.sigla',
left=label_left[0]*cm left=label_left[0] * cm
), ),
ObjectValue( ObjectValue(
attribute_name='casa_legislativa.municipio.nome', attribute_name='casa_legislativa.municipio.nome',
left=label_left[1]*cm left=label_left[1] * cm
), ),
ObjectValue( ObjectValue(
attribute_name='data_adesao', attribute_name='data_adesao',
left=label_left[3]*cm, left=label_left[3] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-' instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-'
), ),
ObjectValue( ObjectValue(
attribute_name='num_convenio', attribute_name='num_convenio',
left=label_left[4]*cm left=label_left[4] * cm
), ),
ObjectValue( ObjectValue(
attribute_name='data_retorno_assinatura', attribute_name='data_retorno_assinatura',
left=label_left[5]*cm, left=label_left[5] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-' instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-'
), ),
ObjectValue( ObjectValue(
attribute_name='data_pub_diario', attribute_name='data_pub_diario',
left=label_left[6]*cm, left=label_left[6] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-' instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-'
), ),
ObjectValue( ObjectValue(
attribute_name='projeto.sigla', 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): class ConvenioReportRegiao(ReportDefault):
title = u'Relatório de Convênios por Região' title = u'Relatório de Convênios por Região'
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top label_top = ReportDefault.band_page_header.label_top
label_left = [0.5,6,8,10,12,14] label_left = [0.5, 6, 8, 10, 12, 14]
map(lambda x:x-0.4,label_left) map(lambda x: x - 0.4, label_left)
elements = list(ReportDefault.band_page_header.elements) elements = list(ReportDefault.band_page_header.elements)
elements += [ elements += [
Label(text="UF", left=label_left[0]*cm,top=label_top,), Label(text="UF", left=label_left[0] * cm, top=label_top,),
Label(text="Total", left=label_left[1]*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="Aderidas", left=label_left[2] * cm, top=label_top,),
Label(text="%", left=label_left[3]*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="Ñ Aderidas", left=label_left[4] * cm, top=label_top,),
Label(text="%", left=label_left[5]*cm,top=label_top), Label(text="%", left=label_left[5] * cm, top=label_top),
] ]
class band_detail(ReportDefault.band_detail): 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 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} default_style = {'fontName': 'Helvetica', 'fontSize': 11}
elements=[ elements = [
ObjectValue(attribute_name='estado', left=label_left[0]*cm, ), ObjectValue(attribute_name='estado', left=label_left[0] * cm, ),
ObjectValue(attribute_name='quant_casas', left=label_left[1]*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='quant_casas_aderidas', left=label_left[2] * cm),
ObjectValue(attribute_name='porc_casas_aderidas', left=label_left[3]*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='quant_casas_nao_aderidas', left=label_left[4] * cm),
ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,), ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5] * cm,),
] ]
class band_summary(ReportBand): class band_summary(ReportBand):
label_left = [0.5,6,8,10,12,14] label_left = [0.5, 6, 8, 10, 12, 14]
elements = [ elements = [
Label(text="Total", top=0.1*cm, left=label_left[0]*cm), 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', 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='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, # 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), # 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='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, # ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,
# get_value=lambda x: teste(), # get_value=lambda x: teste(),
# ), # ),
] ]
borders = {'top':True} borders = {'top': True}
class ConvenioPorCMReport(ConvenioReport): class ConvenioPorCMReport(ConvenioReport):
title = u'Relatório de Convênios por Câmara Municipal' title = u'Relatório de Convênios por Câmara Municipal'
class ConvenioPorALReport(ConvenioReport): class ConvenioPorALReport(ConvenioReport):
title = u'Relatório de Convênios por Assembléia Legislativa' title = u'Relatório de Convênios por Assembléia Legislativa'
class ConvenioReportSemAceiteCM(ConvenioReportSemAceite): class ConvenioReportSemAceiteCM(ConvenioReportSemAceite):
title = u'Relatório de Convênios por Câmara Municipal' title = u'Relatório de Convênios por Câmara Municipal'
class ConvenioReportSemAceiteAL(ConvenioReportSemAceite): class ConvenioReportSemAceiteAL(ConvenioReportSemAceite):
title = u'Relatório de Convênios por Assembléia Legislativa' title = u'Relatório de Convênios por Assembléia Legislativa'

78
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 geraldo.generators import PDFGenerator
from sigi.apps.convenios.models import Convenio, Projeto from sigi.apps.convenios.models import Convenio, Projeto
from sigi.apps.convenios.reports import ConvenioReport \ from sigi.apps.convenios.reports import ConvenioReport \
,ConvenioPorCMReport \ , ConvenioPorCMReport \
,ConvenioPorALReport \ , ConvenioPorALReport \
,ConvenioReportSemAceiteAL \ , ConvenioReportSemAceiteAL \
,ConvenioReportSemAceiteCM , ConvenioReportSemAceiteCM
from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.contatos.models import UnidadeFederativa from sigi.apps.contatos.models import UnidadeFederativa
@ -22,39 +22,42 @@ import datetime
import csv import csv
def query_ordena(qs,o,ot):
def query_ordena(qs, o, ot):
list_display = ('num_convenio', 'casa_legislativa', list_display = ('num_convenio', 'casa_legislativa',
'data_adesao','data_retorno_assinatura','data_termo_aceite', 'data_adesao', 'data_retorno_assinatura', 'data_termo_aceite',
'projeto', 'projeto',
) )
aux = list_display[(int(o)-1)] aux = list_display[(int(o) - 1)]
if ot =='asc': if ot == 'asc':
qs = qs.order_by(aux) qs = qs.order_by(aux)
else: else:
qs = qs.order_by("-"+aux) qs = qs.order_by("-" + aux)
return qs return qs
def get_for_qs(get,qs):
def get_for_qs(get, qs):
kwargs = {} kwargs = {}
ids = 0 ids = 0
for k,v in get.iteritems(): for k, v in get.iteritems():
if k not in ['page', 'pop', 'q', '_popup']: if k not in ['page', 'pop', 'q', '_popup']:
if not k == 'o': if not k == 'o':
if k == "ot": if k == "ot":
qs = query_ordena(qs,get["o"],get["ot"]) qs = query_ordena(qs, get["o"], get["ot"])
else: else:
kwargs[str(k)] = v kwargs[str(k)] = v
if(str(k)=='ids'): if(str(k) == 'ids'):
ids = 1 ids = 1
break break
qs = qs.filter(**kwargs) qs = qs.filter(**kwargs)
if ids: if ids:
query = 'id IN ('+ kwargs['ids'].__str__()+')' query = 'id IN (' + kwargs['ids'].__str__() + ')'
qs = Convenio.objects.extra(where=[query]) qs = Convenio.objects.extra(where=[query])
return qs return qs
def carrinhoOrGet_for_qs(request): def carrinhoOrGet_for_qs(request):
""" """
Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente. Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente.
@ -65,11 +68,12 @@ def carrinhoOrGet_for_qs(request):
else: else:
qs = Convenio.objects.all() qs = Convenio.objects.all()
if request.GET: if request.GET:
qs = qs.order_by("casa_legislativa__municipio__uf","casa_legislativa__municipio") qs = qs.order_by("casa_legislativa__municipio__uf", "casa_legislativa__municipio")
qs = get_for_qs(request.GET,qs) qs = get_for_qs(request.GET, qs)
return 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': 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'): if not request.session.has_key('carrinho_convenios'):
@ -82,11 +86,13 @@ def adicionar_convenios_carrinho(request,queryset=None,id=None):
lista.append(id) lista.append(id)
request.session['carrinho_convenios'] = lista request.session['carrinho_convenios'] = lista
def excluir_carrinho(request): def excluir_carrinho(request):
if request.session.has_key('carrinho_convenios'): if request.session.has_key('carrinho_convenios'):
del request.session['carrinho_convenios'] del request.session['carrinho_convenios']
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
def deleta_itens_carrinho(request): def deleta_itens_carrinho(request):
if request.method == 'POST': if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action') ids_selecionados = request.POST.getlist('_selected_action')
@ -97,11 +103,12 @@ def deleta_itens_carrinho(request):
if lista: if lista:
request.session['carrinho_convenios'] = lista request.session['carrinho_convenios'] = lista
else: else:
del lista; del lista
del request.session['carrinho_convenios'] del request.session['carrinho_convenios']
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
def visualizar_carrinho(request): def visualizar_carrinho(request):
qs = carrinhoOrGet_for_qs(request) qs = carrinhoOrGet_for_qs(request)
@ -126,13 +133,14 @@ def visualizar_carrinho(request):
return render_to_response( return render_to_response(
'convenios/carrinho.html', 'convenios/carrinho.html',
{ {
'MEDIA_URL':settings.MEDIA_URL, 'MEDIA_URL': settings.MEDIA_URL,
'carIsEmpty':carrinhoIsEmpty, 'carIsEmpty': carrinhoIsEmpty,
'paginas':paginas, 'paginas': paginas,
'query_str':'?'+request.META['QUERY_STRING'] 'query_str': '?' + request.META['QUERY_STRING']
} }
) )
def report(request, id=None): def report(request, id=None):
if id: if id:
@ -166,7 +174,6 @@ def report(request, id=None):
else: else:
report = ConvenioPorCMReport(queryset=qs) report = ConvenioPorCMReport(queryset=qs)
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
if report: if report:
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
@ -174,10 +181,10 @@ def report(request, id=None):
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
return response 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(): class LinhaEstado():
pass pass
@ -231,12 +238,13 @@ def casas_estado_to_tabela(casas,convenios,regiao):
) )
return { return {
"linhas":lista, "linhas": lista,
"cabecalho":cabecalho_topo, "cabecalho": cabecalho_topo,
"sumario":sumario, "sumario": sumario,
} }
def report_regiao(request,regiao='NE'):
def report_regiao(request, regiao='NE'):
if request.POST: if request.POST:
if request.POST.has_key('regiao'): if request.POST.has_key('regiao'):
@ -257,14 +265,14 @@ def report_regiao(request,regiao='NE'):
tabelas = list() tabelas = list()
# Geral # Geral
convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM') convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM')
tabela = casas_estado_to_tabela(camaras,convenios,regiao) tabela = casas_estado_to_tabela(camaras, convenios, regiao)
tabela["projeto"] = "Geral" tabela["projeto"] = "Geral"
tabelas.append(tabela) tabelas.append(tabela)
for projeto in projetos: for projeto in projetos:
convenios_proj = convenios.filter(projeto=projeto) 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 tabela["projeto"] = projeto.nome
tabelas.append(tabela) tabelas.append(tabela)
@ -275,13 +283,14 @@ def report_regiao(request,regiao='NE'):
response['Content-Disposition'] = 'attachment; filename=RelatorioRegiao_' + regiao + '.pdf' response['Content-Disposition'] = 'attachment; filename=RelatorioRegiao_' + regiao + '.pdf'
#tabelas = ({'projeto':"PI"},{'projeto':"PML"},) #tabelas = ({'projeto':"PI"},{'projeto':"PML"},)
t = loader.get_template('convenios/tabela_regiao.html') t = loader.get_template('convenios/tabela_regiao.html')
c = Context({'tabelas':tabelas,'regiao':REGIAO_CHOICES[regiao],'data':data,'hora':hora}) c = Context({'tabelas': tabelas, 'regiao': REGIAO_CHOICES[regiao], 'data': data, 'hora': hora})
pdf = pisa.CreatePDF(t.render(c),response) pdf = pisa.CreatePDF(t.render(c), response)
if not pdf.err: if not pdf.err:
pisa.startViewer(response) pisa.startViewer(response)
return response return response
def export_csv(request): def export_csv(request):
response = HttpResponse(mimetype='text/csv') response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=convenios.csv' response['Content-Disposition'] = 'attachment; filename=convenios.csv'
@ -291,7 +300,7 @@ def export_csv(request):
if not convenios: if not convenios:
return HttpResponseRedirect('../') 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", ] u"Data da Publicacao no D.O.", u"Data Equipada", ]
if request.POST: if request.POST:
@ -341,4 +350,3 @@ def export_csv(request):
csv_writer.writerow(lista) csv_writer.writerow(lista)
return response return response

29
sigi/apps/diagnosticos/admin.py

@ -6,11 +6,12 @@ from sigi.apps.diagnosticos.models import Diagnostico, Pergunta, Escolha, Equipe
from sigi.apps.diagnosticos.forms import DiagnosticoForm from sigi.apps.diagnosticos.forms import DiagnosticoForm
from sigi.apps.contatos.models import UnidadeFederativa from sigi.apps.contatos.models import UnidadeFederativa
def publicar_diagnostico(self, request, queryset): def publicar_diagnostico(self, request, queryset):
for registro in queryset: for registro in queryset:
diagnostico = Diagnostico.objects.get(pk=registro.id) diagnostico = Diagnostico.objects.get(pk=registro.id)
diagnostico.publicado = True diagnostico.publicado = True
diagnostico.data_publicacao= datetime.now() diagnostico.data_publicacao = datetime.now()
diagnostico.save() diagnostico.save()
# Enviando o email avisando que o diagnóstico foi publicado # Enviando o email avisando que o diagnóstico foi publicado
@ -27,14 +28,17 @@ def despublicar_diagnostico(self, request, queryset):
despublicar_diagnostico.short_description = u""" despublicar_diagnostico.short_description = u"""
Definir diagnósticos como não publicado""" Definir diagnósticos como não publicado"""
class EquipeInline(admin.TabularInline): class EquipeInline(admin.TabularInline):
model = Equipe model = Equipe
class AnexosInline(admin.TabularInline): class AnexosInline(admin.TabularInline):
model = Anexo model = Anexo
extra = 2 extra = 2
exclude = ['data_pub', ] exclude = ['data_pub', ]
class AnexoAdmin(admin.ModelAdmin): class AnexoAdmin(admin.ModelAdmin):
date_hierarchy = 'data_pub' date_hierarchy = 'data_pub'
exclude = ['data_pub', ] exclude = ['data_pub', ]
@ -43,12 +47,13 @@ class AnexoAdmin(admin.ModelAdmin):
search_fields = ('descricao', 'diagnostico__id', 'arquivo', search_fields = ('descricao', 'diagnostico__id', 'arquivo',
'diagnostico__casa_legislativa__nome') 'diagnostico__casa_legislativa__nome')
class DiagnosticoAdmin(BaseEntityAdmin): class DiagnosticoAdmin(BaseEntityAdmin):
form = DiagnosticoForm form = DiagnosticoForm
actions = [publicar_diagnostico, despublicar_diagnostico] actions = [publicar_diagnostico, despublicar_diagnostico]
inlines = (EquipeInline, AnexosInline) inlines = (EquipeInline, AnexosInline)
search_fields = ('casa_legislativa__nome',) search_fields = ('casa_legislativa__nome',)
list_display = ('casa_legislativa','get_uf', 'data_visita_inicio', 'data_visita_fim', 'responsavel', 'publicado') 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_filter = ('publicado', 'casa_legislativa__municipio__uf__nome', 'casa_legislativa', 'data_publicacao', 'data_visita_inicio', 'data_visita_fim')
raw_id_fields = ('casa_legislativa',) raw_id_fields = ('casa_legislativa',)
ordering = ('casa_legislativa',) ordering = ('casa_legislativa',)
@ -71,7 +76,6 @@ class DiagnosticoAdmin(BaseEntityAdmin):
'classes': ['collapse'] 'classes': ['collapse']
}),) }),)
def get_uf(self, obj): def get_uf(self, obj):
return '%s' % (obj.casa_legislativa.municipio.uf) return '%s' % (obj.casa_legislativa.municipio.uf)
get_uf.short_description = 'UF' get_uf.short_description = 'UF'
@ -83,33 +87,35 @@ class DiagnosticoAdmin(BaseEntityAdmin):
def changelist_view(self, request, extra_context=None): def changelist_view(self, request, extra_context=None):
import re import re
request.GET._mutable=True request.GET._mutable = True
if 'data_visita_inicio__gte' in request.GET: 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 == '': if value == '':
del request.GET['data_visita_inicio__gte'] del request.GET['data_visita_inicio__gte']
elif re.match('^\d*$', value): # Year only elif re.match('^\d*$', value): # Year only
request.GET['data_visita_inicio__gte'] = "%s-01-01" % value #Complete with january 1st request.GET['data_visita_inicio__gte'] = "%s-01-01" % value # Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month 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 request.GET['data_visita_inicio__gte'] = '%s-01' % value # Complete with 1st day of month
if 'data_visita_inicio__lte' in request.GET: 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 == '': if value == '':
del request.GET['data_visita_inicio__lte'] del request.GET['data_visita_inicio__lte']
elif re.match('^\d*$', value): # Year only elif re.match('^\d*$', value): # Year only
request.GET['data_visita_inicio__lte'] = "%s-01-01" % value #Complete with january 1st request.GET['data_visita_inicio__lte'] = "%s-01-01" % value # Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month 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['data_visita_inicio__lte'] = '%s-01' % value # Complete with 1st day of month
request.GET._mutable=False request.GET._mutable = False
return super(DiagnosticoAdmin, self).changelist_view(request, extra_context) return super(DiagnosticoAdmin, self).changelist_view(request, extra_context)
class EscolhaAdmin(admin.ModelAdmin): class EscolhaAdmin(admin.ModelAdmin):
search_fields = ('title',) search_fields = ('title',)
list_display = ('title', 'schema', 'schema_to_open') list_display = ('title', 'schema', 'schema_to_open')
raw_id_fields = ('schema', 'schema_to_open') raw_id_fields = ('schema', 'schema_to_open')
ordering = ('schema', 'title') ordering = ('schema', 'title')
class EscolhaInline(admin.TabularInline): class EscolhaInline(admin.TabularInline):
model = Escolha model = Escolha
fk_name = 'schema' fk_name = 'schema'
@ -117,6 +123,7 @@ class EscolhaInline(admin.TabularInline):
verbose_name = 'Escolhas (apenas para choices ou multiple choices)' verbose_name = 'Escolhas (apenas para choices ou multiple choices)'
extra = 0 extra = 0
class PerguntaAdmin (BaseSchemaAdmin): class PerguntaAdmin (BaseSchemaAdmin):
search_fields = ('title', 'help_text', 'name',) search_fields = ('title', 'help_text', 'name',)
list_display = ('title', 'categoria', 'datatype', 'help_text', 'required') list_display = ('title', 'categoria', 'datatype', 'help_text', 'required')

1
sigi/apps/diagnosticos/decorators.py

@ -4,6 +4,7 @@ from django.template import RequestContext
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from sigi.apps.diagnosticos.models import Diagnostico from sigi.apps.diagnosticos.models import Diagnostico
def validate_diagnostico(func): def validate_diagnostico(func):
def decorator(request, id_diagnostico, *args, **kwargs): def decorator(request, id_diagnostico, *args, **kwargs):
""" Retorna 404 caso o diagnostico esteja publicado """ Retorna 404 caso o diagnostico esteja publicado

33
sigi/apps/diagnosticos/forms.py

@ -16,6 +16,7 @@ from eav.fields import RangeField
class DiagnosticoForm(BaseDynamicEntityForm): class DiagnosticoForm(BaseDynamicEntityForm):
"""Classe responsável por contruir o formulário, """Classe responsável por contruir o formulário,
vinculando ao modelo Diagnostico vinculando ao modelo Diagnostico
""" """
@ -26,9 +27,11 @@ class DiagnosticoForm(BaseDynamicEntityForm):
for k, f in self.fields.iteritems(): for k, f in self.fields.iteritems():
if isinstance(f, CharField): if isinstance(f, CharField):
f.widget = forms.widgets.Textarea(attrs={'cols':'80'}) f.widget = forms.widgets.Textarea(attrs={'cols': '80'})
class DiagnosticoMobileForm(BaseDynamicEntityForm): class DiagnosticoMobileForm(BaseDynamicEntityForm):
"""Classe responsável por construir o formulário """Classe responsável por construir o formulário
para ser usado no ambiente mobile, a partir do para ser usado no ambiente mobile, a partir do
do modelo Diagnostico, como também organizar sua do modelo Diagnostico, como também organizar sua
@ -51,17 +54,18 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm):
} }
FIELD_WIDGET = { FIELD_WIDGET = {
'consideracoes_gerais' : {'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_parlamentares_da_camara_municipal': {'widget': Textarea},
'descreva_5_cursos_prioritarios_para_treinamento_de_servidores_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_capacitacao': {'widget': Textarea},
'sugestoes_para_a_area_de_comunicacao' : {'widget': Textarea}, 'sugestoes_para_a_area_de_comunicacao': {'widget': Textarea},
'sugestoes_para_a_area_de_informacao' : {'widget': Textarea}, 'sugestoes_para_a_area_de_informacao': {'widget': Textarea},
'sugestoes_para_a_area_de_ti' : {'widget': Textarea}, 'sugestoes_para_a_area_de_ti': {'widget': Textarea},
'inscricoes_para_lista_gitec' : {'widget': Textarea}, 'inscricoes_para_lista_gitec': {'widget': Textarea},
'inscricoes_para_lista_gial' : {'widget': Textarea}, 'inscricoes_para_lista_gial': {'widget': Textarea},
'inscricoes_para_lista_gicom' : {'widget': Textarea}, 'inscricoes_para_lista_gicom': {'widget': Textarea},
} }
class Meta: class Meta:
model = Diagnostico model = Diagnostico
fields = '__all__' fields = '__all__'
@ -127,7 +131,7 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm):
class CasaLegislativaMobileForm(forms.ModelForm): class CasaLegislativaMobileForm(forms.ModelForm):
data_instalacao = forms.DateField(label = u'Data de instalação da Casa Legislativa', required=False) data_instalacao = forms.DateField(label=u'Data de instalação da Casa Legislativa', required=False)
data_criacao = forms.DateField() data_criacao = forms.DateField()
class Meta: class Meta:
@ -137,8 +141,8 @@ class CasaLegislativaMobileForm(forms.ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(CasaLegislativaMobileForm, self).__init__(*args, **kwargs) super(CasaLegislativaMobileForm, self).__init__(*args, **kwargs)
self.fields['data_criacao'] = forms.DateField( self.fields['data_criacao'] = forms.DateField(
label = u'Data de criação do Município', label=u'Data de criação do Município',
initial = self.instance.municipio.data_criacao, initial=self.instance.municipio.data_criacao,
required=False) required=False)
def save(self, commit=True): def save(self, commit=True):
@ -151,6 +155,7 @@ class CasaLegislativaMobileForm(forms.ModelForm):
class TelefoneMobileForm(forms.ModelForm): class TelefoneMobileForm(forms.ModelForm):
pass pass
class Meta: class Meta:
model = Telefone model = Telefone
fields = ('numero', 'tipo') fields = ('numero', 'tipo')

14
sigi/apps/diagnosticos/models.py

@ -9,6 +9,7 @@ from eav.models import BaseChoice, BaseEntity, BaseSchema, BaseAttribute
class Diagnostico(BaseEntity): class Diagnostico(BaseEntity):
""" Modelo para representar unm diagnostico realizado """ Modelo para representar unm diagnostico realizado
em uma Casa Legislativa em uma Casa Legislativa
""" """
@ -113,14 +114,13 @@ class Diagnostico(BaseEntity):
'status': "Alterado", 'status': "Alterado",
}) })
def get_schemata(self, category=None, *args, **kwargs): def get_schemata(self, category=None, *args, **kwargs):
""" Se existir uma categoria retorna apenas as questões dessa. """ 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: if category:
schemas = [s for s in schemas if s.categoria_id == category] schemas = [s for s in schemas if s.categoria_id == category]
schemas= sorted(schemas, lambda x,y: cmp(x.title, y.title)) schemas = sorted(schemas, lambda x, y: cmp(x.title, y.title))
return schemas return schemas
@ -136,6 +136,7 @@ class Diagnostico(BaseEntity):
class Categoria(models.Model): class Categoria(models.Model):
""" Modelo para representar a categoria de uma pergunta """ Modelo para representar a categoria de uma pergunta
e sua ordem na hora de exibir no formulário e sua ordem na hora de exibir no formulário
""" """
@ -149,6 +150,7 @@ class Categoria(models.Model):
class Pergunta(BaseSchema): class Pergunta(BaseSchema):
""" Modelo que representa uma pergunta no questionário """ Modelo que representa uma pergunta no questionário
e sua ordem dentro da categoria e sua ordem dentro da categoria
@ -190,6 +192,7 @@ class Pergunta(BaseSchema):
class Escolha(BaseChoice): class Escolha(BaseChoice):
""" Perguntas de multiplas escolhas tem as opções """ Perguntas de multiplas escolhas tem as opções
cadastradas neste modelo cadastradas neste modelo
""" """
@ -200,11 +203,12 @@ class Escolha(BaseChoice):
ordem = models.PositiveIntegerField(blank=True, null=True) ordem = models.PositiveIntegerField(blank=True, null=True)
class Meta: class Meta:
ordering = ('schema','ordem') ordering = ('schema', 'ordem')
verbose_name, verbose_name_plural = 'escolha', 'escolhas' verbose_name, verbose_name_plural = 'escolha', 'escolhas'
class Resposta(BaseAttribute): class Resposta(BaseAttribute):
""" Modelo para guardar as respostas das perguntas """ Modelo para guardar as respostas das perguntas
de um diagnosico de um diagnosico
""" """
@ -218,6 +222,7 @@ class Resposta(BaseAttribute):
class Equipe(models.Model): class Equipe(models.Model):
""" Modelo que representa a equipe de um diagnóstico """ Modelo que representa a equipe de um diagnóstico
""" """
diagnostico = models.ForeignKey(Diagnostico) diagnostico = models.ForeignKey(Diagnostico)
@ -231,6 +236,7 @@ class Equipe(models.Model):
class Anexo(models.Model): class Anexo(models.Model):
""" Modelo para representar os documentos levantados """ Modelo para representar os documentos levantados
no processo de diagnóstico. Podem ser fotos, contratos, etc. no processo de diagnóstico. Podem ser fotos, contratos, etc.
""" """

13
sigi/apps/diagnosticos/templatetags/smart_if.py

@ -19,6 +19,7 @@ register = template.Library()
#============================================================================== #==============================================================================
class BaseCalc(object): class BaseCalc(object):
def __init__(self, var1, var2=None, negate=False): def __init__(self, var1, var2=None, negate=False):
self.var1 = var1 self.var1 = var1
self.var2 = var2 self.var2 = var2
@ -43,31 +44,37 @@ class BaseCalc(object):
class Or(BaseCalc): class Or(BaseCalc):
def calculate(self, var1, var2): def calculate(self, var1, var2):
return var1 or var2 return var1 or var2
class And(BaseCalc): class And(BaseCalc):
def calculate(self, var1, var2): def calculate(self, var1, var2):
return var1 and var2 return var1 and var2
class Equals(BaseCalc): class Equals(BaseCalc):
def calculate(self, var1, var2): def calculate(self, var1, var2):
return var1 == var2 return var1 == var2
class Greater(BaseCalc): class Greater(BaseCalc):
def calculate(self, var1, var2): def calculate(self, var1, var2):
return var1 > var2 return var1 > var2
class GreaterOrEqual(BaseCalc): class GreaterOrEqual(BaseCalc):
def calculate(self, var1, var2): def calculate(self, var1, var2):
return var1 >= var2 return var1 >= var2
class In(BaseCalc): class In(BaseCalc):
def calculate(self, var1, var2): def calculate(self, var1, var2):
return var1 in var2 return var1 in var2
@ -77,10 +84,12 @@ class In(BaseCalc):
#============================================================================== #==============================================================================
class TestVar(object): class TestVar(object):
""" """
A basic self-resolvable object similar to a Django template variable. Used A basic self-resolvable object similar to a Django template variable. Used
to assist with tests. to assist with tests.
""" """
def __init__(self, value): def __init__(self, value):
self.value = value self.value = value
@ -89,6 +98,7 @@ class TestVar(object):
class SmartIfTests(unittest.TestCase): class SmartIfTests(unittest.TestCase):
def setUp(self): def setUp(self):
self.true = TestVar(True) self.true = TestVar(True)
self.false = TestVar(False) self.false = TestVar(False)
@ -142,7 +152,7 @@ class SmartIfTests(unittest.TestCase):
self.assertCalcFalse(GreaterOrEqual(self.low, self.high)) self.assertCalcFalse(GreaterOrEqual(self.low, self.high))
def test_in(self): def test_in(self):
list_ = TestVar([1,2,3]) list_ = TestVar([1, 2, 3])
invalid_list = TestVar(None) invalid_list = TestVar(None)
self.assertCalc(In(self.low, list_)) self.assertCalc(In(self.low, list_))
self.assertCalcFalse(In(self.low, invalid_list)) self.assertCalcFalse(In(self.low, invalid_list))
@ -337,6 +347,7 @@ class TemplateIfParser(IfParser):
class SmartIfNode(template.Node): class SmartIfNode(template.Node):
def __init__(self, var, nodelist_true, nodelist_false=None): def __init__(self, var, nodelist_true, nodelist_false=None):
self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
self.var = var self.var = var

16
sigi/apps/diagnosticos/views.py

@ -173,9 +173,9 @@ def categoria_contatos(request, id_diagnostico):
resposta = { resposta = {
'mensagem': 'sucesso', 'mensagem': 'sucesso',
'erros' : {}, 'erros': {},
'fones' : {}, 'fones': {},
'clean' : (), 'clean': (),
} }
# valida e salva um formulario por vez # valida e salva um formulario por vez
@ -251,10 +251,10 @@ def diagnostico_pdf(request, id_diagnostico):
schema.value = data schema.value = data
schemas.append(schema) schemas.append(schema)
schemas_by_categoria.append((categoria,schemas)) schemas_by_categoria.append((categoria, schemas))
context = RequestContext(request, { context = RequestContext(request, {
'pagesize':'A4', 'pagesize': 'A4',
'casa_legislativa': casa_legislativa, 'casa_legislativa': casa_legislativa,
'funcionarios': funcionarios, 'funcionarios': funcionarios,
'diagnostico': diagnostico, 'diagnostico': diagnostico,
@ -262,13 +262,13 @@ def diagnostico_pdf(request, id_diagnostico):
}) })
return render_to_pdf('diagnosticos/diagnostico_pdf.html', context) 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): def graficos(request):
categorias = Categoria.objects.all() 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() perguntas = Pergunta.objects.filter(categoria=sel_categoria).all()
context = RequestContext(request, { context = RequestContext(request, {
@ -337,7 +337,7 @@ def municipios_diagnosticados(self):
for d in Diagnostico.objects.all(): for d in Diagnostico.objects.all():
m = d.casa_legislativa.municipio 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, 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': "<ul><li>" + "</li><li>".join([m.user.get_full_name() for m in d.membros]) + "</li></ul>",} 'fim': d.data_visita_fim, 'equipe': "<ul><li>" + "</li><li>".join([m.user.get_full_name() for m in d.membros]) + "</li></ul>", }
municipios.append(municipio) municipios.append(municipio)
return HttpResponse(simplejson.dumps(municipios), mimetype="application/json") return HttpResponse(simplejson.dumps(municipios), mimetype="application/json")

11
sigi/apps/diagnosticos/widgets.py

@ -5,9 +5,12 @@ from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from sigi.apps.diagnosticos.models import Escolha from sigi.apps.diagnosticos.models import Escolha
class EavCheckboxSelectMultiple(CheckboxSelectMultiple): class EavCheckboxSelectMultiple(CheckboxSelectMultiple):
def render(self, name, value, attrs=None, choices=()): 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) final_attrs = self.build_attrs(attrs, name=name)
output = [u'<ul>'] output = [u'<ul>']
str_values = set([force_unicode(v) for v in value]) str_values = set([force_unicode(v) for v in value])
@ -29,7 +32,9 @@ class EavCheckboxSelectMultiple(CheckboxSelectMultiple):
output.append(u'</ul>') output.append(u'</ul>')
return mark_safe(u'\n'.join(output)) return mark_safe(u'\n'.join(output))
class EavRadioFieldRenderer(RadioFieldRenderer): class EavRadioFieldRenderer(RadioFieldRenderer):
def __iter__(self): def __iter__(self):
for i, choice in enumerate(self.choices): for i, choice in enumerate(self.choices):
final_attrs = self.attrs.copy() final_attrs = self.attrs.copy()
@ -54,8 +59,8 @@ class EavRadioFieldRenderer(RadioFieldRenderer):
if schema_to_open: if schema_to_open:
final_attrs['schema_to_open'] = schema_to_open.name 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): class EavRadioSelect(RadioSelect):
renderer = EavRadioFieldRenderer renderer = EavRadioFieldRenderer

1
sigi/apps/financeiro/admin.py

@ -2,6 +2,7 @@
from django.contrib import admin from django.contrib import admin
from sigi.apps.financeiro.models import Desembolso from sigi.apps.financeiro.models import Desembolso
class DesembolsoAdmin(admin.ModelAdmin): class DesembolsoAdmin(admin.ModelAdmin):
list_display = ('projeto', 'descricao', 'data', 'valor_reais', 'valor_dolar',) 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', )

2
sigi/apps/financeiro/models.py

@ -2,6 +2,7 @@
from django.db import models from django.db import models
from sigi.apps.convenios.models import Projeto from sigi.apps.convenios.models import Projeto
class Desembolso(models.Model): class Desembolso(models.Model):
projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto') projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto')
descricao = models.CharField(u'Descrição da despesa', max_length=100) descricao = models.CharField(u'Descrição da despesa', max_length=100)
@ -15,4 +16,3 @@ class Desembolso(models.Model):
def __unicode__(self): def __unicode__(self):
return u"%s (US$ %s)" % (self.descricao, self.valor_dolar) return u"%s (US$ %s)" % (self.descricao, self.valor_dolar)

10
sigi/apps/inventario/admin.py

@ -6,15 +6,18 @@ from sigi.apps.inventario.models import (Fornecedor, Fabricante, Equipamento,
TipoEquipamento, ModeloEquipamento, TipoEquipamento, ModeloEquipamento,
Bem) Bem)
class ContatosInline(generic.GenericTabularInline): class ContatosInline(generic.GenericTabularInline):
model = Contato model = Contato
extra = 2 extra = 2
raw_id_fields = ('municipio',) raw_id_fields = ('municipio',)
class TelefonesInline(generic.GenericTabularInline): class TelefonesInline(generic.GenericTabularInline):
model = Telefone model = Telefone
extra = 2 extra = 2
class FornecedorAdmin(admin.ModelAdmin): class FornecedorAdmin(admin.ModelAdmin):
inlines = (TelefonesInline, ContatosInline) inlines = (TelefonesInline, ContatosInline)
list_display = ('id', 'nome', 'email', 'pagina_web') list_display = ('id', 'nome', 'email', 'pagina_web')
@ -22,18 +25,21 @@ class FornecedorAdmin(admin.ModelAdmin):
list_filter = ('nome',) list_filter = ('nome',)
search_fields = ('id', 'nome', 'email', 'pagina_web') search_fields = ('id', 'nome', 'email', 'pagina_web')
class FabricanteAdmin(admin.ModelAdmin): class FabricanteAdmin(admin.ModelAdmin):
list_display = ('id', 'nome') list_display = ('id', 'nome')
list_display_links = list_display list_display_links = list_display
list_filter = ('nome',) list_filter = ('nome',)
search_fields = ('id', 'nome') search_fields = ('id', 'nome')
class TipoEquipamentoAdmin(admin.ModelAdmin): class TipoEquipamentoAdmin(admin.ModelAdmin):
list_display = ('id', 'tipo') list_display = ('id', 'tipo')
list_display_links = list_display list_display_links = list_display
list_filter = ('tipo',) list_filter = ('tipo',)
search_fields = ('id', 'tipo') search_fields = ('id', 'tipo')
class ModeloEquipamentoAdmin(admin.ModelAdmin): class ModeloEquipamentoAdmin(admin.ModelAdmin):
list_display = ('id', 'tipo', 'modelo') list_display = ('id', 'tipo', 'modelo')
list_filter = ('tipo', 'modelo') list_filter = ('tipo', 'modelo')
@ -41,6 +47,7 @@ class ModeloEquipamentoAdmin(admin.ModelAdmin):
search_fields = ('id', 'tipo', 'modelo') search_fields = ('id', 'tipo', 'modelo')
raw_id_fields = ('tipo',) raw_id_fields = ('tipo',)
class EquipamentoAdmin(admin.ModelAdmin): class EquipamentoAdmin(admin.ModelAdmin):
list_display = ('id', 'fabricante', 'modelo', 'get_tipo') list_display = ('id', 'fabricante', 'modelo', 'get_tipo')
list_display_links = ('id',) list_display_links = ('id',)
@ -53,6 +60,7 @@ class EquipamentoAdmin(admin.ModelAdmin):
return obj.modelo.tipo.tipo return obj.modelo.tipo.tipo
get_tipo.short_description = 'tipo' get_tipo.short_description = 'tipo'
class BemAdmin(admin.ModelAdmin): class BemAdmin(admin.ModelAdmin):
list_display = ('equipamento', 'fornecedor', 'num_serie', list_display = ('equipamento', 'fornecedor', 'num_serie',
'casa_legislativa') 'casa_legislativa')
@ -66,6 +74,6 @@ class BemAdmin(admin.ModelAdmin):
admin.site.register(Fornecedor, FornecedorAdmin) admin.site.register(Fornecedor, FornecedorAdmin)
admin.site.register(Fabricante, FabricanteAdmin) admin.site.register(Fabricante, FabricanteAdmin)
admin.site.register(TipoEquipamento, TipoEquipamentoAdmin) admin.site.register(TipoEquipamento, TipoEquipamentoAdmin)
admin.site.register(ModeloEquipamento,ModeloEquipamentoAdmin) admin.site.register(ModeloEquipamento, ModeloEquipamentoAdmin)
admin.site.register(Equipamento, EquipamentoAdmin) admin.site.register(Equipamento, EquipamentoAdmin)
admin.site.register(Bem, BemAdmin) admin.site.register(Bem, BemAdmin)

6
sigi/apps/inventario/models.py

@ -2,6 +2,7 @@
from django.db import models from django.db import models
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
class Fornecedor(models.Model): class Fornecedor(models.Model):
nome = models.CharField(max_length=40) nome = models.CharField(max_length=40)
nome.alphabetic_filter = True nome.alphabetic_filter = True
@ -17,6 +18,7 @@ class Fornecedor(models.Model):
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class Fabricante(models.Model): class Fabricante(models.Model):
nome = models.CharField(max_length=40, unique=True) nome = models.CharField(max_length=40, unique=True)
nome.alphabetic_filter = True nome.alphabetic_filter = True
@ -27,6 +29,7 @@ class Fabricante(models.Model):
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class TipoEquipamento(models.Model): class TipoEquipamento(models.Model):
tipo = models.CharField(max_length=40) tipo = models.CharField(max_length=40)
@ -38,6 +41,7 @@ class TipoEquipamento(models.Model):
def __unicode__(self): def __unicode__(self):
return self.tipo return self.tipo
class ModeloEquipamento(models.Model): class ModeloEquipamento(models.Model):
tipo = models.ForeignKey( tipo = models.ForeignKey(
TipoEquipamento, TipoEquipamento,
@ -53,6 +57,7 @@ class ModeloEquipamento(models.Model):
def __unicode__(self): def __unicode__(self):
return self.modelo return self.modelo
class Equipamento(models.Model): class Equipamento(models.Model):
fabricante = models.ForeignKey(Fabricante) fabricante = models.ForeignKey(Fabricante)
modelo = models.ForeignKey(ModeloEquipamento) modelo = models.ForeignKey(ModeloEquipamento)
@ -64,6 +69,7 @@ class Equipamento(models.Model):
return unicode('%s %s %s' % (self.modelo.tipo, self.fabricante.nome, return unicode('%s %s %s' % (self.modelo.tipo, self.fabricante.nome,
self.modelo.modelo)) self.modelo.modelo))
class Bem(models.Model): class Bem(models.Model):
casa_legislativa = models.ForeignKey('casas.CasaLegislativa') casa_legislativa = models.ForeignKey('casas.CasaLegislativa')
equipamento = models.ForeignKey(Equipamento) equipamento = models.ForeignKey(Equipamento)

15
sigi/apps/mesas/admin.py

@ -7,9 +7,11 @@ from sigi.apps.mesas.models import (Legislatura, Coligacao, ComposicaoColigacao,
MembroMesaDiretora) MembroMesaDiretora)
from sigi.apps.parlamentares.models import Mandato from sigi.apps.parlamentares.models import Mandato
class MandatoInline(admin.TabularInline): class MandatoInline(admin.TabularInline):
model = Mandato model = Mandato
raw_id_fields = ['parlamentar',] raw_id_fields = ['parlamentar', ]
class LegislaturaAdmin(admin.ModelAdmin): class LegislaturaAdmin(admin.ModelAdmin):
date_hierarchy = 'data_inicio' date_hierarchy = 'data_inicio'
@ -17,7 +19,7 @@ class LegislaturaAdmin(admin.ModelAdmin):
raw_id_fields = ('casa_legislativa',) raw_id_fields = ('casa_legislativa',)
list_display_links = ('numero',) list_display_links = ('numero',)
list_filter = ('casa_legislativa__municipio__uf', ) 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,) inlines = (MandatoInline,)
def uf(self, obj): def uf(self, obj):
@ -32,17 +34,19 @@ class LegislaturaAdmin(admin.ModelAdmin):
def response_change(self, request, obj): 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"): if request.POST.has_key("_popup"):
response = HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script>' % \ response = HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script>' %
# escape() calls force_unicode. # escape() calls force_unicode.
(escape(obj.pk), escapejs(obj))) (escape(obj.pk), escapejs(obj)))
return response return response
class ColigacaoAdmin(admin.ModelAdmin): class ColigacaoAdmin(admin.ModelAdmin):
list_display = ('nome', 'legislatura', 'numero_votos') list_display = ('nome', 'legislatura', 'numero_votos')
list_display_links = ('nome',) list_display_links = ('nome',)
raw_id_fields = ('legislatura',) raw_id_fields = ('legislatura',)
search_fields = ('nome', 'legislatura__numero') search_fields = ('nome', 'legislatura__numero')
class ComposicaoColigacaoAdmin(admin.ModelAdmin): class ComposicaoColigacaoAdmin(admin.ModelAdmin):
list_display = ('coligacao', 'partido') list_display = ('coligacao', 'partido')
list_display_links = ('coligacao', 'partido') list_display_links = ('coligacao', 'partido')
@ -50,6 +54,7 @@ class ComposicaoColigacaoAdmin(admin.ModelAdmin):
raw_id_fields = ('coligacao', 'partido') raw_id_fields = ('coligacao', 'partido')
search_fields = ('coligacao__nome', 'partido__nome', 'partido__sigla') search_fields = ('coligacao__nome', 'partido__nome', 'partido__sigla')
class SessaoLegislativaAdmin(admin.ModelAdmin): class SessaoLegislativaAdmin(admin.ModelAdmin):
list_display = ('numero', 'mesa_diretora', 'legislatura', 'tipo', list_display = ('numero', 'mesa_diretora', 'legislatura', 'tipo',
'data_inicio', 'data_fim') 'data_inicio', 'data_fim')
@ -68,16 +73,19 @@ class SessaoLegislativaAdmin(admin.ModelAdmin):
raw_id_fields = ('mesa_diretora', 'legislatura') raw_id_fields = ('mesa_diretora', 'legislatura')
search_fields = ('numero', 'mesa_diretora__casa_legislativa__nome') search_fields = ('numero', 'mesa_diretora__casa_legislativa__nome')
class CargoAdmin(admin.ModelAdmin): class CargoAdmin(admin.ModelAdmin):
list_display = ('descricao',) list_display = ('descricao',)
search_fields = ('descricao',) search_fields = ('descricao',)
class MembroMesaDiretoraInline(admin.TabularInline): class MembroMesaDiretoraInline(admin.TabularInline):
model = MembroMesaDiretora model = MembroMesaDiretora
max_num = 11 max_num = 11
extra = 4 extra = 4
raw_id_fields = ('parlamentar', 'cargo') raw_id_fields = ('parlamentar', 'cargo')
class MembroMesaDiretoraAdmin(admin.ModelAdmin): class MembroMesaDiretoraAdmin(admin.ModelAdmin):
list_display = ('parlamentar', 'cargo', 'mesa_diretora') list_display = ('parlamentar', 'cargo', 'mesa_diretora')
list_display_links = ('parlamentar',) list_display_links = ('parlamentar',)
@ -87,6 +95,7 @@ class MembroMesaDiretoraAdmin(admin.ModelAdmin):
'parlamentar__nome_parlamentar', 'parlamentar__nome_parlamentar',
'mesa_diretora__casa_legislativa__nome') 'mesa_diretora__casa_legislativa__nome')
class MesaDiretoraAdmin(admin.ModelAdmin): class MesaDiretoraAdmin(admin.ModelAdmin):
inlines = (MembroMesaDiretoraInline,) inlines = (MembroMesaDiretoraInline,)
raw_id_fields = ('casa_legislativa',) raw_id_fields = ('casa_legislativa',)

7
sigi/apps/mesas/models.py

@ -2,6 +2,7 @@
from django.db import models from django.db import models
from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.models import CasaLegislativa
class Legislatura(models.Model): class Legislatura(models.Model):
casa_legislativa = models.ForeignKey(CasaLegislativa) casa_legislativa = models.ForeignKey(CasaLegislativa)
numero = models.PositiveSmallIntegerField(u'número legislatura') numero = models.PositiveSmallIntegerField(u'número legislatura')
@ -20,6 +21,7 @@ class Legislatura(models.Model):
def __unicode__(self): 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) 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): class Coligacao(models.Model):
nome = models.CharField(max_length=50) nome = models.CharField(max_length=50)
legislatura = models.ForeignKey(Legislatura) legislatura = models.ForeignKey(Legislatura)
@ -37,6 +39,7 @@ class Coligacao(models.Model):
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class ComposicaoColigacao(models.Model): class ComposicaoColigacao(models.Model):
coligacao = models.ForeignKey(Coligacao, verbose_name='coligação') coligacao = models.ForeignKey(Coligacao, verbose_name='coligação')
partido = models.ForeignKey('parlamentares.Partido') partido = models.ForeignKey('parlamentares.Partido')
@ -48,6 +51,7 @@ class ComposicaoColigacao(models.Model):
def __unicode__(self): def __unicode__(self):
return str(self.id) return str(self.id)
class SessaoLegislativa(models.Model): class SessaoLegislativa(models.Model):
SESSAO_CHOICES = ( SESSAO_CHOICES = (
('O', 'Ordinária'), ('O', 'Ordinária'),
@ -85,6 +89,7 @@ class SessaoLegislativa(models.Model):
def __unicode__(self): def __unicode__(self):
return str(self.numero) return str(self.numero)
class MesaDiretora(models.Model): class MesaDiretora(models.Model):
casa_legislativa = models.ForeignKey( casa_legislativa = models.ForeignKey(
'casas.CasaLegislativa', 'casas.CasaLegislativa',
@ -98,6 +103,7 @@ class MesaDiretora(models.Model):
def __unicode__(self): def __unicode__(self):
return 'Mesa Diretora da %s' % unicode(self.casa_legislativa) return 'Mesa Diretora da %s' % unicode(self.casa_legislativa)
class Cargo(models.Model): class Cargo(models.Model):
descricao = models.CharField(u'descrição', max_length=30) descricao = models.CharField(u'descrição', max_length=30)
@ -107,6 +113,7 @@ class Cargo(models.Model):
def __unicode__(self): def __unicode__(self):
return self.descricao return self.descricao
class MembroMesaDiretora(models.Model): class MembroMesaDiretora(models.Model):
parlamentar = models.ForeignKey('parlamentares.Parlamentar') parlamentar = models.ForeignKey('parlamentares.Parlamentar')
cargo = models.ForeignKey(Cargo) cargo = models.ForeignKey(Cargo)

18
sigi/apps/metas/admin.py

@ -2,11 +2,13 @@
from django.contrib import admin from django.contrib import admin
from sigi.apps.metas.models import Meta, PlanoDiretor from sigi.apps.metas.models import Meta, PlanoDiretor
class MetaAdmin(admin.ModelAdmin): class MetaAdmin(admin.ModelAdmin):
list_display = ('projeto', 'titulo', 'data_inicio', 'data_fim', 'valor_meta', 'valor_executado', 'percentual_concluido',) 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',) fields = ('projeto', 'titulo', 'descricao', 'data_inicio', 'data_fim', 'algoritmo', 'valor_meta',)
list_filter = ('projeto',) list_filter = ('projeto',)
class PlanoDiretorAdmin(admin.ModelAdmin): class PlanoDiretorAdmin(admin.ModelAdmin):
list_display = ('projeto', 'casa_legislativa', 'get_uf', 'status', 'data_entrega', 'data_implantacao',) list_display = ('projeto', 'casa_legislativa', 'get_uf', 'status', 'data_entrega', 'data_implantacao',)
fields = ('projeto', 'casa_legislativa', 'status', 'data_entrega', 'data_implantacao',) fields = ('projeto', 'casa_legislativa', 'status', 'data_entrega', 'data_implantacao',)
@ -24,24 +26,24 @@ class PlanoDiretorAdmin(admin.ModelAdmin):
def changelist_view(self, request, extra_context=None): def changelist_view(self, request, extra_context=None):
import re import re
request.GET._mutable=True request.GET._mutable = True
if 'data_entrega__gte' in request.GET: if 'data_entrega__gte' in request.GET:
value = request.GET.get('data_entrega__gte','') value = request.GET.get('data_entrega__gte', '')
if value == '': if value == '':
del request.GET['data_entrega__gte'] del request.GET['data_entrega__gte']
elif re.match('^\d*$', value): # Year only elif re.match('^\d*$', value): # Year only
request.GET['data_entrega__gte'] = "%s-01-01" % value #Complete with january 1st request.GET['data_entrega__gte'] = "%s-01-01" % value # Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month elif re.match('^\d*\D\d*$', value): # Year and month
request.GET['data_entrega__gte'] = '%s-01' % value #Complete with 1st day of month request.GET['data_entrega__gte'] = '%s-01' % value # Complete with 1st day of month
if 'data_entrega__lte' in request.GET: if 'data_entrega__lte' in request.GET:
value = request.GET.get('data_entrega__lte','') value = request.GET.get('data_entrega__lte', '')
if value == '': if value == '':
del request.GET['data_entrega__lte'] del request.GET['data_entrega__lte']
elif re.match('^\d*$', value): # Year only elif re.match('^\d*$', value): # Year only
request.GET['data_entrega__lte'] = "%s-01-01" % value #Complete with january 1st request.GET['data_entrega__lte'] = "%s-01-01" % value # Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month 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['data_entrega__lte'] = '%s-01' % value # Complete with 1st day of month
request.GET._mutable=False request.GET._mutable = False
return super(PlanoDiretorAdmin, self).changelist_view(request, extra_context) return super(PlanoDiretorAdmin, self).changelist_view(request, extra_context)

4
sigi/apps/metas/management/commands/gera_map_data.py

@ -24,8 +24,10 @@
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from sigi.apps.metas.views import gera_map_data_file from sigi.apps.metas.views import gera_map_data_file
class Command(BaseCommand): class Command(BaseCommand):
help = u'Gera arquivo de dados de plotagem do mapa de atuação do Interlegis.' help = u'Gera arquivo de dados de plotagem do mapa de atuação do Interlegis.'
def handle(self, *args, **options): def handle(self, *args, **options):
result = gera_map_data_file(cronjob=True) result = gera_map_data_file(cronjob=True)
self.stdout.write(result+"\n") self.stdout.write(result + "\n")

13
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.casas.models import CasaLegislativa
from sigi.apps.financeiro.models import Desembolso from sigi.apps.financeiro.models import Desembolso
class Meta(models.Model): class Meta(models.Model):
ALGORITMO_CHOICES = ( ALGORITMO_CHOICES = (
('SUM_GASTOS', u'Soma dos desembolsos'), ('SUM_GASTOS', u'Soma dos desembolsos'),
@ -28,7 +29,7 @@ class Meta(models.Model):
verbose_name_plural = 'Metas BID' verbose_name_plural = 'Metas BID'
def __unicode__(self): def __unicode__(self):
return self.titulo; return self.titulo
@property @property
def valor_executado(self): def valor_executado(self):
@ -83,8 +84,7 @@ class Meta(models.Model):
return valor return valor
def count_equi(self): def count_equi(self):
valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', equipada=True, projeto__pk=3, data_termo_aceite__gte= 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()
self.data_inicio, data_termo_aceite__lte=self.data_fim).exclude(data_termo_aceite=None).count()
return valor return valor
def count_ader(self): def count_ader(self):
@ -103,10 +103,10 @@ class Meta(models.Model):
return valor return valor
def count_conv(self): def count_conv(self):
valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', projeto=self.projeto, data_retorno_assinatura__gte= 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()
self.data_inicio, data_retorno_assinatura__lte=self.data_fim).exclude(data_retorno_assinatura=None).count()
return valor return valor
class PlanoDiretor(models.Model): class PlanoDiretor(models.Model):
STATUS_CHOICE = ( STATUS_CHOICE = (
('E', u'Entregue'), ('E', u'Entregue'),
@ -124,5 +124,4 @@ class PlanoDiretor(models.Model):
verbose_name_plural = 'Planos Diretores' verbose_name_plural = 'Planos Diretores'
def __unicode__(self): def __unicode__(self):
return self.casa_legislativa.nome ; return self.casa_legislativa.nome

2
sigi/apps/metas/templatetags/mapa_tags.py

@ -6,6 +6,7 @@ from sigi.apps.casas.models import CasaLegislativa
register = template.Library() register = template.Library()
@register.filter(name='map_desc_serv') @register.filter(name='map_desc_serv')
def descricao_servicos(value): def descricao_servicos(value):
if not isinstance(value, CasaLegislativa): if not isinstance(value, CasaLegislativa):
@ -32,4 +33,3 @@ def descricao_servicos(value):
return mark_safe(result) return mark_safe(result)
descricao_servicos.is_safe = True descricao_servicos.is_safe = True

42
sigi/apps/metas/views.py

@ -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') JSON_FILE_NAME = os.path.join(MEDIA_ROOT, 'apps/metas/map_data.json')
@login_required
@login_required
def dashboard(request): def dashboard(request):
if request.user.groups.filter(name__in=['SPDT-Servidores', 'SSPLF']).count() <= 0: if request.user.groups.filter(name__in=['SPDT-Servidores', 'SSPLF']).count() <= 0:
raise PermissionDenied raise PermissionDenied
@ -56,6 +56,7 @@ def dashboard(request):
extra_context = {'desembolsos': matriz, 'desembolsos_max': desembolsos_max, 'meses': meses, 'colors': ','.join(colors[:len(matriz)])} 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)) return render_to_response('metas/dashboard.html', extra_context, context_instance=RequestContext(request))
def mapa(request): def mapa(request):
""" """
Mostra o mapa com filtros carregados com valores default Mostra o mapa com filtros carregados com valores default
@ -66,9 +67,9 @@ def mapa(request):
servico_choices = TipoServico.objects.all() servico_choices = TipoServico.objects.all()
projeto_choices = Projeto.objects.all() projeto_choices = Projeto.objects.all()
seit = [ ts.sigla for ts in servico_choices] seit = [ts.sigla for ts in servico_choices]
convenios = ['PML'] # Apenas o ultimo #hardcoded #fixme convenios = ['PML'] # Apenas o ultimo #hardcoded #fixme
equipadas = [] #[p.sigla for p in projeto_choices] equipadas = [] # [p.sigla for p in projeto_choices]
diagnosticos = ['P'] # choices: ["A", "P"] diagnosticos = ['P'] # choices: ["A", "P"]
regioes = [r[0] for r in regiao_choices] regioes = [r[0] for r in regiao_choices]
estados = [] estados = []
@ -105,6 +106,7 @@ def map_data(request):
return HttpResponse(json, mimetype="application/json") return HttpResponse(json, mimetype="application/json")
def map_search(request): def map_search(request):
response = {'result': 'NOT_FOUND'} response = {'result': 'NOT_FOUND'}
if 'q' in request.GET: if 'q' in request.GET:
@ -119,6 +121,7 @@ def map_search(request):
return HttpResponse(simplejson.dumps(response), mimetype="application/json") 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): def map_sum(request):
# Filtrar Casas de acordo com os parâmetros # Filtrar Casas de acordo com os parâmetros
@ -154,7 +157,6 @@ def map_sum(request):
'convenios': tot_projetos.copy(), 'equipadas': tot_projetos.copy(), 'convenios': tot_projetos.copy(), 'equipadas': tot_projetos.copy(),
'diagnosticos': tot_diagnosticos.copy()} 'diagnosticos': tot_diagnosticos.copy()}
# Processar as casas filtradas # Processar as casas filtradas
for casa in casas.distinct(): for casa in casas.distinct():
uf = casa.municipio.uf uf = casa.municipio.uf
@ -192,6 +194,7 @@ def map_sum(request):
} }
return render_to_pdf('metas/map_sum.html', extra_context) 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): def map_list(request):
# Filtrar Casas de acordo com os parâmetros # Filtrar Casas de acordo com os parâmetros
@ -213,24 +216,24 @@ def map_list(request):
for pr in Projeto.objects.all(): for pr in Projeto.objects.all():
cnv[pr.id] = pr.sigla 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()] + 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()])) reduce(lambda x, y: x + y, [['conveniada ao %s' % x, 'equipada por %s' % x] for x in cnv.values()]))
for casa in casas: for casa in casas:
row = [casa.municipio.codigo_ibge, casa.nome, casa.municipio.nome, casa.municipio.uf.sigla, 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(): for id in srv.keys():
try: try:
sv = casa.servico_set.get(tipo_servico__id=id) sv = casa.servico_set.get(tipo_servico__id=id)
row += [sv.data_ativacao,] row += [sv.data_ativacao, ]
except: except:
row += [None,] row += [None, ]
for id in cnv.keys(): for id in cnv.keys():
try: try:
cv = casa.convenio_set.get(projeto__id=id) 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: except:
row += [None, None,] row += [None, None, ]
writer.writerow(row) writer.writerow(row)
return response return response
@ -245,14 +248,15 @@ def map_list(request):
def get_params(request): def get_params(request):
''' Pegar parâmetros da pesquisa ''' ''' Pegar parâmetros da pesquisa '''
return { return {
'seit' : request.GET.getlist('seit'), 'seit': request.GET.getlist('seit'),
'convenios' : request.GET.getlist('convenios'), 'convenios': request.GET.getlist('convenios'),
'equipadas' : request.GET.getlist('equipadas'), 'equipadas': request.GET.getlist('equipadas'),
'diagnosticos' : request.GET.getlist('diagnosticos'), 'diagnosticos': request.GET.getlist('diagnosticos'),
'regioes' : request.GET.getlist('regioes'), 'regioes': request.GET.getlist('regioes'),
'estados' : request.GET.getlist('estados'), 'estados': request.GET.getlist('estados'),
} }
def filtrar_casas(seit, convenios, equipadas, regioes, estados, diagnosticos): def filtrar_casas(seit, convenios, equipadas, regioes, estados, diagnosticos):
''' Filtrar Casas que atendem aos parâmetros de pesquisa ''' ''' 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)
@ -270,6 +274,7 @@ def filtrar_casas(seit, convenios, equipadas, regioes, estados, diagnosticos):
return casas return casas
def gera_map_data_file(cronjob=False): def gera_map_data_file(cronjob=False):
''' Criar um arquivo json em {settings.MEDIA_ROOT}/apps/metas/ com o nome de map_data.json ''' 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. 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(): 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: 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): if not casas.has_key(c.pk):
casa = { casa = {

4
sigi/apps/ocorrencias/admin.py

@ -29,7 +29,7 @@ class ComentarioInline(admin.StackedInline):
class AnexosInline(admin.TabularInline): class AnexosInline(admin.TabularInline):
model = Anexo model = Anexo
extra = 2 extra = 2
readonly_fields = ['data_pub',] readonly_fields = ['data_pub', ]
class OcorrenciaChangeList(ChangeList): class OcorrenciaChangeList(ChangeList):
@ -77,7 +77,7 @@ class OcorrenciaAdmin(admin.ModelAdmin):
fields = list(self.readonly_fields) fields = list(self.readonly_fields)
if obj is not None: if obj is not None:
fields.extend(['casa_legislativa', 'categoria', 'tipo_contato', 'assunto', 'status', 'descricao', ]) 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') fields.append('prioridade')
return fields return fields

4
sigi/apps/ocorrencias/models.py

@ -3,7 +3,7 @@ from django.db import models
class Categoria(models.Model): 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) descricao = models.TextField(u'descrição', blank=True, null=True)
setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=u"Setor responsável") setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=u"Setor responsável")
@ -79,7 +79,7 @@ class Anexo(models.Model):
ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência') ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência')
arquivo = models.FileField(u'Arquivo anexado', upload_to='apps/ocorrencia/anexo/arquivo',) arquivo = models.FileField(u'Arquivo anexado', upload_to='apps/ocorrencia/anexo/arquivo',)
descricao = models.CharField(u'descrição do anexo', max_length='70') 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: class Meta:
ordering = ('-data_pub',) ordering = ('-data_pub',)

17
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.parlamentares.views import adicionar_parlamentar_carrinho
from sigi.apps.utils.alphabetic_filter import AlphabeticFilter from sigi.apps.utils.alphabetic_filter import AlphabeticFilter
class MandatosInline(admin.TabularInline): class MandatosInline(admin.TabularInline):
model = Mandato model = Mandato
extra = 1 extra = 1
raw_id_fields = ('legislatura', 'partido') raw_id_fields = ('legislatura', 'partido')
class TelefonesInline(generic.GenericTabularInline): class TelefonesInline(generic.GenericTabularInline):
model = Telefone model = Telefone
extra = 2 extra = 2
class PartidoAdmin(admin.ModelAdmin): class PartidoAdmin(admin.ModelAdmin):
list_display = ('nome', 'sigla') list_display = ('nome', 'sigla')
list_display_links = ('nome', 'sigla') list_display_links = ('nome', 'sigla')
@ -35,14 +38,14 @@ class ParlamentarAdmin(admin.ModelAdmin):
list_display = ('nome_completo', 'nome_parlamentar', 'sexo') list_display = ('nome_completo', 'nome_parlamentar', 'sexo')
list_display_links = ('nome_completo', 'nome_parlamentar') list_display_links = ('nome_completo', 'nome_parlamentar')
list_filter = ('nome_parlamentar', ParlamentarNomeCompletoFilter) list_filter = ('nome_parlamentar', ParlamentarNomeCompletoFilter)
actions = ['adiciona_parlamentar',] actions = ['adiciona_parlamentar', ]
fieldsets = ( fieldsets = (
(None, { (None, {
'fields': ('nome_completo', 'nome_parlamentar', 'sexo'), 'fields': ('nome_completo', 'nome_parlamentar', 'sexo'),
}), }),
# ('Endereço', { # ('Endereço', {
# 'fields': ('logradouro', 'bairro', 'municipio', 'cep'), # 'fields': ('logradouro', 'bairro', 'municipio', 'cep'),
# }), # }),
('Outras informações', { ('Outras informações', {
'fields': ('data_nascimento', 'email', 'pagina_web', 'foto'), 'fields': ('data_nascimento', 'email', 'pagina_web', 'foto'),
}), }),
@ -57,13 +60,13 @@ class ParlamentarAdmin(admin.ModelAdmin):
q1 = len(request.session['carrinho_parlamentar']) q1 = len(request.session['carrinho_parlamentar'])
else: else:
q1 = 0 q1 = 0
adicionar_parlamentar_carrinho(request,queryset=queryset) adicionar_parlamentar_carrinho(request, queryset=queryset)
q2 = len(request.session['carrinho_parlamentar']) q2 = len(request.session['carrinho_parlamentar'])
quant = q2 - q1 quant = q2 - q1
if quant: if quant:
self.message_user(request,"%s Parlamentares adicionados no carrinho" % (quant) ) self.message_user(request, "%s Parlamentares adicionados no carrinho" % (quant))
else: 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('.') return HttpResponseRedirect('.')
adiciona_parlamentar.short_description = u"Armazenar parlamentar no carrinho para exportar" adiciona_parlamentar.short_description = u"Armazenar parlamentar no carrinho para exportar"

1
sigi/apps/parlamentares/models.py

@ -75,6 +75,5 @@ class Mandato(models.Model):
# choices=SUPLENCIA_CHOICES, # choices=SUPLENCIA_CHOICES,
# ) # )
def __unicode__(self): def __unicode__(self):
return str(self.id) return str(self.id)

419
sigi/apps/parlamentares/reports.py

@ -3,31 +3,32 @@ from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm from reportlab.lib.units import cm
from reportlab.lib.enums import TA_CENTER, TA_RIGHT from reportlab.lib.enums import TA_CENTER, TA_RIGHT
from geraldo import Report, DetailBand, Label, ObjectValue, ManyElements, \ 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.apps.relatorios.reports import ReportDefault
from geraldo.graphics import Image from geraldo.graphics import Image
def string_to_cm(texto): def string_to_cm(texto):
tamanho = 0 tamanho = 0
minEspeciais = { minEspeciais = {
'f':0.1, 'f': 0.1,
'i':0.05, 'i': 0.05,
'j':0.05, 'j': 0.05,
'l':0.05, 'l': 0.05,
'm':0.2, 'm': 0.2,
'r':0.1, 'r': 0.1,
't':0.15, 't': 0.15,
} }
maiuEspeciais = { maiuEspeciais = {
'I':0.05, 'I': 0.05,
'J':0.15, 'J': 0.15,
'L':0.15, 'L': 0.15,
'P':0.15, 'P': 0.15,
} }
for c in texto: for c in texto:
if c > 'a' and c<'z': if c > 'a' and c < 'z':
if c in minEspeciais: if c in minEspeciais:
tamanho += minEspeciais[c] tamanho += minEspeciais[c]
else: else:
@ -39,7 +40,9 @@ def string_to_cm(texto):
tamanho += 0.2 tamanho += 0.2
return tamanho return tamanho
class ParlamentaresLabels(Report): class ParlamentaresLabels(Report):
""" """
Usage example:: Usage example::
@ -54,7 +57,7 @@ class ParlamentaresLabels(Report):
largura_etiqueta = 7 largura_etiqueta = 7
altura_etiqueta = 3.3 altura_etiqueta = 3.3
tamanho_fonte = 6.4 tamanho_fonte = 6.4
altura_dados = 0.3 #logradouro, bairro, municipio, cep altura_dados = 0.3 # logradouro, bairro, municipio, cep
delta = start = 0.5 delta = start = 0.5
def __init__(self, queryset, formato): def __init__(self, queryset, formato):
@ -63,17 +66,17 @@ class ParlamentaresLabels(Report):
self.page_size = A4 self.page_size = A4
if formato == '3x9_etiqueta': if formato == '3x9_etiqueta':
self.margin_top = 0.0*cm self.margin_top = 0.0 * cm
self.margin_bottom = 0.0*cm self.margin_bottom = 0.0 * cm
self.margin_left = -1*cm self.margin_left = -1 * cm
self.margin_right = 0.0*cm self.margin_right = 0.0 * cm
self.delta = 0.4 # espaçamento entre as "strings/linhas" da etiqueta 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.start = 0.2 # valor entre a margin top e a etiqueta
else: else:
self.margin_top = 0.8*cm self.margin_top = 0.8 * cm
self.margin_bottom = 0.8*cm self.margin_bottom = 0.8 * cm
self.margin_left = 0.4*cm self.margin_left = 0.4 * cm
self.margin_right = 0.4*cm self.margin_right = 0.4 * cm
self.largura_etiqueta = 9.9 self.largura_etiqueta = 9.9
self.altura_etiqueta = 5.6 self.altura_etiqueta = 5.6
self.tamanho_fonte = 11 self.tamanho_fonte = 11
@ -83,40 +86,41 @@ class ParlamentaresLabels(Report):
my_elements = [ my_elements = [
Label( Label(
text=u'A Sua Excelência o(a) Senhor(a)', 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( ObjectValue(
attribute_name='nome_completo', 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: get_value=lambda instance:
instance.nome_completo or "" instance.nome_completo or ""
), ),
ObjectValue( ObjectValue(
attribute_name='logradouro', 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: get_value=lambda instance:
logradouro_parlamentar(instance) logradouro_parlamentar(instance)
), ),
ObjectValue( ObjectValue(
attribute_name='bairro', 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: get_value=lambda instance:
bairro_parlamentar(instance) bairro_parlamentar(instance)
), ),
ObjectValue( ObjectValue(
attribute_name='municipio', 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: get_value=lambda instance:
municipio_parlamentar(instance) municipio_parlamentar(instance)
), ),
ObjectValue( ObjectValue(
attribute_name='cep', 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: get_value=lambda instance:
cep_parlamentar(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): def logradouro_parlamentar(instance):
try: try:
@ -124,18 +128,21 @@ def logradouro_parlamentar(instance):
except: except:
return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>" return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>"
def bairro_parlamentar(instance): def bairro_parlamentar(instance):
try: try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.bairro return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.bairro
except: except:
return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>" return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>"
def municipio_parlamentar(instance): def municipio_parlamentar(instance):
try: try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.municipio return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.municipio
except: except:
return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>" return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>"
def cep_parlamentar(instance): def cep_parlamentar(instance):
try: try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.cep return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.cep
@ -145,103 +152,101 @@ def cep_parlamentar(instance):
class CasasLegislativasReport(ReportDefault): class CasasLegislativasReport(ReportDefault):
title = u'Relatório de Casas Legislativas' title = u'Relatório de Casas Legislativas'
height = 80*cm height = 80 * cm
page_size = landscape(A4) page_size = landscape(A4)
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top 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 = list(ReportDefault.band_page_header.elements)
elements = [ elements = [
Image(filename= ReportDefault.band_page_header.BASE_DIR + '/media/images/logo-interlegis.jpg', 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, left=23.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=4.2*cm,height=3*cm, width=4.2 * cm, height=3 * cm,
), ),
Image(filename= ReportDefault.band_page_header.BASE_DIR + '/media/images/logo-senado.png', 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, left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=3*cm,height=3*cm, width=3 * cm, height=3 * cm,
), ),
Label(text=u"SENADO FEDERAL",top=1*cm,left=0,width=BAND_WIDTH, Label(text=u"SENADO FEDERAL", top=1 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} 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, 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} style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER}
), ),
SystemField( SystemField(
expression='%(report_title)s',top=2.5*cm,left=0,width=BAND_WIDTH, expression='%(report_title)s', top=2.5 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}
), ),
Label( Label(
text=u"UF", text=u"UF",
left=label_left[0]*cm, left=label_left[0] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=u"Municipio", text=u"Municipio",
left=label_left[1]*cm, left=label_left[1] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=u"Presidente", text=u"Presidente",
left=label_left[2]*cm, left=label_left[2] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=u"Endereço", text=u"Endereço",
left=label_left[3]*cm, left=label_left[3] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=u"Endereço na Internet", text=u"Endereço na Internet",
left=label_left[4]*cm, left=label_left[4] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=u"Email", text=u"Email",
left=label_left[5]*cm, left=label_left[5] * cm,
top=label_top, top=label_top,
), ),
] ]
class band_page_footer(ReportDefault.band_page_footer): class band_page_footer(ReportDefault.band_page_footer):
pass pass
class band_detail(ReportDefault.band_detail): 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( ObjectValue(
attribute_name='municipio.uf.sigla', attribute_name='municipio.uf.sigla',
left=label_left[0]*cm, left=label_left[0] * cm,
width=1*cm, width=1 * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='municipio.nome', attribute_name='municipio.nome',
left=label_left[1]*cm, left=label_left[1] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='presidente', attribute_name='presidente',
left=label_left[2]*cm, left=label_left[2] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='logradouro', attribute_name='logradouro',
left=label_left[3]*cm, left=label_left[3] * cm,
get_value=lambda instance: instance.logradouro + ' - '+ instance.bairro, get_value=lambda instance: instance.logradouro + ' - ' + instance.bairro,
), ),
ObjectValue( ObjectValue(
attribute_name='pagina_web', attribute_name='pagina_web',
left=label_left[4]*cm, left=label_left[4] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='email', attribute_name='email',
left=label_left[5]*cm, left=label_left[5] * cm,
), ),
] ]
@ -249,8 +254,8 @@ class CasasLegislativasReport(ReportDefault):
groups = [ groups = [
ReportGroup(attribute_name='municipio.uf', ReportGroup(attribute_name='municipio.uf',
band_header=ReportBand( band_header=ReportBand(
height=0.7*cm, height=0.7 * cm,
elements= [ elements=[
ObjectValue(attribute_name='municipio.uf') ObjectValue(attribute_name='municipio.uf')
], ],
borders={'top': True}, borders={'top': True},
@ -261,274 +266,276 @@ class CasasLegislativasReport(ReportDefault):
class InfoCasaLegislativa(ReportDefault): class InfoCasaLegislativa(ReportDefault):
title = u'Casa legislativa' title = u'Casa legislativa'
class band_summary(ReportBand): class band_summary(ReportBand):
pass pass
class band_page_footer(ReportBand): class band_page_footer(ReportBand):
height = 1*cm height = 1 * cm
elements = [ 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): class band_detail(ReportDefault.band_detail):
posicao_left = [ posicao_left = [
0,1.3, #Tipo 0, 1.3, # Tipo
0,1.8, #Regiao 0, 1.8, # Regiao
5.5,6.8, #U.F. 5.5, 6.8, # U.F.
0,2.3, #Municipio 0, 2.3, # Municipio
0,2.4, #Endereco 0, 2.4, # Endereco
0,1.6, #Bairro 0, 1.6, # Bairro
0,1.3, #CEP 0, 1.3, # CEP
0,1.6, #CNPJ 0, 1.6, # CNPJ
0,2.3, #Telefone 0, 2.3, # Telefone
0,2.7, #Presidente 0, 2.7, # Presidente
] ]
posicao_top = [ posicao_top = [
0.5, #Tipo 0.5, # Tipo
1.3, #Regiao 1.3, # Regiao
1.3, #U.F. 1.3, # U.F.
2.1, #Municipio 2.1, # Municipio
2.9, #Logradouro 2.9, # Logradouro
3.7, #Bairro 3.7, # Bairro
4.5, #CEP 4.5, # CEP
5.3, #CNPJ 5.3, # CNPJ
6.1, #Telefone 6.1, # Telefone
6.9, #Presidente 6.9, # Presidente
] ]
height=30*cm height = 30 * cm
display_inline = True display_inline = True
default_style = {'fontName': 'Helvetica', 'fontSize':14} default_style = {'fontName': 'Helvetica', 'fontSize': 14}
elements = [ elements = [
Label( Label(
text=u"Tipo: ", text=u"Tipo: ",
left=posicao_left[0]*cm, left=posicao_left[0] * cm,
top=posicao_top[0]*cm, top=posicao_top[0] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='tipo.nome', attribute_name='tipo.nome',
left=posicao_left[1]*cm, left=posicao_left[1] * cm,
top=posicao_top[0]*cm, top=posicao_top[0] * cm,
width=6*cm, width=6 * cm,
), ),
Label( Label(
text=u"Região: ", text=u"Região: ",
left=posicao_left[2]*cm, left=posicao_left[2] * cm,
top=posicao_top[1]*cm, top=posicao_top[1] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='municipio.uf.regiao', attribute_name='municipio.uf.regiao',
left=posicao_left[3]*cm, left=posicao_left[3] * cm,
top=posicao_top[1]*cm, top=posicao_top[1] * cm,
get_value=lambda instance: get_value=lambda instance:
{'SL': 'Sul','SD': 'Sudeste','CO': 'Centro-Oeste','NE': 'Nordeste','NO': 'Norte',} {'SL': 'Sul', 'SD': 'Sudeste', 'CO': 'Centro-Oeste', 'NE': 'Nordeste', 'NO': 'Norte', }
[instance.municipio.uf.regiao] [instance.municipio.uf.regiao]
), ),
Label( Label(
text=u"U.F.: ", text=u"U.F.: ",
left=posicao_left[4]*cm, left=posicao_left[4] * cm,
top=posicao_top[2]*cm, top=posicao_top[2] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='municipio.uf', attribute_name='municipio.uf',
left=posicao_left[5]*cm, left=posicao_left[5] * cm,
top=posicao_top[2]*cm, top=posicao_top[2] * cm,
), ),
Label( Label(
text=u"Município: ", text=u"Município: ",
left=posicao_left[6]*cm, left=posicao_left[6] * cm,
top=posicao_top[3]*cm, top=posicao_top[3] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='municipio.nome', attribute_name='municipio.nome',
left=posicao_left[7]*cm, left=posicao_left[7] * cm,
top=posicao_top[3]*cm, top=posicao_top[3] * cm,
width=20*cm, width=20 * cm,
), ),
# Linha 3 # Linha 3
Label( Label(
text=u"Endereço: ", text=u"Endereço: ",
left=posicao_left[8]*cm, left=posicao_left[8] * cm,
top=posicao_top[4]*cm, top=posicao_top[4] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='logradouro', attribute_name='logradouro',
left=posicao_left[9]*cm, left=posicao_left[9] * cm,
top=posicao_top[4]*cm, top=posicao_top[4] * cm,
width=20*cm, width=20 * cm,
), ),
Label( Label(
text=u"Bairro: ", text=u"Bairro: ",
left=posicao_left[10]*cm, left=posicao_left[10] * cm,
top=posicao_top[5]*cm, top=posicao_top[5] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='bairro', attribute_name='bairro',
left=posicao_left[11]*cm, left=posicao_left[11] * cm,
top=posicao_top[5]*cm, top=posicao_top[5] * cm,
), ),
Label( Label(
text=u"CEP: ", text=u"CEP: ",
left=posicao_left[12]*cm, left=posicao_left[12] * cm,
top=posicao_top[6]*cm, top=posicao_top[6] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='cep', attribute_name='cep',
left=posicao_left[13]*cm, left=posicao_left[13] * cm,
top=posicao_top[6]*cm, top=posicao_top[6] * cm,
), ),
Label( Label(
text=u"CNPJ: ", text=u"CNPJ: ",
left=posicao_left[14]*cm, left=posicao_left[14] * cm,
top=posicao_top[7]*cm, top=posicao_top[7] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='cnpj', attribute_name='cnpj',
left=posicao_left[15]*cm, left=posicao_left[15] * cm,
top=posicao_top[7]*cm, top=posicao_top[7] * cm,
), ),
Label( Label(
text=u"Telefone: ", text=u"Telefone: ",
left=posicao_left[16]*cm, left=posicao_left[16] * cm,
top=posicao_top[8]*cm, top=posicao_top[8] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='telefone', attribute_name='telefone',
left=posicao_left[17]*cm, left=posicao_left[17] * cm,
top=posicao_top[8]*cm, top=posicao_top[8] * cm,
), ),
Label( Label(
text=u"Presidente: ", text=u"Presidente: ",
left=posicao_left[18]*cm, left=posicao_left[18] * cm,
top=posicao_top[9]*cm, top=posicao_top[9] * cm,
), ),
ObjectValue( ObjectValue(
attribute_name='presidente', attribute_name='presidente',
left=posicao_left[19]*cm, left=posicao_left[19] * cm,
top=posicao_top[9]*cm, top=posicao_top[9] * cm,
width=20*cm, width=20 * cm,
), ),
] ]
# Telefones # Telefones
tel_top = 2*cm tel_top = 2 * cm
tel_left = [0,3,5] tel_left = [0, 3, 5]
# Contato # Contato
cont_top = 2*cm cont_top = 2 * cm
cont_left = [0,6,9] cont_left = [0, 6, 9]
# Convenios # Convenios
convenio_top = 2*cm convenio_top = 2 * cm
convenio_left = [0,1.8,4.5,8,10.5,13,15.5,18] convenio_left = [0, 1.8, 4.5, 8, 10.5, 13, 15.5, 18]
subreports = [ subreports = [
# Telefones # Telefones
SubReport( SubReport(
queryset_string = '%(object)s.telefones.all()', queryset_string='%(object)s.telefones.all()',
band_header = ReportBand( band_header=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':12 }, default_style={'fontName': 'Helvetica', 'fontSize': 12},
height=2.5*cm, height=2.5 * cm,
elements = [ elements=[
Label( Label(
text=u"Telefone(s)", text=u"Telefone(s)",
style = {'fontSize':14,'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, 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"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"Tipo", left=tel_left[1] * cm, top=tel_top),
Label(text=u"Nota",left=tel_left[2]*cm,top=tel_top), Label(text=u"Nota", left=tel_left[2] * cm, top=tel_top),
], ],
borders = {'bottom': True}, borders={'bottom': True},
), ),
band_detail = ReportBand( band_detail=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':11}, default_style={'fontName': 'Helvetica', 'fontSize': 11},
height=0.5*cm, height=0.5 * cm,
elements= [ elements=[
ObjectValue(attribute_name='__unicode__',left=tel_left[0]*cm), ObjectValue(attribute_name='__unicode__', left=tel_left[0] * cm),
ObjectValue(attribute_name='tipo',left=tel_left[1]*cm, ObjectValue(attribute_name='tipo', left=tel_left[1] * cm,
get_value = lambda instance: get_value=lambda instance:
{'F':'Fixo','M':u'Móvel','X':'Fax','I':'Indefinido'}[instance.tipo], {'F': 'Fixo', 'M': u'Móvel', 'X': 'Fax', 'I': 'Indefinido'}[instance.tipo],
), ),
ObjectValue(attribute_name='nota',left=tel_left[2]*cm), ObjectValue(attribute_name='nota', left=tel_left[2] * cm),
], ],
#borders = {'all':True}, #borders = {'all':True},
), ),
), ),
#Contatos # Contatos
SubReport( SubReport(
queryset_string = '%(object)s.funcionario_set.all()', queryset_string='%(object)s.funcionario_set.all()',
band_header = ReportBand( band_header=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':12 }, default_style={'fontName': 'Helvetica', 'fontSize': 12},
height=2.5*cm, height=2.5 * cm,
elements = [ elements=[
Label( Label(
text=u"Contato(s)", text=u"Contato(s)",
style = {'fontSize':14,'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1*cm, top=1 * cm,
), ),
Label(text=u"Nome",left=cont_left[0]*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"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"E-mail", left=cont_left[2] * cm, top=cont_top),
], ],
borders = {'bottom': True,'top':True}, borders={'bottom': True, 'top': True},
), ),
band_detail = ReportBand( band_detail=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':11}, default_style={'fontName': 'Helvetica', 'fontSize': 11},
height=0.5*cm, height=0.5 * cm,
elements= [ elements=[
ObjectValue(attribute_name='nome',left=cont_left[0]*cm), ObjectValue(attribute_name='nome', left=cont_left[0] * cm),
ObjectValue(attribute_name='nota',left=cont_left[1]*cm), ObjectValue(attribute_name='nota', left=cont_left[1] * cm),
ObjectValue(attribute_name='email',left=cont_left[2]*cm), ObjectValue(attribute_name='email', left=cont_left[2] * cm),
], ],
#borders = {'all':True}, #borders = {'all':True},
), ),
), ),
#Convenios # Convenios
SubReport( SubReport(
queryset_string = '%(object)s.convenio_set.all()', queryset_string='%(object)s.convenio_set.all()',
band_header = ReportBand( band_header=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':12 }, default_style={'fontName': 'Helvetica', 'fontSize': 12},
height=2.5*cm, height=2.5 * cm,
elements=[ elements=[
Label( Label(
text=u"Convênio(s)", text=u"Convênio(s)",
style = {'fontSize':14,'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1*cm, top=1 * cm,
), ),
Label(text=u"Projeto",left=convenio_left[0]*cm,top=convenio_top), 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º 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"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"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"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"Equipada", left=convenio_left[5] * cm, top=convenio_top),
Label(text=u"Data D.O.",left=convenio_left[6]*cm,top=convenio_top), Label(text=u"Data D.O.", left=convenio_left[6] * cm, top=convenio_top),
], ],
borders = {'bottom': True} borders={'bottom': True}
), ),
band_detail = ReportBand( band_detail=ReportBand(
default_style = {'fontName': 'Helvetica', 'fontSize':11}, default_style={'fontName': 'Helvetica', 'fontSize': 11},
height=0.5*cm, height=0.5 * cm,
elements=[ elements=[
ObjectValue(attribute_name='projeto.sigla',left=convenio_left[0]*cm), ObjectValue(attribute_name='projeto.sigla', left=convenio_left[0] * cm),
ObjectValue(attribute_name='num_convenio',left=convenio_left[1]*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='num_processo_sf', left=convenio_left[2] * cm),
ObjectValue(attribute_name='data_adesao',left=convenio_left[3]*cm, ObjectValue(attribute_name='data_adesao', left=convenio_left[3] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-' instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-'
), ),
ObjectValue(attribute_name='data_retorno_assinatura',left=convenio_left[4]*cm, ObjectValue(attribute_name='data_retorno_assinatura', left=convenio_left[4] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-' 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, ObjectValue(attribute_name='data_termo_aceite', left=convenio_left[5] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_termo_aceite.strftime('%d/%m/%Y') if instance.data_termo_aceite != None else '-' 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, ObjectValue(attribute_name='data_pub_diario', left=convenio_left[6] * cm,
get_value=lambda instance: get_value=lambda instance:
instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-' instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-'
), ),

29
sigi/apps/parlamentares/views.py

@ -18,7 +18,7 @@ from sigi.apps.parlamentares.reports import ParlamentaresLabels
from geraldo.generators import PDFGenerator 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': 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'): if not request.session.has_key('carrinho_parlametar'):
@ -55,10 +55,10 @@ def visualizar_carrinho(request):
carrinhoIsEmpty = not(request.session.has_key('carrinho_parlamentares')) carrinhoIsEmpty = not(request.session.has_key('carrinho_parlamentares'))
return render_to_response('parlamentares/carrinho.html', return render_to_response('parlamentares/carrinho.html',
{'MEDIA_URL':settings.MEDIA_URL, {'MEDIA_URL': settings.MEDIA_URL,
'carIsEmpty':carrinhoIsEmpty, 'carIsEmpty': carrinhoIsEmpty,
'paginas':paginas, 'paginas': paginas,
'query_str':'?'+request.META['QUERY_STRING']}, 'query_str': '?' + request.META['QUERY_STRING']},
context_instance=RequestContext(request)) context_instance=RequestContext(request))
@ -72,31 +72,31 @@ def carrinhoOrGet_for_qs(request):
else: else:
qs = Parlamentar.objects.all() qs = Parlamentar.objects.all()
if request.GET: if request.GET:
qs = get_for_qs(request.GET,qs) qs = get_for_qs(request.GET, qs)
return qs return qs
def query_ordena(qs,o,ot): def query_ordena(qs, o, ot):
list_display = ('nome_completo',) list_display = ('nome_completo',)
aux = list_display[(int(o)-1)] aux = list_display[(int(o) - 1)]
if ot =='asc': if ot == 'asc':
qs = qs.order_by(aux) qs = qs.order_by(aux)
else: else:
qs = qs.order_by("-"+aux) qs = qs.order_by("-" + aux)
return qs return qs
def get_for_qs(get,qs): def get_for_qs(get, qs):
""" """
Verifica atributos do GET e retorna queryset correspondente Verifica atributos do GET e retorna queryset correspondente
""" """
kwargs = {} kwargs = {}
for k,v in get.iteritems(): for k, v in get.iteritems():
if not (k == 'page' or k == 'pop' or k == 'q'): if not (k == 'page' or k == 'pop' or k == 'q'):
if not k == 'o': if not k == 'o':
if k == "ot": if k == "ot":
qs = query_ordena(qs,get["o"],get["ot"]) qs = query_ordena(qs, get["o"], get["ot"])
else: else:
kwargs[str(k)] = v kwargs[str(k)] = v
qs = qs.filter(**kwargs) qs = qs.filter(**kwargs)
@ -116,7 +116,7 @@ def deleta_itens_carrinho(request):
if lista: if lista:
request.session['carrinho_parlamentar'] = lista request.session['carrinho_parlamentar'] = lista
else: else:
del lista; del lista
del request.session['carrinho_parlamentar'] del request.session['carrinho_parlamentar']
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
@ -130,7 +130,6 @@ def labels_report(request, id=None, formato='3x9_etiqueta'):
if request.POST.has_key('tipo_etiqueta'): if request.POST.has_key('tipo_etiqueta'):
tipo = request.POST['tipo_etiqueta'] tipo = request.POST['tipo_etiqueta']
if id: if id:
qs = Parlamentar.objects.filter(pk=id) qs = Parlamentar.objects.filter(pk=id)

48
sigi/apps/relatorios/reports.py

@ -2,7 +2,7 @@
import os import os
from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \ from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \
landscape,SystemField, BAND_WIDTH,ReportGroup, \ landscape, SystemField, BAND_WIDTH, ReportGroup, \
FIELD_ACTION_SUM, FIELD_ACTION_COUNT, Line FIELD_ACTION_SUM, FIELD_ACTION_COUNT, Line
from geraldo.graphics import Image from geraldo.graphics import Image
from reportlab.lib.units import cm from reportlab.lib.units import cm
@ -19,58 +19,56 @@ class ReportDefault(Report):
page_size = A4 page_size = A4
class band_page_header(ReportBand): class band_page_header(ReportBand):
height = 4.2*cm height = 4.2 * cm
label_top = 3.7*cm label_top = 3.7 * cm
default_style = {'fontName': 'Helvetica', 'fontSize':9} default_style = {'fontName': 'Helvetica', 'fontSize': 9}
BASE_DIR = os.path.abspath(os.path.dirname(__file__) + '../../../../') BASE_DIR = os.path.abspath(os.path.dirname(__file__) + '../../../../')
#BASE_DIR = os.path.abspath(os.getcwd() + '../..') #BASE_DIR = os.path.abspath(os.getcwd() + '../..')
elements = [ elements = [
Image(filename= BASE_DIR + '/media/images/logo-interlegis.jpg', Image(filename=BASE_DIR + '/media/images/logo-interlegis.jpg',
left=15.5*cm,right=1*cm,top=0.1*cm,bottom=1*cm, left=15.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=4.2*cm,height=3*cm, width=4.2 * cm, height=3 * cm,
), ),
Image(filename= BASE_DIR + '/media/images/logo-senado.png', Image(filename=BASE_DIR + '/media/images/logo-senado.png',
left=1*cm,right=1*cm,top=0.1*cm,bottom=1*cm, left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=3*cm,height=3*cm, width=3 * cm, height=3 * cm,
), ),
Label(text="SENADO FEDERAL",top=1*cm,left=0,width=BAND_WIDTH, Label(text="SENADO FEDERAL", top=1 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} 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, 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} style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER}
), ),
SystemField( SystemField(
expression='%(report_title)s',top=2.5*cm,left=0,width=BAND_WIDTH, expression='%(report_title)s', top=2.5 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold','fontSize':14, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}
), ),
] ]
borders = {'bottom': True} borders = {'bottom': True}
class band_page_footer(ReportBand): class band_page_footer(ReportBand):
height = 1*cm height = 1 * cm
elements = [ 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),
SystemField(expression=u'Página %(page_number)d de %(page_count)d', 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} width=BAND_WIDTH, style={'alignment': TA_RIGHT}
), ),
] ]
#borders = {'top': True} #borders = {'top': True}
class band_detail(DetailBand): class band_detail(DetailBand):
height = 0.5*cm height = 0.5 * cm
default_style = {'fontName': 'Helvetica', 'fontSize': 8} default_style = {'fontName': 'Helvetica', 'fontSize': 8}
auto_expand_height = True auto_expand_height = True
class band_summary(ReportBand): class band_summary(ReportBand):
height = 0.8*cm height = 0.8 * cm
elements = [ elements = [
Label(text="Total:", top=0.1*cm, left=0), Label(text="Total:", top=0.1 * cm, left=0),
ObjectValue(attribute_name='id', top=0.1*cm, left=1*cm,\ ObjectValue(attribute_name='id', top=0.1 * cm, left=1 * cm,
action=FIELD_ACTION_COUNT, display_format='%s'), action=FIELD_ACTION_COUNT, display_format='%s'),
] ]
borders = {'top': Line(stroke_color=navy, stroke_width=2)} borders = {'top': Line(stroke_color=navy, stroke_width=2)}

25
sigi/apps/servicos/admin.py

@ -17,6 +17,7 @@ class LogServicoInline(admin.StackedInline):
class ServicoFormAdmin(ModelForm): class ServicoFormAdmin(ModelForm):
class Meta: class Meta:
model = Servico model = Servico
fields = '__all__' fields = '__all__'
@ -50,19 +51,19 @@ class TipoServicoAdmin(admin.ModelAdmin):
class ServicoAdmin(admin.ModelAdmin): class ServicoAdmin(admin.ModelAdmin):
form = ServicoFormAdmin form = ServicoFormAdmin
actions = ['calcular_data_uso',] actions = ['calcular_data_uso', ]
list_display = ('casa_legislativa', 'get_codigo_interlegis', 'get_uf', 'tipo_servico', 'hospedagem_interlegis', list_display = ('casa_legislativa', 'get_codigo_interlegis', 'get_uf', 'tipo_servico', 'hospedagem_interlegis',
'data_ativacao', 'data_desativacao', 'getUrl', 'data_ultimo_uso', 'get_link_erro') 'data_ativacao', 'data_desativacao', 'getUrl', 'data_ultimo_uso', 'get_link_erro')
fieldsets = (( None, { fieldsets = ((None, {
'fields': ('casa_legislativa', 'data_ativacao',) 'fields': ('casa_legislativa', 'data_ativacao',)
}), }),
( 'Serviço', { ('Serviço', {
'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),) 'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),)
}), }),
( 'Contatos', { ('Contatos', {
'fields': ('contato_tecnico', 'contato_administrativo',) 'fields': ('contato_tecnico', 'contato_administrativo',)
}), }),
( 'Alterações', { ('Alterações', {
'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',) 'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',)
})) }))
readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao') readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao')
@ -102,7 +103,7 @@ class ServicoAdmin(admin.ModelAdmin):
def calcular_data_uso(self, request, queryset): def calcular_data_uso(self, request, queryset):
for servico in queryset: for servico in queryset:
servico.atualiza_data_uso() 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('.') return HttpResponseRedirect('.')
calcular_data_uso.short_description = u"Atualizar a data do último uso do(s) serviço(s)" 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 from django.utils.datastructures import SortedDict
actions = [self.get_action(action) for action in self.actions] actions = [self.get_action(action) for action in self.actions]
actions = filter(None, actions) actions = filter(None, actions)
actions.sort(lambda a,b: cmp(a[2].lower(), b[2].lower())) 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 = SortedDict([(name, (func, name, desc)) for func, name, desc in actions])
return actions return actions
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
return super(ServicoAdmin, self).lookup_allowed(lookup, value) or \ return super(ServicoAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact'] lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact']
def add_view(self, request, form_url='', extra_context=None): def add_view(self, request, form_url='', extra_context=None):
id_casa = request.GET.get('id_casa', 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) return super(ServicoAdmin, self).response_change(request, obj)
def save_form(self, request, form, change): 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: if not change:
id_casa = request.GET.get('id_casa', None) id_casa = request.GET.get('id_casa', None)
@ -178,13 +178,12 @@ class CasaAtendidaAdmin(admin.ModelAdmin):
fieldsets = ( fieldsets = (
('Casa legislativa', { ('Casa legislativa', {
'fields': (('codigo_interlegis', 'nome'), ('logradouro', 'bairro', 'municipio', 'cep'), ('email', 'pagina_web')) 'fields': (('codigo_interlegis', 'nome'), ('logradouro', 'bairro', 'municipio', 'cep'), ('email', 'pagina_web'))
}) }),)
,)
readonly_fields = ('nome', 'logradouro', 'bairro', 'municipio', 'cep') readonly_fields = ('nome', 'logradouro', 'bairro', 'municipio', 'cep')
inlines = (ContatosInline,) inlines = (ContatosInline,)
list_filter = ('tipo', 'servico__tipo_servico', 'municipio__uf__nome', list_filter = ('tipo', 'servico__tipo_servico', 'municipio__uf__nome',
'servico__casa_legislativa__convenio__projeto') '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', 'cep', 'municipio__nome', 'municipio__uf__nome',
'municipio__codigo_ibge', 'pagina_web', 'observacoes') 'municipio__codigo_ibge', 'pagina_web', 'observacoes')

2
sigi/apps/servicos/management/commands/atualiza_uso_servico.py

@ -24,8 +24,10 @@
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from sigi.apps.servicos.models import Servico from sigi.apps.servicos.models import Servico
class Command(BaseCommand): class Command(BaseCommand):
help = u'Atualiza a informação de data de último serviço dos serviços SEIT hospedados no Interlegis.' help = u'Atualiza a informação de data de último serviço dos serviços SEIT hospedados no Interlegis.'
def handle(self, *args, **options): def handle(self, *args, **options):
verbosity = int(options['verbosity']) verbosity = int(options['verbosity'])
queryset = Servico.objects.exclude(url="").exclude(tipo_servico__string_pesquisa="") queryset = Servico.objects.exclude(url="").exclude(tipo_servico__string_pesquisa="")

17
sigi/apps/servicos/models.py

@ -5,6 +5,7 @@ from datetime import date
from django.core.mail import send_mail from django.core.mail import send_mail
from sigi.settings import DEFAULT_FROM_EMAIL from sigi.settings import DEFAULT_FROM_EMAIL
class TipoServico(models.Model): class TipoServico(models.Model):
email_help = u'''Use:<br/> email_help = u'''Use:<br/>
{url} para incluir a URL do serviço,<br/> {url} para incluir a URL do serviço,<br/>
@ -13,9 +14,9 @@ class TipoServico(models.Model):
sigla = models.CharField(u'Sigla', max_length='12') sigla = models.CharField(u'Sigla', max_length='12')
string_pesquisa = models.CharField(u'String de pesquisa', blank=True, max_length=200, 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') 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_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_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'<br/>{motivo} para incluir o motivo da desativação do serviço', blank=True) template_email_desativa = models.TextField(u'Template de email de desativação', help_text=email_help + u'<br/>{motivo} para incluir o motivo da desativação do serviço', blank=True)
@property @property
def qtde_casas_atendidas(self): def qtde_casas_atendidas(self):
@ -27,7 +28,8 @@ class TipoServico(models.Model):
verbose_name_plural = u'Tipos de serviço' verbose_name_plural = u'Tipos de serviço'
def __unicode__(self): def __unicode__(self):
return self.nome; return self.nome
class Servico(models.Model): class Servico(models.Model):
casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=u'Casa legislativa') casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=u'Casa legislativa')
@ -153,6 +155,7 @@ class Servico(models.Model):
return return
class LogServico(models.Model): class LogServico(models.Model):
servico = models.ForeignKey(Servico, verbose_name='Serviço') servico = models.ForeignKey(Servico, verbose_name='Serviço')
descricao = models.CharField('Breve descrição da ação', max_length=60) descricao = models.CharField('Breve descrição da ação', max_length=60)
@ -166,19 +169,24 @@ class LogServico(models.Model):
verbose_name = 'Log do serviço' verbose_name = 'Log do serviço'
verbose_name_plural = 'Logs do serviço' verbose_name_plural = 'Logs do serviço'
class CasaAtendidaManager(models.Manager): class CasaAtendidaManager(models.Manager):
def get_queryset(self): def get_queryset(self):
qs = super(CasaAtendidaManager, self).get_queryset() qs = super(CasaAtendidaManager, self).get_queryset()
qs = qs.exclude(codigo_interlegis='') qs = qs.exclude(codigo_interlegis='')
return qs return qs
class CasaAtendida(CasaLegislativa): class CasaAtendida(CasaLegislativa):
class Meta: class Meta:
proxy = True proxy = True
verbose_name_plural = 'Casas atendidas' verbose_name_plural = 'Casas atendidas'
objects = CasaAtendidaManager() objects = CasaAtendidaManager()
class CasaManifesta(models.Model): class CasaManifesta(models.Model):
casa_legislativa = models.OneToOneField(CasaLegislativa) casa_legislativa = models.OneToOneField(CasaLegislativa)
data_manifestacao = models.DateTimeField(auto_now_add=True) data_manifestacao = models.DateTimeField(auto_now_add=True)
@ -187,6 +195,7 @@ class CasaManifesta(models.Model):
cargo = models.CharField(u'Cargo do informante', max_length=100, blank=True) cargo = models.CharField(u'Cargo do informante', max_length=100, blank=True)
email = models.EmailField(u'E-mail de contato', blank=True) email = models.EmailField(u'E-mail de contato', blank=True)
class ServicoManifesto(models.Model): class ServicoManifesto(models.Model):
casa_manifesta = models.ForeignKey(CasaManifesta) casa_manifesta = models.ForeignKey(CasaManifesta)
servico = models.ForeignKey(TipoServico) servico = models.ForeignKey(TipoServico)

6
sigi/apps/servicos/views.py

@ -44,11 +44,12 @@ def municipios_atendidos(self, servico):
municipio = {'nome': casa.nome + ', ' + m.uf.sigla, municipio = {'nome': casa.nome + ', ' + m.uf.sigla,
'lat': str(m.latitude), 'lat': str(m.latitude),
'lng': str(m.longitude), 'lng': str(m.longitude),
'servicos': "<ul><li>" + "</li><li>".join([s.tipo_servico.nome for s in casa.servico_set.filter(query)]) + "</li></ul>",} 'servicos': "<ul><li>" + "</li><li>".join([s.tipo_servico.nome for s in casa.servico_set.filter(query)]) + "</li></ul>", }
municipios.append(municipio) municipios.append(municipio)
return HttpResponse(simplejson.dumps(municipios), mimetype="application/json") return HttpResponse(simplejson.dumps(municipios), mimetype="application/json")
class CasaManifestaProtoForm(forms.Form): class CasaManifestaProtoForm(forms.Form):
fieldsets = None fieldsets = None
informante = forms.CharField(max_length=100, required=False) informante = forms.CharField(max_length=100, required=False)
@ -71,6 +72,7 @@ class CasaManifestaProtoForm(forms.Form):
result.append({'name': name, 'lines': field_lines},) result.append({'name': name, 'lines': field_lines},)
self.fieldsets = result self.fieldsets = result
def casa_manifesta_view(request): def casa_manifesta_view(request):
if 'casa_id' in request.GET: if 'casa_id' in request.GET:
casa_id = request.GET.get('casa_id') 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['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['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) 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) CasaManifestaForm = type('', (CasaManifestaProtoForm,), campos)

7
sigi/apps/servidores/admin.py

@ -11,7 +11,7 @@ from sigi.apps.utils.alphabetic_filter import AlphabeticFilter
class FuncaoAdmin(admin.ModelAdmin): class FuncaoAdmin(admin.ModelAdmin):
form = FuncaoForm form = FuncaoForm
list_display = ('servidor', 'funcao', 'cargo','inicio_funcao', 'fim_funcao') list_display = ('servidor', 'funcao', 'cargo', 'inicio_funcao', 'fim_funcao')
list_filter = ('inicio_funcao', 'fim_funcao') list_filter = ('inicio_funcao', 'fim_funcao')
search_fields = ('funcao', 'cargo', 'descricao', search_fields = ('funcao', 'cargo', 'descricao',
'servidor__nome_completo', 'servidor__obs', 'servidor__apontamentos', 'servidor__nome_completo', 'servidor__obs', 'servidor__apontamentos',
@ -58,6 +58,7 @@ class TelefonesInline(generic.GenericTabularInline):
class ServidorAdmin(admin.ModelAdmin): class ServidorAdmin(admin.ModelAdmin):
def is_active(self, servidor): def is_active(self, servidor):
return servidor.user.is_active return servidor.user.is_active
is_active.admin_order_field = 'user__is_active' is_active.admin_order_field = 'user__is_active'
@ -70,7 +71,7 @@ class ServidorAdmin(admin.ModelAdmin):
'user__email', 'user__first_name', 'user__email', 'user__first_name',
'user__last_name', 'user__username') 'user__last_name', 'user__username')
raw_id_fields = ('user',) raw_id_fields = ('user',)
inlines= (TelefonesInline,EnderecoInline) inlines = (TelefonesInline, EnderecoInline)
fieldsets = ( fieldsets = (
(u'Autenticação', { (u'Autenticação', {
'fields': ('user',), 'fields': ('user',),
@ -98,7 +99,7 @@ class ServidorAdmin(admin.ModelAdmin):
request = kwargs.pop("request", None) request = kwargs.pop("request", None)
kwargs['widget'] = AdminImageWidget kwargs['widget'] = AdminImageWidget
return db_field.formfield(**kwargs) 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) admin.site.register(Servidor, ServidorAdmin)

3
sigi/apps/servidores/forms.py

@ -8,6 +8,7 @@ from sigi.apps.servidores.models import Ferias, Licenca, Funcao, Servidor
class FeriasForm(forms.ModelForm): class FeriasForm(forms.ModelForm):
class Meta: class Meta:
model = Ferias model = Ferias
fields = '__all__' fields = '__all__'
@ -21,6 +22,7 @@ class FeriasForm(forms.ModelForm):
class LicencaForm(forms.ModelForm): class LicencaForm(forms.ModelForm):
class Meta: class Meta:
model = Licenca model = Licenca
fields = '__all__' fields = '__all__'
@ -34,6 +36,7 @@ class LicencaForm(forms.ModelForm):
class FuncaoForm(forms.ModelForm): class FuncaoForm(forms.ModelForm):
class Meta: class Meta:
model = Funcao model = Funcao
fields = '__all__' fields = '__all__'

81
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.servidores.models import Servidor, Servico, Subsecretaria, Funcao, Ferias, Licenca
from sigi.apps.contatos.models import Municipio from sigi.apps.contatos.models import Municipio
#Funcao.objects.all().delete() # Funcao.objects.all().delete()
#Ferias.objects.all().delete() # Ferias.objects.all().delete()
#Licenca.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(): # for u in User.objects.filter(date_joined__gte=datetime(2011, 12, 9, 10, 58, 49, 83734)).all():
# u.servidor_set.all().delete() # u.servidor_set.all().delete()
# u.delete() # u.delete()
class MigrationError(Exception): class MigrationError(Exception):
pass pass
class Command(BaseCommand): class Command(BaseCommand):
help = 'Migra usuários do antigo Sistema de RH' help = 'Migra usuários do antigo Sistema de RH'
@ -53,17 +55,23 @@ class Command(BaseCommand):
try: try:
# procuro o usuario por email do interlegis # procuro o usuario por email do interlegis
if email: if email:
try: user = User.objects.get(email=email) try:
user = User.objects.get(email=email)
except User.DoesNotExist: except User.DoesNotExist:
email = username + '@interlegis.leg.br' email = username + '@interlegis.leg.br'
try: user = User.objects.get(email=email) try:
except User.DoesNotExist: pass user = User.objects.get(email=email)
except User.DoesNotExist:
pass
if not user and username: if not user and username:
try: user = User.objects.get(username=username) try:
user = User.objects.get(username=username)
except User.DoesNotExist:
try:
user = User.objects.get(username=username + "__")
except User.DoesNotExist: except User.DoesNotExist:
try: user = User.objects.get(username=username + "__") pass
except User.DoesNotExist: pass
if not user: if not user:
if not username: if not username:
@ -79,18 +87,18 @@ class Command(BaseCommand):
last_name = " ".join(names[1:]) last_name = " ".join(names[1:])
user = User.objects.create( user = User.objects.create(
username = username, username=username,
email = email, email=email,
first_name = first_name, first_name=first_name,
last_name = last_name[:30], last_name=last_name[:30],
is_active= False is_active=False
) )
servidor = user.servidor servidor = user.servidor
except Servidor.DoesNotExist: except Servidor.DoesNotExist:
servidor = Servidor.objects.create( servidor = Servidor.objects.create(
user=user, 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: except MigrationError, e:
print ", ".join(row) print ", ".join(row)
@ -107,15 +115,15 @@ class Command(BaseCommand):
servidor.ramal = p['ramal'] servidor.ramal = p['ramal']
if p['email'] and not '@interlegis' in p['email']: 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 servidor.user.is_active = False
else: else:
servidor.user.is_active = True servidor.user.is_active = True
servidor.user.save() servidor.user.save()
if p['de_fora']=="-1": if p['de_fora'] == "-1":
servidor.de_fora = True servidor.de_fora = True
else: else:
servidor.de_fora = False servidor.de_fora = False
@ -125,11 +133,11 @@ class Command(BaseCommand):
elif p['sexo'].upper() == 'F': elif p['sexo'].upper() == 'F':
servidor.sexo = 'F' servidor.sexo = 'F'
if p['turno']=="1": if p['turno'] == "1":
servidor.turno = 'M' servidor.turno = 'M'
elif p['turno']=="2": elif p['turno'] == "2":
servidor.turno = 'T' servidor.turno = 'T'
elif p['turno']=="3": elif p['turno'] == "3":
servidor.turno = 'N' servidor.turno = 'N'
if p['aniversario']: if p['aniversario']:
@ -145,8 +153,8 @@ class Command(BaseCommand):
secretaria_nome = p['secretaria_nome'] secretaria_nome = p['secretaria_nome']
secretaria = Subsecretaria.objects.get_or_create( secretaria = Subsecretaria.objects.get_or_create(
sigla = p['secretaria_sigla'], sigla=p['secretaria_sigla'],
nome = secretaria_nome nome=secretaria_nome
)[0] )[0]
if ' - ' in p['servico_nome']: if ' - ' in p['servico_nome']:
@ -155,8 +163,8 @@ class Command(BaseCommand):
servico_nome = p['servico_nome'] servico_nome = p['servico_nome']
servico = Servico.objects.get_or_create( servico = Servico.objects.get_or_create(
sigla = p['servico_sigla'], sigla=p['servico_sigla'],
nome = servico_nome nome=servico_nome
)[0] )[0]
servico.subsecretaria = secretaria servico.subsecretaria = secretaria
@ -194,8 +202,8 @@ class Command(BaseCommand):
if p['cargo'] or p['funcao']: if p['cargo'] or p['funcao']:
funcao = servidor.funcao_set.get_or_create( funcao = servidor.funcao_set.get_or_create(
funcao = p['funcao'], funcao=p['funcao'],
cargo = p['cargo'], cargo=p['cargo'],
)[0] )[0]
if p['data_bap_entrada']: if p['data_bap_entrada']:
@ -214,23 +222,22 @@ class Command(BaseCommand):
funcao.bap_saida = p['bap_saida'] funcao.bap_saida = p['bap_saida']
funcao.save() funcao.save()
if re.search(r'estagi.ri[o|a]',p['cargo'],re.I): if re.search(r'estagi.ri[o|a]', p['cargo'], re.I):
#TODO inserir dados de estagio # TODO inserir dados de estagio
pass pass
if p['inicio_ferias'] and p['final_ferias']: if p['inicio_ferias'] and p['final_ferias']:
servidor.ferias_set.get_or_create( servidor.ferias_set.get_or_create(
inicio_ferias = self.to_date(p['inicio_ferias']), inicio_ferias=self.to_date(p['inicio_ferias']),
fim_ferias = self.to_date(p['final_ferias']), fim_ferias=self.to_date(p['final_ferias']),
obs = p['obs_ferias'] obs=p['obs_ferias']
) )
if p['inicio_licenca'] and p['fim_licenca']: if p['inicio_licenca'] and p['fim_licenca']:
servidor.licenca_set.get_or_create( servidor.licenca_set.get_or_create(
inicio_licenca = self.to_date(p['inicio_licenca']), inicio_licenca=self.to_date(p['inicio_licenca']),
fim_licenca = self.to_date(p['fim_licenca']), fim_licenca=self.to_date(p['fim_licenca']),
obs = p['obs_licenca'] obs=p['obs_licenca']
) )
servidor.save() servidor.save()

58
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.settings import *
from sigi.apps.servidores.models import Servidor from sigi.apps.servidores.models import Servidor
class Command(BaseCommand): class Command(BaseCommand):
help = u'Sincroniza Usuários e Servidores com o LDAP' help = u'Sincroniza Usuários e Servidores com o LDAP'
@ -14,10 +15,10 @@ class Command(BaseCommand):
def get_ldap_groups(self): def get_ldap_groups(self):
filter = "(&(objectclass=Group))" filter = "(&(objectclass=Group))"
values = ['cn',] values = ['cn', ]
l = ldap.initialize(AUTH_LDAP_SERVER_URI) l = ldap.initialize(AUTH_LDAP_SERVER_URI)
l.protocol_version = ldap.VERSION3 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_id = l.search(AUTH_LDAP_GROUP, ldap.SCOPE_SUBTREE, filter, values)
result_type, result_data = l.result(result_id, 1) result_type, result_data = l.result(result_id, 1)
l.unbind() l.unbind()
@ -25,10 +26,10 @@ class Command(BaseCommand):
def get_ldap_users(self): def get_ldap_users(self):
filter = "(&(objectclass=user))" filter = "(&(objectclass=user))"
values = ['sAMAccountName', 'userPrincipalName', 'givenName', 'sn', 'cn' ] values = ['sAMAccountName', 'userPrincipalName', 'givenName', 'sn', 'cn']
l = ldap.initialize(AUTH_LDAP_SERVER_URI) l = ldap.initialize(AUTH_LDAP_SERVER_URI)
l.protocol_version = ldap.VERSION3 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_id = l.search(AUTH_LDAP_USER.encode('utf-8'), ldap.SCOPE_SUBTREE, filter, values)
result_type, result_data = l.result(result_id, 1) result_type, result_data = l.result(result_id, 1)
l.unbind() l.unbind()
@ -37,10 +38,13 @@ class Command(BaseCommand):
def sync_groups(self): def sync_groups(self):
ldap_groups = self.get_ldap_groups() ldap_groups = self.get_ldap_groups()
for ldap_group in ldap_groups: for ldap_group in ldap_groups:
try: group_name = ldap_group[1]['cn'][0] try:
except: pass group_name = ldap_group[1]['cn'][0]
except:
pass
else: else:
try: group = Group.objects.get(name=group_name) try:
group = Group.objects.get(name=group_name)
except Group.DoesNotExist: except Group.DoesNotExist:
group = Group(name=group_name) group = Group(name=group_name)
group.save() group.save()
@ -50,37 +54,49 @@ class Command(BaseCommand):
def sync_users(self): def sync_users(self):
ldap_users = self.get_ldap_users() ldap_users = self.get_ldap_users()
for ldap_user in ldap_users: for ldap_user in ldap_users:
try: username = ldap_user[1]['sAMAccountName'][0] try:
except: pass username = ldap_user[1]['sAMAccountName'][0]
except:
pass
else: else:
try: email = ldap_user[1]['userPrincipalName'][0] try:
except: email = '' email = ldap_user[1]['userPrincipalName'][0]
try: first_name = ldap_user[1]['givenName'][0] except:
except: first_name = username email = ''
try: last_name = ldap_user[1]['sn'][0][:30] try:
except: last_name = '' first_name = ldap_user[1]['givenName'][0]
try: user = User.objects.get(username=username) 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: except User.DoesNotExist:
try: try:
user = User.objects.get(email=email) user = User.objects.get(email=email)
user.username = username user.username = username
except User.DoesNotExist: except User.DoesNotExist:
user = User.objects.create_user( user = User.objects.create_user(
username = username, username=username,
email = email email=email
) )
user.first_name = first_name user.first_name = first_name
user.last_name = last_name user.last_name = last_name
print "User '%s' created." % username print "User '%s' created." % username
try: nome_completo = ldap_user[1]['cn'][0] try:
except: nome_completo = '' nome_completo = ldap_user[1]['cn'][0]
except:
nome_completo = ''
try: try:
servidor = user.servidor servidor = user.servidor
if not servidor.nome_completo == nome_completo.decode('utf8'): 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 print "Servidor '%s' updated." % nome_completo
except Servidor.DoesNotExist: except Servidor.DoesNotExist:
try: servidor = Servidor.objects.get(nome_completo=nome_completo) try:
servidor = Servidor.objects.get(nome_completo=nome_completo)
except Servidor.DoesNotExist: except Servidor.DoesNotExist:
servidor = user.servidor_set.create(nome_completo=nome_completo) servidor = user.servidor_set.create(nome_completo=nome_completo)
print "Servidor '%s' created." % nome_completo print "Servidor '%s' created." % nome_completo

24
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.contenttypes import generic
from django.contrib.auth.models import User from django.contrib.auth.models import User
class Subsecretaria(models.Model): class Subsecretaria(models.Model):
""" Modelo para representação das Subsecretarias do Interlegis """ Modelo para representação das Subsecretarias do Interlegis
""" """
@ -19,7 +21,9 @@ class Subsecretaria(models.Model):
def __unicode__(self): def __unicode__(self):
return '%s (%s)' % (unicode(self.nome), unicode(self.sigla)) return '%s (%s)' % (unicode(self.nome), unicode(self.sigla))
class Servico(models.Model): class Servico(models.Model):
""" Modelo para representação dos Serviços de uma Subsecretaria """ Modelo para representação dos Serviços de uma Subsecretaria
""" """
@ -39,6 +43,7 @@ class Servico(models.Model):
class Servidor(models.Model): class Servidor(models.Model):
""" Modelo para representação de um Servidor. """ Modelo para representação de um Servidor.
Um servidor pertence a um Serviço e uma Subsecretaria os campos 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) servico = models.ForeignKey('servidores.Servico', blank=True, null=True)
matricula = models.CharField(u'matrícula', max_length=25, 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, max_length=1,
choices=TURNO_CHOICES, choices=TURNO_CHOICES,
blank=True, blank=True,
@ -90,8 +95,8 @@ class Servidor(models.Model):
) )
de_fora = models.BooleanField(default=False) de_fora = models.BooleanField(default=False)
data_nomeacao = models.DateField(u'data de nomeação', blank=True, null=True) 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_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_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) cpf = models.CharField('CPF', max_length=11, blank=True, null=True)
rg = models.CharField('RG', max_length=25, 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) obs = models.TextField(u'observação', blank=True, null=True)
@ -147,16 +152,20 @@ User.servidor = property(lambda user: Servidor.objects.get(user=user))
# Sinal para ao criar um usuário criar um servidor # Sinal para ao criar um usuário criar um servidor
# baseado no nome contino no LDAP # baseado no nome contino no LDAP
def create_user_profile(sender, instance, created, **kwargs): def create_user_profile(sender, instance, created, **kwargs):
if created: if created:
Servidor.objects.create( Servidor.objects.create(
user=instance, user=instance,
nome_completo= "%s %s" % (instance.first_name, instance.last_name) nome_completo="%s %s" % (instance.first_name, instance.last_name)
) )
post_save.connect(create_user_profile, sender=User) post_save.connect(create_user_profile, sender=User)
class Funcao(models.Model): class Funcao(models.Model):
""" Modelo para guardar o histórico de funções dos """ Modelo para guardar o histórico de funções dos
servidores no Interlegis servidores no Interlegis
""" """
@ -167,10 +176,10 @@ class Funcao(models.Model):
fim_funcao = models.DateField(u'fim da função', blank=True, null=True) fim_funcao = models.DateField(u'fim da função', blank=True, null=True)
descricao = models.TextField(u'descriçã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) 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) data_bap_saida = models.DateField(u'data BAP de saída', blank=True, null=True)
class Meta: class Meta:
@ -182,6 +191,7 @@ class Funcao(models.Model):
class Licenca(models.Model): class Licenca(models.Model):
""" Modelo que representa as licenças tiradas pelos servidores """ Modelo que representa as licenças tiradas pelos servidores
""" """
servidor = models.ForeignKey(Servidor) servidor = models.ForeignKey(Servidor)
@ -201,7 +211,9 @@ class Licenca(models.Model):
def __unicode__(self): def __unicode__(self):
return str(self.id) return str(self.id)
class Ferias(models.Model): class Ferias(models.Model):
""" Modelo que representa as férias tiradas pelos servidores """ Modelo que representa as férias tiradas pelos servidores
""" """
servidor = models.ForeignKey(Servidor) servidor = models.ForeignKey(Servidor)

7
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.apps.servidores.models import Servidor, Funcao
from sigi.shortcuts import render_to_pdf from sigi.shortcuts import render_to_pdf
def servidores_por_funcao(request): def servidores_por_funcao(request):
report = Funcao.objects.values('funcao').annotate(funcao__count=Count('funcao')).order_by('funcao__count') report = Funcao.objects.values('funcao').annotate(funcao__count=Count('funcao')).order_by('funcao__count')
total = Funcao.objects.count() total = Funcao.objects.count()
context = RequestContext(request, { context = RequestContext(request, {
'pagesize':'A4', 'pagesize': 'A4',
'report': report, 'report': report,
'total': total 'total': total
}) })
return render_to_pdf('servidores/servidores_por_funcao.html', context) return render_to_pdf('servidores/servidores_por_funcao.html', context)
def servidores_por_cargo(request): def servidores_por_cargo(request):
report = Funcao.objects.values('cargo').annotate(cargo__count=Count('cargo')).order_by('cargo__count') report = Funcao.objects.values('cargo').annotate(cargo__count=Count('cargo')).order_by('cargo__count')
total = Funcao.objects.count() total = Funcao.objects.count()
context = RequestContext(request, { context = RequestContext(request, {
'pagesize':'A4', 'pagesize': 'A4',
'report': report, 'report': report,
'total': total 'total': total
}) })
return render_to_pdf('servidores/servidores_por_cargo.html', context) return render_to_pdf('servidores/servidores_por_cargo.html', context)

7
sigi/apps/utils/__init__.py

@ -3,7 +3,9 @@ from django.contrib import admin
from django.db import models from django.db import models
from unicodedata import normalize from unicodedata import normalize
class SearchField(models.TextField): class SearchField(models.TextField):
def pre_save(self, model_instance, add): def pre_save(self, model_instance, add):
search_text = [] search_text = []
for field_name in self.field_names: for field_name in self.field_names:
@ -12,17 +14,20 @@ class SearchField(models.TextField):
value = u' '.join(search_text) value = u' '.join(search_text)
setattr(model_instance, self.name, value) setattr(model_instance, self.name, value)
return value return value
def __init__(self, field_names, *args, **kwargs): def __init__(self, field_names, *args, **kwargs):
self.field_names = field_names self.field_names = field_names
kwargs['editable'] = False kwargs['editable'] = False
super(self.__class__, self).__init__(*args, **kwargs) super(self.__class__, self).__init__(*args, **kwargs)
def to_ascii(txt, codif='utf-8'): def to_ascii(txt, codif='utf-8'):
if not isinstance(txt, basestring): if not isinstance(txt, basestring):
txt = unicode(txt) txt = unicode(txt)
if isinstance(txt, unicode): if isinstance(txt, unicode):
txt = txt.encode('utf-8') 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): def queryset_ascii(self, request):
if 'q' in request.GET: if 'q' in request.GET:

6
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.translation import ugettext as _
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
class AdminImageWidget(AdminFileWidget): class AdminImageWidget(AdminFileWidget):
def render(self, name, value, attrs=None): def render(self, name, value, attrs=None):
output = [] output = []
if value and getattr(value, "url", None): if value and getattr(value, "url", None):
image_url = value.url image_url = value.url
file_name=str(value) file_name = str(value)
output.append( output.append(
u''' <a href="%s" target="_blank"><img src="%s" width="100" u''' <a href="%s" target="_blank"><img src="%s" width="100"
height="100" alt="%s"/></a> <br/> %s''' % \ height="100" alt="%s"/></a> <br/> %s''' %
(image_url, image_url, file_name, _('Change:'))) (image_url, image_url, file_name, _('Change:')))
output.append(super(AdminFileWidget, self).render(name, value, attrs)) output.append(super(AdminFileWidget, self).render(name, value, attrs))
return mark_safe(u''.join(output)) return mark_safe(u''.join(output))

3
sigi/apps/utils/alphabetic_filter.py

@ -2,6 +2,7 @@
import string import string
from django.contrib import admin from django.contrib import admin
class AlphabeticFilter(admin.SimpleListFilter): 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. # right admin sidebar just above the filter options.
@ -27,4 +28,4 @@ class AlphabeticFilter(admin.SimpleListFilter):
`self.value()`. `self.value()`.
""" """
if self.value(): if self.value():
return queryset.filter( ( self.parameter_name + '__istartswith', self.value() ) ) return queryset.filter((self.parameter_name + '__istartswith', self.value()))

4
sigi/context_processors.py

@ -69,7 +69,7 @@ def busca_informacoes_camara():
cabecalho_topo.append(projeto.sigla) cabecalho_topo.append(projeto.sigla)
lista_total.append(camaras.filter(convenio__projeto=projeto).count()) 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_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_assinados.append(camaras.filter(convenio__in=conv_assinados_proj).count())
lista_convenios_em_andamento.append(camaras.filter(convenio__in=conv_em_andamento_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 # Unindo as duas listass para que o cabecalho da esquerda fique junto com sua
# respectiva linha # respectiva linha
lista_zip = zip(cabecalho_esquerda,linhas) lista_zip = zip(cabecalho_esquerda, linhas)
# Retornando listas em forma de dicionario # Retornando listas em forma de dicionario
return { return {

2
sigi/shortcuts.py

@ -12,6 +12,7 @@ def fetch_resources(uri, rel):
path = os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, "")) path = os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))
return path return path
def render_to_pdf(template_src, context_dict): def render_to_pdf(template_src, context_dict):
template = get_template(template_src) template = get_template(template_src)
context = Context(context_dict) context = Context(context_dict)
@ -22,4 +23,3 @@ def render_to_pdf(template_src, context_dict):
if not pdf.err: if not pdf.err:
return HttpResponse(result.getvalue(), mimetype='application/pdf') return HttpResponse(result.getvalue(), mimetype='application/pdf')
return HttpResponse('We had some errors<pre>%s</pre>' % escape(html)) return HttpResponse('We had some errors<pre>%s</pre>' % escape(html))

Loading…
Cancel
Save