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 _root_dict = None
def getUFdict(root, ufid): def getUFdict(root, ufid):
return(root[ufid]) return(root[ufid])
def getCidadesDict(macrodict, microid): def getCidadesDict(macrodict, microid):
if macrodict = None: if macrodict = None:
return(None) return(None)
@ -16,6 +19,7 @@ def getCidadesDict( macrodict, microid ):
microdict = {} microdict = {}
macrodict['__children'] = microdict macrodict['__children'] = microdict
def main(): def main():
argc = len(sys.argv) argc = len(sys.argv)
arquivo = open('geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/DTB_05_05_2009.csv', 'r') 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__": if __name__ = "__main__":
main() main()
dumpdicts() 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.') 'manual.')
OBS_CONVENIO = ('Convênio sem termo de adesão') OBS_CONVENIO = ('Convênio sem termo de adesão')
def migra_assembleias(filename): def migra_assembleias(filename):
# identificação das colunas nos arquivo CSV # identificação das colunas nos arquivo CSV
UF_COL = 5 UF_COL = 5
@ -62,7 +63,6 @@ def migra_assembleias(filename):
tipo_casa = TipoCasaLegislativa.objects.filter(sigla='AL').get() tipo_casa = TipoCasaLegislativa.objects.filter(sigla='AL').get()
for line in reader: for line in reader:
uf = UnidadeFederativa.objects.get(sigla=line[UF_COL]) uf = UnidadeFederativa.objects.get(sigla=line[UF_COL])
municipio = Municipio.objects.get(uf=uf, is_capital=True) municipio = Municipio.objects.get(uf=uf, is_capital=True)
@ -140,7 +140,6 @@ def migra_casas(filename):
EMAIL_PRESIDENTE_COL = 43 EMAIL_PRESIDENTE_COL = 43
REPRESENTANTE_COL = 85 REPRESENTANTE_COL = 85
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True)
header = reader.next() header = reader.next()
tipo_casa = TipoCasaLegislativa.objects.filter(sigla='CM').get() tipo_casa = TipoCasaLegislativa.objects.filter(sigla='CM').get()
@ -202,6 +201,7 @@ def migra_casas(filename):
representante = Contato(nome=line[REPRESENTANTE_COL], content_object=casa) representante = Contato(nome=line[REPRESENTANTE_COL], content_object=casa)
representante.save() representante.save()
def migra_cnpj(filename): def migra_cnpj(filename):
# identificação das colunas no arquivo CSV # identificação das colunas no arquivo CSV
COD_TSE_COL = 0 COD_TSE_COL = 0
@ -228,6 +228,7 @@ def migra_cnpj(filename):
casa.cnpj = line[COD_CNPJ1_COL] if not 'EM BRANCO' in line[COD_CNPJ1_COL] else line[COD_CNPJ2_COL] casa.cnpj = line[COD_CNPJ1_COL] if not 'EM BRANCO' in line[COD_CNPJ1_COL] else line[COD_CNPJ2_COL]
casa.save() casa.save()
def migra_convenios_casas(filename): def migra_convenios_casas(filename):
def get_datetime_obj(data): def get_datetime_obj(data):
ldata = data.split('-') ldata = data.split('-')
@ -235,9 +236,6 @@ def migra_convenios_casas(filename):
return None return None
return datetime(int(ldata[0]), int(ldata[1]), int(ldata[2])) return datetime(int(ldata[0]), int(ldata[1]), int(ldata[2]))
# identificação das colunas no arquivo CSV # identificação das colunas no arquivo CSV
# No arquivo CSV colunas que contém _100 são do Programa Interlegis # No arquivo CSV colunas que contém _100 são do Programa Interlegis
COD_IBGE_COL = 1 COD_IBGE_COL = 1
@ -251,7 +249,6 @@ def migra_convenios_casas(filename):
DATA_PUB_DIARIO = 30 DATA_PUB_DIARIO = 30
DATA_DEV_VIA_CONV_CM = 32 DATA_DEV_VIA_CONV_CM = 32
DATA_ADESAO_100_COL = 11 DATA_ADESAO_100_COL = 11
DATA_TERMO_ACEITE_100_COL = 22 DATA_TERMO_ACEITE_100_COL = 22
NUM_CONVENIO_100_COL = 24 NUM_CONVENIO_100_COL = 24
@ -341,8 +338,10 @@ def migra_convenios_casas(filename):
) )
try: try:
if convenio1: convenio1.save() if convenio1:
if convenio2: convenio2.save() convenio1.save()
if convenio2:
convenio2.save()
except: except:
print "Erro ao inserir convênio" print "Erro ao inserir convênio"
print ERROR_MSG_0 % (filename, linenum) print ERROR_MSG_0 % (filename, linenum)
@ -350,6 +349,7 @@ def migra_convenios_casas(filename):
f1.close() f1.close()
f2.close() f2.close()
def migra_convenios_assembleias(filename): def migra_convenios_assembleias(filename):
def get_datetime_obj(data): def get_datetime_obj(data):
ldata = data.split('-') ldata = data.split('-')
@ -402,6 +402,7 @@ def migra_convenios_assembleias(filename):
print convenio print convenio
continue continue
def popula(): def popula():
""" """
Será preciso cadastrar no banco os seguintes Projeto: Será preciso cadastrar no banco os seguintes Projeto:
@ -425,8 +426,6 @@ def popula():
tipo3.save() tipo3.save()
if __name__ == '__main__': if __name__ == '__main__':
popula() popula()
print "<iniciando migração das assembléias legislativas>" print "<iniciando migração das assembléias legislativas>"

4
sigi/apps/casas/admin.py

