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. 7
      etc/data/ibge/sigi-import-ibge-2009.py
  2. 19
      etc/migracao/migra.py
  3. 4
      sigi/apps/casas/admin.py
  4. 11
      sigi/apps/casas/models.py
  5. 11
      sigi/apps/casas/reports.py
  6. 20
      sigi/apps/casas/views.py
  7. 3
      sigi/apps/contatos/admin.py
  8. 10
      sigi/apps/contatos/models.py
  9. 7
      sigi/apps/convenios/admin.py
  10. 9
      sigi/apps/convenios/models.py
  11. 22
      sigi/apps/convenios/reports.py
  12. 16
      sigi/apps/convenios/views.py
  13. 9
      sigi/apps/diagnosticos/admin.py
  14. 1
      sigi/apps/diagnosticos/decorators.py
  15. 5
      sigi/apps/diagnosticos/forms.py
  16. 8
      sigi/apps/diagnosticos/models.py
  17. 11
      sigi/apps/diagnosticos/templatetags/smart_if.py
  18. 9
      sigi/apps/diagnosticos/widgets.py
  19. 1
      sigi/apps/financeiro/admin.py
  20. 2
      sigi/apps/financeiro/models.py
  21. 8
      sigi/apps/inventario/admin.py
  22. 6
      sigi/apps/inventario/models.py
  23. 11
      sigi/apps/mesas/admin.py
  24. 7
      sigi/apps/mesas/models.py
  25. 2
      sigi/apps/metas/admin.py
  26. 2
      sigi/apps/metas/management/commands/gera_map_data.py
  27. 13
      sigi/apps/metas/models.py
  28. 2
      sigi/apps/metas/templatetags/mapa_tags.py
  29. 12
      sigi/apps/metas/views.py
  30. 3
      sigi/apps/parlamentares/admin.py
  31. 1
      sigi/apps/parlamentares/models.py
  32. 11
      sigi/apps/parlamentares/reports.py
  33. 3
      sigi/apps/parlamentares/views.py
  34. 4
      sigi/apps/relatorios/reports.py
  35. 5
      sigi/apps/servicos/admin.py
  36. 2
      sigi/apps/servicos/management/commands/atualiza_uso_servico.py
  37. 11
      sigi/apps/servicos/models.py
  38. 2
      sigi/apps/servicos/views.py
  39. 1
      sigi/apps/servidores/admin.py
  40. 3
      sigi/apps/servidores/forms.py
  41. 21
      sigi/apps/servidores/management/commands/migra.py
  42. 46
      sigi/apps/servidores/management/commands/sync_ldap.py
  43. 12
      sigi/apps/servidores/models.py
  44. 3
      sigi/apps/servidores/views.py
  45. 5
      sigi/apps/utils/__init__.py
  46. 4
      sigi/apps/utils/admin_widgets.py
  47. 1
      sigi/apps/utils/alphabetic_filter.py
  48. 2
      sigi/shortcuts.py

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

@ -1,13 +1,16 @@
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)
@ -16,6 +19,7 @@ def getCidadesDict( macrodict, microid ):
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')
@ -37,4 +41,3 @@ def main( ):
if __name__ = "__main__":
main()
dumpdicts()

19
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,7 +63,6 @@ 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)
@ -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()
@ -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,7 +249,6 @@ 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
@ -341,8 +338,10 @@ def migra_convenios_casas(filename):
)
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('-')
@ -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>"

4
sigi/apps/casas/admin.py

@ -43,6 +43,7 @@ class FuncionariosInline(admin.StackedInline):
readonly_fields = ('ult_alteracao',)
extra = 1
inlines = (TelefonesInline,)
def get_queryset(self, request):
return self.model.objects.exclude(cargo="Presidente")
@ -59,6 +60,7 @@ class ConveniosInline(admin.StackedInline):
)
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'
@ -203,7 +205,6 @@ 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)
etiqueta.short_description = "Gerar etiqueta(s) da(s) casa(s) selecionada(s)"
@ -241,7 +242,6 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
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:

11
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(
@ -243,7 +247,9 @@ class CasaLegislativa(models.Model):
return super(CasaLegislativa, self).save(*args, **kwargs)
class Funcionario(models.Model):
""" Modelo para registrar contatos vinculados às
Casas Legislativas
"""
@ -287,13 +293,17 @@ 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
@ -304,4 +314,3 @@ class Presidente(Funcionario):
self.cargo = 'Presidente'
self.funcao = 'Presidente'
return super(Presidente, self).save(*args, **kwargs)

11
sigi/apps/casas/reports.py

@ -11,6 +11,7 @@ from sigi.settings import STATICFILES_DIRS
from geraldo.graphics import Image
def string_to_cm(texto):
tamanho = 0
minEspeciais = {
@ -42,8 +43,8 @@ def string_to_cm(texto):
return tamanho
class CasasLegislativasLabels(Report):
"""
Usage example::
@ -134,6 +135,7 @@ class CasasLegislativasLabels(Report):
class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
def __init__(self, queryset, formato):
super(CasasLegislativasLabelsSemPresidente, self).__init__(queryset=queryset, formato=formato)
@ -239,8 +241,6 @@ class CasasLegislativasReport(ReportDefault):
]
class band_page_footer(ReportDefault.band_page_footer):
pass
@ -294,10 +294,13 @@ class CasasLegislativasReport(ReportDefault):
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
@ -572,5 +575,3 @@ class InfoCasaLegislativa(ReportDefault):
),
)
]

20
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,6 +38,7 @@ def query_ordena(qs, o):
qs = qs.order_by(*order_fields)
return qs
def get_for_qs(get, qs):
"""
Verifica atributos do GET e retorna queryset correspondente
@ -51,6 +54,7 @@ def get_for_qs(get,qs):
return qs
def carrinhoOrGet_for_qs(request):
"""
Verifica se existe casas na sessão se não verifica get e retorna qs correspondente.
@ -64,6 +68,7 @@ def carrinhoOrGet_for_qs(request):
qs = get_for_qs(request.GET, qs)
return qs
def adicionar_casas_carrinho(request, queryset=None, id=None):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
@ -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)
@ -110,11 +114,13 @@ def visualizar_carrinho(request):
}
)
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.
"""
@ -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.
@ -208,6 +213,7 @@ def carrinhoOrGet_for_parlamentar_qs(request):
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.
"""
@ -237,7 +243,6 @@ def report(request, id=None,tipo=None):
if tipo == 'completo':
return report_complete(request, id)
if id:
qs = CasaLegislativa.objects.filter(pk=id)
else:
@ -253,6 +258,7 @@ def report(request, id=None,tipo=None):
report.generate_by(PDFGenerator, filename=response)
return response
def report_complete(request, id=None):
if id:
@ -290,6 +296,7 @@ def report_complete(request,id=None):
return response
def casas_sem_convenio_report(request):
qs = CasaLegislativa.objects.filter(convenio=None).order_by('municipio__uf', 'nome')
@ -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'

3
sigi/apps/contatos/admin.py

@ -14,6 +14,7 @@ class UnidadeFederativaAdmin(admin.ModelAdmin):
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',)

10
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 = (
@ -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,6 +191,7 @@ class Contato(models.Model):
def __unicode__(self):
return self.nome
class Endereco(models.Model):
TIPO_CHOICES = (
('aeroporto', 'Aeroporto'),
@ -276,4 +283,3 @@ class Endereco(models.Model):
def __unicode__(self):
return self.tipo + ' ' + self.logradouro + ', ' + self.numero \
+ ' ' + self.complemento + ' - ' + self.bairro

7
sigi/apps/convenios/admin.py

@ -11,20 +11,24 @@ 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', ]
class EquipamentoPrevistoInline(admin.TabularInline):
model = EquipamentoPrevisto
extra = 2
raw_id_fields = ('equipamento',)
class AnexoAdmin(admin.ModelAdmin):
date_hierarchy = 'data_pub'
exclude = ['data_pub', ]
@ -33,6 +37,7 @@ class AnexoAdmin(admin.ModelAdmin):
search_fields = ('descricao', 'convenio__id', 'arquivo',
'convenio__casa_legislativa__nome')
class ConvenioAdmin(admin.ModelAdmin):
change_list_template = 'convenios/change_list.html'
fieldsets = (
@ -93,6 +98,7 @@ class ConvenioAdmin(admin.ModelAdmin):
request,
extra_context={'query_str': '?' + request.META['QUERY_STRING']}
)
def relatorio(self, request, queryset):
# queryset.order_by('casa_legislativa__municipio__uf')
response = HttpResponse(mimetype='application/pdf')
@ -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')

9
sigi/apps/convenios/models.py

@ -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.
@ -102,7 +104,6 @@ class Convenio(models.Model):
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))

22
sigi/apps/convenios/reports.py

@ -15,18 +15,23 @@ 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'
@ -86,8 +91,6 @@ class ConvenioReport(ReportDefault):
),
]
class band_page_footer(ReportDefault.band_page_footer):
pass
@ -152,7 +155,9 @@ class ConvenioReport(ReportDefault):
)
]
class ConvenioReportSemAceite(ConvenioReport):
class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top
@ -203,7 +208,6 @@ class ConvenioReportSemAceite(ConvenioReport):
),
]
class band_detail(ReportDefault.band_detail):
label_left = [0, 1.5, 7, 9, 11, 13, 15, 17]
@ -246,10 +250,9 @@ class ConvenioReportSemAceite(ConvenioReport):
]
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'
@ -268,6 +271,7 @@ class ConvenioReportRegiao(ReportDefault):
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]
display_inline = True
@ -290,7 +294,7 @@ class ConvenioReportRegiao(ReportDefault):
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),
# 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,
@ -300,17 +304,17 @@ class ConvenioReportRegiao(ReportDefault):
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'

16
sigi/apps/convenios/views.py

@ -22,6 +22,7 @@ import datetime
import csv
def query_ordena(qs, o, ot):
list_display = ('num_convenio', 'casa_legislativa',
'data_adesao', 'data_retorno_assinatura', 'data_termo_aceite',
@ -35,6 +36,7 @@ def query_ordena(qs,o,ot):
qs = qs.order_by("-" + aux)
return qs
def get_for_qs(get, qs):
kwargs = {}
ids = 0
@ -55,6 +57,7 @@ def get_for_qs(get,qs):
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.
@ -69,6 +72,7 @@ def carrinhoOrGet_for_qs(request):
qs = get_for_qs(request.GET, qs)
return qs
def adicionar_convenios_carrinho(request, queryset=None, id=None):
if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action')
@ -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)
@ -133,6 +140,7 @@ def visualizar_carrinho(request):
}
)
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,8 +181,8 @@ 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)
@ -236,6 +243,7 @@ def casas_estado_to_tabela(casas,convenios,regiao):
"sumario": sumario,
}
def report_regiao(request, regiao='NE'):
if request.POST:
@ -282,6 +290,7 @@ def report_regiao(request,regiao='NE'):
return response
def export_csv(request):
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=convenios.csv'
@ -341,4 +350,3 @@ def export_csv(request):
csv_writer.writerow(lista)
return response

9
sigi/apps/diagnosticos/admin.py

@ -6,6 +6,7 @@ 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)
@ -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,6 +47,7 @@ class AnexoAdmin(admin.ModelAdmin):
search_fields = ('descricao', 'diagnostico__id', 'arquivo',
'diagnostico__casa_legislativa__nome')
class DiagnosticoAdmin(BaseEntityAdmin):
form = DiagnosticoForm
actions = [publicar_diagnostico, despublicar_diagnostico]
@ -71,7 +76,6 @@ class DiagnosticoAdmin(BaseEntityAdmin):
'classes': ['collapse']
}),)
def get_uf(self, obj):
return '%s' % (obj.casa_legislativa.municipio.uf)
get_uf.short_description = 'UF'
@ -104,12 +108,14 @@ class DiagnosticoAdmin(BaseEntityAdmin):
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

5
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
"""
@ -28,7 +29,9 @@ class DiagnosticoForm(BaseDynamicEntityForm):
if isinstance(f, CharField):
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
@ -62,6 +65,7 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm):
'inscricoes_para_lista_gial': {'widget': Textarea},
'inscricoes_para_lista_gicom': {'widget': Textarea},
}
class Meta:
model = Diagnostico
fields = '__all__'
@ -151,6 +155,7 @@ class CasaLegislativaMobileForm(forms.ModelForm):
class TelefoneMobileForm(forms.ModelForm):
pass
class Meta:
model = Telefone
fields = ('numero', 'tipo')

