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

87
etc/migracao/migra.py

@ -40,6 +40,7 @@ ERROR_MSG_1 = ('<ERRO> %s[%s]: erro ao inserir item, será necessário inserçã
'manual.')
OBS_CONVENIO = ('Convênio sem termo de adesão')
def migra_assembleias(filename):
# identificação das colunas nos arquivo CSV
UF_COL = 5
@ -61,14 +62,13 @@ def migra_assembleias(filename):
header = reader.next()
tipo_casa = TipoCasaLegislativa.objects.filter(sigla='AL').get()
for line in reader:
uf = UnidadeFederativa.objects.get(sigla=line[UF_COL])
municipio = Municipio.objects.get(uf=uf, is_capital=True)
aux_end = line[ENDERECO_COL].split('-')
bairro = ''
if(aux_end.__len__()>1):
if(aux_end.__len__() > 1):
bairro = aux_end[1].replace(' ', '', 1)
else:
bairro = ''
@ -139,12 +139,11 @@ def migra_casas(filename):
PRESIDENTE_COL = 39
EMAIL_PRESIDENTE_COL = 43
REPRESENTANTE_COL = 85
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True)
header = reader.next()
tipo_casa = TipoCasaLegislativa.objects.filter(sigla='CM').get()
linenum = 1
for line in reader:
linenum += 1
@ -160,14 +159,14 @@ def migra_casas(filename):
aux_end = line[ENDERECO_COL].split('-')
bairro = ''
if(aux_end.__len__()>1):
if(aux_end.__len__() > 1):
bairro = aux_end[1].replace(' ', '', 1)
casa = CasaLegislativa(
municipio=municipio,
nome='Câmara Municipal de ' + line[NOME_COL],
tipo=tipo_casa,
logradouro=aux_end[0],
bairro=bairro,
bairro=bairro,
cep=line[CEP_COL],
email=line[EMAIL_COL],
pagina_web=line[PAGINA_COL],
@ -202,6 +201,7 @@ def migra_casas(filename):
representante = Contato(nome=line[REPRESENTANTE_COL], content_object=casa)
representante.save()
def migra_cnpj(filename):
# identificação das colunas no arquivo CSV
COD_TSE_COL = 0
@ -228,6 +228,7 @@ def migra_cnpj(filename):
casa.cnpj = line[COD_CNPJ1_COL] if not 'EM BRANCO' in line[COD_CNPJ1_COL] else line[COD_CNPJ2_COL]
casa.save()
def migra_convenios_casas(filename):
def get_datetime_obj(data):
ldata = data.split('-')
@ -235,9 +236,6 @@ def migra_convenios_casas(filename):
return None
return datetime(int(ldata[0]), int(ldata[1]), int(ldata[2]))
# identificação das colunas no arquivo CSV
# No arquivo CSV colunas que contém _100 são do Programa Interlegis
COD_IBGE_COL = 1
@ -251,24 +249,23 @@ def migra_convenios_casas(filename):
DATA_PUB_DIARIO = 30
DATA_DEV_VIA_CONV_CM = 32
DATA_ADESAO_100_COL = 11
DATA_TERMO_ACEITE_100_COL = 22
NUM_CONVENIO_100_COL = 24
NUM_PROCESSO_SF_100_COL = 25
DATA_RETORNO_ASSINATURA_100_COL = 29
DATA_PUB_DIARIO_100_COL = 31
#DATA_DEV_VIA_CONV_CM_100 = 32 Não foi registrado para as 100
# DATA_DEV_VIA_CONV_CM_100 = 32 Não foi registrado para as 100
#DATA_POSTAGEM_CORREIO_100 = 26
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True)
header = reader.next()
linenum = 1
###Geração de arquivos para análise###
import codecs
f1 = codecs.open('file1.txt','w' , encoding="utf-8")
import codecs
f1 = codecs.open('file1.txt', 'w', encoding="utf-8")
f1.write(u'Casas que não tem Número Processo Senado Federal\n')
f2 = codecs.open('file2.txt','w', encoding="utf-8")
f2 = codecs.open('file2.txt', 'w', encoding="utf-8")
f2.write(u'Casas que não tem data de adesão e não tem convênio mas recebeu equipamentos\n')
######
for line in reader:
@ -290,13 +287,13 @@ def migra_convenios_casas(filename):
# Se o convênio não tiver data de adesão mas tiver data retorno assinatura copiar essa data para a data de adesão.
obs = ''
projeto = None
convenio1=None
convenio2=None
if line[DATA_ADESAO_COL]=='1001-01-01' and line[DATA_RETORNO_ASSINATURA].__len__()!=0:
convenio1 = None
convenio2 = None
if line[DATA_ADESAO_COL] == '1001-01-01' and line[DATA_RETORNO_ASSINATURA].__len__() != 0:
line[DATA_ADESAO_COL] = line[DATA_RETORNO_ASSINATURA]
obs = OBS_CONVENIO
if line[DATA_ADESAO_COL]!='1001-01-01':
if line[DATA_ADESAO_COL] != '1001-01-01':
projeto = Projeto.objects.get(id=1)
if projeto:
@ -314,41 +311,44 @@ def migra_convenios_casas(filename):
observacao=obs,)
###Relatório###
if( (projeto or line[DATA_TERMO_ACEITE_COL]) and line[NUM_PROCESSO_SF_COL].__len__()==0):
f1.write(casa.nome+","+casa.municipio.uf.sigla+"\n")
if(projeto==None and line[DATA_TERMO_ACEITE_COL].__len__()!=0):
f2.write(casa.nome+","+casa.municipio.uf.sigla+"\n")
######
projeto=None
if((projeto or line[DATA_TERMO_ACEITE_COL]) and line[NUM_PROCESSO_SF_COL].__len__() == 0):
f1.write(casa.nome + "," + casa.municipio.uf.sigla + "\n")
if(projeto == None and line[DATA_TERMO_ACEITE_COL].__len__() != 0):
f2.write(casa.nome + "," + casa.municipio.uf.sigla + "\n")
######
projeto = None
obs = ''
if line[DATA_ADESAO_100_COL]=='1001-01-01' and line[DATA_RETORNO_ASSINATURA_100_COL].__len__()!=0:
if line[DATA_ADESAO_100_COL] == '1001-01-01' and line[DATA_RETORNO_ASSINATURA_100_COL].__len__() != 0:
line[DATA_ADESAO_100_COL] = line[DATA_RETORNO_ASSINATURA_100_COL]
obs = OBS_CONVENIO
if line[DATA_ADESAO_100_COL]!='1001-01-01':
if line[DATA_ADESAO_100_COL] != '1001-01-01':
projeto = Projeto.objects.get(id=2)
if projeto:
convenio2 = Convenio(
casa_legislativa=casa,
projeto=projeto,
num_processo_sf=line[NUM_PROCESSO_SF_100_COL],
num_convenio=line[NUM_CONVENIO_100_COL],
data_adesao=get_datetime_obj(line[DATA_ADESAO_100_COL]),
data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_100_COL]),
data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA_100_COL]),
data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO_100_COL]),
observacao=obs,
casa_legislativa=casa,
projeto=projeto,
num_processo_sf=line[NUM_PROCESSO_SF_100_COL],
num_convenio=line[NUM_CONVENIO_100_COL],
data_adesao=get_datetime_obj(line[DATA_ADESAO_100_COL]),
data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_100_COL]),
data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA_100_COL]),
data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO_100_COL]),
observacao=obs,
)
try:
if convenio1: convenio1.save()
if convenio2: convenio2.save()
if convenio1:
convenio1.save()
if convenio2:
convenio2.save()
except:
print "Erro ao inserir convênio"
print ERROR_MSG_0 % (filename, linenum)
continue
f1.close()
f2.close()
f2.close()
def migra_convenios_assembleias(filename):
def get_datetime_obj(data):
@ -365,7 +365,7 @@ def migra_convenios_assembleias(filename):
NUM_PROCESSO_SF_COL = 26
DATA_RETORNO_ASSINATURA = 27
DATA_PUB_DIARIO = 29
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True)
header = reader.next()
linenum = 1
@ -394,7 +394,7 @@ def migra_convenios_assembleias(filename):
data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_COL]),
data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA]),
data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO]),
)
)
try:
convenio.save()
except:
@ -402,6 +402,7 @@ def migra_convenios_assembleias(filename):
print convenio
continue
def popula():
"""
Será preciso cadastrar no banco os seguintes Projeto:
@ -423,8 +424,6 @@ def popula():
tipo2.save()
tipo3 = TipoCasaLegislativa(sigla='CT', nome='Câmara Distrital')
tipo3.save()
if __name__ == '__main__':

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.models import CasaLegislativa, Presidente, Funcionario, TipoCasaLegislativa
from sigi.apps.casas.views import report_complete, labels_report, export_csv, \
labels_report_sem_presidente, report, \
adicionar_casas_carrinho
labels_report_sem_presidente, report, \
adicionar_casas_carrinho
from sigi.apps.utils import queryset_ascii
from sigi.apps.contatos.models import Telefone
from sigi.apps.convenios.models import Convenio
@ -28,7 +28,7 @@ class TelefonesInline(generic.GenericTabularInline):
class PresidenteInline(admin.StackedInline):
model = Presidente
exclude = ['cargo','funcao']
exclude = ['cargo', 'funcao']
readonly_fields = ('ult_alteracao',)
extra = 1
max_num = 1
@ -38,11 +38,12 @@ class PresidenteInline(admin.StackedInline):
class FuncionariosInline(admin.StackedInline):
model = Funcionario
fieldsets = ((None, {
'fields': (('nome', 'sexo', 'nota', 'email'), ('cargo', 'funcao', 'setor', 'tempo_de_servico'), 'ult_alteracao')
}),)
'fields': (('nome', 'sexo', 'nota', 'email'), ('cargo', 'funcao', 'setor', 'tempo_de_servico'), 'ult_alteracao')
}),)
readonly_fields = ('ult_alteracao',)
extra = 1
inlines = (TelefonesInline,)
def get_queryset(self, request):
return self.model.objects.exclude(cargo="Presidente")
@ -50,15 +51,16 @@ class FuncionariosInline(admin.StackedInline):
class ConveniosInline(admin.StackedInline):
model = Convenio
fieldsets = (
(None, {'fields': (('link_convenio', 'num_processo_sf','num_convenio','projeto','observacao'),
(None, {'fields': (('link_convenio', 'num_processo_sf', 'num_convenio', 'projeto', 'observacao'),
('data_adesao', 'data_retorno_assinatura', 'data_termo_aceite', 'data_pub_diario', 'data_devolucao_via', 'data_postagem_correio'),
('data_devolucao_sem_assinatura','data_retorno_sem_assinatura',),
('data_devolucao_sem_assinatura', 'data_retorno_sem_assinatura',),
('get_tramitacoes', 'get_anexos', 'get_equipamentos',),
)}
),
),
)
readonly_fields = ['get_tramitacoes', 'get_anexos', 'get_equipamentos', 'link_convenio',]
readonly_fields = ['get_tramitacoes', 'get_anexos', 'get_equipamentos', 'link_convenio', ]
extra = 0
def get_tramitacoes(self, obj):
return '<br/>'.join([t.__unicode__() for t in obj.tramitacao_set.all()])
get_tramitacoes.short_description = 'Tramitações'
@ -78,7 +80,7 @@ class ConveniosInline(admin.StackedInline):
if obj.pk is None:
return ""
from django.core.urlresolvers import reverse
url = reverse('admin:%s_%s_change' %(obj._meta.app_label, obj._meta.module_name), args=[obj.pk] )
url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk])
url = url + '?_popup=1'
return """<input id="edit_convenio-%s" type="hidden"/>
<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):
model = Legislatura
fields = ['numero', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares', 'link_parlamentares',]
readonly_fields = ['link_parlamentares',]
fields = ['numero', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares', 'link_parlamentares', ]
readonly_fields = ['link_parlamentares', ]
def link_parlamentares(self, obj):
if obj.pk is None:
return ""
from django.core.urlresolvers import reverse
url = reverse('admin:%s_%s_change' %(obj._meta.app_label, obj._meta.module_name), args=[obj.pk] )
url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk])
url = url + '?_popup=1'
return """<input id="edit_legislatura-%s" type="hidden"/>
<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):
model = Diagnostico
fields = ['data_visita_inicio', 'data_visita_fim', 'publicado', 'data_publicacao', 'responsavel', 'link_diagnostico',]
readonly_fields = ['data_visita_inicio', 'data_visita_fim', 'publicado', 'data_publicacao', 'responsavel', 'link_diagnostico',]
fields = ['data_visita_inicio', 'data_visita_fim', 'publicado', 'data_publicacao', 'responsavel', 'link_diagnostico', ]
readonly_fields = ['data_visita_inicio', 'data_visita_fim', 'publicado', 'data_publicacao', 'responsavel', 'link_diagnostico', ]
extra = 0
max_num = 0
can_delete = False
@ -121,7 +123,7 @@ class DiagnosticoInline(admin.TabularInline):
if obj.pk is None:
return ""
from django.core.urlresolvers import reverse
url = reverse('admin:%s_%s_change' %(obj._meta.app_label, obj._meta.module_name), args=["%s.pdf" % obj.pk] )
url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=["%s.pdf" % obj.pk])
return """<input id="edit_diagnostico-%s" type="hidden"/>
<a id="lookup_edit_diagnostico-%s" href="%s" class="button" target="_blank">
Abrir PDF
@ -161,13 +163,13 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
form = CasaLegislativaForm
change_form_template = 'casas/change_form.html'
change_list_template = 'casas/change_list.html'
actions = ['adicionar_casas',]
actions = ['adicionar_casas', ]
inlines = (TelefonesInline, PresidenteInline, FuncionariosInline, ConveniosInline, LegislaturaInline,
DiagnosticoInline, BemInline, ServicoInline, PlanoDiretorInline, OcorrenciaInline, )
list_display = ('nome','municipio','logradouro', 'ult_alt_endereco', 'get_convenios')
list_display = ('nome', 'municipio', 'logradouro', 'ult_alt_endereco', 'get_convenios')
list_display_links = ('nome',)
list_filter = ('tipo', 'municipio__uf__nome', 'convenio__projeto')
ordering = ('nome','municipio__uf')
ordering = ('nome', 'municipio__uf')
queyrset = queryset_ascii
fieldsets = (
(None, {
@ -175,7 +177,7 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
}),
('Endereço', {
'fields': ('data_instalacao', 'logradouro', 'bairro',
'municipio', 'cep', 'pagina_web','email', 'ult_alt_endereco'),
'municipio', 'cep', 'pagina_web', 'email', 'ult_alt_endereco'),
}),
('Outras informações', {
'classes': ('collapse',),
@ -183,15 +185,15 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
}),
)
raw_id_fields = ('municipio',)
readonly_fields = ['num_parlamentares',]
search_fields = ('search_text','cnpj', 'bairro', 'logradouro',
readonly_fields = ['num_parlamentares', ]
search_fields = ('search_text', 'cnpj', 'bairro', 'logradouro',
'cep', 'municipio__nome', 'municipio__uf__nome',
'municipio__codigo_ibge', 'pagina_web', 'observacoes')
def get_convenios(self, obj):
return '<ul>' + ''.join(['<li>%s</li>' % c.__unicode__() for c in obj.convenio_set.all()]) + '</ul>'
get_convenios.short_description = u'Convênios'
get_convenios.allow_tags= True
get_convenios.allow_tags = True
def changelist_view(self, request, extra_context=None):
return super(CasaLegislativaAdmin, self).changelist_view(
@ -203,45 +205,43 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
return super(CasaLegislativaAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['municipio__uf__codigo_ibge__exact', 'convenio__projeto__id__exact']
def etiqueta(self,request,queryset):
return labels_report(request,queryset=queryset)
def etiqueta(self, request, queryset):
return labels_report(request, queryset=queryset)
etiqueta.short_description = "Gerar etiqueta(s) da(s) casa(s) selecionada(s)"
def etiqueta_sem_presidente(self,request,queryset):
return labels_report_sem_presidente(request,queryset=queryset)
def etiqueta_sem_presidente(self, request, queryset):
return labels_report_sem_presidente(request, queryset=queryset)
etiqueta_sem_presidente.short_description = "Gerar etiqueta(s) sem presidente da(s) casa(s) selecionada(s)"
def relatorio(self,request,queryset):
return report(request,queryset=queryset)
def relatorio(self, request, queryset):
return report(request, queryset=queryset)
relatorio.short_description = u"Exportar a(s) casa(s) selecionada(s) para PDF"
def relatorio_completo(self,request,queryset):
return report_complete(request,queryset=queryset)
def relatorio_completo(self, request, queryset):
return report_complete(request, queryset=queryset)
relatorio_completo.short_description = u"Gerar relatório completo da(s) casa(s) selecionada(s)"
def relatorio_csv(self,request,queryset):
def relatorio_csv(self, request, queryset):
return export_csv(request)
relatorio_csv.short_description = u"Exportar casa(s) selecionada(s) para CSV"
def adicionar_casas(self, request, queryset):
if 'carrinho_casas' in request.session:
#if request.session.has_key('carrinho_casas'):
# if request.session.has_key('carrinho_casas'):
q1 = len(request.session['carrinho_casas'])
else:
q1 = 0
response = adicionar_casas_carrinho(request,queryset=queryset)
response = adicionar_casas_carrinho(request, queryset=queryset)
q2 = len(request.session['carrinho_casas'])
quant = q2 - q1
if quant:
self.message_user(request,str(q2-q1)+" Casas Legislativas adicionadas no carrinho" )
self.message_user(request, str(q2 - q1) + " Casas Legislativas adicionadas no carrinho")
else:
self.message_user(request,"As Casas Legislativas selecionadas já foram adicionadas anteriormente" )
self.message_user(request, "As Casas Legislativas selecionadas já foram adicionadas anteriormente")
return HttpResponseRedirect('.')
adicionar_casas.short_description = u"Armazenar casas no carrinho para exportar"
def get_actions(self, request):
actions = super(CasaLegislativaAdmin, self).get_actions(request)
if 'delete_selected' in actions:

2
sigi/apps/casas/forms.py

@ -5,7 +5,7 @@ from sigi.apps.casas.models import CasaLegislativa
class CasaLegislativaForm(forms.ModelForm):
#cnpj = BRCNPJField(
# cnpj = BRCNPJField(
# label='CNPJ',
# required=False,
# help_text='Utilize o formato <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.servidores.models import Servidor
class TipoCasaLegislativa(models.Model):
""" Modelo para representar o tipo da Casa Legislativa
Geralmente: Câmara Municipal, Assembléia Legislativa,
@ -22,11 +24,13 @@ class TipoCasaLegislativa(models.Model):
nome = models.CharField(
max_length=100
)
def __unicode__(self):
return self.nome
class CasaLegislativa(models.Model):
""" Modelo para representar uma Casa Legislativa
"""
nome = models.CharField(
@ -135,7 +139,7 @@ class CasaLegislativa(models.Model):
codigo = self.codigo_interlegis
if codigo == '':
if self.tipo.sigla == 'AL': # Assembléias são tratadas a parte
if self.tipo.sigla == 'AL': # Assembléias são tratadas a parte
codigo = 'A' + self.municipio.uf.sigla
if CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() <= 0:
# Só grava o código se ele for inédito
@ -144,23 +148,23 @@ class CasaLegislativa(models.Model):
return codigo
# Se já existe, então trata a Assembleia como uma Casa qualquer.
cityName = normalize('NFKD', unicode(self.municipio.nome)).encode('ascii','ignore')
cityName = normalize('NFKD', unicode(self.municipio.nome)).encode('ascii', 'ignore')
cityName = cityName.upper().strip()
cityName = cityName.replace(' DA ',' ')
cityName = cityName.replace(' DE ',' ')
cityName = cityName.replace(' DO ',' ')
cityName = cityName.replace(' DA ', ' ')
cityName = cityName.replace(' DE ', ' ')
cityName = cityName.replace(' DO ', ' ')
# estratégia 1 - Pegar as 1ª letra de cada nome da cidade
codigo = ''.join([x[0] for x in cityName.split(' ')[:3]])
codigo = ''.join([x[0] for x in cityName.split(' ')[:3]])
# Se o código ficou com menos que três letras, pegar as 2 primeiras
if len(codigo) < 3:
codigo = ''.join([x[0:2] for x in cityName.split(' ')[:3]])[:3]
codigo = ''.join([x[0:2] for x in cityName.split(' ')[:3]])[:3]
# Se ainda ficou com menos de três letras, então o nome da cidade só
# tem uma palavra. Pegue as três primeiras letras da palavra
if len(codigo) < 3:
codigo = cityName[:3]
codigo = cityName[:3]
# Se o código já existir, substituir a última letra do código pela
# última letra do nome da cidade, e ir recuando, letra a letra,
@ -170,7 +174,7 @@ class CasaLegislativa(models.Model):
ultima = len(cityName)
while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \
count() > 0 and ultima > 0:
count() > 0 and ultima > 0:
codigo = codigo[:2] + cityName[ultima - 1: ultima]
ultima -= 1
@ -179,10 +183,10 @@ class CasaLegislativa(models.Model):
# três primeiras consoantes.
if CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() > 0:
codigo_cons = cityName.replace('A','').replace('E','').\
replace('I','').replace('O','').replace('U','')[:3]
codigo_cons = cityName.replace('A', '').replace('E', '').\
replace('I', '').replace('O', '').replace('U', '')[:3]
if len(codigo_cons) == 3 and \
CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() > 0:
CasaLegislativa.objects.filter(codigo_interlegis=codigo).count() > 0:
codigo = codigo_cons
# Se ainda não gerou um nome único, vamos colocar dígitos no
@ -191,7 +195,7 @@ class CasaLegislativa(models.Model):
i = 'A'
while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \
count() > 0 and i <= 'Z':
count() > 0 and i <= 'Z':
codigo = codigo[:2] + str(i)
i = chr(ord(i) + 1)
@ -202,7 +206,7 @@ class CasaLegislativa(models.Model):
i = 0
while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \
count() > 0 and i < 100:
count() > 0 and i < 100:
codigo = random.choice(cityName) + random.choice(cityName) + \
random.choice(cityName)
i += 1
@ -213,7 +217,7 @@ class CasaLegislativa(models.Model):
i = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
while CasaLegislativa.objects.filter(codigo_interlegis=codigo). \
count() > 0:
count() > 0:
codigo = random.choice(i) + random.choice(i) + \
random.choice(i)
@ -231,9 +235,9 @@ class CasaLegislativa(models.Model):
if self.pk is not None:
original = CasaLegislativa.objects.get(pk=self.pk)
if (self.logradouro != original.logradouro or
self.bairro != original.bairro or
self.municipio != original.municipio or
self.cep != original.cep):
self.bairro != original.bairro or
self.municipio != original.municipio or
self.cep != original.cep):
address_changed = True
else:
address_changed = True
@ -243,27 +247,29 @@ class CasaLegislativa(models.Model):
return super(CasaLegislativa, self).save(*args, **kwargs)
class Funcionario(models.Model):
""" Modelo para registrar contatos vinculados às
Casas Legislativas
"""
SETOR_CHOICES = [
("presidente","Presidente"),
("contato_interlegis","Contato Interlegis"),
("infraestrutura_fisica","Infraestrutura Física"),
("estrutura_de_ti","Estrutura de TI"),
("organizacao_do_processo_legislativo","Organização do Processo Legislativo"),
("producao_legislativa","Produção Legislativa"),
("estrutura_de_comunicacao_social","Estrutura de Comunicação Social"),
("estrutura_de_recursos_humanos","Estrutura de Recursos Humanos"),
("gestao","Gestão"),
("outros","Outros"),
]
("presidente", "Presidente"),
("contato_interlegis", "Contato Interlegis"),
("infraestrutura_fisica", "Infraestrutura Física"),
("estrutura_de_ti", "Estrutura de TI"),
("organizacao_do_processo_legislativo", "Organização do Processo Legislativo"),
("producao_legislativa", "Produção Legislativa"),
("estrutura_de_comunicacao_social", "Estrutura de Comunicação Social"),
("estrutura_de_recursos_humanos", "Estrutura de Recursos Humanos"),
("gestao", "Gestão"),
("outros", "Outros"),
]
SEXO_CHOICES = [
("M", "Masculino"),
("F", "Feminino")
]
]
casa_legislativa = models.ForeignKey(CasaLegislativa)
nome = models.CharField('nome completo', max_length=60, blank=False)
@ -275,7 +281,7 @@ class Funcionario(models.Model):
endereco = generic.GenericRelation('contatos.Endereco')
cargo = models.CharField(max_length=100, null=True, blank=True)
funcao = models.CharField(u'função', max_length=100, null=True, blank=True)
setor = models.CharField(max_length=100, choices = SETOR_CHOICES, default="outros")
setor = models.CharField(max_length=100, choices=SETOR_CHOICES, default="outros")
tempo_de_servico = models.CharField(u'tempo de serviço', max_length=50, null=True, blank=True)
ult_alteracao = models.DateTimeField(u'Última alteração', null=True, blank=True, editable=True, auto_now=False)
@ -287,21 +293,24 @@ class Funcionario(models.Model):
def __unicode__(self):
return self.nome
class PresidenteManager(models.Manager):
def get_queryset(self):
qs = super(PresidenteManager, self).get_queryset()
qs = qs.filter(setor='presidente')
return qs
class Presidente(Funcionario):
class Meta:
proxy = True
objects = PresidenteManager()
objects = PresidenteManager()
def save(self, *args, **kwargs):
self.setor = 'presidente'
self.cargo = 'Presidente'
self.funcao = 'Presidente'
return super(Presidente, self).save(*args, **kwargs)

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

180
sigi/apps/casas/views.py

@ -20,6 +20,8 @@ import csv
# @param qs: queryset
# @param o: (int) number of order field
def query_ordena(qs, o):
from sigi.apps.casas.admin import CasaLegislativaAdmin
list_display = CasaLegislativaAdmin.list_display
@ -36,37 +38,40 @@ def query_ordena(qs, o):
qs = qs.order_by(*order_fields)
return qs
def get_for_qs(get,qs):
def get_for_qs(get, qs):
"""
Verifica atributos do GET e retorna queryset correspondente
"""
kwargs = {}
for k,v in get.iteritems():
for k, v in get.iteritems():
if str(k) not in ('page', 'pop', 'q', '_popup', 'o', 'ot'):
kwargs[str(k)] = v
qs = qs.filter(**kwargs)
if 'o' in get:
qs = query_ordena(qs,get['o'])
qs = query_ordena(qs, get['o'])
return qs
def carrinhoOrGet_for_qs(request):
"""
Verifica se existe casas na sessão se não verifica get e retorna qs correspondente.
"""
"""
if request.session.has_key('carrinho_casas'):
ids = request.session['carrinho_casas']
qs = CasaLegislativa.objects.filter(pk__in=ids)
ids = request.session['carrinho_casas']
qs = CasaLegislativa.objects.filter(pk__in=ids)
else:
qs = CasaLegislativa.objects.all()
qs = CasaLegislativa.objects.all()
if request.GET:
qs = get_for_qs(request.GET,qs)
qs = get_for_qs(request.GET, qs)
return qs
def adicionar_casas_carrinho(request,queryset=None,id=None):
def adicionar_casas_carrinho(request, queryset=None, id=None):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
ids_selecionados = request.POST.getlist('_selected_action')
if not request.session.has_key('carrinho_casas'):
request.session['carrinho_casas'] = ids_selecionados
else:
@ -74,17 +79,16 @@ def adicionar_casas_carrinho(request,queryset=None,id=None):
# Verifica se id já não está adicionado
for id in ids_selecionados:
if not id in lista:
lista.append(id)
request.session['carrinho_casas'] = lista
lista.append(id)
request.session['carrinho_casas'] = lista
def visualizar_carrinho(request):
qs = carrinhoOrGet_for_qs(request)
paginator = Paginator(qs, 100)
# Make sure page request is an int. If not, deliver first page.
# Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página.
try:
@ -97,60 +101,60 @@ def visualizar_carrinho(request):
paginas = paginator.page(page)
except (EmptyPage, InvalidPage):
paginas = paginator.page(paginator.num_pages)
carrinhoIsEmpty = not(request.session.has_key('carrinho_casas'))
return render_to_response(
'casas/carrinho.html',
{
'MEDIA_URL':settings.MEDIA_URL,
'carIsEmpty':carrinhoIsEmpty,
'paginas':paginas,
'query_str':'?'+request.META['QUERY_STRING']
'MEDIA_URL': settings.MEDIA_URL,
'carIsEmpty': carrinhoIsEmpty,
'paginas': paginas,
'query_str': '?' + request.META['QUERY_STRING']
}
)
def excluir_carrinho(request):
if request.session.has_key('carrinho_casas'):
del request.session['carrinho_casas']
return HttpResponseRedirect('.')
def deleta_itens_carrinho(request):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
if request.session.has_key('carrinho_casas'):
lista = request.session['carrinho_casas']
ids_selecionados = request.POST.getlist('_selected_action')
if request.session.has_key('carrinho_casas'):
lista = request.session['carrinho_casas']
for item in ids_selecionados:
lista.remove(item)
if lista:
if lista:
request.session['carrinho_casas'] = lista
else:
del lista;
del request.session['carrinho_casas']
del lista
del request.session['carrinho_casas']
return HttpResponseRedirect('.')
def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'):
""" TODO: adicionar suporte para resultado de pesquisa do admin.
"""
"""
if request.POST:
if request.POST.has_key('tipo_etiqueta'):
tipo = request.POST['tipo_etiqueta']
if request.POST.has_key('tamanho_etiqueta'):
formato = request.POST['tamanho_etiqueta']
if tipo =='sem_presidente':
if tipo == 'sem_presidente':
return labels_report_sem_presidente(request, id, formato)
if id:
qs = CasaLegislativa.objects.filter(pk=id)
else:
qs = CasaLegislativa.objects.filter(pk=id)
else:
qs = carrinhoOrGet_for_qs(request)
if not qs:
return HttpResponseRedirect('../')
@ -161,24 +165,24 @@ def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'):
return response
def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
""" TODO: adicionar suporte para resultado de pesquisa do admin.
"""
"""
if request.POST:
if request.POST.has_key('tamanho_etiqueta'):
formato = request.POST['tamanho_etiqueta']
if id:
legislaturas = [c.legislatura_set.latest('data_inicio') for c in CasaLegislativa.objects.filter(pk__in=id, legislatura__id__isnull=False).distinct()]
mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
parlamentares = [m.parlamentar for m in mandatos]
qs = parlamentares
else:
else:
qs = carrinhoOrGet_for_parlamentar_qs(request)
if not qs:
return HttpResponseRedirect('../')
@ -189,10 +193,11 @@ def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
return response
def carrinhoOrGet_for_parlamentar_qs(request):
"""
Verifica se existe parlamentares na sessão se não verifica get e retorna qs correspondente.
"""
"""
if request.session.has_key('carrinho_casas'):
ids = request.session['carrinho_casas']
legislaturas = [c.legislatura_set.latest('data_inicio') for c in CasaLegislativa.objects.filter(pk__in=ids, legislatura__id__isnull=False).distinct()]
@ -205,18 +210,19 @@ def carrinhoOrGet_for_parlamentar_qs(request):
parlamentares = [m.parlamentar for m in mandatos]
qs = parlamentares
if request.GET:
qs = get_for_qs(request.GET,qs)
qs = get_for_qs(request.GET, qs)
return qs
def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'):
""" TODO: adicionar suporte para resultado de pesquisa do admin.
"""
if id:
qs = CasaLegislativa.objects.filter(pk=id)
else:
qs = CasaLegislativa.objects.filter(pk=id)
else:
qs = carrinhoOrGet_for_qs(request)
if not qs:
return HttpResponseRedirect('../')
@ -228,56 +234,56 @@ def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'):
return response
def report(request, id=None,tipo=None):
def report(request, id=None, tipo=None):
if request.POST:
if request.POST.has_key('tipo_relatorio'):
tipo = request.POST['tipo_relatorio']
if tipo =='completo':
if tipo == 'completo':
return report_complete(request, id)
if id:
qs = CasaLegislativa.objects.filter(pk=id)
else:
qs = CasaLegislativa.objects.filter(pk=id)
else:
qs = carrinhoOrGet_for_qs(request)
if not qs:
return HttpResponseRedirect('../')
#qs.order_by('municipio__uf','nome')
# qs.order_by('municipio__uf','nome')
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=casas.pdf'
report = CasasLegislativasReport(queryset=qs)
report.generate_by(PDFGenerator, filename=response)
return response
def report_complete(request,id=None):
def report_complete(request, id=None):
if id:
qs = CasaLegislativa.objects.filter(pk=id)
else:
qs = CasaLegislativa.objects.filter(pk=id)
else:
qs = carrinhoOrGet_for_qs(request)
if not qs:
return HttpResponseRedirect('../')
response = HttpResponse(mimetype='application/pdf')
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=casas.pdf'
# Gera um relatorio para cada casa e concatena os relatorios
cont = 0
canvas = None
quant = qs.count()
if quant > 1:
canvas = None
quant = qs.count()
if quant > 1:
for i in qs:
cont += 1
#queryset deve ser uma lista
# queryset deve ser uma lista
lista = (i,)
if cont == 1:
report = InfoCasaLegislativa(queryset=lista)
canvas = report.generate_by(PDFGenerator, return_canvas=True,filename=response,)
canvas = report.generate_by(PDFGenerator, return_canvas=True, filename=response,)
else:
report = InfoCasaLegislativa(queryset=lista)
if cont == quant:
@ -286,35 +292,35 @@ def report_complete(request,id=None):
canvas = report.generate_by(PDFGenerator, canvas=canvas, return_canvas=True)
else:
report = InfoCasaLegislativa(queryset=qs)
report.generate_by(PDFGenerator,filename=response)
report.generate_by(PDFGenerator, filename=response)
return response
def casas_sem_convenio_report(request):
qs = CasaLegislativa.objects.filter(convenio=None).order_by('municipio__uf','nome')
qs = CasaLegislativa.objects.filter(convenio=None).order_by('municipio__uf', 'nome')
if request.GET:
qs = get_for_qs(request.GET,qs)
qs = get_for_qs(request.GET, qs)
if not qs:
return HttpResponseRedirect('../')
response = HttpResponse(mimetype='application/pdf')
report = CasasSemConvenioReport(queryset=qs)
report.generate_by(PDFGenerator, filename=response)
return response
def export_csv(request):
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=casas.csv'
writer = csv.writer(response)
casas = carrinhoOrGet_for_qs(request)
if not casas or not request.POST:
return HttpResponseRedirect('../')
atributos = request.POST.getlist("itens_csv_selected")
atributos2 = [s.encode("utf-8") for s in atributos]
@ -322,9 +328,9 @@ def export_csv(request):
atributos2.insert(atributos2.index('Município'), u'UF')
except ValueError:
pass
writer.writerow(atributos2)
for casa in casas:
lista = []
contatos = casa.funcionario_set.filter(setor="contato_interlegis")
@ -341,10 +347,10 @@ def export_csv(request):
lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8"))
lista.append(unicode(casa.municipio.nome).encode("utf-8"))
elif u"Presidente" == atributo:
#TODO: Esse encode deu erro em 25/04/2012. Comentei para que o usuário pudesse continuar seu trabalho
# TODO: Esse encode deu erro em 25/04/2012. Comentei para que o usuário pudesse continuar seu trabalho
# É preciso descobrir o porque do erro e fazer a correção definitiva.
# lista.append(str(casa.presidente or "").encode("utf-8"))
lista.append(str(casa.presidente or ""))
# lista.append(str(casa.presidente or "").encode("utf-8"))
lista.append(str(casa.presidente or ""))
elif u"Logradouro" == atributo:
lista.append(casa.logradouro.encode("utf-8"))
elif u"Bairro" == atributo:
@ -378,7 +384,7 @@ def export_csv(request):
lista.append('')
else:
pass
writer.writerow(lista)
return response

5
sigi/apps/contatos/admin.py

@ -11,9 +11,10 @@ class UnidadeFederativaAdmin(admin.ModelAdmin):
list_display = ('codigo_ibge', 'nome', 'sigla', 'regiao', 'populacao')
list_display_links = ('codigo_ibge', 'nome')
list_filter = ('regiao', 'populacao', PopulationFilter,)
search_fields = ('search_text', 'codigo_ibge', 'sigla', 'regiao')
search_fields = ('search_text', 'codigo_ibge', 'sigla', 'regiao')
get_queryset = queryset_ascii
class MunicipioAdmin(admin.ModelAdmin):
actions = None
list_display = ('codigo_ibge', 'codigo_tse', 'nome', 'uf', 'is_capital', 'populacao', 'is_polo', 'idh', 'pib_ano',
@ -34,6 +35,7 @@ class MunicipioAdmin(admin.ModelAdmin):
search_fields = ('search_text', 'codigo_ibge', 'codigo_tse', 'codigo_mesorregiao',
'codigo_microrregiao', 'uf__sigla')
class TelefoneAdmin(admin.ModelAdmin):
list_display = ('numero', 'tipo', 'nota')
list_display_links = ('numero',)
@ -41,6 +43,7 @@ class TelefoneAdmin(admin.ModelAdmin):
radio_fields = {'tipo': admin.VERTICAL}
search_fields = ('numero', 'tipo', 'nota')
class ContatoAdmin(admin.ModelAdmin):
list_display = ('nome', 'nota', 'email', 'municipio')
list_display_links = ('nome',)

8
sigi/apps/contatos/filters.py

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

120
sigi/apps/contatos/models.py

@ -6,8 +6,8 @@ from sigi.apps.utils import SearchField
from django.core.validators import MaxValueValidator, MinValueValidator
class UnidadeFederativa(models.Model):
""" Modelo que representa um estado brasileiro
"""
REGIAO_CHOICES = (
@ -42,7 +42,9 @@ class UnidadeFederativa(models.Model):
def __unicode__(self):
return self.nome
class Municipio(models.Model):
""" Modelo para representar as cidades brasileiras
"""
codigo_ibge = models.PositiveIntegerField(
@ -97,11 +99,11 @@ class Municipio(models.Model):
blank=True,
help_text='Exemplo: <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)])
idh.list_filter_range = [0.500, 0.800]
pib_total = models.DecimalField(u'PIB total', max_digits=18, decimal_places=3, blank=True, null=True)
pib_percapita = models.DecimalField(u'PIB per capita', max_digits=18, decimal_places=3, blank=True, null=True)
pib_ano = models.IntegerField(u'Ano de apuração do PIB', blank=True, null=True)
@ -118,7 +120,9 @@ class Municipio(models.Model):
return "http://maps.google.com.br/maps/mm?ie=UTF8&hl=pt-BR&t=h&ll=%s,%s&spn=1.61886,1.812744&z=9&source=embed" % \
(self.latitude, self.longitude)
class Telefone(models.Model):
""" Modelo genérico para agrupar telefones dos modulos do sistema
"""
TELEFONE_CHOICES = (
@ -129,16 +133,16 @@ class Telefone(models.Model):
)
numero = models.CharField(
'número',
max_length=64, # TODO: diminuir tamanho de campo após migração de dados
max_length=64, # TODO: diminuir tamanho de campo após migração de dados
help_text='Exemplo: <em>(31)8851-9898</em>.',
)
tipo = models.CharField(
max_length=1,
choices=TELEFONE_CHOICES,
default= 'I'
default='I'
)
nota = models.CharField(max_length=70, null=True, blank=True)
ult_alteracao = models.DateTimeField(u'Última alteração', null=True, blank=True, editable=False, auto_now=True)
ult_alteracao = models.DateTimeField(u'Última alteração', null=True, blank=True, editable=False, auto_now=True)
# guarda o tipo do objeto (classe) vinculado a esse registro
content_type = models.ForeignKey(ContentType)
@ -153,7 +157,9 @@ class Telefone(models.Model):
def __unicode__(self):
return unicode(self.numero)
class Contato(models.Model):
""" Modelo generico para registrar contatos vinculados aos
modulos do sistema
"""
@ -185,63 +191,64 @@ class Contato(models.Model):
def __unicode__(self):
return self.nome
class Endereco(models.Model):
TIPO_CHOICES = (
('aeroporto','Aeroporto'),
('alameda','Alameda'),
('area',u'Área'),
('avenida','Avenida'),
('campo','Campo'),
('chacara',u'Chácara'),
('colonia',u'Colônia'),
('condominio',u'Condomínio'),
('conjunto','Conjunto'),
('distrito','Distrito'),
('esplanada','Esplanada'),
('estacao',u'Estação'),
('estrada','Estrada'),
('favela','Favela'),
('fazenda','Fazenda'),
('feira','Feira'),
('jardim','Jardim'),
('ladeira','Ladeira'),
('lago','Lago'),
('lagoa','Lagoa'),
('largo','Largo'),
('loteamento','Loteamento'),
('morro','Morro'),
('nucleo',u'Núcleo'),
('parque','Parque'),
('passarela','Passarela'),
('patio',u'Pátio'),
('praca',u'Praça'),
('quadra','Quadra'),
('recanto','Recanto'),
('residencial','Residencial'),
('rodovia','Rodovia'),
('rua','Rua'),
('setor','Setor'),
('sitio',u'Sítio'),
('travessa','Travessa'),
('trecho','Trecho'),
('trevo','Trevo'),
('vale','Vale'),
('vereda','Vereda'),
('via','Via'),
('viaduto','Viaduto'),
('viela','Viela'),
('vila','Vila'),
('outro','Outro'),
('aeroporto', 'Aeroporto'),
('alameda', 'Alameda'),
('area', u'Área'),
('avenida', 'Avenida'),
('campo', 'Campo'),
('chacara', u'Chácara'),
('colonia', u'Colônia'),
('condominio', u'Condomínio'),
('conjunto', 'Conjunto'),
('distrito', 'Distrito'),
('esplanada', 'Esplanada'),
('estacao', u'Estação'),
('estrada', 'Estrada'),
('favela', 'Favela'),
('fazenda', 'Fazenda'),
('feira', 'Feira'),
('jardim', 'Jardim'),
('ladeira', 'Ladeira'),
('lago', 'Lago'),
('lagoa', 'Lagoa'),
('largo', 'Largo'),
('loteamento', 'Loteamento'),
('morro', 'Morro'),
('nucleo', u'Núcleo'),
('parque', 'Parque'),
('passarela', 'Passarela'),
('patio', u'Pátio'),
('praca', u'Praça'),
('quadra', 'Quadra'),
('recanto', 'Recanto'),
('residencial', 'Residencial'),
('rodovia', 'Rodovia'),
('rua', 'Rua'),
('setor', 'Setor'),
('sitio', u'Sítio'),
('travessa', 'Travessa'),
('trecho', 'Trecho'),
('trevo', 'Trevo'),
('vale', 'Vale'),
('vereda', 'Vereda'),
('via', 'Via'),
('viaduto', 'Viaduto'),
('viela', 'Viela'),
('vila', 'Vila'),
('outro', 'Outro'),
)
# tipo do endereço obtido no site dos correios
tipo = models.CharField(max_length=15,choices=TIPO_CHOICES)
tipo = models.CharField(max_length=15, choices=TIPO_CHOICES)
logradouro = models.CharField(
max_length=100,
)
logradouro.alphabetic_filter = True
numero= models.CharField(max_length=15, blank=True)
complemento= models.CharField(max_length=15, blank=True)
numero = models.CharField(max_length=15, blank=True)
complemento = models.CharField(max_length=15, blank=True)
# campo de texto livre
referencia = models.CharField(max_length=100, blank=True)
bairro = models.CharField(max_length=100, blank=True)
@ -275,5 +282,4 @@ class Endereco(models.Model):
def __unicode__(self):
return self.tipo + ' ' + self.logradouro + ', ' + self.numero \
+ ' ' + self.complemento + ' - ' + self.bairro
+ ' ' + self.complemento + ' - ' + self.bairro

65
sigi/apps/convenios/admin.py

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

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 django.db import models
from django.contrib.contenttypes import generic
@ -6,6 +6,7 @@ from sigi.apps.utils import SearchField
class Projeto(models.Model):
""" Modelo para representar os projetos do programa
Interlegis
"""
@ -17,6 +18,7 @@ class Projeto(models.Model):
class Convenio(models.Model):
""" Modelo que representa um convênio do Interlegis
com uma Casa Legislativa.
@ -90,7 +92,7 @@ class Convenio(models.Model):
help_text=u'Data do retorno do convênio sem assinatura',
)
observacao = models.CharField(
null=True,
null=True,
blank=True,
max_length=100,
)
@ -98,24 +100,24 @@ class Convenio(models.Model):
equipada = models.BooleanField()
def save(self, *args, **kwargs):
self.conveniada = self.data_retorno_assinatura!=None
self.equipada = self.data_termo_aceite!=None
self.conveniada = self.data_retorno_assinatura != None
self.equipada = self.data_termo_aceite != None
super(Convenio, self).save(*args, **kwargs)
class Meta:
get_latest_by = 'id'
ordering = ('id',)
verbose_name = u'convênio'
def __unicode__(self):
if self.data_retorno_assinatura != None:
if self.data_retorno_assinatura != None:
return u"Convênio nº %s - projeto %s, em %s" % (self.num_convenio, self.projeto.sigla, self.data_retorno_assinatura)
else:
return u"Adesão ao projeto %s, em %s" % (self.projeto.sigla, self.data_adesao)
class EquipamentoPrevisto(models.Model):
""" Modelo utilizado para registrar os equipamentos
disponibilizados para as Casas Legislativas
(foi usado na prmeira etapa do programa)
@ -133,6 +135,7 @@ class EquipamentoPrevisto(models.Model):
class Anexo(models.Model):
""" Modelo para giardar os documentos gerados
no processo de convênio
"""
@ -151,7 +154,9 @@ class Anexo(models.Model):
def __unicode__(self):
return unicode("%s publicado em %s" % (self.descricao, self.data_pub))
class UnidadeAdministrativa(models.Model):
""" Modelo para representar uma Unidade Administrativa
que pode ser um servivo do próprio Interlegis, assim como
uma unidade do Senado Federal
@ -164,6 +169,7 @@ class UnidadeAdministrativa(models.Model):
class Tramitacao(models.Model):
""" Modelo para registrar as vias do processo de convênio e a Unidade
responsável pelo tramite (ex. colher assinaturas do secretário do senado)
"""
@ -185,4 +191,3 @@ class Tramitacao(models.Model):
return unicode("%s em %s (%s)" % (self.unid_admin, self.data, self.observacao))
else:
return unicode("%s em %s" % (self.unid_admin, self.data))

270
sigi/apps/convenios/reports.py

@ -3,8 +3,8 @@ import os
from ctypes import alignment
from operator import attrgetter
from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \
landscape,SystemField, BAND_WIDTH,ReportGroup, \
FIELD_ACTION_SUM, FIELD_ACTION_COUNT, FIELD_ACTION_AVG
landscape, SystemField, BAND_WIDTH, ReportGroup, \
FIELD_ACTION_SUM, FIELD_ACTION_COUNT, FIELD_ACTION_AVG
from geraldo.graphics import Image
from reportlab.lib.units import cm
@ -15,302 +15,306 @@ from sigi.apps.relatorios.reports import ReportDefault
#from abc import ABCMeta
class CasasAderidasReport(object):
pass
class CasasNaoAderidasReport(object):
pass
class CasasComEquipamentosReport(object):
pass
class SemEquipamentosReport(object):
pass
class ConvenioReport(ReportDefault):
title = u'Relatório de Convênios'
class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top
label_left = [0,1.5,7,9,11,13,15,17]
label_left = [0, 1.5, 7, 9, 11, 13, 15, 17]
elements = list(ReportDefault.band_page_header.elements)
height = 4.7*cm
height = 4.7 * cm
elements += [
Label(
text="UF",
left=label_left[0]*cm,
top=label_top + 0.4*cm,
left=label_left[0] * cm,
top=label_top + 0.4 * cm,
),
Label(
text="Municipio",
left=label_left[1]*cm,
top=label_top + 0.4*cm,
),
left=label_left[1] * cm,
top=label_top + 0.4 * cm,
),
Label(
text="Data de Adesão",
left=label_left[2]*cm,
left=label_left[2] * cm,
top=label_top,
width=2*cm,
width=2 * cm,
),
Label(
text="Número do Convênio",
left=label_left[3]*cm,
left=label_left[3] * cm,
top=label_top,
width=2*cm,
width=2 * cm,
),
Label(
text="Data do Convênio",
left=label_left[4]*cm,
left=label_left[4] * cm,
top=label_top,
width=2*cm,
),
width=2 * cm,
),
Label(
text="Data de Publicação",
left=label_left[5]*cm,
left=label_left[5] * cm,
top=label_top,
width=2*cm,
width=2 * cm,
),
Label(
text="Data de Aceite",
left=label_left[6]*cm,
left=label_left[6] * cm,
top=label_top,
width=2*cm,
width=2 * cm,
),
Label(
text="Projeto",
left=label_left[7]*cm,
top=label_top + 0.4*cm,
width=2*cm,
left=label_left[7] * cm,
top=label_top + 0.4 * cm,
width=2 * cm,
),
]
class band_page_footer(ReportDefault.band_page_footer):
pass
class band_detail(ReportDefault.band_detail):
label_left = [0,1.5,7,9,11,13,15,17]
label_left = [0, 1.5, 7, 9, 11, 13, 15, 17]
elements=[
elements = [
ObjectValue(
attribute_name='casa_legislativa.municipio.uf.sigla',
left=label_left[0]*cm
left=label_left[0] * cm
),
ObjectValue(
attribute_name='casa_legislativa.municipio.nome',
left=label_left[1]*cm
),
left=label_left[1] * cm
),
ObjectValue(
attribute_name='data_adesao',
left=label_left[2]*cm,
left=label_left[2] * cm,
get_value=lambda instance:
instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-'
),
ObjectValue(
attribute_name='num_convenio',
left=label_left[3]*cm
left=label_left[3] * cm
),
ObjectValue(
attribute_name='data_retorno_assinatura',
left=label_left[4]*cm,
left=label_left[4] * cm,
get_value=lambda instance:
instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-'
),
),
ObjectValue(
attribute_name='data_pub_diario',
left=label_left[5]*cm,
left=label_left[5] * cm,
get_value=lambda instance:
instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-'
),
ObjectValue(
attribute_name='data_termo_aceite',
left=label_left[6]*cm,
left=label_left[6] * cm,
get_value=lambda instance:
instance.data_termo_aceite.strftime('%d/%m/%Y') if instance.data_termo_aceite != None else '-'
),
ObjectValue(
attribute_name='projeto.sigla',
left=label_left[7]*cm
left=label_left[7] * cm
),
]
]
groups = [
ReportGroup(attribute_name='casa_legislativa.municipio.uf',
band_header=ReportBand(
height=0.7*cm,
elements= [
ObjectValue(attribute_name='casa_legislativa.municipio.uf',
get_Value= lambda instance: 'CasaLegislativa: '+ (instance.casa_legislativa.uf)
band_header=ReportBand(
height=0.7 * cm,
elements=[
ObjectValue(attribute_name='casa_legislativa.municipio.uf',
get_Value=lambda instance: 'CasaLegislativa: ' + (instance.casa_legislativa.uf)
)
],
borders={'top': True},
)
)
],
borders={'top': True},
)
)
]
class ConvenioReportSemAceite(ConvenioReport):
class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top
label_left = [0,1.5,7,9,11,13,15,17]
label_left = [0, 1.5, 7, 9, 11, 13, 15, 17]
elements = list(ReportDefault.band_page_header.elements)
height = 4.7*cm
height = 4.7 * cm
elements += [
Label(
text="UF",
left=label_left[0]*cm,
top=label_top + 0.4*cm,
left=label_left[0] * cm,
top=label_top + 0.4 * cm,
),
Label(
text="Município",
left=label_left[1]*cm,
top=label_top + 0.4*cm,
),
left=label_left[1] * cm,
top=label_top + 0.4 * cm,
),
Label(
text="Data de Adesão",
left=label_left[3]*cm,
left=label_left[3] * cm,
top=label_top,
width=2*cm,
width=2 * cm,
),
Label(
text="Número do Convênio",
left=label_left[4]*cm,
left=label_left[4] * cm,
top=label_top,
width=2*cm,
width=2 * cm,
),
Label(
text="Data do Convênio",
left=label_left[5]*cm,
left=label_left[5] * cm,
top=label_top,
width=2*cm,
),
width=2 * cm,
),
Label(
text="Data de Publicação",
left=label_left[6]*cm,
left=label_left[6] * cm,
top=label_top,
width=2*cm,
),
width=2 * cm,
),
Label(
text="Projeto",
left=label_left[7]*cm,
top=label_top + 0.4*cm,
width=2*cm,
left=label_left[7] * cm,
top=label_top + 0.4 * cm,
width=2 * cm,
),
]
class band_detail(ReportDefault.band_detail):
label_left = [0,1.5,7,9,11,13,15,17]
label_left = [0, 1.5, 7, 9, 11, 13, 15, 17]
elements=[
elements = [
ObjectValue(
attribute_name='casa_legislativa.municipio.uf.sigla',
left=label_left[0]*cm
left=label_left[0] * cm
),
ObjectValue(
attribute_name='casa_legislativa.municipio.nome',
left=label_left[1]*cm
),
left=label_left[1] * cm
),
ObjectValue(
attribute_name='data_adesao',
left=label_left[3]*cm,
left=label_left[3] * cm,
get_value=lambda instance:
instance.data_adesao.strftime('%d/%m/%Y') if instance.data_adesao != None else '-'
),
ObjectValue(
attribute_name='num_convenio',
left=label_left[4]*cm
left=label_left[4] * cm
),
ObjectValue(
attribute_name='data_retorno_assinatura',
left=label_left[5]*cm,
left=label_left[5] * cm,
get_value=lambda instance:
instance.data_retorno_assinatura.strftime('%d/%m/%Y') if instance.data_retorno_assinatura != None else '-'
),
),
ObjectValue(
attribute_name='data_pub_diario',
left=label_left[6]*cm,
left=label_left[6] * cm,
get_value=lambda instance:
instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-'
),
),
ObjectValue(
attribute_name='projeto.sigla',
left=label_left[7]*cm
left=label_left[7] * cm
),
]
]
float_duas_casas = lambda instance: '%.2f' % (instance)
float_duas_casas = lambda instance: '%.2f' % (instance)
class ConvenioReportRegiao(ReportDefault):
title = u'Relatório de Convênios por Região'
class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top
label_left = [0.5,6,8,10,12,14]
map(lambda x:x-0.4,label_left)
elements = list(ReportDefault.band_page_header.elements)
elements += [
Label(text="UF", left=label_left[0]*cm,top=label_top,),
Label(text="Total", left=label_left[1]*cm,top=label_top,),
Label(text="Aderidas", left=label_left[2]*cm,top=label_top,),
Label(text="%", left=label_left[3]*cm,top=label_top),
Label(text="Ñ Aderidas", left=label_left[4]*cm,top=label_top,),
Label(text="%", left=label_left[5]*cm,top=label_top),
label_top = ReportDefault.band_page_header.label_top
label_left = [0.5, 6, 8, 10, 12, 14]
map(lambda x: x - 0.4, label_left)
elements = list(ReportDefault.band_page_header.elements)
elements += [
Label(text="UF", left=label_left[0] * cm, top=label_top,),
Label(text="Total", left=label_left[1] * cm, top=label_top,),
Label(text="Aderidas", left=label_left[2] * cm, top=label_top,),
Label(text="%", left=label_left[3] * cm, top=label_top),
Label(text="Ñ Aderidas", left=label_left[4] * cm, top=label_top,),
Label(text="%", left=label_left[5] * cm, top=label_top),
]
class band_detail(ReportDefault.band_detail):
label_left = [0.5,6,8,10,12,14]
label_left = [0.5, 6, 8, 10, 12, 14]
display_inline = True
float_duas_casas = lambda instance: '%.2f' % (instance.porc_casas_aderidas)
float_duas_casas = lambda instance: '%.2f' % (instance.porc_casas_aderidas)
default_style = {'fontName': 'Helvetica', 'fontSize': 11}
elements=[
ObjectValue(attribute_name='estado', left=label_left[0]*cm, ),
ObjectValue(attribute_name='quant_casas', left=label_left[1]*cm,),
ObjectValue(attribute_name='quant_casas_aderidas', left=label_left[2]*cm),
ObjectValue(attribute_name='porc_casas_aderidas', left=label_left[3]*cm),
ObjectValue(attribute_name='quant_casas_nao_aderidas', left=label_left[4]*cm),
ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,),
]
class band_summary(ReportBand):
label_left = [0.5,6,8,10,12,14]
elements = [
Label(text="Total", top=0.1*cm, left=label_left[0]*cm),
ObjectValue(attribute_name='quant_casas', action=FIELD_ACTION_SUM, left=label_left[1]*cm, ),
ObjectValue(attribute_name='quant_casas_aderidas', action=FIELD_ACTION_SUM, left=label_left[2]*cm),
# ObjectValue(attribute_name='porc_casas_aderidas', action=FIELD_ACTION_AVG, left=label_left[3]*cm,
# #get_value= lambda instance : lambda instance: '%.2f' % (instance.porc_casas_aderidas),
# ),
ObjectValue(attribute_name='quant_casas_nao_aderidas', action=FIELD_ACTION_SUM, left=label_left[4]*cm),
# ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,
# get_value=lambda x: teste(),
# ),
]
borders = {'top':True}
ObjectValue(attribute_name='estado', left=label_left[0] * cm, ),
ObjectValue(attribute_name='quant_casas', left=label_left[1] * cm,),
ObjectValue(attribute_name='quant_casas_aderidas', left=label_left[2] * cm),
ObjectValue(attribute_name='porc_casas_aderidas', left=label_left[3] * cm),
ObjectValue(attribute_name='quant_casas_nao_aderidas', left=label_left[4] * cm),
ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5] * cm,),
]
class band_summary(ReportBand):
label_left = [0.5, 6, 8, 10, 12, 14]
elements = [
Label(text="Total", top=0.1 * cm, left=label_left[0] * cm),
ObjectValue(attribute_name='quant_casas', action=FIELD_ACTION_SUM, left=label_left[1] * cm, ),
ObjectValue(attribute_name='quant_casas_aderidas', action=FIELD_ACTION_SUM, left=label_left[2] * cm),
# ObjectValue(attribute_name='porc_casas_aderidas', action=FIELD_ACTION_AVG, left=label_left[3]*cm,
# get_value= lambda instance : lambda instance: '%.2f' % (instance.porc_casas_aderidas),
# ),
ObjectValue(attribute_name='quant_casas_nao_aderidas', action=FIELD_ACTION_SUM, left=label_left[4] * cm),
# ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,
# get_value=lambda x: teste(),
# ),
]
borders = {'top': True}
class ConvenioPorCMReport(ConvenioReport):
title = u'Relatório de Convênios por Câmara Municipal'
class ConvenioPorALReport(ConvenioReport):
title = u'Relatório de Convênios por Assembléia Legislativa'
class ConvenioReportSemAceiteCM(ConvenioReportSemAceite):
title = u'Relatório de Convênios por Câmara Municipal'
class ConvenioReportSemAceiteAL(ConvenioReportSemAceite):
title = u'Relatório de Convênios por Assembléia Legislativa'
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 sigi.apps.convenios.models import Convenio, Projeto
from sigi.apps.convenios.reports import ConvenioReport \
,ConvenioPorCMReport \
,ConvenioPorALReport \
,ConvenioReportSemAceiteAL \
,ConvenioReportSemAceiteCM
, ConvenioPorCMReport \
, ConvenioPorALReport \
, ConvenioReportSemAceiteAL \
, ConvenioReportSemAceiteCM
from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.contatos.models import UnidadeFederativa
@ -22,56 +22,60 @@ import datetime
import csv
def query_ordena(qs,o,ot):
def query_ordena(qs, o, ot):
list_display = ('num_convenio', 'casa_legislativa',
'data_adesao','data_retorno_assinatura','data_termo_aceite',
'data_adesao', 'data_retorno_assinatura', 'data_termo_aceite',
'projeto',
)
aux = list_display[(int(o)-1)]
if ot =='asc':
aux = list_display[(int(o) - 1)]
if ot == 'asc':
qs = qs.order_by(aux)
else:
qs = qs.order_by("-"+aux)
qs = qs.order_by("-" + aux)
return qs
def get_for_qs(get,qs):
def get_for_qs(get, qs):
kwargs = {}
ids = 0
for k,v in get.iteritems():
for k, v in get.iteritems():
if k not in ['page', 'pop', 'q', '_popup']:
if not k == 'o':
if k == "ot":
qs = query_ordena(qs,get["o"],get["ot"])
qs = query_ordena(qs, get["o"], get["ot"])
else:
kwargs[str(k)] = v
if(str(k)=='ids'):
if(str(k) == 'ids'):
ids = 1
break
qs = qs.filter(**kwargs)
if ids:
query = 'id IN ('+ kwargs['ids'].__str__()+')'
query = 'id IN (' + kwargs['ids'].__str__() + ')'
qs = Convenio.objects.extra(where=[query])
return qs
def carrinhoOrGet_for_qs(request):
"""
Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente.
"""
"""
if request.session.has_key('carrinho_convenios'):
ids = request.session['carrinho_convenios']
qs = Convenio.objects.filter(pk__in=ids)
ids = request.session['carrinho_convenios']
qs = Convenio.objects.filter(pk__in=ids)
else:
qs = Convenio.objects.all()
qs = Convenio.objects.all()
if request.GET:
qs = qs.order_by("casa_legislativa__municipio__uf","casa_legislativa__municipio")
qs = get_for_qs(request.GET,qs)
qs = qs.order_by("casa_legislativa__municipio__uf", "casa_legislativa__municipio")
qs = get_for_qs(request.GET, qs)
return qs
def adicionar_convenios_carrinho(request,queryset=None,id=None):
def adicionar_convenios_carrinho(request, queryset=None, id=None):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
ids_selecionados = request.POST.getlist('_selected_action')
if not request.session.has_key('carrinho_convenios'):
request.session['carrinho_convenios'] = ids_selecionados
else:
@ -79,35 +83,38 @@ def adicionar_convenios_carrinho(request,queryset=None,id=None):
# Verifica se id já não está adicionado
for id in ids_selecionados:
if not id in lista:
lista.append(id)
request.session['carrinho_convenios'] = lista
lista.append(id)
request.session['carrinho_convenios'] = lista
def excluir_carrinho(request):
if request.session.has_key('carrinho_convenios'):
del request.session['carrinho_convenios']
return HttpResponseRedirect('.')
def deleta_itens_carrinho(request):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
if request.session.has_key('carrinho_convenios'):
lista = request.session['carrinho_convenios']
ids_selecionados = request.POST.getlist('_selected_action')
if request.session.has_key('carrinho_convenios'):
lista = request.session['carrinho_convenios']
for item in ids_selecionados:
lista.remove(item)
if lista:
if lista:
request.session['carrinho_convenios'] = lista
else:
del lista;
del request.session['carrinho_convenios']
del lista
del request.session['carrinho_convenios']
return HttpResponseRedirect('.')
def visualizar_carrinho(request):
qs = carrinhoOrGet_for_qs(request)
paginator = Paginator(qs, 100)
# Make sure page request is an int. If not, deliver first page.
# Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página.
try:
@ -120,33 +127,34 @@ def visualizar_carrinho(request):
paginas = paginator.page(page)
except (EmptyPage, InvalidPage):
paginas = paginator.page(paginator.num_pages)
carrinhoIsEmpty = not(request.session.has_key('carrinho_convenios'))
return render_to_response(
'convenios/carrinho.html',
{
'MEDIA_URL':settings.MEDIA_URL,
'carIsEmpty':carrinhoIsEmpty,
'paginas':paginas,
'query_str':'?'+request.META['QUERY_STRING']
'MEDIA_URL': settings.MEDIA_URL,
'carIsEmpty': carrinhoIsEmpty,
'paginas': paginas,
'query_str': '?' + request.META['QUERY_STRING']
}
)
def report(request, id=None):
def report(request, id=None):
if id:
qs = Convenio.objects.filter(pk=id)
else:
qs = carrinhoOrGet_for_qs(request)
qs = carrinhoOrGet_for_qs(request)
if not qs:
return HttpResponseRedirect('../')
tipo = ''
data_aceite_has = ''
report = None
if request.POST:
if request.POST:
if request.POST.has_key('filtro_casa'):
tipo = request.POST['filtro_casa']
if request.POST.has_key('data_aceite'):
@ -160,24 +168,23 @@ def report(request, id=None):
else:
report = ConvenioPorALReport(queryset=qs)
else:
qs = qs.filter(casa_legislativa__tipo__sigla='CM')
qs = qs.filter(casa_legislativa__tipo__sigla='CM')
if data_aceite_has == 'nao':
report = ConvenioReportSemAceiteCM(queryset=qs)
else:
report = ConvenioPorCMReport(queryset=qs)
response = HttpResponse(mimetype='application/pdf')
if report:
if report:
report.generate_by(PDFGenerator, filename=response)
else:
return HttpResponseRedirect('../')
return HttpResponseRedirect('../')
return response
def casas_estado_to_tabela(casas,convenios,regiao):
def casas_estado_to_tabela(casas, convenios, regiao):
estados = get_list_or_404(UnidadeFederativa,regiao=regiao)
estados = get_list_or_404(UnidadeFederativa, regiao=regiao)
class LinhaEstado():
pass
@ -208,7 +215,7 @@ def casas_estado_to_tabela(casas,convenios,regiao):
linha.estado = estado
lista.append(linha)
casas_regiao = casas.filter(municipio__uf__regiao=regiao)
convenios_regiao = convenios.filter(casa_legislativa__municipio__uf__regiao=regiao)
convenios_regiao_publicados = convenios_regiao.exclude(data_pub_diario=None)
@ -225,19 +232,20 @@ def casas_estado_to_tabela(casas,convenios,regiao):
u'UF',
u'Câmaras municipais',
u'Não Aderidas',
u'Aderidas',
u'Aderidas',
u'Conveniadas',
u'Equipadas'
)
)
return {
"linhas":lista,
"cabecalho":cabecalho_topo,
"sumario":sumario,
"linhas": lista,
"cabecalho": cabecalho_topo,
"sumario": sumario,
}
def report_regiao(request,regiao='NE'):
def report_regiao(request, regiao='NE'):
if request.POST:
if request.POST.has_key('regiao'):
regiao = request.POST['regiao']
@ -249,39 +257,40 @@ def report_regiao(request,regiao='NE'):
'NE': 'Nordeste',
'NO': 'Norte',
}
projetos = Projeto.objects.all()
camaras = CasaLegislativa.objects.filter(tipo__sigla='CM')
tabelas = list()
# Geral
convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM')
tabela = casas_estado_to_tabela(camaras,convenios,regiao)
convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM')
tabela = casas_estado_to_tabela(camaras, convenios, regiao)
tabela["projeto"] = "Geral"
tabelas.append(tabela)
for projeto in projetos:
convenios_proj = convenios.filter(projeto=projeto)
tabela = casas_estado_to_tabela(camaras, convenios_proj,regiao)
tabela = casas_estado_to_tabela(camaras, convenios_proj, regiao)
tabela["projeto"] = projeto.nome
tabelas.append(tabela)
data = datetime.datetime.now().strftime('%d/%m/%Y')
hora = datetime.datetime.now().strftime('%H:%M')
hora = datetime.datetime.now().strftime('%H:%M')
pisa.showLogging()
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=RelatorioRegiao_' + regiao + '.pdf'
#tabelas = ({'projeto':"PI"},{'projeto':"PML"},)
t = loader.get_template('convenios/tabela_regiao.html')
c = Context({'tabelas':tabelas,'regiao':REGIAO_CHOICES[regiao],'data':data,'hora':hora})
pdf = pisa.CreatePDF(t.render(c),response)
c = Context({'tabelas': tabelas, 'regiao': REGIAO_CHOICES[regiao], 'data': data, 'hora': hora})
pdf = pisa.CreatePDF(t.render(c), response)
if not pdf.err:
pisa.startViewer(response)
return response
def export_csv(request):
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=convenios.csv'
@ -291,16 +300,16 @@ def export_csv(request):
if not convenios:
return HttpResponseRedirect('../')
atributos = [ u"No. Processo", u"No. Convênio", u"Projeto", u"Casa Legislativa", u"Data de Adesão", u"Data de Convênio",
atributos = [u"No. Processo", u"No. Convênio", u"Projeto", u"Casa Legislativa", u"Data de Adesão", u"Data de Convênio",
u"Data da Publicacao no D.O.", u"Data Equipada", ]
if request.POST:
atributos = request.POST.getlist("itens_csv_selected")
col_titles = atributos
if u"Casa Legislativa" in col_titles:
pos = col_titles.index(u"Casa Legislativa") + 1
col_titles.insert(pos, u"uf")
col_titles.insert(pos, u"uf")
csv_writer.writerow([s.encode("utf-8") for s in col_titles])
for convenio in convenios:
@ -341,4 +350,3 @@ def export_csv(request):
csv_writer.writerow(lista)
return response

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.contatos.models import UnidadeFederativa
def publicar_diagnostico(self, request, queryset):
for registro in queryset:
diagnostico = Diagnostico.objects.get(pk=registro.id)
diagnostico.publicado = True
diagnostico.data_publicacao= datetime.now()
diagnostico.data_publicacao = datetime.now()
diagnostico.save()
# Enviando o email avisando que o diagnóstico foi publicado
email = diagnostico.responsavel.user.email
if email:
diagnostico.email_diagnostico_publicado(email, request.get_host())
diagnostico.email_diagnostico_publicado(email, request.get_host())
self.message_user(request, "Diagnóstico(s) publicado(s) com sucesso!")
publicar_diagnostico.short_description = u"""
Definir diagnósticos como publicado"""
@ -27,14 +28,17 @@ def despublicar_diagnostico(self, request, queryset):
despublicar_diagnostico.short_description = u"""
Definir diagnósticos como não publicado"""
class EquipeInline(admin.TabularInline):
model = Equipe
class AnexosInline(admin.TabularInline):
model = Anexo
extra = 2
exclude = ['data_pub', ]
class AnexoAdmin(admin.ModelAdmin):
date_hierarchy = 'data_pub'
exclude = ['data_pub', ]
@ -43,13 +47,14 @@ class AnexoAdmin(admin.ModelAdmin):
search_fields = ('descricao', 'diagnostico__id', 'arquivo',
'diagnostico__casa_legislativa__nome')
class DiagnosticoAdmin(BaseEntityAdmin):
form = DiagnosticoForm
actions = [publicar_diagnostico, despublicar_diagnostico]
inlines = (EquipeInline, AnexosInline)
search_fields = ('casa_legislativa__nome',)
list_display = ('casa_legislativa','get_uf', 'data_visita_inicio', 'data_visita_fim', 'responsavel', 'publicado')
list_filter = ('publicado', 'casa_legislativa__municipio__uf__nome', 'casa_legislativa', 'data_publicacao', 'data_visita_inicio', 'data_visita_fim')
list_display = ('casa_legislativa', 'get_uf', 'data_visita_inicio', 'data_visita_fim', 'responsavel', 'publicado')
list_filter = ('publicado', 'casa_legislativa__municipio__uf__nome', 'casa_legislativa', 'data_publicacao', 'data_visita_inicio', 'data_visita_fim')
raw_id_fields = ('casa_legislativa',)
ordering = ('casa_legislativa',)
@ -57,7 +62,7 @@ class DiagnosticoAdmin(BaseEntityAdmin):
(u'00. Identificação do Diagnóstico', {'fields': ('responsavel', 'data_visita_inicio', 'data_visita_fim',)}),
(u'01. Identificação da Casa Legislativa', {'fields': ('casa_legislativa',)}),
(u'02. Identificação de Competências da Casa Legislativa', {'fields': ()})
)
)
# popula o eav fieldsets ordenando as categorias e as perguntas
# para serem exibidas no admin
@ -67,49 +72,50 @@ class DiagnosticoAdmin(BaseEntityAdmin):
perguntas = [pergunta[1] for pergunta in sorted(perguntas_by_title)]
eav_fieldsets += ((categoria, {
'fields': tuple(perguntas),
'classes': ['collapse']
}),)
'fields': tuple(perguntas),
'classes': ['collapse']
}),)
def get_uf(self, obj):
return '%s' % (obj.casa_legislativa.municipio.uf)
get_uf.short_description = 'UF'
get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome'
def lookup_allowed(self, lookup, value):
return super(DiagnosticoAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact']
def changelist_view(self, request, extra_context=None):
import re
request.GET._mutable=True
request.GET._mutable = True
if 'data_visita_inicio__gte' in request.GET:
value = request.GET.get('data_visita_inicio__gte','')
value = request.GET.get('data_visita_inicio__gte', '')
if value == '':
del request.GET['data_visita_inicio__gte']
elif re.match('^\d*$', value): # Year only
request.GET['data_visita_inicio__gte'] = "%s-01-01" % value #Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month
request.GET['data_visita_inicio__gte'] = '%s-01' % value #Complete with 1st day of month
elif re.match('^\d*$', value): # Year only
request.GET['data_visita_inicio__gte'] = "%s-01-01" % value # Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month
request.GET['data_visita_inicio__gte'] = '%s-01' % value # Complete with 1st day of month
if 'data_visita_inicio__lte' in request.GET:
value = request.GET.get('data_visita_inicio__lte','')
value = request.GET.get('data_visita_inicio__lte', '')
if value == '':
del request.GET['data_visita_inicio__lte']
elif re.match('^\d*$', value): # Year only
request.GET['data_visita_inicio__lte'] = "%s-01-01" % value #Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month
request.GET['data_visita_inicio__lte'] = '%s-01' % value #Complete with 1st day of month
request.GET._mutable=False
elif re.match('^\d*$', value): # Year only
request.GET['data_visita_inicio__lte'] = "%s-01-01" % value # Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month
request.GET['data_visita_inicio__lte'] = '%s-01' % value # Complete with 1st day of month
request.GET._mutable = False
return super(DiagnosticoAdmin, self).changelist_view(request, extra_context)
class EscolhaAdmin(admin.ModelAdmin):
search_fields = ('title',)
list_display = ('title', 'schema', 'schema_to_open')
raw_id_fields = ('schema', 'schema_to_open')
ordering = ('schema', 'title')
class EscolhaInline(admin.TabularInline):
model = Escolha
fk_name = 'schema'
@ -117,6 +123,7 @@ class EscolhaInline(admin.TabularInline):
verbose_name = 'Escolhas (apenas para choices ou multiple choices)'
extra = 0
class PerguntaAdmin (BaseSchemaAdmin):
search_fields = ('title', 'help_text', 'name',)
list_display = ('title', 'categoria', 'datatype', 'help_text', 'required')

1
sigi/apps/diagnosticos/decorators.py

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

41
sigi/apps/diagnosticos/forms.py

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

68
sigi/apps/diagnosticos/models.py

@ -9,6 +9,7 @@ from eav.models import BaseChoice, BaseEntity, BaseSchema, BaseAttribute
class Diagnostico(BaseEntity):
""" Modelo para representar unm diagnostico realizado
em uma Casa Legislativa
"""
@ -38,7 +39,7 @@ class Diagnostico(BaseEntity):
)
responsavel = models.ForeignKey('servidores.Servidor',
verbose_name=u'responsável')
verbose_name=u'responsável')
class Meta:
verbose_name, verbose_name_plural = u'diagnóstico', u'diagnósticos'
@ -85,15 +86,15 @@ class Diagnostico(BaseEntity):
construção do endereço do diagnóstico
"""
enviar_email(from_email, u"Diagnóstico publicado",
'diagnosticos/email_diagnostico_publicado.txt',
{
'responsavel': self.responsavel.nome_completo,
'casa_legislativa': self.casa_legislativa,
'data_diagnostico': self.data_visita_inicio,
'host': host,
'url_diagnostico': self.get_absolute_url(),
'status': u"Publicado",
})
'diagnosticos/email_diagnostico_publicado.txt',
{
'responsavel': self.responsavel.nome_completo,
'casa_legislativa': self.casa_legislativa,
'data_diagnostico': self.data_visita_inicio,
'host': host,
'url_diagnostico': self.get_absolute_url(),
'status': u"Publicado",
})
def email_diagnostico_alterado(self, from_email, host):
"""Enviando email quando o status do diagnóstico
@ -103,24 +104,23 @@ class Diagnostico(BaseEntity):
construção do endereço do diagnóstico
"""
enviar_email(from_email, u"Diagnóstico alterado",
'diagnosticos/email_diagnostico_alterado.txt',
{
'servidor': self.responsavel.nome_completo,
'casa_legislativa': self.casa_legislativa,
'data_diagnostico': self.data_visita_inicio,
'host': host,
'url_diagnostico': self.get_absolute_url(),
'status': "Alterado",
})
'diagnosticos/email_diagnostico_alterado.txt',
{
'servidor': self.responsavel.nome_completo,
'casa_legislativa': self.casa_legislativa,
'data_diagnostico': self.data_visita_inicio,
'host': host,
'url_diagnostico': self.get_absolute_url(),
'status': "Alterado",
})
def get_schemata(self, category=None, *args, **kwargs):
""" Se existir uma categoria retorna apenas as questões dessa.
"""
schemas = super(Diagnostico,self).get_schemata(*args, **kwargs)
schemas = super(Diagnostico, self).get_schemata(*args, **kwargs)
if category:
schemas = [s for s in schemas if s.categoria_id == category]
schemas= sorted(schemas, lambda x,y: cmp(x.title, y.title))
schemas = [s for s in schemas if s.categoria_id == category]
schemas = sorted(schemas, lambda x, y: cmp(x.title, y.title))
return schemas
@ -136,6 +136,7 @@ class Diagnostico(BaseEntity):
class Categoria(models.Model):
""" Modelo para representar a categoria de uma pergunta
e sua ordem na hora de exibir no formulário
"""
@ -149,6 +150,7 @@ class Categoria(models.Model):
class Pergunta(BaseSchema):
""" Modelo que representa uma pergunta no questionário
e sua ordem dentro da categoria
@ -168,8 +170,8 @@ class Pergunta(BaseSchema):
""", [self.id])
return [
(Escolha.objects.get(id=int(row[0])), row[1])
for row in cursor.fetchall()
(Escolha.objects.get(id=int(row[0])), row[1])
for row in cursor.fetchall()
]
def total_anwsers(self):
@ -190,34 +192,37 @@ class Pergunta(BaseSchema):
class Escolha(BaseChoice):
""" Perguntas de multiplas escolhas tem as opções
cadastradas neste modelo
"""
schema = models.ForeignKey(Pergunta,
related_name='choices', verbose_name='pergunta')
related_name='choices', verbose_name='pergunta')
schema_to_open = models.ForeignKey(Pergunta, related_name='',
verbose_name='pergunta para abrir', blank=True, null=True)
verbose_name='pergunta para abrir', blank=True, null=True)
ordem = models.PositiveIntegerField(blank=True, null=True)
class Meta:
ordering = ('schema','ordem')
ordering = ('schema', 'ordem')
verbose_name, verbose_name_plural = 'escolha', 'escolhas'
class Resposta(BaseAttribute):
""" Modelo para guardar as respostas das perguntas
de um diagnosico
"""
schema = models.ForeignKey(Pergunta, related_name='attrs',
verbose_name='pergunta')
verbose_name='pergunta')
choice = models.ForeignKey(Escolha, verbose_name='escolha',
blank=True, null=True)
blank=True, null=True)
class Meta:
verbose_name, verbose_name_plural = 'resposta', 'respostas'
class Equipe(models.Model):
""" Modelo que representa a equipe de um diagnóstico
"""
diagnostico = models.ForeignKey(Diagnostico)
@ -231,6 +236,7 @@ class Equipe(models.Model):
class Anexo(models.Model):
""" Modelo para representar os documentos levantados
no processo de diagnóstico. Podem ser fotos, contratos, etc.
"""
@ -238,7 +244,7 @@ class Anexo(models.Model):
arquivo = models.FileField(upload_to='apps/diagnostico/anexo/arquivo',)
descricao = models.CharField('descrição', max_length='70')
data_pub = models.DateTimeField('data da publicação do anexo',
default=datetime.now)
default=datetime.now)
class Meta:
ordering = ('-data_pub',)

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

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