@ -43,6 +43,7 @@ class FuncionariosInline(admin.StackedInline):
readonly_fields = ('ult_alteracao',) readonly_fields = ('ult_alteracao',)
extra = 1 extra = 1
inlines = (TelefonesInline,) inlines = (TelefonesInline,)
def get_queryset(self, request): def get_queryset(self, request):
return self.model.objects.exclude(cargo="Presidente") return self.model.objects.exclude(cargo="Presidente")
@ -59,6 +60,7 @@ class ConveniosInline(admin.StackedInline):
) )
readonly_fields = ['get_tramitacoes', 'get_anexos', 'get_equipamentos', 'link_convenio', ] readonly_fields = ['get_tramitacoes', 'get_anexos', 'get_equipamentos', 'link_convenio', ]
extra = 0 extra = 0
def get_tramitacoes(self, obj): def get_tramitacoes(self, obj):
return '<br/>'.join([t.__unicode__() for t in obj.tramitacao_set.all()]) return '<br/>'.join([t.__unicode__() for t in obj.tramitacao_set.all()])
get_tramitacoes.short_description = 'Tramitações' get_tramitacoes.short_description = 'Tramitações'
@ -203,7 +205,6 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
return super(CasaLegislativaAdmin, self).lookup_allowed(lookup, value) or \ return super(CasaLegislativaAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['municipio__uf__codigo_ibge__exact', 'convenio__projeto__id__exact'] lookup in ['municipio__uf__codigo_ibge__exact', 'convenio__projeto__id__exact']
def etiqueta(self, request, queryset): def etiqueta(self, request, queryset):
return labels_report(request, queryset=queryset) return labels_report(request, queryset=queryset)
etiqueta.short_description = "Gerar etiqueta(s) da(s) casa(s) selecionada(s)" etiqueta.short_description = "Gerar etiqueta(s) da(s) casa(s) selecionada(s)"
@ -241,7 +242,6 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
adicionar_casas.short_description = u"Armazenar casas no carrinho para exportar" adicionar_casas.short_description = u"Armazenar casas no carrinho para exportar"
def get_actions(self, request): def get_actions(self, request):
actions = super(CasaLegislativaAdmin, self).get_actions(request) actions = super(CasaLegislativaAdmin, self).get_actions(request)
if 'delete_selected' in actions: if 'delete_selected' in actions:

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.utils import SearchField
from sigi.apps.servidores.models import Servidor from sigi.apps.servidores.models import Servidor
class TipoCasaLegislativa(models.Model): class TipoCasaLegislativa(models.Model):
""" Modelo para representar o tipo da Casa Legislativa """ Modelo para representar o tipo da Casa Legislativa
Geralmente: Câmara Municipal, Assembléia Legislativa, Geralmente: Câmara Municipal, Assembléia Legislativa,
@ -22,11 +24,13 @@ class TipoCasaLegislativa(models.Model):
nome = models.CharField( nome = models.CharField(
max_length=100 max_length=100
) )
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class CasaLegislativa(models.Model): class CasaLegislativa(models.Model):
""" Modelo para representar uma Casa Legislativa """ Modelo para representar uma Casa Legislativa
""" """
nome = models.CharField( nome = models.CharField(
@ -243,7 +247,9 @@ class CasaLegislativa(models.Model):
return super(CasaLegislativa, self).save(*args, **kwargs) return super(CasaLegislativa, self).save(*args, **kwargs)
class Funcionario(models.Model): class Funcionario(models.Model):
""" Modelo para registrar contatos vinculados às """ Modelo para registrar contatos vinculados às
Casas Legislativas Casas Legislativas
""" """
@ -287,13 +293,17 @@ class Funcionario(models.Model):
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class PresidenteManager(models.Manager): class PresidenteManager(models.Manager):
def get_queryset(self): def get_queryset(self):
qs = super(PresidenteManager, self).get_queryset() qs = super(PresidenteManager, self).get_queryset()
qs = qs.filter(setor='presidente') qs = qs.filter(setor='presidente')
return qs return qs
class Presidente(Funcionario): class Presidente(Funcionario):
class Meta: class Meta:
proxy = True proxy = True
@ -304,4 +314,3 @@ class Presidente(Funcionario):
self.cargo = 'Presidente' self.cargo = 'Presidente'
self.funcao = 'Presidente' self.funcao = 'Presidente'
return super(Presidente, self).save(*args, **kwargs) return super(Presidente, self).save(*args, **kwargs)

11
sigi/apps/casas/reports.py

@ -11,6 +11,7 @@ from sigi.settings import STATICFILES_DIRS
from geraldo.graphics import Image from geraldo.graphics import Image
def string_to_cm(texto): def string_to_cm(texto):
tamanho = 0 tamanho = 0
minEspeciais = { minEspeciais = {
@ -42,8 +43,8 @@ def string_to_cm(texto):
return tamanho return tamanho
class CasasLegislativasLabels(Report): class CasasLegislativasLabels(Report):
""" """
Usage example:: Usage example::
@ -134,6 +135,7 @@ class CasasLegislativasLabels(Report):
class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels): class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
def __init__(self, queryset, formato): def __init__(self, queryset, formato):
super(CasasLegislativasLabelsSemPresidente, self).__init__(queryset=queryset, formato=formato) super(CasasLegislativasLabelsSemPresidente, self).__init__(queryset=queryset, formato=formato)
@ -239,8 +241,6 @@ class CasasLegislativasReport(ReportDefault):
] ]
class band_page_footer(ReportDefault.band_page_footer): class band_page_footer(ReportDefault.band_page_footer):
pass pass
@ -294,10 +294,13 @@ class CasasLegislativasReport(ReportDefault):
class CasasSemConvenioReport(CasasLegislativasReport): class CasasSemConvenioReport(CasasLegislativasReport):
title = u'Relatório de Casas Legislativas sem Convênio' title = u'Relatório de Casas Legislativas sem Convênio'
class InfoCasaLegislativa(ReportDefault): class InfoCasaLegislativa(ReportDefault):
title = u'Casa legislativa' title = u'Casa legislativa'
class band_summary(ReportBand): class band_summary(ReportBand):
pass pass
class band_page_footer(ReportBand): class band_page_footer(ReportBand):
height = 1 * cm height = 1 * cm
@ -572,5 +575,3 @@ class InfoCasaLegislativa(ReportDefault):
), ),
) )
] ]

20
sigi/apps/casas/views.py

@ -20,6 +20,8 @@ import csv
# @param qs: queryset # @param qs: queryset
# @param o: (int) number of order field # @param o: (int) number of order field
def query_ordena(qs, o): def query_ordena(qs, o):
from sigi.apps.casas.admin import CasaLegislativaAdmin from sigi.apps.casas.admin import CasaLegislativaAdmin
list_display = CasaLegislativaAdmin.list_display list_display = CasaLegislativaAdmin.list_display
@ -36,6 +38,7 @@ def query_ordena(qs, o):
qs = qs.order_by(*order_fields) qs = qs.order_by(*order_fields)
return qs return qs
def get_for_qs(get, qs): def get_for_qs(get, qs):
""" """
Verifica atributos do GET e retorna queryset correspondente Verifica atributos do GET e retorna queryset correspondente
@ -51,6 +54,7 @@ def get_for_qs(get,qs):
return qs return qs
def carrinhoOrGet_for_qs(request): def carrinhoOrGet_for_qs(request):
""" """
Verifica se existe casas na sessão se não verifica get e retorna qs correspondente. Verifica se existe casas na sessão se não verifica get e retorna qs correspondente.
@ -64,6 +68,7 @@ def carrinhoOrGet_for_qs(request):
qs = get_for_qs(request.GET, qs) qs = get_for_qs(request.GET, qs)
return qs return qs
def adicionar_casas_carrinho(request, queryset=None, id=None): def adicionar_casas_carrinho(request, queryset=None, id=None):
if request.method == 'POST': if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action') ids_selecionados = request.POST.getlist('_selected_action')
@ -78,7 +83,6 @@ def adicionar_casas_carrinho(request,queryset=None,id=None):
request.session['carrinho_casas'] = lista request.session['carrinho_casas'] = lista
def visualizar_carrinho(request): def visualizar_carrinho(request):
qs = carrinhoOrGet_for_qs(request) qs = carrinhoOrGet_for_qs(request)
@ -110,11 +114,13 @@ def visualizar_carrinho(request):
} }
) )
def excluir_carrinho(request): def excluir_carrinho(request):
if request.session.has_key('carrinho_casas'): if request.session.has_key('carrinho_casas'):
del request.session['carrinho_casas'] del request.session['carrinho_casas']
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
def deleta_itens_carrinho(request): def deleta_itens_carrinho(request):
if request.method == 'POST': if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action') ids_selecionados = request.POST.getlist('_selected_action')
@ -125,14 +131,12 @@ def deleta_itens_carrinho(request):
if lista: if lista:
request.session['carrinho_casas'] = lista request.session['carrinho_casas'] = lista
else: else:
del lista; del lista
del request.session['carrinho_casas'] del request.session['carrinho_casas']
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'): def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'):
""" TODO: adicionar suporte para resultado de pesquisa do admin. """ TODO: adicionar suporte para resultado de pesquisa do admin.
""" """
@ -161,6 +165,7 @@ def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'):
return response return response
def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'): def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
""" TODO: adicionar suporte para resultado de pesquisa do admin. """ TODO: adicionar suporte para resultado de pesquisa do admin.
""" """
@ -169,7 +174,6 @@ def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
if request.POST.has_key('tamanho_etiqueta'): if request.POST.has_key('tamanho_etiqueta'):
formato = request.POST['tamanho_etiqueta'] formato = request.POST['tamanho_etiqueta']
if id: if id:
legislaturas = [c.legislatura_set.latest('data_inicio') for c in CasaLegislativa.objects.filter(pk__in=id, legislatura__id__isnull=False).distinct()] legislaturas = [c.legislatura_set.latest('data_inicio') for c in CasaLegislativa.objects.filter(pk__in=id, legislatura__id__isnull=False).distinct()]
mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas]) mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
@ -189,6 +193,7 @@ def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
return response return response
def carrinhoOrGet_for_parlamentar_qs(request): def carrinhoOrGet_for_parlamentar_qs(request):
""" """
Verifica se existe parlamentares na sessão se não verifica get e retorna qs correspondente. Verifica se existe parlamentares na sessão se não verifica get e retorna qs correspondente.
@ -208,6 +213,7 @@ def carrinhoOrGet_for_parlamentar_qs(request):
qs = get_for_qs(request.GET, qs) qs = get_for_qs(request.GET, qs)
return qs return qs
def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'): def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'):
""" TODO: adicionar suporte para resultado de pesquisa do admin. """ TODO: adicionar suporte para resultado de pesquisa do admin.
""" """
@ -237,7 +243,6 @@ def report(request, id=None,tipo=None):
if tipo == 'completo': if tipo == 'completo':
return report_complete(request, id) return report_complete(request, id)
if id: if id:
qs = CasaLegislativa.objects.filter(pk=id) qs = CasaLegislativa.objects.filter(pk=id)
else: else:
@ -253,6 +258,7 @@ def report(request, id=None,tipo=None):
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response
def report_complete(request, id=None): def report_complete(request, id=None):
if id: if id:
@ -290,6 +296,7 @@ def report_complete(request,id=None):
return response return response
def casas_sem_convenio_report(request): def casas_sem_convenio_report(request):
qs = CasaLegislativa.objects.filter(convenio=None).order_by('municipio__uf', 'nome') qs = CasaLegislativa.objects.filter(convenio=None).order_by('municipio__uf', 'nome')
@ -304,7 +311,6 @@ def casas_sem_convenio_report(request):
return response return response
def export_csv(request): def export_csv(request):
response = HttpResponse(mimetype='text/csv') response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=casas.csv' response['Content-Disposition'] = 'attachment; filename=casas.csv'

