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. 65
      etc/data/ibge/sigi-import-ibge-2009.py
  2. 87
      etc/migracao/migra.py
  3. 76
      sigi/apps/casas/admin.py
  4. 2
      sigi/apps/casas/forms.py
  5. 75
      sigi/apps/casas/models.py
  6. 553
      sigi/apps/casas/reports.py
  7. 180
      sigi/apps/casas/views.py
  8. 5
      sigi/apps/contatos/admin.py
  9. 8
      sigi/apps/contatos/filters.py
  10. 120
      sigi/apps/contatos/models.py
  11. 65
      sigi/apps/convenios/admin.py
  12. 19
      sigi/apps/convenios/models.py
  13. 270
      sigi/apps/convenios/reports.py
  14. 160
      sigi/apps/convenios/views.py
  15. 53
      sigi/apps/diagnosticos/admin.py
  16. 1
      sigi/apps/diagnosticos/decorators.py
  17. 41
      sigi/apps/diagnosticos/forms.py
  18. 68
      sigi/apps/diagnosticos/models.py
  19. 13
      sigi/apps/diagnosticos/templatetags/smart_if.py
  20. 28
      sigi/apps/diagnosticos/views.py
  21. 11
      sigi/apps/diagnosticos/widgets.py
  22. 5
      sigi/apps/financeiro/admin.py
  23. 2
      sigi/apps/financeiro/forms.py
  24. 6
      sigi/apps/financeiro/models.py
  25. 12
      sigi/apps/inventario/admin.py
  26. 6
      sigi/apps/inventario/models.py
  27. 29
      sigi/apps/mesas/admin.py
  28. 15
      sigi/apps/mesas/models.py
  29. 38
      sigi/apps/metas/admin.py
  30. 2
      sigi/apps/metas/forms.py
  31. 4
      sigi/apps/metas/management/commands/gera_map_data.py
  32. 71
      sigi/apps/metas/models.py
  33. 12
      sigi/apps/metas/templatetags/mapa_tags.py
  34. 78
      sigi/apps/metas/views.py
  35. 4
      sigi/apps/ocorrencias/admin.py
  36. 18
      sigi/apps/ocorrencias/models.py
  37. 29
      sigi/apps/parlamentares/admin.py
  38. 1
      sigi/apps/parlamentares/models.py
  39. 543
      sigi/apps/parlamentares/reports.py
  40. 77
      sigi/apps/parlamentares/views.py
  41. 66
      sigi/apps/relatorios/reports.py
  42. 55
      sigi/apps/servicos/admin.py
  43. 6
      sigi/apps/servicos/management/commands/atualiza_uso_servico.py
  44. 37
      sigi/apps/servicos/models.py
  45. 10
      sigi/apps/servicos/views.py
  46. 41
      sigi/apps/servidores/admin.py
  47. 7
      sigi/apps/servidores/forms.py
  48. 143
      sigi/apps/servidores/management/commands/migra.py
  49. 64
      sigi/apps/servidores/management/commands/sync_ldap.py
  50. 62
      sigi/apps/servidores/models.py
  51. 19
      sigi/apps/servidores/views.py
  52. 7
      sigi/apps/utils/__init__.py
  53. 6
      sigi/apps/utils/admin_widgets.py
  54. 11
      sigi/apps/utils/alphabetic_filter.py
  55. 4
      sigi/apps/utils/decorators.py
  56. 2
      sigi/apps/utils/email.py
  57. 28
      sigi/context_processors.py
  58. 4
      sigi/shortcuts.py

65
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 getUFdict(root, ufid):
return(root[ufid])
def getCidadesDict( macrodict, microid ):
if macrodict = None:
return( None ) def getCidadesDict(macrodict, microid):
microdoct = macrodict[ '__children' ] if macrodict = None:
if microdict = None: return(None)
microdict = {} microdoct = macrodict['__children']
macrodict[ '__children' ] = microdict if microdict = None:
microdict = {}
def main( ): macrodict['__children'] = microdict
argc = len( sys.argv )
arquivo = open( 'geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/DTB_05_05_2009.csv', 'r' )
# despreza o cabecalho def main():
arquivo.readline( ) argc = len(sys.argv)
arquivo = open('geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/DTB_05_05_2009.csv', 'r')
lnum=0 # despreza o cabecalho
csv_reader = csv.reader( arquivo, delimiter=',', quotechar='"' ) arquivo.readline()
for registro in csv_reader:
if uf[ registro[ 0 ] ] = None: lnum = 0
uf[ registro[ 0 ] ] = {} csv_reader = csv.reader(arquivo, delimiter=',', quotechar='"')
uf[ registro[ 0 ] ][ 'nome' ] = registro[ 1 ] for registro in csv_reader:
uf[ registro[ 0 ] ][ 'macrorregioes' ] = {} if uf[registro[0]] = None:
uf[registro[0]] = {}
uf[registro[0]]['nome'] = registro[1]
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()

87
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
@ -61,14 +62,13 @@ def migra_assembleias(filename):
header = reader.next() header = reader.next()
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 = ''
@ -139,12 +139,11 @@ def migra_casas(filename):
PRESIDENTE_COL = 39 PRESIDENTE_COL = 39
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()
linenum = 1 linenum = 1
for line in reader: for line in reader:
linenum += 1 linenum += 1
@ -160,14 +159,14 @@ 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,
nome='Câmara Municipal de ' + line[NOME_COL], nome='Câmara Municipal de ' + line[NOME_COL],
tipo=tipo_casa, tipo=tipo_casa,
logradouro=aux_end[0], logradouro=aux_end[0],
bairro=bairro, bairro=bairro,
cep=line[CEP_COL], cep=line[CEP_COL],
email=line[EMAIL_COL], email=line[EMAIL_COL],
pagina_web=line[PAGINA_COL], pagina_web=line[PAGINA_COL],
@ -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,24 +249,23 @@ 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)
header = reader.next() header = reader.next()
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,41 +311,44 @@ 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:
convenio2 = Convenio( convenio2 = Convenio(
casa_legislativa=casa, casa_legislativa=casa,
projeto=projeto, projeto=projeto,
num_processo_sf=line[NUM_PROCESSO_SF_100_COL], num_processo_sf=line[NUM_PROCESSO_SF_100_COL],
num_convenio=line[NUM_CONVENIO_100_COL], num_convenio=line[NUM_CONVENIO_100_COL],
data_adesao=get_datetime_obj(line[DATA_ADESAO_100_COL]), data_adesao=get_datetime_obj(line[DATA_ADESAO_100_COL]),
data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_100_COL]), data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_100_COL]),
data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA_100_COL]), data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA_100_COL]),
data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO_100_COL]), data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO_100_COL]),
observacao=obs, observacao=obs,
) )
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)
continue continue
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):
@ -365,7 +365,7 @@ def migra_convenios_assembleias(filename):
NUM_PROCESSO_SF_COL = 26 NUM_PROCESSO_SF_COL = 26
DATA_RETORNO_ASSINATURA = 27 DATA_RETORNO_ASSINATURA = 27
DATA_PUB_DIARIO = 29 DATA_PUB_DIARIO = 29
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True)
header = reader.next() header = reader.next()
linenum = 1 linenum = 1
@ -394,7 +394,7 @@ def migra_convenios_assembleias(filename):
data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_COL]), data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_COL]),
data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA]), data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA]),
data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO]), data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO]),
) )
try: try:
convenio.save() convenio.save()
except: except:
@ -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:
@ -423,8 +424,6 @@ def popula():
tipo2.save() tipo2.save()
tipo3 = TipoCasaLegislativa(sigla='CT', nome='Câmara Distrital') tipo3 = TipoCasaLegislativa(sigla='CT', nome='Câmara Distrital')
tipo3.save() tipo3.save()
if __name__ == '__main__': if __name__ == '__main__':

76
sigi/apps/casas/admin.py

@ -7,8 +7,8 @@ from django.http import HttpResponseRedirect
from sigi.apps.casas.forms import CasaLegislativaForm from sigi.apps.casas.forms import CasaLegislativaForm
from sigi.apps.casas.models import CasaLegislativa, Presidente, Funcionario, TipoCasaLegislativa from sigi.apps.casas.models import CasaLegislativa, Presidente, Funcionario, TipoCasaLegislativa
from sigi.apps.casas.views import report_complete, labels_report, export_csv, \ from sigi.apps.casas.views import report_complete, labels_report, export_csv, \
labels_report_sem_presidente, report, \ labels_report_sem_presidente, report, \
adicionar_casas_carrinho adicionar_casas_carrinho
from sigi.apps.utils import queryset_ascii from sigi.apps.utils import queryset_ascii
from sigi.apps.contatos.models import Telefone from sigi.apps.contatos.models import Telefone
from sigi.apps.convenios.models import Convenio from sigi.apps.convenios.models import Convenio
@ -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
@ -38,11 +38,12 @@ class PresidenteInline(admin.StackedInline):
class FuncionariosInline(admin.StackedInline): class FuncionariosInline(admin.StackedInline):
model = Funcionario model = Funcionario
fieldsets = ((None, { fieldsets = ((None, {
'fields': (('nome', 'sexo', 'nota', 'email'), ('cargo', 'funcao', 'setor', 'tempo_de_servico'), 'ult_alteracao') 'fields': (('nome', 'sexo', 'nota', 'email'), ('cargo', 'funcao', 'setor', 'tempo_de_servico'), 'ult_alteracao')
}),) }),)
readonly_fields = ('ult_alteracao',) 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 '

75
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(
@ -135,7 +139,7 @@ class CasaLegislativa(models.Model):
codigo = self.codigo_interlegis codigo = self.codigo_interlegis
if codigo == '': if codigo == '':
if self.tipo.sigla == 'AL': # Assembléias são tratadas a parte if self.tipo.sigla == 'AL': # Assembléias são tratadas a parte
codigo = 'A' + self.municipio.uf.sigla codigo = 'A' + self.municipio.uf.sigla
if CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() <= 0: if CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() <= 0:
# Só grava o código se ele for inédito # Só grava o código se ele for inédito
@ -144,23 +148,23 @@ 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]])
# Se o código ficou com menos que três letras, pegar as 2 primeiras # Se o código ficou com menos que três letras, pegar as 2 primeiras
if len(codigo) < 3: if len(codigo) < 3:
codigo = ''.join([x[0:2] for x in cityName.split(' ')[:3]])[:3] codigo = ''.join([x[0:2] for x in cityName.split(' ')[:3]])[:3]
# Se ainda ficou com menos de três letras, então o nome da cidade só # Se ainda ficou com menos de três letras, então o nome da cidade só
# tem uma palavra. Pegue as três primeiras letras da palavra # tem uma palavra. Pegue as três primeiras letras da palavra
if len(codigo) < 3: if len(codigo) < 3:
codigo = cityName[:3] codigo = cityName[:3]
# Se o código já existir, substituir a última letra do código pela # Se o código já existir, substituir a última letra do código pela
# última letra do nome da cidade, e ir recuando, letra a letra, # última letra do nome da cidade, e ir recuando, letra a letra,
@ -170,7 +174,7 @@ class CasaLegislativa(models.Model):
ultima = len(cityName) ultima = len(cityName)
while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \
count() > 0 and ultima > 0: count() > 0 and ultima > 0:
codigo = codigo[:2] + cityName[ultima - 1: ultima] codigo = codigo[:2] + cityName[ultima - 1: ultima]
ultima -= 1 ultima -= 1
@ -179,10 +183,10 @@ 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
# Se ainda não gerou um nome único, vamos colocar dígitos no # Se ainda não gerou um nome único, vamos colocar dígitos no
@ -191,7 +195,7 @@ class CasaLegislativa(models.Model):
i = 'A' i = 'A'
while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \
count() > 0 and i <= 'Z': count() > 0 and i <= 'Z':
codigo = codigo[:2] + str(i) codigo = codigo[:2] + str(i)
i = chr(ord(i) + 1) i = chr(ord(i) + 1)
@ -202,7 +206,7 @@ class CasaLegislativa(models.Model):
i = 0 i = 0
while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \
count() > 0 and i < 100: count() > 0 and i < 100:
codigo = random.choice(cityName) + random.choice(cityName) + \ codigo = random.choice(cityName) + random.choice(cityName) + \
random.choice(cityName) random.choice(cityName)
i += 1 i += 1
@ -213,7 +217,7 @@ class CasaLegislativa(models.Model):
i = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' i = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \ while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \
count() > 0: count() > 0:
codigo = random.choice(i) + random.choice(i) + \ codigo = random.choice(i) + random.choice(i) + \
random.choice(i) random.choice(i)
@ -231,9 +235,9 @@ class CasaLegislativa(models.Model):
if self.pk is not None: if self.pk is not None:
original = CasaLegislativa.objects.get(pk=self.pk) original = CasaLegislativa.objects.get(pk=self.pk)
if (self.logradouro != original.logradouro or if (self.logradouro != original.logradouro or
self.bairro != original.bairro or self.bairro != original.bairro or
self.municipio != original.municipio or self.municipio != original.municipio or
self.cep != original.cep): self.cep != original.cep):
address_changed = True address_changed = True
else: else:
address_changed = True address_changed = True
@ -243,27 +247,29 @@ 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"),
("F", "Feminino") ("F", "Feminino")
] ]
casa_legislativa = models.ForeignKey(CasaLegislativa) casa_legislativa = models.ForeignKey(CasaLegislativa)
nome = models.CharField('nome completo', max_length=60, blank=False) nome = models.CharField('nome completo', max_length=60, blank=False)
@ -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,21 +293,24 @@ 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
objects = PresidenteManager() objects = PresidenteManager()
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.setor = 'presidente' self.setor = 'presidente'
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)