28
sigi/apps/diagnosticos/views.py

@ -3,7 +3,7 @@
from itertools import cycle
from django.http import HttpResponse
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
from django.views.decorators.cache import never_cache
@ -173,10 +173,10 @@ def categoria_contatos(request, id_diagnostico):
resposta = {
'mensagem': 'sucesso',
'erros' : {},
'fones' : {},
'clean' : (),
}
'erros': {},
'fones': {},
'clean': (),
}
# valida e salva um formulario por vez
for form in forms:
@ -199,8 +199,8 @@ def categoria_contatos(request, id_diagnostico):
for form_telefones in form.telefones.forms:
if not form_telefones.is_valid():
if (form_telefones.fields['id'].initial is not None
and form_telefones.fields['tipo'].initial == 'I'
and form_telefones.fields['numero'].initial is None):
and form_telefones.fields['tipo'].initial == 'I'
and form_telefones.fields['numero'].initial is None):
if Telefone.objects.filter(pk=form_telefones.fields['id'].initial).exists():
Telefone.objects.get(pk=form_telefones.fields['id'].initial).delete()
if not resposta['fones'].has_key(form.prefix):
@ -251,31 +251,31 @@ def diagnostico_pdf(request, id_diagnostico):
schema.value = data
schemas.append(schema)
schemas_by_categoria.append((categoria,schemas))
schemas_by_categoria.append((categoria, schemas))
context = RequestContext(request, {
'pagesize':'A4',
'pagesize': 'A4',
'casa_legislativa': casa_legislativa,
'funcionarios': funcionarios,
'diagnostico': diagnostico,
'schemas_by_categoria': schemas_by_categoria,
})
})
return render_to_pdf('diagnosticos/diagnostico_pdf.html', context)
#return render_to_response('diagnosticos/diagnostico_pdf.html', context)
# return render_to_response('diagnosticos/diagnostico_pdf.html', context)
def graficos(request):
categorias = Categoria.objects.all()
sel_categoria = int(request.REQUEST.get("categoria","3"))
sel_categoria = int(request.REQUEST.get("categoria", "3"))
perguntas = Pergunta.objects.filter(categoria=sel_categoria).all()
context = RequestContext(request, {
'categorias': categorias,
'sel_categoria': sel_categoria,
'perguntas': perguntas,
})
})
return render_to_response('diagnosticos/graficos.html',
context)
@ -337,7 +337,7 @@ def municipios_diagnosticados(self):
for d in Diagnostico.objects.all():
m = d.casa_legislativa.municipio
municipio = {'nome': d.casa_legislativa.nome + ', ' + m.uf.sigla, 'lat': str(m.latitude), 'lng': str(m.longitude), 'inicio': d.data_visita_inicio,
'fim': d.data_visita_fim, 'equipe': "<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)
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 sigi.apps.diagnosticos.models import Escolha
class EavCheckboxSelectMultiple(CheckboxSelectMultiple):
def render(self, name, value, attrs=None, choices=()):
if value is None: value = []
if value is None:
value = []
final_attrs = self.build_attrs(attrs, name=name)
output = [u'<ul>']
str_values = set([force_unicode(v) for v in value])
@ -29,7 +32,9 @@ class EavCheckboxSelectMultiple(CheckboxSelectMultiple):
output.append(u'</ul>')
return mark_safe(u'\n'.join(output))
class EavRadioFieldRenderer(RadioFieldRenderer):
def __iter__(self):
for i, choice in enumerate(self.choices):
final_attrs = self.attrs.copy()
@ -54,8 +59,8 @@ class EavRadioFieldRenderer(RadioFieldRenderer):
if schema_to_open:
final_attrs['schema_to_open'] = schema_to_open.name
return RadioInput(self.name, self.value,final_attrs, choice, idx)
return RadioInput(self.name, self.value, final_attrs, choice, idx)
class EavRadioSelect(RadioSelect):
renderer = EavRadioFieldRenderer

5
sigi/apps/financeiro/admin.py

@ -2,10 +2,11 @@
from django.contrib import admin
from sigi.apps.financeiro.models import Desembolso
class DesembolsoAdmin(admin.ModelAdmin):
list_display = ('projeto', 'descricao', 'data', 'valor_reais', 'valor_dolar',)
fields = ('projeto', 'descricao', 'data', 'valor_reais', 'valor_dolar', )
fields = ('projeto', 'descricao', 'data', 'valor_reais', 'valor_dolar', )
list_filter = ('projeto',)
date_hierarchy = 'data'
admin.site.register(Desembolso, DesembolsoAdmin)
admin.site.register(Desembolso, DesembolsoAdmin)

2
sigi/apps/financeiro/forms.py

@ -1,3 +1,3 @@
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 sigi.apps.convenios.models import Projeto
class Desembolso(models.Model):
projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto')
descricao = models.CharField(u'Descrição da despesa', max_length=100)
data = models.DateField(u'Data do desembolso')
valor_reais = models.DecimalField(u'Valor em R$', max_digits=18, decimal_places=2)
valor_dolar = models.DecimalField(u'Valor em US$', max_digits=18, decimal_places=2)
class Meta:
verbose_name = 'Desembolso'
verbose_name_plural = 'Desembolsos'
def __unicode__(self):
return u"%s (US$ %s)" % (self.descricao, self.valor_dolar)

12
sigi/apps/inventario/admin.py

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

6
sigi/apps/inventario/models.py

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

29
sigi/apps/mesas/admin.py

@ -1,25 +1,27 @@
# -*- coding: utf-8 -*-
from django.contrib import admin
from django.http import HttpResponse
from django.utils.html import escape
from django.utils.html import escape
from sigi.apps.mesas.models import (Legislatura, Coligacao, ComposicaoColigacao,
SessaoLegislativa, MesaDiretora, Cargo,
MembroMesaDiretora)
from sigi.apps.parlamentares.models import Mandato
class MandatoInline(admin.TabularInline):
model = Mandato
raw_id_fields = ['parlamentar',]
raw_id_fields = ['parlamentar', ]
class LegislaturaAdmin(admin.ModelAdmin):
date_hierarchy = 'data_inicio'
list_display = ('numero', 'casa_legislativa', 'uf', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares')
raw_id_fields = ('casa_legislativa',)
list_display_links = ('numero',)
list_filter = ('casa_legislativa__municipio__uf', )
search_fields = ('casa_legislativa__nome', 'casa_legislativa__municipio__nome' )
search_fields = ('casa_legislativa__nome', 'casa_legislativa__municipio__nome')
inlines = (MandatoInline,)
def uf(self, obj):
return obj.casa_legislativa.municipio.uf.sigla
uf.short_description = 'UF'
@ -28,21 +30,23 @@ class LegislaturaAdmin(admin.ModelAdmin):
def lookup_allowed(self, lookup, value):
return super(LegislaturaAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact']
def response_change(self, request, obj):
response = super(LegislaturaAdmin, self).response_change(request, obj)
response = super(LegislaturaAdmin, self).response_change(request, obj)
if request.POST.has_key("_popup"):
response = HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script>' % \
# escape() calls force_unicode.
(escape(obj.pk), escapejs(obj)))
response = HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script>' %
# escape() calls force_unicode.
(escape(obj.pk), escapejs(obj)))
return response
class ColigacaoAdmin(admin.ModelAdmin):
list_display = ('nome', 'legislatura', 'numero_votos')
list_display_links = ('nome',)
raw_id_fields = ('legislatura',)
search_fields = ('nome', 'legislatura__numero')
class ComposicaoColigacaoAdmin(admin.ModelAdmin):
list_display = ('coligacao', 'partido')
list_display_links = ('coligacao', 'partido')
@ -50,6 +54,7 @@ class ComposicaoColigacaoAdmin(admin.ModelAdmin):
raw_id_fields = ('coligacao', 'partido')
search_fields = ('coligacao__nome', 'partido__nome', 'partido__sigla')
class SessaoLegislativaAdmin(admin.ModelAdmin):
list_display = ('numero', 'mesa_diretora', 'legislatura', 'tipo',
'data_inicio', 'data_fim')
@ -68,16 +73,19 @@ class SessaoLegislativaAdmin(admin.ModelAdmin):
raw_id_fields = ('mesa_diretora', 'legislatura')
search_fields = ('numero', 'mesa_diretora__casa_legislativa__nome')
class CargoAdmin(admin.ModelAdmin):
list_display = ('descricao',)
search_fields = ('descricao',)
class MembroMesaDiretoraInline(admin.TabularInline):
model = MembroMesaDiretora
max_num = 11
extra = 4
raw_id_fields = ('parlamentar', 'cargo')
class MembroMesaDiretoraAdmin(admin.ModelAdmin):
list_display = ('parlamentar', 'cargo', 'mesa_diretora')
list_display_links = ('parlamentar',)
@ -87,6 +95,7 @@ class MembroMesaDiretoraAdmin(admin.ModelAdmin):
'parlamentar__nome_parlamentar',
'mesa_diretora__casa_legislativa__nome')
class MesaDiretoraAdmin(admin.ModelAdmin):
inlines = (MembroMesaDiretoraInline,)
raw_id_fields = ('casa_legislativa',)

