Browse Source

Merge branch 'master' into producao

producao
Marcio Mazza 10 years ago
parent
commit
1a767db8c1
  1. 7
      .coveragerc
  2. 26
      conftest.py
  3. 0
      etc/data/ibge/sigi-import-ibge-2009.py_DOES_NOT_COMPILE
  4. 1
      initial_data.json
  5. 2183
      locale/en/LC_MESSAGES/django.po
  6. 5
      requirements/dev.txt
  7. 1
      requirements/producao.txt
  8. 10
      scripts/user_from_session.py
  9. 37
      sigi/apps/casas/admin.py
  10. 9
      sigi/apps/casas/forms.py
  11. 114
      sigi/apps/casas/reports.py
  12. 3
      sigi/apps/casas/templates/admin/casas/change_list.html
  13. 80
      sigi/apps/casas/templates/casas/carrinho.html
  14. 17
      sigi/apps/casas/test_casas.py
  15. 57
      sigi/apps/casas/views.py
  16. 4
      sigi/apps/contatos/admin.py
  17. 11
      sigi/apps/contatos/filters.py
  18. 89312
      sigi/apps/contatos/fixtures/initial_data.txt
  19. 198
      sigi/apps/contatos/models.py
  20. 15
      sigi/apps/convenios/admin.py
  21. 79
      sigi/apps/convenios/models.py
  22. 67
      sigi/apps/convenios/reports.py
  23. 54
      sigi/apps/convenios/templates/convenios/carrinho.html
  24. 7
      sigi/apps/convenios/templates/convenios/change_list.html
  25. 12
      sigi/apps/convenios/templates/convenios/tabela_regiao.html
  26. 79
      sigi/apps/convenios/views.py
  27. 16
      sigi/apps/diagnosticos/admin.py
  28. 32502
      sigi/apps/diagnosticos/fixtures/initial_data.txt
  29. 16
      sigi/apps/diagnosticos/forms.py
  30. 40
      sigi/apps/diagnosticos/models.py
  31. 5
      sigi/apps/diagnosticos/templates/admin/diagnosticos/diagnostico/change_form.html
  32. 6
      sigi/apps/diagnosticos/templates/admin/diagnosticos/diagnostico/change_list.html
  33. 68
      sigi/apps/diagnosticos/templates/diagnosticos/diagnostico_pdf.html
  34. 12
      sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_categoria_casa_legislativa_form.html
  35. 14
      sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_categoria_contatos_form.html
  36. 12
      sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_categorias_form.html
  37. 14
      sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_categorias_list.html
  38. 9
      sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_list.html
  39. 11
      sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_login.html
  40. 23
      sigi/apps/diagnosticos/views.py
  41. 16
      sigi/apps/financeiro/models.py
  42. 0
      sigi/apps/home/__init__.py
  43. 6
      sigi/apps/home/templates/menus/menu.html
  44. 17
      sigi/apps/home/templates/menus/menu_item.html
  45. 0
      sigi/apps/home/templatetags/__init__.py
  46. 97
      sigi/apps/home/templatetags/menu_conf.yaml
  47. 21
      sigi/apps/home/templatetags/menus.py
  48. 280
      sigi/apps/inventario/fixtures/initial_data.json
  49. 29
      sigi/apps/inventario/models.py
  50. 3
      sigi/apps/mdl/tests.py
  51. 3
      sigi/apps/mesas/admin.py
  52. 44
      sigi/apps/mesas/fixtures/initial_data.json
  53. 64
      sigi/apps/mesas/models.py
  54. 4
      sigi/apps/metas/admin.py
  55. 4
      sigi/apps/metas/management/commands/gera_map_data.py
  56. 54
      sigi/apps/metas/models.py
  57. 6
      sigi/apps/metas/templates/admin/metas/planodiretor/change_list.html
  58. 5
      sigi/apps/metas/templates/metas/dashboard.html
  59. 13
      sigi/apps/metas/templates/metas/map_list.html
  60. 19
      sigi/apps/metas/templates/metas/map_sum.html
  61. 30
      sigi/apps/metas/templates/metas/mapa.html
  62. 17
      sigi/apps/metas/templates/metas/snippets.html
  63. 29
      sigi/apps/metas/templatetags/mapa_tags.py
  64. 137
      sigi/apps/metas/views.py
  65. 9
      sigi/apps/ocorrencias/admin.py
  66. 8
      sigi/apps/ocorrencias/filters.py
  67. 81
      sigi/apps/ocorrencias/models.py
  68. 13
      sigi/apps/parlamentares/admin.py
  69. 218
      sigi/apps/parlamentares/fixtures/initial_data.json
  70. 28
      sigi/apps/parlamentares/models.py
  71. 105
      sigi/apps/parlamentares/reports.py
  72. 20
      sigi/apps/parlamentares/templates/parlamentares/carrinho.html
  73. 33
      sigi/apps/parlamentares/test_parlamentares.py
  74. 1
      sigi/apps/parlamentares/views.py
  75. 30
      sigi/apps/relatorios/reports.py
  76. 3
      sigi/apps/saberes/tests.py
  77. 35
      sigi/apps/servicos/admin.py
  78. 1
      sigi/apps/servicos/fixtures/initial_data.json
  79. 4
      sigi/apps/servicos/management/commands/atualiza_uso_servico.py
  80. 98
      sigi/apps/servicos/models.py
  81. 14
      sigi/apps/servicos/templates/admin/servicos/casaatendida/change_form.html
  82. 32
      sigi/apps/servicos/templates/servicos/casa_manifesta.html
  83. 3
      sigi/apps/servicos/templates/servicos/mapa.html
  84. 38
      sigi/apps/servicos/views.py
  85. 13
      sigi/apps/servidores/admin.py
  86. 47
      sigi/apps/servidores/forms.py
  87. 13
      sigi/apps/servidores/management/commands/migra.py
  88. 11
      sigi/apps/servidores/models.py
  89. 9
      sigi/apps/servidores/templates/admin/servidores/servidor/change_form.html
  90. 4
      sigi/apps/servidores/templates/admin/servidores/servidor/change_list.html
  91. 11
      sigi/apps/servidores/templates/servidores/servidores_por_cargo.html
  92. 11
      sigi/apps/servidores/templates/servidores/servidores_por_funcao.html
  93. 31
      sigi/apps/servidores/test_servidores_forms.py
  94. 4
      sigi/apps/utils/admin_widgets.py
  95. 14
      sigi/apps/utils/email.py
  96. 26
      sigi/apps/utils/test_base_admin.py
  97. 42
      sigi/apps/utils/validators.py
  98. 24
      sigi/context_processors.py
  99. 1
      sigi/fixtures/treemenus/initial-data.json
  100. 39
      sigi/settings/base.py

7
.coveragerc

@ -0,0 +1,7 @@
[run]
omit =
sigi/wsgi.py
manage.py
setup.py
test_*.py
ipython_log.py

26
conftest.py

@ -3,8 +3,30 @@ import pytest
from django_webtest import DjangoTestApp, WebTestMixin from django_webtest import DjangoTestApp, WebTestMixin
DEFAULT_MARK = object()
class SigiTestApp(DjangoTestApp):
def __init__(self, extra_environ=None, relative_to=None, default_user=None):
super(SigiTestApp, self).__init__(extra_environ, relative_to)
self.default_user = default_user
def get(self, url, params=None, headers=None, extra_environ=None,
status=None, expect_errors=False, user=DEFAULT_MARK, auto_follow=True,
content_type=None, **kwargs):
# note we altered the default values for user and auto_follow
if user is DEFAULT_MARK: # a trick to allow explicit user=None
user = self.default_user
return super(SigiTestApp, self).get(url, params, headers, extra_environ,
status, expect_errors, user, auto_follow,
content_type, **kwargs)
@pytest.fixture(scope='function') @pytest.fixture(scope='function')
def app(request): def app(request, admin_user):
"""WebTest's TestApp. """WebTest's TestApp.
Patch and unpatch settings before and after each test. Patch and unpatch settings before and after each test.
@ -17,4 +39,4 @@ def app(request):
wtm = WebTestMixin() wtm = WebTestMixin()
wtm._patch_settings() wtm._patch_settings()
request.addfinalizer(wtm._unpatch_settings) request.addfinalizer(wtm._unpatch_settings)
return DjangoTestApp() return SigiTestApp(default_user=admin_user.username)

0
etc/data/ibge/sigi-import-ibge-2009.py → etc/data/ibge/sigi-import-ibge-2009.py_DOES_NOT_COMPILE

1
initial_data.json

File diff suppressed because one or more lines are too long

2183
locale/en/LC_MESSAGES/django.po

File diff suppressed because it is too large

5
requirements/dev.txt

@ -1,11 +1,14 @@
-r producao.txt -r producao.txt
# para testes # para testes
coverage==3.7.1
pytest-django==2.7.0 pytest-django==2.7.0
WebTest==2.0.16 WebTest==2.0.16
django-webtest==1.7.7 django-webtest==1.7.7
django-dynamic-fixture==1.7.0 django-dynamic-fixture==1.7.0
coverage==3.7.1
pytest-cov==1.8.0
pyPdf==1.13
pyquery==1.2.9
# para desevolvimento # para desevolvimento
django-debug-toolbar==1.2.1 django-debug-toolbar==1.2.1

1
requirements/producao.txt

@ -5,7 +5,6 @@ django-autoslug==1.7.2
django-extensions==1.4.0 django-extensions==1.4.0
git+git://github.com/jacobian/django-googlecharts.git@c542996cf9a7a097b447e1ce5a1a6b66bdad254f#egg=django_googlecharts git+git://github.com/jacobian/django-googlecharts.git@c542996cf9a7a097b447e1ce5a1a6b66bdad254f#egg=django_googlecharts
django-localflavor==1.0 django-localflavor==1.0
django-treemenus==0.9.1
eav-django==1.4.7 eav-django==1.4.7
html5lib==0.999 html5lib==0.999
pisa==3.0.33 pisa==3.0.33

10
scripts/user_from_session.py

@ -0,0 +1,10 @@
from django.contrib.sessions.models import Session
from django.contrib.auth.models import User
def user_from_session(session_key):
session = Session.objects.get(session_key=session_key)
uid = session.get_decoded().get('_auth_user_id')
user = User.objects.get(pk=uid)
print user.username, user.get_full_name(), user.email
return user

37
sigi/apps/casas/admin.py

@ -2,6 +2,7 @@
from django.contrib import admin from django.contrib import admin
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.utils.translation import ugettext as _
from image_cropping import ImageCroppingMixin from image_cropping import ImageCroppingMixin
from sigi.apps.casas.forms import CasaLegislativaForm from sigi.apps.casas.forms import CasaLegislativaForm
@ -46,7 +47,7 @@ class FuncionariosInline(admin.StackedInline):
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=_(u"Presidente"))
class ConveniosInline(admin.StackedInline): class ConveniosInline(admin.StackedInline):
@ -64,17 +65,17 @@ class ConveniosInline(admin.StackedInline):
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 = _(u'Tramitações')
get_tramitacoes.allow_tags = True get_tramitacoes.allow_tags = True
def get_anexos(self, obj): def get_anexos(self, obj):
return '<br/>'.join(['<a href="%s" target="_blank">%s</a>' % (a.arquivo.url, a.__unicode__()) for a in obj.anexo_set.all()]) return '<br/>'.join(['<a href="%s" target="_blank">%s</a>' % (a.arquivo.url, a.__unicode__()) for a in obj.anexo_set.all()])
get_anexos.short_description = 'Anexos' get_anexos.short_description = _(u'Anexos')
get_anexos.allow_tags = True get_anexos.allow_tags = True
def get_equipamentos(self, obj): def get_equipamentos(self, obj):
return '<br/>'.join([e.__unicode__() for e in obj.equipamentoprevisto_set.all()]) return '<br/>'.join([e.__unicode__() for e in obj.equipamentoprevisto_set.all()])
get_equipamentos.short_description = 'Equipamentos previstos' get_equipamentos.short_description = _(u'Equipamentos previstos')
get_equipamentos.allow_tags = True get_equipamentos.allow_tags = True
def link_convenio(self, obj): def link_convenio(self, obj):
@ -88,7 +89,7 @@ class ConveniosInline(admin.StackedInline):
Editar Editar
</a>""" % (obj.pk, obj.pk, url) </a>""" % (obj.pk, obj.pk, url)
link_convenio.short_description = 'Editar convenio' link_convenio.short_description = _(u'Editar convenio')
link_convenio.allow_tags = True link_convenio.allow_tags = True
@ -108,7 +109,7 @@ class LegislaturaInline(admin.TabularInline):
Editar Editar
</a>""" % (obj.pk, obj.pk, url) </a>""" % (obj.pk, obj.pk, url)
link_parlamentares.short_description = 'Parlamentares' link_parlamentares.short_description = _(u'Parlamentares')
link_parlamentares.allow_tags = True link_parlamentares.allow_tags = True
@ -130,7 +131,7 @@ class DiagnosticoInline(admin.TabularInline):
Abrir PDF Abrir PDF
</a>""" % (obj.pk, obj.pk, url) </a>""" % (obj.pk, obj.pk, url)
link_diagnostico.short_description = 'Ver PDF' link_diagnostico.short_description = _(u'Ver PDF')
link_diagnostico.allow_tags = True link_diagnostico.allow_tags = True
@ -174,11 +175,11 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin):
(None, { (None, {
'fields': ('tipo', 'nome', 'cnpj', 'num_parlamentares', 'gerente_contas') 'fields': ('tipo', 'nome', 'cnpj', 'num_parlamentares', 'gerente_contas')
}), }),
('Endereço', { (_(u'Endereço'), {
'fields': ('data_instalacao', 'logradouro', 'bairro', 'fields': ('data_instalacao', 'logradouro', 'bairro',
'municipio', 'cep', 'pagina_web', 'email', 'ult_alt_endereco'), 'municipio', 'cep', 'pagina_web', 'email', 'ult_alt_endereco'),
}), }),
('Outras informações', { (_(u'Outras informações'), {
'fields': ('observacoes', 'foto', 'recorte'), 'fields': ('observacoes', 'foto', 'recorte'),
}), }),
) )
@ -190,7 +191,7 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin):
def get_convenios(self, obj): def get_convenios(self, obj):
return '<ul>' + ''.join(['<li>%s</li>' % c.__unicode__() for c in obj.convenio_set.all()]) + '</ul>' return '<ul>' + ''.join(['<li>%s</li>' % c.__unicode__() for c in obj.convenio_set.all()]) + '</ul>'
get_convenios.short_description = u'Convênios' get_convenios.short_description = _(u'Convênios')
get_convenios.allow_tags = True get_convenios.allow_tags = True
def changelist_view(self, request, extra_context=None): def changelist_view(self, request, extra_context=None):
@ -205,23 +206,23 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin):
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 = _(u"Gerar etiqueta(s) da(s) casa(s) selecionada(s)")
def etiqueta_sem_presidente(self, request, queryset): def etiqueta_sem_presidente(self, request, queryset):
return labels_report_sem_presidente(request, queryset=queryset) return labels_report_sem_presidente(request, queryset=queryset)
etiqueta_sem_presidente.short_description = "Gerar etiqueta(s) sem presidente da(s) casa(s) selecionada(s)" etiqueta_sem_presidente.short_description = _(u"Gerar etiqueta(s) sem presidente da(s) casa(s) selecionada(s)")
def relatorio(self, request, queryset): def relatorio(self, request, queryset):
return report(request, queryset=queryset) return report(request, queryset=queryset)
relatorio.short_description = u"Exportar a(s) casa(s) selecionada(s) para PDF" relatorio.short_description = _(u"Exportar a(s) casa(s) selecionada(s) para PDF")
def relatorio_completo(self, request, queryset): def relatorio_completo(self, request, queryset):
return report_complete(request, queryset=queryset) return report_complete(request, queryset=queryset)
relatorio_completo.short_description = u"Gerar relatório completo da(s) casa(s) selecionada(s)" relatorio_completo.short_description = _(u"Gerar relatório completo da(s) casa(s) selecionada(s)")
def relatorio_csv(self, request, queryset): def relatorio_csv(self, request, queryset):
return export_csv(request) return export_csv(request)
relatorio_csv.short_description = u"Exportar casa(s) selecionada(s) para CSV" relatorio_csv.short_description = _(u"Exportar casa(s) selecionada(s) para CSV")
def adicionar_casas(self, request, queryset): def adicionar_casas(self, request, queryset):
if 'carrinho_casas' in request.session: if 'carrinho_casas' in request.session:
@ -233,12 +234,12 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin):
q2 = len(request.session['carrinho_casas']) q2 = len(request.session['carrinho_casas'])
quant = q2 - q1 quant = q2 - q1
if quant: if quant:
self.message_user(request, str(q2 - q1) + " Casas Legislativas adicionadas no carrinho") self.message_user(request, str(q2 - q1) + " " + _(u"Casas Legislativas adicionadas no carrinho"))
else: else:
self.message_user(request, "As Casas Legislativas selecionadas já foram adicionadas anteriormente") self.message_user(request, _(u"As Casas Legislativas selecionadas já foram adicionadas anteriormente"))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
adicionar_casas.short_description = u"Armazenar casas no carrinho para exportar" adicionar_casas.short_description = _(u"Armazenar casas no carrinho para exportar")
def get_actions(self, request): def get_actions(self, request):
actions = super(CasaLegislativaAdmin, self).get_actions(request) actions = super(CasaLegislativaAdmin, self).get_actions(request)

9
sigi/apps/casas/forms.py

@ -1,17 +1,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import forms from django import forms
from django.utils.translation import ugettext as _
from localflavor.br.forms import BRZipCodeField from localflavor.br.forms import BRZipCodeField
from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.models import CasaLegislativa
class CasaLegislativaForm(forms.ModelForm): class CasaLegislativaForm(forms.ModelForm):
# cnpj = BRCNPJField( # cnpj = BRCNPJField(
# label='CNPJ', # label=_(u'CNPJ'),
# required=False, # required=False,
# help_text='Utilize o formato <em>XX.XXX.XXX/XXXX-XX</em> ou ' # help_text=_(u'Utilize o formato <em>XX.XXX.XXX/XXXX-XX</em> ou insira apenas os dígitos.')
# 'insira apenas os dígitos.'
#) #)
cep = BRZipCodeField(label='CEP', help_text='Formato: <em>XXXXX-XXX</em>.') cep = BRZipCodeField(label=_(u'CEP'), help_text=_(u'Formato') + ': <em>XXXXX-XXX</em>.')
class Meta: class Meta:
model = CasaLegislativa model = CasaLegislativa

114
sigi/apps/casas/reports.py

@ -1,15 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.templatetags.static import static
from django.utils.translation import ugettext as _
from geraldo import Report, DetailBand, Label, ObjectValue, ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH, SystemField
from geraldo.graphics import Image
from reportlab.lib.enums import TA_CENTER
from reportlab.lib.pagesizes import A4 from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm from reportlab.lib.units import cm
from reportlab.lib.enums import TA_CENTER, TA_RIGHT
from geraldo import Report, DetailBand, Label, ObjectValue, ManyElements, \
ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH, SystemField
from sigi.apps.relatorios.reports import ReportDefault from sigi.apps.relatorios.reports import ReportDefault
from sigi.settings import STATICFILES_DIRS
from geraldo.graphics import Image
def string_to_cm(texto): def string_to_cm(texto):
@ -43,6 +41,10 @@ def string_to_cm(texto):
return tamanho return tamanho
def label_text(text):
return "%s: " % text
class CasasLegislativasLabels(Report): class CasasLegislativasLabels(Report):
""" """
@ -97,7 +99,7 @@ class CasasLegislativasLabels(Report):
my_elements = [ my_elements = [
Label( Label(
text='A Sua Excelência o(a) Senhor(a):', text=label_text(_(u'A Sua Excelência o(a) Senhor(a)')),
top=calc_top(0), left=calc_left, width=calc_width, top=calc_top(0), left=calc_left, width=calc_width,
), ),
ObjectValue( ObjectValue(
@ -110,7 +112,7 @@ class CasasLegislativasLabels(Report):
attribute_name='nome', attribute_name='nome',
top=calc_top(2), left=calc_left, width=calc_width, height=calc_height(2), top=calc_top(2), left=calc_left, width=calc_width, height=calc_height(2),
get_value=lambda instance: get_value=lambda instance:
("Presidente da %s" % instance.nome) (_(u"Presidente da %s") % instance.nome)
), ),
ObjectValue( ObjectValue(
attribute_name='logradouro', attribute_name='logradouro',
@ -122,8 +124,7 @@ class CasasLegislativasLabels(Report):
ObjectValue( ObjectValue(
attribute_name='cep', attribute_name='cep',
top=calc_top(8), left=calc_left, width=calc_width, top=calc_top(8), left=calc_left, width=calc_width,
get_value=lambda instance: get_value=lambda instance: "%s: %s" % (_(u"CEP"), instance.cep)
"CEP: %s" % instance.cep
), ),
] ]
self.band_detail = DetailBand( self.band_detail = DetailBand(
@ -146,14 +147,14 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
my_elements = [ my_elements = [
Label( Label(
text='A Sua Excelência o(a) Senhor(a):', text=label_text(_(u'A Sua Excelência o(a) Senhor(a)')),
top=calc_top(0), left=calc_left, width=calc_width, top=calc_top(0), left=calc_left, width=calc_width,
), ),
ObjectValue( ObjectValue(
attribute_name='nome', attribute_name='nome',
top=calc_top(1), left=calc_left, width=calc_width, height=calc_height(2), top=calc_top(1), left=calc_left, width=calc_width, height=calc_height(2),
get_value=lambda instance: get_value=lambda instance:
("Presidente da %s" % instance.nome) (_(u"Presidente da %s") % instance.nome)
), ),
ObjectValue( ObjectValue(
attribute_name='logradouro', attribute_name='logradouro',
@ -165,8 +166,7 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
ObjectValue( ObjectValue(
attribute_name='cep', attribute_name='cep',
top=calc_top(8), left=calc_left, width=calc_width, top=calc_top(8), left=calc_left, width=calc_width,
get_value=lambda instance: get_value=lambda instance: "%s: %s" % (_(u"CEP"), instance.cep)
"CEP: %s" % instance.cep
), ),
] ]
self.band_detail = DetailBand( self.band_detail = DetailBand(
@ -178,7 +178,7 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
class CasasLegislativasReport(ReportDefault): class CasasLegislativasReport(ReportDefault):
title = u'Relatório de Casas Legislativas' title = _(u'Relatório de Casas Legislativas')
height = 80 * cm height = 80 * cm
page_size = landscape(A4) page_size = landscape(A4)
@ -189,18 +189,18 @@ class CasasLegislativasReport(ReportDefault):
elements = list(ReportDefault.band_page_header.elements) elements = list(ReportDefault.band_page_header.elements)
elements = [ elements = [
Image(filename='%s/img/logo-interlegis.jpg' % STATICFILES_DIRS, Image(filename=static('img/logo-interlegis.jpg'),
left=23.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, left=23.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=4.2 * cm, height=3 * cm, width=4.2 * cm, height=3 * cm,
), ),
Image(filename='%s/img/logo-senado.png' % STATICFILES_DIRS, Image(filename=static('img/logo-senado.png'),
left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=3 * cm, height=3 * cm, width=3 * cm, height=3 * cm,
), ),
Label(text="SENADO FEDERAL", top=1 * cm, left=0, width=BAND_WIDTH, Label(text=_(u"SENADO FEDERAL"), top=1 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}
), ),
Label(text="SINTER - Secretaria Especial do Interlegis", top=1.5 * cm, left=0, width=BAND_WIDTH, Label(text=_(u"SINTER - Secretaria Especial do Interlegis"), top=1.5 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER}
), ),
SystemField( SystemField(
@ -208,32 +208,32 @@ class CasasLegislativasReport(ReportDefault):
style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}
), ),
Label( Label(
text="UF", text=_(u"UF"),
left=label_left[0] * cm, left=label_left[0] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text="Municipio", text=_(u"Municipio"),
left=label_left[1] * cm, left=label_left[1] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text="Presidente", text=_(u"Presidente"),
left=label_left[2] * cm, left=label_left[2] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text="Endereço", text=_(u"Endereço"),
left=label_left[3] * cm, left=label_left[3] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text="Endereço na Internet", text=_(u"Endereço na Internet"),
left=label_left[4] * cm, left=label_left[4] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text="Email", text=_(u"Email"),
left=label_left[5] * cm, left=label_left[5] * cm,
top=label_top, top=label_top,
), ),
@ -292,11 +292,11 @@ 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
@ -305,7 +305,7 @@ class InfoCasaLegislativa(ReportDefault):
height = 1 * cm height = 1 * cm
elements = [ elements = [
SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3 * cm), SystemField(expression=_(u'%(now:%d/%m/%Y)s às %(now:%H:%M)s'), top=0.3 * cm),
] ]
class band_detail(ReportDefault.band_detail): class band_detail(ReportDefault.band_detail):
@ -343,7 +343,7 @@ class InfoCasaLegislativa(ReportDefault):
elements = [ elements = [
Label( Label(
text="Tipo: ", text=label_text(_(u"Tipo")),
left=posicao_left[0] * cm, left=posicao_left[0] * cm,
top=posicao_top[0] * cm, top=posicao_top[0] * cm,
), ),
@ -354,7 +354,7 @@ class InfoCasaLegislativa(ReportDefault):
width=6 * cm, width=6 * cm,
), ),
Label( Label(
text="Região: ", text=label_text(_(u"Região")),
left=posicao_left[2] * cm, left=posicao_left[2] * cm,
top=posicao_top[1] * cm, top=posicao_top[1] * cm,
), ),
@ -363,11 +363,11 @@ class InfoCasaLegislativa(ReportDefault):
left=posicao_left[3] * cm, left=posicao_left[3] * cm,
top=posicao_top[1] * cm, top=posicao_top[1] * cm,
get_value=lambda instance: get_value=lambda instance:
{'SL': 'Sul', 'SD': 'Sudeste', 'CO': 'Centro-Oeste', 'NE': 'Nordeste', 'NO': 'Norte', } {'SL': _(u'Sul'), 'SD': _(u'Sudeste'), 'CO': _(u'Centro-Oeste'), 'NE': _(u'Nordeste'), 'NO': _(u'Norte'), }
[instance.municipio.uf.regiao] [instance.municipio.uf.regiao]
), ),
Label( Label(
text="U.F.: ", text=label_text(_(u"UF")),
left=posicao_left[4] * cm, left=posicao_left[4] * cm,
top=posicao_top[2] * cm, top=posicao_top[2] * cm,
), ),
@ -377,7 +377,7 @@ class InfoCasaLegislativa(ReportDefault):
top=posicao_top[2] * cm, top=posicao_top[2] * cm,
), ),
Label( Label(
text="Município: ", text=label_text(_(u"Município")),
left=posicao_left[6] * cm, left=posicao_left[6] * cm,
top=posicao_top[3] * cm, top=posicao_top[3] * cm,
), ),
@ -389,7 +389,7 @@ class InfoCasaLegislativa(ReportDefault):
), ),
# Linha 3 # Linha 3
Label( Label(
text="Endereço: ", text=label_text(_(u"Endereço")),
left=posicao_left[8] * cm, left=posicao_left[8] * cm,
top=posicao_top[4] * cm, top=posicao_top[4] * cm,
), ),
@ -400,7 +400,7 @@ class InfoCasaLegislativa(ReportDefault):
width=20 * cm, width=20 * cm,
), ),
Label( Label(
text="Bairro: ", text=label_text(_(u"Bairro")),
left=posicao_left[10] * cm, left=posicao_left[10] * cm,
top=posicao_top[5] * cm, top=posicao_top[5] * cm,
), ),
@ -410,7 +410,7 @@ class InfoCasaLegislativa(ReportDefault):
top=posicao_top[5] * cm, top=posicao_top[5] * cm,
), ),
Label( Label(
text="CEP: ", text=label_text(_(u"CEP")),
left=posicao_left[12] * cm, left=posicao_left[12] * cm,
top=posicao_top[6] * cm, top=posicao_top[6] * cm,
), ),
@ -420,7 +420,7 @@ class InfoCasaLegislativa(ReportDefault):
top=posicao_top[6] * cm, top=posicao_top[6] * cm,
), ),
Label( Label(
text="CNPJ: ", text=label_text(_(u"CNPJ")),
left=posicao_left[14] * cm, left=posicao_left[14] * cm,
top=posicao_top[7] * cm, top=posicao_top[7] * cm,
), ),
@ -430,7 +430,7 @@ class InfoCasaLegislativa(ReportDefault):
top=posicao_top[7] * cm, top=posicao_top[7] * cm,
), ),
Label( Label(
text="Telefone: ", text=label_text(_(u"Telefone")),
left=posicao_left[16] * cm, left=posicao_left[16] * cm,
top=posicao_top[8] * cm, top=posicao_top[8] * cm,
), ),
@ -440,7 +440,7 @@ class InfoCasaLegislativa(ReportDefault):
top=posicao_top[8] * cm, top=posicao_top[8] * cm,
), ),
Label( Label(
text="Presidente: ", text=label_text(_(u"Presidente")),
left=posicao_left[18] * cm, left=posicao_left[18] * cm,
top=posicao_top[9] * cm, top=posicao_top[9] * cm,
), ),
@ -469,14 +469,14 @@ class InfoCasaLegislativa(ReportDefault):
height=2.5 * cm, height=2.5 * cm,
elements=[ elements=[
Label( Label(
text="Telefone(s)", text=_(u"Telefone(s)"),
style={'fontSize': 14, 'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1 * cm, top=1 * cm,
), ),
Label(text="Número", left=tel_left[0] * cm, top=tel_top), Label(text=_(u"Número"), left=tel_left[0] * cm, top=tel_top),
Label(text="Tipo", left=tel_left[1] * cm, top=tel_top), Label(text=_(u"Tipo"), left=tel_left[1] * cm, top=tel_top),
Label(text="Nota", left=tel_left[2] * cm, top=tel_top), Label(text=_(u"Nota"), left=tel_left[2] * cm, top=tel_top),
], ],
borders={'bottom': True}, borders={'bottom': True},
), ),
@ -487,7 +487,7 @@ class InfoCasaLegislativa(ReportDefault):
ObjectValue(attribute_name='__unicode__', left=tel_left[0] * cm), ObjectValue(attribute_name='__unicode__', left=tel_left[0] * cm),
ObjectValue(attribute_name='tipo', left=tel_left[1] * cm, ObjectValue(attribute_name='tipo', left=tel_left[1] * cm,
get_value=lambda instance: get_value=lambda instance:
{'F': 'Fixo', 'M': u'Móvel', 'X': 'Fax', 'I': 'Indefinido'}[instance.tipo], {'F': _(u'Fixo'), 'M': _(u'Móvel'), 'X': _(u'Fax'), 'I': _(u'Indefinido')}[instance.tipo],
), ),
ObjectValue(attribute_name='nota', left=tel_left[2] * cm), ObjectValue(attribute_name='nota', left=tel_left[2] * cm),
], ],
@ -502,14 +502,14 @@ class InfoCasaLegislativa(ReportDefault):
height=2.5 * cm, height=2.5 * cm,
elements=[ elements=[
Label( Label(
text="Contato(s)", text=_(u"Contato(s)"),
style={'fontSize': 14, 'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1 * cm, top=1 * cm,
), ),
Label(text="Nome", left=cont_left[0] * cm, top=cont_top), Label(text=_(u"Nome"), left=cont_left[0] * cm, top=cont_top),
Label(text="Nota", left=cont_left[1] * cm, top=cont_top), Label(text=_(u"Nota"), left=cont_left[1] * cm, top=cont_top),
Label(text="E-mail", left=cont_left[2] * cm, top=cont_top), Label(text=_(u"E-mail"), left=cont_left[2] * cm, top=cont_top),
], ],
borders={'bottom': True, 'top': True}, borders={'bottom': True, 'top': True},
), ),
@ -532,18 +532,18 @@ class InfoCasaLegislativa(ReportDefault):
height=2.5 * cm, height=2.5 * cm,
elements=[ elements=[
Label( Label(
text="Convênio(s)", text=_(u"Convênio(s)"),
style={'fontSize': 14, 'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1 * cm, top=1 * cm,
), ),
Label(text="Projeto", left=convenio_left[0] * cm, top=convenio_top), Label(text=_(u"Projeto"), left=convenio_left[0] * cm, top=convenio_top),
Label(text="Nº Convenio", left=convenio_left[1] * cm, top=convenio_top), Label(text=_(u"Nº Convenio"), left=convenio_left[1] * cm, top=convenio_top),
Label(text="Nº Processo SF", left=convenio_left[2] * cm, top=convenio_top), Label(text=_(u"Nº Processo SF"), left=convenio_left[2] * cm, top=convenio_top),
Label(text="Adesão", left=convenio_left[3] * cm, top=convenio_top), Label(text=_(u"Adesão"), left=convenio_left[3] * cm, top=convenio_top),
Label(text="Convênio", left=convenio_left[4] * cm, top=convenio_top), Label(text=_(u"Convênio"), left=convenio_left[4] * cm, top=convenio_top),
Label(text="Equipada", left=convenio_left[5] * cm, top=convenio_top), Label(text=_(u"Equipada"), left=convenio_left[5] * cm, top=convenio_top),
Label(text="Data D.O.", left=convenio_left[6] * cm, top=convenio_top), Label(text=_(u"Data D.O."), left=convenio_left[6] * cm, top=convenio_top),
], ],
borders={'bottom': True} borders={'bottom': True}
), ),

3
sigi/apps/casas/templates/admin/casas/change_list.html

@ -1,9 +1,10 @@
{% extends "change_list_with_cart.html" %} {% extends "change_list_with_cart.html" %}
{% load i18n %}
{% block object-tools-items %} {% block object-tools-items %}
<li><a href="casas_sem_convenio_report/{{query_str}}"> <li><a href="casas_sem_convenio_report/{{query_str}}">
<span class="glyphicon glyphicon-list"></span> <span class="glyphicon glyphicon-list"></span>
Casas sem Processo de Convênio {% trans 'Casas sem Processo de Convênio' %}
</a></li> </a></li>
{{ block.super }} {{ block.super }}
{% endblock %} {% endblock %}

80
sigi/apps/casas/templates/casas/carrinho.html