3
sigi/apps/contatos/admin.py

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

10
sigi/apps/contatos/models.py

@ -6,8 +6,8 @@ from sigi.apps.utils import SearchField
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import MaxValueValidator, MinValueValidator
class UnidadeFederativa(models.Model): class UnidadeFederativa(models.Model):
""" Modelo que representa um estado brasileiro """ Modelo que representa um estado brasileiro
""" """
REGIAO_CHOICES = ( REGIAO_CHOICES = (
@ -42,7 +42,9 @@ class UnidadeFederativa(models.Model):
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class Municipio(models.Model): class Municipio(models.Model):
""" Modelo para representar as cidades brasileiras """ Modelo para representar as cidades brasileiras
""" """
codigo_ibge = models.PositiveIntegerField( codigo_ibge = models.PositiveIntegerField(
@ -118,7 +120,9 @@ class Municipio(models.Model):
return "http://maps.google.com.br/maps/mm?ie=UTF8&hl=pt-BR&t=h&ll=%s,%s&spn=1.61886,1.812744&z=9&source=embed" % \ return "http://maps.google.com.br/maps/mm?ie=UTF8&hl=pt-BR&t=h&ll=%s,%s&spn=1.61886,1.812744&z=9&source=embed" % \
(self.latitude, self.longitude) (self.latitude, self.longitude)
class Telefone(models.Model): class Telefone(models.Model):
""" Modelo genérico para agrupar telefones dos modulos do sistema """ Modelo genérico para agrupar telefones dos modulos do sistema
""" """
TELEFONE_CHOICES = ( TELEFONE_CHOICES = (
@ -153,7 +157,9 @@ class Telefone(models.Model):
def __unicode__(self): def __unicode__(self):
return unicode(self.numero) return unicode(self.numero)
class Contato(models.Model): class Contato(models.Model):
""" Modelo generico para registrar contatos vinculados aos """ Modelo generico para registrar contatos vinculados aos
modulos do sistema modulos do sistema
""" """
@ -185,6 +191,7 @@ class Contato(models.Model):
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class Endereco(models.Model): class Endereco(models.Model):
TIPO_CHOICES = ( TIPO_CHOICES = (
('aeroporto', 'Aeroporto'), ('aeroporto', 'Aeroporto'),
@ -276,4 +283,3 @@ class Endereco(models.Model):
def __unicode__(self): def __unicode__(self):
return self.tipo + ' ' + self.logradouro + ', ' + self.numero \ return self.tipo + ' ' + self.logradouro + ', ' + self.numero \
+ ' ' + self.complemento + ' - ' + self.bairro + ' ' + self.complemento + ' - ' + self.bairro

7
sigi/apps/convenios/admin.py

@ -11,20 +11,24 @@ from geraldo.generators import PDFGenerator
from sigi.apps.convenios.views import adicionar_convenios_carrinho from sigi.apps.convenios.views import adicionar_convenios_carrinho
class TramitacaoInline(admin.TabularInline): class TramitacaoInline(admin.TabularInline):
model = Tramitacao model = Tramitacao
extra = 1 extra = 1
class AnexosInline(admin.TabularInline): class AnexosInline(admin.TabularInline):
model = Anexo model = Anexo
extra = 2 extra = 2
exclude = ['data_pub', ] exclude = ['data_pub', ]
class EquipamentoPrevistoInline(admin.TabularInline): class EquipamentoPrevistoInline(admin.TabularInline):
model = EquipamentoPrevisto model = EquipamentoPrevisto
extra = 2 extra = 2
raw_id_fields = ('equipamento',) raw_id_fields = ('equipamento',)
class AnexoAdmin(admin.ModelAdmin): class AnexoAdmin(admin.ModelAdmin):
date_hierarchy = 'data_pub' date_hierarchy = 'data_pub'
exclude = ['data_pub', ] exclude = ['data_pub', ]
@ -33,6 +37,7 @@ class AnexoAdmin(admin.ModelAdmin):
search_fields = ('descricao', 'convenio__id', 'arquivo', search_fields = ('descricao', 'convenio__id', 'arquivo',
'convenio__casa_legislativa__nome') 'convenio__casa_legislativa__nome')
class ConvenioAdmin(admin.ModelAdmin): class ConvenioAdmin(admin.ModelAdmin):
change_list_template = 'convenios/change_list.html' change_list_template = 'convenios/change_list.html'
fieldsets = ( fieldsets = (
@ -93,6 +98,7 @@ class ConvenioAdmin(admin.ModelAdmin):
request, request,
extra_context={'query_str': '?' + request.META['QUERY_STRING']} extra_context={'query_str': '?' + request.META['QUERY_STRING']}
) )
def relatorio(self, request, queryset): def relatorio(self, request, queryset):
# queryset.order_by('casa_legislativa__municipio__uf') # queryset.order_by('casa_legislativa__municipio__uf')
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
@ -126,6 +132,7 @@ class ConvenioAdmin(admin.ModelAdmin):
return super(ConvenioAdmin, self).lookup_allowed(lookup, value) or \ return super(ConvenioAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact'] lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact']
class EquipamentoPrevistoAdmin(admin.ModelAdmin): class EquipamentoPrevistoAdmin(admin.ModelAdmin):
list_display = ('convenio', 'equipamento', 'quantidade') list_display = ('convenio', 'equipamento', 'quantidade')
list_display_links = ('convenio', 'equipamento') list_display_links = ('convenio', 'equipamento')

9
sigi/apps/convenios/models.py

@ -6,6 +6,7 @@ from sigi.apps.utils import SearchField
class Projeto(models.Model): class Projeto(models.Model):
""" Modelo para representar os projetos do programa """ Modelo para representar os projetos do programa
Interlegis Interlegis
""" """
@ -17,6 +18,7 @@ class Projeto(models.Model):
class Convenio(models.Model): class Convenio(models.Model):
""" Modelo que representa um convênio do Interlegis """ Modelo que representa um convênio do Interlegis
com uma Casa Legislativa. com uma Casa Legislativa.
@ -102,7 +104,6 @@ class Convenio(models.Model):
self.equipada = self.data_termo_aceite != None self.equipada = self.data_termo_aceite != None
super(Convenio, self).save(*args, **kwargs) super(Convenio, self).save(*args, **kwargs)
class Meta: class Meta:
get_latest_by = 'id' get_latest_by = 'id'
ordering = ('id',) ordering = ('id',)
@ -116,6 +117,7 @@ class Convenio(models.Model):
class EquipamentoPrevisto(models.Model): class EquipamentoPrevisto(models.Model):
""" Modelo utilizado para registrar os equipamentos """ Modelo utilizado para registrar os equipamentos
disponibilizados para as Casas Legislativas disponibilizados para as Casas Legislativas
(foi usado na prmeira etapa do programa) (foi usado na prmeira etapa do programa)
@ -133,6 +135,7 @@ class EquipamentoPrevisto(models.Model):
class Anexo(models.Model): class Anexo(models.Model):
""" Modelo para giardar os documentos gerados """ Modelo para giardar os documentos gerados
no processo de convênio no processo de convênio
""" """
@ -151,7 +154,9 @@ class Anexo(models.Model):
def __unicode__(self): def __unicode__(self):
return unicode("%s publicado em %s" % (self.descricao, self.data_pub)) return unicode("%s publicado em %s" % (self.descricao, self.data_pub))
class UnidadeAdministrativa(models.Model): class UnidadeAdministrativa(models.Model):
""" Modelo para representar uma Unidade Administrativa """ Modelo para representar uma Unidade Administrativa
que pode ser um servivo do próprio Interlegis, assim como que pode ser um servivo do próprio Interlegis, assim como
uma unidade do Senado Federal uma unidade do Senado Federal
@ -164,6 +169,7 @@ class UnidadeAdministrativa(models.Model):
class Tramitacao(models.Model): class Tramitacao(models.Model):
""" Modelo para registrar as vias do processo de convênio e a Unidade """ Modelo para registrar as vias do processo de convênio e a Unidade
responsável pelo tramite (ex. colher assinaturas do secretário do senado) responsável pelo tramite (ex. colher assinaturas do secretário do senado)
""" """
@ -185,4 +191,3 @@ class Tramitacao(models.Model):
return unicode("%s em %s (%s)" % (self.unid_admin, self.data, self.observacao)) return unicode("%s em %s (%s)" % (self.unid_admin, self.data, self.observacao))
else: else:
return unicode("%s em %s" % (self.unid_admin, self.data)) return unicode("%s em %s" % (self.unid_admin, self.data))

22
sigi/apps/convenios/reports.py

@ -15,18 +15,23 @@ from sigi.apps.relatorios.reports import ReportDefault
#from abc import ABCMeta #from abc import ABCMeta
class CasasAderidasReport(object): class CasasAderidasReport(object):
pass pass
class CasasNaoAderidasReport(object): class CasasNaoAderidasReport(object):
pass pass
class CasasComEquipamentosReport(object): class CasasComEquipamentosReport(object):
pass pass
class SemEquipamentosReport(object): class SemEquipamentosReport(object):
pass pass
class ConvenioReport(ReportDefault): class ConvenioReport(ReportDefault):
title = u'Relatório de Convênios' title = u'Relatório de Convênios'
@ -86,8 +91,6 @@ class ConvenioReport(ReportDefault):
), ),
] ]
class band_page_footer(ReportDefault.band_page_footer): class band_page_footer(ReportDefault.band_page_footer):
pass pass
@ -152,7 +155,9 @@ class ConvenioReport(ReportDefault):
) )
] ]
class ConvenioReportSemAceite(ConvenioReport): class ConvenioReportSemAceite(ConvenioReport):
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top label_top = ReportDefault.band_page_header.label_top
@ -203,7 +208,6 @@ class ConvenioReportSemAceite(ConvenioReport):
), ),
] ]
class band_detail(ReportDefault.band_detail): class band_detail(ReportDefault.band_detail):
label_left = [0, 1.5, 7, 9, 11, 13, 15, 17] label_left = [0, 1.5, 7, 9, 11, 13, 15, 17]
@ -246,10 +250,9 @@ class ConvenioReportSemAceite(ConvenioReport):
] ]
float_duas_casas = lambda instance: '%.2f' % (instance)
float_duas_casas = lambda instance: '%.2f' % (instance)
class ConvenioReportRegiao(ReportDefault): class ConvenioReportRegiao(ReportDefault):
title = u'Relatório de Convênios por Região' title = u'Relatório de Convênios por Região'
@ -268,6 +271,7 @@ class ConvenioReportRegiao(ReportDefault):
Label(text="Ñ Aderidas", left=label_left[4] * cm, top=label_top,), Label(text="Ñ Aderidas", left=label_left[4] * cm, top=label_top,),
Label(text="%", left=label_left[5] * cm, top=label_top), Label(text="%", left=label_left[5] * cm, top=label_top),
] ]
class band_detail(ReportDefault.band_detail): class band_detail(ReportDefault.band_detail):
label_left = [0.5, 6, 8, 10, 12, 14] label_left = [0.5, 6, 8, 10, 12, 14]
display_inline = True display_inline = True
@ -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', action=FIELD_ACTION_SUM, left=label_left[1] * cm, ),
ObjectValue(attribute_name='quant_casas_aderidas', action=FIELD_ACTION_SUM, left=label_left[2] * cm), ObjectValue(attribute_name='quant_casas_aderidas', action=FIELD_ACTION_SUM, left=label_left[2] * cm),
# ObjectValue(attribute_name='porc_casas_aderidas', action=FIELD_ACTION_AVG, left=label_left[3]*cm, # ObjectValue(attribute_name='porc_casas_aderidas', action=FIELD_ACTION_AVG, left=label_left[3]*cm,
# #get_value= lambda instance : lambda instance: '%.2f' % (instance.porc_casas_aderidas), # get_value= lambda instance : lambda instance: '%.2f' % (instance.porc_casas_aderidas),
# ), # ),
ObjectValue(attribute_name='quant_casas_nao_aderidas', action=FIELD_ACTION_SUM, left=label_left[4] * cm), ObjectValue(attribute_name='quant_casas_nao_aderidas', action=FIELD_ACTION_SUM, left=label_left[4] * cm),
# ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm, # ObjectValue(attribute_name='porc_casas_nao_aderidas', left=label_left[5]*cm,
@ -300,17 +304,17 @@ class ConvenioReportRegiao(ReportDefault):
borders = {'top': True} borders = {'top': True}
class ConvenioPorCMReport(ConvenioReport): class ConvenioPorCMReport(ConvenioReport):
title = u'Relatório de Convênios por Câmara Municipal' title = u'Relatório de Convênios por Câmara Municipal'
class ConvenioPorALReport(ConvenioReport): class ConvenioPorALReport(ConvenioReport):
title = u'Relatório de Convênios por Assembléia Legislativa' title = u'Relatório de Convênios por Assembléia Legislativa'
class ConvenioReportSemAceiteCM(ConvenioReportSemAceite): class ConvenioReportSemAceiteCM(ConvenioReportSemAceite):
title = u'Relatório de Convênios por Câmara Municipal' title = u'Relatório de Convênios por Câmara Municipal'
class ConvenioReportSemAceiteAL(ConvenioReportSemAceite): class ConvenioReportSemAceiteAL(ConvenioReportSemAceite):
title = u'Relatório de Convênios por Assembléia Legislativa' title = u'Relatório de Convênios por Assembléia Legislativa'