15
sigi/apps/mesas/models.py

@ -2,6 +2,7 @@
from django.db import models
from sigi.apps.casas.models import CasaLegislativa
class Legislatura(models.Model):
casa_legislativa = models.ForeignKey(CasaLegislativa)
numero = models.PositiveSmallIntegerField(u'número legislatura')
@ -9,10 +10,10 @@ class Legislatura(models.Model):
data_fim = models.DateField(u'fim')
data_eleicao = models.DateField(u'data da eleição')
total_parlamentares = models.PositiveIntegerField(u"Total de parlamentares")
casa_legislativa.convenio_uf_filter = True
casa_legislativa.convenio_cl_tipo_filter = True
def meta(self):
unique_together = (('casa_legislativa', 'numero'))
ordering = ['casa_legislativa__municipio__uf__sigla', '-data_inicio']
@ -20,6 +21,7 @@ class Legislatura(models.Model):
def __unicode__(self):
return u"%sª legislatura da %s (%s-%s)" % (self.numero, self.casa_legislativa.__unicode__(), self.data_inicio.year, self.data_fim.year)
class Coligacao(models.Model):
nome = models.CharField(max_length=50)
legislatura = models.ForeignKey(Legislatura)
@ -37,6 +39,7 @@ class Coligacao(models.Model):
def __unicode__(self):
return self.nome
class ComposicaoColigacao(models.Model):
coligacao = models.ForeignKey(Coligacao, verbose_name='coligação')
partido = models.ForeignKey('parlamentares.Partido')
@ -48,6 +51,7 @@ class ComposicaoColigacao(models.Model):
def __unicode__(self):
return str(self.id)
class SessaoLegislativa(models.Model):
SESSAO_CHOICES = (
('O', 'Ordinária'),
@ -65,7 +69,7 @@ class SessaoLegislativa(models.Model):
default='O'
)
data_inicio = models.DateField(u'início')
data_fim = models.DateField('fim')
data_fim = models.DateField('fim')
data_inicio_intervalo = models.DateField(
u'início de intervalo',
blank=True,
@ -85,11 +89,12 @@ class SessaoLegislativa(models.Model):
def __unicode__(self):
return str(self.numero)
class MesaDiretora(models.Model):
casa_legislativa = models.ForeignKey(
'casas.CasaLegislativa',
verbose_name='Casa Legislativa'
)
)
class Meta:
verbose_name = 'Mesa Diretora'
@ -98,6 +103,7 @@ class MesaDiretora(models.Model):
def __unicode__(self):
return 'Mesa Diretora da %s' % unicode(self.casa_legislativa)
class Cargo(models.Model):
descricao = models.CharField(u'descrição', max_length=30)
@ -107,6 +113,7 @@ class Cargo(models.Model):
def __unicode__(self):
return self.descricao
class MembroMesaDiretora(models.Model):
parlamentar = models.ForeignKey('parlamentares.Parlamentar')
cargo = models.ForeignKey(Cargo)