@ -7,15 +7,15 @@
{% endblock %} {% endblock %}
{% block title %}Casas legislativas no Carrinho | SIGI{% endblock %} {% block title %}{% trans 'Casas legislativas no Carrinho | SIGI' %}{% endblock %}
{% block content_title %}<h1>Casas Legislativas no Carrinho</h1>{% endblock %} {% block content_title %}<h1>{% trans 'Casas Legislativas no Carrinho' %}</h1>{% endblock %}
{% block mensagem%} {% block mensagem%}
<ul class="messagelist"> <ul class="messagelist">
{%if carIsEmpty%} {%if carIsEmpty%}
<li class="warning">O carrinho está vazio, sendo assim todas as casas entram na lista para exportação de acordo com os filtros aplicados.</li> <li class="warning">{% trans 'O carrinho está vazio, sendo assim todas as casas entram na lista para exportação de acordo com os filtros aplicados.' %}</li>
{%else%} {%else%}
<li>{{paginas.paginator.count}} Casas Legislativas no carrinho.</li> <li>{{paginas.paginator.count}} {% trans 'Casas Legislativas no carrinho' %}.</li>
{%endif%} {%endif%}
</ul> </ul>
{% endblock %} {% endblock %}
@ -30,10 +30,10 @@
<th class="sorted ascending"><!-- <input type="checkbox" id="action-toggle" style="display: inline;">--> <th class="sorted ascending"><!-- <input type="checkbox" id="action-toggle" style="display: inline;">-->
</th> </th>
{% endif %} {% endif %}
<th class="sorted ascending">Nome</th> <th class="sorted ascending">{% trans 'Nome' %}</th>
<th class="sorted ascending">Município</th> <th class="sorted ascending">{% trans 'Município' %}</th>
<th class="sorted ascending">Presidente</th> <th class="sorted ascending">{% trans 'Presidente' %}</th>
<th class="sorted ascending">Endereço</th> <th class="sorted ascending">{% trans 'Endereço' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -56,24 +56,24 @@
{% block botoes %} {% block botoes %}
<div id="tabs"> <div id="tabs">
<ul> <ul>
<li><a href="#tabs-1">Etiqueta</a></li> <li><a href="#tabs-1">{% trans 'Etiqueta' %}</a></li>
<li><a href="#tabs-2">Relatório</a></li> <li><a href="#tabs-2">{% trans 'Relatório' %}</a></li>
<li><a href="#tabs-3">Arquivo CSV (Excel, Calc)</a></li> <li><a href="#tabs-3">{% trans 'Arquivo CSV (Excel, Calc)' %}</a></li>
<li><a href="#tabs-4">Etiqueta Parlamentares</a></li> <li><a href="#tabs-4">{% trans 'Etiqueta Parlamentares' %}</a></li>
</ul> </ul>
<div id="tabs-1"> <div id="tabs-1">
<form action="../labels/{{query_str}}" method="post">{% csrf_token %} <form id="generate_labels" action="../labels/{{query_str}}" method="post">{% csrf_token %}
<fieldset><legend>Tipo de etiqueta</legend> <fieldset><legend>{% trans 'Tipo de etiqueta' %}</legend>
<ul class="tabs-conteudo"> <ul class="tabs-conteudo">
<li><input type="radio" name="tipo_etiqueta" <li><input type="radio" name="tipo_etiqueta"
value="com_presidente"><label>Com Presidente</label></li> value="com_presidente"><label>{% trans 'Com Presidente' %}</label></li>
<li><input type="radio" name="tipo_etiqueta" <li><input type="radio" name="tipo_etiqueta"
value="sem_presidente" checked="checked"> value="sem_presidente" checked="checked">
<label>Sem Presidente</label></li> <label>{% trans 'Sem Presidente' %}</label></li>
</ul> </ul>
</fieldset> </fieldset>
<fieldset><legend>Formato da Etiqueta</legend> <fieldset><legend>{% trans 'Formato da Etiqueta' %}</legend>
<ul class="formato_etiqueta"> <ul class="formato_etiqueta">
<li><input type="radio" name="tamanho_etiqueta" <li><input type="radio" name="tamanho_etiqueta"
value="2x5_etiqueta"><label>2x5</label></li> value="2x5_etiqueta"><label>2x5</label></li>
@ -90,11 +90,11 @@
</div> </div>
<div id="tabs-2"> <div id="tabs-2">
<form action="../reports/{{query_str}}" method="post">{% csrf_token %} <form action="../reports/{{query_str}}" method="post">{% csrf_token %}
<fieldset><legend>Tipo de relatório</legend> <fieldset><legend>{% trans 'Tipo de relatório' %}</legend>
<ul class="tabs-conteudo"> <ul class="tabs-conteudo">
<li><input type="radio" name="tipo_relatorio" value="simples" <li><input type="radio" name="tipo_relatorio" value="simples"
checked="checked"><label>Simples</label></li> checked="checked"><label>{% trans 'Simples' %}</label></li>
<li><input type="radio" name="tipo_relatorio" value="completo"><label>Completo</label></li> <li><input type="radio" name="tipo_relatorio" value="completo"><label>{% trans 'Completo' %}</label></li>
</ul> </ul>
</fieldset> </fieldset>
<ul class="botoes"> <ul class="botoes">
@ -104,107 +104,107 @@
</div> </div>
<div id="tabs-3"> <div id="tabs-3">
<form action="../csv/{{query_str}}" method="post">{% csrf_token %} <form action="../csv/{{query_str}}" method="post">{% csrf_token %}
<fieldset><legend>Escolha os atributos para exportar</legend> <fieldset><legend>{% trans 'Escolha os atributos para exportar' %}</legend>
<ul id="sortable" class="tabs-conteudo"> <ul id="sortable" class="tabs-conteudo">
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="CNPJ" <input type="checkbox" name="itens_csv_selected" value="CNPJ"
class="action-select" checked="checked" /> class="action-select" checked="checked" />
<label>CNPJ</label> <label>{% trans 'CNPJ' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Código IBGE" class="action-select" checked="checked" /> value="Código IBGE" class="action-select" checked="checked" />
<label>Código IBGE</label> <label>{% trans 'Código IBGE' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Código TSE" class="action-select" checked="checked" /> value="Código TSE" class="action-select" checked="checked" />
<label>Código TSE</label> <label>{% trans 'Código TSE' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Nome" <input type="checkbox" name="itens_csv_selected" value="Nome"
class="action-select" checked="checked" /> class="action-select" checked="checked" />
<label>Nome</label> <label>{% trans 'Nome' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Município" class="action-select" checked="checked" /> value="Município" class="action-select" checked="checked" />
<label>Município</label></li> <label>{% trans 'Município' %}</label></li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Presidente" class="action-select" checked="checked" /> value="Presidente" class="action-select" checked="checked" />
<label>Presidente</label></li> <label>{% trans 'Presidente' %}</label></li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Logradouro" class="action-select" checked="checked" /> value="Logradouro" class="action-select" checked="checked" />
<label>Endereço</label></li> <label>{% trans 'Endereço' %}</label></li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Bairro" class="action-select" checked="checked" /> value="Bairro" class="action-select" checked="checked" />
<label>Bairro</label></li> <label>{% trans 'Bairro' %}</label></li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="CEP" <input type="checkbox" name="itens_csv_selected" value="CEP"
class="action-select" checked="checked" /> class="action-select" checked="checked" />
<label>CEP</label> <label>{% trans 'CEP' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Telefone" class="action-select" checked="checked" /> value="Telefone" class="action-select" checked="checked" />
<label>Telefone</label> <label>{% trans 'Telefone' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Página web" class="action-select" checked="checked" /> value="Página web" class="action-select" checked="checked" />
<label>Página Web</label> <label>{% trans 'Página Web' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Email" class="action-select" checked="checked" /> value="Email" class="action-select" checked="checked" />
<label>Email</label> <label>{% trans 'Email' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Número de parlamentares" class="action-select" checked="checked" /> value="Número de parlamentares" class="action-select" checked="checked" />
<label>Número de parlamentares</label> <label>{% trans 'Número de parlamentares' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Última alteração de endereco" class="action-select" checked="checked" /> value="Última alteração de endereco" class="action-select" checked="checked" />
<label>Data da última alteração de endereço</label> <label>{% trans 'Data da última alteração de endereço' %}</label>
</li> </li>
</ul> </ul>
</fieldset> </fieldset>
<fieldset><legend>Contato Interlegis</legend> <fieldset><legend>{% trans 'Contato Interlegis' %}</legend>
<ul id="sortable" class="tabs-conteudo"> <ul id="sortable" class="tabs-conteudo">
<li><span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <li><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Nome contato" class="action-select" checked="checked" /> value="Nome contato" class="action-select" checked="checked" />
<label>Nome</label> <label>{% trans 'Nome' %}</label>
</li> </li>
<li><span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <li><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Cargo contato" class="action-select" checked="checked" /> value="Cargo contato" class="action-select" checked="checked" />
<label>Cargo</label> <label>{% trans 'Cargo' %}</label>
</li> </li>
<li><span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <li><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" <input type="checkbox" name="itens_csv_selected"
value="Email contato" class="action-select" checked="checked" /> value="Email contato" class="action-select" checked="checked" />
<label>Email</label> <label>{% trans 'Email' %}</label>
</li> </li>
</ul> </ul>
</fieldset> </fieldset>
@ -215,7 +215,7 @@
</div> </div>
<div id="tabs-4"> <div id="tabs-4">
<form action="../labels_parlamentar/{{query_str}}" method="post">{% csrf_token %} <form action="../labels_parlamentar/{{query_str}}" method="post">{% csrf_token %}
<fieldset><legend>Formato da Etiqueta</legend> <fieldset><legend>{% trans 'Formato da Etiqueta' %}</legend>
<ul class="formato_etiqueta"> <ul class="formato_etiqueta">
<li><input type="radio" name="tamanho_etiqueta" <li><input type="radio" name="tamanho_etiqueta"
value="2x5_etiqueta"><label>2x5</label></li> value="2x5_etiqueta"><label>2x5</label></li>

17
sigi/apps/casas/test_casas.py

@ -0,0 +1,17 @@
import pytest
from django_dynamic_fixture import G
from sigi.apps.casas.models import CasaLegislativa
@pytest.fixture
def some_parliaments():
return parliaments_from_names([
"Assembleia Legislativa do Amapa",
"Camara Municipal de Fortaleza",
"Camara Legislativa do Distrito Federal",
])
def parliaments_from_names(names):
return [G(CasaLegislativa, nome=name, foto=None, gerente_contas=None,) for name in names]

57
sigi/apps/casas/views.py

@ -1,23 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import csv
from functools import reduce
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render from django.shortcuts import render
from django.utils.translation import ugettext as _
from geraldo.generators import PDFGenerator from geraldo.generators import PDFGenerator
from sigi.apps.casas.models import CasaLegislativa, Funcionario from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.casas.reports import CasasLegislativasLabels from sigi.apps.casas.reports import CasasLegislativasLabels, CasasLegislativasLabelsSemPresidente, CasasLegislativasReport, CasasSemConvenioReport, InfoCasaLegislativa
from sigi.apps.casas.reports import CasasLegislativasLabelsSemPresidente
from sigi.apps.casas.reports import CasasLegislativasReport
from sigi.apps.casas.reports import CasasSemConvenioReport
from sigi.apps.casas.reports import InfoCasaLegislativa
from sigi.apps.parlamentares.models import Parlamentar
from sigi.apps.parlamentares.reports import ParlamentaresLabels from sigi.apps.parlamentares.reports import ParlamentaresLabels
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.conf import settings
import csv
from functools import reduce
# @param qs: queryset # @param qs: queryset
# @param o: (int) number of order field # @param o: (int) number of order field
@ -109,7 +103,6 @@ def visualizar_carrinho(request):
request, request,
'casas/carrinho.html', 'casas/carrinho.html',
{ {
'MEDIA_URL': settings.MEDIA_URL,
'carIsEmpty': carrinhoIsEmpty, 'carIsEmpty': carrinhoIsEmpty,
'paginas': paginas, 'paginas': paginas,
'query_str': '?' + request.META['QUERY_STRING'] 'query_str': '?' + request.META['QUERY_STRING']
@ -327,7 +320,7 @@ def export_csv(request):
atributos2 = [s.encode("utf-8") for s in atributos] atributos2 = [s.encode("utf-8") for s in atributos]
try: try:
atributos2.insert(atributos2.index('Município'), u'UF') atributos2.insert(atributos2.index(_(u'Município')), _(u'UF'))
except ValueError: except ValueError:
pass pass
@ -337,49 +330,49 @@ def export_csv(request):
lista = [] lista = []
contatos = casa.funcionario_set.filter(setor="contato_interlegis") contatos = casa.funcionario_set.filter(setor="contato_interlegis")
for atributo in atributos: for atributo in atributos:
if u"CNPJ" == atributo: if _(u"CNPJ") == atributo:
lista.append(casa.cnpj.encode("utf-8")) lista.append(casa.cnpj.encode("utf-8"))
elif u"Código IBGE" == atributo: elif _(u"Código IBGE") == atributo:
lista.append(str(casa.municipio.codigo_ibge).encode("utf-8")) lista.append(str(casa.municipio.codigo_ibge).encode("utf-8"))
elif u"Código TSE" == atributo: elif _(u"Código TSE") == atributo:
lista.append(str(casa.municipio.codigo_tse).encode("utf-8")) lista.append(str(casa.municipio.codigo_tse).encode("utf-8"))
elif u"Nome" == atributo: elif _(u"Nome") == atributo:
lista.append(casa.nome.encode("utf-8")) lista.append(casa.nome.encode("utf-8"))
elif u"Município" == atributo: elif _(u"Município") == atributo:
lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8")) lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8"))
lista.append(unicode(casa.municipio.nome).encode("utf-8")) lista.append(unicode(casa.municipio.nome).encode("utf-8"))
elif u"Presidente" == atributo: elif _(u"Presidente") == atributo:
# TODO: Esse encode deu erro em 25/04/2012. Comentei para que o usuário pudesse continuar seu trabalho # TODO: Esse encode deu erro em 25/04/2012. Comentei para que o usuário pudesse continuar seu trabalho
# É preciso descobrir o porque do erro e fazer a correção definitiva. # É preciso descobrir o porque do erro e fazer a correção definitiva.
# lista.append(str(casa.presidente or "").encode("utf-8")) # lista.append(str(casa.presidente or "").encode("utf-8"))
lista.append(str(casa.presidente or "")) lista.append(str(casa.presidente or ""))
elif u"Logradouro" == atributo: elif _(u"Logradouro") == atributo:
lista.append(casa.logradouro.encode("utf-8")) lista.append(casa.logradouro.encode("utf-8"))
elif u"Bairro" == atributo: elif _(u"Bairro") == atributo:
lista.append(casa.bairro.encode("utf-8")) lista.append(casa.bairro.encode("utf-8"))
elif u"CEP" == atributo: elif _(u"CEP") == atributo:
lista.append(casa.cep.encode("utf-8")) lista.append(casa.cep.encode("utf-8"))
elif u"Telefone" == atributo: elif _(u"Telefone") == atributo:
lista.append(str(casa.telefone or "")) lista.append(str(casa.telefone or ""))
elif u"Página web" == atributo: elif _(u"Página web") == atributo:
lista.append(casa.pagina_web.encode("utf-8")) lista.append(casa.pagina_web.encode("utf-8"))
elif u"Email" == atributo: elif _(u"Email") == atributo:
lista.append(casa.email.encode("utf-8")) lista.append(casa.email.encode("utf-8"))
elif u"Número de parlamentares" == atributo: elif _(u"Número de parlamentares") == atributo:
lista.append(casa.total_parlamentares) lista.append(casa.total_parlamentares)
elif u"Última alteração de endereco" == atributo: elif _(u"Última alteração de endereco") == atributo:
lista.append(casa.ult_alt_endereco) lista.append(casa.ult_alt_endereco)
elif u"Nome contato" == atributo: elif _(u"Nome contato") == atributo:
if contatos and contatos[0].nome: if contatos and contatos[0].nome:
lista.append(contatos[0].nome.encode("utf-8")) lista.append(contatos[0].nome.encode("utf-8"))
else: else:
lista.append('') lista.append('')
elif u"Cargo contato" == atributo: elif _(u"Cargo contato") == atributo:
if contatos and contatos[0].cargo: if contatos and contatos[0].cargo:
lista.append(contatos[0].cargo.encode("utf-8")) lista.append(contatos[0].cargo.encode("utf-8"))
else: else:
lista.append('') lista.append('')
elif u"Email contato" == atributo: elif _(u"Email contato") == atributo:
if contatos and contatos[0].email: if contatos and contatos[0].email:
lista.append(contatos[0].email.encode("utf-8")) lista.append(contatos[0].email.encode("utf-8"))
else: else:

4
sigi/apps/contatos/admin.py

@ -1,5 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import admin from django.contrib import admin
from django.utils.translation import ugettext as _
from sigi.apps.contatos.filters import PopulationFilter from sigi.apps.contatos.filters import PopulationFilter
from sigi.apps.contatos.models import (UnidadeFederativa, Municipio, Telefone, from sigi.apps.contatos.models import (UnidadeFederativa, Municipio, Telefone,
Contato) Contato)
@ -29,7 +31,7 @@ class MunicipioAdmin(BaseModelAdmin):
'codigo_microrregiao', 'nome', 'data_criacao', 'uf', 'codigo_microrregiao', 'nome', 'data_criacao', 'uf',
'is_capital', 'populacao', 'is_polo', 'idh', 'pib_ano', 'pib_total', 'pib_percapita') 'is_capital', 'populacao', 'is_polo', 'idh', 'pib_ano', 'pib_total', 'pib_percapita')
}), }),
('Posição geográfica', { (_(u'Posição geográfica'), {
'fields': ('latitude', 'longitude'), 'fields': ('latitude', 'longitude'),
}), }),
) )

11
sigi/apps/contatos/filters.py

@ -1,11 +1,12 @@
# coding: utf-8 # coding: utf-8
from django.contrib import admin from django.contrib import admin
from django.utils.translation import ugettext as _
class PopulationFilter(admin.SimpleListFilter): class PopulationFilter(admin.SimpleListFilter):
# Human-readable title which will be displayed in the # Human-readable title which will be displayed in the
# right admin sidebar just above the filter options. # right admin sidebar just above the filter options.
title = 'População' title = _(u'População')
# Parameter for the filter that will be used in the URL query. # Parameter for the filter that will be used in the URL query.
parameter_name = 'faixa' parameter_name = 'faixa'
@ -19,10 +20,10 @@ class PopulationFilter(admin.SimpleListFilter):
in the right sidebar. in the right sidebar.
""" """
return ( return (
('1', '< 100 Mil'), ('1', _(u'< 100 Mil')),
('2', '100 Mil a 1 Milhão'), ('2', _(u'100 Mil a 1 Milhão')),
('3', '1 Milhão a 100 Milhões'), ('3', _(u'1 Milhão a 100 Milhões')),
('4', '> 100 Milhões'), ('4', _(u'> 100 Milhões')),
) )
def queryset(self, request, queryset): def queryset(self, request, queryset):

89312
sigi/apps/contatos/fixtures/initial_data.txt

File diff suppressed because it is too large

198
sigi/apps/contatos/models.py

@ -1,9 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from sigi.apps.utils import SearchField from django.contrib.contenttypes.models import ContentType
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
from django.utils.translation import ugettext as _
from sigi.apps.utils import SearchField
class UnidadeFederativa(models.Model): class UnidadeFederativa(models.Model):
@ -11,33 +13,33 @@ class UnidadeFederativa(models.Model):
""" Modelo que representa um estado brasileiro """ Modelo que representa um estado brasileiro
""" """
REGIAO_CHOICES = ( REGIAO_CHOICES = (
('SL', 'Sul'), ('SL', _(u'Sul')),
('SD', 'Sudeste'), ('SD', _(u'Sudeste')),
('CO', 'Centro-Oeste'), ('CO', _(u'Centro-Oeste')),
('NE', 'Nordeste'), ('NE', _(u'Nordeste')),
('NO', 'Norte'), ('NO', _(u'Norte')),
) )
codigo_ibge = models.PositiveIntegerField( codigo_ibge = models.PositiveIntegerField(
u'código IBGE', u'código IBGE',
primary_key=True, primary_key=True,
unique=True, unique=True,
help_text='Código do estado segundo IBGE.' help_text=_(u'Código do estado segundo IBGE.')
) )
nome = models.CharField('Nome UF', max_length=25) nome = models.CharField(_(u'Nome UF'), max_length=25)
# Campo de busca em caixa baixa sem acento # Campo de busca em caixa baixa sem acento
search_text = SearchField(field_names=['nome']) search_text = SearchField(field_names=['nome'])
sigla = models.CharField( sigla = models.CharField(
max_length=2, max_length=2,
unique=True, unique=True,
help_text="Exemplo: <em>MG</em>.", help_text=_(u"Exemplo") + ": <em>MG</em>.",
) )
regiao = models.CharField('região', max_length=2, choices=REGIAO_CHOICES) regiao = models.CharField(_(u'região'), max_length=2, choices=REGIAO_CHOICES)
populacao = models.PositiveIntegerField('população') populacao = models.PositiveIntegerField(_(u'população'))
class Meta: class Meta:
ordering = ('nome',) ordering = (_(u'nome'),)
verbose_name = 'Unidade Federativa' verbose_name = _(u'Unidade Federativa')
verbose_name_plural = 'Unidades Federativas' verbose_name_plural = _(u'Unidades Federativas')
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
@ -48,41 +50,41 @@ class Municipio(models.Model):
""" Modelo para representar as cidades brasileiras """ Modelo para representar as cidades brasileiras
""" """
codigo_ibge = models.PositiveIntegerField( codigo_ibge = models.PositiveIntegerField(
u'código IBGE', _(u'código IBGE'),
primary_key=True, primary_key=True,
unique=True, unique=True,
help_text='Código do município segundo IBGE.' help_text=_(u'Código do município segundo IBGE.')
) )
# agrupamento baseado em similaridades econômicas e sociais # agrupamento baseado em similaridades econômicas e sociais
codigo_mesorregiao = models.PositiveIntegerField( codigo_mesorregiao = models.PositiveIntegerField(
u'código mesorregião', _(u'código mesorregião'),
blank=True, blank=True,
null=True null=True
) )
# agrupamento baseado em similaridades econômicas e sociais # agrupamento baseado em similaridades econômicas e sociais
codigo_microrregiao = models.PositiveIntegerField( codigo_microrregiao = models.PositiveIntegerField(
u'código microrregião', _(u'código microrregião'),
blank=True, blank=True,
null=True null=True
) )
# codio designado pelo Tribunal Superior Eleitoral # codio designado pelo Tribunal Superior Eleitoral
codigo_tse = models.PositiveIntegerField( codigo_tse = models.PositiveIntegerField(
u'código TSE', _(u'código TSE'),
unique=True, unique=True,
null=True, null=True,
help_text='Código do município segundo TSE.' help_text=_(u'Código do município segundo TSE.')
) )
nome = models.CharField(max_length=50) nome = models.CharField(max_length=50)
search_text = SearchField(field_names=['nome', 'uf']) search_text = SearchField(field_names=[_(u'nome'), _(u'uf')])
uf = models.ForeignKey(UnidadeFederativa, verbose_name='UF') uf = models.ForeignKey(UnidadeFederativa, verbose_name=_(u'UF'))
# verdadeiro se o município é capital do estado # verdadeiro se o município é capital do estado
is_capital = models.BooleanField('capital', default=False) is_capital = models.BooleanField(_(u'capital'), default=False)
populacao = models.PositiveIntegerField(u'população') populacao = models.PositiveIntegerField(_(u'população'))
populacao.list_filter_range = [10000, 100000, 1000000] populacao.list_filter_range = [10000, 100000, 1000000]
is_polo = models.BooleanField(u'pólo', default=False) is_polo = models.BooleanField(_(u'pólo'), default=False)
data_criacao = models.DateField(u'data de criação do município', null=True, blank=True) data_criacao = models.DateField(_(u'data de criação do município'), null=True, blank=True)
# posição geográfica do município # posição geográfica do município
latitude = models.DecimalField( latitude = models.DecimalField(
@ -90,28 +92,28 @@ class Municipio(models.Model):
decimal_places=8, decimal_places=8,
null=True, null=True,
blank=True, blank=True,
help_text='Exemplo: <em>-20,464</em>.' help_text=_(u'Exemplo') + ': <em>-20,464</em>.'
) )
longitude = models.DecimalField( longitude = models.DecimalField(
max_digits=11, max_digits=11,
decimal_places=8, decimal_places=8,
null=True, null=True,
blank=True, blank=True,
help_text='Exemplo: <em>-45,426</em>.' help_text=_(u'Exemplo') + ': <em>-45,426</em>.'
) )
idh = models.DecimalField(u'IDH', help_text=u'Índice de desenvolvimento Humano', max_digits=4, decimal_places=3, idh = models.DecimalField(_(u'IDH'), help_text=_(u'Índice de desenvolvimento Humano'), max_digits=4, decimal_places=3,
validators=[MinValueValidator(0), MaxValueValidator(1)]) validators=[MinValueValidator(0), MaxValueValidator(1)])
idh.list_filter_range = [0.500, 0.800] idh.list_filter_range = [0.500, 0.800]
pib_total = models.DecimalField(u'PIB total', max_digits=18, decimal_places=3, blank=True, null=True) pib_total = models.DecimalField(_(u'PIB total'), max_digits=18, decimal_places=3, blank=True, null=True)
pib_percapita = models.DecimalField(u'PIB per capita', max_digits=18, decimal_places=3, blank=True, null=True) pib_percapita = models.DecimalField(_(u'PIB per capita'), max_digits=18, decimal_places=3, blank=True, null=True)
pib_ano = models.IntegerField(u'Ano de apuração do PIB', blank=True, null=True) pib_ano = models.IntegerField(_(u'Ano de apuração do PIB'), blank=True, null=True)
class Meta: class Meta:
ordering = ('nome', 'codigo_ibge') ordering = ('nome', 'codigo_ibge')
verbose_name = 'município' verbose_name = _(u'município')
verbose_name_plural = 'municípios' verbose_name_plural = _(u'municípios')
def __unicode__(self): def __unicode__(self):
return "%s - %s" % (self.nome, self.uf) return "%s - %s" % (self.nome, self.uf)
@ -126,15 +128,15 @@ 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 = (
('F', 'Fixo'), ('F', _(u'Fixo')),
('M', 'Móvel'), ('M', _(u'Móvel')),
('X', 'Fax'), ('X', _(u'Fax')),
('I', 'Indefinido'), ('I', _(u'Indefinido')),
) )
numero = models.CharField( numero = models.CharField(
'número', _(u'número'),
max_length=64, # TODO: diminuir tamanho de campo após migração de dados max_length=64, # TODO: diminuir tamanho de campo após migração de dados
help_text='Exemplo: <em>(31)8851-9898</em>.', help_text=_(u'Exemplo') + ': <em>(31)8851-9898</em>.',
) )
tipo = models.CharField( tipo = models.CharField(
max_length=1, max_length=1,
@ -142,7 +144,7 @@ class Telefone(models.Model):
default='I' default='I'
) )
nota = models.CharField(max_length=70, null=True, blank=True) nota = models.CharField(max_length=70, null=True, blank=True)
ult_alteracao = models.DateTimeField(u'Última alteração', null=True, blank=True, editable=False, auto_now=True) ult_alteracao = models.DateTimeField(_(u'Última alteração'), null=True, blank=True, editable=False, auto_now=True)
# guarda o tipo do objeto (classe) vinculado a esse registro # guarda o tipo do objeto (classe) vinculado a esse registro
content_type = models.ForeignKey(ContentType) content_type = models.ForeignKey(ContentType)
@ -163,16 +165,16 @@ class Contato(models.Model):
""" Modelo generico para registrar contatos vinculados aos """ Modelo generico para registrar contatos vinculados aos
modulos do sistema modulos do sistema
""" """
nome = models.CharField('nome completo', max_length=120) nome = models.CharField(_(u'nome completo'), max_length=120)
nome.alphabetic_filter = True nome.alphabetic_filter = True
nota = models.CharField(max_length=70, blank=True) nota = models.CharField(max_length=70, blank=True)
email = models.EmailField('e-mail', blank=True) email = models.EmailField(_(u'e-mail'), blank=True)
telefones = generic.GenericRelation(Telefone) telefones = generic.GenericRelation(Telefone)
municipio = models.ForeignKey( municipio = models.ForeignKey(
Municipio, Municipio,
verbose_name='município', verbose_name=_(u'município'),
blank=True, blank=True,
null=True, null=True,
) )
@ -185,8 +187,8 @@ class Contato(models.Model):
class Meta: class Meta:
ordering = ('nome',) ordering = ('nome',)
verbose_name = 'contato Interlegis' verbose_name = _(u'contato Interlegis')
verbose_name_plural = 'contatos Interlegis' verbose_name_plural = _(u'contatos Interlegis')
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
@ -194,51 +196,51 @@ class Contato(models.Model):
class Endereco(models.Model): class Endereco(models.Model):
TIPO_CHOICES = ( TIPO_CHOICES = (
('aeroporto', 'Aeroporto'), ('aeroporto', _(u'Aeroporto')),
('alameda', 'Alameda'), ('alameda', _(u'Alameda')),
('area', u'Área'), ('area', _(u'Área')),
('avenida', 'Avenida'), ('avenida', _(u'Avenida')),
('campo', 'Campo'), ('campo', _(u'Campo')),
('chacara', u'Chácara'), ('chacara', _(u'Chácara')),
('colonia', u'Colônia'), ('colonia', _(u'Colônia')),
('condominio', u'Condomínio'), ('condominio', _(u'Condomínio')),
('conjunto', 'Conjunto'), ('conjunto', _(u'Conjunto')),
('distrito', 'Distrito'), ('distrito', _(u'Distrito')),
('esplanada', 'Esplanada'), ('esplanada', _(u'Esplanada')),
('estacao', u'Estação'), ('estacao', _(u'Estação')),
('estrada', 'Estrada'), ('estrada', _(u'Estrada')),
('favela', 'Favela'), ('favela', _(u'Favela')),
('fazenda', 'Fazenda'), ('fazenda', _(u'Fazenda')),
('feira', 'Feira'), ('feira', _(u'Feira')),
('jardim', 'Jardim'), ('jardim', _(u'Jardim')),
('ladeira', 'Ladeira'), ('ladeira', _(u'Ladeira')),
('lago', 'Lago'), ('lago', _(u'Lago')),
('lagoa', 'Lagoa'), ('lagoa', _(u'Lagoa')),
('largo', 'Largo'), ('largo', _(u'Largo')),
('loteamento', 'Loteamento'), ('loteamento', _(u'Loteamento')),
('morro', 'Morro'), ('morro', _(u'Morro')),
('nucleo', u'Núcleo'), ('nucleo', _(u'Núcleo')),
('parque', 'Parque'), ('parque', _(u'Parque')),
('passarela', 'Passarela'), ('passarela', _(u'Passarela')),
('patio', u'Pátio'), ('patio', _(u'Pátio')),
('praca', u'Praça'), ('praca', _(u'Praça')),
('quadra', 'Quadra'), ('quadra', _(u'Quadra')),
('recanto', 'Recanto'), ('recanto', _(u'Recanto')),
('residencial', 'Residencial'), ('residencial', _(u'Residencial')),
('rodovia', 'Rodovia'), ('rodovia', _(u'Rodovia')),
('rua', 'Rua'), ('rua', _(u'Rua')),
('setor', 'Setor'), ('setor', _(u'Setor')),
('sitio', u'Sítio'), ('sitio', _(u'Sítio')),
('travessa', 'Travessa'), ('travessa', _(u'Travessa')),
('trecho', 'Trecho'), ('trecho', _(u'Trecho')),
('trevo', 'Trevo'), ('trevo', _(u'Trevo')),
('vale', 'Vale'), ('vale', _(u'Vale')),
('vereda', 'Vereda'), ('vereda', _(u'Vereda')),
('via', 'Via'), ('via', _(u'Via')),
('viaduto', 'Viaduto'), ('viaduto', _(u'Viaduto')),
('viela', 'Viela'), ('viela', _(u'Viela')),
('vila', 'Vila'), ('vila', _(u'Vila')),
('outro', 'Outro'), ('outro', _(u'Outro')),
) )
# tipo do endereço obtido no site dos correios # tipo do endereço obtido no site dos correios
@ -254,16 +256,16 @@ class Endereco(models.Model):
bairro = models.CharField(max_length=100, blank=True) bairro = models.CharField(max_length=100, blank=True)
cep = models.CharField( cep = models.CharField(
'CEP', _(u'CEP'),
max_length=9, max_length=9,
blank=True, blank=True,
null=True, null=True,
help_text="Formato: <em>XXXXX-XXX</em>." help_text=_(u"Formato") + ": <em>XXXXX-XXX</em>."
) )
municipio = models.ForeignKey( municipio = models.ForeignKey(
Municipio, Municipio,
verbose_name='município', verbose_name=_(u'município'),
blank=True, blank=True,
null=True, null=True,
) )
@ -277,8 +279,8 @@ class Endereco(models.Model):
class Meta: class Meta:
ordering = ('logradouro', 'numero') ordering = ('logradouro', 'numero')
verbose_name = u'endereço' verbose_name = _(u'endereço')
verbose_name_plural = u'endereços' verbose_name_plural = _(u'endereços')
def __unicode__(self): def __unicode__(self):
return self.tipo + ' ' + self.logradouro + ', ' + self.numero \ return self.tipo + ' ' + self.logradouro + ', ' + self.numero \

15
sigi/apps/convenios/admin.py

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import admin from django.contrib import admin
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.utils.translation import ugettext as _
from geraldo.generators import PDFGenerator from geraldo.generators import PDFGenerator
from sigi.apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo, Tramitacao from sigi.apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo, Tramitacao
@ -42,12 +43,12 @@ class ConvenioAdmin(BaseModelAdmin):
(None, (None,
{'fields': ('casa_legislativa', 'num_processo_sf', 'num_convenio', 'projeto', 'observacao')} {'fields': ('casa_legislativa', 'num_processo_sf', 'num_convenio', 'projeto', 'observacao')}
), ),
('Datas', (_(u'Datas'),
{'fields': ('data_adesao', 'data_retorno_assinatura', {'fields': ('data_adesao', 'data_retorno_assinatura',
'data_termo_aceite', 'data_pub_diario', 'data_termo_aceite', 'data_pub_diario',
'data_devolucao_via', 'data_postagem_correio')} 'data_devolucao_via', 'data_postagem_correio')}
), ),
('Datas - Convenio sem assinatura', (_(u'Datas - Convenio sem assinatura'),
{'fields': ('data_devolucao_sem_assinatura', 'data_retorno_sem_assinatura',)} {'fields': ('data_devolucao_sem_assinatura', 'data_retorno_sem_assinatura',)}
), ),
) )
@ -68,7 +69,7 @@ class ConvenioAdmin(BaseModelAdmin):
def get_uf(self, obj): def get_uf(self, obj):
return obj.casa_legislativa.municipio.uf.sigla return obj.casa_legislativa.municipio.uf.sigla
get_uf.short_description = 'UF' get_uf.short_description = _(u'UF')
get_uf.admin_order_field = 'casa_legislativa__municipio__uf__sigla' get_uf.admin_order_field = 'casa_legislativa__municipio__uf__sigla'
def changelist_view(self, request, extra_context=None): def changelist_view(self, request, extra_context=None):
@ -103,7 +104,7 @@ class ConvenioAdmin(BaseModelAdmin):
report = ConvenioReport(queryset=queryset) report = ConvenioReport(queryset=queryset)
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response
relatorio.short_description = u'Exportar convênios selecionados para PDF' relatorio.short_description = _(u'Exportar convênios selecionados para PDF')
def adicionar_convenios(self, request, queryset): def adicionar_convenios(self, request, queryset):
if 'carrinho_convenios' in request.session: if 'carrinho_convenios' in request.session:
@ -114,11 +115,11 @@ class ConvenioAdmin(BaseModelAdmin):
q2 = len(request.session['carrinho_convenios']) q2 = len(request.session['carrinho_convenios'])
quant = q2 - q1 quant = q2 - q1
if quant: if quant:
self.message_user(request, str(q2 - q1) + " Convênios adicionados no carrinho") self.message_user(request, str(q2 - q1) + _(u" Convênios adicionados no carrinho"))
else: else:
self.message_user(request, "Os Convênios selecionados já foram adicionadas anteriormente") self.message_user(request, _(u"Os Convênios selecionados já foram adicionadas anteriormente"))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
adicionar_convenios.short_description = u"Armazenar convênios no carrinho para exportar" adicionar_convenios.short_description = _(u"Armazenar convênios no carrinho para exportar")
def get_actions(self, request): def get_actions(self, request):
actions = super(ConvenioAdmin, self).get_actions(request) actions = super(ConvenioAdmin, self).get_actions(request)

79
sigi/apps/convenios/models.py