8
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
"""
@ -113,7 +114,6 @@ class Diagnostico(BaseEntity):
'status': "Alterado",
})
def get_schemata(self, category=None, *args, **kwargs):
""" Se existir uma categoria retorna apenas as questões dessa.
"""
@ -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
@ -190,6 +192,7 @@ class Pergunta(BaseSchema):
class Escolha(BaseChoice):
""" Perguntas de multiplas escolhas tem as opções
cadastradas neste modelo
"""
@ -205,6 +208,7 @@ class Escolha(BaseChoice):
class Resposta(BaseAttribute):
""" Modelo para guardar as respostas das perguntas
de um diagnosico
"""
@ -218,6 +222,7 @@ class Resposta(BaseAttribute):
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.
"""

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

9
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()
@ -56,6 +61,6 @@ class EavRadioFieldRenderer(RadioFieldRenderer):
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)

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

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)

11
sigi/apps/mesas/admin.py

@ -7,10 +7,12 @@ 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', ]
class LegislaturaAdmin(admin.ModelAdmin):
date_hierarchy = 'data_inicio'
list_display = ('numero', 'casa_legislativa', 'uf', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares')
@ -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>' % \
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',)

7
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'),
@ -85,6 +89,7 @@ class SessaoLegislativa(models.Model):
def __unicode__(self):
return str(self.numero)
class MesaDiretora(models.Model):
casa_legislativa = models.ForeignKey(
'casas.CasaLegislativa',
@ -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)

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

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