38
sigi/apps/metas/admin.py

@ -2,47 +2,49 @@
from django.contrib import admin
from sigi.apps.metas.models import Meta, PlanoDiretor
class MetaAdmin(admin.ModelAdmin):
list_display = ('projeto', 'titulo', 'data_inicio', 'data_fim', 'valor_meta', 'valor_executado', 'percentual_concluido',)
fields = ('projeto', 'titulo', 'descricao', 'data_inicio', 'data_fim', 'algoritmo', 'valor_meta',)
list_filter = ('projeto',)
class PlanoDiretorAdmin(admin.ModelAdmin):
list_display = ('projeto', 'casa_legislativa', 'get_uf', 'status', 'data_entrega', 'data_implantacao',)
fields = ('projeto', 'casa_legislativa', 'status', 'data_entrega', 'data_implantacao',)
raw_id_fields = ('casa_legislativa',)
list_filter = ('projeto', 'status', 'casa_legislativa', 'casa_legislativa__municipio__uf__nome')
def get_uf(self, obj):
return obj.casa_legislativa.municipio.uf.nome
get_uf.short_description = u"UF"
get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome'
def lookup_allowed(self, lookup, value):
return super(PlanoDiretorAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact']
def changelist_view(self, request, extra_context=None):
import re
request.GET._mutable=True
request.GET._mutable = True
if 'data_entrega__gte' in request.GET:
value = request.GET.get('data_entrega__gte','')
value = request.GET.get('data_entrega__gte', '')
if value == '':
del request.GET['data_entrega__gte']
elif re.match('^\d*$', value): # Year only
request.GET['data_entrega__gte'] = "%s-01-01" % value #Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month
request.GET['data_entrega__gte'] = '%s-01' % value #Complete with 1st day of month
elif re.match('^\d*$', value): # Year only
request.GET['data_entrega__gte'] = "%s-01-01" % value # Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month
request.GET['data_entrega__gte'] = '%s-01' % value # Complete with 1st day of month
if 'data_entrega__lte' in request.GET:
value = request.GET.get('data_entrega__lte','')
value = request.GET.get('data_entrega__lte', '')
if value == '':
del request.GET['data_entrega__lte']
elif re.match('^\d*$', value): # Year only
request.GET['data_entrega__lte'] = "%s-01-01" % value #Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month
request.GET['data_entrega__lte'] = '%s-01' % value #Complete with 1st day of month
request.GET._mutable=False
elif re.match('^\d*$', value): # Year only
request.GET['data_entrega__lte'] = "%s-01-01" % value # Complete with january 1st
elif re.match('^\d*\D\d*$', value): # Year and month
request.GET['data_entrega__lte'] = '%s-01' % value # Complete with 1st day of month
request.GET._mutable = False
return super(PlanoDiretorAdmin, self).changelist_view(request, extra_context)
admin.site.register(PlanoDiretor, PlanoDiretorAdmin)
admin.site.register(PlanoDiretor, PlanoDiretorAdmin)

2
sigi/apps/metas/forms.py

@ -1,3 +1,3 @@
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 sigi.apps.metas.views import gera_map_data_file
class Command(BaseCommand):
help = u'Gera arquivo de dados de plotagem do mapa de atuação do Interlegis.'
def handle(self, *args, **options):
result = gera_map_data_file(cronjob=True)
self.stdout.write(result+"\n")
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.financeiro.models import Desembolso
class Meta(models.Model):
ALGORITMO_CHOICES = (
('SUM_GASTOS', u'Soma dos desembolsos'),
@ -15,21 +16,21 @@ class Meta(models.Model):
('COUNT_PDIR', u'Quantidade de planos diretores'),
('COUNT_CONV', u'Quantidade de casas conveniadas'),
)
projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto', help_text=u'Projeto ao qual a meta se refere')
projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto', help_text=u'Projeto ao qual a meta se refere')
titulo = models.CharField(u'Título', max_length=40, help_text=u'Título da meta que aparecerá no dashboard')
descricao = models.TextField(u'Descrição')
data_inicio = models.DateField(u'Data inicial', help_text=u'Início do período de cômputo da meta')
data_fim = models.DateField(u'Data final', help_text=u'Prazo final para cumprimento da meta')
algoritmo = models.CharField(u'Algoritmo de cálculo', max_length=10, choices=ALGORITMO_CHOICES)
valor_meta = models.FloatField(u'Valor da meta', help_text=u'Valor que deve ser atingido até o prazo final da meta')
class Meta:
verbose_name = 'Meta BID'
verbose_name_plural = 'Metas BID'
def __unicode__(self):
return self.titulo;
return self.titulo
@property
def valor_executado(self):
"""
@ -42,11 +43,11 @@ class Meta(models.Model):
except:
valor = 0.0
return valor
@property
def percentual_concluido(self):
return round(float(self.valor_executado) / float(self.valor_meta) * 100.0, 2)
@property
def valor_desejado(self):
total_dias = (self.data_fim - self.data_inicio).days + 1
@ -56,57 +57,56 @@ class Meta(models.Model):
@property
def percentual_desejado_low(self):
return (self.valor_desejado / self.valor_meta) - 0.05 # 5% abaixo do desejado
return (self.valor_desejado / self.valor_meta) - 0.05 # 5% abaixo do desejado
@property
def percentual_desejado_high(self):
return (self.valor_desejado / self.valor_meta) + 0.05 # 5% acima do desejado
return (self.valor_desejado / self.valor_meta) + 0.05 # 5% acima do desejado
@property
def saude(self):
percentual_concluido = self.percentual_concluido / 100.0
percentual_concluido = self.percentual_concluido / 100.0
if percentual_concluido >= 1:
return 'A2BBED' # Blue
return 'A2BBED' # Blue
if percentual_concluido > self.percentual_desejado_high:
return '89D7AF' # Green
return '89D7AF' # Green
if percentual_concluido > self.percentual_desejado_low:
return 'FFDB6E' # Orange
return 'E74A69' # Red
return 'FFDB6E' # Orange
return 'E74A69' # Red
def sum_gastos(self):
valor = Desembolso.objects.filter(projeto=self.projeto, data__gte=self.data_inicio, data__lte=self.data_fim) \
.aggregate(total_dolar=models.Sum('valor_dolar'))
valor = valor['total_dolar']
.aggregate(total_dolar=models.Sum('valor_dolar'))
valor = valor['total_dolar']
return valor
def count_equi(self):
valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', equipada=True, projeto__pk=3, data_termo_aceite__gte=
self.data_inicio, data_termo_aceite__lte=self.data_fim).exclude(data_termo_aceite=None).count()
valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', equipada=True, projeto__pk=3, data_termo_aceite__gte=self.data_inicio, data_termo_aceite__lte=self.data_fim).exclude(data_termo_aceite=None).count()
return valor
def count_ader(self):
valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', projeto=self.projeto, data_adesao__gte=self.data_inicio,
data_adesao__lte=self.data_fim).exclude(data_adesao=None).count()
data_adesao__lte=self.data_fim).exclude(data_adesao=None).count()
return valor
def count_diag(self):
valor = Diagnostico.objects.filter(data_visita_inicio__gte=self.data_inicio, data_visita_inicio__lte=self.data_fim,
publicado=True).count()
publicado=True).count()
return valor
def count_pdir(self):
valor = PlanoDiretor.objects.filter(projeto=self.projeto, data_entrega__gte=self.data_inicio,
data_entrega__lte=self.data_fim).count()
data_entrega__lte=self.data_fim).count()
return valor
def count_conv(self):
valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', projeto=self.projeto, data_retorno_assinatura__gte=
self.data_inicio, data_retorno_assinatura__lte=self.data_fim).exclude(data_retorno_assinatura=None).count()
valor = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM', projeto=self.projeto, data_retorno_assinatura__gte=self.data_inicio, data_retorno_assinatura__lte=self.data_fim).exclude(data_retorno_assinatura=None).count()
return valor
class PlanoDiretor(models.Model):
STATUS_CHOICE = (
('E', u'Entregue'),
@ -122,7 +122,6 @@ class PlanoDiretor(models.Model):
class Meta:
verbose_name = 'Plano Diretor'
verbose_name_plural = 'Planos Diretores'
def __unicode__(self):
return self.casa_legislativa.nome ;
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.filter(name='map_desc_serv')
def descricao_servicos(value):
if not isinstance(value, CasaLegislativa):
return ""
result = ""
for sv in value.servico_set.all():
result += u'<li>%s ativado em %s</li>' % (sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y'))
for cv in value.convenio_set.all():
if (cv.data_retorno_assinatura is None) and (cv.equipada and cv.data_termo_aceite is not None):
result += u"<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'))
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'))
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
else u"<< sem data inicial >>",
else u"<< sem data inicial >>",
dg.data_visita_fim.strftime('%d/%m/%Y') if dg.data_visita_fim
else u"<< sem data final >>")
return mark_safe(result)
descricao_servicos.is_safe = True

78
sigi/apps/metas/views.py

@ -4,7 +4,7 @@ import os
from django.http import HttpResponse
from django.core.exceptions import PermissionDenied
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from django.utils.datastructures import SortedDict
from django.shortcuts import render_to_response
from django.template import RequestContext
@ -24,8 +24,8 @@ from sigi.apps.metas.templatetags.mapa_tags import descricao_servicos
JSON_FILE_NAME = os.path.join(MEDIA_ROOT, 'apps/metas/map_data.json')
@login_required
@login_required
def dashboard(request):
if request.user.groups.filter(name__in=['SPDT-Servidores', 'SSPLF']).count() <= 0:
raise PermissionDenied
@ -56,6 +56,7 @@ def dashboard(request):
extra_context = {'desembolsos': matriz, 'desembolsos_max': desembolsos_max, 'meses': meses, 'colors': ','.join(colors[:len(matriz)])}
return render_to_response('metas/dashboard.html', extra_context, context_instance=RequestContext(request))
def mapa(request):
"""
Mostra o mapa com filtros carregados com valores default
@ -66,12 +67,12 @@ def mapa(request):
servico_choices = TipoServico.objects.all()
projeto_choices = Projeto.objects.all()
seit = [ ts.sigla for ts in servico_choices]
convenios = ['PML'] # Apenas o ultimo #hardcoded #fixme
equipadas = [] #[p.sigla for p in projeto_choices]
diagnosticos = ['P'] # choices: ["A", "P"]
regioes = [r[0] for r in regiao_choices]
estados = []
seit = [ts.sigla for ts in servico_choices]
convenios = ['PML'] # Apenas o ultimo #hardcoded #fixme
equipadas = [] # [p.sigla for p in projeto_choices]
diagnosticos = ['P'] # choices: ["A", "P"]
regioes = [r[0] for r in regiao_choices]
estados = []
extra_context = {
'seit': seit,
@ -89,7 +90,7 @@ def mapa(request):
return render_to_response('metas/mapa.html', extra_context, context_instance=RequestContext(request))
@cache_page(1800) # Cache de 30min
@cache_page(1800) # Cache de 30min
def map_data(request):
"""
Retorna json com todos os dados dos municípios que têm relação com o Interlegis
@ -105,6 +106,7 @@ def map_data(request):
return HttpResponse(json, mimetype="application/json")
def map_search(request):
response = {'result': 'NOT_FOUND'}
if 'q' in request.GET:
@ -119,7 +121,8 @@ def map_search(request):
return HttpResponse(simplejson.dumps(response), mimetype="application/json")
@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos)
@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos)
def map_sum(request):
# Filtrar Casas de acordo com os parâmetros
param = get_params(request)
@ -154,7 +157,6 @@ def map_sum(request):
'convenios': tot_projetos.copy(), 'equipadas': tot_projetos.copy(),
'diagnosticos': tot_diagnosticos.copy()}
# Processar as casas filtradas
for casa in casas.distinct():
uf = casa.municipio.uf
@ -192,7 +194,8 @@ def map_sum(request):
}
return render_to_pdf('metas/map_sum.html', extra_context)
@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos)
@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos)
def map_list(request):
# Filtrar Casas de acordo com os parâmetros
param = get_params(request)
@ -213,24 +216,24 @@ def map_list(request):
for pr in Projeto.objects.all():
cnv[pr.id] = pr.sigla
writer.writerow([u'codigo_ibge', u'nome_casa', u'municipio', u'uf', u'regiao',] + [x for x in srv.values()] +
reduce(lambda x,y: x+y, [['conveniada ao %s' % x, 'equipada por %s' % x] for x in cnv.values()]))
writer.writerow([u'codigo_ibge', u'nome_casa', u'municipio', u'uf', u'regiao', ] + [x for x in srv.values()] +
reduce(lambda x, y: x + y, [['conveniada ao %s' % x, 'equipada por %s' % x] for x in cnv.values()]))
for casa in casas:
row = [casa.municipio.codigo_ibge, casa.nome, casa.municipio.nome, casa.municipio.uf.sigla,
casa.municipio.uf.get_regiao_display(),]
casa.municipio.uf.get_regiao_display(), ]
for id in srv.keys():
try:
sv = casa.servico_set.get(tipo_servico__id=id)
row += [sv.data_ativacao,]
row += [sv.data_ativacao, ]
except:
row += [None,]
row += [None, ]
for id in cnv.keys():
try:
cv = casa.convenio_set.get(projeto__id=id)
row += [cv.data_retorno_assinatura, cv.data_termo_aceite if cv.equipada else None,]
row += [cv.data_retorno_assinatura, cv.data_termo_aceite if cv.equipada else None, ]
except:
row += [None, None,]
row += [None, None, ]
writer.writerow(row)
return response
@ -245,21 +248,22 @@ def map_list(request):
def get_params(request):
''' Pegar parâmetros da pesquisa '''
return {
'seit' : request.GET.getlist('seit'),
'convenios' : request.GET.getlist('convenios'),
'equipadas' : request.GET.getlist('equipadas'),
'diagnosticos' : request.GET.getlist('diagnosticos'),
'regioes' : request.GET.getlist('regioes'),
'estados' : request.GET.getlist('estados'),
'seit': request.GET.getlist('seit'),
'convenios': request.GET.getlist('convenios'),
'equipadas': request.GET.getlist('equipadas'),
'diagnosticos': request.GET.getlist('diagnosticos'),
'regioes': request.GET.getlist('regioes'),
'estados': request.GET.getlist('estados'),
}
def filtrar_casas(seit, convenios, equipadas, regioes, estados, diagnosticos):
''' Filtrar Casas que atendem aos parâmetros de pesquisa '''
qServico = Q(servico__tipo_servico__sigla__in=seit)
qServico = Q(servico__tipo_servico__sigla__in=seit)
qConvenio = Q(convenio__projeto__sigla__in=convenios)
qEquipada = Q(convenio__projeto__sigla__in=equipadas, convenio__equipada=True)
qRegiao = Q(municipio__uf__regiao__in=regioes)
qEstado = Q(municipio__uf__sigla__in=estados)
qRegiao = Q(municipio__uf__regiao__in=regioes)
qEstado = Q(municipio__uf__sigla__in=estados)
if diagnosticos:
qDiagnostico = Q(diagnostico__publicado__in=[p == 'P' for p in diagnosticos])
@ -270,6 +274,7 @@ def filtrar_casas(seit, convenios, equipadas, regioes, estados, diagnosticos):
return casas
def gera_map_data_file(cronjob=False):
''' Criar um arquivo json em {settings.MEDIA_ROOT}/apps/metas/ com o nome de map_data.json
Este arquivo será consumido pela view de dados de mapa.
@ -284,7 +289,8 @@ def gera_map_data_file(cronjob=False):
for c in CasaLegislativa.objects.select_related('servico', 'convenio', 'diagnostico').all().distinct():
if c.servico_set.count() == 0 and c.convenio_set.count() == 0 and c.diagnostico_set.count() == 0:
continue; # Salta essa casa, pois ela não tem nada com o Interlegis
continue
# Salta essa casa, pois ela não tem nada com o Interlegis
if not casas.has_key(c.pk):
casa = {
@ -303,8 +309,8 @@ def gera_map_data_file(cronjob=False):
for sv in c.servico_set.all():
casa['info'].append(u"%s ativado em %s <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
u'<sem data de ativação>', sv.url, STATIC_URL))
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))
casa['seit'].append(sv.tipo_servico.sigla)
for cv in c.convenio_set.all():
@ -322,8 +328,8 @@ def gera_map_data_file(cronjob=False):
for dg in c.diagnostico_set.all():
casa['diagnosticos'].append('P' if dg.publicado else 'A')
casa['info'].append(u'Diagnosticada no período de %s a %s' % (dg.data_visita_inicio.strftime('%d/%m/%Y') if
dg.data_visita_inicio is not None else u"<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_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>"))
casa['info'] = "<br/>".join(casa['info'])
@ -335,11 +341,11 @@ def gera_map_data_file(cronjob=False):
file = open(JSON_FILE_NAME, 'w')
file.write(json_data)
file.close()
except Exception as e: # A gravação não foi bem sucedida ...
if cronjob: # ... o chamador deseja a mensagem de erro
except Exception as e: # A gravação não foi bem sucedida ...
if cronjob: # ... o chamador deseja a mensagem de erro
return str(e)
else:
pass # ... ou os dados poderão ser usados de qualquer forma
pass # ... ou os dados poderão ser usados de qualquer forma
if cronjob:
return "Arquivo %s gerado em %d segundos" % (JSON_FILE_NAME, time.time() - start)

4
sigi/apps/ocorrencias/admin.py

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

18
sigi/apps/ocorrencias/models.py

@ -3,23 +3,23 @@ from django.db import models
class Categoria(models.Model):
nome= models.CharField(u"Nome Categoria", max_length=50)
nome = models.CharField(u"Nome Categoria", max_length=50)
descricao = models.TextField(u'descrição', blank=True, null=True)
setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=u"Setor responsável")
class Meta:
verbose_name, verbose_name_plural = u'Categoria', u'Categorias'
verbose_name, verbose_name_plural = u'Categoria', u'Categorias'
def __unicode__(self):
return self.nome
class TipoContato(models.Model):
descricao = models.CharField(u"Descrição", max_length=50)
class Meta:
verbose_name, verbose_name_plural = u"Tipo de contato", u"Tipos de contato"
def __unicode__(self):
return self.descricao
@ -61,7 +61,7 @@ class Ocorrencia(models.Model):
class Meta:
verbose_name, verbose_name_plural = u'ocorrência', u'ocorrências'
ordering = ['prioridade', 'data_modificacao', 'data_criacao', ]
def __unicode__(self):
return u"%(casa_legislativa)s: %(assunto)s" % {'assunto': self.assunto, 'casa_legislativa': self.casa_legislativa}
@ -79,11 +79,11 @@ class Anexo(models.Model):
ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência')
arquivo = models.FileField(u'Arquivo anexado', upload_to='apps/ocorrencia/anexo/arquivo',)
descricao = models.CharField(u'descrição do anexo', max_length='70')
data_pub = models.DateTimeField( u'data da publicação do anexo', null=True, blank=True, auto_now_add=True)
data_pub = models.DateTimeField(u'data da publicação do anexo', null=True, blank=True, auto_now_add=True)
class Meta:
ordering = ('-data_pub',)
verbose_name, verbose_name_plural = u'Anexo', u'Anexos'
verbose_name, verbose_name_plural = u'Anexo', u'Anexos'
def __unicode__(self):
return u"%(arquivo_name)s: %(descricao)s" % {'arquivo_name': self.arquivo.name, 'descricao': self.descricao}

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.utils.alphabetic_filter import AlphabeticFilter
class MandatosInline(admin.TabularInline):
model = Mandato
extra = 1
raw_id_fields = ('legislatura', 'partido')
class TelefonesInline(generic.GenericTabularInline):
model = Telefone
extra = 2
class PartidoAdmin(admin.ModelAdmin):
list_display = ('nome', 'sigla')
list_display_links = ('nome', 'sigla')
@ -26,8 +29,8 @@ class PartidoAdmin(admin.ModelAdmin):
class ParlamentarNomeCompletoFilter(AlphabeticFilter):
title = 'Nome Completo do Parlamentar'
parameter_name = 'nome_completo'
title = 'Nome Completo do Parlamentar'
parameter_name = 'nome_completo'
class ParlamentarAdmin(admin.ModelAdmin):
@ -35,14 +38,14 @@ class ParlamentarAdmin(admin.ModelAdmin):
list_display = ('nome_completo', 'nome_parlamentar', 'sexo')
list_display_links = ('nome_completo', 'nome_parlamentar')
list_filter = ('nome_parlamentar', ParlamentarNomeCompletoFilter)
actions = ['adiciona_parlamentar',]
actions = ['adiciona_parlamentar', ]
fieldsets = (
(None, {
'fields': ('nome_completo', 'nome_parlamentar', 'sexo'),
}),
# ('Endereço', {
# 'fields': ('logradouro', 'bairro', 'municipio', 'cep'),
# }),
# ('Endereço', {
# 'fields': ('logradouro', 'bairro', 'municipio', 'cep'),
# }),
('Outras informações', {
'fields': ('data_nascimento', 'email', 'pagina_web', 'foto'),
}),
@ -51,23 +54,23 @@ class ParlamentarAdmin(admin.ModelAdmin):
# raw_id_fields = ('municipio',)
search_fields = ('nome_completo', 'nome_parlamentar', 'email',
'pagina_web',)
def adiciona_parlamentar(self, request, queryset):
if request.session.has_key('carrinho_parlametar'):
q1 = len(request.session['carrinho_parlamentar'])
else:
q1 = 0
adicionar_parlamentar_carrinho(request,queryset=queryset)
q1 = 0
adicionar_parlamentar_carrinho(request, queryset=queryset)
q2 = len(request.session['carrinho_parlamentar'])
quant = q2 - q1
if quant:
self.message_user(request,"%s Parlamentares adicionados no carrinho" % (quant) )
self.message_user(request, "%s Parlamentares adicionados no carrinho" % (quant))
else:
self.message_user(request,"Os parlamentares selecionadas já foram adicionadas anteriormente" )
self.message_user(request, "Os parlamentares selecionadas já foram adicionadas anteriormente")
return HttpResponseRedirect('.')
adiciona_parlamentar.short_description = u"Armazenar parlamentar no carrinho para exportar"
class MandatoAdmin(admin.ModelAdmin):
list_display = ('parlamentar', 'legislatura', 'partido',

1
sigi/apps/parlamentares/models.py

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

77
sigi/apps/parlamentares/views.py

@ -18,9 +18,9 @@ from sigi.apps.parlamentares.reports import ParlamentaresLabels
from geraldo.generators import PDFGenerator
def adicionar_parlamentar_carrinho(request,queryset=None,id=None):
def adicionar_parlamentar_carrinho(request, queryset=None, id=None):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
ids_selecionados = request.POST.getlist('_selected_action')
if not request.session.has_key('carrinho_parlametar'):
request.session['carrinho_parlamentar'] = ids_selecionados
else:
@ -28,17 +28,17 @@ def adicionar_parlamentar_carrinho(request,queryset=None,id=None):
# Verifica se id já não está adicionado
for id in ids_selecionados:
if not id in lista:
lista.append(id)
lista.append(id)
request.session['carrinho_parlamentar'] = lista
@csrf_protect
@csrf_protect
def visualizar_carrinho(request):
qs = carrinhoOrGet_for_qs(request)
paginator = Paginator(qs, 100)
# Make sure page request is an int. If not, deliver first page.
# Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página.
try:
@ -51,52 +51,52 @@ def visualizar_carrinho(request):
paginas = paginator.page(page)
except (EmptyPage, InvalidPage):
paginas = paginator.page(paginator.num_pages)
carrinhoIsEmpty = not(request.session.has_key('carrinho_parlamentares'))
return render_to_response('parlamentares/carrinho.html',
{'MEDIA_URL':settings.MEDIA_URL,
'carIsEmpty':carrinhoIsEmpty,
'paginas':paginas,
'query_str':'?'+request.META['QUERY_STRING']},
{'MEDIA_URL': settings.MEDIA_URL,
'carIsEmpty': carrinhoIsEmpty,
'paginas': paginas,
'query_str': '?' + request.META['QUERY_STRING']},
context_instance=RequestContext(request))
def carrinhoOrGet_for_qs(request):
"""
Verifica se existe parlamentares na sessão se não verifica get e retorna qs correspondente.
"""
"""
if request.session.has_key('carrinho_parlamentar'):
ids = request.session['carrinho_parlamentar']
qs = Parlamentar.objects.filter(pk__in=ids)
else:
qs = Parlamentar.objects.all()
if request.GET:
qs = get_for_qs(request.GET,qs)
qs = get_for_qs(request.GET, qs)
return qs
def query_ordena(qs,o,ot):
def query_ordena(qs, o, ot):
list_display = ('nome_completo',)
aux = list_display[(int(o)-1)]
if ot =='asc':
aux = list_display[(int(o) - 1)]
if ot == 'asc':
qs = qs.order_by(aux)
else:
qs = qs.order_by("-"+aux)
qs = qs.order_by("-" + aux)
return qs
def get_for_qs(get,qs):
def get_for_qs(get, qs):
"""
Verifica atributos do GET e retorna queryset correspondente
"""
kwargs = {}
for k,v in get.iteritems():
if not (k == 'page' or k == 'pop' or k == 'q'):
for k, v in get.iteritems():
if not (k == 'page' or k == 'pop' or k == 'q'):
if not k == 'o':
if k == "ot":
qs = query_ordena(qs,get["o"],get["ot"])
qs = query_ordena(qs, get["o"], get["ot"])
else:
kwargs[str(k)] = v
qs = qs.filter(**kwargs)
@ -108,35 +108,34 @@ def deleta_itens_carrinho(request):
Deleta itens selecionados do carrinho
"""
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
if request.session.has_key('carrinho_parlamentar'):
lista = request.session['carrinho_parlamentar']
ids_selecionados = request.POST.getlist('_selected_action')
if request.session.has_key('carrinho_parlamentar'):
lista = request.session['carrinho_parlamentar']
for item in ids_selecionados:
lista.remove(item)
if lista:
if lista:
request.session['carrinho_parlamentar'] = lista
else:
del lista;
del request.session['carrinho_parlamentar']
del lista
del request.session['carrinho_parlamentar']
return HttpResponseRedirect('.')
def labels_report(request, id=None, formato='3x9_etiqueta'):
""" TODO: adicionar suporte para resultado de pesquisa do admin.
"""
"""
if request.POST:
if request.POST.has_key('tipo_etiqueta'):
tipo = request.POST['tipo_etiqueta']
if id:
qs = Parlamentar.objects.filter(pk=id)
else:
else:
qs = carrinhoOrGet_for_qs(request)
if not qs:
return HttpResponseRedirect('../')
@ -145,4 +144,4 @@ def labels_report(request, id=None, formato='3x9_etiqueta'):
report = ParlamentaresLabels(queryset=qs, formato=formato)
report.generate_by(PDFGenerator, filename=response)
return response
return response

66
sigi/apps/relatorios/reports.py

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

55
sigi/apps/servicos/admin.py

@ -17,6 +17,7 @@ class LogServicoInline(admin.StackedInline):
class ServicoFormAdmin(ModelForm):
class Meta:
model = Servico
fields = '__all__'
@ -50,21 +51,21 @@ class TipoServicoAdmin(admin.ModelAdmin):
class ServicoAdmin(admin.ModelAdmin):
form = ServicoFormAdmin
actions = ['calcular_data_uso',]
actions = ['calcular_data_uso', ]
list_display = ('casa_legislativa', 'get_codigo_interlegis', 'get_uf', 'tipo_servico', 'hospedagem_interlegis',
'data_ativacao', 'data_desativacao', 'getUrl', 'data_ultimo_uso', 'get_link_erro')
fieldsets = (( None, {
'fields': ('casa_legislativa', 'data_ativacao',)
}),
( 'Serviço', {
'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),)
}),
( 'Contatos', {
'fields': ('contato_tecnico', 'contato_administrativo',)
}),
( 'Alterações', {
'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',)
}))
fieldsets = ((None, {
'fields': ('casa_legislativa', 'data_ativacao',)
}),
('Serviço', {
'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),)
}),
('Contatos', {
'fields': ('contato_tecnico', 'contato_administrativo',)
}),
('Alterações', {
'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',)
}))
readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao')
list_filter = ('tipo_servico', 'hospedagem_interlegis', 'data_ultimo_uso', 'casa_legislativa__municipio__uf', )
list_display_links = []
@ -102,7 +103,7 @@ class ServicoAdmin(admin.ModelAdmin):
def calcular_data_uso(self, request, queryset):
for servico in queryset:
servico.atualiza_data_uso()
self.message_user(request, "Atualização concluída. Os sites que não responderam foram deixados com a data em branco" )
self.message_user(request, "Atualização concluída. Os sites que não responderam foram deixados com a data em branco")
return HttpResponseRedirect('.')
calcular_data_uso.short_description = u"Atualizar a data do último uso do(s) serviço(s)"
@ -110,15 +111,14 @@ class ServicoAdmin(admin.ModelAdmin):
from django.utils.datastructures import SortedDict
actions = [self.get_action(action) for action in self.actions]
actions = filter(None, actions)
actions.sort(lambda a,b: cmp(a[2].lower(), b[2].lower()))
actions = SortedDict([ (name, (func, name, desc)) for func, name, desc in actions ])
actions.sort(lambda a, b: cmp(a[2].lower(), b[2].lower()))
actions = SortedDict([(name, (func, name, desc)) for func, name, desc in actions])
return actions
def lookup_allowed(self, lookup, value):
return super(ServicoAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact']
def add_view(self, request, form_url='', extra_context=None):
id_casa = request.GET.get('id_casa', None)
@ -154,7 +154,7 @@ class ServicoAdmin(admin.ModelAdmin):
return super(ServicoAdmin, self).response_change(request, obj)
def save_form(self, request, form, change):
obj = super( ServicoAdmin, self).save_form(request, form, change)
obj = super(ServicoAdmin, self).save_form(request, form, change)
if not change:
id_casa = request.GET.get('id_casa', None)
@ -168,7 +168,7 @@ class ServicoAdmin(admin.ModelAdmin):
class ContatosInline(FuncionariosInline):
can_delete = False # Equipe do SEIT não pode excluir pessoas de contato
can_delete = False # Equipe do SEIT não pode excluir pessoas de contato
class CasaAtendidaAdmin(admin.ModelAdmin):
@ -176,15 +176,14 @@ class CasaAtendidaAdmin(admin.ModelAdmin):
list_display = ('codigo_interlegis', 'nome', 'get_servicos',)
ordering = ['nome']
fieldsets = (
('Casa legislativa', {
'fields': (('codigo_interlegis', 'nome'), ('logradouro', 'bairro', 'municipio', 'cep'), ('email', 'pagina_web'))
})
,)
readonly_fields = ('nome', 'logradouro', 'bairro', 'municipio', 'cep')
('Casa legislativa', {
'fields': (('codigo_interlegis', 'nome'), ('logradouro', 'bairro', 'municipio', 'cep'), ('email', 'pagina_web'))
}),)
readonly_fields = ('nome', 'logradouro', 'bairro', 'municipio', 'cep')
inlines = (ContatosInline,)
list_filter = ('tipo', 'servico__tipo_servico', 'municipio__uf__nome',
'servico__casa_legislativa__convenio__projeto')
search_fields = ('search_text','cnpj', 'bairro', 'logradouro',
search_fields = ('search_text', 'cnpj', 'bairro', 'logradouro',
'cep', 'municipio__nome', 'municipio__uf__nome',
'municipio__codigo_ibge', 'pagina_web', 'observacoes')
@ -192,7 +191,7 @@ class CasaAtendidaAdmin(admin.ModelAdmin):
result = []
for servico in obj.servico_set.all():
result.append(u"%s (%s). Contato: %s" % (servico.tipo_servico.nome, 'ativo' if servico.data_desativacao is None
else 'Desativado', servico.contato_administrativo.nome))
else 'Desativado', servico.contato_administrativo.nome))
return "<ul><li>" + "</li><li>".join(result) + "</li></ul>"
get_servicos.allow_tags = True
@ -213,10 +212,10 @@ class CasaAtendidaAdmin(admin.ModelAdmin):
return super(CasaAtendidaAdmin, self).change_view(request, object_id, extra_context=extra_context)
def has_add_permission(self, request):
return False # Nunca é permitido inserir uma nova Casa Legislativa por aqui
return False # Nunca é permitido inserir uma nova Casa Legislativa por aqui
def has_delete_permission(self, request, obj=None):
return False # Nunca deletar casas por aqui
return False # Nunca deletar casas por aqui
admin.site.register(Servico, ServicoAdmin)
admin.site.register(TipoServico, TipoServicoAdmin)

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