553
sigi/apps/casas/reports.py

@ -3,47 +3,48 @@ 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
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:
tamanho += 0.17 tamanho += 0.17
else: else:
if c in maiuEspeciais: if c in maiuEspeciais:
tamanho += maiuEspeciais[c] tamanho += maiuEspeciais[c]
else: else:
tamanho += 0.2 tamanho += 0.2
return tamanho return tamanho
class CasasLegislativasLabels(Report): class CasasLegislativasLabels(Report):
""" """
Usage example:: Usage example::
@ -62,37 +63,37 @@ class CasasLegislativasLabels(Report):
tamanho_fonte = 6 tamanho_fonte = 6
delta = start = 0.5 delta = start = 0.5
def __init__(self, queryset, formato): def __init__(self, queryset, formato):
super(CasasLegislativasLabels, self).__init__(queryset=queryset) super(CasasLegislativasLabels, self).__init__(queryset=queryset)
self.formato = formato self.formato = formato
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
self.label_margin_top = 0.5 self.label_margin_top = 0.5
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(
@ -116,7 +117,7 @@ class CasasLegislativasLabels(Report):
top=calc_top(4), left=calc_left, width=calc_width, height=calc_height(2), top=calc_top(4), left=calc_left, width=calc_width, height=calc_height(2),
get_value=lambda instance: get_value=lambda instance:
"%s - %s - %s." % (instance.logradouro, instance.bairro, instance.municipio), "%s - %s - %s." % (instance.logradouro, instance.bairro, instance.municipio),
), ),
ObjectValue( ObjectValue(
attribute_name='cep', attribute_name='cep',
@ -124,23 +125,24 @@ class CasasLegislativasLabels(Report):
get_value=lambda instance: get_value=lambda instance:
"CEP: %s" % instance.cep "CEP: %s" % instance.cep
), ),
] ]
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(
@ -158,7 +160,7 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
top=calc_top(3), left=calc_left, width=calc_width, height=calc_height(2), top=calc_top(3), left=calc_left, width=calc_width, height=calc_height(2),
get_value=lambda instance: get_value=lambda instance:
"%s - %s - %s." % (instance.logradouro, instance.bairro, instance.municipio), "%s - %s - %s." % (instance.logradouro, instance.bairro, instance.municipio),
), ),
ObjectValue( ObjectValue(
attribute_name='cep', attribute_name='cep',
@ -166,411 +168,410 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
get_value=lambda instance: get_value=lambda instance:
"CEP: %s" % instance.cep "CEP: %s" % instance.cep
), ),
] ]
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 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,
), ),
] ]
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},
) )
) )
] ]
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
default_style = {'fontName': 'Helvetica', 'fontSize': 14}
display_inline = True
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 '-'
), ),
], ],
#borders = {'all':True}, #borders = {'all':True},
), ),
) )
] ]

180
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,37 +38,40 @@ 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.
""" """
if request.session.has_key('carrinho_casas'): if request.session.has_key('carrinho_casas'):
ids = request.session['carrinho_casas'] ids = request.session['carrinho_casas']
qs = CasaLegislativa.objects.filter(pk__in=ids) qs = CasaLegislativa.objects.filter(pk__in=ids)
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'):
request.session['carrinho_casas'] = ids_selecionados request.session['carrinho_casas'] = ids_selecionados
else: else:
@ -74,17 +79,16 @@ def adicionar_casas_carrinho(request,queryset=None,id=None):
# Verifica se id já não está adicionado # Verifica se id já não está adicionado
for id in ids_selecionados: for id in ids_selecionados:
if not id in lista: if not id in lista:
lista.append(id) lista.append(id)
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)
paginator = Paginator(qs, 100) paginator = Paginator(qs, 100)
# Make sure page request is an int. If not, deliver first page. # Make sure page request is an int. If not, deliver first page.
# Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página. # Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página.
try: try:
@ -97,60 +101,60 @@ def visualizar_carrinho(request):
paginas = paginator.page(page) paginas = paginator.page(page)
except (EmptyPage, InvalidPage): except (EmptyPage, InvalidPage):
paginas = paginator.page(paginator.num_pages) paginas = paginator.page(paginator.num_pages)
carrinhoIsEmpty = not(request.session.has_key('carrinho_casas')) carrinhoIsEmpty = not(request.session.has_key('carrinho_casas'))
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')
if request.session.has_key('carrinho_casas'): if request.session.has_key('carrinho_casas'):
lista = request.session['carrinho_casas'] lista = request.session['carrinho_casas']
for item in ids_selecionados: for item in ids_selecionados:
lista.remove(item) lista.remove(item)
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.
""" """
if request.POST: if request.POST:
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 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:
qs = CasaLegislativa.objects.filter(pk=id) qs = CasaLegislativa.objects.filter(pk=id)
else: else:
qs = carrinhoOrGet_for_qs(request) qs = carrinhoOrGet_for_qs(request)
if not qs: if not qs:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
@ -161,24 +165,24 @@ 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.
""" """
if request.POST: if request.POST:
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])
parlamentares = [m.parlamentar for m in mandatos] parlamentares = [m.parlamentar for m in mandatos]
qs = parlamentares qs = parlamentares
else: else:
qs = carrinhoOrGet_for_parlamentar_qs(request) qs = carrinhoOrGet_for_parlamentar_qs(request)
if not qs: if not qs:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
@ -189,10 +193,11 @@ 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.
""" """
if request.session.has_key('carrinho_casas'): if request.session.has_key('carrinho_casas'):
ids = request.session['carrinho_casas'] ids = request.session['carrinho_casas']
legislaturas = [c.legislatura_set.latest('data_inicio') for c in CasaLegislativa.objects.filter(pk__in=ids, legislatura__id__isnull=False).distinct()] legislaturas = [c.legislatura_set.latest('data_inicio') for c in CasaLegislativa.objects.filter(pk__in=ids, legislatura__id__isnull=False).distinct()]
@ -205,18 +210,19 @@ def carrinhoOrGet_for_parlamentar_qs(request):
parlamentares = [m.parlamentar for m in mandatos] 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.
""" """
if id: if id:
qs = CasaLegislativa.objects.filter(pk=id) qs = CasaLegislativa.objects.filter(pk=id)
else: else:
qs = carrinhoOrGet_for_qs(request) qs = carrinhoOrGet_for_qs(request)
if not qs: if not qs:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
@ -228,56 +234,56 @@ 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:
qs = carrinhoOrGet_for_qs(request) qs = carrinhoOrGet_for_qs(request)
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)
else: else:
qs = carrinhoOrGet_for_qs(request) qs = carrinhoOrGet_for_qs(request)
if not qs: if not qs:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=casas.pdf' response['Content-Disposition'] = 'attachment; filename=casas.pdf'
# Gera um relatorio para cada casa e concatena os relatorios # Gera um relatorio para cada casa e concatena os relatorios
cont = 0 cont = 0
canvas = None canvas = None
quant = qs.count() quant = qs.count()
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,35 +292,35 @@ 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('../')
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
report = CasasSemConvenioReport(queryset=qs) report = CasasSemConvenioReport(queryset=qs)
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=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=casas.csv' response['Content-Disposition'] = 'attachment; filename=casas.csv'
writer = csv.writer(response) writer = csv.writer(response)
casas = carrinhoOrGet_for_qs(request) casas = carrinhoOrGet_for_qs(request)
if not casas or not request.POST: if not casas or not request.POST:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
atributos = request.POST.getlist("itens_csv_selected") atributos = request.POST.getlist("itens_csv_selected")
atributos2 = [s.encode("utf-8") for s in atributos] atributos2 = [s.encode("utf-8") for s in atributos]
@ -322,9 +328,9 @@ def export_csv(request):
atributos2.insert(atributos2.index('Município'), u'UF') atributos2.insert(atributos2.index('Município'), u'UF')
except ValueError: except ValueError:
pass pass
writer.writerow(atributos2) writer.writerow(atributos2)
for casa in casas: for casa in casas:
lista = [] lista = []
contatos = casa.funcionario_set.filter(setor="contato_interlegis") contatos = casa.funcionario_set.filter(setor="contato_interlegis")
@ -341,10 +347,10 @@ def export_csv(request):
lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8")) lista.append(unicode(casa.municipio.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"))
elif u"Bairro" == atributo: elif u"Bairro" == atributo:
@ -378,7 +384,7 @@ def export_csv(request):
lista.append('') lista.append('')
else: else:
pass pass
writer.writerow(lista) writer.writerow(lista)
return response return response

5
sigi/apps/contatos/admin.py

@ -11,9 +11,10 @@ class UnidadeFederativaAdmin(admin.ModelAdmin):
list_display = ('codigo_ibge', 'nome', 'sigla', 'regiao', 'populacao') list_display = ('codigo_ibge', 'nome', 'sigla', 'regiao', 'populacao')
list_display_links = ('codigo_ibge', 'nome') list_display_links = ('codigo_ibge', 'nome')
list_filter = ('regiao', 'populacao', PopulationFilter,) list_filter = ('regiao', 'populacao', PopulationFilter,)
search_fields = ('search_text', 'codigo_ibge', 'sigla', 'regiao') search_fields = ('search_text', 'codigo_ibge', 'sigla', 'regiao')
get_queryset = queryset_ascii 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):