13
sigi/apps/metas/models.py

@ -6,6 +6,7 @@ from sigi.apps.diagnosticos.models import Diagnostico
from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.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):
@ -83,8 +84,7 @@ class Meta(models.Model):
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):
@ -103,10 +103,10 @@ class Meta(models.Model):
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

12
sigi/apps/metas/views.py

@ -24,8 +24,8 @@ from sigi.apps.metas.templatetags.mapa_tags import descricao_servicos
JSON_FILE_NAME = os.path.join(MEDIA_ROOT, 'apps/metas/map_data.json')
@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
@ -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,6 +121,7 @@ def map_search(request):
return HttpResponse(simplejson.dumps(response), mimetype="application/json")
@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos)
def map_sum(request):
# Filtrar Casas de acordo com os parâmetros
@ -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,6 +194,7 @@ 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)
def map_list(request):
# Filtrar Casas de acordo com os parâmetros
@ -253,6 +256,7 @@ def get_params(request):
'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)
@ -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 = {

3
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')

1
sigi/apps/parlamentares/models.py

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

11
sigi/apps/parlamentares/reports.py

@ -9,6 +9,7 @@ from sigi.apps.relatorios.reports import ReportDefault
from geraldo.graphics import Image
def string_to_cm(texto):
tamanho = 0
minEspeciais = {
@ -39,7 +40,9 @@ def string_to_cm(texto):
tamanho += 0.2
return tamanho
class ParlamentaresLabels(Report):
"""
Usage example::
@ -118,24 +121,28 @@ class ParlamentaresLabels(Report):
]
self.band_detail = DetailBand(width=(self.largura_etiqueta) * cm, height=(self.altura_etiqueta) * cm, margin_left = 0, margin_top = 0, margin_bottom=0.0 * cm, margin_right = 0, elements=my_elements, display_inline=True, default_style={'fontName': 'Helvetica', 'fontSize': self.tamanho_fonte})
def logradouro_parlamentar(instance):
try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.logradouro
except:
return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>"
def bairro_parlamentar(instance):
try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.bairro
except:
return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>"
def municipio_parlamentar(instance):
try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.municipio
except:
return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>"
def cep_parlamentar(instance):
try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.cep
@ -207,8 +214,6 @@ class CasasLegislativasReport(ReportDefault):
]
class band_page_footer(ReportDefault.band_page_footer):
pass
@ -261,8 +266,10 @@ class CasasLegislativasReport(ReportDefault):
class InfoCasaLegislativa(ReportDefault):
title = u'Casa legislativa'
class band_summary(ReportBand):
pass
class band_page_footer(ReportBand):
height = 1 * cm

3
sigi/apps/parlamentares/views.py

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

4
sigi/apps/relatorios/reports.py

@ -68,9 +68,7 @@ class ReportDefault(Report):
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,\
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)}

5
sigi/apps/servicos/admin.py

@ -17,6 +17,7 @@ class LogServicoInline(admin.StackedInline):
class ServicoFormAdmin(ModelForm):
class Meta:
model = Servico
fields = '__all__'
@ -118,7 +119,6 @@ class ServicoAdmin(admin.ModelAdmin):
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)
@ -178,8 +178,7 @@ class CasaAtendidaAdmin(admin.ModelAdmin):
fieldsets = (
('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',

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

11
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/>
@ -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')
@ -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,19 +169,24 @@ 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()
class CasaManifesta(models.Model):
casa_legislativa = models.OneToOneField(CasaLegislativa)
data_manifestacao = models.DateTimeField(auto_now_add=True)
@ -187,6 +195,7 @@ class CasaManifesta(models.Model):
cargo = models.CharField(u'Cargo do informante', max_length=100, blank=True)
email = models.EmailField(u'E-mail de contato', blank=True)
class ServicoManifesto(models.Model):
casa_manifesta = models.ForeignKey(CasaManifesta)
servico = models.ForeignKey(TipoServico)

2
sigi/apps/servicos/views.py

@ -49,6 +49,7 @@ def municipios_atendidos(self, servico):
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')

1
sigi/apps/servidores/admin.py

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

3
sigi/apps/servidores/forms.py

@ -8,6 +8,7 @@ from sigi.apps.servidores.models import Ferias, Licenca, Funcao, Servidor
class FeriasForm(forms.ModelForm):
class 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__'

21
sigi/apps/servidores/management/commands/migra.py

@ -15,9 +15,11 @@ from sigi.apps.contatos.models import Municipio
# u.servidor_set.all().delete()
# u.delete()
class MigrationError(Exception):
pass
class Command(BaseCommand):
help = 'Migra usuários do antigo Sistema de RH'
@ -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
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:
try: user = User.objects.get(username=username + "__")
except User.DoesNotExist: pass
pass
if not user:
if not username:
@ -233,4 +241,3 @@ class Command(BaseCommand):
)
servidor.save()

46
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'
@ -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,16 +54,25 @@ 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)
@ -72,15 +85,18 @@ class Command(BaseCommand):
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
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

12
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
@ -147,6 +152,8 @@ 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(
@ -156,7 +163,9 @@ def create_user_profile(sender, instance, created, **kwargs):
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
"""
@ -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)
@ -201,7 +211,9 @@ class Licenca(models.Model):
def __unicode__(self):
return str(self.id)
class Ferias(models.Model):
""" Modelo que representa as férias tiradas pelos servidores
"""
servidor = models.ForeignKey(Servidor)

3
sigi/apps/servidores/views.py

@ -7,6 +7,7 @@ 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()
@ -19,6 +20,7 @@ def servidores_por_funcao(request):
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()
@ -30,4 +32,3 @@ def servidores_por_cargo(request):
})
return render_to_pdf('servidores/servidores_por_cargo.html', context)

5
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,11 +14,13 @@ 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)
@ -24,6 +28,7 @@ def to_ascii(txt, codif='utf-8'):
txt = txt.encode('utf-8')
return normalize('NFKD', txt.decode(codif)).encode('ASCII', 'ignore')
def queryset_ascii(self, request):
if 'q' in request.GET:
request.GET._mutable = True

4
sigi/apps/utils/admin_widgets.py

@ -2,7 +2,9 @@ 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):
@ -10,7 +12,7 @@ class AdminImageWidget(AdminFileWidget):
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))

1
sigi/apps/utils/alphabetic_filter.py

@ -2,6 +2,7 @@
import string
from django.contrib import admin
class AlphabeticFilter(admin.SimpleListFilter):
# Human-readable title which will be displayed in the
# right admin sidebar just above the filter options.

2
sigi/shortcuts.py

@ -12,6 +12,7 @@ def fetch_resources(uri, rel):
path = os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))
return path
def render_to_pdf(template_src, context_dict):
template = get_template(template_src)
context = Context(context_dict)
@ -22,4 +23,3 @@ def render_to_pdf(template_src, context_dict):
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