@ -24,12 +24,14 @@
from django.core.management.base import BaseCommand
from sigi.apps.servicos.models import Servico
class Command(BaseCommand):
help = u'Atualiza a informação de data de último serviço dos serviços SEIT hospedados no Interlegis.'
def handle(self, *args, **options):
verbosity = int(options['verbosity'])
queryset = Servico.objects.exclude(url="").exclude(tipo_servico__string_pesquisa="")
for obj in queryset:
for obj in queryset:
obj.atualiza_data_uso()
if ((verbosity == 1) and (obj.data_ultimo_uso is None)) or (verbosity > 1):
self.stdout.write(u"%s \t %s \t %s\n" % (obj.url, obj.data_ultimo_uso, obj.erro_atualizacao))
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 sigi.settings import DEFAULT_FROM_EMAIL
class TipoServico(models.Model):
email_help = u'''Use:<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)
sigla = models.CharField(u'Sigla', max_length='12')
string_pesquisa = models.CharField(u'String de pesquisa', blank=True, max_length=200,
help_text=u'Sufixo para pesquisa RSS para averiguar a data da última atualização do serviço')
template_email_ativa = models.TextField(u'Template de email de ativação', help_text = email_help, blank=True)
template_email_altera = models.TextField(u'Template de email de alteração', help_text = email_help, blank=True)
template_email_desativa = models.TextField(u'Template de email de desativação', help_text = email_help + u'<br/>{motivo} para incluir o motivo da desativação do serviço', blank=True)
help_text=u'Sufixo para pesquisa RSS para averiguar a data da última atualização do serviço')
template_email_ativa = models.TextField(u'Template de email de ativação', help_text=email_help, blank=True)
template_email_altera = models.TextField(u'Template de email de alteração', help_text=email_help, blank=True)
template_email_desativa = models.TextField(u'Template de email de desativação', help_text=email_help + u'<br/>{motivo} para incluir o motivo da desativação do serviço', blank=True)
@property
def qtde_casas_atendidas(self):
@ -27,7 +28,8 @@ class TipoServico(models.Model):
verbose_name_plural = u'Tipos de serviço'
def __unicode__(self):
return self.nome;
return self.nome
class Servico(models.Model):
casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=u'Casa legislativa')
@ -37,7 +39,7 @@ class Servico(models.Model):
url = models.URLField(u'URL do serviço', blank=True)
hospedagem_interlegis = models.BooleanField(u'Hospedagem no Interlegis?')
nome_servidor = models.CharField(u'Hospedado em', max_length=60, blank=True,
help_text=u'Se hospedado no Interlegis, informe o nome do servidor.<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)
senha_inicial = models.CharField(u'Senha inicial', max_length=33, blank=True)
data_ativacao = models.DateField(u'Data de ativação', default=date.today)
@ -45,9 +47,9 @@ class Servico(models.Model):
data_desativacao = models.DateField(u'Data de desativação', blank=True, null=True)
motivo_desativacao = models.TextField(u'Motivo da desativação', blank=True)
data_ultimo_uso = models.DateField(u'Data da última utilização', blank=True, null=True,
help_text=u'Data em que o serviço foi utilizado pela Casa Legislativa pela última vez<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,
help_text=u"Erro ocorrido na última tentativa de atualizar a data de último acesso")
help_text=u"Erro ocorrido na última tentativa de atualizar a data de último acesso")
# casa_legislativa.casa_uf_filter = True
@ -77,10 +79,10 @@ class Servico(models.Model):
import urllib2
from xml.dom.minidom import parseString
try: # Captura erros de conexão
try: # Tentar conxão sem proxy
try: # Captura erros de conexão
try: # Tentar conxão sem proxy
req = urllib2.urlopen(url=url, timeout=5)
except: # Tentar com proxy
except: # Tentar com proxy
proxy = urllib2.ProxyHandler()
opener = urllib2.build_opener(proxy)
req = opener.open(fullurl=url, timeout=5)
@ -102,7 +104,7 @@ class Servico(models.Model):
date_list = first_item.getElementsByTagName('dc:date')
date_item = date_list[0]
date_text = date_item.firstChild.nodeValue
self.data_ultimo_uso = date_text[:10] # Apenas YYYY-MM-DD
self.data_ultimo_uso = date_text[:10] # Apenas YYYY-MM-DD
self.erro_atualizacao = ""
self.save()
except Exception as e:
@ -138,7 +140,7 @@ class Servico(models.Model):
else:
# Salvar o Servico
super(Servico, self).save(*args, **kwargs)
return # sem enviar email
return # sem enviar email
# Prepara e envia o email
body = body.replace('{url}', self.url) \
@ -153,6 +155,7 @@ class Servico(models.Model):
return
class LogServico(models.Model):
servico = models.ForeignKey(Servico, verbose_name='Serviço')
descricao = models.CharField('Breve descrição da ação', max_length=60)
@ -166,18 +169,23 @@ class LogServico(models.Model):
verbose_name = 'Log do serviço'
verbose_name_plural = 'Logs do serviço'
class CasaAtendidaManager(models.Manager):
def get_queryset(self):
qs = super(CasaAtendidaManager, self).get_queryset()
qs = qs.exclude(codigo_interlegis='')
return qs
class CasaAtendida(CasaLegislativa):
class Meta:
proxy = True
verbose_name_plural = 'Casas atendidas'
objects = CasaAtendidaManager()
objects = CasaAtendidaManager()
class CasaManifesta(models.Model):
casa_legislativa = models.OneToOneField(CasaLegislativa)
@ -187,6 +195,7 @@ class CasaManifesta(models.Model):
cargo = models.CharField(u'Cargo do informante', max_length=100, blank=True)
email = models.EmailField(u'E-mail de contato', blank=True)
class ServicoManifesto(models.Model):
casa_manifesta = models.ForeignKey(CasaManifesta)
servico = models.ForeignKey(TipoServico)

10
sigi/apps/servicos/views.py

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
from django import forms
from django.http import HttpResponse
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from django.shortcuts import render_to_response, get_object_or_404
from django.db.models import Q
from sigi.apps.servicos.models import TipoServico, CasaAtendida, CasaManifesta, ServicoManifesto
@ -44,11 +44,12 @@ def municipios_atendidos(self, servico):
municipio = {'nome': casa.nome + ', ' + m.uf.sigla,
'lat': str(m.latitude),
'lng': str(m.longitude),
'servicos': "<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)
return HttpResponse(simplejson.dumps(municipios), mimetype="application/json")
class CasaManifestaProtoForm(forms.Form):
fieldsets = None
informante = forms.CharField(max_length=100, required=False)
@ -71,6 +72,7 @@ class CasaManifestaProtoForm(forms.Form):
result.append({'name': name, 'lines': field_lines},)
self.fieldsets = result
def casa_manifesta_view(request):
if 'casa_id' in request.GET:
casa_id = request.GET.get('casa_id')
@ -85,7 +87,7 @@ def casa_manifesta_view(request):
campos['possui_%s' % ts.pk] = forms.BooleanField(label=u'Possui o serviço de %s' % ts.nome, required=False)
campos['url_%s' % ts.pk] = forms.URLField(label=u'Informe a URL', required=False)
campos['hospedagem_interlegis_%s' % ts.pk] = forms.BooleanField(label=u'Serviço está hospedado no Interlegis', required=False)
fieldsets += ((ts.nome, ('possui_%s' % ts.pk, 'url_%s' % ts.pk, 'hospedagem_interlegis_%s' % ts.pk )),)
fieldsets += ((ts.nome, ('possui_%s' % ts.pk, 'url_%s' % ts.pk, 'hospedagem_interlegis_%s' % ts.pk)),)
CasaManifestaForm = type('', (CasaManifestaProtoForm,), campos)
@ -108,7 +110,7 @@ def casa_manifesta_view(request):
sm.hospedagem_interlegis = cmf.cleaned_data['hospedagem_interlegis_%s' % ts.pk]
sm.save()
thanks.append((ts.nome, u'Possui o serviço acessível em %s %s' % (sm.url, u'hospedado no Interlegis' if
sm.hospedagem_interlegis else '')))
sm.hospedagem_interlegis else '')))
else:
ServicoManifesto.objects.filter(casa_manifesta=cm, servico=ts).delete()
thanks.append((ts.nome, u'Não possui'))

41
sigi/apps/servidores/admin.py

@ -11,8 +11,8 @@ from sigi.apps.utils.alphabetic_filter import AlphabeticFilter
class FuncaoAdmin(admin.ModelAdmin):
form = FuncaoForm
list_display = ('servidor', 'funcao', 'cargo','inicio_funcao', 'fim_funcao')
list_filter = ('inicio_funcao', 'fim_funcao')
list_display = ('servidor', 'funcao', 'cargo', 'inicio_funcao', 'fim_funcao')
list_filter = ('inicio_funcao', 'fim_funcao')
search_fields = ('funcao', 'cargo', 'descricao',
'servidor__nome_completo', 'servidor__obs', 'servidor__apontamentos',
'servidor__user__email', 'servidor__user__first_name',
@ -22,7 +22,7 @@ class FuncaoAdmin(admin.ModelAdmin):
class FeriasAdmin(admin.ModelAdmin):
form = FeriasForm
list_display = ('servidor', 'inicio_ferias', 'fim_ferias')
list_filter = ('inicio_ferias', 'fim_ferias')
list_filter = ('inicio_ferias', 'fim_ferias')
search_fields = ('obs',
'servidor__nome_completo', 'servidor__email_pessoal',
'servidor__user__email', 'servidor__user__username')
@ -36,14 +36,14 @@ class ServidorFilter(AlphabeticFilter):
class LicencaAdmin(admin.ModelAdmin):
form = LicencaForm
list_display = ('servidor', 'inicio_licenca', 'fim_licenca')
list_filter = (ServidorFilter, 'inicio_licenca', 'fim_licenca')
list_filter = (ServidorFilter, 'inicio_licenca', 'fim_licenca')
search_fields = ('obs',
'servidor__nome_completo', 'servidor__email_pessoal',
'servidor__user__email', 'servidor__user__username')
def lookup_allowed(self, lookup, value):
return super(LicencaAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['servidor__nome_completo']
lookup in ['servidor__nome_completo']
class EnderecoInline(generic.GenericStackedInline):
@ -58,6 +58,7 @@ class TelefonesInline(generic.GenericTabularInline):
class ServidorAdmin(admin.ModelAdmin):
def is_active(self, servidor):
return servidor.user.is_active
is_active.admin_order_field = 'user__is_active'
@ -65,25 +66,25 @@ class ServidorAdmin(admin.ModelAdmin):
is_active.short_description = 'ativo'
list_display = ('nome_completo', 'is_active', 'foto', 'servico', )
list_filter = ('user__is_active', 'sexo', 'servico',)
list_filter = ('user__is_active', 'sexo', 'servico',)
search_fields = ('nome_completo', 'obs', 'apontamentos',
'user__email', 'user__first_name',
'user__last_name', 'user__username')
raw_id_fields = ('user',)
inlines= (TelefonesInline,EnderecoInline)
inlines = (TelefonesInline, EnderecoInline)
fieldsets = (
(u'Autenticação', {
'fields': ('user',),
}),
('Cadastro', {
'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal', 'data_nomeacao', 'ato_numero', 'ato_exoneracao')
}),
('Lotação', {
'fields': ('servico', 'turno', 'de_fora'),
}),
(u'Observações', {
'fields': ('apontamentos', 'obs'),
}),
(u'Autenticação', {
'fields': ('user',),
}),
('Cadastro', {
'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal', 'data_nomeacao', 'ato_numero', 'ato_exoneracao')
}),
('Lotação', {
'fields': ('servico', 'turno', 'de_fora'),
}),
(u'Observações', {
'fields': ('apontamentos', 'obs'),
}),
)
def lookup_allowed(self, lookup, value):
@ -98,7 +99,7 @@ class ServidorAdmin(admin.ModelAdmin):
request = kwargs.pop("request", None)
kwargs['widget'] = AdminImageWidget
return db_field.formfield(**kwargs)
return super(ServidorAdmin,self).formfield_for_dbfield(db_field, **kwargs)
return super(ServidorAdmin, self).formfield_for_dbfield(db_field, **kwargs)
admin.site.register(Servidor, ServidorAdmin)

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

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

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

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.auth.models import User
class Subsecretaria(models.Model):
""" Modelo para representação das Subsecretarias do Interlegis
"""
@ -19,7 +21,9 @@ class Subsecretaria(models.Model):
def __unicode__(self):
return '%s (%s)' % (unicode(self.nome), unicode(self.sigla))
class Servico(models.Model):
""" Modelo para representação dos Serviços de uma Subsecretaria
"""
@ -39,6 +43,7 @@ class Servico(models.Model):
class Servidor(models.Model):
""" Modelo para representação de um Servidor.
Um servidor pertence a um Serviço e uma Subsecretaria os campos
@ -82,7 +87,7 @@ class Servidor(models.Model):
)
servico = models.ForeignKey('servidores.Servico', blank=True, null=True)
matricula = models.CharField(u'matrícula', max_length=25, blank=True, null=True)
turno= models.CharField(
turno = models.CharField(
max_length=1,
choices=TURNO_CHOICES,
blank=True,
@ -90,8 +95,8 @@ class Servidor(models.Model):
)
de_fora = models.BooleanField(default=False)
data_nomeacao = models.DateField(u'data de nomeação', blank=True, null=True)
ato_exoneracao = models.CharField(u'ato de exoneração',max_length=150, blank=True, null=True)
ato_numero = models.CharField(u'ato de exoneração',max_length=150, blank=True, null=True)
ato_exoneracao = models.CharField(u'ato de exoneração', max_length=150, blank=True, null=True)
ato_numero = models.CharField(u'ato de exoneração', max_length=150, blank=True, null=True)
cpf = models.CharField('CPF', max_length=11, blank=True, null=True)
rg = models.CharField('RG', max_length=25, blank=True, null=True)
obs = models.TextField(u'observação', blank=True, null=True)
@ -108,22 +113,22 @@ class Servidor(models.Model):
verbose_name_plural = 'servidores'
def is_chefe(self):
""" Verifica se o servidor é chefe ou diretor
"""
pass
""" Verifica se o servidor é chefe ou diretor
"""
pass
def data_entrada(self):
""" Verifica a data de entrada da função mais antiga
"""
pass
""" Verifica a data de entrada da função mais antiga
"""
pass
def data_saida(self):
""" Verifica a data de saída da função mais recente
de um servidor desativado
""" Verifica a data de saída da função mais recente
de um servidor desativado
Caso o usuário esteja ativo retorna None
"""
pass
Caso o usuário esteja ativo retorna None
"""
pass
@property
def diagnosticos(self):
@ -147,16 +152,20 @@ User.servidor = property(lambda user: Servidor.objects.get(user=user))
# Sinal para ao criar um usuário criar um servidor
# baseado no nome contino no LDAP
def create_user_profile(sender, instance, created, **kwargs):
if created:
Servidor.objects.create(
user=instance,
nome_completo= "%s %s" % (instance.first_name, instance.last_name)
)
user=instance,
nome_completo="%s %s" % (instance.first_name, instance.last_name)
)
post_save.connect(create_user_profile, sender=User)
class Funcao(models.Model):
""" Modelo para guardar o histórico de funções dos
servidores no Interlegis
"""
@ -167,10 +176,10 @@ class Funcao(models.Model):
fim_funcao = models.DateField(u'fim da função', blank=True, null=True)
descricao = models.TextField(u'descrição', blank=True, null=True)
bap_entrada = models.CharField('BAP de entrada',max_length=50, blank=True, null=True)
bap_entrada = models.CharField('BAP de entrada', max_length=50, blank=True, null=True)
data_bap_entrada = models.DateField('data BAP de entrada', blank=True, null=True)
bap_saida = models.CharField(u'BAP de saída',max_length=50, blank=True, null=True)
bap_saida = models.CharField(u'BAP de saída', max_length=50, blank=True, null=True)
data_bap_saida = models.DateField(u'data BAP de saída', blank=True, null=True)
class Meta:
@ -182,6 +191,7 @@ class Funcao(models.Model):
class Licenca(models.Model):
""" Modelo que representa as licenças tiradas pelos servidores
"""
servidor = models.ForeignKey(Servidor)
@ -194,14 +204,16 @@ class Licenca(models.Model):
verbose_name_plural = u'licenças'
def days():
""" Calcula a quantidade de dias da licença
"""
pass
""" Calcula a quantidade de dias da licença
"""
pass
def __unicode__(self):
return str(self.id)
class Ferias(models.Model):
""" Modelo que representa as férias tiradas pelos servidores
"""
servidor = models.ForeignKey(Servidor)
@ -214,9 +226,9 @@ class Ferias(models.Model):
verbose_name_plural = u'férias'
def days():
""" Calcula a quantidade de dias das férias
"""
pass
""" Calcula a quantidade de dias das férias
"""
pass
def __unicode__(self):
return str(self.id)

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

7
sigi/apps/utils/__init__.py

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

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.safestring import mark_safe
class AdminImageWidget(AdminFileWidget):
def render(self, name, value, attrs=None):
output = []
if value and getattr(value, "url", None):
image_url = value.url
file_name=str(value)
file_name = str(value)
output.append(
u''' <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:')))
output.append(super(AdminFileWidget, self).render(name, value, attrs))
return mark_safe(u''.join(output))