120
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(
@ -97,11 +99,11 @@ class Municipio(models.Model):
blank=True, blank=True,
help_text='Exemplo: <em>-45,426</em>.' help_text='Exemplo: <em>-45,426</em>.'
) )
idh = models.DecimalField(u'IDH', help_text=u'Índice de desenvolvimento Humano', max_digits=4, decimal_places=3, idh = models.DecimalField(u'IDH', help_text=u'Índice de desenvolvimento Humano', max_digits=4, decimal_places=3,
validators=[MinValueValidator(0), MaxValueValidator(1)]) validators=[MinValueValidator(0), MaxValueValidator(1)])
idh.list_filter_range = [0.500, 0.800] idh.list_filter_range = [0.500, 0.800]
pib_total = models.DecimalField(u'PIB total', max_digits=18, decimal_places=3, blank=True, null=True) pib_total = models.DecimalField(u'PIB total', max_digits=18, decimal_places=3, blank=True, null=True)
pib_percapita = models.DecimalField(u'PIB per capita', max_digits=18, decimal_places=3, blank=True, null=True) pib_percapita = models.DecimalField(u'PIB per capita', max_digits=18, decimal_places=3, blank=True, null=True)
pib_ano = models.IntegerField(u'Ano de apuração do PIB', blank=True, null=True) pib_ano = models.IntegerField(u'Ano de apuração do PIB', blank=True, null=True)
@ -118,7 +120,9 @@ class Municipio(models.Model):
return "http://maps.google.com.br/maps/mm?ie=UTF8&hl=pt-BR&t=h&ll=%s,%s&spn=1.61886,1.812744&z=9&source=embed" % \ 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 = (
@ -129,16 +133,16 @@ class Telefone(models.Model):
) )
numero = models.CharField( numero = models.CharField(
'número', 'número',
max_length=64, # TODO: diminuir tamanho de campo após migração de dados max_length=64, # TODO: diminuir tamanho de campo após migração de dados
help_text='Exemplo: <em>(31)8851-9898</em>.', help_text='Exemplo: <em>(31)8851-9898</em>.',
) )
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)
# guarda o tipo do objeto (classe) vinculado a esse registro # guarda o tipo do objeto (classe) vinculado a esse registro
content_type = models.ForeignKey(ContentType) content_type = models.ForeignKey(ContentType)
@ -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)
@ -275,5 +282,4 @@ 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

65
sigi/apps/convenios/admin.py

@ -11,57 +11,62 @@ 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 = (
(None, (None,
{'fields': ('casa_legislativa', 'num_processo_sf', 'num_convenio', 'projeto', 'observacao')} {'fields': ('casa_legislativa', 'num_processo_sf', 'num_convenio', 'projeto', 'observacao')}
), ),
('Datas', ('Datas',
{'fields': ('data_adesao', 'data_retorno_assinatura', {'fields': ('data_adesao', 'data_retorno_assinatura',
'data_termo_aceite', 'data_pub_diario', 'data_termo_aceite', 'data_pub_diario',
'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')

19
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.
@ -90,7 +92,7 @@ class Convenio(models.Model):
help_text=u'Data do retorno do convênio sem assinatura', help_text=u'Data do retorno do convênio sem assinatura',
) )
observacao = models.CharField( observacao = models.CharField(
null=True, null=True,
blank=True, blank=True,
max_length=100, max_length=100,
) )
@ -98,24 +100,24 @@ 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',)
verbose_name = u'convênio' verbose_name = u'convênio'
def __unicode__(self): def __unicode__(self):
if self.data_retorno_assinatura != None: if self.data_retorno_assinatura != None:
return u"Convênio nº %s - projeto %s, em %s" % (self.num_convenio, self.projeto.sigla, self.data_retorno_assinatura) return u"Convênio nº %s - projeto %s, em %s" % (self.num_convenio, self.projeto.sigla, self.data_retorno_assinatura)
else: else:
return u"Adesão ao projeto %s, em %s" % (self.projeto.sigla, self.data_adesao) return u"Adesão ao projeto %s, em %s" % (self.projeto.sigla, self.data_adesao)
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))

270
sigi/apps/convenios/reports.py

@ -3,8 +3,8 @@ 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
from reportlab.lib.units import cm from reportlab.lib.units import cm
@ -15,302 +15,306 @@ 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},
)
)
] ]
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=[
ObjectValue(attribute_name='estado', left=label_left[0]*cm, ),
ObjectValue(attribute_name='quant_casas', left=label_left[1]*cm,),
ObjectValue(attribute_name='quant_casas_aderidas', left=label_left[2]*cm),
ObjectValue(attribute_name='porc_casas_aderidas', left=label_left[3]*cm),
ObjectValue(attribute_name='quant_casas_nao_aderidas', left=label_left[4]*cm),
ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,),
]
class band_summary(ReportBand):
label_left = [0.5,6,8,10,12,14]
elements = [ elements = [
Label(text="Total", top=0.1*cm, left=label_left[0]*cm), ObjectValue(attribute_name='estado', left=label_left[0] * cm, ),
ObjectValue(attribute_name='quant_casas', action=FIELD_ACTION_SUM, left=label_left[1]*cm, ), ObjectValue(attribute_name='quant_casas', 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', 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', left=label_left[3] * cm),
# #get_value= lambda instance : lambda instance: '%.2f' % (instance.porc_casas_aderidas), 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='quant_casas_nao_aderidas', action=FIELD_ACTION_SUM, left=label_left[4]*cm), ]
# ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,
# get_value=lambda x: teste(), class band_summary(ReportBand):
# ), label_left = [0.5, 6, 8, 10, 12, 14]
] elements = [
borders = {'top':True} Label(text="Total", top=0.1 * cm, left=label_left[0] * cm),
ObjectValue(attribute_name='quant_casas', action=FIELD_ACTION_SUM, left=label_left[1] * cm, ),
ObjectValue(attribute_name='quant_casas_aderidas', action=FIELD_ACTION_SUM, left=label_left[2] * cm),
# ObjectValue(attribute_name='porc_casas_aderidas', action=FIELD_ACTION_AVG, left=label_left[3]*cm,
# get_value= lambda instance : lambda instance: '%.2f' % (instance.porc_casas_aderidas),
# ),
ObjectValue(attribute_name='quant_casas_nao_aderidas', action=FIELD_ACTION_SUM, left=label_left[4] * cm),
# ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,
# get_value=lambda x: teste(),
# ),
]
borders = {'top': True}
class ConvenioPorCMReport(ConvenioReport): 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'

160
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,56 +22,60 @@ 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.
""" """
if request.session.has_key('carrinho_convenios'): if request.session.has_key('carrinho_convenios'):
ids = request.session['carrinho_convenios'] ids = request.session['carrinho_convenios']
qs = Convenio.objects.filter(pk__in=ids) qs = Convenio.objects.filter(pk__in=ids)
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'):
request.session['carrinho_convenios'] = ids_selecionados request.session['carrinho_convenios'] = ids_selecionados
else: else:
@ -79,35 +83,38 @@ def adicionar_convenios_carrinho(request,queryset=None,id=None):
# Verifica se id já não está adicionado # Verifica se id já não está adicionado
for id in ids_selecionados: for id in ids_selecionados:
if not id in lista: if not id in lista:
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')
if request.session.has_key('carrinho_convenios'): if request.session.has_key('carrinho_convenios'):
lista = request.session['carrinho_convenios'] lista = request.session['carrinho_convenios']
for item in ids_selecionados: for item in ids_selecionados:
lista.remove(item) lista.remove(item)
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)
paginator = Paginator(qs, 100) paginator = Paginator(qs, 100)
# Make sure page request is an int. If not, deliver first page. # Make sure page request is an int. If not, deliver first page.
# Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página. # Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página.
try: try:
@ -120,33 +127,34 @@ def visualizar_carrinho(request):
paginas = paginator.page(page) paginas = paginator.page(page)
except (EmptyPage, InvalidPage): except (EmptyPage, InvalidPage):
paginas = paginator.page(paginator.num_pages) paginas = paginator.page(paginator.num_pages)
carrinhoIsEmpty = not(request.session.has_key('carrinho_convenios')) carrinhoIsEmpty = not(request.session.has_key('carrinho_convenios'))
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:
qs = Convenio.objects.filter(pk=id) qs = Convenio.objects.filter(pk=id)
else: else:
qs = carrinhoOrGet_for_qs(request) qs = carrinhoOrGet_for_qs(request)
if not qs: if not qs:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
tipo = '' tipo = ''
data_aceite_has = '' data_aceite_has = ''
report = None report = None
if request.POST: if request.POST:
if request.POST.has_key('filtro_casa'): if request.POST.has_key('filtro_casa'):
tipo = request.POST['filtro_casa'] tipo = request.POST['filtro_casa']
if request.POST.has_key('data_aceite'): if request.POST.has_key('data_aceite'):
@ -160,24 +168,23 @@ def report(request, id=None):
else: else:
report = ConvenioPorALReport(queryset=qs) report = ConvenioPorALReport(queryset=qs)
else: else:
qs = qs.filter(casa_legislativa__tipo__sigla='CM') qs = qs.filter(casa_legislativa__tipo__sigla='CM')
if data_aceite_has == 'nao': if data_aceite_has == 'nao':
report = ConvenioReportSemAceiteCM(queryset=qs) report = ConvenioReportSemAceiteCM(queryset=qs)
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)
else: else:
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
@ -208,7 +215,7 @@ def casas_estado_to_tabela(casas,convenios,regiao):
linha.estado = estado linha.estado = estado
lista.append(linha) lista.append(linha)
casas_regiao = casas.filter(municipio__uf__regiao=regiao) casas_regiao = casas.filter(municipio__uf__regiao=regiao)
convenios_regiao = convenios.filter(casa_legislativa__municipio__uf__regiao=regiao) convenios_regiao = convenios.filter(casa_legislativa__municipio__uf__regiao=regiao)
convenios_regiao_publicados = convenios_regiao.exclude(data_pub_diario=None) convenios_regiao_publicados = convenios_regiao.exclude(data_pub_diario=None)
@ -225,19 +232,20 @@ def casas_estado_to_tabela(casas,convenios,regiao):
u'UF', u'UF',
u'Câmaras municipais', u'Câmaras municipais',
u'Não Aderidas', u'Não Aderidas',
u'Aderidas', u'Aderidas',
u'Conveniadas', u'Conveniadas',
u'Equipadas' u'Equipadas'
) )
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'):
regiao = request.POST['regiao'] regiao = request.POST['regiao']
@ -249,39 +257,40 @@ def report_regiao(request,regiao='NE'):
'NE': 'Nordeste', 'NE': 'Nordeste',
'NO': 'Norte', 'NO': 'Norte',
} }
projetos = Projeto.objects.all() projetos = Projeto.objects.all()
camaras = CasaLegislativa.objects.filter(tipo__sigla='CM') camaras = CasaLegislativa.objects.filter(tipo__sigla='CM')
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)
data = datetime.datetime.now().strftime('%d/%m/%Y') data = datetime.datetime.now().strftime('%d/%m/%Y')
hora = datetime.datetime.now().strftime('%H:%M') hora = datetime.datetime.now().strftime('%H:%M')
pisa.showLogging() pisa.showLogging()
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
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,16 +300,16 @@ 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:
atributos = request.POST.getlist("itens_csv_selected") atributos = request.POST.getlist("itens_csv_selected")
col_titles = atributos col_titles = atributos
if u"Casa Legislativa" in col_titles: if u"Casa Legislativa" in col_titles:
pos = col_titles.index(u"Casa Legislativa") + 1 pos = col_titles.index(u"Casa Legislativa") + 1
col_titles.insert(pos, u"uf") col_titles.insert(pos, u"uf")
csv_writer.writerow([s.encode("utf-8") for s in col_titles]) csv_writer.writerow([s.encode("utf-8") for s in col_titles])
for convenio in convenios: for convenio in convenios:
@ -341,4 +350,3 @@ def export_csv(request):
csv_writer.writerow(lista) csv_writer.writerow(lista)
return response return response

53
sigi/apps/diagnosticos/admin.py