@ -1,7 +1,8 @@
# style="list-style-type: noneo -*- coding: utf-8 -*- # style="list-style-type: noneo -*- coding: utf-8 -*-
from datetime import datetime from datetime import datetime
from django.db import models from django.db import models
from django.contrib.contenttypes import generic from django.utils.translation import ugettext as _
from sigi.apps.utils import SearchField from sigi.apps.utils import SearchField
@ -29,67 +30,67 @@ class Convenio(models.Model):
""" """
casa_legislativa = models.ForeignKey( casa_legislativa = models.ForeignKey(
'casas.CasaLegislativa', 'casas.CasaLegislativa',
verbose_name='Casa Legislativa' verbose_name=_(u'Casa Legislativa')
) )
# campo de busca em caixa baixa e sem acentos # campo de busca em caixa baixa e sem acentos
search_text = SearchField(field_names=['casa_legislativa']) search_text = SearchField(field_names=['casa_legislativa'])
projeto = models.ForeignKey('Projeto') projeto = models.ForeignKey(_(u'Projeto'))
# numero designado pelo Senado Federal para o convênio # numero designado pelo Senado Federal para o convênio
num_processo_sf = models.CharField( num_processo_sf = models.CharField(
'número do processo SF (Senado Federal)', _(u'número do processo SF (Senado Federal)'),
max_length=20, max_length=20,
blank=True, blank=True,
help_text='Formatos:<br/>Antigo: <em>XXXXXX/XX-X</em>.<br/><em>SIGAD: XXXXX.XXXXXX/XXXX-XX</em>' help_text=_(u'Formatos:<br/>Antigo: <em>XXXXXX/XX-X</em>.<br/><em>SIGAD: XXXXX.XXXXXX/XXXX-XX</em>')
) )
num_convenio = models.CharField( num_convenio = models.CharField(
'número do convênio', _(u'número do convênio'),
max_length=10, max_length=10,
blank=True blank=True
) )
data_adesao = models.DateField( data_adesao = models.DateField(
'Aderidas', _(u'Aderidas'),
null=True, null=True,
blank=True, blank=True,
) )
data_retorno_assinatura = models.DateField( data_retorno_assinatura = models.DateField(
'Conveniadas', _(u'Conveniadas'),
null=True, null=True,
blank=True, blank=True,
help_text='Convênio firmado.' help_text=_(u'Convênio firmado.')
) )
data_pub_diario = models.DateField( data_pub_diario = models.DateField(
'data da publicação no Diário Oficial', _(u'data da publicação no Diário Oficial'),
null=True, null=True,
blank=True blank=True
) )
data_termo_aceite = models.DateField( data_termo_aceite = models.DateField(
'Equipadas', _(u'Equipadas'),
null=True, null=True,
blank=True, blank=True,
help_text='Equipamentos recebidos.' help_text=_(u'Equipamentos recebidos.')
) )
data_devolucao_via = models.DateField( data_devolucao_via = models.DateField(
'data de devolução da via', _(u'data de devolução da via'),
null=True, null=True,
blank=True, blank=True,
help_text=u'Data de devolução da via do convênio à Câmara Municipal.' help_text=_(u'Data de devolução da via do convênio à Câmara Municipal.')
) )
data_postagem_correio = models.DateField( data_postagem_correio = models.DateField(
'data postagem correio', _(u'data postagem correio'),
null=True, null=True,
blank=True, blank=True,
) )
data_devolucao_sem_assinatura = models.DateField( data_devolucao_sem_assinatura = models.DateField(
'data de devolução por falta de assinatura', _(u'data de devolução por falta de assinatura'),
null=True, null=True,
blank=True, blank=True,
help_text=u'Data de devolução por falta de assinatura', help_text=_(u'Data de devolução por falta de assinatura'),
) )
data_retorno_sem_assinatura = models.DateField( data_retorno_sem_assinatura = models.DateField(
'data do retorno sem assinatura', _(u'data do retorno sem assinatura'),
null=True, null=True,
blank=True, blank=True,
help_text=u'Data do retorno do convênio sem assinatura', help_text=_(u'Data do retorno do convênio sem assinatura'),
) )
observacao = models.CharField( observacao = models.CharField(
null=True, null=True,
@ -107,13 +108,18 @@ class Convenio(models.Model):
class Meta: class Meta:
get_latest_by = 'id' get_latest_by = 'id'
ordering = ('id',) ordering = ('id',)
verbose_name = u'convênio' verbose_name = _(u'convênio')
def __unicode__(self): def __unicode__(self):
if self.data_retorno_assinatura is not None: if self.data_retorno_assinatura is not None:
return u"Convênio nº %s - projeto %s, em %s" % (self.num_convenio, self.projeto.sigla, self.data_retorno_assinatura) return _(u"Convênio nº %(number)s - projeto %(project)s, em %(date)s") % dict(
number=self.num_convenio,
project=self.projeto.sigla,
date=self.data_retorno_assinatura)
else: else:
return u"Adesão ao projeto %s, em %s" % (self.projeto.sigla, self.data_adesao) return _(u"Adesão ao projeto %(project)s, em %(date)s") % dict(
project=self.projeto.sigla,
date=self.data_adesao)
class EquipamentoPrevisto(models.Model): class EquipamentoPrevisto(models.Model):
@ -122,13 +128,13 @@ class EquipamentoPrevisto(models.Model):
disponibilizados para as Casas Legislativas disponibilizados para as Casas Legislativas
(foi usado na prmeira etapa do programa) (foi usado na prmeira etapa do programa)
""" """
convenio = models.ForeignKey(Convenio, verbose_name=u'convênio') convenio = models.ForeignKey(Convenio, verbose_name=_(u'convênio'))
equipamento = models.ForeignKey('inventario.Equipamento') equipamento = models.ForeignKey('inventario.Equipamento')
quantidade = models.PositiveSmallIntegerField(default=1) quantidade = models.PositiveSmallIntegerField(default=1)
class Meta: class Meta:
verbose_name = 'equipamento previsto' verbose_name = _(u'equipamento previsto')
verbose_name_plural = 'equipamentos previstos' verbose_name_plural = _(u'equipamentos previstos')
def __unicode__(self): def __unicode__(self):
return u'%s %s(s)' % (self.quantidade, self.equipamento) return u'%s %s(s)' % (self.quantidade, self.equipamento)
@ -139,12 +145,12 @@ 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
""" """
convenio = models.ForeignKey(Convenio, verbose_name=u'convênio') convenio = models.ForeignKey(Convenio, verbose_name=_(u'convênio'))
# caminho no sistema para o documento anexo # caminho no sistema para o documento anexo
arquivo = models.FileField(upload_to='apps/convenios/anexo/arquivo',) arquivo = models.FileField(upload_to='apps/convenios/anexo/arquivo', max_length=500)
descricao = models.CharField('descrição', max_length='70') descricao = models.CharField(_(u'descrição'), max_length='70')
data_pub = models.DateTimeField( data_pub = models.DateTimeField(
'data da publicação do anexo', _(u'data da publicação do anexo'),
default=datetime.now default=datetime.now
) )
@ -173,21 +179,22 @@ 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)
""" """
convenio = models.ForeignKey(Convenio, verbose_name=u'convênio') convenio = models.ForeignKey(Convenio, verbose_name=_(u'convênio'))
unid_admin = models.ForeignKey(UnidadeAdministrativa, verbose_name=u'Unidade Administrativa') unid_admin = models.ForeignKey(UnidadeAdministrativa, verbose_name=_(u'Unidade Administrativa'))
data = models.DateField() data = models.DateField()
observacao = models.CharField( observacao = models.CharField(
'observação', _(u'observação'),
max_length='512', max_length='512',
null=True, null=True,
blank=True, blank=True,
) )
class Meta: class Meta:
verbose_name_plural = u'Tramitações' verbose_name_plural = _(u'Tramitações')
def __unicode__(self): def __unicode__(self):
in_date = _(u"em %(date)s") % dict(date=self.data) # for focused translation
result = u"%s %s" % (self.unid_admin, in_date)
if self.observacao: if self.observacao:
return unicode("%s em %s (%s)" % (self.unid_admin, self.data, self.observacao)) result = result + u" (%s)" % (self.observacao)
else: return unicode(result) # XXX is this unicode(...) really necessary???
return unicode("%s em %s" % (self.unid_admin, self.data))

67
sigi/apps/convenios/reports.py

@ -1,18 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os from django.utils.translation import ugettext as _
from ctypes import alignment from geraldo import ReportBand, ObjectValue, Label, ReportGroup, FIELD_ACTION_SUM
from operator import attrgetter
from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \
landscape, SystemField, BAND_WIDTH, ReportGroup, \
FIELD_ACTION_SUM, FIELD_ACTION_COUNT, FIELD_ACTION_AVG
from geraldo.graphics import Image
from reportlab.lib.units import cm from reportlab.lib.units import cm
from reportlab.lib.pagesizes import A4
from reportlab.lib.enums import TA_CENTER, TA_RIGHT
from sigi.apps.relatorios.reports import ReportDefault from sigi.apps.relatorios.reports import ReportDefault
#from abc import ABCMeta #from abc import ABCMeta
@ -33,7 +26,7 @@ class SemEquipamentosReport(object):
class ConvenioReport(ReportDefault): class ConvenioReport(ReportDefault):
title = u'Relatório de Convênios' title = _(u'Relatório de Convênios')
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
@ -44,47 +37,47 @@ class ConvenioReport(ReportDefault):
elements += [ elements += [
Label( Label(
text="UF", text=_(u"UF"),
left=label_left[0] * cm, left=label_left[0] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text="Municipio", text=_(u"Municipio"),
left=label_left[1] * cm, left=label_left[1] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text="Data de Adesão", text=_(u"Data de Adesão"),
left=label_left[2] * cm, left=label_left[2] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text="Número do Convênio", text=_(u"Número do Convênio"),
left=label_left[3] * cm, left=label_left[3] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text="Data do Convênio", text=_(u"Data do Convênio"),
left=label_left[4] * cm, left=label_left[4] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text="Data de Publicação", text=_(u"Data de Publicação"),
left=label_left[5] * cm, left=label_left[5] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text="Data de Aceite", text=_(u"Data de Aceite"),
left=label_left[6] * cm, left=label_left[6] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text="Projeto", text=_(u"Projeto"),
left=label_left[7] * cm, left=label_left[7] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
width=2 * cm, width=2 * cm,
@ -147,7 +140,7 @@ class ConvenioReport(ReportDefault):
height=0.7 * cm, height=0.7 * cm,
elements=[ elements=[
ObjectValue(attribute_name='casa_legislativa.municipio.uf', ObjectValue(attribute_name='casa_legislativa.municipio.uf',
get_Value=lambda instance: 'CasaLegislativa: ' + (instance.casa_legislativa.uf) get_Value=lambda instance: '%s: %s' % (_(u'Casa Legislativa'), instance.casa_legislativa.uf)
) )
], ],
borders={'top': True}, borders={'top': True},
@ -167,41 +160,41 @@ class ConvenioReportSemAceite(ConvenioReport):
elements += [ elements += [
Label( Label(
text="UF", text=_(u"UF"),
left=label_left[0] * cm, left=label_left[0] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text="Município", text=_(u"Município"),
left=label_left[1] * cm, left=label_left[1] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text="Data de Adesão", text=_(u"Data de Adesão"),
left=label_left[3] * cm, left=label_left[3] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text="Número do Convênio", text=_(u"Número do Convênio"),
left=label_left[4] * cm, left=label_left[4] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text="Data do Convênio", text=_(u"Data do Convênio"),
left=label_left[5] * cm, left=label_left[5] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text="Data de Publicação", text=_(u"Data de Publicação"),
left=label_left[6] * cm, left=label_left[6] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text="Projeto", text=_(u"Projeto"),
left=label_left[7] * cm, left=label_left[7] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
width=2 * cm, width=2 * cm,
@ -254,7 +247,7 @@ float_duas_casas = lambda instance: '%.2f' % (instance)
class ConvenioReportRegiao(ReportDefault): class ConvenioReportRegiao(ReportDefault):
title = u'Relatório de Convênios por Região' title = _(u'Relatório de Convênios por Região')
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top label_top = ReportDefault.band_page_header.label_top
@ -264,11 +257,11 @@ class ConvenioReportRegiao(ReportDefault):
elements = list(ReportDefault.band_page_header.elements) elements = list(ReportDefault.band_page_header.elements)
elements += [ elements += [
Label(text="UF", left=label_left[0] * cm, top=label_top,), Label(text=_(u"UF"), left=label_left[0] * cm, top=label_top,),
Label(text="Total", left=label_left[1] * cm, top=label_top,), Label(text=_(u"Total"), left=label_left[1] * cm, top=label_top,),
Label(text="Aderidas", left=label_left[2] * cm, top=label_top,), Label(text=_(u"Aderidas"), left=label_left[2] * cm, top=label_top,),
Label(text="%", left=label_left[3] * cm, top=label_top), Label(text="%", left=label_left[3] * cm, top=label_top),
Label(text="Ñ Aderidas", left=label_left[4] * cm, top=label_top,), Label(text=_(u"Ñ 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),
] ]
@ -290,7 +283,7 @@ class ConvenioReportRegiao(ReportDefault):
class band_summary(ReportBand): class band_summary(ReportBand):
label_left = [0.5, 6, 8, 10, 12, 14] label_left = [0.5, 6, 8, 10, 12, 14]
elements = [ elements = [
Label(text="Total", top=0.1 * cm, left=label_left[0] * cm), Label(text=_(u"Total"), top=0.1 * cm, left=label_left[0] * cm),
ObjectValue(attribute_name='quant_casas', action=FIELD_ACTION_SUM, left=label_left[1] * cm, ), ObjectValue(attribute_name='quant_casas', 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,
@ -305,16 +298,16 @@ class ConvenioReportRegiao(ReportDefault):
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')

54
sigi/apps/convenios/templates/convenios/carrinho.html

@ -5,15 +5,15 @@
{% include "admin/tabs_style.html" %} {% include "admin/tabs_style.html" %}
{% endblock %} {% endblock %}
{% block title %}Convênios no Carrinho | SIGI{% endblock %} {% block title %}{% trans 'Convênios no Carrinho | SIGI' %}{% endblock %}
{% block content_title %}<h1>Convênios no Carrinho</h1>{% endblock %} {% block content_title %}<h1>{% trans 'Convênios no Carrinho' %}</h1>{% endblock %}
{% block mensagem%} {% block mensagem%}
<ul class="messagelist"> <ul class="messagelist">
{%if carIsEmpty%} {%if carIsEmpty%}
<li class="warning">O carrinho está vazio, sendo assim todos os convênios entram na lista para exportação de acordo com os filtros aplicados.</li> <li class="warning">{% trans 'O carrinho está vazio, sendo assim todos os convênios entram na lista para exportação de acordo com os filtros aplicados.' %}</li>
{%else%} {%else%}
<li>{{paginas.paginator.count}} Convênios no carrinho.</li> <li>{{paginas.paginator.count}} {% trans 'Convênios no carrinho' %}.</li>
{%endif%} {%endif%}
</ul> </ul>
{% endblock %} {% endblock %}
@ -28,12 +28,12 @@
<th class="sorted ascending"><!-- <input type="checkbox" id="action-toggle" style="display: inline;">--> <th class="sorted ascending"><!-- <input type="checkbox" id="action-toggle" style="display: inline;">-->
</th> </th>
{% endif %} {% endif %}
<th class="sorted ascending">Numero do convênio</th> <th class="sorted ascending">{% trans 'Numero do convênio' %}</th>
<th class="sorted ascending">Casa Legislativa</th> <th class="sorted ascending">{% trans 'Casa Legislativa' %}</th>
<th class="sorted ascending">Aderidas</th> <th class="sorted ascending">{% trans 'Aderidas' %}</th>
<th class="sorted ascending">Convêniadas</th> <th class="sorted ascending">{% trans 'Convêniadas' %}</th>
<th class="sorted ascending">Equipadas</th> <th class="sorted ascending">{% trans 'Equipadas' %}</th>
<th class="sorted ascending">Projeto</th> <th class="sorted ascending">{% trans 'Projeto' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -59,34 +59,34 @@
<div id="tabs"> <div id="tabs">
<ul> <ul>
<li><a href="#tabs-1">Relatório</a></li> <li><a href="#tabs-1">{% trans 'Relatório' %}</a></li>
<li><a href="#tabs-2">Arquivo CSV (Excel, Calc)</a></li> <li><a href="#tabs-2">{% trans 'Arquivo CSV (Excel, Calc)' %}</a></li>
</ul> </ul>
<div id="tabs-1"> <div id="tabs-1">
<form action="../reports/{{ query_str }}" method="post">{% csrf_token %} <form action="../reports/{{ query_str }}" method="post">{% csrf_token %}
<fieldset> <fieldset>
<legend>Relatório por</legend> <legend>{% trans 'Relatório por' %}</legend>
<ul class="tabs-conteudo"> <ul class="tabs-conteudo">
<li> <li>
<input type="radio" name="filtro_casa" value="cm" checked="checked"/> <input type="radio" name="filtro_casa" value="cm" checked="checked"/>
<label>Câmara Municipal</label> <label>{% trans 'Câmara Municipal' %}</label>
</li> </li>
<li> <li>
<input type="radio" name="filtro_casa" value="al" /> <input type="radio" name="filtro_casa" value="al" />
<label>Assembléia Legislativa</label> <label>{% trans 'Assembléia Legislativa' %}</label>
</li> </li>
</ul> </ul>
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>Com data de aceite? (Equipada)</legend> <legend>{% trans 'Com data de aceite? (Equipada)' %}</legend>
<ul class="tabs-conteudo"> <ul class="tabs-conteudo">
<li> <li>
<input type="radio" name="data_aceite" value="sim" checked="checked" /> <input type="radio" name="data_aceite" value="sim" checked="checked" />
<label>Sim</label> <label>{% trans 'Sim' %}</label>
</li> </li>
<li> <li>
<input type="radio" name="data_aceite" value="nao" /> <input type="radio" name="data_aceite" value="nao" />
<label>Não</label> <label>{% trans 'Não' %}</label>
</li> </li>
</ul> </ul>
</fieldset> </fieldset>
@ -97,55 +97,55 @@
</div> </div>
<div id="tabs-2"> <div id="tabs-2">
<form action="../csv/{{query_str}}" method="post">{% csrf_token %} <form action="../csv/{{query_str}}" method="post">{% csrf_token %}
<fieldset><legend>Escolha os atributos para exportar</legend> <fieldset><legend>{% trans 'Escolha os atributos para exportar' %}</legend>
<ul id="sortable" class="tabs-conteudo"> <ul id="sortable" class="tabs-conteudo">
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="No. Processo" <input type="checkbox" name="itens_csv_selected" value="No. Processo"
class="action-select" checked="checked" /> class="action-select" checked="checked" />
<label>Nº Processo</label> <label>{% trans 'Nº Processo' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="No. Convênio" <input type="checkbox" name="itens_csv_selected" value="No. Convênio"
class="action-select" checked="checked" /> class="action-select" checked="checked" />
<label>Nº Convênio</label> <label>{% trans 'Nº Convênio' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Projeto" <input type="checkbox" name="itens_csv_selected" value="Projeto"
class="action-select" checked="checked" /> class="action-select" checked="checked" />
<label>Projeto</label> <label>{% trans 'Projeto' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Casa Legislativa" <input type="checkbox" name="itens_csv_selected" value="Casa Legislativa"
class="action-select" checked="checked" /> class="action-select" checked="checked" />
<label>Casa Legislativa</label> <label>{% trans 'Casa Legislativa' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Data de Adesão" <input type="checkbox" name="itens_csv_selected" value="Data de Adesão"
class="action-select" checked="checked" /> class="action-select" checked="checked" />
<label>Data de Adesão</label> <label>{% trans 'Data de Adesão' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Data de Convênio" <input type="checkbox" name="itens_csv_selected" value="Data de Convênio"
class="action-select" checked="checked" /> class="action-select" checked="checked" />
<label>Data de Convênio</label> <label>{% trans 'Data de Convênio' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Data da Publicacao no D.O." <input type="checkbox" name="itens_csv_selected" value="Data da Publicacao no D.O."
class="action-select" checked="checked" /> class="action-select" checked="checked" />
<label>Data da Publicação no Diário Oficial</label> <label>{% trans 'Data da Publicação no Diário Oficial' %}</label>
</li> </li>
<li> <li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span> <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Data Equipada" <input type="checkbox" name="itens_csv_selected" value="Data Equipada"
class="action-select" checked="checked" /> class="action-select" checked="checked" />
<label>Data Equipada</label> <label>{% trans 'Data Equipada' %}</label>
</li> </li>
</ul> </ul>
</fieldset> </fieldset>

7
sigi/apps/convenios/templates/convenios/change_list.html

@ -1,4 +1,5 @@
{% extends "change_list_with_cart.html" %} {% extends "change_list_with_cart.html" %}
{% load i18n %}
{% block search %} {% block search %}
<div id="toolbar"> <div id="toolbar">
@ -6,12 +7,12 @@
<div><!-- DIV needed for valid HTML --> <div><!-- DIV needed for valid HTML -->
<label for="searchbar"><img src="/static/admin/img/icon_searchbox.png" alt="Search" /></label> <label for="searchbar"><img src="/static/admin/img/icon_searchbox.png" alt="Search" /></label>
<input type="text" size="40" name="q" value="" id="searchbar" /> <input type="text" size="40" name="q" value="" id="searchbar" />
<label for="data_retorno_assinatura__gte">Conveniadas a partir de:</label> <label for="data_retorno_assinatura__gte">{% trans 'Conveniadas a partir de' %}:</label>
<input type="text" size="10" name="data_retorno_assinatura__gte" value="" id="data_retorno_assinatura__gte" class="vDateField"/> <input type="text" size="10" name="data_retorno_assinatura__gte" value="" id="data_retorno_assinatura__gte" class="vDateField"/>
<label for="data_retorno_assinatura__lte">até:</label> <label for="data_retorno_assinatura__lte">{% trans 'até' %}:</label>
<input type="text" size="10" name="data_retorno_assinatura__lte" value="" id="data_retorno_assinatura__lte" /> <input type="text" size="10" name="data_retorno_assinatura__lte" value="" id="data_retorno_assinatura__lte" />
<input type="submit" value="Pesquisar" /> <input type="submit" value="Pesquisar" />
Datas podem ser: Um ano (aaaa), um mês (aaaa-mm) ou um dia (aaaa-mm-dd) {% trans 'Datas podem ser: Um ano (aaaa), um mês (aaaa-mm) ou um dia (aaaa-mm-dd)' %}
</div> </div>
</form> </form>
</div> </div>

12
sigi/apps/convenios/templates/convenios/tabela_regiao.html

@ -1,3 +1,5 @@
{% load static from staticfiles %}
{% load i18n %}
<html> <html>
<head> <head>
<title>Relatório por Região</title> <title>Relatório por Região</title>
@ -56,7 +58,7 @@
} }
#footerContent #direita{ #footerContent #direita{
text-align: right; text-align: right;
background-image: url("/media/images/logo-senado.png"); background-image: url("{% static 'img/logo-senado.png' %}");
} }
.tabela { .tabela {
padding-top: 0.1cm; padding-top: 0.1cm;
@ -94,9 +96,9 @@
<div id="cabecalho"> <div id="cabecalho">
<table> <table>
<tr> <tr>
<td id="imagem1"><img src="../media/images/logo-senado.png" width="80" height="80" alt="Logo Senado"/></td> <td id="imagem1"><img src="{% static 'img/logo-senado.png' %}" width="80" height="80" alt="Logo Senado"/></td>
<td id="centro" colspan="3">SENADO FEDERAL<br/><span class="item2">SINTER - Secretaria Especial do Interlegis</span></td> <td id="centro" colspan="3">{% trans 'SENADO FEDERAL' %}<br/><span class="item2">{% trans 'SINTER - Secretaria Especial do Interlegis' %}</span></td>
<td id="imagem2"><img src="../media/images/logo-interlegis.jpg" width="90" height="65" alt="Logo Interlegis"/></td> <td id="imagem2"><img src="{% static 'img/logo-interlegis.jpg' %}" width="90" height="65" alt="Logo Interlegis"/></td>
</tr> </tr>
</table> </table>
<h1 class="titulo">{{regiao}}</h1> <h1 class="titulo">{{regiao}}</h1>
@ -136,7 +138,7 @@
<table> <table>
<tr> <tr>
<td id="esquerda">{{data}} às {{hora}}</td> <td id="esquerda">{{data}} às {{hora}}</td>
<td id="direita">Página <pdf:pagenumber /> </td> <td id="direita">{% trans 'Página' %} <pdf:pagenumber /> </td>
</tr> </tr>
</table> </table>
</div> </div>

79
sigi/apps/convenios/views.py

@ -1,26 +1,20 @@
#-*- coding:utf-8 -*- #-*- coding:utf-8 -*-
import csv
import datetime
import ho.pisa as pisa
from django.conf import settings
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, get_list_or_404 from django.shortcuts import render, get_list_or_404
from django.template import Context, loader
from django.utils.translation import ugettext as _
from geraldo.generators import PDFGenerator from geraldo.generators import PDFGenerator
from sigi.apps.convenios.models import Convenio, Projeto
from sigi.apps.convenios.reports import ConvenioReport \
, ConvenioPorCMReport \
, ConvenioPorALReport \
, ConvenioReportSemAceiteAL \
, ConvenioReportSemAceiteCM
from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.contatos.models import UnidadeFederativa from sigi.apps.contatos.models import UnidadeFederativa
from sigi.apps.convenios.models import Convenio, Projeto
import ho.pisa as pisa from sigi.apps.convenios.reports import ConvenioPorCMReport, ConvenioPorALReport, ConvenioReportSemAceiteAL, ConvenioReportSemAceiteCM
from django.template import Context, loader
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.conf import settings
import datetime
import csv
def query_ordena(qs, o, ot): def query_ordena(qs, o, ot):
@ -134,7 +128,6 @@ def visualizar_carrinho(request):
request, request,
'convenios/carrinho.html', 'convenios/carrinho.html',
{ {
'MEDIA_URL': settings.MEDIA_URL,
'carIsEmpty': carrinhoIsEmpty, 'carIsEmpty': carrinhoIsEmpty,
'paginas': paginas, 'paginas': paginas,
'query_str': '?' + request.META['QUERY_STRING'] 'query_str': '?' + request.META['QUERY_STRING']
@ -230,12 +223,12 @@ def casas_estado_to_tabela(casas, convenios, regiao):
) )
cabecalho_topo = ( cabecalho_topo = (
u'UF', _(u'UF'),
u'Câmaras municipais', _(u'Câmaras municipais'),
u'Não Aderidas', _(u'Não Aderidas'),
u'Aderidas', _(u'Aderidas'),
u'Conveniadas', _(u'Conveniadas'),
u'Equipadas' _(u'Equipadas')
) )
return { return {
@ -252,11 +245,11 @@ def report_regiao(request, regiao='NE'):
regiao = request.POST['regiao'] regiao = request.POST['regiao']
REGIAO_CHOICES = { REGIAO_CHOICES = {
'SL': 'Sul', 'SL': _(u'Sul'),
'SD': 'Sudeste', 'SD': _(u'Sudeste'),
'CO': 'Centro-Oeste', 'CO': _(u'Centro-Oeste'),
'NE': 'Nordeste', 'NE': _(u'Nordeste'),
'NO': 'Norte', 'NO': _(u'Norte'),
} }
projetos = Projeto.objects.all() projetos = Projeto.objects.all()
@ -267,7 +260,7 @@ def report_regiao(request, regiao='NE'):
# Geral # Geral
convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM') convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM')
tabela = casas_estado_to_tabela(camaras, convenios, regiao) tabela = casas_estado_to_tabela(camaras, convenios, regiao)
tabela["projeto"] = "Geral" tabela["projeto"] = _(u"Geral")
tabelas.append(tabela) tabelas.append(tabela)
@ -301,47 +294,47 @@ def export_csv(request):
if not convenios: if not convenios:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
atributos = [u"No. Processo", u"No. Convênio", u"Projeto", u"Casa Legislativa", u"Data de Adesão", u"Data de Convênio", atributos = [_(u"No. Processo"), _(u"No. Convênio"), _(u"Projeto"), _(u"Casa Legislativa"), _(u"Data de Adesão"), _(u"Data de Convênio"),
u"Data da Publicacao no D.O.", u"Data Equipada", ] _(u"Data da Publicacao no D.O."), _(u"Data Equipada"), ]
if request.POST: if request.POST:
atributos = request.POST.getlist("itens_csv_selected") atributos = request.POST.getlist("itens_csv_selected")
col_titles = atributos col_titles = atributos
if u"Casa Legislativa" in col_titles: if _(u"Casa Legislativa") in col_titles:
pos = col_titles.index(u"Casa Legislativa") + 1 pos = col_titles.index(_(u"Casa Legislativa")) + 1
col_titles.insert(pos, u"uf") col_titles.insert(pos, _(u"uf"))
csv_writer.writerow([s.encode("utf-8") for s in col_titles]) csv_writer.writerow([s.encode("utf-8") for s in col_titles])
for convenio in convenios: for convenio in convenios:
lista = [] lista = []
for atributo in atributos: for atributo in atributos:
if u"No. Processo" == atributo: if _(u"No. Processo") == atributo:
lista.append(convenio.num_processo_sf.encode("utf-8")) lista.append(convenio.num_processo_sf.encode("utf-8"))
elif u"No. Convênio" == atributo: elif _(u"No. Convênio") == atributo:
lista.append(convenio.num_convenio.encode("utf-8")) lista.append(convenio.num_convenio.encode("utf-8"))
elif u"Projeto" == atributo: elif _(u"Projeto") == atributo:
lista.append(convenio.projeto.nome.encode("utf-8")) lista.append(convenio.projeto.nome.encode("utf-8"))
elif u"Casa Legislativa" == atributo: elif _(u"Casa Legislativa") == atributo:
lista.append(convenio.casa_legislativa.nome.encode("utf-8")) lista.append(convenio.casa_legislativa.nome.encode("utf-8"))
lista.append(convenio.casa_legislativa.municipio.uf.sigla.encode("utf-8")) lista.append(convenio.casa_legislativa.municipio.uf.sigla.encode("utf-8"))
elif u"Data de Adesão" == atributo: elif _(u"Data de Adesão") == atributo:
data = '' data = ''
if convenio.data_adesao: if convenio.data_adesao:
data = convenio.data_adesao.strftime("%d/%m/%Y") data = convenio.data_adesao.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8")) lista.append(data.encode("utf-8"))
elif u"Data de Convênio" == atributo: elif _(u"Data de Convênio") == atributo:
data = '' data = ''
if convenio.data_retorno_assinatura: if convenio.data_retorno_assinatura:
data = convenio.data_retorno_assinatura.strftime("%d/%m/%Y") data = convenio.data_retorno_assinatura.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8")) lista.append(data.encode("utf-8"))
elif u"Data da Publicacao no D.O." == atributo: elif _(u"Data da Publicacao no D.O.") == atributo:
data = '' data = ''
if convenio.data_pub_diario: if convenio.data_pub_diario:
data = convenio.data_pub_diario.strftime("%d/%m/%Y") data = convenio.data_pub_diario.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8")) lista.append(data.encode("utf-8"))
data = '' data = ''
elif u"Data Equipada" == atributo: elif _(u"Data Equipada") == atributo:
if convenio.data_termo_aceite: if convenio.data_termo_aceite:
data = convenio.data_termo_aceite.strftime("%d/%m/%Y") data = convenio.data_termo_aceite.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8")) lista.append(data.encode("utf-8"))

16
sigi/apps/diagnosticos/admin.py

@ -2,7 +2,9 @@
from datetime import datetime from datetime import datetime
from django.contrib import admin from django.contrib import admin
from django.db.utils import OperationalError, ProgrammingError from django.db.utils import OperationalError, ProgrammingError
from django.utils.translation import ugettext as _
from eav.admin import BaseEntityAdmin, BaseSchemaAdmin from eav.admin import BaseEntityAdmin, BaseSchemaAdmin
from sigi.apps.diagnosticos.forms import DiagnosticoForm from sigi.apps.diagnosticos.forms import DiagnosticoForm
from sigi.apps.diagnosticos.models import Diagnostico, Pergunta, Escolha, Equipe, Anexo, Categoria from sigi.apps.diagnosticos.models import Diagnostico, Pergunta, Escolha, Equipe, Anexo, Categoria
from sigi.apps.utils.base_admin import BaseModelAdmin from sigi.apps.utils.base_admin import BaseModelAdmin
@ -19,15 +21,15 @@ def publicar_diagnostico(self, request, queryset):
email = diagnostico.responsavel.user.email email = diagnostico.responsavel.user.email
if email: if email:
diagnostico.email_diagnostico_publicado(email, request.get_host()) diagnostico.email_diagnostico_publicado(email, request.get_host())
self.message_user(request, "Diagnóstico(s) publicado(s) com sucesso!") self.message_user(request, _(u"Diagnóstico(s) publicado(s) com sucesso!"))
publicar_diagnostico.short_description = u""" publicar_diagnostico.short_description = _(u"""
Definir diagnósticos como publicado""" Definir diagnósticos como publicado""")
def despublicar_diagnostico(self, request, queryset): def despublicar_diagnostico(self, request, queryset):
queryset.update(publicado=False) queryset.update(publicado=False)
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):
@ -84,7 +86,7 @@ class DiagnosticoAdmin(BaseEntityAdmin):
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 = _(u'UF')
get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome' get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome'
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
@ -126,7 +128,7 @@ class EscolhaInline(admin.TabularInline):
model = Escolha model = Escolha
fk_name = 'schema' fk_name = 'schema'
raw_id_fields = ('schema_to_open',) raw_id_fields = ('schema_to_open',)
verbose_name = 'Escolhas (apenas para choices ou multiple choices)' verbose_name = _(u'Escolhas (apenas para choices ou multiple choices)')
extra = 0 extra = 0

32502
sigi/apps/diagnosticos/fixtures/initial_data.txt

File diff suppressed because it is too large

16
sigi/apps/diagnosticos/forms.py

@ -1,18 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from copy import deepcopy from copy import deepcopy
from django import forms from django import forms
from django.forms.forms import BoundField from django.contrib.contenttypes.generic import generic_inlineformset_factory
from django.forms import (BooleanField, CharField, DateField, from django.forms import (BooleanField, CharField, DateField,
FloatField, ModelChoiceField, Textarea, FloatField, ModelChoiceField, Textarea,
ModelMultipleChoiceField) ModelMultipleChoiceField)
from django.contrib.contenttypes.generic import generic_inlineformset_factory from django.forms.forms import BoundField
from django.utils.translation import ugettext as _
from eav.fields import RangeField
from eav.forms import BaseDynamicEntityForm
from sigi.apps.casas.models import CasaLegislativa, Funcionario from sigi.apps.casas.models import CasaLegislativa, Funcionario
from sigi.apps.contatos.models import Telefone from sigi.apps.contatos.models import Telefone
from sigi.apps.diagnosticos.models import Diagnostico from sigi.apps.diagnosticos.models import Diagnostico
from sigi.apps.diagnosticos.widgets import EavCheckboxSelectMultiple, EavRadioSelect from sigi.apps.diagnosticos.widgets import EavCheckboxSelectMultiple, EavRadioSelect
from eav.forms import BaseDynamicEntityForm
from eav.fields import RangeField
class DiagnosticoForm(BaseDynamicEntityForm): class DiagnosticoForm(BaseDynamicEntityForm):
@ -131,7 +133,7 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm):
class CasaLegislativaMobileForm(forms.ModelForm): class CasaLegislativaMobileForm(forms.ModelForm):
data_instalacao = forms.DateField(label=u'Data de instalação da Casa Legislativa', required=False) data_instalacao = forms.DateField(label=_(u'Data de instalação da Casa Legislativa'), required=False)
data_criacao = forms.DateField() data_criacao = forms.DateField()
class Meta: class Meta:
@ -141,7 +143,7 @@ class CasaLegislativaMobileForm(forms.ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(CasaLegislativaMobileForm, self).__init__(*args, **kwargs) super(CasaLegislativaMobileForm, self).__init__(*args, **kwargs)
self.fields['data_criacao'] = forms.DateField( self.fields['data_criacao'] = forms.DateField(
label=u'Data de criação do Município', label=_(u'Data de criação do Município'),
initial=self.instance.municipio.data_criacao, initial=self.instance.municipio.data_criacao,
required=False) required=False)

40
sigi/apps/diagnosticos/models.py

@ -1,11 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from datetime import datetime from datetime import datetime
from django.db import models from django.db import models
from django.utils.translation import ugettext as _
from eav.models import BaseChoice, BaseEntity, BaseSchema, BaseAttribute
from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.utils import SearchField from sigi.apps.utils import SearchField
from sigi.apps.utils.email import enviar_email from sigi.apps.utils.email import enviar_email
from eav.models import BaseChoice, BaseEntity, BaseSchema, BaseAttribute
class Diagnostico(BaseEntity): class Diagnostico(BaseEntity):
@ -15,7 +15,7 @@ class Diagnostico(BaseEntity):
""" """
casa_legislativa = models.ForeignKey( casa_legislativa = models.ForeignKey(
'casas.CasaLegislativa', 'casas.CasaLegislativa',
verbose_name='Casa Legislativa') verbose_name=_(u'Casa Legislativa'))
# campo de busca em caixa baixa e sem acento # campo de busca em caixa baixa e sem acento
search_text = SearchField(field_names=['casa_legislativa']) search_text = SearchField(field_names=['casa_legislativa'])
@ -39,10 +39,10 @@ class Diagnostico(BaseEntity):
) )
responsavel = models.ForeignKey('servidores.Servidor', responsavel = models.ForeignKey('servidores.Servidor',
verbose_name=u'responsável') verbose_name=_(u'responsável'))
class Meta: class Meta:
verbose_name, verbose_name_plural = u'diagnóstico', u'diagnósticos' verbose_name, verbose_name_plural = _(u'diagnóstico'), _(u'diagnósticos')
@property @property
def membros(self): def membros(self):
@ -85,7 +85,7 @@ class Diagnostico(BaseEntity):
* host - O Host do sistema, para ser usado na * host - O Host do sistema, para ser usado na
construção do endereço do diagnóstico construção do endereço do diagnóstico
""" """
enviar_email(from_email, u"Diagnóstico publicado", enviar_email(from_email, _(u"Diagnóstico publicado"),
'diagnosticos/email_diagnostico_publicado.txt', 'diagnosticos/email_diagnostico_publicado.txt',
{ {
'responsavel': self.responsavel.nome_completo, 'responsavel': self.responsavel.nome_completo,
@ -93,7 +93,7 @@ class Diagnostico(BaseEntity):
'data_diagnostico': self.data_visita_inicio, 'data_diagnostico': self.data_visita_inicio,
'host': host, 'host': host,
'url_diagnostico': self.get_absolute_url(), 'url_diagnostico': self.get_absolute_url(),
'status': u"Publicado", 'status': _(u"Publicado"),
}) })
def email_diagnostico_alterado(self, from_email, host): def email_diagnostico_alterado(self, from_email, host):
@ -103,7 +103,7 @@ class Diagnostico(BaseEntity):
* host - O Host do sistema, para ser usado na * host - O Host do sistema, para ser usado na
construção do endereço do diagnóstico construção do endereço do diagnóstico
""" """
enviar_email(from_email, u"Diagnóstico alterado", enviar_email(from_email, _(u"Diagnóstico alterado"),
'diagnosticos/email_diagnostico_alterado.txt', 'diagnosticos/email_diagnostico_alterado.txt',
{ {
'servidor': self.responsavel.nome_completo, 'servidor': self.responsavel.nome_completo,
@ -111,7 +111,7 @@ class Diagnostico(BaseEntity):
'data_diagnostico': self.data_visita_inicio, 'data_diagnostico': self.data_visita_inicio,
'host': host, 'host': host,
'url_diagnostico': self.get_absolute_url(), 'url_diagnostico': self.get_absolute_url(),
'status': "Alterado", 'status': _(u"Alterado"),
}) })
def get_schemata(self, category=None, *args, **kwargs): def get_schemata(self, category=None, *args, **kwargs):
@ -188,7 +188,7 @@ class Pergunta(BaseSchema):
class Meta: class Meta:
ordering = ('title',) ordering = ('title',)
verbose_name, verbose_name_plural = 'pergunta', 'perguntas' verbose_name, verbose_name_plural = _(u'pergunta'), _(u'perguntas')
class Escolha(BaseChoice): class Escolha(BaseChoice):
@ -197,14 +197,14 @@ class Escolha(BaseChoice):
cadastradas neste modelo cadastradas neste modelo
""" """
schema = models.ForeignKey(Pergunta, schema = models.ForeignKey(Pergunta,
related_name='choices', verbose_name='pergunta') related_name='choices', verbose_name=_(u'pergunta'))
schema_to_open = models.ForeignKey(Pergunta, related_name='', schema_to_open = models.ForeignKey(Pergunta, related_name='',
verbose_name='pergunta para abrir', blank=True, null=True) verbose_name=_(u'pergunta para abrir'), blank=True, null=True)
ordem = models.PositiveIntegerField(blank=True, null=True) ordem = models.PositiveIntegerField(blank=True, null=True)
class Meta: class Meta:
ordering = ('schema', 'ordem') ordering = ('schema', 'ordem')
verbose_name, verbose_name_plural = 'escolha', 'escolhas' verbose_name, verbose_name_plural = _(u'escolha'), _(u'escolhas')
class Resposta(BaseAttribute): class Resposta(BaseAttribute):
@ -213,12 +213,12 @@ class Resposta(BaseAttribute):
de um diagnosico de um diagnosico
""" """
schema = models.ForeignKey(Pergunta, related_name='attrs', schema = models.ForeignKey(Pergunta, related_name='attrs',
verbose_name='pergunta') verbose_name=_(u'pergunta'))
choice = models.ForeignKey(Escolha, verbose_name='escolha', choice = models.ForeignKey(Escolha, verbose_name=_(u'escolha'),
blank=True, null=True) blank=True, null=True)
class Meta: class Meta:
verbose_name, verbose_name_plural = 'resposta', 'respostas' verbose_name, verbose_name_plural = _(u'resposta'), _(u'respostas')
class Equipe(models.Model): class Equipe(models.Model):
@ -229,7 +229,7 @@ class Equipe(models.Model):
membro = models.ForeignKey('servidores.Servidor') membro = models.ForeignKey('servidores.Servidor')
class Meta: class Meta:
verbose_name, verbose_name_plural = u'equipe', u'equipe' verbose_name, verbose_name_plural = _(u'equipe'), _(u'equipe')
def __unicode__(self): def __unicode__(self):
return self.membro.__unicode__() return self.membro.__unicode__()
@ -241,9 +241,9 @@ class Anexo(models.Model):
no processo de diagnóstico. Podem ser fotos, contratos, etc. no processo de diagnóstico. Podem ser fotos, contratos, etc.
""" """
diagnostico = models.ForeignKey(Diagnostico, verbose_name=u'diagnóstico') diagnostico = models.ForeignKey(Diagnostico, verbose_name=u'diagnóstico')
arquivo = models.FileField(upload_to='apps/diagnostico/anexo/arquivo',) arquivo = models.FileField(upload_to='apps/diagnostico/anexo/arquivo', max_length=500)
descricao = models.CharField('descrição', max_length='70') descricao = models.CharField(_(u'descrição'), max_length='70')
data_pub = models.DateTimeField('data da publicação do anexo', data_pub = models.DateTimeField(_(u'data da publicação do anexo'),
default=datetime.now) default=datetime.now)
class Meta: class Meta:

5
sigi/apps/diagnosticos/templates/admin/diagnosticos/diagnostico/change_form.html

@ -1,16 +1,17 @@
{% extends "base_change_form.html" %} {% extends "base_change_form.html" %}
{% load static from staticfiles %}
{% load i18n reporting_tags %} {% load i18n reporting_tags %}
{% block extrastyle %} {% block extrastyle %}
{{ block.super }} {{ block.super }}
<link rel="stylesheet" type="text/css" href="{{MEDIA_URL}}css/admin/diagnosticos/diagnostico/change_form.css"> <link rel="stylesheet" type="text/css" href="{% static 'css/admin/diagnosticos/diagnostico/change_form.css' %}">
{% endblock %} {% endblock %}
{% block object-tools %} {% block object-tools %}
{% if change %}{% if not is_popup %} {% if change %}{% if not is_popup %}
<ul class="object-tools"> <ul class="object-tools">
<li><a href="history/" class="historylink">{% trans "History" %}</a></li> <li><a href="history/" class="historylink">{% trans "History" %}</a></li>
<li><a href="{{adminform.form.instance.get_absolute_url }}" class="viewsitelink">Ver em PDF</a></li> <li><a href="{{adminform.form.instance.get_absolute_url }}" class="viewsitelink">{% trans 'Ver em PDF' %}</a></li>
</ul> </ul>
{% endif %}{% endif %} {% endif %}{% endif %}
{% endblock %} {% endblock %}

6
sigi/apps/diagnosticos/templates/admin/diagnosticos/diagnostico/change_list.html

@ -8,12 +8,12 @@
<div><!-- DIV needed for valid HTML --> <div><!-- DIV needed for valid HTML -->
<label for="searchbar"><img src="{% static 'admin/img/icon_searchbox.png' %}" alt="Search" /></label> <label for="searchbar"><img src="{% static 'admin/img/icon_searchbox.png' %}" alt="Search" /></label>
<input type="text" size="40" name="q" value="" id="searchbar" /> <input type="text" size="40" name="q" value="" id="searchbar" />
<label for="data_visita_inicio__gte">Visitados a partir de:</label> <label for="data_visita_inicio__gte">{% trans 'Visitados a partir de' %}:</label>
<input type="text" size="10" name="data_visita_inicio__gte" value="" id="data_visita_inicio__gte" class="vDateField"/> <input type="text" size="10" name="data_visita_inicio__gte" value="" id="data_visita_inicio__gte" class="vDateField"/>
<label for="data_visita_inicio__lte">até:</label> <label for="data_visita_inicio__lte">{% trans 'até' %}:</label>
<input type="text" size="10" name="data_visita_inicio__lte" value="" id="data_visita_inicio__lte" /> <input type="text" size="10" name="data_visita_inicio__lte" value="" id="data_visita_inicio__lte" />
<input type="submit" value="Pesquisar" /> <input type="submit" value="Pesquisar" />
Datas podem ser: Um ano (aaaa), um mês (aaaa-mm) ou um dia (aaaa-mm-dd) {% trans 'Datas podem ser: Um ano (aaaa), um mês (aaaa-mm) ou um dia (aaaa-mm-dd)' %}
</div> </div>
</form> </form>
</div> </div>

68
sigi/apps/diagnosticos/templates/diagnosticos/diagnostico_pdf.html

@ -1,4 +1,6 @@
{% load smart_if %} {% load smart_if %}
{% load static from staticfiles %}
{% load i18n %}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html> <html>
<head> <head>
@ -86,51 +88,51 @@
<div id="header"> <div id="header">
<table> <table>
<tr> <tr>
<td class="logo"><img src="{{MEDIA_URL}}images/logo-senado.jpg"/></td> <td class="logo"><img src="{% static 'img/logo-senado.jpg' %}"/></td>
<td class="header_text"> <td class="header_text">
<p><strong>SENADO FEDERAL</strong></p> <p><strong>{% trans 'SENADO FEDERAL' %}</strong></p>
<p><strong>SECRETARIA ESPECIAL DO INTERLEGIS – SINTER</strong></p> <p><strong>{% trans 'SECRETARIA ESPECIAL DO INTERLEGIS – SINTER' %}</strong></p>
<p>SUBSECRETARIA DE PLANEJAMENTO E FOMENTO – SSPLF</p> <p>{% trans 'SUBSECRETARIA DE PLANEJAMENTO E FOMENTO – SSPLF' %}</p>
</td> </td>
<td class="logo"><img src="{{MEDIA_URL}}images/logo-interlegis.jpg"/></td> <td class="logo"><img src="{% static 'img/logo-interlegis.jpg' %}"/></td>
</tr> </tr>
</table> </table>
</div> </div>
<div id="capa"> <div id="capa">
<center> <center>
<img src="{{MEDIA_URL}}images/logo-interlegis-grande.jpg"/> <img src="{% static 'img/logo-interlegis-grande.jpg' %}"/>
</center> </center>
<h1> <h1>
PROJETO DE MODERNIZAÇÃO DO LEGISLATIVO {% trans 'PROJETO DE MODERNIZAÇÃO DO LEGISLATIVO' %}
</br> </br>
</br> </br>
QUESTIONÁRIO DE DIAGNÓSTICO {% trans 'QUESTIONÁRIO DE DIAGNÓSTICO' %}
</h1> </h1>
<h2 style="text-align: center;"> <h2 style="text-align: center;">
{{ diagnostico.casa_legislativa }} - {{ diagnostico.casa_legislativa.municipio.uf.sigla }} {{ diagnostico.casa_legislativa }} - {{ diagnostico.casa_legislativa.municipio.uf.sigla }}
</h2> </h2>
<h3>Data do Questionário:</h3> <h3>{% trans 'Data do Questionário' %}:</h3>
<p>De {{diagnostico.data_visita_inicio}} à {{diagnostico.data_visita_fim}}</p> <p>De {{diagnostico.data_visita_inicio}} à {{diagnostico.data_visita_fim}}</p>
<h3>Chefe da equipe de diagnóstico:</h3> <h3>{% trans 'Chefe da equipe de diagnóstico' %}:</h3>
<p>{{diagnostico.responsavel}}</p> <p>{{diagnostico.responsavel}}</p>
<h3>Membros da equipe de diagnóstico:</h3> <h3>{% trans 'Membros da equipe de diagnóstico' %}:</h3>
{% for membro in diagnostico.equipe_set.all %} {% for membro in diagnostico.equipe_set.all %}
<p>{{membro}}</p> <p>{{membro}}</p>
{% endfor %} {% endfor %}
{% for funcionario in funcionarios %} {% for funcionario in funcionarios %}
{% if funcionario.setor == 'contato_interlegis' %} {% if funcionario.setor == 'contato_interlegis' %}
<h3>Nome do responsável pelas Informações:</h3> <h3>{% trans 'Nome do responsável pelas Informações' %}:</h3>
<p>{{funcionario.nome|default_if_none:""}}</p> <p>{{funcionario.nome|default_if_none:""}}</p>
<h3>Cargo / função do responsável pelas informações:</h3> <h3>{% trans 'Cargo / função do responsável pelas informações' %}:</h3>
<p>{{funcionario.cargo|default_if_none:""}} / {{funcionario.funcao|default_if_none:""}}</p> <p>{{funcionario.cargo|default_if_none:""}} / {{funcionario.funcao|default_if_none:""}}</p>
<h3>E-mail do responsável pelas informações:</h3> <h3>{% trans 'E-mail do responsável pelas informações' %}:</h3>
<p>{{funcionario.email|default_if_none:""}}</p> <p>{{funcionario.email|default_if_none:""}}</p>
{% for telefone in funcionario.telefones.all %} {% for telefone in funcionario.telefones.all %}
<h3>Telefone {{telefone.get_tipo_display}} do responsável pelas informações</h3> <h3>{% blocktrans %}Telefone {{telefone.get_tipo_display}} do responsável pelas informações{% endblocktrans %}</h3>
<p>{{telefone}}</p> <p>{{telefone}}</p>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
@ -152,44 +154,44 @@
</div> </div>
<div class="new_page"> <div class="new_page">
<h2>Bloco 01. Identificação da {{casa_legislativa.tipo}}</h2> <h2>{% blocktrans %}Bloco 01. Identificação da {{casa_legislativa.tipo}}{% endblocktrans %}</h2>
<h3>01. Municipio - Estado:</h3> <h3>01. {% trans 'Municipio - Estado' %}:</h3>
<p class="strong">{{casa_legislativa.municipio|default_if_none:""}}&nbsp;</p> <p class="strong">{{casa_legislativa.municipio|default_if_none:""}}&nbsp;</p>
<h3>02. Data de criação do Município:</h3> <h3>02. {% trans 'Data de criação do Município' %}:</h3>
<p class="strong">{{casa_legislativa.municipio.data_criacao|default_if_none:""}}&nbsp;</p> <p class="strong">{{casa_legislativa.municipio.data_criacao|default_if_none:""}}&nbsp;</p>
<h3>03. Nome da {{casa_legislativa.tipo}}</h3> <h3>03. {% blocktrans %}Nome da {{casa_legislativa.tipo}}{% endblocktrans %}</h3>
<p class="strong">{{casa_legislativa.municipio.nome|default_if_none:""}}&nbsp;</p> <p class="strong">{{casa_legislativa.municipio.nome|default_if_none:""}}&nbsp;</p>
<h3>04. Data de instalação da {{casa_legislativa.tipo}}</h3> <h3>04. {% blocktrans %}Data de instalação da {{casa_legislativa.tipo}}{% endblocktrans %}</h3>
<p class="strong">{{casa_legislativa.data_instalacao|default_if_none:""}}&nbsp;</p> <p class="strong">{{casa_legislativa.data_instalacao|default_if_none:""}}&nbsp;</p>
<h3>05. Endereço:</h3> <h3>05. {% trans 'Endereço' %}:</h3>
<p class="strong">{{casa_legislativa.logradouro|default_if_none:""}} - {{casa_legislativa.cep|default_if_none:""}}</p> <p class="strong">{{casa_legislativa.logradouro|default_if_none:""}} - {{casa_legislativa.cep|default_if_none:""}}</p>
<h3>06. CNPJ:</h3> <h3>06. {% trans 'CNPJ' %}:</h3>
<p class="strong">{{casa_legislativa.cnpj|default_if_none:""}}&nbsp;</p> <p class="strong">{{casa_legislativa.cnpj|default_if_none:""}}&nbsp;</p>
<h3>07. E-mail:</h3> <h3>07. {% trans 'E-mail' %}:</h3>
<p class="strong">{{casa_legislativa.email|default_if_none:""}}&nbsp;</p> <p class="strong">{{casa_legislativa.email|default_if_none:""}}&nbsp;</p>
<h3>08. Página web:</h3> <h3>08. {% trans 'Página web' %}:</h3>
<p class="strong">{{casa_legislativa.pagina_web|default_if_none:""}}&nbsp;</p> <p class="strong">{{casa_legislativa.pagina_web|default_if_none:""}}&nbsp;</p>
</div> </div>
<div class="new_page"> <div class="new_page">
<h2>Bloco 02. Identificação de Competências na Câmara Municipal</h2> <h2>{% trans 'Bloco 02. Identificação de Competências na Câmara Municipal' %}</h2>
{% for funcionario in funcionarios %} {% for funcionario in funcionarios %}
<div class="same_page"> <div class="same_page">
<h3>{{funcionario.get_setor_display}}</h3> <h3>{{funcionario.get_setor_display}}</h3>
<p class="strong">Nome completo: {{funcionario.nome|default_if_none:""}}</p> <p class="strong">{% trans 'Nome completo' %}: {{funcionario.nome|default_if_none:""}}</p>
<p class="strong">E-mail: {{funcionario.email|default_if_none:""}}</p> <p class="strong">{% trans 'E-mail' %}: {{funcionario.email|default_if_none:""}}</p>
<p class="strong">Tempo de serviço: {{funcionario.tempo_de_servico|default_if_none:""}}</p> <p class="strong">{% trans 'Tempo de serviço' %}: {{funcionario.tempo_de_servico|default_if_none:""}}</p>
{% for telefone in funcionario.telefones.all %} {% for telefone in funcionario.telefones.all %}
<p class="strong">Telefone {{telefone.get_tipo_display}}: {{telefone}}</p> <p class="strong">{% blocktrans %}Telefone {{telefone.get_tipo_display}}{% endblocktrans %}: {{telefone}}</p>
{% endfor %} {% endfor %}
</div> </div>
{% endfor %} {% endfor %}
@ -197,7 +199,7 @@
{% for categoria, schemas in schemas_by_categoria %} {% for categoria, schemas in schemas_by_categoria %}
<div class="new_page"> <div class="new_page">
<h2>Bloco {{categoria.nome}}</h2> <h2>{% trans 'Bloco' %} {{categoria.nome}}</h2>
{% for schema in schemas %} {% for schema in schemas %}
<div class="same_page"> <div class="same_page">
<h3>{{ schema.title }}</h3> <h3>{{ schema.title }}</h3>
@ -214,9 +216,9 @@
{% else %} {% else %}
<p class="strong"> <p class="strong">
{% if schema.datatype == schema.TYPE_FLOAT %} {% if schema.datatype == schema.TYPE_FLOAT %}
{{ schema.value|floatformat|default_if_none:"sem resposta"}} {{ schema.value|floatformat|default_if_none:_("sem resposta")}}
{% else %} {% else %}
{{ schema.value|default_if_none:"sem resposta"}} {{ schema.value|default_if_none:_("sem resposta")}}
{% endif %} {% endif %}
&nbsp;</p> &nbsp;</p>
{% endif %} {% endif %}
@ -226,7 +228,7 @@
{% endfor %} {% endfor %}
<div id="footer"> <div id="footer">
{%block page_foot%} {%block page_foot%}
Página <pdf:pagenumber> {% trans 'Página' %} <pdf:pagenumber>
{%endblock%} {%endblock%}
</div> </div>
</body> </body>

12
sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_categoria_casa_legislativa_form.html

@ -1,8 +1,10 @@
{% extends "base_mobile.html" %} {% extends "base_mobile.html" %}
{% load static from staticfiles %}
{% load i18n %}
{% block media %} {% block media %}
{{ block.super }} {{ block.super }}
<link rel="stylesheet" href="{{MEDIA_URL}}css/diagnosticos/diagnosticos_categoria_model_form.css" /> <link rel="stylesheet" href="{% static 'css/diagnosticos/diagnosticos_categoria_model_form.css' %}" />
{% endblock %} {% endblock %}
{% block cabecalho %} {% block cabecalho %}
@ -15,7 +17,7 @@
{% if form %} {% if form %}
<div id="waiting"> <div id="waiting">
<!-- Exibe as perguntas apos o carregamento completo do javascript --> <!-- Exibe as perguntas apos o carregamento completo do javascript -->
<h2>Aguarde carregando perguntas para essa categoria...</h2> <h2>{% trans 'Aguarde carregando perguntas para essa categoria...' %}</h2>
</div> </div>
<div id="form" style="display:none;"> <div id="form" style="display:none;">
<div data-role="fieldcontain"> <div data-role="fieldcontain">
@ -35,12 +37,12 @@
</form> </form>
</div> </div>
{% else %} {% else %}
<h2>Nenhuma existem perguntas para essa categoria.</h2> <h2>{% trans 'Nenhuma existem perguntas para essa categoria.' %}</h2>
{% endif %} {% endif %}
{% endblock corpo %} {% endblock corpo %}
{% block rodape %} {% block rodape %}
{{ block.super }} {{ block.super }}
<li><a href="{% url 'lista_categorias' diagnostico.id %}" data-icon="grid" class="ui-state-persist">Listar</a></li> <li><a href="{% url 'lista_categorias' diagnostico.id %}" data-icon="grid" class="ui-state-persist">{% trans 'Listar' %}</a></li>
<li><a href="{% url 'logout' %}" data-icon="delete">Sair</a></li> <li><a href="{% url 'logout' %}" data-icon="delete">{% trans 'Sair' %}</a></li>
{% endblock rodape %} {% endblock rodape %}

14
sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_categoria_contatos_form.html

@ -1,12 +1,14 @@
{% extends "base_mobile.html" %} {% extends "base_mobile.html" %}
{% load static from staticfiles %}
{% load i18n %}
{% block media %} {% block media %}
{{ block.super }} {{ block.super }}
<link rel="stylesheet" href="{{MEDIA_URL}}css/diagnosticos/diagnosticos_categoria_model_form.css" /> <link rel="stylesheet" href="{% static 'css/diagnosticos/diagnosticos_categoria_model_form.css' %}" />
{% endblock %} {% endblock %}
{% block cabecalho %} {% block cabecalho %}
<h1>02. Identificação de Competências</h1> <h1>02. {% trans 'Identificação de Competências' %}</h1>
<a href="{% url 'lista_categorias' diagnostico.id %}?c=2" data-icon="arrow-l" <a href="{% url 'lista_categorias' diagnostico.id %}?c=2" data-icon="arrow-l"
data-direction="reverse" data-theme="c" class="ui-btn-left">Voltar</a> data-direction="reverse" data-theme="c" class="ui-btn-left">Voltar</a>
{% endblock cabecalho %} {% endblock cabecalho %}
@ -14,7 +16,7 @@
{% block corpo %} {% block corpo %}
<div id="waiting"> <div id="waiting">
<!-- Exibe as perguntas apos o carregamento completo do javascript --> <!-- Exibe as perguntas apos o carregamento completo do javascript -->
<h2>Aguarde carregando perguntas para essa categoria...</h2> <h2>{% trans 'Aguarde carregando perguntas para essa categoria...' %}</h2>
</div> </div>
<div id="form" style="display:none;"> <div id="form" style="display:none;">
<form id="diagnostico" action="." method="post"> <form id="diagnostico" action="." method="post">
@ -27,7 +29,7 @@
<span id="{{ field.html_name }}-errors" class="errors"></span> <span id="{{ field.html_name }}-errors" class="errors"></span>
</div> </div>
{% endfor %} {% endfor %}
<h4>Telefones</h4> <h4>{% trans 'Telefones' %}</h4>
{% for form in form.telefones.forms %} {% for form in form.telefones.forms %}
<div class="phone" data-role="fieldcontain"> <div class="phone" data-role="fieldcontain">
{{ form.tipo }} {{ form.numero }} {{ form.tipo }} {{ form.numero }}
@ -47,6 +49,6 @@
{% block rodape %} {% block rodape %}
{{ block.super }} {{ block.super }}
<li><a href="{% url 'lista_categorias' diagnostico.id %}" data-icon="grid" class="ui-state-persist">Listar</a></li> <li><a href="{% url 'lista_categorias' diagnostico.id %}" data-icon="grid" class="ui-state-persist">{% trans 'Listar' %}</a></li>
<li><a href="{% url 'logout' %}" data-icon="delete">Sair</a></li> <li><a href="{% url 'logout' %}" data-icon="delete">{% trans 'Sair' %}</a></li>
{% endblock rodape %} {% endblock rodape %}

12
sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_categorias_form.html

@ -1,8 +1,10 @@
{% extends "base_mobile.html" %} {% extends "base_mobile.html" %}
{% load static from staticfiles %}
{% load i18n %}
{% block media %} {% block media %}
{{ block.super }} {{ block.super }}
<link rel="stylesheet" href="{{MEDIA_URL}}css/diagnosticos/diagnosticos_categorias_form.css" /> <link rel="stylesheet" href="{% static 'css/diagnosticos/diagnosticos_categorias_form.css' %}" />
{% endblock %} {% endblock %}
{% block cabecalho %} {% block cabecalho %}
@ -15,7 +17,7 @@
{% if form %} {% if form %}
<div id="waiting"> <div id="waiting">
<!-- Exibe as perguntas apos o carregamento completo do javascript --> <!-- Exibe as perguntas apos o carregamento completo do javascript -->
<h2>Aguarde carregando perguntas para essa categoria...</h2> <h2>{% trans 'Aguarde carregando perguntas para essa categoria...' %}</h2>
</div> </div>
<div id="form" style="display:none;"> <div id="form" style="display:none;">
<form id="diagnostico" action="." method="post"> <form id="diagnostico" action="." method="post">
@ -35,12 +37,12 @@
</form> </form>
</div> </div>
{% else %} {% else %}
<h2>Nenhuma existem perguntas para essa categoria.</h2> <h2>{% trans 'Nenhuma existem perguntas para essa categoria.' %}</h2>
{% endif %} {% endif %}
{% endblock corpo %} {% endblock corpo %}
{% block rodape %} {% block rodape %}
{{ block.super }} {{ block.super }}
<li><a href="{% url 'lista_categorias' diagnostico.id %}" data-icon="grid" class="ui-state-persist">Listar</a></li> <li><a href="{% url 'lista_categorias' diagnostico.id %}" data-icon="grid" class="ui-state-persist">{% trans 'Listar' %}</a></li>
<li><a href="{% url 'logout' %}" data-icon="delete">Sair</a></li> <li><a href="{% url 'logout' %}" data-icon="delete">{% trans 'Sair' %}</a></li>
{% endblock rodape %} {% endblock rodape %}

14
sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_categorias_list.html

@ -1,4 +1,6 @@
{% extends "base_mobile.html" %} {% extends "base_mobile.html" %}
{% load static from staticfiles %}
{% load i18n %}
{% block cabecalho %} {% block cabecalho %}
<h1>Categorias</h1> <h1>Categorias</h1>
@ -7,7 +9,7 @@
{% block media %} {% block media %}
{{ block.super }} {{ block.super }}
<link href="{{ MEDIA_URL }}css/diagnosticos/diagnosticos_categorias.css" rel="stylesheet" /> <link href="{% static 'css/diagnosticos/diagnosticos_categorias.css' %}" rel="stylesheet" />
{% endblock media %} {% endblock media %}
{% block corpo %} {% block corpo %}
@ -19,7 +21,7 @@
<li> <li>
{% endif %} {% endif %}
<a href="{% url 'detalhes_categoria_casa_legislativa' diagnostico.id %}"> <a href="{% url 'detalhes_categoria_casa_legislativa' diagnostico.id %}">
<h4 class="ui-li-heading-read">01. Identificação da Casa Legislativa</h4> <h4 class="ui-li-heading-read">01. {% trans 'Identificação da Casa Legislativa' %}</h4>
</a> </a>
</li> </li>
{% if ultima_categoria == 2 %} {% if ultima_categoria == 2 %}
@ -29,9 +31,9 @@
{% endif %} {% endif %}
<a href="{% url 'detalhes_categoria_contatos' diagnostico.id %}"> <a href="{% url 'detalhes_categoria_contatos' diagnostico.id %}">
{% if diagnostico.contatos_respondidos %} {% if diagnostico.contatos_respondidos %}
<h4 class="ui-li-heading-read">02. Identificação de Competências</h4> <h4 class="ui-li-heading-read">02. {% trans 'Identificação de Competências' %}</h4>
{% else %} {% else %}
<h4>02. Identificação de Competências</h4> <h4>02. {% trans 'Identificação de Competências' %}</h4>
{% endif %} {% endif %}
</a> </a>
</li> </li>
@ -52,12 +54,12 @@
{% endfor %} {% endfor %}
</ul> </ul>
{% else %} {% else %}
<h2>Nenhuma categoria existente.</h2> <h2>{% trans 'Nenhuma categoria existente.' %}</h2>
{% endif %} {% endif %}
{% endblock corpo %} {% endblock corpo %}
<ul> <ul>
{% block rodape %} {% block rodape %}
{{ block.super }} {{ block.super }}
<li><a href="{% url 'logout' %}" data-icon="delete">Sair</a></li> <li><a href="{% url 'logout' %}" data-icon="delete">{% trans 'Sair' %}</a></li>
{% endblock rodape %} {% endblock rodape %}
</ul> </ul>

9
sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_list.html

@ -1,7 +1,8 @@
{% extends "base_mobile.html" %} {% extends "base_mobile.html" %}
{% load i18n %}
{% block cabecalho %} {% block cabecalho %}
<h1>Diagnósticos</h1> <h1>{% trans 'Diagnósticos' %}</h1>
<a href="{% url 'logout' %}" data-icon="delete" class="ui-btn-left">Sair</a> <a href="{% url 'logout' %}" data-icon="delete" class="ui-btn-left">Sair</a>
{% endblock cabecalho %} {% endblock cabecalho %}
@ -12,14 +13,14 @@
<li> <li>
<a href="{% url 'lista_categorias' diagnostico.id %}"> <a href="{% url 'lista_categorias' diagnostico.id %}">
<h4>{{ diagnostico.casa_legislativa.nome }}</h4> <h4>{{ diagnostico.casa_legislativa.nome }}</h4>
<p><strong>Data:</strong> {{ diagnostico.data_visita_inicio|date:"d/m/Y" }} à {{ diagnostico.data_visita_fim|date:"d/m/Y" }} </p> <p><strong>{% trans 'Data' %}:</strong> {% blocktrans %}{{ diagnostico.data_visita_inicio|date:"d/m/Y" }} à {{ diagnostico.data_visita_fim|date:"d/m/Y" }}{% endblocktrans %} </p>
<p><strong>Responsável:</strong> {{ diagnostico.responsavel.nome_completo }}</p> <p><strong>{% trans 'Responsável' %}:</strong> {{ diagnostico.responsavel.nome_completo }}</p>
</a> </a>
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
{% else %} {% else %}
<h2>Nenhum diagnóstico aberto.</h2> <h2>{% trans 'Nenhum diagnóstico aberto.' %}</h2>
{% endif %} {% endif %}
{% endblock corpo %} {% endblock corpo %}

11
sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_login.html

@ -1,10 +1,11 @@
{% load static from staticfiles %} {% load static from staticfiles %}
{% load i18n %}
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html lang="pt-BR"> <html lang="pt-BR">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>SIGI - Login de Acesso</title> <title>{% trans 'SIGI - Login de Acesso' %}</title>
<link rel="stylesheet" href="{% static 'jquery.mobile-1.0.1/jquery.mobile-1.0.1.min.css' %}" /> <link rel="stylesheet" href="{% static 'jquery.mobile-1.0.1/jquery.mobile-1.0.1.min.css' %}" />
<script src="{% static '/js/jquery/jquery-1.6.4.min.js' %}" ></script> <script src="{% static '/js/jquery/jquery-1.6.4.min.js' %}" ></script>
<script language=javascript> <script language=javascript>
@ -29,7 +30,7 @@
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</ul> </ul>
<p>Verifique se seu login e senha foram preenchidos corretamente.</p> <p>{% trans 'Verifique se seu login e senha foram preenchidos corretamente.' %}</p>
</div> <!-- error messages --> </div> <!-- error messages -->
{% endif %} {% endif %}
@ -37,15 +38,15 @@
<form action="{% url 'django.contrib.auth.views.login' %}" method="POST"> <form action="{% url 'django.contrib.auth.views.login' %}" method="POST">
{% csrf_token %} {% csrf_token %}
<div data-role="fieldcontain" class="ui-hide-label ui-body"> <div data-role="fieldcontain" class="ui-hide-label ui-body">
<label for="username">Usuário:</label> <label for="username">{% trans 'Usuário' %}:</label>
<input type="text" name="username" id="id_username" placeholder="Usuário"> <input type="text" name="username" id="id_username" placeholder="Usuário">
</div> </div>
<div data-role="fieldcontain" class="ui-hide-label"> <div data-role="fieldcontain" class="ui-hide-label">
<label for="password">Senha de Acesso:</label> <label for="password">{% trans 'Senha de Acesso' %}:</label>
<input type="password" name="password" id="id_password" placeholder="Senha de Acesso"> <input type="password" name="password" id="id_password" placeholder="Senha de Acesso">
</div> </div>
<input type="hidden" name="next" value="{% url 'lista_diagnosticos' %}" /> <input type="hidden" name="next" value="{% url 'lista_diagnosticos' %}" />
<button type="submit">Entrar</button> <button type="submit">{% trans 'Entrar' %}</button>
</form> </form>
</div> </div>
</body> </body>

23
sigi/apps/diagnosticos/views.py

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from itertools import cycle from itertools import cycle
from django.http import HttpResponse from django.http import HttpResponse
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from django.shortcuts import render_to_response, get_object_or_404 from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext from django.template import RequestContext
from django.utils.translation import ugettext as _
from django.views.decorators.cache import never_cache from django.views.decorators.cache import never_cache
from sigi.apps.diagnosticos.urls import LOGIN_REDIRECT_URL
from sigi.apps.utils.decorators import login_required
from sigi.apps.diagnosticos.decorators import validate_diagnostico
from sigi.apps.diagnosticos.models import Diagnostico, Categoria, Pergunta
from sigi.apps.casas.models import Funcionario from sigi.apps.casas.models import Funcionario
from sigi.apps.contatos.models import Telefone
from sigi.apps.diagnosticos.decorators import validate_diagnostico
from sigi.apps.diagnosticos.forms import (DiagnosticoMobileForm, from sigi.apps.diagnosticos.forms import (DiagnosticoMobileForm,
CasaLegislativaMobileForm, FuncionariosMobileForm) CasaLegislativaMobileForm, FuncionariosMobileForm)
from sigi.apps.contatos.models import Telefone from sigi.apps.diagnosticos.models import Diagnostico, Categoria, Pergunta
from sigi.apps.diagnosticos.urls import LOGIN_REDIRECT_URL
from sigi.apps.utils.decorators import login_required
from sigi.shortcuts import render_to_pdf from sigi.shortcuts import render_to_pdf
@ -186,7 +186,9 @@ def categoria_contatos(request, id_diagnostico):
for form_telefones in form.telefones.forms: for form_telefones in form.telefones.forms:
tel = form_telefones.instance tel = form_telefones.instance
if tel._state.adding and tel.numero != '': if tel._state.adding and tel.numero != '':
s += '<p>Novo telefone %s: %s</p>' % (form_telefones.instance.get_tipo_display(), form_telefones.instance.numero) s += _(u'<p>Novo telefone %(type)s: %(number)s</p>') % dict(
type=form_telefones.instance.get_tipo_display(),
number=form_telefones.instance.numero)
resposta['clean'] += ('id_' + form_telefones.prefix + '-numero',) resposta['clean'] += ('id_' + form_telefones.prefix + '-numero',)
if s != '': if s != '':
resposta['fones'][form.prefix] = s resposta['fones'][form.prefix] = s
@ -205,8 +207,9 @@ def categoria_contatos(request, id_diagnostico):
Telefone.objects.get(pk=form_telefones.fields['id'].initial).delete() Telefone.objects.get(pk=form_telefones.fields['id'].initial).delete()
if form.prefix not in resposta['fones']: if form.prefix not in resposta['fones']:
resposta['fones'][form.prefix] = '' resposta['fones'][form.prefix] = ''
resposta['fones'][form.prefix] += u'<p>O telefone %s %s foi excluído da base de dados</p>' % ( resposta['fones'][form.prefix] += _(u'<p>O telefone %(type)s %(number)s foi excluído da base de dados</p>') % dict(
form_telefones.instance.get_tipo_display(), form_telefones.instance.numero) type=form_telefones.instance.get_tipo_display(),
number=form_telefones.instance.numero)
else: else:
for key, value in form_telefones.errors.iteritems(): for key, value in form_telefones.errors.iteritems():
key = form_telefones.prefix + "-id-errors" key = form_telefones.prefix + "-id-errors"

16
sigi/apps/financeiro/models.py

@ -1,18 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from django.utils.translation import ugettext as _
from sigi.apps.convenios.models import Projeto from sigi.apps.convenios.models import Projeto
class Desembolso(models.Model): class Desembolso(models.Model):
projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto') projeto = models.ForeignKey(Projeto, verbose_name=_(u'Projeto'))
descricao = models.CharField(u'Descrição da despesa', max_length=100) descricao = models.CharField(_(u'Descrição da despesa'), max_length=100)
data = models.DateField(u'Data do desembolso') data = models.DateField(_(u'Data do desembolso'))
valor_reais = models.DecimalField(u'Valor em R$', max_digits=18, decimal_places=2) valor_reais = models.DecimalField(_(u'Valor em R$'), max_digits=18, decimal_places=2)
valor_dolar = models.DecimalField(u'Valor em US$', max_digits=18, decimal_places=2) valor_dolar = models.DecimalField(_(u'Valor em US$'), max_digits=18, decimal_places=2)
class Meta: class Meta:
verbose_name = 'Desembolso' verbose_name = _(u'Desembolso')
verbose_name_plural = 'Desembolsos' verbose_name_plural = _(u'Desembolsos')
def __unicode__(self): def __unicode__(self):
return u"%s (US$ %s)" % (self.descricao, self.valor_dolar) return u"%s (US$ %s)" % (self.descricao, self.valor_dolar)

0
sigi/apps/home/__init__.py

6
sigi/apps/home/templates/menus/menu.html

@ -0,0 +1,6 @@
{% load menus %}
<ul class="nav navbar-nav">
{% for menu_item in menu_items %}
{% show_menu_item menu_item base_url %}
{% endfor %}
</ul>

17
sigi/apps/home/templates/menus/menu_item.html

@ -0,0 +1,17 @@
{% load menus %}
{% if menu_item.children %}
<li class="dropdown">
{% if menu_item.url %}
<a href="{{base_url}}{{ menu_item.url }}" class="dropdown-toggle" data-toggle="dropdown">{{ menu_item.title }}</a>
{% else %}
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ menu_item.title }} <span class="caret"></span></a>
{% endif %}
<ul class="dropdown-menu" role="menu">
{% for child in menu_item.children %}
{% show_menu_item child base_url %}
{% endfor %}
</ul>
</li>
{% else %}
<li><a href="{{base_url}}{{ menu_item.url }}">{{ menu_item.title }}</a></li>
{% endif %}

0
sigi/apps/home/templatetags/__init__.py

97
sigi/apps/home/templatetags/menu_conf.yaml

@ -0,0 +1,97 @@
main_menu:
- title: Gráficos
url: ''
- title: Municípios
url: admin:contatos/municipio/
children:
- title: Municípios
url: contatos/municipio/
- title: Unidades Federativas
url: contatos/unidadefederativa/
- title: Casas Legislativas
url: casas/casalegislativa/
children:
- title: Todas
url: casas/casalegislativa/
- title: Câmaras Municipais
url: casas/casalegislativa/?tipo__id__exact=1
- title: Assembléias Legislativas
url: casas/casalegislativa/?tipo__id__exact=2
- title: Legislaturas
url: mesas/legislatura/
children:
- title: Todas
url: mesas/legislatura/
- title: Parlamentares
url: parlamentares/parlamentar/
- title: Tabela de cargos
url: mesas/cargo/
- title: Tabela de partidos
url: parlamentares/partido/
- title: Diagnósticos
url: diagnosticos/diagnostico/
children:
- title: Administração
url: diagnosticos/diagnostico/
- title: Coleta de dados
url: diagnosticos/mobile/
- title: Gráficos e estatísticas
url: diagnosticos-graficos
- title: Convênios
url: convenios/convenio/
children:
- title: Convênios
url: convenios/convenio/
- title: Planos diretores
url: metas/planodiretor/
- title: Inventário
url: inventario/bem/
children:
- title: Bens
url: inventario/bem/
- title: Fornecedores
url: inventario/fornecedor/
- title: Equipamentos
url: inventario/equipamento/
- title: Fabricantes
url: inventario/fabricante/
- title: Tipos de equipamentos
url: inventario/tipoequipamento/
- title: Modelos de equipamentos
url: inventario/modeloequipamento/
- title: Servidores
url: servidores/servidor/?user__is_active__exact=1
children:
- title: Pessoal
url: servidores/servidor/?user__is_active__exact=1
- title: Funções
url: servidores/funcao
- title: Férias
url: servidores/ferias/
- title: Licenças
url: servidores/licenca/
- title: Serviços SEIT
url: servicos/casaatendida/
children:
- title: Tipos de serviço
url: servicos/tiposervico/
- title: Casas atendidas
url: servicos/casaatendida/
- title: Lista de serviços
url: servicos/servico/
- title: Ocorrências
url: ocorrencias/ocorrencia/?grupo=S&status__in=1,2
children:
- title: Registro de ocorrências
url: ocorrencias/ocorrencia/?grupo=S&status__in=1,2
- title: Tabela de categorias
url: ocorrencias/categoria/
- title: Tipos de contato
url: ocorrencias/tipocontato/
- title: Financeiro
url: financeiro/desembolso/
children:
- title: Desembolsos
url: financeiro/desembolso/
- title: Dashboard
url: metas-dashboardsss

21
sigi/apps/home/templatetags/menus.py

@ -0,0 +1,21 @@
from os.path import dirname
import yaml
from django import template
register = template.Library()
menus = yaml.load(open(dirname(__file__) + '/menu_conf.yaml', 'r'))
@register.inclusion_tag('menus/menu.html', takes_context=True)
def show_menu(context, menu_id):
base_url = context['request'].build_absolute_uri('/')
menus = yaml.load(open(dirname(__file__) + '/menu_conf.yaml', 'r'))
return dict(menu_items=menus[menu_id], base_url=base_url)
@register.inclusion_tag('menus/menu_item.html')
def show_menu_item(menu_item, base_url):
return dict(menu_item=menu_item, base_url=base_url)

280
sigi/apps/inventario/fixtures/initial_data.json

@ -1,280 +0,0 @@
[
{
"pk": 3,
"model": "inventario.fornecedor",
"fields": {
"pagina_web": "http://www.dell.com.br/",
"email": "",
"nome": "Dell"
}
},
{
"pk": 1,
"model": "inventario.fornecedor",
"fields": {
"pagina_web": "",
"email": "",
"nome": "Desconhecido"
}
},
{
"pk": 2,
"model": "inventario.fornecedor",
"fields": {
"pagina_web": "http://www.submarino.com.br/",
"email": "",
"nome": "Submarino"
}
},
{
"pk": 2,
"model": "inventario.fabricante",
"fields": {
"nome": "Dell"
}
},
{
"pk": 1,
"model": "inventario.fabricante",
"fields": {
"nome": "Desconhecido"
}
},
{
"pk": 4,
"model": "inventario.fabricante",
"fields": {
"nome": "HP"
}
},
{
"pk": 3,
"model": "inventario.fabricante",
"fields": {
"nome": "Microsoft"
}
},
{
"pk": 2,
"model": "inventario.tipoequipamento",
"fields": {
"tipo": "Computador Desktop"
}
},
{
"pk": 1,
"model": "inventario.tipoequipamento",
"fields": {
"tipo": "Desconhecido"
}
},
{
"pk": 8,
"model": "inventario.tipoequipamento",
"fields": {
"tipo": "Estabilizador"
}
},
{
"pk": 3,
"model": "inventario.tipoequipamento",
"fields": {
"tipo": "Impressora"
}
},
{
"pk": 5,
"model": "inventario.tipoequipamento",
"fields": {
"tipo": "Modem"
}
},
{
"pk": 4,
"model": "inventario.tipoequipamento",
"fields": {
"tipo": "Monitor"
}
},
{
"pk": 9,
"model": "inventario.tipoequipamento",
"fields": {
"tipo": "Notebook/Laptop"
}
},
{
"pk": 6,
"model": "inventario.tipoequipamento",
"fields": {
"tipo": "Roteador"
}
},
{
"pk": 7,
"model": "inventario.tipoequipamento",
"fields": {
"tipo": "Webcam"
}
},
{
"pk": 1,
"model": "inventario.modeloequipamento",
"fields": {
"modelo": "Desconhecido",
"tipo": 1
}
},
{
"pk": 2,
"model": "inventario.modeloequipamento",
"fields": {
"modelo": "Desconhecido",
"tipo": 3
}
},
{
"pk": 3,
"model": "inventario.modeloequipamento",
"fields": {
"modelo": "Desconhecido",
"tipo": 2
}
},
{
"pk": 4,
"model": "inventario.modeloequipamento",
"fields": {
"modelo": "Desconhecido",
"tipo": 8
}
},
{
"pk": 5,
"model": "inventario.modeloequipamento",
"fields": {
"modelo": "Desconhecido",
"tipo": 5
}
},
{
"pk": 6,
"model": "inventario.modeloequipamento",
"fields": {
"modelo": "Desconhecido",
"tipo": 4
}
},
{
"pk": 7,
"model": "inventario.modeloequipamento",
"fields": {
"modelo": "Desconhecido",
"tipo": 9
}
},
{
"pk": 8,
"model": "inventario.modeloequipamento",
"fields": {
"modelo": "Desconhecido",
"tipo": 6
}
},
{
"pk": 9,
"model": "inventario.modeloequipamento",
"fields": {
"modelo": "Desconhecido",
"tipo": 7
}
},
{
"pk": 10,
"model": "inventario.modeloequipamento",
"fields": {
"modelo": "PSC 500",
"tipo": 3
}
},
{
"pk": 11,
"model": "inventario.modeloequipamento",
"fields": {
"modelo": "Vostro 1310",
"tipo": 9
}
},
{
"pk": 1,
"model": "inventario.equipamento",
"fields": {
"modelo": 1,
"fabricante": 1
}
},
{
"pk": 2,
"model": "inventario.equipamento",
"fields": {
"modelo": 2,
"fabricante": 1
}
},
{
"pk": 3,
"model": "inventario.equipamento",
"fields": {
"modelo": 3,
"fabricante": 1
}
},
{
"pk": 4,
"model": "inventario.equipamento",
"fields": {
"modelo": 4,
"fabricante": 1
}
},
{
"pk": 5,
"model": "inventario.equipamento",
"fields": {
"modelo": 5,
"fabricante": 1
}
},
{
"pk": 6,
"model": "inventario.equipamento",
"fields": {
"modelo": 6,
"fabricante": 1
}
},
{
"pk": 7,
"model": "inventario.equipamento",
"fields": {
"modelo": 7,
"fabricante": 1
}
},
{
"pk": 8,
"model": "inventario.equipamento",
"fields": {
"modelo": 8,
"fabricante": 1
}
},
{
"pk": 9,
"model": "inventario.equipamento",
"fields": {
"modelo": 9,
"fabricante": 1
}
}
]

29
sigi/apps/inventario/models.py

@ -1,19 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from django.db import models
from django.utils.translation import ugettext as _
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
email = models.EmailField('e-mail', blank=True) email = models.EmailField(_(u'e-mail'), blank=True)
pagina_web = models.URLField('página web', blank=True) pagina_web = models.URLField(_(u'página web'), blank=True)
telefones = generic.GenericRelation('contatos.Telefone') telefones = generic.GenericRelation('contatos.Telefone')
contatos = generic.GenericRelation('contatos.Contato') contatos = generic.GenericRelation('contatos.Contato')
class Meta: class Meta:
ordering = ('nome',) ordering = ('nome',)
verbose_name_plural = 'fornecedores' verbose_name_plural = _(u'fornecedores')
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
@ -35,8 +36,8 @@ class TipoEquipamento(models.Model):
class Meta: class Meta:
ordering = ('tipo',) ordering = ('tipo',)
verbose_name = 'tipo de equipamento' verbose_name = _(u'tipo de equipamento')
verbose_name_plural = 'tipos de equipamentos' verbose_name_plural = _(u'tipos de equipamentos')
def __unicode__(self): def __unicode__(self):
return self.tipo return self.tipo
@ -45,14 +46,14 @@ class TipoEquipamento(models.Model):
class ModeloEquipamento(models.Model): class ModeloEquipamento(models.Model):
tipo = models.ForeignKey( tipo = models.ForeignKey(
TipoEquipamento, TipoEquipamento,
verbose_name='tipo de equipamento' verbose_name=_(u'tipo de equipamento')
) )
modelo = models.CharField(max_length=30) modelo = models.CharField(max_length=30)
class Meta: class Meta:
ordering = ('modelo',) ordering = ('modelo',)
verbose_name = 'modelo de equipamento' verbose_name = _(u'modelo de equipamento')
verbose_name_plural = 'modelos de equipamentos' verbose_name_plural = _(u'modelos de equipamentos')
def __unicode__(self): def __unicode__(self):
return self.modelo return self.modelo
@ -75,20 +76,20 @@ class Bem(models.Model):
equipamento = models.ForeignKey(Equipamento) equipamento = models.ForeignKey(Equipamento)
fornecedor = models.ForeignKey(Fornecedor) fornecedor = models.ForeignKey(Fornecedor)
num_serie = models.CharField( num_serie = models.CharField(
'número de série', _(u'número de série'),
max_length=64, max_length=64,
help_text='Número fornecido pelo fabricante.', help_text=_(u'Número fornecido pelo fabricante.'),
unique=True unique=True
) )
recebido_por = models.CharField( recebido_por = models.CharField(
max_length=64, max_length=64,
blank=True, blank=True,
help_text='Nome de quem recebeu o equipamento.' help_text=_(u'Nome de quem recebeu o equipamento.')
) )
observacoes = models.TextField('observações', blank=True) observacoes = models.TextField(_(u'observações'), blank=True)
class Meta: class Meta:
verbose_name_plural = 'bens' verbose_name_plural = _(u'bens')
def __unicode__(self): def __unicode__(self):
return unicode('%s (%s)') % (self.equipamento, self.casa_legislativa) return unicode('%s (%s)') % (self.equipamento, self.casa_legislativa)

3
sigi/apps/mdl/tests.py

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

3
sigi/apps/mesas/admin.py

@ -2,6 +2,7 @@
from django.contrib import admin from django.contrib import admin
from django.http import HttpResponse from django.http import HttpResponse
from django.utils.html import escape from django.utils.html import escape
from django.utils.translation import ugettext as _
from sigi.apps.mesas.models import (Legislatura, Coligacao, ComposicaoColigacao, from sigi.apps.mesas.models import (Legislatura, Coligacao, ComposicaoColigacao,
SessaoLegislativa, MesaDiretora, Cargo, SessaoLegislativa, MesaDiretora, Cargo,
@ -26,7 +27,7 @@ class LegislaturaAdmin(BaseModelAdmin):
def uf(self, obj): def uf(self, obj):
return obj.casa_legislativa.municipio.uf.sigla return obj.casa_legislativa.municipio.uf.sigla
uf.short_description = 'UF' uf.short_description = _(u'UF')
uf.admin_order_field = 'casa_legislativa__municipio__uf' uf.admin_order_field = 'casa_legislativa__municipio__uf'
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):

44
sigi/apps/mesas/fixtures/initial_data.json

@ -1,44 +0,0 @@
[
{
"pk": 4,
"model": "mesas.cargo",
"fields": {
"descricao": "1\u00ba Secret\u00e1rio"
}
},
{
"pk": 2,
"model": "mesas.cargo",
"fields": {
"descricao": "1\u00ba Vice-Presidente"
}
},
{
"pk": 5,
"model": "mesas.cargo",
"fields": {
"descricao": "2\u00ba Secret\u00e1rio"
}
},
{
"pk": 3,
"model": "mesas.cargo",
"fields": {
"descricao": "2\u00ba Vice-Presidente"
}
},
{
"pk": 6,
"model": "mesas.cargo",
"fields": {
"descricao": "Corregedor"
}
},
{
"pk": 1,
"model": "mesas.cargo",
"fields": {
"descricao": "Presidente"
}
}
]

64
sigi/apps/mesas/models.py

@ -1,15 +1,17 @@
# coding: utf-8 # coding: utf-8
from django.db import models from django.db import models
from django.utils.translation import ugettext as _
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'))
data_inicio = models.DateField(u'início') data_inicio = models.DateField(_(u'início'))
data_fim = models.DateField(u'fim') data_fim = models.DateField(_(u'fim'))
data_eleicao = models.DateField(u'data da eleição') data_eleicao = models.DateField(_(u'data da eleição'))
total_parlamentares = models.PositiveIntegerField(u"Total de parlamentares") total_parlamentares = models.PositiveIntegerField(_(u"Total de parlamentares"))
casa_legislativa.convenio_uf_filter = True casa_legislativa.convenio_uf_filter = True
casa_legislativa.convenio_cl_tipo_filter = True casa_legislativa.convenio_cl_tipo_filter = True
@ -19,34 +21,38 @@ class Legislatura(models.Model):
ordering = ['casa_legislativa__municipio__uf__sigla', '-data_inicio'] ordering = ['casa_legislativa__municipio__uf__sigla', '-data_inicio']
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"%(number)sª legislatura da %(parliament)s (%(initial_year)s-%(final_year)s)") % dict(
number=self.numero,
parliament=self.casa_legislativa.__unicode__(),
initial_year=self.data_inicio.year,
final_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)
numero_votos = models.PositiveIntegerField( numero_votos = models.PositiveIntegerField(
u'número de votos', _(u'número de votos'),
blank=True, blank=True,
null=True, null=True,
) )
class Meta: class Meta:
ordering = ('legislatura', 'nome') ordering = ('legislatura', 'nome')
verbose_name = 'coligação' verbose_name = _(u'coligação')
verbose_name_plural = 'coligações' verbose_name_plural = _(u'coligações')
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=_(u'coligação'))
partido = models.ForeignKey('parlamentares.Partido') partido = models.ForeignKey('parlamentares.Partido')
class Meta: class Meta:
verbose_name = 'composição da coligação' verbose_name = _(u'composição da coligação')
verbose_name_plural = 'composições das coligações' verbose_name_plural = _(u'composições das coligações')
def __unicode__(self): def __unicode__(self):
return str(self.id) return str(self.id)
@ -54,13 +60,13 @@ class ComposicaoColigacao(models.Model):
class SessaoLegislativa(models.Model): class SessaoLegislativa(models.Model):
SESSAO_CHOICES = ( SESSAO_CHOICES = (
('O', 'Ordinária'), ('O', _(u'Ordinária')),
('E', 'Extraordinária'), ('E', _(u'Extraordinária')),
) )
numero = models.PositiveSmallIntegerField(u'número da sessão', unique=True) numero = models.PositiveSmallIntegerField(_(u'número da sessão'), unique=True)
mesa_diretora = models.ForeignKey( mesa_diretora = models.ForeignKey(
'MesaDiretora', 'MesaDiretora',
verbose_name='Mesa Diretora' verbose_name=_(u'Mesa Diretora')
) )
legislatura = models.ForeignKey(Legislatura) legislatura = models.ForeignKey(Legislatura)
tipo = models.CharField( tipo = models.CharField(
@ -68,23 +74,23 @@ class SessaoLegislativa(models.Model):
choices=SESSAO_CHOICES, choices=SESSAO_CHOICES,
default='O' default='O'
) )
data_inicio = models.DateField(u'início') data_inicio = models.DateField(_(u'início'))
data_fim = models.DateField('fim') data_fim = models.DateField(_(u'fim'))
data_inicio_intervalo = models.DateField( data_inicio_intervalo = models.DateField(
u'início de intervalo', _(u'início de intervalo'),
blank=True, blank=True,
null=True null=True
) )
data_fim_intervalo = models.DateField( data_fim_intervalo = models.DateField(
'fim de intervalo', _(u'fim de intervalo'),
blank=True, blank=True,
null=True null=True
) )
class Meta: class Meta:
ordering = ('legislatura', 'numero') ordering = ('legislatura', 'numero')
verbose_name = 'Sessão Legislativa' verbose_name = _(u'Sessão Legislativa')
verbose_name_plural = 'Sessões Legislativas' verbose_name_plural = _(u'Sessões Legislativas')
def __unicode__(self): def __unicode__(self):
return str(self.numero) return str(self.numero)
@ -93,19 +99,19 @@ class SessaoLegislativa(models.Model):
class MesaDiretora(models.Model): class MesaDiretora(models.Model):
casa_legislativa = models.ForeignKey( casa_legislativa = models.ForeignKey(
'casas.CasaLegislativa', 'casas.CasaLegislativa',
verbose_name='Casa Legislativa' verbose_name=_(u'Casa Legislativa')
) )
class Meta: class Meta:
verbose_name = 'Mesa Diretora' verbose_name = _(u'Mesa Diretora')
verbose_name_plural = 'Mesas Diretoras' verbose_name_plural = _(u'Mesas Diretoras')
def __unicode__(self): def __unicode__(self):
return 'Mesa Diretora da %s' % unicode(self.casa_legislativa) return _(u'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)
class Meta: class Meta:
ordering = ('descricao',) ordering = ('descricao',)
@ -122,8 +128,8 @@ class MembroMesaDiretora(models.Model):
class Meta: class Meta:
ordering = ('parlamentar',) ordering = ('parlamentar',)
unique_together = ('cargo', 'mesa_diretora') unique_together = ('cargo', 'mesa_diretora')
verbose_name = 'membro de Mesa Diretora' verbose_name = _(u'membro de Mesa Diretora')
verbose_name_plural = 'membros de Mesas Diretora' verbose_name_plural = _(u'membros de Mesas Diretora')
def __unicode__(self): def __unicode__(self):
return '%s (%s)' % (unicode(self.parlamentar), unicode(self.cargo)) return '%s (%s)' % (unicode(self.parlamentar), unicode(self.cargo))

4
sigi/apps/metas/admin.py

@ -1,9 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import admin from django.contrib import admin
from django.utils.translation import ugettext as _
from sigi.apps.metas.models import PlanoDiretor from sigi.apps.metas.models import PlanoDiretor
from sigi.apps.utils.base_admin import BaseModelAdmin from sigi.apps.utils.base_admin import BaseModelAdmin
class MetaAdmin(BaseModelAdmin): class MetaAdmin(BaseModelAdmin):
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',)
@ -18,7 +20,7 @@ class PlanoDiretorAdmin(BaseModelAdmin):
def get_uf(self, obj): def get_uf(self, obj):
return obj.casa_legislativa.municipio.uf.nome return obj.casa_legislativa.municipio.uf.nome
get_uf.short_description = u"UF" get_uf.short_description = _(u"UF")
get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome' get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome'
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):

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

@ -22,11 +22,13 @@
# 02110-1301, USA. # 02110-1301, USA.
# #
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.utils.translation import ugettext as _
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)

54
sigi/apps/metas/models.py

@ -1,32 +1,34 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from datetime import date, datetime from datetime import date
from django.db import models from django.db import models
from django.utils.translation import ugettext as _
from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.convenios.models import Projeto, Convenio from sigi.apps.convenios.models import Projeto, Convenio
from sigi.apps.diagnosticos.models import Diagnostico from sigi.apps.diagnosticos.models import Diagnostico
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')),
('COUNT_EQUI', u'Quantidade de casas equipadas'), ('COUNT_EQUI', _(u'Quantidade de casas equipadas')),
('COUNT_ADER', u'Quantidade de casas aderidas'), ('COUNT_ADER', _(u'Quantidade de casas aderidas')),
('COUNT_DIAG', u'Quantidade de casas diagnosticadas'), ('COUNT_DIAG', _(u'Quantidade de casas diagnosticadas')),
('COUNT_PDIR', u'Quantidade de planos diretores'), ('COUNT_PDIR', _(u'Quantidade de planos diretores')),
('COUNT_CONV', u'Quantidade de casas conveniadas'), ('COUNT_CONV', _(u'Quantidade de casas conveniadas')),
) )
projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto', help_text=u'Projeto ao qual a meta se refere') projeto = models.ForeignKey(Projeto, verbose_name=_(u'Projeto'), help_text=_(u'Projeto ao qual a meta se refere'))
titulo = models.CharField(u'Título', max_length=40, help_text=u'Título da meta que aparecerá no dashboard') titulo = models.CharField(_(u'Título'), max_length=40, help_text=_(u'Título da meta que aparecerá no dashboard'))
descricao = models.TextField(u'Descrição') descricao = models.TextField(_(u'Descrição'))
data_inicio = models.DateField(u'Data inicial', help_text=u'Início do período de cômputo da meta') data_inicio = models.DateField(_(u'Data inicial'), help_text=_(u'Início do período de cômputo da meta'))
data_fim = models.DateField(u'Data final', help_text=u'Prazo final para cumprimento da meta') data_fim = models.DateField(_(u'Data final'), help_text=_(u'Prazo final para cumprimento da meta'))
algoritmo = models.CharField(u'Algoritmo de cálculo', max_length=10, choices=ALGORITMO_CHOICES) algoritmo = models.CharField(_(u'Algoritmo de cálculo'), max_length=10, choices=ALGORITMO_CHOICES)
valor_meta = models.FloatField(u'Valor da meta', help_text=u'Valor que deve ser atingido até o prazo final da meta') valor_meta = models.FloatField(_(u'Valor da meta'), help_text=_(u'Valor que deve ser atingido até o prazo final da meta'))
class Meta: class Meta:
verbose_name = 'Meta BID' verbose_name = _(u'Meta BID')
verbose_name_plural = 'Metas BID' verbose_name_plural = _(u'Metas BID')
def __unicode__(self): def __unicode__(self):
return self.titulo return self.titulo
@ -109,19 +111,19 @@ class Meta(models.Model):
class PlanoDiretor(models.Model): class PlanoDiretor(models.Model):
STATUS_CHOICE = ( STATUS_CHOICE = (
('E', u'Entregue'), ('E', _(u'Entregue')),
('I', u'Implantado'), ('I', _(u'Implantado')),
) )
projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto') projeto = models.ForeignKey(Projeto, verbose_name=_(u'Projeto'))
casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=u'Casa Legislativa') casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=_(u'Casa Legislativa'))
casa_legislativa.casa_uf_filter = True casa_legislativa.casa_uf_filter = True
status = models.CharField(u'Status', max_length=1, choices=STATUS_CHOICE, default='E') status = models.CharField(_(u'Status'), max_length=1, choices=STATUS_CHOICE, default='E')
data_entrega = models.DateField(u'Data de entrega', blank=True, null=True) data_entrega = models.DateField(_(u'Data de entrega'), blank=True, null=True)
data_implantacao = models.DateField(u'Data de implantação', blank=True, null=True) data_implantacao = models.DateField(_(u'Data de implantação'), blank=True, null=True)
class Meta: class Meta:
verbose_name = 'Plano Diretor' verbose_name = _(u'Plano Diretor')
verbose_name_plural = 'Planos Diretores' verbose_name_plural = _(u'Planos Diretores')
def __unicode__(self): def __unicode__(self):
return self.casa_legislativa.nome return self.casa_legislativa.nome

6
sigi/apps/metas/templates/admin/metas/planodiretor/change_list.html

@ -8,12 +8,12 @@
<div><!-- DIV needed for valid HTML --> <div><!-- DIV needed for valid HTML -->
<label for="searchbar"><img src="{% static 'admin/img/icon_searchbox.png' %}" alt="Search" /></label> <label for="searchbar"><img src="{% static 'admin/img/icon_searchbox.png' %}" alt="Search" /></label>
<input type="text" size="40" name="q" value="" id="searchbar" /> <input type="text" size="40" name="q" value="" id="searchbar" />
<label for="data_entrega__gte">Entregues a partir de:</label> <label for="data_entrega__gte">{% trans 'Entregues a partir de' %}:</label>
<input type="text" size="10" name="data_entrega__gte" value="" id="data_entrega__gte" class="vDateField"/> <input type="text" size="10" name="data_entrega__gte" value="" id="data_entrega__gte" class="vDateField"/>
<label for="data_entrega__lte">até:</label> <label for="data_entrega__lte">{% trans 'até' %}:</label>
<input type="text" size="10" name="data_entrega__lte" value="" id="data_entrega__lte" /> <input type="text" size="10" name="data_entrega__lte" value="" id="data_entrega__lte" />
<input type="submit" value="Pesquisar" /> <input type="submit" value="Pesquisar" />
Datas podem ser: Um ano (aaaa), um mês (aaaa-mm) ou um dia (aaaa-mm-dd) {% trans 'Datas podem ser: Um ano (aaaa), um mês (aaaa-mm) ou um dia (aaaa-mm-dd)' %}
</div> </div>
</form> </form>
</div> </div>

5
sigi/apps/metas/templates/metas/dashboard.html

@ -1,6 +1,7 @@
{% extends "admin/index.html" %} {% extends "admin/index.html" %}
{% load i18n %}
{% block title %}SIGI{% endblock %} {% block title %}{% trans 'SIGI' %}{% endblock %}
{% block extrahead %} {% block extrahead %}
{{ block.super }} {{ block.super }}
@ -9,7 +10,7 @@
{% endblock %} {% endblock %}
{% block content_title %} {% block content_title %}
<h1>Triggers e indicadores de progresso</h1> <h1>{% trans 'Triggers e indicadores de progresso' %}</h1>
{% comment %} {% comment %}
<div id="changelist"> <div id="changelist">
<div id="toolbar"> <div id="toolbar">

13
sigi/apps/metas/templates/metas/map_list.html

@ -1,5 +1,6 @@
{% extends "base_report.html" %} {% extends "base_report.html" %}
{% load mapa_tags %} {% load mapa_tags %}
{% load i18n %}
{% block extra_head %} {% block extra_head %}
<style> <style>
@ -17,18 +18,18 @@
padding: 0 5px !important; padding: 0 5px !important;
} }
</style> </style>
<title>Lista de Casas atendidas</title> <title>{% trans 'Lista de Casas atendidas' %}</title>
{% endblock %} {% endblock %}
{% block report %} {% block report %}
<h1>Lista de Casas atendidas</h1> <h1>{% trans 'Lista de Casas atendidas' %}</h1>
<hr/><br/> <hr/><br/>
<table class="data" repeat="1"> <table class="data" repeat="1">
<tr> <tr>
<th>Casa Legislativa</th> <th>{% trans 'Casa Legislativa' %}</th>
<th>Estado</th> <th>{% trans 'Estado' %}</th>
<th>Região</th> <th>{% trans 'Região' %}</th>
<th>Serviços</th> <th>{% trans 'Serviços' %}</th>
</tr> </tr>
{% for casa in casas %} {% for casa in casas %}
<tr> <tr>

19
sigi/apps/metas/templates/metas/map_sum.html

@ -1,4 +1,5 @@
{% extends "base_report.html" %} {% extends "base_report.html" %}
{% load i18n %}
{% block extra_head %} {% block extra_head %}
<style> <style>
@ -16,19 +17,19 @@
padding: 0 5px !important; padding: 0 5px !important;
} }
</style> </style>
<title>Sumário da atuação do Interlegis</title> <title>{% trans 'Sumário da atuação do Interlegis' %}</title>
{% endblock %} {% endblock %}
{% block report %} {% block report %}
<h1>Sumário da atuação do Interlegis</h1> <h1>{% trans 'Sumário da atuação do Interlegis' %}</h1>
<hr/><br/> <hr/><br/>
<table class="data" repeat="2"> <table class="data" repeat="2">
<tr> <tr>
<th rowspan="2">Região / Estado</th> <th rowspan="2">{% trans 'Região / Estado' %}</th>
<th colspan="{{ servicos.count }}">Serviços SEIT</th> <th colspan="{{ servicos.count }}">{% trans 'Serviços SEIT' %}</th>
<th colspan="{{ projetos.count }}">Conveniadas</th> <th colspan="{{ projetos.count }}">{% trans 'Conveniadas' %}</th>
<th colspan="{{ projetos.count }}">Equipadas</th> <th colspan="{{ projetos.count }}">{% trans 'Equipadas' %}</th>
<th colspan="2">Diagnósticos</th> <th colspan="2">{% trans 'Diagnósticos' %}</th>
</tr> </tr>
<tr> <tr>
{% for servico in servicos %} {% for servico in servicos %}
@ -40,8 +41,8 @@
{% for projeto in projetos %} {% for projeto in projetos %}
<th>{{ projeto.sigla }}</th> <th>{{ projeto.sigla }}</th>
{% endfor %} {% endfor %}
<th>Em andamento</th> <th>{% trans 'Em andamento' %}</th>
<th>Publicados</th> <th>{% trans 'Publicados' %}</th>
</tr> </tr>
{% for r_sigla, regiao in result.iteritems %} {% for r_sigla, regiao in result.iteritems %}
<tr> <tr>

30
sigi/apps/metas/templates/metas/mapa.html

@ -2,7 +2,7 @@
{% load static from staticfiles %} {% load static from staticfiles %}
{% load i18n %} {% load i18n %}
{% block title %}SIGI{% endblock %} {% block title %}{% trans 'SIGI' %}{% endblock %}
{% block extrahead %} {% block extrahead %}
{{ block.super }} {{ block.super }}
@ -23,7 +23,7 @@
{% endblock %} {% endblock %}
{% block content_title %} {% block content_title %}
<h1>Mapa de atuação do Interlegis</h1> <h1>{% trans 'Mapa de atuação do Interlegis' %}</h1>
{% endblock %} {% endblock %}
{% block object-tools %} {% block object-tools %}
@ -45,19 +45,19 @@
{% block object-tools-items %} {% block object-tools-items %}
<li><a href="/dashboard/mapsum/" id="summary_report" onclick="return false;"> <li><a href="/dashboard/mapsum/" id="summary_report" onclick="return false;">
<span class="glyphicon glyphicon-list-alt"></span> <span class="glyphicon glyphicon-list-alt"></span>
Relatório resumo {% trans 'Relatório resumo' %}
</a></li> </a></li>
<li><a href="/dashboard/maplist/" id="list_report" onclick="return false;"> <li><a href="/dashboard/maplist/" id="list_report" onclick="return false;">
<span class="glyphicon glyphicon-list"></span> <span class="glyphicon glyphicon-list"></span>
Listagem das Casas {% trans 'Listagem das Casas' %}
</a></li> </a></li>
<li><a href="/dashboard/maplist/?fmt=csv" id="list_csv" onclick="return false;"> <li><a href="/dashboard/maplist/?fmt=csv" id="list_csv" onclick="return false;">
<span class="glyphicon glyphicon-export"></span> <span class="glyphicon glyphicon-export"></span>
Exportar Casas {% trans 'Exportar Casas' %}
</a></li> </a></li>
<li><a href="#" id="closeiwlink"> <li><a href="#" id="closeiwlink">
<span class="glyphicon glyphicon-remove"></span> <span class="glyphicon glyphicon-remove"></span>
Fechar todas as janelas de informação {% trans 'Fechar todas as janelas de informação' %}
</a></li> </a></li>
{% endblock %} {% endblock %}
@ -73,10 +73,10 @@
<div class="col-md-2"> <div class="col-md-2">
<div class="panel panel-primary flex-col"> <div class="panel panel-primary flex-col">
<div class="panel-heading">Filtros</div> <div class="panel-heading">{% trans 'Filtros' %}</div>
<form id="filter_form" method="get" action=""> <form id="filter_form" method="get" action="">
<h4>Por Serviços SEIT</h4> <h4>{% trans 'Por Serviços SEIT' %}</h4>
<ul> <ul>
{% for s in servico_choices %} {% for s in servico_choices %}
<li><input type="checkbox" name="seit" value="{{ s.sigla }}" <li><input type="checkbox" name="seit" value="{{ s.sigla }}"
@ -86,35 +86,35 @@
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
<h4>Por Casas conveniadas</h4> <h4>{% trans 'Por Casas conveniadas' %}</h4>
<ul> <ul>
{% for p in projeto_choices %} {% for p in projeto_choices %}
<li><input type="checkbox" name="convenios" value="{{ p.sigla }}" {% if p.sigla in convenios %}checked="checked" {% endif %}/> <li><input type="checkbox" name="convenios" value="{{ p.sigla }}" {% if p.sigla in convenios %}checked="checked" {% endif %}/>
ao {{ p.sigla }} <span id="convenio_{{ p.sigla }}" class="totalizador">&nbsp;</span> </li> ao {{ p.sigla }} <span id="convenio_{{ p.sigla }}" class="totalizador">&nbsp;</span> </li>
{% endfor %} {% endfor %}
</ul> </ul>
<h4>Por Casas equipadas</h4> <h4>{% trans 'Por Casas equipadas' %}</h4>
<ul> <ul>
{% for p in projeto_choices %} {% for p in projeto_choices %}
<li><input type="checkbox" name="equipadas" value="{{ p.sigla }}" {% if p.sigla in equipadas %}checked="checked"{% endif %} /> <li><input type="checkbox" name="equipadas" value="{{ p.sigla }}" {% if p.sigla in equipadas %}checked="checked"{% endif %} />
pelo {{ p.sigla }}<span id="equip_{{ p.sigla }}" class="totalizador">&nbsp;</span> </li></li> pelo {{ p.sigla }}<span id="equip_{{ p.sigla }}" class="totalizador">&nbsp;</span> </li></li>
{% endfor %} {% endfor %}
</ul> </ul>
<h4>Por Diagnósticos</h4> <h4>{% trans 'Por Diagnósticos' %}</h4>
<ul> <ul>
<li><input type="checkbox" name="diagnosticos" value="A" {% if "A" in diagnosticos %}checked="checked" {% endif %}/> <li><input type="checkbox" name="diagnosticos" value="A" {% if "A" in diagnosticos %}checked="checked" {% endif %}/>
Em andamento<span id="diagnostico_A" class="totalizador">&nbsp;(1)</span></li> {% trans 'Em andamento' %}<span id="diagnostico_A" class="totalizador">&nbsp;(1)</span></li>
<li><input type="checkbox" name="diagnosticos" value="P" {% if "P" in diagnosticos %}checked="checked" {% endif %}/> <li><input type="checkbox" name="diagnosticos" value="P" {% if "P" in diagnosticos %}checked="checked" {% endif %}/>
Publicados<span id="diagnostico_P" class="totalizador">&nbsp;(1)</span></li> {% trans 'Publicados' %}<span id="diagnostico_P" class="totalizador">&nbsp;(1)</span></li>
</ul> </ul>
<h4>Por região</h4> <h4>{% trans 'Por região' %}</h4>
<ul> <ul>
{% for r in regiao_choices %} {% for r in regiao_choices %}
<li><input type="checkbox" name="regioes" value="{{ r.0 }}" {% if r.0 in regioes %}checked="checked"{% endif %}/> {{ r.1 }} <li><input type="checkbox" name="regioes" value="{{ r.0 }}" {% if r.0 in regioes %}checked="checked"{% endif %}/> {{ r.1 }}
<span id="{{ r.0 }}" class="totalizador">&nbsp;(1)</span></li> <span id="{{ r.0 }}" class="totalizador">&nbsp;(1)</span></li>
{% endfor %} {% endfor %}
</ul> </ul>
<h4>Por Estado</h4> <h4>{% trans 'Por Estado' %}</h4>
<ul> <ul>
{% for e in estado_choices %} {% for e in estado_choices %}
<li><input type="checkbox" name="estados" value="{{ e.sigla }}" <li><input type="checkbox" name="estados" value="{{ e.sigla }}"

17
sigi/apps/metas/templates/metas/snippets.html

@ -1,9 +1,10 @@
{% load charts %} {% load charts %}
{% load i18n %}
{# ------------- Todas as metas ------------- #} {# ------------- Todas as metas ------------- #}
<div style="height: 300px;" class="module"> <div style="height: 300px;" class="module">
<h2>Todas as metas</h2> <h2>{% trans 'Todas as metas' %}</h2>
<h3>Estado das metas do contrato BID</h3> <h3>{% trans 'Estado das metas do contrato BID' %}</h3>
<table style="margin: auto;"> <table style="margin: auto;">
{% for meta in metas %} {% for meta in metas %}
<tr> <tr>
@ -17,17 +18,17 @@
{% endfor %} {% endfor %}
</table> </table>
<div class="legend"> <div class="legend">
<span><div style="background-color: #E74A69;">&nbsp;</div>Ruim</span> <span><div style="background-color: #E74A69;">&nbsp;</div>{% trans 'Ruim' %}</span>
<span><div style="background-color: #FFDB6E;">&nbsp;</div>Preocupante</span> <span><div style="background-color: #FFDB6E;">&nbsp;</div>{% trans 'Preocupante' %}</span>
<span><div style="background-color: #89D7AF;">&nbsp;</div>Bom</span> <span><div style="background-color: #89D7AF;">&nbsp;</div>{% trans 'Bom' %}</span>
<span><div style="background-color: #A2BBED;">&nbsp;</div>Atingido</span> <span><div style="background-color: #A2BBED;">&nbsp;</div>{% trans 'Atingido' %}</span>
</div> </div>
</div> </div>
{# ------------- Evolução dos desembolsos ------------- #} {# ------------- Evolução dos desembolsos ------------- #}
<div style="height: 300px;" class="module"> <div style="height: 300px;" class="module">
<h2>Evolução dos desembolsos</h2> <h2>{% trans 'Evolução dos desembolsos' %}</h2>
<h3>Desembolsos últimos seis meses</h3> <h3>{% trans 'Desembolsos últimos seis meses' %}</h3>
<img src="//chart.googleapis.com/chart?chxr=0,0,{{ desembolsos_max }}&chxl=1:{% for m in meses %}|{{ m }}{% endfor %}&chxt=y,x&chbh=a&chs=400x240&cht=bvg&chd=t:{% for serie in desembolsos.values %}{% for v in serie.1.values %}{{ v }}{% if not forloop.last %},{% endif %}{% endfor %}{% if not forloop.last %}|{% endif %}{% endfor %}&chdl={% for l in desembolsos.values %}{{ l.0 }}{% if not forloop.last %}|{% endif %}{% endfor %}&chdlp=t&chds={% for d in desembolsos %}0,{{ desembolsos_max }}{% if not forloop.last %},{% endif %}{% endfor %}&chco={{ colors }}" /> <img src="//chart.googleapis.com/chart?chxr=0,0,{{ desembolsos_max }}&chxl=1:{% for m in meses %}|{{ m }}{% endfor %}&chxt=y,x&chbh=a&chs=400x240&cht=bvg&chd=t:{% for serie in desembolsos.values %}{% for v in serie.1.values %}{{ v }}{% if not forloop.last %},{% endif %}{% endfor %}{% if not forloop.last %}|{% endif %}{% endfor %}&chdl={% for l in desembolsos.values %}{{ l.0 }}{% if not forloop.last %}|{% endif %}{% endfor %}&chdlp=t&chds={% for d in desembolsos %}0,{{ desembolsos_max }}{% if not forloop.last %},{% endif %}{% endfor %}&chco={{ colors }}" />
</div> </div>

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

@ -1,35 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import template from django import template
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.metas.views import parliament_summary
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(casa):
if not isinstance(value, CasaLegislativa): if not isinstance(casa, CasaLegislativa):
return "" return ""
result = "" summary = parliament_summary(casa)
result = ''.join('<li>%s</li>' % info for info in summary['info'])
for sv in value.servico_set.all():
result += u'<li>%s ativado em %s</li>' % (sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y'))
for cv in value.convenio_set.all():
if (cv.data_retorno_assinatura is None) and (cv.equipada and cv.data_termo_aceite is not None):
result += u"<li>Equipada em %s pelo %s</li>" % (cv.data_termo_aceite.strftime('%d/%m/%Y'), cv.projeto.sigla)
if (cv.data_retorno_assinatura is not None) and not (cv.equipada and cv.data_termo_aceite is not None):
result += u"<li>Conveniada ao %s em %s</li>" % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y'))
if (cv.data_retorno_assinatura is not None) and (cv.equipada and cv.data_termo_aceite is not None):
result += u"<li>Conveniada ao %s em %s e equipada em %s</li>" % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y'), cv.data_termo_aceite.strftime('%d/%m/%Y'))
for dg in value.diagnostico_set.all():
result += u'<li>Diagnosticada no período de %s a %s</li>' % (dg.data_visita_inicio.strftime('%d/%m/%Y') if dg.data_visita_inicio
else u"<< sem data inicial >>",
dg.data_visita_fim.strftime('%d/%m/%Y') if dg.data_visita_fim
else u"<< sem data final >>")
return mark_safe(result) return mark_safe(result)
descricao_servicos.is_safe = True descricao_servicos.is_safe = True

137
sigi/apps/metas/views.py

@ -1,29 +1,31 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import csv import csv
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
import os import os
import time
from functools import reduce
from django.http import HttpResponse from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo from django.db.models import Q
from django.utils.datastructures import SortedDict from django.db.models.aggregates import Sum
from django.http import HttpResponse
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.template import RequestContext from django.template import RequestContext
from django.db.models import Q from django.utils.datastructures import SortedDict
from django.utils.translation import ugettext as _
from django.views.decorators.cache import cache_page from django.views.decorators.cache import cache_page
from django.db.models.aggregates import Sum from easy_thumbnails.templatetags.thumbnail import thumbnail_url
from django.contrib.auth.decorators import user_passes_test, login_required
from sigi.settings import MEDIA_ROOT, STATIC_URL
from sigi.shortcuts import render_to_pdf
from sigi.apps.servicos.models import TipoServico, Servico
from sigi.apps.convenios.models import Projeto, Convenio
from sigi.apps.contatos.models import UnidadeFederativa
from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.utils import to_ascii from sigi.apps.contatos.models import UnidadeFederativa
from sigi.apps.convenios.models import Projeto
from sigi.apps.financeiro.models import Desembolso from sigi.apps.financeiro.models import Desembolso
from sigi.apps.metas.templatetags.mapa_tags import descricao_servicos from sigi.apps.servicos.models import TipoServico
from functools import reduce from sigi.apps.utils import to_ascii
from easy_thumbnails.templatetags.thumbnail import thumbnail_url from sigi.settings import MEDIA_ROOT, STATIC_URL
import time from sigi.shortcuts import render_to_pdf
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')
@ -294,49 +296,9 @@ def gera_map_data_file(cronjob=False):
# Salta essa casa, pois ela não tem nada com o Interlegis # Salta essa casa, pois ela não tem nada com o Interlegis
if c.pk not in casas: if c.pk not in casas:
casa = { summary = parliament_summary(c)
'nome': c.nome + ', ' + c.municipio.uf.sigla, summary['info'] = "<br/>".join(summary['info'])
'icone': '/static/img/mapmarker.png', casas[c.pk] = summary
'thumb': thumbnail_url(c.foto, 'small'),
'foto': (c.foto.url if c.foto else ''),
'lat': str(c.municipio.latitude),
'lng': str(c.municipio.longitude),
'estado': c.municipio.uf.sigla,
'regiao': c.municipio.uf.regiao,
'diagnosticos': [],
'seit': [],
'convenios': [],
'equipadas': [],
'info': []
}
for sv in c.servico_set.all():
casa['info'].append(u"%s ativado em %s <a href='%s' target='_blank'><img src='%simg/link.gif' alt='link'></a>" % (
sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y') if sv.data_ativacao else
u'<sem data de ativação>', sv.url, STATIC_URL))
casa['seit'].append(sv.tipo_servico.sigla)
for cv in c.convenio_set.all():
if (cv.data_retorno_assinatura is None) and (cv.equipada and cv.data_termo_aceite is not None):
casa['info'].append(u"Equipada em %s pelo %s" % (cv.data_termo_aceite.strftime('%d/%m/%Y'), cv.projeto.sigla))
casa['equipadas'].append(cv.projeto.sigla)
if (cv.data_retorno_assinatura is not None) and not (cv.equipada and cv.data_termo_aceite is not None):
casa['info'].append(u"Conveniada ao %s em %s" % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y')))
casa['convenios'].append(cv.projeto.sigla)
if (cv.data_retorno_assinatura is not None) and (cv.equipada and cv.data_termo_aceite is not None):
casa['info'].append(u"Conveniada ao %s em %s e equipada em %s" % (cv.projeto.sigla, cv.data_retorno_assinatura.strftime('%d/%m/%Y'), cv.data_termo_aceite.strftime('%d/%m/%Y')))
casa['equipadas'].append(cv.projeto.sigla)
casa['convenios'].append(cv.projeto.sigla)
for dg in c.diagnostico_set.all():
casa['diagnosticos'].append('P' if dg.publicado else 'A')
casa['info'].append(u'Diagnosticada no período de %s a %s' % (dg.data_visita_inicio.strftime('%d/%m/%Y') if
dg.data_visita_inicio is not None else u"<sem data de início>",
dg.data_visita_fim.strftime('%d/%m/%Y') if dg.data_visita_fim else u"<sem data de término>"))
casa['info'] = "<br/>".join(casa['info'])
casas[c.pk] = casa
json_data = simplejson.dumps(casas) json_data = simplejson.dumps(casas)
@ -351,6 +313,61 @@ def gera_map_data_file(cronjob=False):
pass # ... ou os dados poderão ser usados de qualquer forma pass # ... ou os dados poderão ser usados de qualquer forma
if cronjob: if cronjob:
return "Arquivo %s gerado em %d segundos" % (JSON_FILE_NAME, time.time() - start) return _(u"Arquivo %(filename)s gerado em %(seconds)d segundos") % dict(
filename=JSON_FILE_NAME,
seconds=time.time() - start)
return json_data return json_data
def parliament_summary(parliament):
summary = {
'nome': parliament.nome + ', ' + parliament.municipio.uf.sigla,
'icone': '/static/img/mapmarker.png',
'thumb': thumbnail_url(parliament.foto, 'small'),
'foto': (parliament.foto.url if parliament.foto else ''),
'lat': str(parliament.municipio.latitude),
'lng': str(parliament.municipio.longitude),
'estado': parliament.municipio.uf.sigla,
'regiao': parliament.municipio.uf.regiao,
'diagnosticos': [],
'seit': [],
'convenios': [],
'equipadas': [],
'info': []
}
for sv in parliament.servico_set.all():
summary['info'].append(
_(u"%(name)s ativado em %(date)s") % dict(
name=sv.tipo_servico.nome,
date=sv.data_ativacao.strftime('%d/%m/%Y') if sv.data_ativacao else _(u'<sem data de ativação>')) +
" <a href='%s' target='_blank'><img src='%simg/link.gif' alt='link'></a>" % (sv.url, STATIC_URL))
summary['seit'].append(sv.tipo_servico.sigla)
for cv in parliament.convenio_set.all():
if (cv.data_retorno_assinatura is None) and (cv.equipada and cv.data_termo_aceite is not None):
summary['info'].append(_(u"Equipada em %(date)s pelo %(project)s") % dict(
date=cv.data_termo_aceite.strftime('%d/%m/%Y'),
project=cv.projeto.sigla))
summary['equipadas'].append(cv.projeto.sigla)
if (cv.data_retorno_assinatura is not None) and not (cv.equipada and cv.data_termo_aceite is not None):
summary['info'].append(_(u"Conveniada ao %(project)s em %(date)s") % dict(
project=cv.projeto.sigla,
date=cv.data_retorno_assinatura.strftime('%d/%m/%Y')))
summary['convenios'].append(cv.projeto.sigla)
if (cv.data_retorno_assinatura is not None) and (cv.equipada and cv.data_termo_aceite is not None):
summary['info'].append(_(u"Conveniada ao %(project)s em %(date)s e equipada em %(equipped_date)s") % dict(
project=cv.projeto.sigla,
date=cv.data_retorno_assinatura.strftime('%d/%m/%Y'),
equipped_date=cv.data_termo_aceite.strftime('%d/%m/%Y')))
summary['equipadas'].append(cv.projeto.sigla)
summary['convenios'].append(cv.projeto.sigla)
for dg in parliament.diagnostico_set.all():
summary['diagnosticos'].append('P' if dg.publicado else 'A')
summary['info'].append(_(u'Diagnosticada no período de %(initial_date)s a %(final_date)s') % dict(
initial_date=dg.data_visita_inicio.strftime('%d/%m/%Y') if dg.data_visita_inicio is not None else _(u"<sem data de início>"),
final_date=dg.data_visita_fim.strftime('%d/%m/%Y') if dg.data_visita_fim else _(u"<sem data de término>")))
return summary

9
sigi/apps/ocorrencias/admin.py

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import admin from django.contrib import admin
from django.contrib.admin.views.main import ChangeList from django.contrib.admin.views.main import ChangeList
from django.utils.translation import ugettext as _
from filters import OcorrenciaListFilter from filters import OcorrenciaListFilter
from sigi.apps.ocorrencias.models import Ocorrencia, Comentario, Anexo, Categoria, TipoContato from sigi.apps.ocorrencias.models import Ocorrencia, Comentario, Anexo, Categoria, TipoContato
@ -13,7 +14,7 @@ class ComentarioViewInline(admin.TabularInline):
extra = 0 extra = 0
max_num = 0 max_num = 0
can_delete = False can_delete = False
verbose_name, verbose_name_plural = u"Comentário anterior", u"Comentários anteriores" verbose_name, verbose_name_plural = _(u"Comentário anterior"), _(u"Comentários anteriores")
fields = ('usuario', 'data_criacao', 'novo_status', 'encaminhar_setor', 'descricao', ) fields = ('usuario', 'data_criacao', 'novo_status', 'encaminhar_setor', 'descricao', )
readonly_fields = ('novo_status', 'encaminhar_setor', 'descricao', 'data_criacao', 'usuario',) readonly_fields = ('novo_status', 'encaminhar_setor', 'descricao', 'data_criacao', 'usuario',)
@ -21,7 +22,7 @@ class ComentarioViewInline(admin.TabularInline):
class ComentarioInline(admin.StackedInline): class ComentarioInline(admin.StackedInline):
model = Comentario model = Comentario
extra = 1 extra = 1
verbose_name, verbose_name_plural = u"Comentário novo", u"Comentários novos" verbose_name, verbose_name_plural = _(u"Comentário novo"), _(u"Comentários novos")
fieldsets = ((None, {'fields': (('novo_status', 'encaminhar_setor',), 'descricao', )}),) fieldsets = ((None, {'fields': (('novo_status', 'encaminhar_setor',), 'descricao', )}),)
def get_queryset(self, queryset): def get_queryset(self, queryset):
@ -114,12 +115,12 @@ class OcorrenciaAdmin(BaseModelAdmin):
def get_uf(self, obj): def get_uf(self, obj):
return obj.casa_legislativa.municipio.uf return obj.casa_legislativa.municipio.uf
get_uf.short_description = u'UF' get_uf.short_description = _(u'UF')
get_uf.admin_order_field = 'casa_legislativa__municipio__uf' get_uf.admin_order_field = 'casa_legislativa__municipio__uf'
def get_municipio(self, obj): def get_municipio(self, obj):
return obj.casa_legislativa.municipio.nome return obj.casa_legislativa.municipio.nome
get_municipio.short_description = u'Município' get_municipio.short_description = _(u'Município')
get_municipio.admin_order_field = 'casa_legislativa__municipio__nome' get_municipio.admin_order_field = 'casa_legislativa__municipio__nome'

8
sigi/apps/ocorrencias/filters.py

@ -1,17 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import admin from django.contrib import admin
from django.utils.translation import ugettext as _
from sigi.apps.servidores.models import Servidor from sigi.apps.servidores.models import Servidor
class OcorrenciaListFilter(admin.SimpleListFilter): class OcorrenciaListFilter(admin.SimpleListFilter):
title = u'Relacionadas a Mim' title = _(u'Relacionadas a Mim')
parameter_name = 'minhas' parameter_name = 'minhas'
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
return ( return (
('S', u'Atribuídos ao meu setor'), ('S', _(u'Atribuídos ao meu setor')),
('M', u'Registrados por mim'), ('M', _(u'Registrados por mim')),
) )
def queryset(self, request, queryset): def queryset(self, request, queryset):

81
sigi/apps/ocorrencias/models.py

@ -1,24 +1,25 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from django.utils.translation import ugettext as _
class Categoria(models.Model): class Categoria(models.Model):
nome = models.CharField(u"Categoria", max_length=50) nome = models.CharField(_(u"Categoria"), max_length=50)
descricao = models.TextField(u'descrição', blank=True, null=True) descricao = models.TextField(_(u'descrição'), blank=True, null=True)
setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=u"Setor responsável") setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=_(u"Setor responsável"))
class Meta: class Meta:
verbose_name, verbose_name_plural = u'Categoria', u'Categorias' verbose_name, verbose_name_plural = _(u'Categoria'), _(u'Categorias')
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class TipoContato(models.Model): class TipoContato(models.Model):
descricao = models.CharField(u"Descrição", max_length=50) descricao = models.CharField(_(u"Descrição"), max_length=50)
class Meta: class Meta:
verbose_name, verbose_name_plural = u"Tipo de contato", u"Tipos de contato" verbose_name, verbose_name_plural = _(u"Tipo de contato"), _(u"Tipos de contato")
def __unicode__(self): def __unicode__(self):
return self.descricao return self.descricao
@ -26,40 +27,40 @@ class TipoContato(models.Model):
class Ocorrencia(models.Model): class Ocorrencia(models.Model):
STATUS_CHOICES = ( STATUS_CHOICES = (
(1, u'Aberto'), (1, _(u'Aberto')),
(2, u'Reaberto'), (2, _(u'Reaberto')),
(3, u'Resolvido'), (3, _(u'Resolvido')),
(4, u'Fechado'), (4, _(u'Fechado')),
(5, u'Duplicado'), (5, _(u'Duplicado')),
) )
PRIORITY_CHOICES = ( PRIORITY_CHOICES = (
(1, u'Altíssimo'), (1, _(u'Altíssimo')),
(2, u'Alto'), (2, _(u'Alto')),
(3, u'Normal'), (3, _(u'Normal')),
(4, u'Baixo'), (4, _(u'Baixo')),
(5, u'Baixíssimo'), (5, _(u'Baixíssimo')),
) )
casa_legislativa = models.ForeignKey('casas.CasaLegislativa', verbose_name=u'Casa Legislativa') casa_legislativa = models.ForeignKey('casas.CasaLegislativa', verbose_name=_(u'Casa Legislativa'))
casa_legislativa.convenio_uf_filter = True casa_legislativa.convenio_uf_filter = True
casa_legislativa.convenio_cl_tipo_filter = True casa_legislativa.convenio_cl_tipo_filter = True
data_criacao = models.DateField(u'Data de criação', null=True, blank=True, auto_now_add=True) data_criacao = models.DateField(_(u'Data de criação'), null=True, blank=True, auto_now_add=True)
data_modificacao = models.DateField(u'Data de modificação', null=True, blank=True, auto_now=True) data_modificacao = models.DateField(_(u'Data de modificação'), null=True, blank=True, auto_now=True)
categoria = models.ForeignKey(Categoria, verbose_name=u'Categoria') categoria = models.ForeignKey(Categoria, verbose_name=_(u'Categoria'))
tipo_contato = models.ForeignKey(TipoContato, verbose_name=u"Tipo de contato") tipo_contato = models.ForeignKey(TipoContato, verbose_name=_(u"Tipo de contato"))
assunto = models.CharField(u'Assunto', max_length=200) assunto = models.CharField(_(u'Assunto'), max_length=200)
assunto.grupo_filter = True assunto.grupo_filter = True
status = models.IntegerField(u'Status', choices=STATUS_CHOICES, default=1,) status = models.IntegerField(_(u'Status'), choices=STATUS_CHOICES, default=1,)
status.multichoice_filter = True status.multichoice_filter = True
prioridade = models.IntegerField(u'Prioridade', choices=PRIORITY_CHOICES, default=3, ) prioridade = models.IntegerField(_(u'Prioridade'), choices=PRIORITY_CHOICES, default=3, )
descricao = models.TextField(u'descrição', blank=True,) descricao = models.TextField(_(u'descrição'), blank=True,)
resolucao = models.TextField(u'resolução', blank=True,) resolucao = models.TextField(_(u'resolução'), blank=True,)
servidor_registro = models.ForeignKey('servidores.Servidor', verbose_name=u"Servidor que registrou a ocorrência") servidor_registro = models.ForeignKey('servidores.Servidor', verbose_name=_(u"Servidor que registrou a ocorrência"))
setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=u"Setor responsável") setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=_(u"Setor responsável"))
class Meta: class Meta:
verbose_name, verbose_name_plural = u'ocorrência', u'ocorrências' verbose_name, verbose_name_plural = _(u'ocorrência'), _(u'ocorrências')
ordering = ['prioridade', 'data_modificacao', 'data_criacao', ] ordering = ['prioridade', 'data_modificacao', 'data_criacao', ]
def __unicode__(self): def __unicode__(self):
@ -67,23 +68,23 @@ class Ocorrencia(models.Model):
class Comentario(models.Model): class Comentario(models.Model):
ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'Ocorrência') ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=_(u'Ocorrência'))
data_criacao = models.DateTimeField(u'Data de criação', null=True, blank=True, auto_now_add=True) data_criacao = models.DateTimeField(_(u'Data de criação'), null=True, blank=True, auto_now_add=True)
descricao = models.TextField(u'Descrição', blank=True, null=True) descricao = models.TextField(_(u'Descrição'), blank=True, null=True)
usuario = models.ForeignKey('servidores.Servidor', verbose_name=u'Usuário') usuario = models.ForeignKey('servidores.Servidor', verbose_name=_(u'Usuário'))
novo_status = models.IntegerField(u'Novo status', choices=Ocorrencia.STATUS_CHOICES, blank=True, null=True) novo_status = models.IntegerField(_(u'Novo status'), choices=Ocorrencia.STATUS_CHOICES, blank=True, null=True)
encaminhar_setor = models.ForeignKey('servidores.Servico', verbose_name=u'Encaminhar para setor', blank=True, null=True) encaminhar_setor = models.ForeignKey('servidores.Servico', verbose_name=_(u'Encaminhar para setor'), blank=True, null=True)
class Anexo(models.Model): class Anexo(models.Model):
ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência') ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=_(u'ocorrência'))
arquivo = models.FileField(u'Arquivo anexado', upload_to='apps/ocorrencia/anexo/arquivo',) arquivo = models.FileField(_(u'Arquivo anexado'), upload_to='apps/ocorrencia/anexo/arquivo', max_length=500)
descricao = models.CharField(u'descrição do anexo', max_length='70') descricao = models.CharField(_(u'descrição do anexo'), max_length='70')
data_pub = models.DateTimeField(u'data da publicação do anexo', null=True, blank=True, auto_now_add=True) data_pub = models.DateTimeField(_(u'data da publicação do anexo'), null=True, blank=True, auto_now_add=True)
class Meta: class Meta:
ordering = ('-data_pub',) ordering = ('-data_pub',)
verbose_name, verbose_name_plural = u'Anexo', u'Anexos' verbose_name, verbose_name_plural = _(u'Anexo'), _(u'Anexos')
def __unicode__(self): def __unicode__(self):
return u"%(arquivo_name)s: %(descricao)s" % {'arquivo_name': self.arquivo.name, 'descricao': self.descricao} return u"%(arquivo_name)s: %(descricao)s" % {'arquivo_name': self.arquivo.name, 'descricao': self.descricao}

13
sigi/apps/parlamentares/admin.py

@ -2,6 +2,7 @@
from django.contrib import admin from django.contrib import admin
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.utils.translation import ugettext as _
from sigi.apps.contatos.models import Telefone from sigi.apps.contatos.models import Telefone
from sigi.apps.parlamentares.models import Partido, Parlamentar, Mandato from sigi.apps.parlamentares.models import Partido, Parlamentar, Mandato
@ -28,7 +29,7 @@ class PartidoAdmin(BaseModelAdmin):
class ParlamentarNomeCompletoFilter(AlphabeticFilter): class ParlamentarNomeCompletoFilter(AlphabeticFilter):
title = 'Inicial do Nome Completo' title = _(u'Inicial do Nome Completo')
parameter_name = 'nome_completo' parameter_name = 'nome_completo'
@ -42,10 +43,10 @@ class ParlamentarAdmin(BaseModelAdmin):
(None, { (None, {
'fields': ('nome_completo', 'nome_parlamentar', 'sexo'), 'fields': ('nome_completo', 'nome_parlamentar', 'sexo'),
}), }),
# ('Endereço', { # (_(u'Endereço'), {
# 'fields': ('logradouro', 'bairro', 'municipio', 'cep'), # 'fields': ('logradouro', 'bairro', 'municipio', 'cep'),
# }), # }),
('Outras informações', { (_(u'Outras informações'), {
'fields': ('data_nascimento', 'email', 'pagina_web', 'foto'), 'fields': ('data_nascimento', 'email', 'pagina_web', 'foto'),
}), }),
) )
@ -63,12 +64,12 @@ class ParlamentarAdmin(BaseModelAdmin):
q2 = len(request.session['carrinho_parlamentar']) q2 = len(request.session['carrinho_parlamentar'])
quant = q2 - q1 quant = q2 - q1
if quant: if quant:
self.message_user(request, "%s Parlamentares adicionados no carrinho" % (quant)) self.message_user(request, _(u"%s Parlamentares adicionados no carrinho") % (quant))
else: else:
self.message_user(request, "Os parlamentares selecionadas já foram adicionadas anteriormente") self.message_user(request, _(u"Os parlamentares selecionadas já foram adicionadas anteriormente"))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
adiciona_parlamentar.short_description = u"Armazenar parlamentar no carrinho para exportar" adiciona_parlamentar.short_description = _(u"Armazenar parlamentar no carrinho para exportar")
class MandatoAdmin(BaseModelAdmin): class MandatoAdmin(BaseModelAdmin):