16
sigi/apps/convenios/views.py

@ -22,6 +22,7 @@ import datetime
import csv import csv
def query_ordena(qs, o, ot): def query_ordena(qs, o, ot):
list_display = ('num_convenio', 'casa_legislativa', list_display = ('num_convenio', 'casa_legislativa',
'data_adesao', 'data_retorno_assinatura', 'data_termo_aceite', 'data_adesao', 'data_retorno_assinatura', 'data_termo_aceite',
@ -35,6 +36,7 @@ def query_ordena(qs,o,ot):
qs = qs.order_by("-" + aux) qs = qs.order_by("-" + aux)
return qs return qs
def get_for_qs(get, qs): def get_for_qs(get, qs):
kwargs = {} kwargs = {}
ids = 0 ids = 0
@ -55,6 +57,7 @@ def get_for_qs(get,qs):
qs = Convenio.objects.extra(where=[query]) qs = Convenio.objects.extra(where=[query])
return qs return qs
def carrinhoOrGet_for_qs(request): def carrinhoOrGet_for_qs(request):
""" """
Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente. Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente.
@ -69,6 +72,7 @@ def carrinhoOrGet_for_qs(request):
qs = get_for_qs(request.GET, qs) qs = get_for_qs(request.GET, qs)
return qs return qs
def adicionar_convenios_carrinho(request, queryset=None, id=None): def adicionar_convenios_carrinho(request, queryset=None, id=None):
if request.method == 'POST': if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action') ids_selecionados = request.POST.getlist('_selected_action')
@ -82,11 +86,13 @@ def adicionar_convenios_carrinho(request,queryset=None,id=None):
lista.append(id) lista.append(id)
request.session['carrinho_convenios'] = lista request.session['carrinho_convenios'] = lista
def excluir_carrinho(request): def excluir_carrinho(request):
if request.session.has_key('carrinho_convenios'): if request.session.has_key('carrinho_convenios'):
del request.session['carrinho_convenios'] del request.session['carrinho_convenios']
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
def deleta_itens_carrinho(request): def deleta_itens_carrinho(request):
if request.method == 'POST': if request.method == 'POST':
ids_selecionados = request.POST.getlist('_selected_action') ids_selecionados = request.POST.getlist('_selected_action')
@ -97,11 +103,12 @@ def deleta_itens_carrinho(request):
if lista: if lista:
request.session['carrinho_convenios'] = lista request.session['carrinho_convenios'] = lista
else: else:
del lista; del lista
del request.session['carrinho_convenios'] del request.session['carrinho_convenios']
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
def visualizar_carrinho(request): def visualizar_carrinho(request):
qs = carrinhoOrGet_for_qs(request) qs = carrinhoOrGet_for_qs(request)
@ -133,6 +140,7 @@ def visualizar_carrinho(request):
} }
) )
def report(request, id=None): def report(request, id=None):
if id: if id:
@ -166,7 +174,6 @@ def report(request, id=None):
else: else:
report = ConvenioPorCMReport(queryset=qs) report = ConvenioPorCMReport(queryset=qs)
response = HttpResponse(mimetype='application/pdf') response = HttpResponse(mimetype='application/pdf')
if report: if report:
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
@ -174,8 +181,8 @@ def report(request, id=None):
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
return response return response
def casas_estado_to_tabela(casas,convenios,regiao):
def casas_estado_to_tabela(casas, convenios, regiao):
estados = get_list_or_404(UnidadeFederativa, regiao=regiao) estados = get_list_or_404(UnidadeFederativa, regiao=regiao)
@ -236,6 +243,7 @@ def casas_estado_to_tabela(casas,convenios,regiao):
"sumario": sumario, "sumario": sumario,
} }
def report_regiao(request, regiao='NE'): def report_regiao(request, regiao='NE'):
if request.POST: if request.POST:
@ -282,6 +290,7 @@ def report_regiao(request,regiao='NE'):
return response return response
def export_csv(request): def export_csv(request):
response = HttpResponse(mimetype='text/csv') response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=convenios.csv' response['Content-Disposition'] = 'attachment; filename=convenios.csv'
@ -341,4 +350,3 @@ def export_csv(request):
csv_writer.writerow(lista) csv_writer.writerow(lista)
return response 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.diagnosticos.forms import DiagnosticoForm
from sigi.apps.contatos.models import UnidadeFederativa from sigi.apps.contatos.models import UnidadeFederativa
def publicar_diagnostico(self, request, queryset): def publicar_diagnostico(self, request, queryset):
for registro in queryset: for registro in queryset:
diagnostico = Diagnostico.objects.get(pk=registro.id) diagnostico = Diagnostico.objects.get(pk=registro.id)
@ -27,14 +28,17 @@ def despublicar_diagnostico(self, request, queryset):
despublicar_diagnostico.short_description = u""" despublicar_diagnostico.short_description = u"""
Definir diagnósticos como não publicado""" Definir diagnósticos como não publicado"""
class EquipeInline(admin.TabularInline): class EquipeInline(admin.TabularInline):
model = Equipe model = Equipe
class AnexosInline(admin.TabularInline): class AnexosInline(admin.TabularInline):
model = Anexo model = Anexo
extra = 2 extra = 2
exclude = ['data_pub', ] exclude = ['data_pub', ]
class AnexoAdmin(admin.ModelAdmin): class AnexoAdmin(admin.ModelAdmin):
date_hierarchy = 'data_pub' date_hierarchy = 'data_pub'
exclude = ['data_pub', ] exclude = ['data_pub', ]
@ -43,6 +47,7 @@ class AnexoAdmin(admin.ModelAdmin):
search_fields = ('descricao', 'diagnostico__id', 'arquivo', search_fields = ('descricao', 'diagnostico__id', 'arquivo',
'diagnostico__casa_legislativa__nome') 'diagnostico__casa_legislativa__nome')
class DiagnosticoAdmin(BaseEntityAdmin): class DiagnosticoAdmin(BaseEntityAdmin):
form = DiagnosticoForm form = DiagnosticoForm
actions = [publicar_diagnostico, despublicar_diagnostico] actions = [publicar_diagnostico, despublicar_diagnostico]
@ -71,7 +76,6 @@ class DiagnosticoAdmin(BaseEntityAdmin):
'classes': ['collapse'] 'classes': ['collapse']
}),) }),)
def get_uf(self, obj): def get_uf(self, obj):
return '%s' % (obj.casa_legislativa.municipio.uf) return '%s' % (obj.casa_legislativa.municipio.uf)
get_uf.short_description = 'UF' get_uf.short_description = 'UF'
@ -104,12 +108,14 @@ class DiagnosticoAdmin(BaseEntityAdmin):
return super(DiagnosticoAdmin, self).changelist_view(request, extra_context) return super(DiagnosticoAdmin, self).changelist_view(request, extra_context)
class EscolhaAdmin(admin.ModelAdmin): class EscolhaAdmin(admin.ModelAdmin):
search_fields = ('title',) search_fields = ('title',)
list_display = ('title', 'schema', 'schema_to_open') list_display = ('title', 'schema', 'schema_to_open')
raw_id_fields = ('schema', 'schema_to_open') raw_id_fields = ('schema', 'schema_to_open')
ordering = ('schema', 'title') ordering = ('schema', 'title')
class EscolhaInline(admin.TabularInline): class EscolhaInline(admin.TabularInline):
model = Escolha model = Escolha
fk_name = 'schema' fk_name = 'schema'
@ -117,6 +123,7 @@ class EscolhaInline(admin.TabularInline):
verbose_name = 'Escolhas (apenas para choices ou multiple choices)' verbose_name = 'Escolhas (apenas para choices ou multiple choices)'
extra = 0 extra = 0
class PerguntaAdmin (BaseSchemaAdmin): class PerguntaAdmin (BaseSchemaAdmin):
search_fields = ('title', 'help_text', 'name',) search_fields = ('title', 'help_text', 'name',)
list_display = ('title', 'categoria', 'datatype', 'help_text', 'required') list_display = ('title', 'categoria', 'datatype', 'help_text', 'required')