@ -6,17 +6,18 @@ from sigi.apps.diagnosticos.models import Diagnostico, Pergunta, Escolha, Equipe
from sigi.apps.diagnosticos.forms import DiagnosticoForm from sigi.apps.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
email = diagnostico.responsavel.user.email email = diagnostico.responsavel.user.email
if email: if email:
diagnostico.email_diagnostico_publicado(email, request.get_host()) diagnostico.email_diagnostico_publicado(email, request.get_host())
self.message_user(request, "Diagnóstico(s) publicado(s) com sucesso!") self.message_user(request, "Diagnóstico(s) publicado(s) com sucesso!")
publicar_diagnostico.short_description = u""" publicar_diagnostico.short_description = u"""
Definir diagnósticos como publicado""" Definir diagnósticos como 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,13 +47,14 @@ 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',)
@ -57,7 +62,7 @@ class DiagnosticoAdmin(BaseEntityAdmin):
(u'00. Identificação do Diagnóstico', {'fields': ('responsavel', 'data_visita_inicio', 'data_visita_fim',)}), (u'00. Identificação do Diagnóstico', {'fields': ('responsavel', 'data_visita_inicio', 'data_visita_fim',)}),
(u'01. Identificação da Casa Legislativa', {'fields': ('casa_legislativa',)}), (u'01. Identificação da Casa Legislativa', {'fields': ('casa_legislativa',)}),
(u'02. Identificação de Competências da Casa Legislativa', {'fields': ()}) (u'02. Identificação de Competências da Casa Legislativa', {'fields': ()})
) )
# popula o eav fieldsets ordenando as categorias e as perguntas # popula o eav fieldsets ordenando as categorias e as perguntas
# para serem exibidas no admin # para serem exibidas no admin
@ -67,49 +72,50 @@ class DiagnosticoAdmin(BaseEntityAdmin):
perguntas = [pergunta[1] for pergunta in sorted(perguntas_by_title)] perguntas = [pergunta[1] for pergunta in sorted(perguntas_by_title)]
eav_fieldsets += ((categoria, { eav_fieldsets += ((categoria, {
'fields': tuple(perguntas), 'fields': tuple(perguntas),
'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'
get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome' get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome'
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
return super(DiagnosticoAdmin, self).lookup_allowed(lookup, value) or \ return super(DiagnosticoAdmin, 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 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

41
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__'
@ -94,8 +98,8 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm):
for schema in self.instance.get_schemata(int(category)): for schema in self.instance.get_schemata(int(category)):
defaults = { defaults = {
'label': schema.title, 'label': schema.title,
'required': schema.required, 'required': schema.required,
'help_text': schema.help_text, 'help_text': schema.help_text,
} }
@ -127,8 +131,8 @@ 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:
model = CasaLegislativa model = CasaLegislativa
@ -137,9 +141,9 @@ 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):
super(CasaLegislativaMobileForm, self).save(commit=True) super(CasaLegislativaMobileForm, self).save(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')

68
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
""" """
@ -38,7 +39,7 @@ class Diagnostico(BaseEntity):
) )
responsavel = models.ForeignKey('servidores.Servidor', responsavel = models.ForeignKey('servidores.Servidor',
verbose_name=u'responsável') verbose_name=u'responsável')
class Meta: class Meta:
verbose_name, verbose_name_plural = u'diagnóstico', u'diagnósticos' verbose_name, verbose_name_plural = u'diagnóstico', u'diagnósticos'
@ -85,15 +86,15 @@ class Diagnostico(BaseEntity):
construção do endereço do diagnóstico construção do endereço do diagnóstico
""" """
enviar_email(from_email, u"Diagnóstico publicado", enviar_email(from_email, u"Diagnóstico publicado",
'diagnosticos/email_diagnostico_publicado.txt', 'diagnosticos/email_diagnostico_publicado.txt',
{ {
'responsavel': self.responsavel.nome_completo, 'responsavel': self.responsavel.nome_completo,
'casa_legislativa': self.casa_legislativa, 'casa_legislativa': self.casa_legislativa,
'data_diagnostico': self.data_visita_inicio, 'data_diagnostico': self.data_visita_inicio,
'host': host, 'host': host,
'url_diagnostico': self.get_absolute_url(), 'url_diagnostico': self.get_absolute_url(),
'status': u"Publicado", 'status': u"Publicado",
}) })
def email_diagnostico_alterado(self, from_email, host): def email_diagnostico_alterado(self, from_email, host):
"""Enviando email quando o status do diagnóstico """Enviando email quando o status do diagnóstico
@ -103,24 +104,23 @@ class Diagnostico(BaseEntity):
construção do endereço do diagnóstico construção do endereço do diagnóstico
""" """
enviar_email(from_email, u"Diagnóstico alterado", enviar_email(from_email, u"Diagnóstico alterado",
'diagnosticos/email_diagnostico_alterado.txt', 'diagnosticos/email_diagnostico_alterado.txt',
{ {
'servidor': self.responsavel.nome_completo, 'servidor': self.responsavel.nome_completo,
'casa_legislativa': self.casa_legislativa, 'casa_legislativa': self.casa_legislativa,
'data_diagnostico': self.data_visita_inicio, 'data_diagnostico': self.data_visita_inicio,
'host': host, 'host': host,
'url_diagnostico': self.get_absolute_url(), 'url_diagnostico': self.get_absolute_url(),
'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
@ -168,8 +170,8 @@ class Pergunta(BaseSchema):
""", [self.id]) """, [self.id])
return [ return [
(Escolha.objects.get(id=int(row[0])), row[1]) (Escolha.objects.get(id=int(row[0])), row[1])
for row in cursor.fetchall() for row in cursor.fetchall()
] ]
def total_anwsers(self): def total_anwsers(self):
@ -190,34 +192,37 @@ 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
""" """
schema = models.ForeignKey(Pergunta, schema = models.ForeignKey(Pergunta,
related_name='choices', verbose_name='pergunta') related_name='choices', verbose_name='pergunta')
schema_to_open = models.ForeignKey(Pergunta, related_name='', schema_to_open = models.ForeignKey(Pergunta, related_name='',
verbose_name='pergunta para abrir', blank=True, null=True) verbose_name='pergunta para abrir', blank=True, null=True)
ordem = models.PositiveIntegerField(blank=True, null=True) 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
""" """
schema = models.ForeignKey(Pergunta, related_name='attrs', schema = models.ForeignKey(Pergunta, related_name='attrs',
verbose_name='pergunta') verbose_name='pergunta')
choice = models.ForeignKey(Escolha, verbose_name='escolha', choice = models.ForeignKey(Escolha, verbose_name='escolha',
blank=True, null=True) blank=True, null=True)
class Meta: class Meta:
verbose_name, verbose_name_plural = 'resposta', 'respostas' verbose_name, verbose_name_plural = 'resposta', 'respostas'
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.
""" """
@ -238,7 +244,7 @@ class Anexo(models.Model):
arquivo = models.FileField(upload_to='apps/diagnostico/anexo/arquivo',) arquivo = models.FileField(upload_to='apps/diagnostico/anexo/arquivo',)
descricao = models.CharField('descrição', max_length='70') descricao = models.CharField('descrição', max_length='70')
data_pub = models.DateTimeField('data da publicação do anexo', data_pub = models.DateTimeField('data da publicação do anexo',
default=datetime.now) default=datetime.now)
class Meta: class Meta:
ordering = ('-data_pub',) ordering = ('-data_pub',)

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

28
sigi/apps/diagnosticos/views.py

@ -3,7 +3,7 @@
from itertools import cycle from itertools import cycle
from django.http import HttpResponse from django.http import HttpResponse
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from django.shortcuts import render_to_response, get_object_or_404 from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext from django.template import RequestContext
from django.views.decorators.cache import never_cache from django.views.decorators.cache import never_cache
@ -173,10 +173,10 @@ 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
for form in forms: for form in forms:
@ -199,8 +199,8 @@ def categoria_contatos(request, id_diagnostico):
for form_telefones in form.telefones.forms: for form_telefones in form.telefones.forms:
if not form_telefones.is_valid(): if not form_telefones.is_valid():
if (form_telefones.fields['id'].initial is not None if (form_telefones.fields['id'].initial is not None
and form_telefones.fields['tipo'].initial == 'I' and form_telefones.fields['tipo'].initial == 'I'
and form_telefones.fields['numero'].initial is None): and form_telefones.fields['numero'].initial is None):
if Telefone.objects.filter(pk=form_telefones.fields['id'].initial).exists(): if Telefone.objects.filter(pk=form_telefones.fields['id'].initial).exists():
Telefone.objects.get(pk=form_telefones.fields['id'].initial).delete() Telefone.objects.get(pk=form_telefones.fields['id'].initial).delete()
if not resposta['fones'].has_key(form.prefix): if not resposta['fones'].has_key(form.prefix):
@ -251,31 +251,31 @@ 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,
'schemas_by_categoria': schemas_by_categoria, 'schemas_by_categoria': schemas_by_categoria,
}) })
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, {
'categorias': categorias, 'categorias': categorias,
'sel_categoria': sel_categoria, 'sel_categoria': sel_categoria,
'perguntas': perguntas, 'perguntas': perguntas,
}) })
return render_to_response('diagnosticos/graficos.html', return render_to_response('diagnosticos/graficos.html',
context) context)
@ -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

5
sigi/apps/financeiro/admin.py

@ -2,10 +2,11 @@
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', )
list_filter = ('projeto',) list_filter = ('projeto',)
date_hierarchy = 'data' date_hierarchy = 'data'
admin.site.register(Desembolso, DesembolsoAdmin) admin.site.register(Desembolso, DesembolsoAdmin)

2
sigi/apps/financeiro/forms.py

@ -1,3 +1,3 @@
from django import forms from django import forms
# place form definition here # place form definition here

6
sigi/apps/financeiro/models.py

@ -2,17 +2,17 @@
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)
data = models.DateField(u'Data do desembolso') data = models.DateField(u'Data do desembolso')
valor_reais = models.DecimalField(u'Valor em R$', max_digits=18, decimal_places=2) valor_reais = models.DecimalField(u'Valor em R$', max_digits=18, decimal_places=2)
valor_dolar = models.DecimalField(u'Valor em US$', max_digits=18, decimal_places=2) valor_dolar = models.DecimalField(u'Valor em US$', max_digits=18, decimal_places=2)
class Meta: class Meta:
verbose_name = 'Desembolso' verbose_name = 'Desembolso'
verbose_name_plural = 'Desembolsos' verbose_name_plural = 'Desembolsos'
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)

12
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,10 +47,11 @@ 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',)
list_filter = ('fabricante',) list_filter = ('fabricante',)
ordering = ('fabricante', 'modelo') ordering = ('fabricante', 'modelo')
raw_id_fields = ('fabricante', 'modelo') raw_id_fields = ('fabricante', 'modelo')
search_fields = ('id', 'modelo', 'fabricante') search_fields = ('id', 'modelo', 'fabricante')
@ -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)

29
sigi/apps/mesas/admin.py

@ -1,25 +1,27 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import admin from django.contrib import admin
from django.http import HttpResponse from django.http import HttpResponse
from django.utils.html import escape from django.utils.html import escape
from sigi.apps.mesas.models import (Legislatura, Coligacao, ComposicaoColigacao, from sigi.apps.mesas.models import (Legislatura, Coligacao, ComposicaoColigacao,
SessaoLegislativa, MesaDiretora, Cargo, SessaoLegislativa, MesaDiretora, Cargo,
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'
list_display = ('numero', 'casa_legislativa', 'uf', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares') list_display = ('numero', 'casa_legislativa', 'uf', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares')
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):
return obj.casa_legislativa.municipio.uf.sigla return obj.casa_legislativa.municipio.uf.sigla
uf.short_description = 'UF' uf.short_description = 'UF'
@ -28,21 +30,23 @@ class LegislaturaAdmin(admin.ModelAdmin):
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
return super(LegislaturaAdmin, self).lookup_allowed(lookup, value) or \ return super(LegislaturaAdmin, 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 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',)

15
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')
@ -9,10 +10,10 @@ class Legislatura(models.Model):
data_fim = models.DateField(u'fim') data_fim = models.DateField(u'fim')
data_eleicao = models.DateField(u'data da eleição') data_eleicao = models.DateField(u'data da eleição')
total_parlamentares = models.PositiveIntegerField(u"Total de parlamentares") total_parlamentares = models.PositiveIntegerField(u"Total de parlamentares")
casa_legislativa.convenio_uf_filter = True casa_legislativa.convenio_uf_filter = True
casa_legislativa.convenio_cl_tipo_filter = True casa_legislativa.convenio_cl_tipo_filter = True
def meta(self): def meta(self):
unique_together = (('casa_legislativa', 'numero')) unique_together = (('casa_legislativa', 'numero'))
ordering = ['casa_legislativa__municipio__uf__sigla', '-data_inicio'] ordering = ['casa_legislativa__municipio__uf__sigla', '-data_inicio']
@ -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'),
@ -65,7 +69,7 @@ class SessaoLegislativa(models.Model):
default='O' default='O'
) )
data_inicio = models.DateField(u'início') data_inicio = models.DateField(u'início')
data_fim = models.DateField('fim') data_fim = models.DateField('fim')
data_inicio_intervalo = models.DateField( data_inicio_intervalo = models.DateField(
u'início de intervalo', u'início de intervalo',
blank=True, blank=True,
@ -85,11 +89,12 @@ 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',
verbose_name='Casa Legislativa' verbose_name='Casa Legislativa'
) )
class Meta: class Meta:
verbose_name = 'Mesa Diretora' verbose_name = 'Mesa Diretora'
@ -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)

38
sigi/apps/metas/admin.py

@ -2,47 +2,49 @@
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',)
raw_id_fields = ('casa_legislativa',) raw_id_fields = ('casa_legislativa',)
list_filter = ('projeto', 'status', 'casa_legislativa', 'casa_legislativa__municipio__uf__nome') list_filter = ('projeto', 'status', 'casa_legislativa', 'casa_legislativa__municipio__uf__nome')
def get_uf(self, obj): def get_uf(self, obj):
return obj.casa_legislativa.municipio.uf.nome return obj.casa_legislativa.municipio.uf.nome
get_uf.short_description = u"UF" get_uf.short_description = u"UF"
get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome' get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome'
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
return super(PlanoDiretorAdmin, self).lookup_allowed(lookup, value) or \ return super(PlanoDiretorAdmin, 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 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)
admin.site.register(PlanoDiretor, PlanoDiretorAdmin) admin.site.register(PlanoDiretor, PlanoDiretorAdmin)

2
sigi/apps/metas/forms.py

@ -1,3 +1,3 @@
from django import forms from django import forms
# place form definition here # place form definition here

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")

71
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'),
@ -15,21 +16,21 @@ class Meta(models.Model):
('COUNT_PDIR', u'Quantidade de planos diretores'), ('COUNT_PDIR', u'Quantidade de planos diretores'),
('COUNT_CONV', u'Quantidade de casas conveniadas'), ('COUNT_CONV', u'Quantidade de casas conveniadas'),
) )
projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto', help_text=u'Projeto ao qual a meta se refere') projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto', help_text=u'Projeto ao qual a meta se refere')
titulo = models.CharField(u'Título', max_length=40, help_text=u'Título da meta que aparecerá no dashboard') titulo = models.CharField(u'Título', max_length=40, help_text=u'Título da meta que aparecerá no dashboard')
descricao = models.TextField(u'Descrição') descricao = models.TextField(u'Descrição')
data_inicio = models.DateField(u'Data inicial', help_text=u'Início do período de cômputo da meta') data_inicio = models.DateField(u'Data inicial', help_text=u'Início do período de cômputo da meta')
data_fim = models.DateField(u'Data final', help_text=u'Prazo final para cumprimento da meta') data_fim = models.DateField(u'Data final', help_text=u'Prazo final para cumprimento da meta')
algoritmo = models.CharField(u'Algoritmo de cálculo', max_length=10, choices=ALGORITMO_CHOICES) algoritmo = models.CharField(u'Algoritmo de cálculo', max_length=10, choices=ALGORITMO_CHOICES)
valor_meta = models.FloatField(u'Valor da meta', help_text=u'Valor que deve ser atingido até o prazo final da meta') valor_meta = models.FloatField(u'Valor da meta', help_text=u'Valor que deve ser atingido até o prazo final da meta')
class Meta: class Meta:
verbose_name = 'Meta BID' verbose_name = 'Meta BID'
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):
""" """
@ -42,11 +43,11 @@ class Meta(models.Model):
except: except:
valor = 0.0 valor = 0.0
return valor return valor
@property @property
def percentual_concluido(self): def percentual_concluido(self):
return round(float(self.valor_executado) / float(self.valor_meta) * 100.0, 2) return round(float(self.valor_executado) / float(self.valor_meta) * 100.0, 2)
@property @property
def valor_desejado(self): def valor_desejado(self):
total_dias = (self.data_fim - self.data_inicio).days + 1 total_dias = (self.data_fim - self.data_inicio).days + 1
@ -56,57 +57,56 @@ class Meta(models.Model):
@property @property
def percentual_desejado_low(self): def percentual_desejado_low(self):
return (self.valor_desejado / self.valor_meta) - 0.05 # 5% abaixo do desejado return (self.valor_desejado / self.valor_meta) - 0.05 # 5% abaixo do desejado
@property @property
def percentual_desejado_high(self): def percentual_desejado_high(self):
return (self.valor_desejado / self.valor_meta) + 0.05 # 5% acima do desejado return (self.valor_desejado / self.valor_meta) + 0.05 # 5% acima do desejado
@property @property
def saude(self): def saude(self):
percentual_concluido = self.percentual_concluido / 100.0 percentual_concluido = self.percentual_concluido / 100.0
if percentual_concluido >= 1: if percentual_concluido >= 1:
return 'A2BBED' # Blue return 'A2BBED' # Blue
if percentual_concluido > self.percentual_desejado_high: if percentual_concluido > self.percentual_desejado_high:
return '89D7AF' # Green return '89D7AF' # Green
if percentual_concluido > self.percentual_desejado_low: if percentual_concluido > self.percentual_desejado_low:
return 'FFDB6E' # Orange return 'FFDB6E' # Orange
return 'E74A69' # Red return 'E74A69' # Red
def sum_gastos(self): def sum_gastos(self):
valor = Desembolso.objects.filter(projeto=self.projeto, data__gte=self.data_inicio, data__lte=self.data_fim) \ valor = Desembolso.objects.filter(projeto=self.projeto, data__gte=self.data_inicio, data__lte=self.data_fim) \
.aggregate(total_dolar=models.Sum('valor_dolar')) .aggregate(total_dolar=models.Sum('valor_dolar'))
valor = valor['total_dolar'] valor = valor['total_dolar']
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):
valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', projeto=self.projeto, data_adesao__gte=self.data_inicio, valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', projeto=self.projeto, data_adesao__gte=self.data_inicio,
data_adesao__lte=self.data_fim).exclude(data_adesao=None).count() data_adesao__lte=self.data_fim).exclude(data_adesao=None).count()
return valor return valor
def count_diag(self): def count_diag(self):
valor = Diagnostico.objects.filter(data_visita_inicio__gte=self.data_inicio, data_visita_inicio__lte=self.data_fim, valor = Diagnostico.objects.filter(data_visita_inicio__gte=self.data_inicio, data_visita_inicio__lte=self.data_fim,
publicado=True).count() publicado=True).count()
return valor return valor
def count_pdir(self): def count_pdir(self):
valor = PlanoDiretor.objects.filter(projeto=self.projeto, data_entrega__gte=self.data_inicio, valor = PlanoDiretor.objects.filter(projeto=self.projeto, data_entrega__gte=self.data_inicio,
data_entrega__lte=self.data_fim).count() data_entrega__lte=self.data_fim).count()
return valor 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'),
@ -122,7 +122,6 @@ class PlanoDiretor(models.Model):
class Meta: class Meta:
verbose_name = 'Plano Diretor' verbose_name = 'Plano Diretor'
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

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

@ -6,16 +6,17 @@ 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):
return "" return ""
result = "" result = ""
for sv in value.servico_set.all(): for sv in value.servico_set.all():
result += u'<li>%s ativado em %s</li>' % (sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y')) result += u'<li>%s ativado em %s</li>' % (sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y'))
for cv in value.convenio_set.all(): for cv in value.convenio_set.all():
if (cv.data_retorno_assinatura is None) and (cv.equipada and cv.data_termo_aceite is not None): if (cv.data_retorno_assinatura is None) and (cv.equipada and cv.data_termo_aceite is not None):
result += u"<li>Equipada em %s pelo %s</li>" % (cv.data_termo_aceite.strftime('%d/%m/%Y'), cv.projeto.sigla) result += u"<li>Equipada em %s pelo %s</li>" % (cv.data_termo_aceite.strftime('%d/%m/%Y'), cv.projeto.sigla)
@ -23,13 +24,12 @@ def descricao_servicos(value):
result += u"<li>Conveniada ao %s em %s</li>" % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y')) result += u"<li>Conveniada ao %s em %s</li>" % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y'))
if (cv.data_retorno_assinatura is not None) and (cv.equipada and cv.data_termo_aceite is not None): if (cv.data_retorno_assinatura is not None) and (cv.equipada and cv.data_termo_aceite is not None):
result += u"<li>Conveniada ao %s em %s e equipada em %s</li>" % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y'), cv.data_termo_aceite.strftime('%d/%m/%Y')) result += u"<li>Conveniada ao %s em %s e equipada em %s</li>" % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y'), cv.data_termo_aceite.strftime('%d/%m/%Y'))
for dg in value.diagnostico_set.all(): for dg in value.diagnostico_set.all():
result += u'<li>Diagnosticada no período de %s a %s</li>' % (dg.data_visita_inicio.strftime('%d/%m/%Y') if dg.data_visita_inicio result += u'<li>Diagnosticada no período de %s a %s</li>' % (dg.data_visita_inicio.strftime('%d/%m/%Y') if dg.data_visita_inicio
else u"<< sem data inicial >>", else u"<< sem data inicial >>",
dg.data_visita_fim.strftime('%d/%m/%Y') if dg.data_visita_fim dg.data_visita_fim.strftime('%d/%m/%Y') if dg.data_visita_fim
else u"<< sem data final >>") else u"<< sem data final >>")
return mark_safe(result) return mark_safe(result)
descricao_servicos.is_safe = True descricao_servicos.is_safe = True

78
sigi/apps/metas/views.py

@ -4,7 +4,7 @@ import os
from django.http import HttpResponse from django.http import HttpResponse
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from django.utils.datastructures import SortedDict from django.utils.datastructures import SortedDict
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.template import RequestContext from django.template import RequestContext
@ -24,8 +24,8 @@ from sigi.apps.metas.templatetags.mapa_tags import descricao_servicos
JSON_FILE_NAME = os.path.join(MEDIA_ROOT, 'apps/metas/map_data.json') 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,12 +67,12 @@ 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 = []
extra_context = { extra_context = {
'seit': seit, 'seit': seit,
@ -89,7 +90,7 @@ def mapa(request):
return render_to_response('metas/mapa.html', extra_context, context_instance=RequestContext(request)) return render_to_response('metas/mapa.html', extra_context, context_instance=RequestContext(request))
@cache_page(1800) # Cache de 30min @cache_page(1800) # Cache de 30min
def map_data(request): def map_data(request):
""" """
Retorna json com todos os dados dos municípios que têm relação com o Interlegis Retorna json com todos os dados dos municípios que têm relação com o Interlegis
@ -105,6 +106,7 @@ def map_data(request):
return HttpResponse(json, mimetype="application/json") 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,7 +121,8 @@ 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
param = get_params(request) param = get_params(request)
@ -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,7 +194,8 @@ 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
param = get_params(request) param = get_params(request)
@ -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,21 +248,22 @@ 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)
qConvenio = Q(convenio__projeto__sigla__in=convenios) qConvenio = Q(convenio__projeto__sigla__in=convenios)
qEquipada = Q(convenio__projeto__sigla__in=equipadas, convenio__equipada=True) qEquipada = Q(convenio__projeto__sigla__in=equipadas, convenio__equipada=True)
qRegiao = Q(municipio__uf__regiao__in=regioes) qRegiao = Q(municipio__uf__regiao__in=regioes)
qEstado = Q(municipio__uf__sigla__in=estados) qEstado = Q(municipio__uf__sigla__in=estados)
if diagnosticos: if diagnosticos:
qDiagnostico = Q(diagnostico__publicado__in=[p == 'P' for p in diagnosticos]) qDiagnostico = Q(diagnostico__publicado__in=[p == 'P' for p in diagnosticos])
@ -270,6 +274,7 @@ def filtrar_casas(seit, convenios, equipadas, regioes, estados, diagnosticos):
return casas 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 = {
@ -303,8 +309,8 @@ def gera_map_data_file(cronjob=False):
for sv in c.servico_set.all(): for sv in c.servico_set.all():
casa['info'].append(u"%s ativado em %s <a href='%s' target='_blank'><img src='%simg/link.gif' alt='link'></a>" % ( casa['info'].append(u"%s ativado em %s <a href='%s' target='_blank'><img src='%simg/link.gif' alt='link'></a>" % (
sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y') if sv.data_ativacao else sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y') if sv.data_ativacao else
u'<sem data de ativação>', sv.url, STATIC_URL)) u'<sem data de ativação>', sv.url, STATIC_URL))
casa['seit'].append(sv.tipo_servico.sigla) casa['seit'].append(sv.tipo_servico.sigla)
for cv in c.convenio_set.all(): for cv in c.convenio_set.all():
@ -322,8 +328,8 @@ def gera_map_data_file(cronjob=False):
for dg in c.diagnostico_set.all(): for dg in c.diagnostico_set.all():
casa['diagnosticos'].append('P' if dg.publicado else 'A') casa['diagnosticos'].append('P' if dg.publicado else 'A')
casa['info'].append(u'Diagnosticada no período de %s a %s' % (dg.data_visita_inicio.strftime('%d/%m/%Y') if casa['info'].append(u'Diagnosticada no período de %s a %s' % (dg.data_visita_inicio.strftime('%d/%m/%Y') if
dg.data_visita_inicio is not None else u"<sem data de início>", dg.data_visita_inicio is not None else u"<sem data de início>",
dg.data_visita_fim.strftime('%d/%m/%Y') if dg.data_visita_fim else u"<sem data de término>")) dg.data_visita_fim.strftime('%d/%m/%Y') if dg.data_visita_fim else u"<sem data de término>"))
casa['info'] = "<br/>".join(casa['info']) casa['info'] = "<br/>".join(casa['info'])
@ -335,11 +341,11 @@ def gera_map_data_file(cronjob=False):
file = open(JSON_FILE_NAME, 'w') file = open(JSON_FILE_NAME, 'w')
file.write(json_data) file.write(json_data)
file.close() file.close()
except Exception as e: # A gravação não foi bem sucedida ... except Exception as e: # A gravação não foi bem sucedida ...
if cronjob: # ... o chamador deseja a mensagem de erro if cronjob: # ... o chamador deseja a mensagem de erro
return str(e) return str(e)
else: else:
pass # ... ou os dados poderão ser usados de qualquer forma pass # ... ou os dados poderão ser usados de qualquer forma
if cronjob: if cronjob:
return "Arquivo %s gerado em %d segundos" % (JSON_FILE_NAME, time.time() - start) return "Arquivo %s gerado em %d segundos" % (JSON_FILE_NAME, time.time() - start)

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

18
sigi/apps/ocorrencias/models.py

@ -3,23 +3,23 @@ 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")
class Meta: class Meta:
verbose_name, verbose_name_plural = u'Categoria', u'Categorias' verbose_name, verbose_name_plural = u'Categoria', u'Categorias'
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class TipoContato(models.Model): class TipoContato(models.Model):
descricao = models.CharField(u"Descrição", max_length=50) descricao = models.CharField(u"Descrição", max_length=50)
class Meta: class Meta:
verbose_name, verbose_name_plural = u"Tipo de contato", u"Tipos de contato" verbose_name, verbose_name_plural = u"Tipo de contato", u"Tipos de contato"
def __unicode__(self): def __unicode__(self):
return self.descricao return self.descricao
@ -61,7 +61,7 @@ class Ocorrencia(models.Model):
class Meta: class Meta:
verbose_name, verbose_name_plural = u'ocorrência', u'ocorrências' verbose_name, verbose_name_plural = u'ocorrência', u'ocorrências'
ordering = ['prioridade', 'data_modificacao', 'data_criacao', ] ordering = ['prioridade', 'data_modificacao', 'data_criacao', ]
def __unicode__(self): def __unicode__(self):
return u"%(casa_legislativa)s: %(assunto)s" % {'assunto': self.assunto, 'casa_legislativa': self.casa_legislativa} return u"%(casa_legislativa)s: %(assunto)s" % {'assunto': self.assunto, 'casa_legislativa': self.casa_legislativa}
@ -79,11 +79,11 @@ class Anexo(models.Model):
ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência') 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',)
verbose_name, verbose_name_plural = u'Anexo', u'Anexos' verbose_name, verbose_name_plural = u'Anexo', u'Anexos'
def __unicode__(self): def __unicode__(self):
return u"%(arquivo_name)s: %(descricao)s" % {'arquivo_name': self.arquivo.name, 'descricao': self.descricao} return u"%(arquivo_name)s: %(descricao)s" % {'arquivo_name': self.arquivo.name, 'descricao': self.descricao}

29
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')
@ -26,8 +29,8 @@ class PartidoAdmin(admin.ModelAdmin):
class ParlamentarNomeCompletoFilter(AlphabeticFilter): class ParlamentarNomeCompletoFilter(AlphabeticFilter):
title = 'Nome Completo do Parlamentar' title = 'Nome Completo do Parlamentar'
parameter_name = 'nome_completo' parameter_name = 'nome_completo'
class ParlamentarAdmin(admin.ModelAdmin): class ParlamentarAdmin(admin.ModelAdmin):
@ -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'),
}), }),
@ -51,23 +54,23 @@ class ParlamentarAdmin(admin.ModelAdmin):
# raw_id_fields = ('municipio',) # raw_id_fields = ('municipio',)
search_fields = ('nome_completo', 'nome_parlamentar', 'email', search_fields = ('nome_completo', 'nome_parlamentar', 'email',
'pagina_web',) 'pagina_web',)
def adiciona_parlamentar(self, request, queryset): def adiciona_parlamentar(self, request, queryset):
if request.session.has_key('carrinho_parlametar'): if request.session.has_key('carrinho_parlametar'):
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"
class MandatoAdmin(admin.ModelAdmin): class MandatoAdmin(admin.ModelAdmin):
list_display = ('parlamentar', 'legislatura', 'partido', list_display = ('parlamentar', 'legislatura', 'partido',

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)

543
sigi/apps/parlamentares/reports.py

@ -3,43 +3,46 @@ 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:
tamanho += 0.17 tamanho += 0.17
else: else:
if c in maiuEspeciais: if c in maiuEspeciais:
tamanho += maiuEspeciais[c] tamanho += maiuEspeciais[c]
else: else:
tamanho += 0.2 tamanho += 0.2
return tamanho return tamanho
class ParlamentaresLabels(Report): class ParlamentaresLabels(Report):
""" """
Usage example:: Usage example::
@ -54,26 +57,26 @@ 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):
super(ParlamentaresLabels, self).__init__(queryset=queryset) super(ParlamentaresLabels, self).__init__(queryset=queryset)
self.formato = formato self.formato = formato
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,457 +86,461 @@ 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:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.logradouro return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.logradouro
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
except: except:
return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>" return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>"
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,
), ),
] ]
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},
) )
) )
] ]
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
default_style = {'fontName': 'Helvetica', 'fontSize': 14}
display_inline = True
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 '-'
), ),
], ],
#borders = {'all':True}, #borders = {'all':True},
), ),
) )
] ]

77
sigi/apps/parlamentares/views.py

@ -18,9 +18,9 @@ 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'):
request.session['carrinho_parlamentar'] = ids_selecionados request.session['carrinho_parlamentar'] = ids_selecionados
else: else:
@ -28,17 +28,17 @@ def adicionar_parlamentar_carrinho(request,queryset=None,id=None):
# Verifica se id já não está adicionado # Verifica se id já não está adicionado
for id in ids_selecionados: for id in ids_selecionados:
if not id in lista: if not id in lista:
lista.append(id) lista.append(id)
request.session['carrinho_parlamentar'] = lista request.session['carrinho_parlamentar'] = lista
@csrf_protect @csrf_protect
def visualizar_carrinho(request): def visualizar_carrinho(request):
qs = carrinhoOrGet_for_qs(request) qs = carrinhoOrGet_for_qs(request)
paginator = Paginator(qs, 100) paginator = Paginator(qs, 100)
# Make sure page request is an int. If not, deliver first page. # Make sure page request is an int. If not, deliver first page.
# Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página. # Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página.
try: try:
@ -51,52 +51,52 @@ def visualizar_carrinho(request):
paginas = paginator.page(page) paginas = paginator.page(page)
except (EmptyPage, InvalidPage): except (EmptyPage, InvalidPage):
paginas = paginator.page(paginator.num_pages) paginas = paginator.page(paginator.num_pages)
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))
def carrinhoOrGet_for_qs(request): def carrinhoOrGet_for_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.
""" """
if request.session.has_key('carrinho_parlamentar'): if request.session.has_key('carrinho_parlamentar'):
ids = request.session['carrinho_parlamentar'] ids = request.session['carrinho_parlamentar']
qs = Parlamentar.objects.filter(pk__in=ids) qs = Parlamentar.objects.filter(pk__in=ids)
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)
@ -108,35 +108,34 @@ def deleta_itens_carrinho(request):
Deleta itens selecionados do carrinho Deleta itens selecionados do carrinho
""" """
if request.method == 'POST': if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action') ids_selecionados = request.POST.getlist('_selected_action')
if request.session.has_key('carrinho_parlamentar'): if request.session.has_key('carrinho_parlamentar'):
lista = request.session['carrinho_parlamentar'] lista = request.session['carrinho_parlamentar']
for item in ids_selecionados: for item in ids_selecionados:
lista.remove(item) lista.remove(item)
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('.')
def labels_report(request, id=None, formato='3x9_etiqueta'): def labels_report(request, id=None, formato='3x9_etiqueta'):
""" TODO: adicionar suporte para resultado de pesquisa do admin. """ TODO: adicionar suporte para resultado de pesquisa do admin.
""" """
if request.POST: if request.POST:
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)
else: else:
qs = carrinhoOrGet_for_qs(request) qs = carrinhoOrGet_for_qs(request)
if not qs: if not qs:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
@ -145,4 +144,4 @@ def labels_report(request, id=None, formato='3x9_etiqueta'):
report = ParlamentaresLabels(queryset=qs, formato=formato) report = ParlamentaresLabels(queryset=qs, formato=formato)
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response

66
sigi/apps/relatorios/reports.py

@ -2,8 +2,8 @@
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
from reportlab.lib.pagesizes import A4 from reportlab.lib.pagesizes import A4
@ -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)}

55
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,21 +51,21 @@ 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')
list_filter = ('tipo_servico', 'hospedagem_interlegis', 'data_ultimo_uso', 'casa_legislativa__municipio__uf', ) list_filter = ('tipo_servico', 'hospedagem_interlegis', 'data_ultimo_uso', 'casa_legislativa__municipio__uf', )
list_display_links = [] list_display_links = []
@ -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)
@ -168,7 +168,7 @@ class ServicoAdmin(admin.ModelAdmin):
class ContatosInline(FuncionariosInline): class ContatosInline(FuncionariosInline):
can_delete = False # Equipe do SEIT não pode excluir pessoas de contato can_delete = False # Equipe do SEIT não pode excluir pessoas de contato
class CasaAtendidaAdmin(admin.ModelAdmin): class CasaAtendidaAdmin(admin.ModelAdmin):
@ -176,15 +176,14 @@ class CasaAtendidaAdmin(admin.ModelAdmin):
list_display = ('codigo_interlegis', 'nome', 'get_servicos',) list_display = ('codigo_interlegis', 'nome', 'get_servicos',)
ordering = ['nome'] ordering = ['nome']
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')
@ -192,7 +191,7 @@ class CasaAtendidaAdmin(admin.ModelAdmin):
result = [] result = []
for servico in obj.servico_set.all(): for servico in obj.servico_set.all():
result.append(u"%s (%s). Contato: %s" % (servico.tipo_servico.nome, 'ativo' if servico.data_desativacao is None result.append(u"%s (%s). Contato: %s" % (servico.tipo_servico.nome, 'ativo' if servico.data_desativacao is None
else 'Desativado', servico.contato_administrativo.nome)) else 'Desativado', servico.contato_administrativo.nome))
return "<ul><li>" + "</li><li>".join(result) + "</li></ul>" return "<ul><li>" + "</li><li>".join(result) + "</li></ul>"
get_servicos.allow_tags = True get_servicos.allow_tags = True
@ -213,10 +212,10 @@ class CasaAtendidaAdmin(admin.ModelAdmin):
return super(CasaAtendidaAdmin, self).change_view(request, object_id, extra_context=extra_context) return super(CasaAtendidaAdmin, self).change_view(request, object_id, extra_context=extra_context)
def has_add_permission(self, request): def has_add_permission(self, request):
return False # Nunca é permitido inserir uma nova Casa Legislativa por aqui return False # Nunca é permitido inserir uma nova Casa Legislativa por aqui
def has_delete_permission(self, request, obj=None): def has_delete_permission(self, request, obj=None):
return False # Nunca deletar casas por aqui return False # Nunca deletar casas por aqui
admin.site.register(Servico, ServicoAdmin) admin.site.register(Servico, ServicoAdmin)
admin.site.register(TipoServico, TipoServicoAdmin) admin.site.register(TipoServico, TipoServicoAdmin)

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

@ -24,12 +24,14 @@
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="")
for obj in queryset: for obj in queryset:
obj.atualiza_data_uso() obj.atualiza_data_uso()
if ((verbosity == 1) and (obj.data_ultimo_uso is None)) or (verbosity > 1): if ((verbosity == 1) and (obj.data_ultimo_uso is None)) or (verbosity > 1):
self.stdout.write(u"%s \t %s \t %s\n" % (obj.url, obj.data_ultimo_uso, obj.erro_atualizacao)) self.stdout.write(u"%s \t %s \t %s\n" % (obj.url, obj.data_ultimo_uso, obj.erro_atualizacao))

37
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/>
@ -12,10 +13,10 @@ class TipoServico(models.Model):
nome = models.CharField(u'Nome', max_length=60) nome = models.CharField(u'Nome', max_length=60)
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')
@ -37,7 +39,7 @@ class Servico(models.Model):
url = models.URLField(u'URL do serviço', blank=True) url = models.URLField(u'URL do serviço', blank=True)
hospedagem_interlegis = models.BooleanField(u'Hospedagem no Interlegis?') hospedagem_interlegis = models.BooleanField(u'Hospedagem no Interlegis?')
nome_servidor = models.CharField(u'Hospedado em', max_length=60, blank=True, nome_servidor = models.CharField(u'Hospedado em', max_length=60, blank=True,
help_text=u'Se hospedado no Interlegis, informe o nome do servidor.<br/>Senão, informe o nome do provedor de serviços.') help_text=u'Se hospedado no Interlegis, informe o nome do servidor.<br/>Senão, informe o nome do provedor de serviços.')
porta_servico = models.PositiveSmallIntegerField(u'Porta de serviço (instância)', blank=True, null=True) porta_servico = models.PositiveSmallIntegerField(u'Porta de serviço (instância)', blank=True, null=True)
senha_inicial = models.CharField(u'Senha inicial', max_length=33, blank=True) senha_inicial = models.CharField(u'Senha inicial', max_length=33, blank=True)
data_ativacao = models.DateField(u'Data de ativação', default=date.today) data_ativacao = models.DateField(u'Data de ativação', default=date.today)
@ -45,9 +47,9 @@ class Servico(models.Model):
data_desativacao = models.DateField(u'Data de desativação', blank=True, null=True) data_desativacao = models.DateField(u'Data de desativação', blank=True, null=True)
motivo_desativacao = models.TextField(u'Motivo da desativação', blank=True) motivo_desativacao = models.TextField(u'Motivo da desativação', blank=True)
data_ultimo_uso = models.DateField(u'Data da última utilização', blank=True, null=True, data_ultimo_uso = models.DateField(u'Data da última utilização', blank=True, null=True,
help_text=u'Data em que o serviço foi utilizado pela Casa Legislativa pela última vez<br/><strong>NÃO É ATUALIZADO AUTOMATICAMENTE!</strong>') help_text=u'Data em que o serviço foi utilizado pela Casa Legislativa pela última vez<br/><strong>NÃO É ATUALIZADO AUTOMATICAMENTE!</strong>')
erro_atualizacao = models.CharField(u"Erro na atualização", blank=True, max_length=200, erro_atualizacao = models.CharField(u"Erro na atualização", blank=True, max_length=200,
help_text=u"Erro ocorrido na última tentativa de atualizar a data de último acesso") help_text=u"Erro ocorrido na última tentativa de atualizar a data de último acesso")
# casa_legislativa.casa_uf_filter = True # casa_legislativa.casa_uf_filter = True
@ -77,10 +79,10 @@ class Servico(models.Model):
import urllib2 import urllib2
from xml.dom.minidom import parseString from xml.dom.minidom import parseString
try: # Captura erros de conexão try: # Captura erros de conexão
try: # Tentar conxão sem proxy try: # Tentar conxão sem proxy
req = urllib2.urlopen(url=url, timeout=5) req = urllib2.urlopen(url=url, timeout=5)
except: # Tentar com proxy except: # Tentar com proxy
proxy = urllib2.ProxyHandler() proxy = urllib2.ProxyHandler()
opener = urllib2.build_opener(proxy) opener = urllib2.build_opener(proxy)
req = opener.open(fullurl=url, timeout=5) req = opener.open(fullurl=url, timeout=5)
@ -102,7 +104,7 @@ class Servico(models.Model):
date_list = first_item.getElementsByTagName('dc:date') date_list = first_item.getElementsByTagName('dc:date')
date_item = date_list[0] date_item = date_list[0]
date_text = date_item.firstChild.nodeValue date_text = date_item.firstChild.nodeValue
self.data_ultimo_uso = date_text[:10] # Apenas YYYY-MM-DD self.data_ultimo_uso = date_text[:10] # Apenas YYYY-MM-DD
self.erro_atualizacao = "" self.erro_atualizacao = ""
self.save() self.save()
except Exception as e: except Exception as e:
@ -138,7 +140,7 @@ class Servico(models.Model):
else: else:
# Salvar o Servico # Salvar o Servico
super(Servico, self).save(*args, **kwargs) super(Servico, self).save(*args, **kwargs)
return # sem enviar email return # sem enviar email
# Prepara e envia o email # Prepara e envia o email
body = body.replace('{url}', self.url) \ body = body.replace('{url}', self.url) \
@ -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,18 +169,23 @@ 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)
@ -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)

10
sigi/apps/servicos/views.py

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import forms from django import forms
from django.http import HttpResponse from django.http import HttpResponse
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from django.shortcuts import render_to_response, get_object_or_404 from django.shortcuts import render_to_response, get_object_or_404
from django.db.models import Q from django.db.models import Q
from sigi.apps.servicos.models import TipoServico, CasaAtendida, CasaManifesta, ServicoManifesto from sigi.apps.servicos.models import TipoServico, CasaAtendida, CasaManifesta, ServicoManifesto
@ -44,11 +44,12 @@ def municipios_atendidos(self, servico):
municipio = {'nome': casa.nome + ', ' + m.uf.sigla, 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)
@ -108,7 +110,7 @@ def casa_manifesta_view(request):
sm.hospedagem_interlegis = cmf.cleaned_data['hospedagem_interlegis_%s' % ts.pk] sm.hospedagem_interlegis = cmf.cleaned_data['hospedagem_interlegis_%s' % ts.pk]
sm.save() sm.save()
thanks.append((ts.nome, u'Possui o serviço acessível em %s %s' % (sm.url, u'hospedado no Interlegis' if thanks.append((ts.nome, u'Possui o serviço acessível em %s %s' % (sm.url, u'hospedado no Interlegis' if
sm.hospedagem_interlegis else ''))) sm.hospedagem_interlegis else '')))
else: else:
ServicoManifesto.objects.filter(casa_manifesta=cm, servico=ts).delete() ServicoManifesto.objects.filter(casa_manifesta=cm, servico=ts).delete()
thanks.append((ts.nome, u'Não possui')) thanks.append((ts.nome, u'Não possui'))

41
sigi/apps/servidores/admin.py

@ -11,8 +11,8 @@ 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',
'servidor__user__email', 'servidor__user__first_name', 'servidor__user__email', 'servidor__user__first_name',
@ -22,7 +22,7 @@ class FuncaoAdmin(admin.ModelAdmin):
class FeriasAdmin(admin.ModelAdmin): class FeriasAdmin(admin.ModelAdmin):
form = FeriasForm form = FeriasForm
list_display = ('servidor', 'inicio_ferias', 'fim_ferias') list_display = ('servidor', 'inicio_ferias', 'fim_ferias')
list_filter = ('inicio_ferias', 'fim_ferias') list_filter = ('inicio_ferias', 'fim_ferias')
search_fields = ('obs', search_fields = ('obs',
'servidor__nome_completo', 'servidor__email_pessoal', 'servidor__nome_completo', 'servidor__email_pessoal',
'servidor__user__email', 'servidor__user__username') 'servidor__user__email', 'servidor__user__username')
@ -36,14 +36,14 @@ class ServidorFilter(AlphabeticFilter):
class LicencaAdmin(admin.ModelAdmin): class LicencaAdmin(admin.ModelAdmin):
form = LicencaForm form = LicencaForm
list_display = ('servidor', 'inicio_licenca', 'fim_licenca') list_display = ('servidor', 'inicio_licenca', 'fim_licenca')
list_filter = (ServidorFilter, 'inicio_licenca', 'fim_licenca') list_filter = (ServidorFilter, 'inicio_licenca', 'fim_licenca')
search_fields = ('obs', search_fields = ('obs',
'servidor__nome_completo', 'servidor__email_pessoal', 'servidor__nome_completo', 'servidor__email_pessoal',
'servidor__user__email', 'servidor__user__username') 'servidor__user__email', 'servidor__user__username')
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
return super(LicencaAdmin, self).lookup_allowed(lookup, value) or \ return super(LicencaAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['servidor__nome_completo'] lookup in ['servidor__nome_completo']
class EnderecoInline(generic.GenericStackedInline): class EnderecoInline(generic.GenericStackedInline):
@ -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'
@ -65,25 +66,25 @@ class ServidorAdmin(admin.ModelAdmin):
is_active.short_description = 'ativo' is_active.short_description = 'ativo'
list_display = ('nome_completo', 'is_active', 'foto', 'servico', ) list_display = ('nome_completo', 'is_active', 'foto', 'servico', )
list_filter = ('user__is_active', 'sexo', 'servico',) list_filter = ('user__is_active', 'sexo', 'servico',)
search_fields = ('nome_completo', 'obs', 'apontamentos', search_fields = ('nome_completo', 'obs', 'apontamentos',
'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',),
}), }),
('Cadastro', { ('Cadastro', {
'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal', 'data_nomeacao', 'ato_numero', 'ato_exoneracao') 'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal', 'data_nomeacao', 'ato_numero', 'ato_exoneracao')
}), }),
('Lotação', { ('Lotação', {
'fields': ('servico', 'turno', 'de_fora'), 'fields': ('servico', 'turno', 'de_fora'),
}), }),
(u'Observações', { (u'Observações', {
'fields': ('apontamentos', 'obs'), 'fields': ('apontamentos', 'obs'),
}), }),
) )
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
@ -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)

7
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__'
@ -55,8 +58,8 @@ class FuncaoForm(forms.ModelForm):
funcao_anterior = servidor.funcao_set.all()[0] funcao_anterior = servidor.funcao_set.all()[0]
if valida_periodo_data(funcao_anterior.inicio_funcao, if valida_periodo_data(funcao_anterior.inicio_funcao,
funcao_anterior.fim_funcao, data.get('inicio_funcao'), funcao_anterior.fim_funcao, data.get('inicio_funcao'),
data.get('fim_funcao')): data.get('fim_funcao')):
raise forms.ValidationError(u"""Você não pode exercer raise forms.ValidationError(u"""Você não pode exercer
uma função no mesmo período que a anterior, como também, uma função no mesmo período que a anterior, como também,
não pode ser entre o período da mesma.""") não pode ser entre o período da mesma.""")

143
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'
@ -40,12 +42,12 @@ class Command(BaseCommand):
user = None user = None
if not p['email']: if not p['email']:
username = '' username = ''
email = '' email = ''
elif not ('@interlegis' in p['email']): elif not ('@interlegis' in p['email']):
username = p['email'].split('@')[0].strip().lower() username = p['email'].split('@')[0].strip().lower()
email = '' email = ''
else: else:
username = p['email'].split('@')[0].strip().lower() username = p['email'].split('@')[0].strip().lower()
email = username + '@interlegis.gov.br' email = username + '@interlegis.gov.br'
@ -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:
except User.DoesNotExist: user = User.objects.get(username=username)
try: user = User.objects.get(username=username + "__") except User.DoesNotExist:
except User.DoesNotExist: pass try:
user = User.objects.get(username=username + "__")
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,9 +153,9 @@ 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']:
servico_nome = p['servico_nome'].split(' - ')[1] servico_nome = p['servico_nome'].split(' - ')[1]
@ -155,48 +163,48 @@ 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
servico.save() servico.save()
servidor.servico = servico servidor.servico = servico
if p['telefone']: if p['telefone']:
try: try:
t = servidor.telefones.get(numero=p['telefone']) t = servidor.telefones.get(numero=p['telefone'])
except: except:
t = servidor.telefones.create(numero=p['telefone']) t = servidor.telefones.create(numero=p['telefone'])
t.tipo = 'F' t.tipo = 'F'
t.save() t.save()
if p['celular']: if p['celular']:
try: try:
t = servidor.telefones.get(numero=p['celular']) t = servidor.telefones.get(numero=p['celular'])
except: except:
t = servidor.telefones.create(numero=p['celular']) t = servidor.telefones.create(numero=p['celular'])
t.tipo = 'M' t.tipo = 'M'
t.save() t.save()
if p['endereco']: if p['endereco']:
try: try:
e = servidor.endereco.get(logradouro=p['endereco']) e = servidor.endereco.get(logradouro=p['endereco'])
except: except:
e = servidor.endereco.create(logradouro=p['endereco']) e = servidor.endereco.create(logradouro=p['endereco'])
e.municipio = BRASILIA e.municipio = BRASILIA
e.bairro = p['cidade'] # bizarro mas é isso mesmo e.bairro = p['cidade'] # bizarro mas é isso mesmo
e.cep = re.sub("\D", "", p['cep']) e.cep = re.sub("\D", "", p['cep'])
e.save() e.save()
servidor.apontamentos = p['apontamentos'] servidor.apontamentos = p['apontamentos']
servidor.obs = p['obs'] servidor.obs = p['obs']
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']:
funcao.data_bap_entrada = self.to_date(p['data_bap_entrada']) funcao.data_bap_entrada = self.to_date(p['data_bap_entrada'])
@ -214,23 +222,22 @@ class Command(BaseCommand):
funcao.bap_saida = p['bap_saida'] funcao.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()

64
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]
try: except:
nome_completo = ''
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
@ -94,7 +110,7 @@ class Command(BaseCommand):
if not user.last_name == last_name.decode('utf8'): if not user.last_name == last_name.decode('utf8'):
user.last_name = last_name user.last_name = last_name
print "User '%s' last name updated." % username print "User '%s' last name updated." % username
servidor.user = user servidor.user = user
servidor.save() servidor.save()
user.save() user.save()
print "Users are synchronized." print "Users are synchronized."

62
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)
@ -108,22 +113,22 @@ class Servidor(models.Model):
verbose_name_plural = 'servidores' verbose_name_plural = 'servidores'
def is_chefe(self): def is_chefe(self):
""" Verifica se o servidor é chefe ou diretor """ Verifica se o servidor é chefe ou diretor
""" """
pass pass
def data_entrada(self): def data_entrada(self):
""" Verifica a data de entrada da função mais antiga """ Verifica a data de entrada da função mais antiga
""" """
pass pass
def data_saida(self): def data_saida(self):
""" Verifica a data de saída da função mais recente """ Verifica a data de saída da função mais recente
de um servidor desativado de um servidor desativado
Caso o usuário esteja ativo retorna None Caso o usuário esteja ativo retorna None
""" """
pass pass
@property @property
def diagnosticos(self): def diagnosticos(self):
@ -147,16 +152,20 @@ User.servidor = property(lambda user: Servidor.objects.get(user=user))
# Sinal para ao criar um usuário criar um servidor # 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)
@ -194,14 +204,16 @@ class Licenca(models.Model):
verbose_name_plural = u'licenças' verbose_name_plural = u'licenças'
def days(): def days():
""" Calcula a quantidade de dias da licença """ Calcula a quantidade de dias da licença
""" """
pass pass
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)
@ -214,9 +226,9 @@ class Ferias(models.Model):
verbose_name_plural = u'férias' verbose_name_plural = u'férias'
def days(): def days():
""" Calcula a quantidade de dias das férias """ Calcula a quantidade de dias das férias
""" """
pass pass
def __unicode__(self): def __unicode__(self):
return str(self.id) return str(self.id)

19
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))

11
sigi/apps/utils/alphabetic_filter.py

@ -2,8 +2,9 @@
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.
title = '' title = ''
@ -11,7 +12,7 @@ class AlphabeticFilter(admin.SimpleListFilter):
parameter_name = '' parameter_name = ''
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
""" """
Returns a list of tuples. The first element in each Returns a list of tuples. The first element in each
tuple is the coded value for the option that will tuple is the coded value for the option that will
appear in the URL query. The second element is the appear in the URL query. The second element is the
@ -21,10 +22,10 @@ class AlphabeticFilter(admin.SimpleListFilter):
return ((letter, letter,) for letter in string.ascii_uppercase) return ((letter, letter,) for letter in string.ascii_uppercase)
def queryset(self, request, queryset): def queryset(self, request, queryset):
""" """
Returns the filtered queryset based on the value Returns the filtered queryset based on the value
provided in the query string and retrievable via provided in the query string and retrievable via
`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/apps/utils/decorators.py

@ -37,10 +37,10 @@ def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIE
# If the login url is the same scheme and net location then just # If the login url is the same scheme and net location then just
# use the path as the "next" url. # use the path as the "next" url.
login_scheme, login_netloc = urlparse.urlparse(login_url or login_scheme, login_netloc = urlparse.urlparse(login_url or
settings.LOGIN_URL)[:2] settings.LOGIN_URL)[:2]
current_scheme, current_netloc = urlparse.urlparse(path)[:2] current_scheme, current_netloc = urlparse.urlparse(path)[:2]
if ((not login_scheme or login_scheme == current_scheme) and if ((not login_scheme or login_scheme == current_scheme) and
(not login_netloc or login_netloc == current_netloc)): (not login_netloc or login_netloc == current_netloc)):
path = request.get_full_path() path = request.get_full_path()
from django.contrib.auth.views import redirect_to_login from django.contrib.auth.views import redirect_to_login
return redirect_to_login(path, login_url, redirect_field_name) return redirect_to_login(path, login_url, redirect_field_name)

2
sigi/apps/utils/email.py

@ -29,5 +29,5 @@ def enviar_email(from_email, subject, template, tags):
# Enviando a mensagem # Enviando a mensagem
email = EmailMessage(settings.EMAIL_SUBJECT_PREFIX + " " + subject, mensagem, email = EmailMessage(settings.EMAIL_SUBJECT_PREFIX + " " + subject, mensagem,
from_email, [from_email]) from_email, [from_email])
email.send() email.send()

28
sigi/context_processors.py

@ -28,7 +28,7 @@ def charts_data(request):
'tabela_resumo_diagnostico': tabela_resumo_diagnostico, 'tabela_resumo_diagnostico': tabela_resumo_diagnostico,
'dados_graficos_convenio_projeto': dados_graficos_convenio_projeto, 'dados_graficos_convenio_projeto': dados_graficos_convenio_projeto,
'metas': Meta.objects.all(), 'metas': Meta.objects.all(),
} }
def busca_informacoes_camara(): def busca_informacoes_camara():
@ -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 {
@ -112,21 +112,21 @@ def busca_informacoes_camara():
u'lista_zip': lista_zip, u'lista_zip': lista_zip,
u'total_camaras': camaras.count(), u'total_camaras': camaras.count(),
u'camaras_sem_processo': camaras_sem_processo.count(), u'camaras_sem_processo': camaras_sem_processo.count(),
} }
def grafico_convenio_projeto(convenios): def grafico_convenio_projeto(convenios):
colors = cycle(['#7cb5ec', colors = cycle(['#7cb5ec',
'#434348', '#434348',
'#90ed7d', '#90ed7d',
'#f7a35c', '#f7a35c',
'#8085e9', '#8085e9',
'#f15c80', '#f15c80',
'#e4d354', '#e4d354',
'#8085e8', '#8085e8',
'#8d4653', '#8d4653',
'#91e8e1', ]) '#91e8e1', ])
highlights = cycle(['#B0D3F4', highlights = cycle(['#B0D3F4',
'#8E8E91', '#8E8E91',
@ -180,4 +180,4 @@ def busca_informacoes_diagnostico():
return [ return [
{'title': 'Diagnósticos digitados', 'count': Diagnostico.objects.count()}, {'title': 'Diagnósticos digitados', 'count': Diagnostico.objects.count()},
{'title': 'Diagnósticos publicados', 'count': Diagnostico.objects.filter(publicado=True).count()}, {'title': 'Diagnósticos publicados', 'count': Diagnostico.objects.filter(publicado=True).count()},
] ]

4
sigi/shortcuts.py

@ -12,14 +12,14 @@ 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)
html = template.render(context) html = template.render(context)
result = StringIO.StringIO() result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode('utf-8')), result, link_callback=fetch_resources) pdf = pisa.pisaDocument(StringIO.StringIO(html.encode('utf-8')), result, link_callback=fetch_resources)
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