218
sigi/apps/parlamentares/fixtures/initial_data.json

@ -1,218 +0,0 @@
[
{
"pk": 5,
"model": "parlamentares.partido",
"fields": {
"sigla": "DEM",
"nome": "Democratas"
}
},
{
"pk": 19,
"model": "parlamentares.partido",
"fields": {
"sigla": "PCB",
"nome": "Partido Comunista Brasileiro"
}
},
{
"pk": 6,
"model": "parlamentares.partido",
"fields": {
"sigla": "PCdoB",
"nome": "Partido Comunista do Brasil"
}
},
{
"pk": 4,
"model": "parlamentares.partido",
"fields": {
"sigla": "PDT",
"nome": "Partido Democr\u00e1tico Trabalhista"
}
},
{
"pk": 20,
"model": "parlamentares.partido",
"fields": {
"sigla": "PHS",
"nome": "Partido Humanista da Solidariedade"
}
},
{
"pk": 13,
"model": "parlamentares.partido",
"fields": {
"sigla": "PPS",
"nome": "Partido Popular Socialista"
}
},
{
"pk": 17,
"model": "parlamentares.partido",
"fields": {
"sigla": "PP",
"nome": "Partido Progressista"
}
},
{
"pk": 16,
"model": "parlamentares.partido",
"fields": {
"sigla": "PRTB",
"nome": "Partido Renovador Trabalhista Brasileiro"
}
},
{
"pk": 25,
"model": "parlamentares.partido",
"fields": {
"sigla": "PRB",
"nome": "Partido Republicano Brasileiro"
}
},
{
"pk": 12,
"model": "parlamentares.partido",
"fields": {
"sigla": "PRP",
"nome": "Partido Republicano Progressista"
}
},
{
"pk": 10,
"model": "parlamentares.partido",
"fields": {
"sigla": "PSC",
"nome": "Partido Social Crist\u00e3o"
}
},
{
"pk": 21,
"model": "parlamentares.partido",
"fields": {
"sigla": "PSDC",
"nome": "Partido Social Democrata Crist\u00e3o"
}
},
{
"pk": 24,
"model": "parlamentares.partido",
"fields": {
"sigla": "PSL",
"nome": "Partido Social Liberal"
}
},
{
"pk": 26,
"model": "parlamentares.partido",
"fields": {
"sigla": "PSOL",
"nome": "Partido Socialismo e Liberdade"
}
},
{
"pk": 7,
"model": "parlamentares.partido",
"fields": {
"sigla": "PSB",
"nome": "Partido Socialista Brasileiro"
}
},
{
"pk": 18,
"model": "parlamentares.partido",
"fields": {
"sigla": "PSTU",
"nome": "Partido Socialista dos Trabalhadores Unificado"
}
},
{
"pk": 3,
"model": "parlamentares.partido",
"fields": {
"sigla": "PTB",
"nome": "Partido Trabalhista Brasileiro"
}
},
{
"pk": 9,
"model": "parlamentares.partido",
"fields": {
"sigla": "PTC",
"nome": "Partido Trabalhista Crist\u00e3o"
}
},
{
"pk": 23,
"model": "parlamentares.partido",
"fields": {
"sigla": "PTN",
"nome": "Partido Trabalhista Nacional"
}
},
{
"pk": 15,
"model": "parlamentares.partido",
"fields": {
"sigla": "PTdoB",
"nome": "Partido Trabalhista do Brasil"
}
},
{
"pk": 14,
"model": "parlamentares.partido",
"fields": {
"sigla": "PV",
"nome": "Partido Verde"
}
},
{
"pk": 22,
"model": "parlamentares.partido",
"fields": {
"sigla": "PCO",
"nome": "Partido da Causa Oper\u00e1ria"
}
},
{
"pk": 11,
"model": "parlamentares.partido",
"fields": {
"sigla": "PMN",
"nome": "Partido da Mobiliza\u00e7\u00e3o Nacional"
}
},
{
"pk": 27,
"model": "parlamentares.partido",
"fields": {
"sigla": "PR",
"nome": "Partido da Rep\u00fablica"
}
},
{
"pk": 8,
"model": "parlamentares.partido",
"fields": {
"sigla": "PSDB",
"nome": "Partido da Social Democracia Brasileira"
}
},
{
"pk": 2,
"model": "parlamentares.partido",
"fields": {
"sigla": "PMDB",
"nome": "Partido do Movimento Democr\u00e1tico Brasileiro"
}
},
{
"pk": 1,
"model": "parlamentares.partido",
"fields": {
"sigla": "PT",
"nome": "Partido dos Trabalhadores"
}
}
]