1
sigi/apps/diagnosticos/decorators.py

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

5
sigi/apps/diagnosticos/forms.py

@ -16,6 +16,7 @@ from eav.fields import RangeField
class DiagnosticoForm(BaseDynamicEntityForm): class DiagnosticoForm(BaseDynamicEntityForm):
"""Classe responsável por contruir o formulário, """Classe responsável por contruir o formulário,
vinculando ao modelo Diagnostico vinculando ao modelo Diagnostico
""" """
@ -28,7 +29,9 @@ class DiagnosticoForm(BaseDynamicEntityForm):
if isinstance(f, CharField): if isinstance(f, CharField):
f.widget = forms.widgets.Textarea(attrs={'cols': '80'}) f.widget = forms.widgets.Textarea(attrs={'cols': '80'})
class DiagnosticoMobileForm(BaseDynamicEntityForm): class DiagnosticoMobileForm(BaseDynamicEntityForm):
"""Classe responsável por construir o formulário """Classe responsável por construir o formulário
para ser usado no ambiente mobile, a partir do para ser usado no ambiente mobile, a partir do
do modelo Diagnostico, como também organizar sua do modelo Diagnostico, como também organizar sua
@ -62,6 +65,7 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm):
'inscricoes_para_lista_gial': {'widget': Textarea}, 'inscricoes_para_lista_gial': {'widget': Textarea},
'inscricoes_para_lista_gicom': {'widget': Textarea}, 'inscricoes_para_lista_gicom': {'widget': Textarea},
} }
class Meta: class Meta:
model = Diagnostico model = Diagnostico
fields = '__all__' fields = '__all__'
@ -151,6 +155,7 @@ class CasaLegislativaMobileForm(forms.ModelForm):
class TelefoneMobileForm(forms.ModelForm): class TelefoneMobileForm(forms.ModelForm):
pass pass
class Meta: class Meta:
model = Telefone model = Telefone
fields = ('numero', 'tipo') fields = ('numero', 'tipo')

8
sigi/apps/diagnosticos/models.py