11
sigi/apps/utils/alphabetic_filter.py

@ -2,8 +2,9 @@
import string
from django.contrib import admin
class AlphabeticFilter(admin.SimpleListFilter):
# Human-readable title which will be displayed in the
# Human-readable title which will be displayed in the
# right admin sidebar just above the filter options.
title = ''
@ -11,7 +12,7 @@ class AlphabeticFilter(admin.SimpleListFilter):
parameter_name = ''
def lookups(self, request, model_admin):
"""
"""
Returns a list of tuples. The first element in each
tuple is the coded value for the option that will
appear in the URL query. The second element is the
@ -21,10 +22,10 @@ class AlphabeticFilter(admin.SimpleListFilter):
return ((letter, letter,) for letter in string.ascii_uppercase)
def queryset(self, request, queryset):
"""
"""
Returns the filtered queryset based on the value
provided in the query string and retrievable via
`self.value()`.
"""
if self.value():
return queryset.filter( ( self.parameter_name + '__istartswith', self.value() ) )
if 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
# use the path as the "next" url.
login_scheme, login_netloc = urlparse.urlparse(login_url or
settings.LOGIN_URL)[:2]
settings.LOGIN_URL)[:2]
current_scheme, current_netloc = urlparse.urlparse(path)[:2]
if ((not login_scheme or login_scheme == current_scheme) and
(not login_netloc or login_netloc == current_netloc)):
(not login_netloc or login_netloc == current_netloc)):
path = request.get_full_path()
from django.contrib.auth.views import redirect_to_login
return redirect_to_login(path, login_url, redirect_field_name)

2
sigi/apps/utils/email.py

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

28
sigi/context_processors.py

@ -28,7 +28,7 @@ def charts_data(request):
'tabela_resumo_diagnostico': tabela_resumo_diagnostico,
'dados_graficos_convenio_projeto': dados_graficos_convenio_projeto,
'metas': Meta.objects.all(),
}
}
def busca_informacoes_camara():
@ -69,7 +69,7 @@ def busca_informacoes_camara():
cabecalho_topo.append(projeto.sigla)
lista_total.append(camaras.filter(convenio__projeto=projeto).count())
lista_nao_aderidas.append(camaras.filter(convenio__in=conv_sem_adesao_proj).count() )
lista_nao_aderidas.append(camaras.filter(convenio__in=conv_sem_adesao_proj).count())
lista_aderidas.append(camaras.filter(convenio__in=conv_com_adesao_proj).count())
lista_convenios_assinados.append(camaras.filter(convenio__in=conv_assinados_proj).count())
lista_convenios_em_andamento.append(camaras.filter(convenio__in=conv_em_andamento_proj).count())
@ -104,7 +104,7 @@ def busca_informacoes_camara():
# Unindo as duas listass para que o cabecalho da esquerda fique junto com sua
# respectiva linha
lista_zip = zip(cabecalho_esquerda,linhas)
lista_zip = zip(cabecalho_esquerda, linhas)
# Retornando listas em forma de dicionario
return {
@ -112,21 +112,21 @@ def busca_informacoes_camara():
u'lista_zip': lista_zip,
u'total_camaras': camaras.count(),
u'camaras_sem_processo': camaras_sem_processo.count(),
}
}
def grafico_convenio_projeto(convenios):
colors = cycle(['#7cb5ec',
'#434348',
'#90ed7d',
'#f7a35c',
'#8085e9',
'#f15c80',
'#e4d354',
'#8085e8',
'#8d4653',
'#91e8e1', ])
'#434348',
'#90ed7d',
'#f7a35c',
'#8085e9',
'#f15c80',
'#e4d354',
'#8085e8',
'#8d4653',
'#91e8e1', ])
highlights = cycle(['#B0D3F4',
'#8E8E91',
@ -180,4 +180,4 @@ def busca_informacoes_diagnostico():
return [
{'title': 'Diagnósticos digitados', 'count': Diagnostico.objects.count()},
{'title': 'Diagnósticos publicados', 'count': Diagnostico.objects.filter(publicado=True).count()},
]
]

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, ""))
return path
def render_to_pdf(template_src, context_dict):
template = get_template(template_src)
context = Context(context_dict)
html = template.render(context)
html = template.render(context)
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode('utf-8')), result, link_callback=fetch_resources)
if not pdf.err:
return HttpResponse(result.getvalue(), mimetype='application/pdf')
return HttpResponse('We had some errors<pre>%s</pre>' % escape(html))

Loading…
Cancel
Save