28
sigi/apps/parlamentares/models.py

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from django.contrib.contenttypes import generic from django.utils.translation import ugettext as _
class Partido(models.Model): class Partido(models.Model):
@ -16,8 +16,8 @@ class Partido(models.Model):
class Parlamentar(models.Model): class Parlamentar(models.Model):
SEXO_CHOICES = ( SEXO_CHOICES = (
('M', 'Masculino'), ('M', _(u'Masculino')),
('F', 'Feminino'), ('F', _(u'Feminino')),
) )
nome_completo = models.CharField(max_length=128) nome_completo = models.CharField(max_length=128)
nome_parlamentar = models.CharField(max_length=35, blank=True) nome_parlamentar = models.CharField(max_length=35, blank=True)
@ -34,17 +34,17 @@ class Parlamentar(models.Model):
choices=SEXO_CHOICES, choices=SEXO_CHOICES,
) )
data_nascimento = models.DateField( data_nascimento = models.DateField(
'data de nascimento', _(u'data de nascimento'),
blank=True, blank=True,
null=True, null=True,
) )
email = models.EmailField('e-mail', blank=True) email = models.EmailField(_(u'e-mail'), blank=True)
pagina_web = models.URLField(u'página web', pagina_web = models.URLField(_(u'página web'),
blank=True) blank=True)
class Meta: class Meta:
ordering = ('nome_completo',) ordering = ('nome_completo',)
verbose_name_plural = 'parlamentares' verbose_name_plural = _(u'parlamentares')
def __unicode__(self): def __unicode__(self):
if self.nome_parlamentar: if self.nome_parlamentar:
@ -54,23 +54,23 @@ class Parlamentar(models.Model):
class Mandato(models.Model): class Mandato(models.Model):
SUPLENCIA_CHOICES = ( SUPLENCIA_CHOICES = (
('T', 'Titular'), ('T', _(u'Titular')),
('S', 'Suplente'), ('S', _(u'Suplente')),
) )
parlamentar = models.ForeignKey(Parlamentar) parlamentar = models.ForeignKey(Parlamentar)
legislatura = models.ForeignKey('mesas.Legislatura') legislatura = models.ForeignKey('mesas.Legislatura')
partido = models.ForeignKey(Partido) partido = models.ForeignKey(Partido)
cargo = models.ForeignKey('mesas.Cargo') cargo = models.ForeignKey('mesas.Cargo')
inicio_mandato = models.DateField(u'início de mandato') inicio_mandato = models.DateField(_(u'início de mandato'))
fim_mandato = models.DateField('fim de mandato') fim_mandato = models.DateField(_(u'fim de mandato'))
is_afastado = models.BooleanField( is_afastado = models.BooleanField(
'afastado', _(u'afastado'),
default=False, default=False,
help_text=u'Marque caso parlamentar não esteja ativo.' help_text=_(u'Marque caso parlamentar não esteja ativo.')
) )
# suplencia = models.CharField( # suplencia = models.CharField(
# u'suplência', # _(u'suplência'),
# max_length=1, # max_length=1,
# choices=SUPLENCIA_CHOICES, # choices=SUPLENCIA_CHOICES,
# ) # )