@ -9,6 +9,7 @@ from eav.models import BaseChoice, BaseEntity, BaseSchema, BaseAttribute
class Diagnostico(BaseEntity): class Diagnostico(BaseEntity):
""" Modelo para representar unm diagnostico realizado """ Modelo para representar unm diagnostico realizado
em uma Casa Legislativa em uma Casa Legislativa
""" """
@ -113,7 +114,6 @@ class Diagnostico(BaseEntity):
'status': "Alterado", 'status': "Alterado",
}) })
def get_schemata(self, category=None, *args, **kwargs): def get_schemata(self, category=None, *args, **kwargs):
""" Se existir uma categoria retorna apenas as questões dessa. """ Se existir uma categoria retorna apenas as questões dessa.
""" """
@ -136,6 +136,7 @@ class Diagnostico(BaseEntity):
class Categoria(models.Model): class Categoria(models.Model):
""" Modelo para representar a categoria de uma pergunta """ Modelo para representar a categoria de uma pergunta
e sua ordem na hora de exibir no formulário e sua ordem na hora de exibir no formulário
""" """
@ -149,6 +150,7 @@ class Categoria(models.Model):
class Pergunta(BaseSchema): class Pergunta(BaseSchema):
""" Modelo que representa uma pergunta no questionário """ Modelo que representa uma pergunta no questionário
e sua ordem dentro da categoria e sua ordem dentro da categoria
@ -190,6 +192,7 @@ class Pergunta(BaseSchema):
class Escolha(BaseChoice): class Escolha(BaseChoice):
""" Perguntas de multiplas escolhas tem as opções """ Perguntas de multiplas escolhas tem as opções
cadastradas neste modelo cadastradas neste modelo
""" """
@ -205,6 +208,7 @@ class Escolha(BaseChoice):
class Resposta(BaseAttribute): class Resposta(BaseAttribute):
""" Modelo para guardar as respostas das perguntas """ Modelo para guardar as respostas das perguntas
de um diagnosico de um diagnosico
""" """
@ -218,6 +222,7 @@ class Resposta(BaseAttribute):
class Equipe(models.Model): class Equipe(models.Model):
""" Modelo que representa a equipe de um diagnóstico """ Modelo que representa a equipe de um diagnóstico
""" """
diagnostico = models.ForeignKey(Diagnostico) diagnostico = models.ForeignKey(Diagnostico)
@ -231,6 +236,7 @@ class Equipe(models.Model):
class Anexo(models.Model): class Anexo(models.Model):
""" Modelo para representar os documentos levantados """ Modelo para representar os documentos levantados
no processo de diagnóstico. Podem ser fotos, contratos, etc. no processo de diagnóstico. Podem ser fotos, contratos, etc.
""" """

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

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

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

1
sigi/apps/financeiro/admin.py

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

2
sigi/apps/financeiro/models.py

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

8
sigi/apps/inventario/admin.py

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

6
sigi/apps/inventario/models.py

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

11
sigi/apps/mesas/admin.py

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

7
sigi/apps/mesas/models.py

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

2
sigi/apps/metas/admin.py

@ -2,11 +2,13 @@
from django.contrib import admin from django.contrib import admin
from sigi.apps.metas.models import Meta, PlanoDiretor from sigi.apps.metas.models import Meta, PlanoDiretor
class MetaAdmin(admin.ModelAdmin): class MetaAdmin(admin.ModelAdmin):
list_display = ('projeto', 'titulo', 'data_inicio', 'data_fim', 'valor_meta', 'valor_executado', 'percentual_concluido',) list_display = ('projeto', 'titulo', 'data_inicio', 'data_fim', 'valor_meta', 'valor_executado', 'percentual_concluido',)
fields = ('projeto', 'titulo', 'descricao', 'data_inicio', 'data_fim', 'algoritmo', 'valor_meta',) fields = ('projeto', 'titulo', 'descricao', 'data_inicio', 'data_fim', 'algoritmo', 'valor_meta',)
list_filter = ('projeto',) list_filter = ('projeto',)
class PlanoDiretorAdmin(admin.ModelAdmin): class PlanoDiretorAdmin(admin.ModelAdmin):
list_display = ('projeto', 'casa_legislativa', 'get_uf', 'status', 'data_entrega', 'data_implantacao',) list_display = ('projeto', 'casa_legislativa', 'get_uf', 'status', 'data_entrega', 'data_implantacao',)
fields = ('projeto', 'casa_legislativa', 'status', 'data_entrega', 'data_implantacao',) fields = ('projeto', 'casa_legislativa', 'status', 'data_entrega', 'data_implantacao',)

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

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

