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. 73
      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. 497
      sigi/apps/casas/reports.py
  7. 66
      sigi/apps/casas/views.py
  8. 5
      sigi/apps/contatos/admin.py
  9. 8
      sigi/apps/contatos/filters.py
  10. 112
      sigi/apps/contatos/models.py
  11. 65
      sigi/apps/convenios/admin.py
  12. 15
      sigi/apps/convenios/models.py
  13. 222
      sigi/apps/convenios/reports.py
  14. 78
      sigi/apps/convenios/views.py
  15. 49
      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. 1
      sigi/apps/financeiro/admin.py
  23. 2
      sigi/apps/financeiro/models.py
  24. 12
      sigi/apps/inventario/admin.py
  25. 6
      sigi/apps/inventario/models.py
  26. 19
      sigi/apps/mesas/admin.py
  27. 11
      sigi/apps/mesas/models.py
  28. 26
      sigi/apps/metas/admin.py
  29. 4
      sigi/apps/metas/management/commands/gera_map_data.py
  30. 35
      sigi/apps/metas/models.py
  31. 2
      sigi/apps/metas/templatetags/mapa_tags.py
  32. 78
      sigi/apps/metas/views.py
  33. 4
      sigi/apps/ocorrencias/admin.py
  34. 4
      sigi/apps/ocorrencias/models.py
  35. 21
      sigi/apps/parlamentares/admin.py
  36. 1
      sigi/apps/parlamentares/models.py
  37. 489
      sigi/apps/parlamentares/reports.py
  38. 29
      sigi/apps/parlamentares/views.py
  39. 64
      sigi/apps/relatorios/reports.py
  40. 55
      sigi/apps/servicos/admin.py
  41. 2
      sigi/apps/servicos/management/commands/atualiza_uso_servico.py
  42. 37
      sigi/apps/servicos/models.py
  43. 10
      sigi/apps/servicos/views.py
  44. 41
      sigi/apps/servidores/admin.py
  45. 7
      sigi/apps/servidores/forms.py
  46. 139
      sigi/apps/servidores/management/commands/migra.py
  47. 62
      sigi/apps/servidores/management/commands/sync_ldap.py
  48. 62
      sigi/apps/servidores/models.py
  49. 19
      sigi/apps/servidores/views.py
  50. 7
      sigi/apps/utils/__init__.py
  51. 6
      sigi/apps/utils/admin_widgets.py
  52. 11
      sigi/apps/utils/alphabetic_filter.py
  53. 4
      sigi/apps/utils/decorators.py
  54. 2
      sigi/apps/utils/email.py
  55. 28
      sigi/context_processors.py
  56. 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()

73
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
@ -62,13 +63,12 @@ def migra_assembleias(filename):
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 = ''
@ -140,7 +140,6 @@ def migra_casas(filename):
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()
@ -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,14 +249,13 @@ 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)
@ -266,9 +263,9 @@ def migra_convenios_casas(filename):
linenum = 1
###Geração de arquivos para análise###
import codecs
f1 = codecs.open('file1.txt','w' , encoding="utf-8")
f1 = codecs.open('file1.txt', 'w', encoding="utf-8")
f1.write(u'Casas que não tem Número Processo Senado Federal\n')
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,35 +311,37 @@ 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")
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
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)
@ -350,6 +349,7 @@ def migra_convenios_casas(filename):
f1.close()
f2.close()
def migra_convenios_assembleias(filename):
def get_datetime_obj(data):
ldata = data.split('-')
@ -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:
@ -425,8 +426,6 @@ def popula():
tipo3.save()
if __name__ == '__main__':
popula()
print "<iniciando migração das assembléias legislativas>"

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)

497
sigi/apps/casas/reports.py