105
sigi/apps/parlamentares/reports.py

@ -1,13 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.templatetags.static import static
from django.utils.translation import ugettext as _
from geraldo import Report, DetailBand, Label, ObjectValue, ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH, SystemField
from geraldo.graphics import Image
from reportlab.lib.enums import TA_CENTER
from reportlab.lib.pagesizes import A4 from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm from reportlab.lib.units import cm
from reportlab.lib.enums import TA_CENTER, TA_RIGHT
from geraldo import Report, DetailBand, Label, ObjectValue, ManyElements, \
ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH, SystemField
from sigi.apps.relatorios.reports import ReportDefault from sigi.apps.relatorios.reports import ReportDefault
from geraldo.graphics import Image
def string_to_cm(texto): def string_to_cm(texto):
@ -85,7 +86,7 @@ class ParlamentaresLabels(Report):
my_elements = [ my_elements = [
Label( Label(
text=u'A Sua Excelência o(a) Senhor(a)', text=_(u'A Sua Excelência o(a) Senhor(a)'),
top=(self.start + self.delta) * cm, left=self.y * cm, width=(self.largura_etiqueta - self.y) * cm, top=(self.start + self.delta) * cm, left=self.y * cm, width=(self.largura_etiqueta - self.y) * cm,
), ),
ObjectValue( ObjectValue(
@ -126,32 +127,32 @@ def logradouro_parlamentar(instance):
try: try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.logradouro return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.logradouro
except: except:
return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>" return _(u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>")
def bairro_parlamentar(instance): def bairro_parlamentar(instance):
try: try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.bairro return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.bairro
except: except:
return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>" return _(u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>")
def municipio_parlamentar(instance): def municipio_parlamentar(instance):
try: try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.municipio return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.municipio
except: except:
return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>" return _(u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>")
def cep_parlamentar(instance): def cep_parlamentar(instance):
try: try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.cep return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.cep
except: except:
return u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>" return _(u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>")
class CasasLegislativasReport(ReportDefault): class CasasLegislativasReport(ReportDefault):
title = u'Relatório de Casas Legislativas' title = _(u'Relatório de Casas Legislativas')
height = 80 * cm height = 80 * cm
page_size = landscape(A4) page_size = landscape(A4)
@ -162,18 +163,18 @@ class CasasLegislativasReport(ReportDefault):
elements = list(ReportDefault.band_page_header.elements) elements = list(ReportDefault.band_page_header.elements)
elements = [ elements = [
Image(filename=ReportDefault.band_page_header.BASE_DIR + '/media/images/logo-interlegis.jpg', Image(filename=ReportDefault.band_page_header.BASE_DIR + static('img/logo-interlegis.jpg'),
left=23.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, left=23.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=4.2 * cm, height=3 * cm, width=4.2 * cm, height=3 * cm,
), ),
Image(filename=ReportDefault.band_page_header.BASE_DIR + '/media/images/logo-senado.png', Image(filename=ReportDefault.band_page_header.BASE_DIR + static('img/logo-senado.png'),
left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=3 * cm, height=3 * cm, width=3 * cm, height=3 * cm,
), ),
Label(text=u"SENADO FEDERAL", top=1 * cm, left=0, width=BAND_WIDTH, Label(text=_(u"SENADO FEDERAL"), top=1 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}
), ),
Label(text=u"SINTER - Secretaria Especial do Interlegis", top=1.5 * cm, left=0, width=BAND_WIDTH, Label(text=_(u"SINTER - Secretaria Especial do Interlegis"), top=1.5 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER}
), ),
SystemField( SystemField(
@ -181,32 +182,32 @@ class CasasLegislativasReport(ReportDefault):
style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}
), ),
Label( Label(
text=u"UF", text=_(u"UF"),
left=label_left[0] * cm, left=label_left[0] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=u"Municipio", text=_(u"Municipio"),
left=label_left[1] * cm, left=label_left[1] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=u"Presidente", text=_(u"Presidente"),
left=label_left[2] * cm, left=label_left[2] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=u"Endereço", text=_(u"Endereço"),
left=label_left[3] * cm, left=label_left[3] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=u"Endereço na Internet", text=_(u"Endereço na Internet"),
left=label_left[4] * cm, left=label_left[4] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=u"Email", text=_(u"Email"),
left=label_left[5] * cm, left=label_left[5] * cm,
top=label_top, top=label_top,
), ),
@ -264,8 +265,12 @@ class CasasLegislativasReport(ReportDefault):
] ]
def label_text(text):
return "%s: " % text
class InfoCasaLegislativa(ReportDefault): class InfoCasaLegislativa(ReportDefault):
title = u'Casa Legislativa' title = _(u'Casa Legislativa')
class band_summary(ReportBand): class band_summary(ReportBand):
pass pass
@ -274,7 +279,7 @@ class InfoCasaLegislativa(ReportDefault):
height = 1 * cm height = 1 * cm
elements = [ elements = [
SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3 * cm), SystemField(expression=_(u'%(now:%d/%m/%Y)s às %(now:%H:%M)s'), top=0.3 * cm),
] ]
class band_detail(ReportDefault.band_detail): class band_detail(ReportDefault.band_detail):
@ -312,7 +317,7 @@ class InfoCasaLegislativa(ReportDefault):
elements = [ elements = [
Label( Label(
text=u"Tipo: ", text=label_text(_(u"Tipo")),
left=posicao_left[0] * cm, left=posicao_left[0] * cm,
top=posicao_top[0] * cm, top=posicao_top[0] * cm,
), ),
@ -323,7 +328,7 @@ class InfoCasaLegislativa(ReportDefault):
width=6 * cm, width=6 * cm,
), ),
Label( Label(
text=u"Região: ", text=label_text(_(u"Região")),
left=posicao_left[2] * cm, left=posicao_left[2] * cm,
top=posicao_top[1] * cm, top=posicao_top[1] * cm,
), ),
@ -332,11 +337,11 @@ class InfoCasaLegislativa(ReportDefault):
left=posicao_left[3] * cm, left=posicao_left[3] * cm,
top=posicao_top[1] * cm, top=posicao_top[1] * cm,
get_value=lambda instance: get_value=lambda instance:
{'SL': 'Sul', 'SD': 'Sudeste', 'CO': 'Centro-Oeste', 'NE': 'Nordeste', 'NO': 'Norte', } {'SL': _(u'Sul'), 'SD': _(u'Sudeste'), 'CO': _(u'Centro-Oeste'), 'NE': _(u'Nordeste'), 'NO': _(u'Norte'), }
[instance.municipio.uf.regiao] [instance.municipio.uf.regiao]
), ),
Label( Label(
text=u"U.F.: ", text=label_text(_(u"UF")),
left=posicao_left[4] * cm, left=posicao_left[4] * cm,
top=posicao_top[2] * cm, top=posicao_top[2] * cm,
), ),
@ -346,7 +351,7 @@ class InfoCasaLegislativa(ReportDefault):
top=posicao_top[2] * cm, top=posicao_top[2] * cm,
), ),
Label( Label(
text=u"Município: ", text=label_text(_(u"Município")),
left=posicao_left[6] * cm, left=posicao_left[6] * cm,
top=posicao_top[3] * cm, top=posicao_top[3] * cm,
), ),
@ -358,7 +363,7 @@ class InfoCasaLegislativa(ReportDefault):
), ),
# Linha 3 # Linha 3
Label( Label(
text=u"Endereço: ", text=label_text(_(u"Endereço")),
left=posicao_left[8] * cm, left=posicao_left[8] * cm,
top=posicao_top[4] * cm, top=posicao_top[4] * cm,
), ),
@ -369,7 +374,7 @@ class InfoCasaLegislativa(ReportDefault):
width=20 * cm, width=20 * cm,
), ),
Label( Label(
text=u"Bairro: ", text=label_text(_(u"Bairro")),
left=posicao_left[10] * cm, left=posicao_left[10] * cm,
top=posicao_top[5] * cm, top=posicao_top[5] * cm,
), ),
@ -379,7 +384,7 @@ class InfoCasaLegislativa(ReportDefault):
top=posicao_top[5] * cm, top=posicao_top[5] * cm,
), ),
Label( Label(
text=u"CEP: ", text=label_text(_(u"CEP")),
left=posicao_left[12] * cm, left=posicao_left[12] * cm,
top=posicao_top[6] * cm, top=posicao_top[6] * cm,
), ),
@ -389,7 +394,7 @@ class InfoCasaLegislativa(ReportDefault):
top=posicao_top[6] * cm, top=posicao_top[6] * cm,
), ),
Label( Label(
text=u"CNPJ: ", text=label_text(_(u"CNPJ")),
left=posicao_left[14] * cm, left=posicao_left[14] * cm,
top=posicao_top[7] * cm, top=posicao_top[7] * cm,
), ),
@ -399,7 +404,7 @@ class InfoCasaLegislativa(ReportDefault):
top=posicao_top[7] * cm, top=posicao_top[7] * cm,
), ),
Label( Label(
text=u"Telefone: ", text=label_text(_(u"Telefone")),
left=posicao_left[16] * cm, left=posicao_left[16] * cm,
top=posicao_top[8] * cm, top=posicao_top[8] * cm,
), ),
@ -409,7 +414,7 @@ class InfoCasaLegislativa(ReportDefault):
top=posicao_top[8] * cm, top=posicao_top[8] * cm,
), ),
Label( Label(
text=u"Presidente: ", text=label_text(_(u"Presidente")),
left=posicao_left[18] * cm, left=posicao_left[18] * cm,
top=posicao_top[9] * cm, top=posicao_top[9] * cm,
), ),
@ -438,14 +443,14 @@ class InfoCasaLegislativa(ReportDefault):
height=2.5 * cm, height=2.5 * cm,
elements=[ elements=[
Label( Label(
text=u"Telefone(s)", text=_(u"Telefone(s)"),
style={'fontSize': 14, 'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1 * cm, top=1 * cm,
), ),
Label(text=u"Número", left=tel_left[0] * cm, top=tel_top), Label(text=_(u"Número"), left=tel_left[0] * cm, top=tel_top),
Label(text=u"Tipo", left=tel_left[1] * cm, top=tel_top), Label(text=_(u"Tipo"), left=tel_left[1] * cm, top=tel_top),
Label(text=u"Nota", left=tel_left[2] * cm, top=tel_top), Label(text=_(u"Nota"), left=tel_left[2] * cm, top=tel_top),
], ],
borders={'bottom': True}, borders={'bottom': True},
), ),
@ -456,7 +461,7 @@ class InfoCasaLegislativa(ReportDefault):
ObjectValue(attribute_name='__unicode__', left=tel_left[0] * cm), ObjectValue(attribute_name='__unicode__', left=tel_left[0] * cm),
ObjectValue(attribute_name='tipo', left=tel_left[1] * cm, ObjectValue(attribute_name='tipo', left=tel_left[1] * cm,
get_value=lambda instance: get_value=lambda instance:
{'F': 'Fixo', 'M': u'Móvel', 'X': 'Fax', 'I': 'Indefinido'}[instance.tipo], {'F': _(u'Fixo'), 'M': _(u'Móvel'), 'X': _(u'Fax'), 'I': _(u'Indefinido')}[instance.tipo],
), ),
ObjectValue(attribute_name='nota', left=tel_left[2] * cm), ObjectValue(attribute_name='nota', left=tel_left[2] * cm),
], ],
@ -471,14 +476,14 @@ class InfoCasaLegislativa(ReportDefault):
height=2.5 * cm, height=2.5 * cm,
elements=[ elements=[
Label( Label(
text=u"Contato(s)", text=_(u"Contato(s)"),
style={'fontSize': 14, 'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1 * cm, top=1 * cm,
), ),
Label(text=u"Nome", left=cont_left[0] * cm, top=cont_top), Label(text=_(u"Nome"), left=cont_left[0] * cm, top=cont_top),
Label(text=u"Nota", left=cont_left[1] * cm, top=cont_top), Label(text=_(u"Nota"), left=cont_left[1] * cm, top=cont_top),
Label(text=u"E-mail", left=cont_left[2] * cm, top=cont_top), Label(text=_(u"E-mail"), left=cont_left[2] * cm, top=cont_top),
], ],
borders={'bottom': True, 'top': True}, borders={'bottom': True, 'top': True},
), ),
@ -501,18 +506,18 @@ class InfoCasaLegislativa(ReportDefault):
height=2.5 * cm, height=2.5 * cm,
elements=[ elements=[
Label( Label(
text=u"Convênio(s)", text=_(u"Convênio(s)"),
style={'fontSize': 14, 'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1 * cm, top=1 * cm,
), ),
Label(text=u"Projeto", left=convenio_left[0] * cm, top=convenio_top), Label(text=_(u"Projeto"), left=convenio_left[0] * cm, top=convenio_top),
Label(text=u"Nº Convenio", left=convenio_left[1] * cm, top=convenio_top), Label(text=_(u"Nº Convenio"), left=convenio_left[1] * cm, top=convenio_top),
Label(text=u"Nº Processo SF", left=convenio_left[2] * cm, top=convenio_top), Label(text=_(u"Nº Processo SF"), left=convenio_left[2] * cm, top=convenio_top),
Label(text=u"Adesão", left=convenio_left[3] * cm, top=convenio_top), Label(text=_(u"Adesão"), left=convenio_left[3] * cm, top=convenio_top),
Label(text=u"Convênio", left=convenio_left[4] * cm, top=convenio_top), Label(text=_(u"Convênio"), left=convenio_left[4] * cm, top=convenio_top),
Label(text=u"Equipada", left=convenio_left[5] * cm, top=convenio_top), Label(text=_(u"Equipada"), left=convenio_left[5] * cm, top=convenio_top),
Label(text=u"Data D.O.", left=convenio_left[6] * cm, top=convenio_top), Label(text=_(u"Data D.O."), left=convenio_left[6] * cm, top=convenio_top),
], ],
borders={'bottom': True} borders={'bottom': True}
), ),