13
sigi/apps/metas/models.py

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

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

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

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') JSON_FILE_NAME = os.path.join(MEDIA_ROOT, 'apps/metas/map_data.json')
@login_required
@login_required
def dashboard(request): def dashboard(request):
if request.user.groups.filter(name__in=['SPDT-Servidores', 'SSPLF']).count() <= 0: if request.user.groups.filter(name__in=['SPDT-Servidores', 'SSPLF']).count() <= 0:
raise PermissionDenied raise PermissionDenied
@ -56,6 +56,7 @@ def dashboard(request):
extra_context = {'desembolsos': matriz, 'desembolsos_max': desembolsos_max, 'meses': meses, 'colors': ','.join(colors[:len(matriz)])} extra_context = {'desembolsos': matriz, 'desembolsos_max': desembolsos_max, 'meses': meses, 'colors': ','.join(colors[:len(matriz)])}
return render_to_response('metas/dashboard.html', extra_context, context_instance=RequestContext(request)) return render_to_response('metas/dashboard.html', extra_context, context_instance=RequestContext(request))
def mapa(request): def mapa(request):
""" """
Mostra o mapa com filtros carregados com valores default Mostra o mapa com filtros carregados com valores default
@ -105,6 +106,7 @@ def map_data(request):
return HttpResponse(json, mimetype="application/json") return HttpResponse(json, mimetype="application/json")
def map_search(request): def map_search(request):
response = {'result': 'NOT_FOUND'} response = {'result': 'NOT_FOUND'}
if 'q' in request.GET: if 'q' in request.GET:
@ -119,6 +121,7 @@ def map_search(request):
return HttpResponse(simplejson.dumps(response), mimetype="application/json") return HttpResponse(simplejson.dumps(response), mimetype="application/json")
@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos) @cache_page(86400) # Cache de um dia (24 horas = 86400 segundos)
def map_sum(request): def map_sum(request):
# Filtrar Casas de acordo com os parâmetros # Filtrar Casas de acordo com os parâmetros
@ -154,7 +157,6 @@ def map_sum(request):
'convenios': tot_projetos.copy(), 'equipadas': tot_projetos.copy(), 'convenios': tot_projetos.copy(), 'equipadas': tot_projetos.copy(),
'diagnosticos': tot_diagnosticos.copy()} 'diagnosticos': tot_diagnosticos.copy()}
# Processar as casas filtradas # Processar as casas filtradas
for casa in casas.distinct(): for casa in casas.distinct():
uf = casa.municipio.uf uf = casa.municipio.uf
@ -192,6 +194,7 @@ def map_sum(request):
} }
return render_to_pdf('metas/map_sum.html', extra_context) return render_to_pdf('metas/map_sum.html', extra_context)
@cache_page(86400) # Cache de um dia (24 horas = 86400 segundos) @cache_page(86400) # Cache de um dia (24 horas = 86400 segundos)
def map_list(request): def map_list(request):
# Filtrar Casas de acordo com os parâmetros # Filtrar Casas de acordo com os parâmetros
@ -253,6 +256,7 @@ def get_params(request):
'estados': request.GET.getlist('estados'), 'estados': request.GET.getlist('estados'),
} }
def filtrar_casas(seit, convenios, equipadas, regioes, estados, diagnosticos): def filtrar_casas(seit, convenios, equipadas, regioes, estados, diagnosticos):
''' Filtrar Casas que atendem aos parâmetros de pesquisa ''' ''' Filtrar Casas que atendem aos parâmetros de pesquisa '''
qServico = Q(servico__tipo_servico__sigla__in=seit) qServico = Q(servico__tipo_servico__sigla__in=seit)
@ -270,6 +274,7 @@ def filtrar_casas(seit, convenios, equipadas, regioes, estados, diagnosticos):
return casas return casas
def gera_map_data_file(cronjob=False): def gera_map_data_file(cronjob=False):
''' Criar um arquivo json em {settings.MEDIA_ROOT}/apps/metas/ com o nome de map_data.json ''' Criar um arquivo json em {settings.MEDIA_ROOT}/apps/metas/ com o nome de map_data.json
Este arquivo será consumido pela view de dados de mapa. Este arquivo será consumido pela view de dados de mapa.
@ -284,7 +289,8 @@ def gera_map_data_file(cronjob=False):
for c in CasaLegislativa.objects.select_related('servico', 'convenio', 'diagnostico').all().distinct(): for c in CasaLegislativa.objects.select_related('servico', 'convenio', 'diagnostico').all().distinct():
if c.servico_set.count() == 0 and c.convenio_set.count() == 0 and c.diagnostico_set.count() == 0: if c.servico_set.count() == 0 and c.convenio_set.count() == 0 and c.diagnostico_set.count() == 0:
continue; # Salta essa casa, pois ela não tem nada com o Interlegis continue
# Salta essa casa, pois ela não tem nada com o Interlegis
if not casas.has_key(c.pk): if not casas.has_key(c.pk):
casa = { casa = {

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.parlamentares.views import adicionar_parlamentar_carrinho
from sigi.apps.utils.alphabetic_filter import AlphabeticFilter from sigi.apps.utils.alphabetic_filter import AlphabeticFilter
class MandatosInline(admin.TabularInline): class MandatosInline(admin.TabularInline):
model = Mandato model = Mandato
extra = 1 extra = 1
raw_id_fields = ('legislatura', 'partido') raw_id_fields = ('legislatura', 'partido')
class TelefonesInline(generic.GenericTabularInline): class TelefonesInline(generic.GenericTabularInline):
model = Telefone model = Telefone
extra = 2 extra = 2
class PartidoAdmin(admin.ModelAdmin): class PartidoAdmin(admin.ModelAdmin):
list_display = ('nome', 'sigla') list_display = ('nome', 'sigla')
list_display_links = ('nome', 'sigla') list_display_links = ('nome', 'sigla')

1
sigi/apps/parlamentares/models.py

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

11
sigi/apps/parlamentares/reports.py

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

3
sigi/apps/parlamentares/views.py

@ -116,7 +116,7 @@ def deleta_itens_carrinho(request):
if lista: if lista:
request.session['carrinho_parlamentar'] = lista request.session['carrinho_parlamentar'] = lista
else: else:
del lista; del lista
del request.session['carrinho_parlamentar'] del request.session['carrinho_parlamentar']
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
@ -130,7 +130,6 @@ def labels_report(request, id=None, formato='3x9_etiqueta'):
if request.POST.has_key('tipo_etiqueta'): if request.POST.has_key('tipo_etiqueta'):
tipo = request.POST['tipo_etiqueta'] tipo = request.POST['tipo_etiqueta']
if id: if id:
qs = Parlamentar.objects.filter(pk=id) qs = Parlamentar.objects.filter(pk=id)

4
sigi/apps/relatorios/reports.py

@ -68,9 +68,7 @@ class ReportDefault(Report):
height = 0.8 * cm height = 0.8 * cm
elements = [ elements = [
Label(text="Total:", top=0.1 * cm, left=0), Label(text="Total:", top=0.1 * cm, left=0),
ObjectValue(attribute_name='id', top=0.1*cm, left=1*cm,\ ObjectValue(attribute_name='id', top=0.1 * cm, left=1 * cm,
action=FIELD_ACTION_COUNT, display_format='%s'), action=FIELD_ACTION_COUNT, display_format='%s'),
] ]
borders = {'top': Line(stroke_color=navy, stroke_width=2)} borders = {'top': Line(stroke_color=navy, stroke_width=2)}

5
sigi/apps/servicos/admin.py

@ -17,6 +17,7 @@ class LogServicoInline(admin.StackedInline):
class ServicoFormAdmin(ModelForm): class ServicoFormAdmin(ModelForm):
class Meta: class Meta:
model = Servico model = Servico
fields = '__all__' fields = '__all__'
@ -118,7 +119,6 @@ class ServicoAdmin(admin.ModelAdmin):
return super(ServicoAdmin, self).lookup_allowed(lookup, value) or \ return super(ServicoAdmin, self).lookup_allowed(lookup, value) or \
lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact'] lookup in ['casa_legislativa__municipio__uf__codigo_ibge__exact']
def add_view(self, request, form_url='', extra_context=None): def add_view(self, request, form_url='', extra_context=None):
id_casa = request.GET.get('id_casa', None) id_casa = request.GET.get('id_casa', None)
@ -178,8 +178,7 @@ class CasaAtendidaAdmin(admin.ModelAdmin):
fieldsets = ( fieldsets = (
('Casa legislativa', { ('Casa legislativa', {
'fields': (('codigo_interlegis', 'nome'), ('logradouro', 'bairro', 'municipio', 'cep'), ('email', 'pagina_web')) 'fields': (('codigo_interlegis', 'nome'), ('logradouro', 'bairro', 'municipio', 'cep'), ('email', 'pagina_web'))
}) }),)
,)
readonly_fields = ('nome', 'logradouro', 'bairro', 'municipio', 'cep') readonly_fields = ('nome', 'logradouro', 'bairro', 'municipio', 'cep')
inlines = (ContatosInline,) inlines = (ContatosInline,)
list_filter = ('tipo', 'servico__tipo_servico', 'municipio__uf__nome', list_filter = ('tipo', 'servico__tipo_servico', 'municipio__uf__nome',

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

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

11
sigi/apps/servicos/models.py

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

2
sigi/apps/servicos/views.py

@ -49,6 +49,7 @@ def municipios_atendidos(self, servico):
return HttpResponse(simplejson.dumps(municipios), mimetype="application/json") return HttpResponse(simplejson.dumps(municipios), mimetype="application/json")
class CasaManifestaProtoForm(forms.Form): class CasaManifestaProtoForm(forms.Form):
fieldsets = None fieldsets = None
informante = forms.CharField(max_length=100, required=False) informante = forms.CharField(max_length=100, required=False)
@ -71,6 +72,7 @@ class CasaManifestaProtoForm(forms.Form):
result.append({'name': name, 'lines': field_lines},) result.append({'name': name, 'lines': field_lines},)
self.fieldsets = result self.fieldsets = result
def casa_manifesta_view(request): def casa_manifesta_view(request):
if 'casa_id' in request.GET: if 'casa_id' in request.GET:
casa_id = request.GET.get('casa_id') casa_id = request.GET.get('casa_id')

1
sigi/apps/servidores/admin.py

@ -58,6 +58,7 @@ class TelefonesInline(generic.GenericTabularInline):
class ServidorAdmin(admin.ModelAdmin): class ServidorAdmin(admin.ModelAdmin):
def is_active(self, servidor): def is_active(self, servidor):
return servidor.user.is_active return servidor.user.is_active
is_active.admin_order_field = 'user__is_active' is_active.admin_order_field = 'user__is_active'

3
sigi/apps/servidores/forms.py

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

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.servidor_set.all().delete()
# u.delete() # u.delete()
class MigrationError(Exception): class MigrationError(Exception):
pass pass
class Command(BaseCommand): class Command(BaseCommand):
help = 'Migra usuários do antigo Sistema de RH' help = 'Migra usuários do antigo Sistema de RH'
@ -53,17 +55,23 @@ class Command(BaseCommand):
try: try:
# procuro o usuario por email do interlegis # procuro o usuario por email do interlegis
if email: if email:
try: user = User.objects.get(email=email) try:
user = User.objects.get(email=email)
except User.DoesNotExist: except User.DoesNotExist:
email = username + '@interlegis.leg.br' email = username + '@interlegis.leg.br'
try: user = User.objects.get(email=email) try:
except User.DoesNotExist: pass user = User.objects.get(email=email)
except User.DoesNotExist:
pass
if not user and username: if not user and username:
try: user = User.objects.get(username=username) try:
user = User.objects.get(username=username)
except User.DoesNotExist:
try:
user = User.objects.get(username=username + "__")
except User.DoesNotExist: except User.DoesNotExist:
try: user = User.objects.get(username=username + "__") pass
except User.DoesNotExist: pass
if not user: if not user:
if not username: if not username:
@ -233,4 +241,3 @@ class Command(BaseCommand):
) )
servidor.save() 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.settings import *
from sigi.apps.servidores.models import Servidor from sigi.apps.servidores.models import Servidor
class Command(BaseCommand): class Command(BaseCommand):
help = u'Sincroniza Usuários e Servidores com o LDAP' help = u'Sincroniza Usuários e Servidores com o LDAP'
@ -37,10 +38,13 @@ class Command(BaseCommand):
def sync_groups(self): def sync_groups(self):
ldap_groups = self.get_ldap_groups() ldap_groups = self.get_ldap_groups()
for ldap_group in ldap_groups: for ldap_group in ldap_groups:
try: group_name = ldap_group[1]['cn'][0] try:
except: pass group_name = ldap_group[1]['cn'][0]
except:
pass
else: else:
try: group = Group.objects.get(name=group_name) try:
group = Group.objects.get(name=group_name)
except Group.DoesNotExist: except Group.DoesNotExist:
group = Group(name=group_name) group = Group(name=group_name)
group.save() group.save()
@ -50,16 +54,25 @@ class Command(BaseCommand):
def sync_users(self): def sync_users(self):
ldap_users = self.get_ldap_users() ldap_users = self.get_ldap_users()
for ldap_user in ldap_users: for ldap_user in ldap_users:
try: username = ldap_user[1]['sAMAccountName'][0] try:
except: pass username = ldap_user[1]['sAMAccountName'][0]
except:
pass
else: else:
try: email = ldap_user[1]['userPrincipalName'][0] try:
except: email = '' email = ldap_user[1]['userPrincipalName'][0]
try: first_name = ldap_user[1]['givenName'][0] except:
except: first_name = username email = ''
try: last_name = ldap_user[1]['sn'][0][:30] try:
except: last_name = '' first_name = ldap_user[1]['givenName'][0]
try: user = User.objects.get(username=username) except:
first_name = username
try:
last_name = ldap_user[1]['sn'][0][:30]
except:
last_name = ''
try:
user = User.objects.get(username=username)
except User.DoesNotExist: except User.DoesNotExist:
try: try:
user = User.objects.get(email=email) user = User.objects.get(email=email)
@ -72,15 +85,18 @@ class Command(BaseCommand):
user.first_name = first_name user.first_name = first_name
user.last_name = last_name user.last_name = last_name
print "User '%s' created." % username print "User '%s' created." % username
try: nome_completo = ldap_user[1]['cn'][0] try:
except: nome_completo = '' nome_completo = ldap_user[1]['cn'][0]
except:
nome_completo = ''
try: try:
servidor = user.servidor servidor = user.servidor
if not servidor.nome_completo == nome_completo.decode('utf8'): if not servidor.nome_completo == nome_completo.decode('utf8'):
servidor.nome_completo = nome_completo servidor.nome_completo = nome_completo
print "Servidor '%s' updated." % nome_completo print "Servidor '%s' updated." % nome_completo
except Servidor.DoesNotExist: except Servidor.DoesNotExist:
try: servidor = Servidor.objects.get(nome_completo=nome_completo) try:
servidor = Servidor.objects.get(nome_completo=nome_completo)
except Servidor.DoesNotExist: except Servidor.DoesNotExist:
servidor = user.servidor_set.create(nome_completo=nome_completo) servidor = user.servidor_set.create(nome_completo=nome_completo)
print "Servidor '%s' created." % nome_completo print "Servidor '%s' created." % nome_completo

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.contenttypes import generic
from django.contrib.auth.models import User from django.contrib.auth.models import User
class Subsecretaria(models.Model): class Subsecretaria(models.Model):
""" Modelo para representação das Subsecretarias do Interlegis """ Modelo para representação das Subsecretarias do Interlegis
""" """
@ -19,7 +21,9 @@ class Subsecretaria(models.Model):
def __unicode__(self): def __unicode__(self):
return '%s (%s)' % (unicode(self.nome), unicode(self.sigla)) return '%s (%s)' % (unicode(self.nome), unicode(self.sigla))
class Servico(models.Model): class Servico(models.Model):
""" Modelo para representação dos Serviços de uma Subsecretaria """ Modelo para representação dos Serviços de uma Subsecretaria
""" """
@ -39,6 +43,7 @@ class Servico(models.Model):
class Servidor(models.Model): class Servidor(models.Model):
""" Modelo para representação de um Servidor. """ Modelo para representação de um Servidor.
Um servidor pertence a um Serviço e uma Subsecretaria os campos Um servidor pertence a um Serviço e uma Subsecretaria os campos
@ -147,6 +152,8 @@ User.servidor = property(lambda user: Servidor.objects.get(user=user))
# Sinal para ao criar um usuário criar um servidor # Sinal para ao criar um usuário criar um servidor
# baseado no nome contino no LDAP # baseado no nome contino no LDAP
def create_user_profile(sender, instance, created, **kwargs): def create_user_profile(sender, instance, created, **kwargs):
if created: if created:
Servidor.objects.create( Servidor.objects.create(
@ -156,7 +163,9 @@ def create_user_profile(sender, instance, created, **kwargs):
post_save.connect(create_user_profile, sender=User) post_save.connect(create_user_profile, sender=User)
class Funcao(models.Model): class Funcao(models.Model):
""" Modelo para guardar o histórico de funções dos """ Modelo para guardar o histórico de funções dos
servidores no Interlegis servidores no Interlegis
""" """
@ -182,6 +191,7 @@ class Funcao(models.Model):
class Licenca(models.Model): class Licenca(models.Model):
""" Modelo que representa as licenças tiradas pelos servidores """ Modelo que representa as licenças tiradas pelos servidores
""" """
servidor = models.ForeignKey(Servidor) servidor = models.ForeignKey(Servidor)
@ -201,7 +211,9 @@ class Licenca(models.Model):
def __unicode__(self): def __unicode__(self):
return str(self.id) return str(self.id)
class Ferias(models.Model): class Ferias(models.Model):
""" Modelo que representa as férias tiradas pelos servidores """ Modelo que representa as férias tiradas pelos servidores
""" """
servidor = models.ForeignKey(Servidor) servidor = models.ForeignKey(Servidor)

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.apps.servidores.models import Servidor, Funcao
from sigi.shortcuts import render_to_pdf from sigi.shortcuts import render_to_pdf
def servidores_por_funcao(request): def servidores_por_funcao(request):
report = Funcao.objects.values('funcao').annotate(funcao__count=Count('funcao')).order_by('funcao__count') report = Funcao.objects.values('funcao').annotate(funcao__count=Count('funcao')).order_by('funcao__count')
total = Funcao.objects.count() total = Funcao.objects.count()
@ -19,6 +20,7 @@ def servidores_por_funcao(request):
return render_to_pdf('servidores/servidores_por_funcao.html', context) return render_to_pdf('servidores/servidores_por_funcao.html', context)
def servidores_por_cargo(request): def servidores_por_cargo(request):
report = Funcao.objects.values('cargo').annotate(cargo__count=Count('cargo')).order_by('cargo__count') report = Funcao.objects.values('cargo').annotate(cargo__count=Count('cargo')).order_by('cargo__count')
total = Funcao.objects.count() total = Funcao.objects.count()
@ -30,4 +32,3 @@ def servidores_por_cargo(request):
}) })
return render_to_pdf('servidores/servidores_por_cargo.html', context) 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 django.db import models
from unicodedata import normalize from unicodedata import normalize
class SearchField(models.TextField): class SearchField(models.TextField):
def pre_save(self, model_instance, add): def pre_save(self, model_instance, add):
search_text = [] search_text = []
for field_name in self.field_names: for field_name in self.field_names:
@ -12,11 +14,13 @@ class SearchField(models.TextField):
value = u' '.join(search_text) value = u' '.join(search_text)
setattr(model_instance, self.name, value) setattr(model_instance, self.name, value)
return value return value
def __init__(self, field_names, *args, **kwargs): def __init__(self, field_names, *args, **kwargs):
self.field_names = field_names self.field_names = field_names
kwargs['editable'] = False kwargs['editable'] = False
super(self.__class__, self).__init__(*args, **kwargs) super(self.__class__, self).__init__(*args, **kwargs)
def to_ascii(txt, codif='utf-8'): def to_ascii(txt, codif='utf-8'):
if not isinstance(txt, basestring): if not isinstance(txt, basestring):
txt = unicode(txt) txt = unicode(txt)
@ -24,6 +28,7 @@ def to_ascii(txt, codif='utf-8'):
txt = txt.encode('utf-8') txt = txt.encode('utf-8')
return normalize('NFKD', txt.decode(codif)).encode('ASCII', 'ignore') return normalize('NFKD', txt.decode(codif)).encode('ASCII', 'ignore')
def queryset_ascii(self, request): def queryset_ascii(self, request):
if 'q' in request.GET: if 'q' in request.GET:
request.GET._mutable = True 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.translation import ugettext as _
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
class AdminImageWidget(AdminFileWidget): class AdminImageWidget(AdminFileWidget):
def render(self, name, value, attrs=None): def render(self, name, value, attrs=None):
output = [] output = []
if value and getattr(value, "url", None): if value and getattr(value, "url", None):
@ -10,7 +12,7 @@ class AdminImageWidget(AdminFileWidget):
file_name = str(value) file_name = str(value)
output.append( output.append(
u''' <a href="%s" target="_blank"><img src="%s" width="100" u''' <a href="%s" target="_blank"><img src="%s" width="100"
height="100" alt="%s"/></a> <br/> %s''' % \ height="100" alt="%s"/></a> <br/> %s''' %
(image_url, image_url, file_name, _('Change:'))) (image_url, image_url, file_name, _('Change:')))
output.append(super(AdminFileWidget, self).render(name, value, attrs)) output.append(super(AdminFileWidget, self).render(name, value, attrs))
return mark_safe(u''.join(output)) return mark_safe(u''.join(output))

1
sigi/apps/utils/alphabetic_filter.py

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

2
sigi/shortcuts.py

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

Loading…
Cancel
Save