@ -3,7 +3,7 @@ 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
@ -11,25 +11,26 @@ 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 > 'a' and c < 'z':
if c in minEspeciais:
tamanho += minEspeciais[c]
else:
@ -42,8 +43,8 @@ def string_to_cm(texto):
return tamanho
class CasasLegislativasLabels(Report):
"""
Usage example::
@ -68,20 +69,20 @@ class CasasLegislativasLabels(Report):
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
@ -89,10 +90,10 @@ class CasasLegislativasLabels(Report):
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',
@ -126,21 +127,22 @@ class CasasLegislativasLabels(Report):
),
]
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,
default_style={'fontName': 'Helvetica', 'fontSize': self.tamanho_fonte})
class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
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',
@ -168,8 +170,8 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
),
]
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,
default_style={'fontName': 'Helvetica', 'fontSize': self.tamanho_fonte})
@ -177,400 +179,399 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
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,
left=label_left[2] * cm,
top=label_top,
),
Label(
text="Endereço",
left=label_left[3]*cm,
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}
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},
),
)
]

66
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,21 +38,23 @@ 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.
@ -61,10 +65,11 @@ def carrinhoOrGet_for_qs(request):
else:
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')
if not request.session.has_key('carrinho_casas'):
@ -78,7 +83,6 @@ def adicionar_casas_carrinho(request,queryset=None,id=None):
request.session['carrinho_casas'] = lista
def visualizar_carrinho(request):
qs = carrinhoOrGet_for_qs(request)
@ -103,18 +107,20 @@ def visualizar_carrinho(request):
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')
@ -125,14 +131,12 @@ def deleta_itens_carrinho(request):
if lista:
request.session['carrinho_casas'] = lista
else:
del lista;
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.
"""
@ -143,7 +147,7 @@ def labels_report(request, id=None, tipo=None, formato='3x9_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:
@ -161,6 +165,7 @@ 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.
"""
@ -169,7 +174,6 @@ def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
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])
@ -189,6 +193,7 @@ 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.
@ -205,9 +210,10 @@ 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.
"""
@ -228,16 +234,15 @@ 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:
@ -246,14 +251,15 @@ def report(request, id=None,tipo=None):
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)
@ -273,11 +279,11 @@ def report_complete(request,id=None):
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,15 +292,16 @@ 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('../')
@ -304,7 +311,6 @@ def casas_sem_convenio_report(request):
return response
def export_csv(request):
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=casas.csv'
@ -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:

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

112
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(
@ -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,13 +133,13 @@ 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)
@ -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')

15
sigi/apps/convenios/models.py

@ -1,4 +1,4 @@
#style="list-style-type: noneo -*- coding: utf-8 -*-
# style="list-style-type: noneo -*- coding: utf-8 -*-
from datetime import datetime
from 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.
@ -98,11 +100,10 @@ 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',)
@ -116,6 +117,7 @@ class Convenio(models.Model):
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))

222
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,),
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]
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}
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'

78
sigi/apps/convenios/views.py

@ -4,10 +4,10 @@ from django.shortcuts import render_to_response, get_list_or_404
from geraldo.generators import PDFGenerator
from 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,39 +22,42 @@ 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.
@ -65,11 +68,12 @@ def carrinhoOrGet_for_qs(request):
else:
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')
if not request.session.has_key('carrinho_convenios'):
@ -82,11 +86,13 @@ def adicionar_convenios_carrinho(request,queryset=None,id=None):
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')
@ -97,11 +103,12 @@ def deleta_itens_carrinho(request):
if lista:
request.session['carrinho_convenios'] = lista
else:
del lista;
del lista
del request.session['carrinho_convenios']
return HttpResponseRedirect('.')
def visualizar_carrinho(request):
qs = carrinhoOrGet_for_qs(request)
@ -126,13 +133,14 @@ def visualizar_carrinho(request):
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):
if id:
@ -166,7 +174,6 @@ def report(request, id=None):
else:
report = ConvenioPorCMReport(queryset=qs)
response = HttpResponse(mimetype='application/pdf')
if report:
report.generate_by(PDFGenerator, filename=response)
@ -174,10 +181,10 @@ def report(request, id=None):
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
@ -231,12 +238,13 @@ def casas_estado_to_tabela(casas,convenios,regiao):
)
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'):
@ -257,14 +265,14 @@ def report_regiao(request,regiao='NE'):
tabelas = list()
# Geral
convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM')
tabela = casas_estado_to_tabela(camaras,convenios,regiao)
tabela = casas_estado_to_tabela(camaras, convenios, regiao)
tabela["projeto"] = "Geral"
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)
@ -275,13 +283,14 @@ def report_regiao(request,regiao='NE'):
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,7 +300,7 @@ 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:
@ -341,4 +350,3 @@ def export_csv(request):
csv_writer.writerow(lista)
return response