20
sigi/apps/parlamentares/templates/parlamentares/carrinho.html

@ -7,15 +7,15 @@
{% endblock %} {% endblock %}
{% block title %}Parlamentares no Carrinho | SIGI{% endblock %} {% block title %}{% trans 'Parlamentares no Carrinho | SIGI' %}{% endblock %}
{% block content_title %}<h1>Parlamentares no Carrinho</h1>{% endblock %} {% block content_title %}<h1>{% trans 'Parlamentares no Carrinho' %}</h1>{% endblock %}
{% block mensagem%} {% block mensagem%}
<ul class="messagelist"> <ul class="messagelist">
{%if carIsEmpty%} {%if carIsEmpty%}
<li class="warning">O carrinho está vazio, sendo assim todas as casas entram na lista para exportação de acordo com os filtros aplicados.</li> <li class="warning">{% trans 'O carrinho está vazio, sendo assim todos os parlamentares entram na lista para exportação de acordo com os filtros aplicados.' %}</li>
{%else%} {%else%}
<li>{{paginas.paginator.count}}Parlamentares no carrinho.</li> <li>{{paginas.paginator.count}} {% trans 'Parlamentares no carrinho' %}.</li>
{%endif%} {%endif%}
</ul> </ul>
{% endblock %} {% endblock %}
@ -30,9 +30,9 @@
<th class="sorted ascending"><!-- <input type="checkbox" id="action-toggle" style="display: inline;">--> <th class="sorted ascending"><!-- <input type="checkbox" id="action-toggle" style="display: inline;">-->
</th> </th>
{% endif %} {% endif %}
<th class="sorted ascending">Nome</th> <th class="sorted ascending">{% trans 'Nome' %}</th>
<th class="sorted ascending">Nome parlamentar</th> <th class="sorted ascending">{% trans 'Nome parlamentar' %}</th>
<th class="sorted ascending">Sexo</th> <th class="sorted ascending">{% trans 'Sexo' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -54,12 +54,12 @@
{% block botoes %} {% block botoes %}
<div id="tabs"> <div id="tabs">
<ul> <ul>
<li><a href="#tabs-1">Etiqueta</a></li> <li><a href="#tabs-1">{% trans 'Etiqueta' %}</a></li>
</ul> </ul>
<div id="tabs-1"> <div id="tabs-1">
<form action="../labels/{{query_str}}" method="post">{% csrf_token %} <form id="generate_labels" action="../labels/{{query_str}}" method="post">{% csrf_token %}
<fieldset><legend>Formato da Etiqueta</legend> <fieldset><legend>{% trans 'Formato da Etiqueta' %}</legend>
<ul class="formato_etiqueta"> <ul class="formato_etiqueta">
<li><input type="radio" name="tamanho_etiqueta" <li><input type="radio" name="tamanho_etiqueta"
value="2x5_etiqueta"><label>2x5</label></li> value="2x5_etiqueta"><label>2x5</label></li>

33
sigi/apps/parlamentares/test_parlamentares.py

@ -9,28 +9,27 @@ pytestmark = pytest.mark.django_db
@pytest.fixture @pytest.fixture
def some_parlamentarians(): def some_parliamentarians():
a = G(Parlamentar, nome_completo=u"Andre Silva", foto=None) return parliamentarians_from_names(["Andre Silva", "Bartolomeu Gusmao", "Camila Carla"])
b = G(Parlamentar, nome_completo=u"Bartolomeu Gusmao", foto=None)
c = G(Parlamentar, nome_completo=u"Camila Carla", foto=None)
return a, b, c
def test_list(some_parlamentarians, admin_client): def parliamentarians_from_names(names):
response = admin_client.get('/parlamentares/parlamentar', follow=True) return [G(Parlamentar, nome_completo=name, foto=None) for name in names]
def test_list_all(some_parliamentarians, app):
response = app.get('/parlamentares/parlamentar/')
assert response.status_code == 200 assert response.status_code == 200
decoded_content = response.content.decode('utf-8') for x in some_parliamentarians:
for x in some_parlamentarians: assert x.nome_completo in response.content
assert x.nome_completo in decoded_content
def test_list_filtered_by_capital_letter(some_parlamentarians, admin_client): def test_list_filtered_by_capital_letter(some_parliamentarians, app):
response = admin_client.get('/parlamentares/parlamentar/?nome_completo=B', follow=True) response = app.get('/parlamentares/parlamentar/?nome_completo=B')
assert response.status_code == 200 assert response.status_code == 200
decoded_content = response.content.decode('utf-8') a, b, c = some_parliamentarians
a, b, c = some_parlamentarians assert a.nome_completo not in response.content
assert a.nome_completo not in decoded_content assert b.nome_completo in response.content
assert b.nome_completo in decoded_content assert c.nome_completo not in response.content
assert c.nome_completo not in decoded_content

1
sigi/apps/parlamentares/views.py

@ -58,7 +58,6 @@ def visualizar_carrinho(request):
request, request,
'parlamentares/carrinho.html', 'parlamentares/carrinho.html',
{ {
'MEDIA_URL': settings.MEDIA_URL,
'carIsEmpty': carrinhoIsEmpty, 'carIsEmpty': carrinhoIsEmpty,
'paginas': paginas, 'paginas': paginas,
'query_str': '?' + request.META['QUERY_STRING'] 'query_str': '?' + request.META['QUERY_STRING']

30
sigi/apps/relatorios/reports.py

@ -1,20 +1,20 @@
#-*- coding:utf-8 -*- #-*- coding:utf-8 -*-
import os import os
from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \ from django.templatetags.static import static
landscape, SystemField, BAND_WIDTH, ReportGroup, \ from django.utils.translation import ugettext as _
FIELD_ACTION_SUM, FIELD_ACTION_COUNT, Line from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, SystemField, BAND_WIDTH, FIELD_ACTION_COUNT, Line
from geraldo.graphics import Image from geraldo.graphics import Image
from reportlab.lib.units import cm from reportlab.lib.colors import navy
from reportlab.lib.pagesizes import A4
from reportlab.lib.enums import TA_CENTER, TA_RIGHT from reportlab.lib.enums import TA_CENTER, TA_RIGHT
from reportlab.lib.colors import navy, red from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm
class ReportDefault(Report): class ReportDefault(Report):
#__metaclass__ = ABCMeta #__metaclass__ = ABCMeta
title = u'Relatório' title = _(u'Relatório')
author = u'Interlegis' author = _(u'Interlegis')
print_if_empty = True print_if_empty = True
page_size = A4 page_size = A4
@ -27,18 +27,18 @@ class ReportDefault(Report):
#BASE_DIR = os.path.abspath(os.getcwd() + '../..') #BASE_DIR = os.path.abspath(os.getcwd() + '../..')
elements = [ elements = [
Image(filename=BASE_DIR + '/media/images/logo-interlegis.jpg', Image(filename=BASE_DIR + static('img/logo-interlegis.jpg'),
left=15.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, left=15.5 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=4.2 * cm, height=3 * cm, width=4.2 * cm, height=3 * cm,
), ),
Image(filename=BASE_DIR + '/media/images/logo-senado.png', Image(filename=BASE_DIR + static('img/logo-senado.png'),
left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=3 * cm, height=3 * cm, width=3 * cm, height=3 * cm,
), ),
Label(text="SENADO FEDERAL", top=1 * cm, left=0, width=BAND_WIDTH, Label(text=_(u"SENADO FEDERAL"), top=1 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}
), ),
Label(text="SINTER - Secretaria Especial do Interlegis", top=1.5 * cm, left=0, width=BAND_WIDTH, Label(text=_(u"SINTER - Secretaria Especial do Interlegis"), top=1.5 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER}
), ),
SystemField( SystemField(
@ -52,8 +52,8 @@ class ReportDefault(Report):
height = 1 * cm height = 1 * cm
elements = [ elements = [
SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3 * cm), SystemField(expression=_(u'%(now:%d/%m/%Y)s às %(now:%H:%M)s'), top=0.3 * cm),
SystemField(expression=u'Página %(page_number)d de %(page_count)d', top=0.3 * cm, SystemField(expression=_(u'Página %(page_number)d de %(page_count)d'), top=0.3 * cm,
width=BAND_WIDTH, style={'alignment': TA_RIGHT} width=BAND_WIDTH, style={'alignment': TA_RIGHT}
), ),
] ]
@ -67,7 +67,7 @@ class ReportDefault(Report):
class band_summary(ReportBand): class band_summary(ReportBand):
height = 0.8 * cm height = 0.8 * cm
elements = [ elements = [
Label(text="Total:", top=0.1 * cm, left=0), Label(text=_(u"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'),
] ]

3
sigi/apps/saberes/tests.py

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

35
sigi/apps/servicos/admin.py

@ -58,13 +58,13 @@ class ServicoAdmin(BaseModelAdmin):
fieldsets = ((None, { fieldsets = ((None, {
'fields': ('casa_legislativa', 'data_ativacao',) 'fields': ('casa_legislativa', 'data_ativacao',)
}), }),
('Serviço', { (_(u'Serviço'), {
'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),) 'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),)
}), }),
('Contatos', { (_(u'Contatos'), {
'fields': ('contato_tecnico', 'contato_administrativo',) 'fields': ('contato_tecnico', 'contato_administrativo',)
}), }),
('Alterações', { (_(u'Alterações'), {
'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',) 'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',)
})) }))
readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao') readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao')
@ -76,17 +76,17 @@ class ServicoAdmin(BaseModelAdmin):
def get_codigo_interlegis(self, obj): def get_codigo_interlegis(self, obj):
return obj.casa_legislativa.codigo_interlegis return obj.casa_legislativa.codigo_interlegis
get_codigo_interlegis.short_description = u'Código Interlegis' get_codigo_interlegis.short_description = _(u'Código Interlegis')
get_codigo_interlegis.admin_order_field = 'casa_legislativa__codigo_interlegis' get_codigo_interlegis.admin_order_field = 'casa_legislativa__codigo_interlegis'
def get_uf(self, obj): def get_uf(self, obj):
return u'%s' % (obj.casa_legislativa.municipio.uf) return u'%s' % (obj.casa_legislativa.municipio.uf)
get_uf.short_description = 'UF' get_uf.short_description = _(u'UF')
get_uf.admin_order_field = 'casa_legislativa__municipio__uf' get_uf.admin_order_field = 'casa_legislativa__municipio__uf'
def getUrl(self, obj): def getUrl(self, obj):
return u'<a href="%s" target="_blank">%s</a>' % (obj.url, obj.url) return u'<a href="%s" target="_blank">%s</a>' % (obj.url, obj.url)
getUrl.short_description = 'Url' getUrl.short_description = _(u'Url')
getUrl.allow_tags = True getUrl.allow_tags = True
def get_link_erro(self, obj): def get_link_erro(self, obj):
@ -98,15 +98,15 @@ class ServicoAdmin(BaseModelAdmin):
url += obj.tipo_servico.string_pesquisa url += obj.tipo_servico.string_pesquisa
return u'<a href="%s" target="_blank">%s</a>' % (url, obj.erro_atualizacao) return u'<a href="%s" target="_blank">%s</a>' % (url, obj.erro_atualizacao)
get_link_erro.allow_tags = True get_link_erro.allow_tags = True
get_link_erro.short_description = u"Erro na atualização" get_link_erro.short_description = _(u"Erro na atualização")
get_link_erro.admin_order_field = 'erro_atualizacao' get_link_erro.admin_order_field = 'erro_atualizacao'
def calcular_data_uso(self, request, queryset): def calcular_data_uso(self, request, queryset):
for servico in queryset: for servico in queryset:
servico.atualiza_data_uso() servico.atualiza_data_uso()
self.message_user(request, "Atualização concluída. Os sites que não responderam foram deixados com a data em branco") self.message_user(request, _(u"Atualização concluída. Os sites que não responderam foram deixados com a data em branco"))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
calcular_data_uso.short_description = u"Atualizar a data do último uso do(s) serviço(s)" calcular_data_uso.short_description = _(u"Atualizar a data do último uso do(s) serviço(s)")
def get_actions(self, request): def get_actions(self, request):
from django.utils.datastructures import SortedDict from django.utils.datastructures import SortedDict
@ -130,10 +130,10 @@ class ServicoAdmin(BaseModelAdmin):
def response_add(self, request, obj): def response_add(self, request, obj):
opts = obj._meta opts = obj._meta
msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)} msg = _(u'The %(name)s "%(obj)s" was added successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)}
if "_addanother" in request.POST: if "_addanother" in request.POST:
self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(opts.verbose_name))) self.message_user(request, msg + ' ' + (_(u"You may add another %s below.") % force_unicode(opts.verbose_name)))
return HttpResponseRedirect(request.path + '?id_casa=%s' % (obj.casa_legislativa.id,)) return HttpResponseRedirect(request.path + '?id_casa=%s' % (obj.casa_legislativa.id,))
elif "_save" in request.POST: elif "_save" in request.POST:
self.message_user(request, msg) self.message_user(request, msg)
@ -143,10 +143,10 @@ class ServicoAdmin(BaseModelAdmin):
def response_change(self, request, obj): def response_change(self, request, obj):
opts = obj._meta opts = obj._meta
msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)} msg = _(u'The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)}
if "_addanother" in request.POST: if "_addanother" in request.POST:
self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(opts.verbose_name))) self.message_user(request, msg + ' ' + (_(u"You may add another %s below.") % force_unicode(opts.verbose_name)))
return HttpResponseRedirect("../add/?id_casa=%s" % (obj.casa_legislativa.id,)) return HttpResponseRedirect("../add/?id_casa=%s" % (obj.casa_legislativa.id,))
elif "_save" in request.POST: elif "_save" in request.POST:
self.message_user(request, msg) self.message_user(request, msg)
@ -191,12 +191,15 @@ class CasaAtendidaAdmin(BaseModelAdmin):
def get_servicos(self, obj): def get_servicos(self, obj):
result = [] result = []
for servico in obj.servico_set.all(): for servico in obj.servico_set.all():
result.append(u"%s (%s). Contato: %s" % (servico.tipo_servico.nome, 'ativo' if servico.data_desativacao is None result.append(u"%s (%s). %s: %s" % (
else 'Desativado', servico.contato_administrativo.nome)) servico.tipo_servico.nome,
_(u'ativo') if servico.data_desativacao is None else _(u'desativado'),
_(u'Contato'),
servico.contato_administrativo.nome))
return "<ul><li>" + "</li><li>".join(result) + "</li></ul>" return "<ul><li>" + "</li><li>".join(result) + "</li></ul>"
get_servicos.allow_tags = True get_servicos.allow_tags = True
get_servicos.short_description = u"Serviços" get_servicos.short_description = _(u"Serviços")
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
return super(CasaAtendidaAdmin, self).lookup_allowed(lookup, value) or \ return super(CasaAtendidaAdmin, self).lookup_allowed(lookup, value) or \

1
sigi/apps/servicos/fixtures/initial_data.json

@ -1 +0,0 @@
[{"pk": 1, "model": "servicos.tiposervico", "fields": {"template_email_altera": "Seu Portal Modelo foi alterado com sucesso. O endere\u00e7o de acesso \u00e9 {url} e a senha \u00e9 {senha}. Altere sua senha no primeiro acesso.", "sigla": "PM", "template_email_ativa": "Seu Portal Modelo foi ativado com sucesso. O endere\u00e7o de acesso \u00e9 {url} e a senha inicial \u00e9 {senha}. Altere sua senha no primeiro acesso.", "template_email_desativa": "Seu Portal Modelo foi desativado com sucesso. O endere\u00e7o de acesso era {url}.\r\nO motivo do cancelamento foi: {motivo}", "nome": "Portal Modelo"}}, {"pk": 2, "model": "servicos.tiposervico", "fields": {"template_email_altera": "Seu SAPL foi alterado com sucesso. O endere\u00e7o de acesso \u00e9 {url} e a senha \u00e9 {senha}. Altere sua senha no primeiro acesso.", "sigla": "SAPL", "template_email_ativa": "Seu SAPL foi ativado com sucesso. O endere\u00e7o de acesso \u00e9 {url} e a senha inicial \u00e9 {senha}. Altere sua senha no primeiro acesso.", "template_email_desativa": "Seu SAPL foi desativado com sucesso. O endere\u00e7o de acesso era {url}.\r\nO motivo do cancelamento foi: {motivo}", "nome": "Hospedagem SAPL"}}, {"pk": 3, "model": "servicos.tiposervico", "fields": {"template_email_altera": "Seu SAAP foi alterado com sucesso. O endere\u00e7o de acesso \u00e9 {url} e a senha \u00e9 {senha}. Altere sua senha no primeiro acesso.", "sigla": "SAAP", "template_email_ativa": "Seu SAAP foi ativado com sucesso. O endere\u00e7o de acesso \u00e9 {url} e a senha inicial \u00e9 {senha}. Altere sua senha no primeiro acesso.", "template_email_desativa": "Seu SAAP foi desativado com sucesso. O endere\u00e7o de acesso era {url}.\r\nO motivo do cancelamento foi: {motivo}", "nome": "Hospedagem SAAP"}}]

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

@ -22,11 +22,13 @@
# 02110-1301, USA. # 02110-1301, USA.
# #
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.utils.translation import ugettext as _
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'])

98
sigi/apps/servicos/models.py

@ -1,22 +1,22 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from datetime import date
from django.db import models from django.db import models
from sigi.apps.casas.models import CasaLegislativa, Funcionario from sigi.apps.casas.models import CasaLegislativa, Funcionario
from datetime import date from django.utils.translation import ugettext as _
from django.core.mail import send_mail
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/>
{senha} para incluir a senha inicial do serviço''' {senha} para incluir a senha inicial do serviço'''
nome = models.CharField(u'Nome', max_length=60) nome = models.CharField(_(u'Nome'), max_length=60)
sigla = models.CharField(u'Sigla', max_length='12') sigla = models.CharField(_(u'Sigla'), max_length='12')
string_pesquisa = models.CharField(u'String de pesquisa', blank=True, max_length=200, string_pesquisa = models.CharField(_(u'String de pesquisa'), blank=True, max_length=200,
help_text=u'Sufixo para pesquisa RSS para averiguar a data da última atualização do serviço') help_text=_(u'Sufixo para pesquisa RSS para averiguar a data da última atualização do serviço'))
template_email_ativa = models.TextField(u'Template de email de ativação', help_text=email_help, blank=True) template_email_ativa = models.TextField(_(u'Template de email de ativação'), help_text=email_help, blank=True)
template_email_altera = models.TextField(u'Template de email de alteração', help_text=email_help, blank=True) template_email_altera = models.TextField(_(u'Template de email de alteração'), help_text=email_help, blank=True)
template_email_desativa = models.TextField(u'Template de email de desativação', help_text=email_help + u'<br/>{motivo} para incluir o motivo da desativação do serviço', blank=True) template_email_desativa = models.TextField(_(u'Template de email de desativação'), help_text=email_help + _(u'<br/>{motivo} para incluir o motivo da desativação do serviço'), blank=True)
@property @property
def qtde_casas_atendidas(self): def qtde_casas_atendidas(self):
@ -24,32 +24,32 @@ class TipoServico(models.Model):
return self.servico_set.filter(data_desativacao=None).count() return self.servico_set.filter(data_desativacao=None).count()
class Meta: class Meta:
verbose_name = u'Tipo de serviço' verbose_name = _(u'Tipo de serviço')
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'))
tipo_servico = models.ForeignKey(TipoServico, verbose_name=u'Tipo de serviço') tipo_servico = models.ForeignKey(TipoServico, verbose_name=_(u'Tipo de serviço'))
contato_tecnico = models.ForeignKey(Funcionario, verbose_name=u'Contato técnico', related_name='contato_tecnico') contato_tecnico = models.ForeignKey(Funcionario, verbose_name=_(u'Contato técnico'), related_name='contato_tecnico')
contato_administrativo = models.ForeignKey(Funcionario, verbose_name=u'Contato administrativo', related_name='contato_administrativo') contato_administrativo = models.ForeignKey(Funcionario, verbose_name=_(u'Contato administrativo'), related_name='contato_administrativo')
url = models.URLField(u'URL do serviço', blank=True) url = models.URLField(_(u'URL do serviço'), blank=True)
hospedagem_interlegis = models.BooleanField(u'Hospedagem no Interlegis?', default=False) hospedagem_interlegis = models.BooleanField(_(u'Hospedagem no Interlegis?'), default=False)
nome_servidor = models.CharField(u'Hospedado em', max_length=60, blank=True, nome_servidor = models.CharField(_(u'Hospedado em'), max_length=60, blank=True,
help_text=u'Se hospedado no Interlegis, informe o nome do servidor.<br/>Senão, informe o nome do provedor de serviços.') help_text=_(u'Se hospedado no Interlegis, informe o nome do servidor.<br/>Senão, informe o nome do provedor de serviços.'))
porta_servico = models.PositiveSmallIntegerField(u'Porta de serviço (instância)', blank=True, null=True) porta_servico = models.PositiveSmallIntegerField(_(u'Porta de serviço (instância)'), blank=True, null=True)
senha_inicial = models.CharField(u'Senha inicial', max_length=33, blank=True) senha_inicial = models.CharField(_(u'Senha inicial'), max_length=33, blank=True)
data_ativacao = models.DateField(u'Data de ativação', default=date.today) data_ativacao = models.DateField(_(u'Data de ativação'), default=date.today)
data_alteracao = models.DateField(u'Data da última alteração', blank=True, null=True, auto_now=True) data_alteracao = models.DateField(_(u'Data da última alteração'), blank=True, null=True, auto_now=True)
data_desativacao = models.DateField(u'Data de desativação', blank=True, null=True) data_desativacao = models.DateField(_(u'Data de desativação'), blank=True, null=True)
motivo_desativacao = models.TextField(u'Motivo da desativação', blank=True) motivo_desativacao = models.TextField(_(u'Motivo da desativação'), blank=True)
data_ultimo_uso = models.DateField(u'Data da última utilização', blank=True, null=True, data_ultimo_uso = models.DateField(_(u'Data da última utilização'), blank=True, null=True,
help_text=u'Data em que o serviço foi utilizado pela Casa Legislativa pela última vez<br/><strong>NÃO É ATUALIZADO AUTOMATICAMENTE!</strong>') help_text=_(u'Data em que o serviço foi utilizado pela Casa Legislativa pela última vez<br/><strong>NÃO É ATUALIZADO AUTOMATICAMENTE!</strong>'))
erro_atualizacao = models.CharField(u"Erro na atualização", blank=True, max_length=200, erro_atualizacao = models.CharField(_(u"Erro na atualização"), blank=True, max_length=200,
help_text=u"Erro ocorrido na última tentativa de atualizar a data de último acesso") help_text=_(u"Erro ocorrido na última tentativa de atualizar a data de último acesso"))
# casa_legislativa.casa_uf_filter = True # casa_legislativa.casa_uf_filter = True
@ -87,14 +87,14 @@ class Servico(models.Model):
opener = urllib2.build_opener(proxy) opener = urllib2.build_opener(proxy)
req = opener.open(fullurl=url, timeout=5) req = opener.open(fullurl=url, timeout=5)
except Exception as e: except Exception as e:
reset(erro=str(e), comment=u'Não foi possível conectar com o servidor. Pode estar fora do ar ou não ser um ' + reset(erro=str(e), comment=_(u'Não foi possível conectar com o servidor. Pode estar fora do ar ou não ser um ') +
self.tipo_servico.nome) self.tipo_servico.nome)
return return
try: try:
rss = req.read() rss = req.read()
except Exception as e: except Exception as e:
reset(erro=str(e), comment=u'Não foi possível receber os dados do servidor. O acesso pode ter sido negado.') reset(erro=str(e), comment=_(u'Não foi possível receber os dados do servidor. O acesso pode ter sido negado.'))
return return
try: try:
@ -108,12 +108,12 @@ class Servico(models.Model):
self.erro_atualizacao = "" self.erro_atualizacao = ""
self.save() self.save()
except Exception as e: except Exception as e:
reset(erro=str(e), comment=u'A resposta do servidor não é compatível com %s. Pode ser outro software que está sendo usado' % reset(erro=str(e), comment=_(u'A resposta do servidor não é compatível com %s. Pode ser outro software que está sendo usado') %
self.tipo_servico.nome) self.tipo_servico.nome)
return return
def __unicode__(self): def __unicode__(self):
return "%s (%s)" % (self.tipo_servico.nome, 'ativo' if self.data_desativacao is None else 'Desativado') return "%s (%s)" % (self.tipo_servico.nome, _(u'ativo') if self.data_desativacao is None else _(u'Desativado'))
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
# Reter o objeto original para verificar mudanças # Reter o objeto original para verificar mudanças
@ -123,11 +123,11 @@ class Servico(models.Model):
if self.id is None: if self.id is None:
# Novo serviço, email de ativação # Novo serviço, email de ativação
subject = u'INTERLEGIS - Ativação de serviço %s' % (self.tipo_servico.nome,) subject = _(u'INTERLEGIS - Ativação de serviço %s') % (self.tipo_servico.nome,)
body = self.tipo_servico.template_email_ativa body = self.tipo_servico.template_email_ativa
elif self.data_desativacao is not None and original.data_desativacao is None: elif self.data_desativacao is not None and original.data_desativacao is None:
# Serviço foi desativado. Email de desativação # Serviço foi desativado. Email de desativação
subject = u'INTERLEGIS - Desativação de serviço %s' % (self.tipo_servico.nome,) subject = _(u'INTERLEGIS - Desativação de serviço %s') % (self.tipo_servico.nome,)
body = self.tipo_servico.template_email_desativa body = self.tipo_servico.template_email_desativa
elif (self.tipo_servico != original.tipo_servico or elif (self.tipo_servico != original.tipo_servico or
self.contato_tecnico != original.contato_tecnico or self.contato_tecnico != original.contato_tecnico or
@ -135,7 +135,7 @@ class Servico(models.Model):
self.nome_servidor != original.nome_servidor or self.nome_servidor != original.nome_servidor or
self.senha_inicial != original.senha_inicial): self.senha_inicial != original.senha_inicial):
# Serviço foi alterado # Serviço foi alterado
subject = u'INTERLEGIS - Alteração de serviço %s' % (self.tipo_servico.nome,) subject = _(u'INTERLEGIS - Alteração de serviço %s') % (self.tipo_servico.nome,)
body = self.tipo_servico.template_email_altera body = self.tipo_servico.template_email_altera
else: else:
# Salvar o Servico # Salvar o Servico
@ -157,17 +157,17 @@ class Servico(models.Model):
class LogServico(models.Model): class LogServico(models.Model):
servico = models.ForeignKey(Servico, verbose_name='Serviço') servico = models.ForeignKey(Servico, verbose_name=_(u'Serviço'))
descricao = models.CharField('Breve descrição da ação', max_length=60) descricao = models.CharField(_(u'Breve descrição da ação'), max_length=60)
data = models.DateField('Data da ação', default=date.today) data = models.DateField(_(u'Data da ação'), default=date.today)
log = models.TextField('Log da ação') log = models.TextField(_(u'Log da ação'))
def __unicode__(self): def __unicode__(self):
return "%s (%s)" % (self.descricao, self.data) return "%s (%s)" % (self.descricao, self.data)
class Meta: class Meta:
verbose_name = 'Log do serviço' verbose_name = _(u'Log do serviço')
verbose_name_plural = 'Logs do serviço' verbose_name_plural = _(u'Logs do serviço')
class CasaAtendidaManager(models.Manager): class CasaAtendidaManager(models.Manager):
@ -182,7 +182,7 @@ class CasaAtendida(CasaLegislativa):
class Meta: class Meta:
proxy = True proxy = True
verbose_name_plural = 'Casas atendidas' verbose_name_plural = _(u'Casas atendidas')
objects = CasaAtendidaManager() objects = CasaAtendidaManager()
@ -191,16 +191,16 @@ 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)
data_atualizacao = models.DateTimeField(auto_now=True) data_atualizacao = models.DateTimeField(auto_now=True)
informante = models.CharField(u'Nome do informante', max_length=100, blank=True) informante = models.CharField(_(u'Nome do informante'), max_length=100, blank=True)
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)
url = models.URLField(blank=True) url = models.URLField(blank=True)
hospedagem_interlegis = models.BooleanField(u'Hospedagem no Interlegis?', default=False) hospedagem_interlegis = models.BooleanField(_(u'Hospedagem no Interlegis?'), default=False)
class Meta: class Meta:
unique_together = ('casa_manifesta', 'servico') unique_together = ('casa_manifesta', 'servico')
@ -213,4 +213,4 @@ class RegistroServico(models.Model):
data_registro = models.DateTimeField(auto_now=True) data_registro = models.DateTimeField(auto_now=True)
class Meta: class Meta:
verbose_name_plural = u'Registro de serviços' verbose_name_plural = _(u'Registro de serviços')