49
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,10 +72,9 @@ 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)
@ -83,33 +87,35 @@ class DiagnosticoAdmin(BaseEntityAdmin):
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

1
sigi/apps/financeiro/admin.py

@ -2,6 +2,7 @@
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', )

2
sigi/apps/financeiro/models.py

@ -2,6 +2,7 @@
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)
@ -15,4 +16,3 @@ class Desembolso(models.Model):
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)

19
sigi/apps/mesas/admin.py

@ -7,9 +7,11 @@ from sigi.apps.mesas.models import (Legislatura, Coligacao, ComposicaoColigacao,
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'
@ -17,7 +19,7 @@ class LegislaturaAdmin(admin.ModelAdmin):
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):
@ -32,17 +34,19 @@ class LegislaturaAdmin(admin.ModelAdmin):
def response_change(self, 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',)

11
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')
@ -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)

26
sigi/apps/metas/admin.py

@ -2,11 +2,13 @@
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',)
@ -24,24 +26,24 @@ class PlanoDiretorAdmin(admin.ModelAdmin):
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)

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

35
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'),
@ -28,7 +29,7 @@ class Meta(models.Model):
verbose_name_plural = 'Metas BID'
def __unicode__(self):
return self.titulo;
return self.titulo
@property
def valor_executado(self):
@ -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
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 'FFDB6E' # Orange
return 'E74A69' # Red
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'),
@ -124,5 +124,4 @@ class PlanoDiretor(models.Model):
verbose_name_plural = 'Planos Diretores'
def __unicode__(self):
return self.casa_legislativa.nome ;
return self.casa_legislativa.nome

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

@ -6,6 +6,7 @@ from sigi.apps.casas.models import CasaLegislativa
register = template.Library()
@register.filter(name='map_desc_serv')
def descricao_servicos(value):
if not isinstance(value, CasaLegislativa):
@ -32,4 +33,3 @@ def descricao_servicos(value):
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

4
sigi/apps/ocorrencias/models.py

@ -3,7 +3,7 @@ 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")
@ -79,7 +79,7 @@ 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',)

21
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'),
}),
@ -57,13 +60,13 @@ class ParlamentarAdmin(admin.ModelAdmin):
q1 = len(request.session['carrinho_parlamentar'])
else:
q1 = 0
adicionar_parlamentar_carrinho(request,queryset=queryset)
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"

1
sigi/apps/parlamentares/models.py

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

489
sigi/apps/parlamentares/reports.py

@ -3,31 +3,32 @@ 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 > 'a' and c < 'z':
if c in minEspeciais:
tamanho += minEspeciais[c]
else:
@ -39,7 +40,9 @@ def string_to_cm(texto):
tamanho += 0.2
return tamanho
class ParlamentaresLabels(Report):
"""
Usage example::
@ -54,7 +57,7 @@ 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):
@ -63,17 +66,17 @@ class ParlamentaresLabels(Report):
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,40 +86,41 @@ 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:
@ -124,18 +128,21 @@ def logradouro_parlamentar(instance):
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
@ -145,395 +152,395 @@ def cep_parlamentar(instance):
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,
left=label_left[2] * cm,
top=label_top,
),
Label(
text=u"Endereço",
left=label_left[3]*cm,
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}
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},
),
)
]

29
sigi/apps/parlamentares/views.py

@ -18,7 +18,7 @@ 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')
if not request.session.has_key('carrinho_parlametar'):
@ -55,10 +55,10 @@ def visualizar_carrinho(request):
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))
@ -72,31 +72,31 @@ def carrinhoOrGet_for_qs(request):
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():
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)
@ -116,7 +116,7 @@ def deleta_itens_carrinho(request):
if lista:
request.session['carrinho_parlamentar'] = lista
else:
del lista;
del lista
del request.session['carrinho_parlamentar']
return HttpResponseRedirect('.')
@ -130,7 +130,6 @@ def labels_report(request, id=None, formato='3x9_etiqueta'):
if request.POST.has_key('tipo_etiqueta'):
tipo = request.POST['tipo_etiqueta']
if id:
qs = Parlamentar.objects.filter(pk=id)

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

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

@ -24,8 +24,10 @@
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="")

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

139
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'
@ -42,10 +44,10 @@ class Command(BaseCommand):
if not p['email']:
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)
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:
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()

62
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:
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