14
sigi/apps/servicos/templates/admin/servicos/casaatendida/change_form.html

@ -12,11 +12,11 @@
<table> <table>
<thead> <thead>
<tr> <tr>
<th colspan="2">Tipo de serviço</th> <th colspan="2">{% trans 'Tipo de serviço' %}</th>
<th>Hospedagem no Interlegis?</th> <th>{% trans 'Hospedagem no Interlegis?' %}</th>
<th>Data de ativação</th> <th>{% trans 'Data de ativação' %}</th>
<th>Data da última alteração</th> <th>{% trans 'Data da última alteração' %}</th>
<th>Data de desativação</th> <th>{% trans 'Data de desativação' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -31,10 +31,10 @@
<td>{{ srv.data_desativacao|date:'SHORT_DATE_FORMAT' }}</td> <td>{{ srv.data_desativacao|date:'SHORT_DATE_FORMAT' }}</td>
</tr> </tr>
{% empty %} {% empty %}
<tr> <td colspan="6">Nenhum serviço cadastrado para esta Casa Legislativa</td> </tr> <tr> <td colspan="6">{% trans 'Nenhum serviço cadastrado para esta Casa Legislativa' %}</td> </tr>
{% endfor %} {% endfor %}
<tr class="add-row"> <tr class="add-row">
<td colspan="6"><a href="{% url 'admin:servicos_servico_add' %}?id_casa={{ original.id|safe }}">Adicionar outro Servico</a></td> <td colspan="6"><a href="{% url 'admin:servicos_servico_add' %}?id_casa={{ original.id|safe }}">{% trans 'Adicionar outro Servico' %}</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

32
sigi/apps/servicos/templates/servicos/casa_manifesta.html

@ -20,14 +20,14 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
{% if casa_list %} {% if casa_list %}
<a href="./">Unidade da Federação</a> &rsaquo; Casa Legislativa <a href="./">{% trans 'Unidade da Federação' %}</a> &rsaquo; {% trans 'Casa Legislativa' %}
{% else %} {% else %}
{% if casa %} {% if casa %}
<a href="./">Unidade da Federação</a> &rsaquo; <a href="./">{% trans 'Unidade da Federação' %}</a> &rsaquo;
<a href="./?uf={{ casa.municipio.uf.sigla }}">Casa Legislativa</a> &rsaquo; <a href="./?uf={{ casa.municipio.uf.sigla }}">{% trans 'Casa Legislativa' %}</a> &rsaquo;
{{ casa.nome }} {{ casa.nome }}
{% else %} {% else %}
Unidade da Federação {% trans 'Unidade da Federação' %}
{% endif %} {% endif %}
{% endif %} {% endif %}
</div> </div>
@ -36,7 +36,7 @@
{% block content %} {% block content %}
<div id="content-main"> <div id="content-main">
{% if uf_list %} {% if uf_list %}
<h3>1. Informe a Unidade da Federação onde se localiza sua Casa Legislativa</h3> <h3>1. {% trans 'Informe a Unidade da Federação onde se localiza sua Casa Legislativa' %}</h3>
<ul> <ul>
{% for uf in uf_list %} {% for uf in uf_list %}
<li><a href="./?uf={{ uf.sigla }}">{{ uf.nome }}</a></li> <li><a href="./?uf={{ uf.sigla }}">{{ uf.nome }}</a></li>
@ -45,7 +45,7 @@
{% endif %} {% endif %}
{% if casa_list %} {% if casa_list %}
<h3>2. Identifique sua Casa Legislativa</h3> <h3>2. {% trans 'Identifique sua Casa Legislativa' %}</h3>
<br/> <br/>
<ul> <ul>
{% for casa in casa_list %} {% for casa in casa_list %}
@ -55,7 +55,7 @@
{% endif %} {% endif %}
{% if cmf %} {% if cmf %}
<h3>3. Informe os dados para a {{ casa.nome }} - {{ casa.municipio.uf }}</h3> <h3>3. {% trans 'Informe os dados para a' %} {{ casa.nome }} - {{ casa.municipio.uf }}</h3>
<form action="" method="post" id="manifesta_form">{% csrf_token %} <form action="" method="post" id="manifesta_form">{% csrf_token %}
{% for fieldset in cmf.fieldsets %} {% for fieldset in cmf.fieldsets %}
{% if forloop.first %} {% if forloop.first %}
@ -85,13 +85,13 @@
{% endfor %} {% endfor %}
</fieldset> </fieldset>
<fieldset class="module aligned {{ fieldset.classes }}"> <fieldset class="module aligned {{ fieldset.classes }}">
<h2>Serviços e produtos Interlegis</h2> <h2>{% trans 'Serviços e produtos Interlegis' %}</h2>
<table> <table>
<tr> <tr>
<th>Nome do serviço ou produto</th> <th>{% trans 'Nome do serviço ou produto' %}</th>
<th>Marque se a Casa utiliza este serviço ou produto</th> <th>{% trans 'Marque se a Casa utiliza este serviço ou produto' %}</th>
<th>Informe a URL onde se localiza o serviço ou produto</th> <th>{% trans 'Informe a URL onde se localiza o serviço ou produto' %}</th>
<th>Marque se o serviço ou produto está hospedado no Interlegis</th> <th>{% trans 'Marque se o serviço ou produto está hospedado no Interlegis' %}</th>
</tr> </tr>
{% else %} {% else %}
<tr> <tr>
@ -113,14 +113,14 @@
{% endif %} {% endif %}
{% if thanks %} {% if thanks %}
<h1>Obrigado por responder à nossa pesquisa!</h1> <h1>{% trans 'Obrigado por responder à nossa pesquisa' %}!</h1>
<h3>Quadro resumo das informações prestadas:</h3> <h3>{% trans 'Quadro resumo das informações prestadas' %}:</h3>
<table> <table>
{% for row in thanks %} {% for row in thanks %}
<tr><th>{{ row.0 }}</th><td>{{ row.1|default:"Não informado" }}</td></tr> <tr><th>{{ row.0 }}</th><td>{{ row.1|default:_("Não informado") }}</td></tr>
{% endfor %} {% endfor %}
</table> </table>
<p>Se desejar, você poderá alterar esses dados repetindo o processo</p> <p>{% trans 'Se desejar, você poderá alterar esses dados repetindo o processo' %}</p>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

3
sigi/apps/servicos/templates/servicos/mapa.html

@ -1,6 +1,7 @@
{% extends "admin/index.html" %} {% extends "admin/index.html" %}
{% load i18n %}
{% block title %}SIGI{% endblock %} {% block title %}{% trans 'SIGI' %}{% endblock %}
{% block extrahead %} {% block extrahead %}
{{ block.super }} {{ block.super }}

38
sigi/apps/servicos/views.py

@ -1,20 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from django import forms from django import forms
from django.db.models import Q
from django.forms.forms import BoundField
from django.http import HttpResponse from django.http import HttpResponse
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from django.shortcuts import render_to_response, get_object_or_404 from django.shortcuts import render_to_response, get_object_or_404
from django.db.models import Q
from sigi.apps.servicos.models import TipoServico, CasaAtendida, CasaManifesta, ServicoManifesto
from sigi.apps.contatos.models import UnidadeFederativa
from sigi.apps.casas.models import CasaLegislativa
from django.template.context import RequestContext from django.template.context import RequestContext
from django.utils.encoding import force_unicode from django.utils.translation import ugettext as _
from django.forms.forms import BoundField
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe
from django.contrib.admin.helpers import AdminForm
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.contatos.models import UnidadeFederativa
from sigi.apps.servicos.models import TipoServico, CasaAtendida, CasaManifesta, ServicoManifesto
class MapaView(TemplateView): class MapaView(TemplateView):
@ -84,9 +83,9 @@ def casa_manifesta_view(request):
fieldsets = ((None, ('informante', 'cargo', 'email'),),) fieldsets = ((None, ('informante', 'cargo', 'email'),),)
for ts in TipoServico.objects.all(): for ts in TipoServico.objects.all():
campos['possui_%s' % ts.pk] = forms.BooleanField(label=u'Possui o serviço de %s' % ts.nome, required=False) campos['possui_%s' % ts.pk] = forms.BooleanField(label=_(u'Possui o serviço de %s') % ts.nome, required=False)
campos['url_%s' % ts.pk] = forms.URLField(label=u'Informe a URL', required=False) campos['url_%s' % ts.pk] = forms.URLField(label=_(u'Informe a URL'), required=False)
campos['hospedagem_interlegis_%s' % ts.pk] = forms.BooleanField(label=u'Serviço está hospedado no Interlegis', required=False) campos['hospedagem_interlegis_%s' % ts.pk] = forms.BooleanField(label=_(u'Serviço está hospedado no Interlegis'), required=False)
fieldsets += ((ts.nome, ('possui_%s' % ts.pk, 'url_%s' % ts.pk, 'hospedagem_interlegis_%s' % ts.pk)),) fieldsets += ((ts.nome, ('possui_%s' % ts.pk, 'url_%s' % ts.pk, 'hospedagem_interlegis_%s' % ts.pk)),)
CasaManifestaForm = type('', (CasaManifestaProtoForm,), campos) CasaManifestaForm = type('', (CasaManifestaProtoForm,), campos)
@ -100,20 +99,21 @@ def casa_manifesta_view(request):
cm.cargo = cmf.cleaned_data['cargo'] cm.cargo = cmf.cleaned_data['cargo']
cm.email = cmf.cleaned_data['email'] cm.email = cmf.cleaned_data['email']
cm.save() cm.save()
thanks.append((u'Informante', cmf.cleaned_data['informante'])) thanks.append((_(u'Informante'), cmf.cleaned_data['informante']))
thanks.append((u'Cargo', cmf.cleaned_data['cargo'])) thanks.append((_(u'Cargo'), cmf.cleaned_data['cargo']))
thanks.append((u'E-mail', cmf.cleaned_data['email'])) thanks.append((_(u'E-mail'), cmf.cleaned_data['email']))
for ts in TipoServico.objects.all(): for ts in TipoServico.objects.all():
if cmf.cleaned_data['possui_%s' % ts.pk]: if cmf.cleaned_data['possui_%s' % ts.pk]:
sm, created = ServicoManifesto.objects.get_or_create(casa_manifesta=cm, servico=ts) sm, created = ServicoManifesto.objects.get_or_create(casa_manifesta=cm, servico=ts)
sm.url = cmf.cleaned_data['url_%s' % ts.pk] sm.url = cmf.cleaned_data['url_%s' % ts.pk]
sm.hospedagem_interlegis = cmf.cleaned_data['hospedagem_interlegis_%s' % ts.pk] sm.hospedagem_interlegis = cmf.cleaned_data['hospedagem_interlegis_%s' % ts.pk]
sm.save() sm.save()
thanks.append((ts.nome, u'Possui o serviço acessível em %s %s' % (sm.url, u'hospedado no Interlegis' if thanks.append((ts.nome, _(u'Possui o serviço acessível em %(url)s %(obs)s') % dict(
sm.hospedagem_interlegis else ''))) url=sm.url,
obs=_(u'hospedado no Interlegis') if sm.hospedagem_interlegis else '')))
else: else:
ServicoManifesto.objects.filter(casa_manifesta=cm, servico=ts).delete() ServicoManifesto.objects.filter(casa_manifesta=cm, servico=ts).delete()
thanks.append((ts.nome, u'Não possui')) thanks.append((ts.nome, _(u'Não possui')))
extra_context = {'casa': casa, 'thanks': thanks} extra_context = {'casa': casa, 'thanks': thanks}
else: else:
extra_context = {'casa': casa, 'cmf': cmf} extra_context = {'casa': casa, 'cmf': cmf}

13
sigi/apps/servidores/admin.py

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import admin from django.contrib import admin
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from django.utils.translation import ugettext as _
from sigi.apps.contatos.models import Endereco, Telefone from sigi.apps.contatos.models import Endereco, Telefone
from sigi.apps.servidores.forms import FeriasForm, LicencaForm, FuncaoForm from sigi.apps.servidores.forms import FeriasForm, LicencaForm, FuncaoForm
@ -30,7 +31,7 @@ class FeriasAdmin(BaseModelAdmin):
class ServidorFilter(AlphabeticFilter): class ServidorFilter(AlphabeticFilter):
title = 'Nome do Servidor' title = _(u'Nome do Servidor')
parameter_name = 'servidor__nome_completo' parameter_name = 'servidor__nome_completo'
@ -64,7 +65,7 @@ class ServidorAdmin(BaseModelAdmin):
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'
is_active.boolean = True is_active.boolean = True
is_active.short_description = 'ativo' is_active.short_description = _(u'ativo')
list_display = ('nome_completo', 'is_active', 'foto', 'servico', ) list_display = ('nome_completo', 'is_active', 'foto', 'servico', )
list_filter = ('user__is_active', 'sexo', 'servico',) list_filter = ('user__is_active', 'sexo', 'servico',)
@ -74,16 +75,16 @@ class ServidorAdmin(BaseModelAdmin):
raw_id_fields = ('user',) raw_id_fields = ('user',)
inlines = (TelefonesInline, EnderecoInline) inlines = (TelefonesInline, EnderecoInline)
fieldsets = ( fieldsets = (
(u'Autenticação', { (_(u'Autenticação'), {
'fields': ('user',), 'fields': ('user',),
}), }),
('Cadastro', { (_(u'Cadastro'), {
'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal', 'data_nomeacao', 'ato_numero', 'ato_exoneracao') 'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal', 'data_nomeacao', 'ato_numero', 'ato_exoneracao')
}), }),
('Lotação', { (_(u'Lotação'), {
'fields': ('servico', 'turno', 'de_fora'), 'fields': ('servico', 'turno', 'de_fora'),
}), }),
(u'Observações', { (_(u'Observações'), {
'fields': ('apontamentos', 'obs'), 'fields': ('apontamentos', 'obs'),
}), }),
) )

47
sigi/apps/servidores/forms.py

@ -1,12 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from collections import namedtuple
from django import forms from django import forms
from django.utils.translation import ugettext as _
from sigi.apps.utils.validators import valida_data, valida_periodo_data
from sigi.apps.servidores.models import Ferias, Licenca, Funcao, Servidor from sigi.apps.servidores.models import Ferias, Licenca, Funcao, Servidor
def valida_data_inicial_menor_que_final(data, chave_ini, chave_fim):
if data.get(chave_ini) >= data.get(chave_fim):
raise forms.ValidationError(_(
u"A data de início deve ser menor que a data final. Verifique novamente"))
class FeriasForm(forms.ModelForm): class FeriasForm(forms.ModelForm):
class Meta: class Meta:
@ -15,9 +20,7 @@ class FeriasForm(forms.ModelForm):
def clean(self): def clean(self):
data = self.cleaned_data data = self.cleaned_data
if valida_data(data.get('inicio_ferias'), data.get('fim_ferias')): valida_data_inicial_menor_que_final(data, 'inicio_ferias', 'fim_ferias')
raise forms.ValidationError(u"""A data de início deve ser menor
que a data final. Verifique novamente""")
return data return data
@ -29,12 +32,17 @@ class LicencaForm(forms.ModelForm):
def clean(self): def clean(self):
data = self.cleaned_data data = self.cleaned_data
if valida_data(data.get('inicio_licenca'), data.get('fim_licenca')): valida_data_inicial_menor_que_final(data, 'inicio_licenca', 'fim_licenca')
raise forms.ValidationError(u"""A data de início deve ser menor
que a data final. Verifique novamente""")
return data return data
Periodo = namedtuple('Periodo', ['ini', 'fim'])
def periodos_se_sobrepoe(periodo1, periodo2):
return not (periodo1.fim < periodo2.ini or periodo2.fim < periodo1.ini)
class FuncaoForm(forms.ModelForm): class FuncaoForm(forms.ModelForm):
class Meta: class Meta:
@ -43,24 +51,15 @@ class FuncaoForm(forms.ModelForm):
def clean(self): def clean(self):
data = self.cleaned_data data = self.cleaned_data
if valida_data(data.get('inicio_funcao'), data.get('fim_funcao')): valida_data_inicial_menor_que_final(data, 'inicio_funcao', 'fim_funcao')
raise forms.ValidationError(u"""A data de início deve ser menor
que a data final. Verifique
novamente""")
# Verifica na função anterior, se o seu período é igual # Verifica na função anterior, se o seu período é igual
# ou está entre o período da função atual. # ou está entre o período da função atual.
servidor = Servidor.objects.get(nome_completo=data.get('servidor')) servidor = Servidor.objects.get(nome_completo=data.get('servidor'))
if len(servidor.funcao_set.all()): for funcao in servidor.funcao_set.all():
if len(servidor.funcao_set.all()) > 1: if periodos_se_sobrepoe(
funcao_anterior = servidor.funcao_set.all()[1] Periodo(funcao.inicio_funcao, funcao.fim_funcao),
elif len(servidor.funcao_set.all()) == 1: Periodo(data.get('inicio_funcao'), data.get('fim_funcao'))):
funcao_anterior = servidor.funcao_set.all()[0] raise forms.ValidationError(_(
u"Este período coincide com o de outra função exercida."))
if valida_periodo_data(funcao_anterior.inicio_funcao,
funcao_anterior.fim_funcao, data.get('inicio_funcao'),
data.get('fim_funcao')):
raise forms.ValidationError(u"""Você não pode exercer
uma função no mesmo período que a anterior, como também,
não pode ser entre o período da mesma.""")
return data return data

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

@ -1,12 +1,15 @@
# coding= utf-8 # coding= utf-8
import sys
import csv import csv
import re import re
from datetime import datetime from datetime import datetime
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import User from django.contrib.auth.models import User
from sigi.apps.servidores.models import Servidor, Servico, Subsecretaria, Funcao, Ferias, Licenca from django.core.management.base import BaseCommand
from django.utils.translation import ugettext as _
from sigi.apps.contatos.models import Municipio from sigi.apps.contatos.models import Municipio
from sigi.apps.servidores.models import Servidor, Servico, Subsecretaria
# Funcao.objects.all().delete() # Funcao.objects.all().delete()
# Ferias.objects.all().delete() # Ferias.objects.all().delete()
@ -21,7 +24,7 @@ class MigrationError(Exception):
class Command(BaseCommand): class Command(BaseCommand):
help = 'Migra usuários do antigo Sistema de RH' help = _(u'Migra usuários do antigo Sistema de RH')
def to_date(self, data): def to_date(self, data):
return datetime.strptime(data, "%Y-%m-%d 00:00:00") return datetime.strptime(data, "%Y-%m-%d 00:00:00")
@ -222,7 +225,7 @@ class Command(BaseCommand):
funcao.bap_saida = p['bap_saida'] funcao.bap_saida = p['bap_saida']
funcao.save() funcao.save()
if re.search(r'estagi.ri[o|a]', p['cargo'], re.I): if re.search(r'estagi.ri[o|a]', p['cargo'], re.I): # XXX i18n
# TODO inserir dados de estagio # TODO inserir dados de estagio
pass pass

11
sigi/apps/servidores/models.py

@ -1,8 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib.auth.models import User
from django.contrib.contenttypes import generic
from django.db import models from django.db import models
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.contrib.contenttypes import generic from django.utils.translation import ugettext as _
from django.contrib.auth.models import User
class Subsecretaria(models.Model): class Subsecretaria(models.Model):
@ -27,7 +28,7 @@ class Servico(models.Model):
""" Modelo para representação dos Serviços de uma Subsecretaria """ Modelo para representação dos Serviços de uma Subsecretaria
""" """
nome = models.CharField(u'Setor', max_length=250, null=True) nome = models.CharField(_(u'Setor'), max_length=250, null=True)
sigla = models.CharField(max_length=10, null=True) sigla = models.CharField(max_length=10, null=True)
subsecretaria = models.ForeignKey(Subsecretaria, null=True) subsecretaria = models.ForeignKey(Subsecretaria, null=True)
# servidor responsavel por chefiar o serviço # servidor responsavel por chefiar o serviço
@ -35,8 +36,8 @@ class Servico(models.Model):
class Meta: class Meta:
ordering = ('nome',) ordering = ('nome',)
verbose_name = 'serviço' verbose_name = _(u'serviço')
verbose_name_plural = 'serviços' verbose_name_plural = _(u'serviços')
def __unicode__(self): def __unicode__(self):
return '%s (%s)' % (unicode(self.nome), unicode(self.sigla)) return '%s (%s)' % (unicode(self.nome), unicode(self.sigla))

9
sigi/apps/servidores/templates/admin/servidores/servidor/change_form.html

@ -1,16 +1,17 @@
{% extends 'base_change_form.html' %} {% extends 'base_change_form.html' %}
{% load i18n %}
{% block form_top %} {% block form_top %}
{% if adminform.form.instance.user %} {% if adminform.form.instance.user %}
<fieldset style="background:transparent" id="fieldset-2" class="_module _aligned"> <fieldset style="background:transparent" id="fieldset-2" class="_module _aligned">
<legend> <legend>
Dados do LDAP {% trans 'Dados do LDAP' %}
</legend> </legend>
<div class="fields"> <div class="fields">
<div class="row"><div class="control-group"> <div class="row"><div class="control-group">
<div class="col-md-12 form-group "> <div class="col-md-12 form-group ">
<div class="control-label col-md-3"> <div class="control-label col-md-3">
<label>Primeiro Nome:</label> <label>{% trans 'Primeiro Nome' %}:</label>
</div> </div>
<div class="controls col-md-9"> <div class="controls col-md-9">
<p class="form-control-static">{{adminform.form.instance.user.first_name}}</p> <p class="form-control-static">{{adminform.form.instance.user.first_name}}</p>
@ -20,7 +21,7 @@
<div class="row"><div class="control-group"> <div class="row"><div class="control-group">
<div class="col-md-12 form-group "> <div class="col-md-12 form-group ">
<div class="control-label col-md-3"> <div class="control-label col-md-3">
<label>Último Nome:</label> <label>{% trans 'Último Nome' %}:</label>
</div> </div>
<div class="controls col-md-9"> <div class="controls col-md-9">
<p class="form-control-static">{{adminform.form.instance.user.last_name}}</p> <p class="form-control-static">{{adminform.form.instance.user.last_name}}</p>
@ -30,7 +31,7 @@
<div class="row"><div class="control-group"> <div class="row"><div class="control-group">
<div class="col-md-12 form-group "> <div class="col-md-12 form-group ">
<div class="control-label col-md-3"> <div class="control-label col-md-3">
<label>Email Principal:</label> <label>{% trans 'Email Principal' %}:</label>
</div> </div>
<div class="controls col-md-9"> <div class="controls col-md-9">
<p class="form-control-static">{{adminform.form.instance.user.email}}</p> <p class="form-control-static">{{adminform.form.instance.user.email}}</p>

4
sigi/apps/servidores/templates/admin/servidores/servidor/change_list.html

@ -4,11 +4,11 @@
{% block object-tools-items %} {% block object-tools-items %}
<li><a href="/servidores/servidores_por_cargo.pdf" class="historylink"> <li><a href="/servidores/servidores_por_cargo.pdf" class="historylink">
<span class="glyphicon glyphicon-list-alt"></span> <span class="glyphicon glyphicon-list-alt"></span>
Relatório por cargo {% trans 'Relatório por cargo' %}
</a></li> </a></li>
<li><a href="/servidores/servidores_por_funcao.pdf" class="historylink"> <li><a href="/servidores/servidores_por_funcao.pdf" class="historylink">
<span class="glyphicon glyphicon-list-alt"></span> <span class="glyphicon glyphicon-list-alt"></span>
Relatório por função {% trans 'Relatório por função' %}
</a></li> </a></li>
{{ block.super }} {{ block.super }}
{% endblock %} {% endblock %}

11
sigi/apps/servidores/templates/servidores/servidores_por_cargo.html

@ -1,4 +1,5 @@
{% extends "base_report.html" %} {% extends "base_report.html" %}
{% load i18n %}
{% block extra_head %} {% block extra_head %}
<style type="text/css"> <style type="text/css">
@ -21,17 +22,17 @@
{% endblock %} {% endblock %}
{% block subsecretaria %} {% block subsecretaria %}
SUBSECRETARIA DE ADMINISTRAÇÃO – SSADM {% trans 'SUBSECRETARIA DE ADMINISTRAÇÃO – SSADM' %}
{% endblock %} {% endblock %}
{% block report %} {% block report %}
<div> <div>
<h1>Relatório de Servidores por Cargo</h1> <h1>{% trans 'Relatório de Servidores por Cargo' %}</h1>
<table class="report"> <table class="report">
<tr class="title"> <tr class="title">
<td class="index"></td> <td class="index"></td>
<td>Cargo</td> <td>{% trans 'Cargo' %}</td>
<td>Servidores</td> <td>{% trans 'Servidores' %}</td>
</tr> </tr>
{% for r in report %} {% for r in report %}
<tr class="data"> <tr class="data">
@ -42,7 +43,7 @@ SUBSECRETARIA DE ADMINISTRAÇÃO – SSADM
{% endfor %} {% endfor %}
<tr class="data total"> <tr class="data total">
<td></td> <td></td>
<td>Total</td> <td>{% trans 'Total' %}</td>
<td>{{ total }}</td> <td>{{ total }}</td>
</tr> </tr>
</table> </table>

11
sigi/apps/servidores/templates/servidores/servidores_por_funcao.html

@ -1,4 +1,5 @@
{% extends "base_report.html" %} {% extends "base_report.html" %}
{% load i18n %}
{% block extra_head %} {% block extra_head %}
<style type="text/css"> <style type="text/css">
@ -21,17 +22,17 @@
{% endblock %} {% endblock %}
{% block subsecretaria %} {% block subsecretaria %}
SUBSECRETARIA DE ADMINISTRAÇÃO – SSADM {% trans 'SUBSECRETARIA DE ADMINISTRAÇÃO – SSADM' %}
{% endblock %} {% endblock %}
{% block report %} {% block report %}
<div> <div>
<h1>Relatório de Servidores por Função</h1> <h1>{% trans 'Relatório de Servidores por Função' %}</h1>
<table class="report"> <table class="report">
<tr class="title"> <tr class="title">
<td class="index"></td> <td class="index"></td>
<td>Função</td> <td>{% trans 'Função' %}</td>
<td>Servidores</td> <td>{% trans 'Servidores' %}</td>
</tr> </tr>
{% for r in report %} {% for r in report %}
<tr class="data"> <tr class="data">
@ -42,7 +43,7 @@ SUBSECRETARIA DE ADMINISTRAÇÃO – SSADM
{% endfor %} {% endfor %}
<tr class="data total"> <tr class="data total">
<td></td> <td></td>
<td>Total</td> <td>{% trans 'Total' %}</td>
<td>{{ total }}</td> <td>{{ total }}</td>
</tr> </tr>
</table> </table>

31
sigi/apps/servidores/test_servidores_forms.py

@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
from django import forms
import pytest
from datetime import date
from sigi.apps.servidores.forms import valida_data_inicial_menor_que_final, Periodo, periodos_se_sobrepoe
@pytest.mark.parametrize('data', [
dict(ini=1, fim=2),
pytest.mark.xfail(raises=forms.ValidationError)(dict(ini=2, fim=1)),
pytest.mark.xfail(raises=forms.ValidationError)(dict(ini=1, fim=1)),
])
def test_valida_data_inicial_menor_que_final(data):
valida_data_inicial_menor_que_final(data, 'ini', 'fim')
periodos = [
[Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2001, 1, 1), date(2002, 2, 2)), True], # um dia de interseção
[Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2001, 1, 2), date(2002, 2, 2)), False], # exatamente um dia após
[Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2000, 12, 2), date(2002, 2, 2)), True],
[Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2014, 1, 1), date(2014, 2, 2)), False],
]
# para testar que a ordem dos parametros nao importa
periodos_trocados = [[b, a, res] for [a, b, res] in periodos]
@pytest.mark.parametrize('periodo1, periodo2, resultado', periodos + periodos_trocados)
def test_periodos_se_sobrepoe(periodo1, periodo2, resultado):
assert periodos_se_sobrepoe(periodo1, periodo2) == resultado

4
sigi/apps/utils/admin_widgets.py

@ -1,6 +1,6 @@
from django.contrib.admin.widgets import AdminFileWidget from django.contrib.admin.widgets import AdminFileWidget
from django.utils.translation import ugettext as _
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.translation import ugettext as _
class AdminImageWidget(AdminFileWidget): class AdminImageWidget(AdminFileWidget):
@ -13,6 +13,6 @@ class AdminImageWidget(AdminFileWidget):
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, _(u'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))

14
sigi/apps/utils/email.py

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings from django.conf import settings
from django.core.mail import EmailMessage
from django.template.loader import render_to_string
from django.utils.translation import ugettext as _
def enviar_email(from_email, subject, template, tags): def enviar_email(from_email, subject, template, tags):
@ -16,13 +16,13 @@ def enviar_email(from_email, subject, template, tags):
template. template.
""" """
if from_email is None: if from_email is None:
raise ValueError("Insira o email do remetente.") raise ValueError(_(u"Insira o email do remetente."))
elif subject is None: elif subject is None:
raise ValueError("Insira o assunto da mensagem.") raise ValueError(_(u"Insira o assunto da mensagem."))
elif template is None: elif template is None:
raise ValueError(u"Template da mensagem não encontrado") raise ValueError(_(u"Template da mensagem não encontrado"))
elif tags is None: elif tags is None:
raise ValueError("Insira o conteúdo da mensagem.") raise ValueError(_(u"Insira o conteúdo da mensagem."))
# Gerando a mensagem # Gerando a mensagem
mensagem = render_to_string(template, tags) mensagem = render_to_string(template, tags)

26
sigi/apps/utils/test_base_admin.py

@ -1,15 +1,23 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
def test_clear_all_filters_is_disabled_if_no_filter_was_used(admin_client): def get_li_clear_all_filters(res):
response = admin_client.get('/parlamentares/parlamentar', follow=True) text = res.html.find(text='Clear All Filters')
assert response.status_code == 200 li = text.find_parent('li')
assert '<li class="clear-all-filter disabled"><a href="?">Clear All Filters</a></li>' in response.content assert li
return li
def test_clear_all_filters_is_enabled_if_some_filter_was_used(admin_client): def test_clear_all_filters_is_disabled_if_no_filter_was_used(app):
res = app.get('/parlamentares/parlamentar/')
assert res.status_code == 200
li = get_li_clear_all_filters(res)
assert 'disabled' in li.attrs['class']
def test_clear_all_filters_is_enabled_if_some_filter_was_used(app):
# now we filter by capital letter # now we filter by capital letter
response = admin_client.get('/parlamentares/parlamentar/?nome_completo=B', follow=True) res = app.get('/parlamentares/parlamentar/?nome_completo=B')
assert response.status_code == 200 assert res.status_code == 200
# and there is no "disabled" css class li = get_li_clear_all_filters(res)
assert '<li class="clear-all-filter"><a href="?">Clear All Filters</a></li>' in response.content assert 'disabled' not in li.attrs['class']

42
sigi/apps/utils/validators.py

@ -1,42 +0,0 @@
# -*- coding: utf-8 -*-
def valida_data(data_inicio, data_final):
"""Função responsável por validar se o intervalo das
datas estão erradas, ou seja, se a data de início está
maior ou igual a data final.
Caso seja maior ou igual retornará ``True``, caso contrário
retornará ``False``.
"""
if data_inicio >= data_final:
return True
else:
return False
def valida_periodo_data(di01, df01, di02, df02):
"""Função responsável por validar dois períodos de datas.
Isso é usado para verificar se determinado servidor exerceu
mais de uma função dentro de determinados períodos descritos
abaixo:
1 - A segunda função não pode ter exercido ao mesmo tempo que
a primeira função. Exemplo:
Primeiro Função: 01/05/2011 -- 01/11/2011
Segundo Função: 01/05/2011 -- 01/11/2011
2 - A segunda função não pode ter exercido, dentro do período
da primeira função. Exemplo:
Primeira Função: 01/05/2011 -- 01/11/2011
Segunda Função: 02/05/2011 -- 30/10/2011
"""
# Verificando a primeira situação
if di01 == di02 and df01 == df02:
return True
elif ((di01 >= di02) or (di02 <= df01)) and df01 <= df02:
return True
else:
return False

24
sigi/context_processors.py

@ -1,12 +1,14 @@
#-*- coding:utf-8 -*- #-*- coding:utf-8 -*-
from itertools import cycle from itertools import cycle
import datetime import datetime
from django.utils.translation import ugettext as _
from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.convenios.models import Convenio, Projeto from sigi.apps.convenios.models import Convenio, Projeto
from sigi.apps.servicos.models import TipoServico
from sigi.apps.diagnosticos.models import Diagnostico from sigi.apps.diagnosticos.models import Diagnostico
from sigi.apps.metas.models import Meta from sigi.apps.metas.models import Meta
from sigi.apps.servicos.models import TipoServico
def charts_data(request): def charts_data(request):
@ -81,14 +83,14 @@ def busca_informacoes_camara():
# Cabecalho da esquerda na tabela # Cabecalho da esquerda na tabela
cabecalho_esquerda = ( cabecalho_esquerda = (
u'Câmaras municipais', _(u'Câmaras municipais'),
u'Câmaras municipais não aderidas', _(u'Câmaras municipais não aderidas'),
u'Câmaras municipais aderidas', _(u'Câmaras municipais aderidas'),
u'Câmaras municipais com convênios assinados', _(u'Câmaras municipais com convênios assinados'),
u'Câmaras municipais convênios em andamento', _(u'Câmaras municipais convênios em andamento'),
u'Câmaras municipais equipadas', _(u'Câmaras municipais equipadas'),
u'Diagnósticos digitados', _(u'Diagnósticos digitados'),
u'Diagnósticos publicados' _(u'Diagnósticos publicados')
) )
linhas = ( linhas = (
@ -184,6 +186,6 @@ def busca_informacoes_seit():
def busca_informacoes_diagnostico(): def busca_informacoes_diagnostico():
return [ return [
{'title': 'Diagnósticos digitados', 'count': Diagnostico.objects.count()}, {'title': _(u'Diagnósticos digitados'), 'count': Diagnostico.objects.count()},
{'title': 'Diagnósticos publicados', 'count': Diagnostico.objects.filter(publicado=True).count()}, {'title': _(u'Diagnósticos publicados'), 'count': Diagnostico.objects.filter(publicado=True).count()},
] ]

1
sigi/fixtures/treemenus/initial-data.json

File diff suppressed because one or more lines are too long

39
sigi/settings/base.py

@ -32,6 +32,7 @@ SITE_ID = 1
TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS + ( TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS + (
'sigi.context_processors.charts_data', 'sigi.context_processors.charts_data',
'django.core.context_processors.request',
) )
# List of callables that know how to import templates from various sources. # List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = ('django.template.loaders.filesystem.Loader', TEMPLATE_LOADERS = ('django.template.loaders.filesystem.Loader',
@ -55,6 +56,7 @@ INSTALLED_APPS = (
'django.contrib.staticfiles', 'django.contrib.staticfiles',
# Local apps # Local apps
'sigi.apps.home',
'sigi.apps.contatos', 'sigi.apps.contatos',
'sigi.apps.servidores', 'sigi.apps.servidores',
'sigi.apps.parlamentares', 'sigi.apps.parlamentares',
@ -77,7 +79,6 @@ INSTALLED_APPS = (
'reporting', 'reporting',
'django_extensions', 'django_extensions',
'googlecharts', 'googlecharts',
'treemenus',
'easy_thumbnails', 'easy_thumbnails',
'image_cropping', 'image_cropping',
@ -131,10 +132,6 @@ SESSION_EXPIRE_AT_BROWSER_CLOSE = True
# Using pytest directly (without a test runner) # Using pytest directly (without a test runner)
TEST_RUNNER = None TEST_RUNNER = None
# Validate arguments in django-dynamic-fixture
# http://django-dynamic-fixture.readthedocs.org/en/latest/more.html?highlight=ddf_validate_args#validate-arguments-new-in-1-5-0
DDF_VALIDATE_ARGS = True
from easy_thumbnails.conf import Settings as thumbnail_settings from easy_thumbnails.conf import Settings as thumbnail_settings
THUMBNAIL_PROCESSORS = ( THUMBNAIL_PROCESSORS = (
'image_cropping.thumbnail_processors.crop_corners', 'image_cropping.thumbnail_processors.crop_corners',
@ -142,8 +139,38 @@ THUMBNAIL_PROCESSORS = (
THUMBNAIL_ALIASES = { THUMBNAIL_ALIASES = {
'': { '': {
'small': {'size': (300, 225), 'crop': True,}, 'small': {'size': (300, 225), 'crop': True, },
}, },
} }
IMAGE_CROPPING_SIZE_WARNING = True IMAGE_CROPPING_SIZE_WARNING = True
IMAGE_CROPPING_THUMB_SIZE = (800, 600) IMAGE_CROPPING_THUMB_SIZE = (800, 600)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
'filters': ['require_debug_false'],
},
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/var/log/sigi/application.log',
},
},
'loggers': {
'django.request': {
'handlers': ['mail_admins', 'file'],
'level': 'ERROR',
'propagate': True,
},
},
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save