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. 74
      sigi/apps/diagnosticos/templates/diagnosticos/diagnostico_pdf.html
  34. 14
      sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_categoria_casa_legislativa_form.html
  35. 16
      sigi/apps/diagnosticos/templates/diagnosticos/diagnosticos_categoria_contatos_form.html
  36. 14
      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. 7
      sigi/apps/metas/templates/metas/dashboard.html
  59. 17
      sigi/apps/metas/templates/metas/map_list.html
  60. 23
      sigi/apps/metas/templates/metas/map_sum.html
  61. 30
      sigi/apps/metas/templates/metas/mapa.html
  62. 23
      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. 41
      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
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')
def app(request):
def app(request, admin_user):
"""WebTest's TestApp.
Patch and unpatch settings before and after each test.
@ -17,4 +39,4 @@ def app(request):
wtm = WebTestMixin()
wtm._patch_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
# para testes
coverage==3.7.1
pytest-django==2.7.0
WebTest==2.0.16
django-webtest==1.7.7
django-dynamic-fixture==1.7.0
coverage==3.7.1
pytest-cov==1.8.0
pyPdf==1.13
pyquery==1.2.9
# para desevolvimento
django-debug-toolbar==1.2.1

1
requirements/producao.txt

@ -5,7 +5,6 @@ django-autoslug==1.7.2
django-extensions==1.4.0
git+git://github.com/jacobian/django-googlecharts.git@c542996cf9a7a097b447e1ce5a1a6b66bdad254f#egg=django_googlecharts
django-localflavor==1.0
django-treemenus==0.9.1
eav-django==1.4.7
html5lib==0.999
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.contenttypes import generic
from django.http import HttpResponseRedirect
from django.utils.translation import ugettext as _
from image_cropping import ImageCroppingMixin
from sigi.apps.casas.forms import CasaLegislativaForm
@ -46,7 +47,7 @@ class FuncionariosInline(admin.StackedInline):
inlines = (TelefonesInline,)
def get_queryset(self, request):
return self.model.objects.exclude(cargo="Presidente")
return self.model.objects.exclude(cargo=_(u"Presidente"))
class ConveniosInline(admin.StackedInline):
@ -64,17 +65,17 @@ class ConveniosInline(admin.StackedInline):
def get_tramitacoes(self, obj):
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
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()])
get_anexos.short_description = 'Anexos'
get_anexos.short_description = _(u'Anexos')
get_anexos.allow_tags = True
def get_equipamentos(self, obj):
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
def link_convenio(self, obj):
@ -88,7 +89,7 @@ class ConveniosInline(admin.StackedInline):
Editar
</a>""" % (obj.pk, obj.pk, url)
link_convenio.short_description = 'Editar convenio'
link_convenio.short_description = _(u'Editar convenio')
link_convenio.allow_tags = True
@ -108,7 +109,7 @@ class LegislaturaInline(admin.TabularInline):
Editar
</a>""" % (obj.pk, obj.pk, url)
link_parlamentares.short_description = 'Parlamentares'
link_parlamentares.short_description = _(u'Parlamentares')
link_parlamentares.allow_tags = True
@ -130,7 +131,7 @@ class DiagnosticoInline(admin.TabularInline):
Abrir PDF
</a>""" % (obj.pk, obj.pk, url)
link_diagnostico.short_description = 'Ver PDF'
link_diagnostico.short_description = _(u'Ver PDF')
link_diagnostico.allow_tags = True
@ -174,11 +175,11 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin):
(None, {
'fields': ('tipo', 'nome', 'cnpj', 'num_parlamentares', 'gerente_contas')
}),
('Endereço', {
(_(u'Endereço'), {
'fields': ('data_instalacao', 'logradouro', 'bairro',
'municipio', 'cep', 'pagina_web', 'email', 'ult_alt_endereco'),
}),
('Outras informações', {
(_(u'Outras informações'), {
'fields': ('observacoes', 'foto', 'recorte'),
}),
)
@ -190,7 +191,7 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin):
def get_convenios(self, obj):
return '<ul>' + ''.join(['<li>%s</li>' % c.__unicode__() for c in obj.convenio_set.all()]) + '</ul>'
get_convenios.short_description = u'Convênios'
get_convenios.short_description = _(u'Convênios')
get_convenios.allow_tags = True
def changelist_view(self, request, extra_context=None):
@ -205,23 +206,23 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin):
def etiqueta(self, request, 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):
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):
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):
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):
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):
if 'carrinho_casas' in request.session:
@ -233,12 +234,12 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin):
q2 = len(request.session['carrinho_casas'])
quant = q2 - q1
if quant:
self.message_user(request, str(q2 - q1) + " Casas Legislativas adicionadas no carrinho")
self.message_user(request, str(q2 - q1) + " " + _(u"Casas Legislativas adicionadas no carrinho"))
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('.')
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):
actions = super(CasaLegislativaAdmin, self).get_actions(request)

9
sigi/apps/casas/forms.py

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

114
sigi/apps/casas/reports.py

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

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

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

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

@ -7,15 +7,15 @@
{% endblock %}
{% block title %}Casas legislativas no Carrinho | SIGI{% endblock %}
{% block content_title %}<h1>Casas Legislativas no Carrinho</h1>{% endblock %}
{% block title %}{% trans 'Casas legislativas no Carrinho | SIGI' %}{% endblock %}
{% block content_title %}<h1>{% trans 'Casas Legislativas no Carrinho' %}</h1>{% endblock %}
{% block mensagem%}
<ul class="messagelist">
{%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%}
<li>{{paginas.paginator.count}} Casas Legislativas no carrinho.</li>
<li>{{paginas.paginator.count}} {% trans 'Casas Legislativas no carrinho' %}.</li>
{%endif%}
</ul>
{% endblock %}
@ -30,10 +30,10 @@
<th class="sorted ascending"><!-- <input type="checkbox" id="action-toggle" style="display: inline;">-->
</th>
{% endif %}
<th class="sorted ascending">Nome</th>
<th class="sorted ascending">Município</th>
<th class="sorted ascending">Presidente</th>
<th class="sorted ascending">Endereço</th>
<th class="sorted ascending">{% trans 'Nome' %}</th>
<th class="sorted ascending">{% trans 'Município' %}</th>
<th class="sorted ascending">{% trans 'Presidente' %}</th>
<th class="sorted ascending">{% trans 'Endereço' %}</th>
</tr>
</thead>
<tbody>
@ -56,24 +56,24 @@
{% block botoes %}
<div id="tabs">
<ul>
<li><a href="#tabs-1">Etiqueta</a></li>
<li><a href="#tabs-2">Relatório</a></li>
<li><a href="#tabs-3">Arquivo CSV (Excel, Calc)</a></li>
<li><a href="#tabs-4">Etiqueta Parlamentares</a></li>
<li><a href="#tabs-1">{% trans 'Etiqueta' %}</a></li>
<li><a href="#tabs-2">{% trans 'Relatório' %}</a></li>
<li><a href="#tabs-3">{% trans 'Arquivo CSV (Excel, Calc)' %}</a></li>
<li><a href="#tabs-4">{% trans 'Etiqueta Parlamentares' %}</a></li>
</ul>
<div id="tabs-1">
<form action="../labels/{{query_str}}" method="post">{% csrf_token %}
<fieldset><legend>Tipo de etiqueta</legend>
<form id="generate_labels" action="../labels/{{query_str}}" method="post">{% csrf_token %}
<fieldset><legend>{% trans 'Tipo de etiqueta' %}</legend>
<ul class="tabs-conteudo">
<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"
value="sem_presidente" checked="checked">
<label>Sem Presidente</label></li>
<label>{% trans 'Sem Presidente' %}</label></li>
</ul>
</fieldset>
<fieldset><legend>Formato da Etiqueta</legend>
<fieldset><legend>{% trans 'Formato da Etiqueta' %}</legend>
<ul class="formato_etiqueta">
<li><input type="radio" name="tamanho_etiqueta"
value="2x5_etiqueta"><label>2x5</label></li>
@ -90,11 +90,11 @@
</div>
<div id="tabs-2">
<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">
<li><input type="radio" name="tipo_relatorio" value="simples"
checked="checked"><label>Simples</label></li>
<li><input type="radio" name="tipo_relatorio" value="completo"><label>Completo</label></li>
checked="checked"><label>{% trans 'Simples' %}</label></li>
<li><input type="radio" name="tipo_relatorio" value="completo"><label>{% trans 'Completo' %}</label></li>
</ul>
</fieldset>
<ul class="botoes">
@ -104,107 +104,107 @@
</div>
<div id="tabs-3">
<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">
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="CNPJ"
class="action-select" checked="checked" />
<label>CNPJ</label>
<label>{% trans 'CNPJ' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Código IBGE" class="action-select" checked="checked" />
<label>Código IBGE</label>
<label>{% trans 'Código IBGE' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Código TSE" class="action-select" checked="checked" />
<label>Código TSE</label>
<label>{% trans 'Código TSE' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Nome"
class="action-select" checked="checked" />
<label>Nome</label>
<label>{% trans 'Nome' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Município" class="action-select" checked="checked" />
<label>Município</label></li>
<label>{% trans 'Município' %}</label></li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Presidente" class="action-select" checked="checked" />
<label>Presidente</label></li>
<label>{% trans 'Presidente' %}</label></li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Logradouro" class="action-select" checked="checked" />
<label>Endereço</label></li>
<label>{% trans 'Endereço' %}</label></li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Bairro" class="action-select" checked="checked" />
<label>Bairro</label></li>
<label>{% trans 'Bairro' %}</label></li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="CEP"
class="action-select" checked="checked" />
<label>CEP</label>
<label>{% trans 'CEP' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Telefone" class="action-select" checked="checked" />
<label>Telefone</label>
<label>{% trans 'Telefone' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Página web" class="action-select" checked="checked" />
<label>Página Web</label>
<label>{% trans 'Página Web' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Email" class="action-select" checked="checked" />
<label>Email</label>
<label>{% trans 'Email' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
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>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
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>
</ul>
</fieldset>
<fieldset><legend>Contato Interlegis</legend>
<fieldset><legend>{% trans 'Contato Interlegis' %}</legend>
<ul id="sortable" class="tabs-conteudo">
<li><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Nome contato" class="action-select" checked="checked" />
<label>Nome</label>
<label>{% trans 'Nome' %}</label>
</li>
<li><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Cargo contato" class="action-select" checked="checked" />
<label>Cargo</label>
<label>{% trans 'Cargo' %}</label>
</li>
<li><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected"
value="Email contato" class="action-select" checked="checked" />
<label>Email</label>
<label>{% trans 'Email' %}</label>
</li>
</ul>
</fieldset>
@ -215,7 +215,7 @@
</div>
<div id="tabs-4">
<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">
<li><input type="radio" name="tamanho_etiqueta"
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 -*-
import csv
from functools import reduce
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.utils.translation import ugettext as _
from geraldo.generators import PDFGenerator
from sigi.apps.casas.models import CasaLegislativa, Funcionario
from sigi.apps.casas.reports import CasasLegislativasLabels
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.casas.models import CasaLegislativa
from sigi.apps.casas.reports import CasasLegislativasLabels, CasasLegislativasLabelsSemPresidente, CasasLegislativasReport, CasasSemConvenioReport, InfoCasaLegislativa
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 o: (int) number of order field
@ -109,7 +103,6 @@ def visualizar_carrinho(request):
request,
'casas/carrinho.html',
{
'MEDIA_URL': settings.MEDIA_URL,
'carIsEmpty': carrinhoIsEmpty,
'paginas': paginas,
'query_str': '?' + request.META['QUERY_STRING']
@ -327,7 +320,7 @@ def export_csv(request):
atributos2 = [s.encode("utf-8") for s in atributos]
try:
atributos2.insert(atributos2.index('Município'), u'UF')
atributos2.insert(atributos2.index(_(u'Município')), _(u'UF'))
except ValueError:
pass
@ -337,49 +330,49 @@ def export_csv(request):
lista = []
contatos = casa.funcionario_set.filter(setor="contato_interlegis")
for atributo in atributos:
if u"CNPJ" == atributo:
if _(u"CNPJ") == atributo:
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"))
elif u"Código TSE" == atributo:
elif _(u"Código TSE") == atributo:
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"))
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.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
# É 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 ""))
elif u"Logradouro" == atributo:
elif _(u"Logradouro") == atributo:
lista.append(casa.logradouro.encode("utf-8"))
elif u"Bairro" == atributo:
elif _(u"Bairro") == atributo:
lista.append(casa.bairro.encode("utf-8"))
elif u"CEP" == atributo:
elif _(u"CEP") == atributo:
lista.append(casa.cep.encode("utf-8"))
elif u"Telefone" == atributo:
elif _(u"Telefone") == atributo:
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"))
elif u"Email" == atributo:
elif _(u"Email") == atributo:
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)
elif u"Última alteração de endereco" == atributo:
elif _(u"Última alteração de endereco") == atributo:
lista.append(casa.ult_alt_endereco)
elif u"Nome contato" == atributo:
elif _(u"Nome contato") == atributo:
if contatos and contatos[0].nome:
lista.append(contatos[0].nome.encode("utf-8"))
else:
lista.append('')
elif u"Cargo contato" == atributo:
elif _(u"Cargo contato") == atributo:
if contatos and contatos[0].cargo:
lista.append(contatos[0].cargo.encode("utf-8"))
else:
lista.append('')
elif u"Email contato" == atributo:
elif _(u"Email contato") == atributo:
if contatos and contatos[0].email:
lista.append(contatos[0].email.encode("utf-8"))
else:

4
sigi/apps/contatos/admin.py

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

11
sigi/apps/contatos/filters.py

@ -1,11 +1,12 @@
# coding: utf-8
from django.contrib import admin
from django.utils.translation import ugettext as _
class PopulationFilter(admin.SimpleListFilter):
# Human-readable title which will be displayed in the
# 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_name = 'faixa'
@ -19,10 +20,10 @@ class PopulationFilter(admin.SimpleListFilter):
in the right sidebar.
"""
return (
('1', '< 100 Mil'),
('2', '100 Mil a 1 Milhão'),
('3', '1 Milhão a 100 Milhões'),
('4', '> 100 Milhões'),
('1', _(u'< 100 Mil')),
('2', _(u'100 Mil a 1 Milhão')),
('3', _(u'1 Milhão a 100 Milhões')),
('4', _(u'> 100 Milhões')),
)
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 -*-
from django.db import models
from django.contrib.contenttypes.models import ContentType
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.db import models
from django.utils.translation import ugettext as _
from sigi.apps.utils import SearchField
class UnidadeFederativa(models.Model):
@ -11,33 +13,33 @@ class UnidadeFederativa(models.Model):
""" Modelo que representa um estado brasileiro
"""
REGIAO_CHOICES = (
('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')),
)
codigo_ibge = models.PositiveIntegerField(
u'código IBGE',
primary_key=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
search_text = SearchField(field_names=['nome'])
sigla = models.CharField(
max_length=2,
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)
populacao = models.PositiveIntegerField('população')
regiao = models.CharField(_(u'região'), max_length=2, choices=REGIAO_CHOICES)
populacao = models.PositiveIntegerField(_(u'população'))
class Meta:
ordering = ('nome',)
verbose_name = 'Unidade Federativa'
verbose_name_plural = 'Unidades Federativas'
ordering = (_(u'nome'),)
verbose_name = _(u'Unidade Federativa')
verbose_name_plural = _(u'Unidades Federativas')
def __unicode__(self):
return self.nome
@ -48,41 +50,41 @@ class Municipio(models.Model):
""" Modelo para representar as cidades brasileiras
"""
codigo_ibge = models.PositiveIntegerField(
u'código IBGE',
_(u'código IBGE'),
primary_key=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
codigo_mesorregiao = models.PositiveIntegerField(
u'código mesorregião',
_(u'código mesorregião'),
blank=True,
null=True
)
# agrupamento baseado em similaridades econômicas e sociais
codigo_microrregiao = models.PositiveIntegerField(
u'código microrregião',
_(u'código microrregião'),
blank=True,
null=True
)
# codio designado pelo Tribunal Superior Eleitoral
codigo_tse = models.PositiveIntegerField(
u'código TSE',
_(u'código TSE'),
unique=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)
search_text = SearchField(field_names=['nome', 'uf'])
uf = models.ForeignKey(UnidadeFederativa, verbose_name='UF')
search_text = SearchField(field_names=[_(u'nome'), _(u'uf')])
uf = models.ForeignKey(UnidadeFederativa, verbose_name=_(u'UF'))
# verdadeiro se o município é capital do estado
is_capital = models.BooleanField('capital', default=False)
populacao = models.PositiveIntegerField(u'população')
is_capital = models.BooleanField(_(u'capital'), default=False)
populacao = models.PositiveIntegerField(_(u'população'))
populacao.list_filter_range = [10000, 100000, 1000000]
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)
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)
# posição geográfica do município
latitude = models.DecimalField(
@ -90,28 +92,28 @@ class Municipio(models.Model):
decimal_places=8,
null=True,
blank=True,
help_text='Exemplo: <em>-20,464</em>.'
help_text=_(u'Exemplo') + ': <em>-20,464</em>.'
)
longitude = models.DecimalField(
max_digits=11,
decimal_places=8,
null=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)])
idh.list_filter_range = [0.500, 0.800]
pib_total = models.DecimalField(u'PIB total', max_digits=18, decimal_places=3, blank=True, null=True)
pib_percapita = models.DecimalField(u'PIB per capita', max_digits=18, decimal_places=3, blank=True, null=True)
pib_ano = models.IntegerField(u'Ano de apuração do PIB', blank=True, null=True)
pib_total = models.DecimalField(_(u'PIB total'), max_digits=18, decimal_places=3, blank=True, null=True)
pib_percapita = models.DecimalField(_(u'PIB per capita'), max_digits=18, decimal_places=3, blank=True, null=True)
pib_ano = models.IntegerField(_(u'Ano de apuração do PIB'), blank=True, null=True)
class Meta:
ordering = ('nome', 'codigo_ibge')
verbose_name = 'município'
verbose_name_plural = 'municípios'
verbose_name = _(u'município')
verbose_name_plural = _(u'municípios')
def __unicode__(self):
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
"""
TELEFONE_CHOICES = (
('F', 'Fixo'),
('M', 'Móvel'),
('X', 'Fax'),
('I', 'Indefinido'),
('F', _(u'Fixo')),
('M', _(u'Móvel')),
('X', _(u'Fax')),
('I', _(u'Indefinido')),
)
numero = models.CharField(
'número',
_(u'número'),
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(
max_length=1,
@ -142,7 +144,7 @@ class Telefone(models.Model):
default='I'
)
nota = models.CharField(max_length=70, null=True, blank=True)
ult_alteracao = models.DateTimeField(u'Última alteração', null=True, blank=True, editable=False, auto_now=True)
ult_alteracao = models.DateTimeField(_(u'Última alteração'), null=True, blank=True, editable=False, auto_now=True)
# guarda o tipo do objeto (classe) vinculado a esse registro
content_type = models.ForeignKey(ContentType)
@ -163,16 +165,16 @@ class Contato(models.Model):
""" Modelo generico para registrar contatos vinculados aos
modulos do sistema
"""
nome = models.CharField('nome completo', max_length=120)
nome = models.CharField(_(u'nome completo'), max_length=120)
nome.alphabetic_filter = 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)
municipio = models.ForeignKey(
Municipio,
verbose_name='município',
verbose_name=_(u'município'),
blank=True,
null=True,
)
@ -185,8 +187,8 @@ class Contato(models.Model):
class Meta:
ordering = ('nome',)
verbose_name = 'contato Interlegis'
verbose_name_plural = 'contatos Interlegis'
verbose_name = _(u'contato Interlegis')
verbose_name_plural = _(u'contatos Interlegis')
def __unicode__(self):
return self.nome
@ -194,51 +196,51 @@ class Contato(models.Model):
class Endereco(models.Model):
TIPO_CHOICES = (
('aeroporto', 'Aeroporto'),
('alameda', 'Alameda'),
('area', u'Área'),
('avenida', 'Avenida'),
('campo', 'Campo'),
('chacara', u'Chácara'),
('colonia', u'Colônia'),
('condominio', u'Condomínio'),
('conjunto', 'Conjunto'),
('distrito', 'Distrito'),
('esplanada', 'Esplanada'),
('estacao', u'Estação'),
('estrada', 'Estrada'),
('favela', 'Favela'),
('fazenda', 'Fazenda'),
('feira', 'Feira'),
('jardim', 'Jardim'),
('ladeira', 'Ladeira'),
('lago', 'Lago'),
('lagoa', 'Lagoa'),
('largo', 'Largo'),
('loteamento', 'Loteamento'),
('morro', 'Morro'),
('nucleo', u'Núcleo'),
('parque', 'Parque'),
('passarela', 'Passarela'),
('patio', u'Pátio'),
('praca', u'Praça'),
('quadra', 'Quadra'),
('recanto', 'Recanto'),
('residencial', 'Residencial'),
('rodovia', 'Rodovia'),
('rua', 'Rua'),
('setor', 'Setor'),
('sitio', u'Sítio'),
('travessa', 'Travessa'),
('trecho', 'Trecho'),
('trevo', 'Trevo'),
('vale', 'Vale'),
('vereda', 'Vereda'),
('via', 'Via'),
('viaduto', 'Viaduto'),
('viela', 'Viela'),
('vila', 'Vila'),
('outro', 'Outro'),
('aeroporto', _(u'Aeroporto')),
('alameda', _(u'Alameda')),
('area', _(u'Área')),
('avenida', _(u'Avenida')),
('campo', _(u'Campo')),
('chacara', _(u'Chácara')),
('colonia', _(u'Colônia')),
('condominio', _(u'Condomínio')),
('conjunto', _(u'Conjunto')),
('distrito', _(u'Distrito')),
('esplanada', _(u'Esplanada')),
('estacao', _(u'Estação')),
('estrada', _(u'Estrada')),
('favela', _(u'Favela')),
('fazenda', _(u'Fazenda')),
('feira', _(u'Feira')),
('jardim', _(u'Jardim')),
('ladeira', _(u'Ladeira')),
('lago', _(u'Lago')),
('lagoa', _(u'Lagoa')),
('largo', _(u'Largo')),
('loteamento', _(u'Loteamento')),
('morro', _(u'Morro')),
('nucleo', _(u'Núcleo')),
('parque', _(u'Parque')),
('passarela', _(u'Passarela')),
('patio', _(u'Pátio')),
('praca', _(u'Praça')),
('quadra', _(u'Quadra')),
('recanto', _(u'Recanto')),
('residencial', _(u'Residencial')),
('rodovia', _(u'Rodovia')),
('rua', _(u'Rua')),
('setor', _(u'Setor')),
('sitio', _(u'Sítio')),
('travessa', _(u'Travessa')),
('trecho', _(u'Trecho')),
('trevo', _(u'Trevo')),
('vale', _(u'Vale')),
('vereda', _(u'Vereda')),
('via', _(u'Via')),
('viaduto', _(u'Viaduto')),
('viela', _(u'Viela')),
('vila', _(u'Vila')),
('outro', _(u'Outro')),
)
# 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)
cep = models.CharField(
'CEP',
_(u'CEP'),
max_length=9,
blank=True,
null=True,
help_text="Formato: <em>XXXXX-XXX</em>."
help_text=_(u"Formato") + ": <em>XXXXX-XXX</em>."
)
municipio = models.ForeignKey(
Municipio,
verbose_name='município',
verbose_name=_(u'município'),
blank=True,
null=True,
)
@ -277,8 +279,8 @@ class Endereco(models.Model):
class Meta:
ordering = ('logradouro', 'numero')
verbose_name = u'endereço'
verbose_name_plural = u'endereços'
verbose_name = _(u'endereço')
verbose_name_plural = _(u'endereços')
def __unicode__(self):
return self.tipo + ' ' + self.logradouro + ', ' + self.numero \

15
sigi/apps/convenios/admin.py

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from django.contrib import admin
from django.http import HttpResponse, HttpResponseRedirect
from django.utils.translation import ugettext as _
from geraldo.generators import PDFGenerator
from sigi.apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo, Tramitacao
@ -42,12 +43,12 @@ class ConvenioAdmin(BaseModelAdmin):
(None,
{'fields': ('casa_legislativa', 'num_processo_sf', 'num_convenio', 'projeto', 'observacao')}
),
('Datas',
(_(u'Datas'),
{'fields': ('data_adesao', 'data_retorno_assinatura',
'data_termo_aceite', 'data_pub_diario',
'data_devolucao_via', 'data_postagem_correio')}
),
('Datas - Convenio sem assinatura',
(_(u'Datas - Convenio sem assinatura'),
{'fields': ('data_devolucao_sem_assinatura', 'data_retorno_sem_assinatura',)}
),
)
@ -68,7 +69,7 @@ class ConvenioAdmin(BaseModelAdmin):
def get_uf(self, obj):
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'
def changelist_view(self, request, extra_context=None):
@ -103,7 +104,7 @@ class ConvenioAdmin(BaseModelAdmin):
report = ConvenioReport(queryset=queryset)
report.generate_by(PDFGenerator, filename=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):
if 'carrinho_convenios' in request.session:
@ -114,11 +115,11 @@ class ConvenioAdmin(BaseModelAdmin):
q2 = len(request.session['carrinho_convenios'])
quant = q2 - q1
if quant:
self.message_user(request, str(q2 - q1) + " Convênios adicionados no carrinho")
self.message_user(request, str(q2 - q1) + _(u" Convênios adicionados no carrinho"))
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('.')
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):
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 -*-
from datetime import datetime
from django.db import models
from django.contrib.contenttypes import generic
from django.utils.translation import ugettext as _
from sigi.apps.utils import SearchField
@ -29,67 +30,67 @@ class Convenio(models.Model):
"""
casa_legislativa = models.ForeignKey(
'casas.CasaLegislativa',
verbose_name='Casa Legislativa'
verbose_name=_(u'Casa Legislativa')
)
# campo de busca em caixa baixa e sem acentos
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
num_processo_sf = models.CharField(
'número do processo SF (Senado Federal)',
_(u'número do processo SF (Senado Federal)'),
max_length=20,
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(
'número do convênio',
_(u'número do convênio'),
max_length=10,
blank=True
)
data_adesao = models.DateField(
'Aderidas',
_(u'Aderidas'),
null=True,
blank=True,
)
data_retorno_assinatura = models.DateField(
'Conveniadas',
_(u'Conveniadas'),
null=True,
blank=True,
help_text='Convênio firmado.'
help_text=_(u'Convênio firmado.')
)
data_pub_diario = models.DateField(
'data da publicação no Diário Oficial',
_(u'data da publicação no Diário Oficial'),
null=True,
blank=True
)
data_termo_aceite = models.DateField(
'Equipadas',
_(u'Equipadas'),
null=True,
blank=True,
help_text='Equipamentos recebidos.'
help_text=_(u'Equipamentos recebidos.')
)
data_devolucao_via = models.DateField(
'data de devolução da via',
_(u'data de devolução da via'),
null=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',
_(u'data postagem correio'),
null=True,
blank=True,
)
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,
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 do retorno sem assinatura',
_(u'data do retorno sem assinatura'),
null=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(
null=True,
@ -107,13 +108,18 @@ class Convenio(models.Model):
class Meta:
get_latest_by = 'id'
ordering = ('id',)
verbose_name = u'convênio'
verbose_name = _(u'convênio')
def __unicode__(self):
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:
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):
@ -122,13 +128,13 @@ class EquipamentoPrevisto(models.Model):
disponibilizados para as Casas Legislativas
(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')
quantidade = models.PositiveSmallIntegerField(default=1)
class Meta:
verbose_name = 'equipamento previsto'
verbose_name_plural = 'equipamentos previstos'
verbose_name = _(u'equipamento previsto')
verbose_name_plural = _(u'equipamentos previstos')
def __unicode__(self):
return u'%s %s(s)' % (self.quantidade, self.equipamento)
@ -139,12 +145,12 @@ class Anexo(models.Model):
""" Modelo para giardar os documentos gerados
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
arquivo = models.FileField(upload_to='apps/convenios/anexo/arquivo',)
descricao = models.CharField('descrição', max_length='70')
arquivo = models.FileField(upload_to='apps/convenios/anexo/arquivo', max_length=500)
descricao = models.CharField(_(u'descrição'), max_length='70')
data_pub = models.DateTimeField(
'data da publicação do anexo',
_(u'data da publicação do anexo'),
default=datetime.now
)
@ -173,21 +179,22 @@ class Tramitacao(models.Model):
""" Modelo para registrar as vias do processo de convênio e a Unidade
responsável pelo tramite (ex. colher assinaturas do secretário do senado)
"""
convenio = models.ForeignKey(Convenio, verbose_name=u'convênio')
unid_admin = models.ForeignKey(UnidadeAdministrativa, verbose_name=u'Unidade Administrativa')
convenio = models.ForeignKey(Convenio, verbose_name=_(u'convênio'))
unid_admin = models.ForeignKey(UnidadeAdministrativa, verbose_name=_(u'Unidade Administrativa'))
data = models.DateField()
observacao = models.CharField(
'observação',
_(u'observação'),
max_length='512',
null=True,
blank=True,
)
class Meta:
verbose_name_plural = u'Tramitações'
verbose_name_plural = _(u'Tramitações')
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:
return unicode("%s em %s (%s)" % (self.unid_admin, self.data, self.observacao))
else:
return unicode("%s em %s" % (self.unid_admin, self.data))
result = result + u" (%s)" % (self.observacao)
return unicode(result) # XXX is this unicode(...) really necessary???

67
sigi/apps/convenios/reports.py

@ -1,18 +1,11 @@
# -*- coding: utf-8 -*-
import os
from ctypes import alignment
from operator import attrgetter
from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \
landscape, SystemField, BAND_WIDTH, ReportGroup, \
FIELD_ACTION_SUM, FIELD_ACTION_COUNT, FIELD_ACTION_AVG
from geraldo.graphics import Image
from django.utils.translation import ugettext as _
from geraldo import ReportBand, ObjectValue, Label, ReportGroup, FIELD_ACTION_SUM
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 abc import ABCMeta
@ -33,7 +26,7 @@ class SemEquipamentosReport(object):
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):
@ -44,47 +37,47 @@ class ConvenioReport(ReportDefault):
elements += [
Label(
text="UF",
text=_(u"UF"),
left=label_left[0] * cm,
top=label_top + 0.4 * cm,
),
Label(
text="Municipio",
text=_(u"Municipio"),
left=label_left[1] * cm,
top=label_top + 0.4 * cm,
),
Label(
text="Data de Adesão",
text=_(u"Data de Adesão"),
left=label_left[2] * cm,
top=label_top,
width=2 * cm,
),
Label(
text="Número do Convênio",
text=_(u"Número do Convênio"),
left=label_left[3] * cm,
top=label_top,
width=2 * cm,
),
Label(
text="Data do Convênio",
text=_(u"Data do Convênio"),
left=label_left[4] * cm,
top=label_top,
width=2 * cm,
),
Label(
text="Data de Publicação",
text=_(u"Data de Publicação"),
left=label_left[5] * cm,
top=label_top,
width=2 * cm,
),
Label(
text="Data de Aceite",
text=_(u"Data de Aceite"),
left=label_left[6] * cm,
top=label_top,
width=2 * cm,
),
Label(
text="Projeto",
text=_(u"Projeto"),
left=label_left[7] * cm,
top=label_top + 0.4 * cm,
width=2 * cm,
@ -147,7 +140,7 @@ class ConvenioReport(ReportDefault):
height=0.7 * cm,
elements=[
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},
@ -167,41 +160,41 @@ class ConvenioReportSemAceite(ConvenioReport):
elements += [
Label(
text="UF",
text=_(u"UF"),
left=label_left[0] * cm,
top=label_top + 0.4 * cm,
),
Label(
text="Município",
text=_(u"Município"),
left=label_left[1] * cm,
top=label_top + 0.4 * cm,
),
Label(
text="Data de Adesão",
text=_(u"Data de Adesão"),
left=label_left[3] * cm,
top=label_top,
width=2 * cm,
),
Label(
text="Número do Convênio",
text=_(u"Número do Convênio"),
left=label_left[4] * cm,
top=label_top,
width=2 * cm,
),
Label(
text="Data do Convênio",
text=_(u"Data do Convênio"),
left=label_left[5] * cm,
top=label_top,
width=2 * cm,
),
Label(
text="Data de Publicação",
text=_(u"Data de Publicação"),
left=label_left[6] * cm,
top=label_top,
width=2 * cm,
),
Label(
text="Projeto",
text=_(u"Projeto"),
left=label_left[7] * cm,
top=label_top + 0.4 * cm,
width=2 * cm,
@ -254,7 +247,7 @@ float_duas_casas = lambda instance: '%.2f' % (instance)
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):
label_top = ReportDefault.band_page_header.label_top
@ -264,11 +257,11 @@ class ConvenioReportRegiao(ReportDefault):
elements = list(ReportDefault.band_page_header.elements)
elements += [
Label(text="UF", left=label_left[0] * cm, top=label_top,),
Label(text="Total", left=label_left[1] * cm, top=label_top,),
Label(text="Aderidas", left=label_left[2] * cm, top=label_top,),
Label(text=_(u"UF"), left=label_left[0] * cm, top=label_top,),
Label(text=_(u"Total"), left=label_left[1] * 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="Ñ 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),
]
@ -290,7 +283,7 @@ class ConvenioReportRegiao(ReportDefault):
class band_summary(ReportBand):
label_left = [0.5, 6, 8, 10, 12, 14]
elements = [
Label(text="Total", top=0.1 * cm, left=label_left[0] * cm),
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_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,
@ -305,16 +298,16 @@ class ConvenioReportRegiao(ReportDefault):
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):
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):
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):
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" %}
{% endblock %}
{% block title %}Convênios no Carrinho | SIGI{% endblock %}
{% block content_title %}<h1>Convênios no Carrinho</h1>{% endblock %}
{% block title %}{% trans 'Convênios no Carrinho | SIGI' %}{% endblock %}
{% block content_title %}<h1>{% trans 'Convênios no Carrinho' %}</h1>{% endblock %}
{% block mensagem%}
<ul class="messagelist">
{%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%}
<li>{{paginas.paginator.count}} Convênios no carrinho.</li>
<li>{{paginas.paginator.count}} {% trans 'Convênios no carrinho' %}.</li>
{%endif%}
</ul>
{% endblock %}
@ -28,12 +28,12 @@
<th class="sorted ascending"><!-- <input type="checkbox" id="action-toggle" style="display: inline;">-->
</th>
{% endif %}
<th class="sorted ascending">Numero do convênio</th>
<th class="sorted ascending">Casa Legislativa</th>
<th class="sorted ascending">Aderidas</th>
<th class="sorted ascending">Convêniadas</th>
<th class="sorted ascending">Equipadas</th>
<th class="sorted ascending">Projeto</th>
<th class="sorted ascending">{% trans 'Numero do convênio' %}</th>
<th class="sorted ascending">{% trans 'Casa Legislativa' %}</th>
<th class="sorted ascending">{% trans 'Aderidas' %}</th>
<th class="sorted ascending">{% trans 'Convêniadas' %}</th>
<th class="sorted ascending">{% trans 'Equipadas' %}</th>
<th class="sorted ascending">{% trans 'Projeto' %}</th>
</tr>
</thead>
<tbody>
@ -59,34 +59,34 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1">Relatório</a></li>
<li><a href="#tabs-2">Arquivo CSV (Excel, Calc)</a></li>
<li><a href="#tabs-1">{% trans 'Relatório' %}</a></li>
<li><a href="#tabs-2">{% trans 'Arquivo CSV (Excel, Calc)' %}</a></li>
</ul>
<div id="tabs-1">
<form action="../reports/{{ query_str }}" method="post">{% csrf_token %}
<fieldset>
<legend>Relatório por</legend>
<legend>{% trans 'Relatório por' %}</legend>
<ul class="tabs-conteudo">
<li>
<input type="radio" name="filtro_casa" value="cm" checked="checked"/>
<label>Câmara Municipal</label>
<label>{% trans 'Câmara Municipal' %}</label>
</li>
<li>
<input type="radio" name="filtro_casa" value="al" />
<label>Assembléia Legislativa</label>
<label>{% trans 'Assembléia Legislativa' %}</label>
</li>
</ul>
</fieldset>
<fieldset>
<legend>Com data de aceite? (Equipada)</legend>
<legend>{% trans 'Com data de aceite? (Equipada)' %}</legend>
<ul class="tabs-conteudo">
<li>
<input type="radio" name="data_aceite" value="sim" checked="checked" />
<label>Sim</label>
<label>{% trans 'Sim' %}</label>
</li>
<li>
<input type="radio" name="data_aceite" value="nao" />
<label>Não</label>
<label>{% trans 'Não' %}</label>
</li>
</ul>
</fieldset>
@ -97,55 +97,55 @@
</div>
<div id="tabs-2">
<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">
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="No. Processo"
class="action-select" checked="checked" />
<label>Nº Processo</label>
<label>{% trans 'Nº Processo' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="No. Convênio"
class="action-select" checked="checked" />
<label>Nº Convênio</label>
<label>{% trans 'Nº Convênio' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Projeto"
class="action-select" checked="checked" />
<label>Projeto</label>
<label>{% trans 'Projeto' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Casa Legislativa"
class="action-select" checked="checked" />
<label>Casa Legislativa</label>
<label>{% trans 'Casa Legislativa' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Data de Adesão"
class="action-select" checked="checked" />
<label>Data de Adesão</label>
<label>{% trans 'Data de Adesão' %}</label>
</li>
<li>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Data de Convênio"
class="action-select" checked="checked" />
<label>Data de Convênio</label>
<label>{% trans 'Data de Convênio' %}</label>
</li>
<li>
<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."
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>
<span class="ui-icon ui-icon-arrowthick-2-n-s"></span>
<input type="checkbox" name="itens_csv_selected" value="Data Equipada"
class="action-select" checked="checked" />
<label>Data Equipada</label>
<label>{% trans 'Data Equipada' %}</label>
</li>
</ul>
</fieldset>

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

@ -1,4 +1,5 @@
{% extends "change_list_with_cart.html" %}
{% load i18n %}
{% block search %}
<div id="toolbar">
@ -6,12 +7,12 @@
<div><!-- DIV needed for valid HTML -->
<label for="searchbar"><img src="/static/admin/img/icon_searchbox.png" alt="Search" /></label>
<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"/>
<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="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>
</form>
</div>

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

@ -1,3 +1,5 @@
{% load static from staticfiles %}
{% load i18n %}
<html>
<head>
<title>Relatório por Região</title>
@ -56,7 +58,7 @@
}
#footerContent #direita{
text-align: right;
background-image: url("/media/images/logo-senado.png");
background-image: url("{% static 'img/logo-senado.png' %}");
}
.tabela {
padding-top: 0.1cm;
@ -94,9 +96,9 @@
<div id="cabecalho">
<table>
<tr>
<td id="imagem1"><img src="../media/images/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="imagem2"><img src="../media/images/logo-interlegis.jpg" width="90" height="65" alt="Logo Interlegis"/></td>
<td id="imagem1"><img src="{% static 'img/logo-senado.png' %}" width="80" height="80" alt="Logo Senado"/></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="{% static 'img/logo-interlegis.jpg' %}" width="90" height="65" alt="Logo Interlegis"/></td>
</tr>
</table>
<h1 class="titulo">{{regiao}}</h1>
@ -136,7 +138,7 @@
<table>
<tr>
<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>
</table>
</div>

79
sigi/apps/convenios/views.py

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

16
sigi/apps/diagnosticos/admin.py

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

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 -*-
from copy import deepcopy
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,
FloatField, ModelChoiceField, Textarea,
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.contatos.models import Telefone
from sigi.apps.diagnosticos.models import Diagnostico
from sigi.apps.diagnosticos.widgets import EavCheckboxSelectMultiple, EavRadioSelect
from eav.forms import BaseDynamicEntityForm
from eav.fields import RangeField
class DiagnosticoForm(BaseDynamicEntityForm):
@ -131,7 +133,7 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm):
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()
class Meta:
@ -141,7 +143,7 @@ class CasaLegislativaMobileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(CasaLegislativaMobileForm, self).__init__(*args, **kwargs)
self.fields['data_criacao'] = forms.DateField(
label=u'Data de criação do Município',
label=_(u'Data de criação do Município'),
initial=self.instance.municipio.data_criacao,
required=False)

40
sigi/apps/diagnosticos/models.py

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

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

@ -1,16 +1,17 @@
{% extends "base_change_form.html" %}
{% load static from staticfiles %}
{% load i18n reporting_tags %}
{% block extrastyle %}
{{ 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 %}
{% block object-tools %}
{% if change %}{% if not is_popup %}
<ul class="object-tools">
<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>
{% endif %}{% endif %}
{% endblock %}

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

@ -8,12 +8,12 @@
<div><!-- DIV needed for valid HTML -->
<label for="searchbar"><img src="{% static 'admin/img/icon_searchbox.png' %}" alt="Search" /></label>
<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"/>
<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="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>
</form>
</div>

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

@ -1,4 +1,6 @@
{% 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">
<html>
<head>
@ -86,57 +88,57 @@
<div id="header">
<table>
<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">
<p><strong>SENADO FEDERAL</strong></p>
<p><strong>SECRETARIA ESPECIAL DO INTERLEGIS – SINTER</strong></p>
<p>SUBSECRETARIA DE PLANEJAMENTO E FOMENTO – SSPLF</p>
<p><strong>{% trans 'SENADO FEDERAL' %}</strong></p>
<p><strong>{% trans 'SECRETARIA ESPECIAL DO INTERLEGIS – SINTER' %}</strong></p>
<p>{% trans 'SUBSECRETARIA DE PLANEJAMENTO E FOMENTO – SSPLF' %}</p>
</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>
</table>
</div>
<div id="capa">
<center>
<img src="{{MEDIA_URL}}images/logo-interlegis-grande.jpg"/>
<img src="{% static 'img/logo-interlegis-grande.jpg' %}"/>
</center>
<h1>
PROJETO DE MODERNIZAÇÃO DO LEGISLATIVO
{% trans 'PROJETO DE MODERNIZAÇÃO DO LEGISLATIVO' %}
</br>
</br>
QUESTIONÁRIO DE DIAGNÓSTICO
{% trans 'QUESTIONÁRIO DE DIAGNÓSTICO' %}
</h1>
<h2 style="text-align: center;">
{{ diagnostico.casa_legislativa }} - {{ diagnostico.casa_legislativa.municipio.uf.sigla }}
</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>
<h3>Chefe da equipe de diagnóstico:</h3>
<h3>{% trans 'Chefe da equipe de diagnóstico' %}:</h3>
<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 %}
<p>{{membro}}</p>
{% endfor %}
{% for funcionario in funcionarios %}
{% 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>
<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>
<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>
{% 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>
{% endfor %}
{% endif %}
{% endfor %}
</table>
<!--
<h3>Cargo do Responsável pelas Informações:</h3>
<p>{{diagnostico.responsavel.cargo|default_if_none:""}}&nbsp;</p>
@ -152,44 +154,44 @@
</div>
<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>
<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>
<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>
<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>
<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>
<h3>06. CNPJ:</h3>
<h3>06. {% trans 'CNPJ' %}:</h3>
<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>
<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>
</div>
<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 %}
<div class="same_page">
<h3>{{funcionario.get_setor_display}}</h3>
<p class="strong">Nome completo: {{funcionario.nome|default_if_none:""}}</p>
<p class="strong">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 'Nome completo' %}: {{funcionario.nome|default_if_none:""}}</p>
<p class="strong">{% trans 'E-mail' %}: {{funcionario.email|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 %}
<p class="strong">Telefone {{telefone.get_tipo_display}}: {{telefone}}</p>
<p class="strong">{% blocktrans %}Telefone {{telefone.get_tipo_display}}{% endblocktrans %}: {{telefone}}</p>
{% endfor %}
</div>
{% endfor %}
@ -197,7 +199,7 @@
{% for categoria, schemas in schemas_by_categoria %}
<div class="new_page">
<h2>Bloco {{categoria.nome}}</h2>
<h2>{% trans 'Bloco' %} {{categoria.nome}}</h2>
{% for schema in schemas %}
<div class="same_page">
<h3>{{ schema.title }}</h3>
@ -214,9 +216,9 @@
{% else %}
<p class="strong">
{% if schema.datatype == schema.TYPE_FLOAT %}
{{ schema.value|floatformat|default_if_none:"sem resposta"}}
{{ schema.value|floatformat|default_if_none:_("sem resposta")}}
{% else %}
{{ schema.value|default_if_none:"sem resposta"}}
{{ schema.value|default_if_none:_("sem resposta")}}
{% endif %}
&nbsp;</p>
{% endif %}
@ -226,7 +228,7 @@
{% endfor %}
<div id="footer">
{%block page_foot%}
Página <pdf:pagenumber>
{% trans 'Página' %} <pdf:pagenumber>
{%endblock%}
</div>
</body>

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

@ -1,13 +1,15 @@
{% extends "base_mobile.html" %}
{% load static from staticfiles %}
{% load i18n %}
{% block media %}
{{ 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 %}
{% block cabecalho %}
<h1>01. Identificação da Camara Municipal</h1>
<a href="{% url 'lista_categorias' diagnostico.id %}?c=1" data-icon="arrow-l"
<a href="{% url 'lista_categorias' diagnostico.id %}?c=1" data-icon="arrow-l"
data-direction="reverse" data-theme="c" class="ui-btn-left">Voltar</a>
{% endblock cabecalho %}
@ -15,7 +17,7 @@
{% if form %}
<div id="waiting">
<!-- 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 id="form" style="display:none;">
<div data-role="fieldcontain">
@ -35,12 +37,12 @@
</form>
</div>
{% else %}
<h2>Nenhuma existem perguntas para essa categoria.</h2>
<h2>{% trans 'Nenhuma existem perguntas para essa categoria.' %}</h2>
{% endif %}
{% endblock corpo %}
{% block rodape %}
{{ block.super }}
<li><a href="{% url 'lista_categorias' diagnostico.id %}" data-icon="grid" class="ui-state-persist">Listar</a></li>
<li><a href="{% url 'logout' %}" data-icon="delete">Sair</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">{% trans 'Sair' %}</a></li>
{% endblock rodape %}

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

@ -1,20 +1,22 @@
{% extends "base_mobile.html" %}
{% load static from staticfiles %}
{% load i18n %}
{% block media %}
{{ 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 %}
{% block cabecalho %}
<h1>02. Identificação de Competências</h1>
<a href="{% url 'lista_categorias' diagnostico.id %}?c=2" data-icon="arrow-l"
<h1>02. {% trans 'Identificação de Competências' %}</h1>
<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>
{% endblock cabecalho %}
{% block corpo %}
<div id="waiting">
<!-- 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 id="form" style="display:none;">
<form id="diagnostico" action="." method="post">
@ -27,7 +29,7 @@
<span id="{{ field.html_name }}-errors" class="errors"></span>
</div>
{% endfor %}
<h4>Telefones</h4>
<h4>{% trans 'Telefones' %}</h4>
{% for form in form.telefones.forms %}
<div class="phone" data-role="fieldcontain">
{{ form.tipo }} {{ form.numero }}
@ -47,6 +49,6 @@
{% block rodape %}
{{ block.super }}
<li><a href="{% url 'lista_categorias' diagnostico.id %}" data-icon="grid" class="ui-state-persist">Listar</a></li>
<li><a href="{% url 'logout' %}" data-icon="delete">Sair</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">{% trans 'Sair' %}</a></li>
{% endblock rodape %}

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

@ -1,13 +1,15 @@
{% extends "base_mobile.html" %}
{% load static from staticfiles %}
{% load i18n %}
{% block media %}
{{ 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 %}
{% block cabecalho %}
<h1>{{ categoria.nome }}</h1>
<a href="{% url 'lista_categorias' diagnostico.id %}" data-icon="arrow-l"
<a href="{% url 'lista_categorias' diagnostico.id %}" data-icon="arrow-l"
data-direction="reverse" data-theme="c" class="ui-btn-left">Voltar</a>
{% endblock cabecalho %}
@ -15,7 +17,7 @@
{% if form %}
<div id="waiting">
<!-- 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 id="form" style="display:none;">
<form id="diagnostico" action="." method="post">
@ -35,12 +37,12 @@
</form>
</div>
{% else %}
<h2>Nenhuma existem perguntas para essa categoria.</h2>
<h2>{% trans 'Nenhuma existem perguntas para essa categoria.' %}</h2>
{% endif %}
{% endblock corpo %}
{% block rodape %}
{{ block.super }}
<li><a href="{% url 'lista_categorias' diagnostico.id %}" data-icon="grid" class="ui-state-persist">Listar</a></li>
<li><a href="{% url 'logout' %}" data-icon="delete">Sair</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">{% trans 'Sair' %}</a></li>
{% endblock rodape %}

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

@ -1,4 +1,6 @@
{% extends "base_mobile.html" %}
{% load static from staticfiles %}
{% load i18n %}
{% block cabecalho %}
<h1>Categorias</h1>
@ -7,7 +9,7 @@
{% block media %}
{{ 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 %}
{% block corpo %}
@ -19,7 +21,7 @@
<li>
{% endif %}
<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>
</li>
{% if ultima_categoria == 2 %}
@ -29,9 +31,9 @@
{% endif %}
<a href="{% url 'detalhes_categoria_contatos' diagnostico.id %}">
{% 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 %}
<h4>02. Identificação de Competências</h4>
<h4>02. {% trans 'Identificação de Competências' %}</h4>
{% endif %}
</a>
</li>
@ -52,12 +54,12 @@
{% endfor %}
</ul>
{% else %}
<h2>Nenhuma categoria existente.</h2>
<h2>{% trans 'Nenhuma categoria existente.' %}</h2>
{% endif %}
{% endblock corpo %}
<ul>
{% block rodape %}
{{ 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 %}
</ul>

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

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

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

@ -1,10 +1,11 @@
{% load static from staticfiles %}
{% load i18n %}
<!DOCTYPE HTML>
<html lang="pt-BR">
<head>
<meta charset="UTF-8" />
<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' %}" />
<script src="{% static '/js/jquery/jquery-1.6.4.min.js' %}" ></script>
<script language=javascript>
@ -29,7 +30,7 @@
{% endif %}
{% endfor %}
</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 -->
{% endif %}
@ -37,15 +38,15 @@
<form action="{% url 'django.contrib.auth.views.login' %}" method="POST">
{% csrf_token %}
<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">
</div>
<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">
</div>
<input type="hidden" name="next" value="{% url 'lista_diagnosticos' %}" />
<button type="submit">Entrar</button>
<button type="submit">{% trans 'Entrar' %}</button>
</form>
</div>
</body>

23
sigi/apps/diagnosticos/views.py

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from itertools import cycle
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.template import RequestContext
from django.utils.translation import ugettext as _
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.contatos.models import Telefone
from sigi.apps.diagnosticos.decorators import validate_diagnostico
from sigi.apps.diagnosticos.forms import (DiagnosticoMobileForm,
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
@ -186,7 +186,9 @@ def categoria_contatos(request, id_diagnostico):
for form_telefones in form.telefones.forms:
tel = form_telefones.instance
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',)
if 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()
if form.prefix not in resposta['fones']:
resposta['fones'][form.prefix] = ''
resposta['fones'][form.prefix] += u'<p>O telefone %s %s foi excluído da base de dados</p>' % (
form_telefones.instance.get_tipo_display(), form_telefones.instance.numero)
resposta['fones'][form.prefix] += _(u'<p>O telefone %(type)s %(number)s foi excluído da base de dados</p>') % dict(
type=form_telefones.instance.get_tipo_display(),
number=form_telefones.instance.numero)
else:
for key, value in form_telefones.errors.iteritems():
key = form_telefones.prefix + "-id-errors"

16
sigi/apps/financeiro/models.py

@ -1,18 +1,20 @@
# -*- coding: utf-8 -*-
from django.db import models
from django.utils.translation import ugettext as _
from sigi.apps.convenios.models import Projeto
class Desembolso(models.Model):
projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto')
descricao = models.CharField(u'Descrição da despesa', max_length=100)
data = models.DateField(u'Data do desembolso')
valor_reais = models.DecimalField(u'Valor em R$', max_digits=18, decimal_places=2)
valor_dolar = models.DecimalField(u'Valor em US$', max_digits=18, decimal_places=2)
projeto = models.ForeignKey(Projeto, verbose_name=_(u'Projeto'))
descricao = models.CharField(_(u'Descrição da despesa'), max_length=100)
data = models.DateField(_(u'Data do desembolso'))
valor_reais = models.DecimalField(_(u'Valor em R$'), max_digits=18, decimal_places=2)
valor_dolar = models.DecimalField(_(u'Valor em US$'), max_digits=18, decimal_places=2)
class Meta:
verbose_name = 'Desembolso'
verbose_name_plural = 'Desembolsos'
verbose_name = _(u'Desembolso')
verbose_name_plural = _(u'Desembolsos')
def __unicode__(self):
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 -*-
from django.db import models
from django.contrib.contenttypes import generic
from django.db import models
from django.utils.translation import ugettext as _
class Fornecedor(models.Model):
nome = models.CharField(max_length=40)
nome.alphabetic_filter = True
email = models.EmailField('e-mail', blank=True)
pagina_web = models.URLField('página web', blank=True)
email = models.EmailField(_(u'e-mail'), blank=True)
pagina_web = models.URLField(_(u'página web'), blank=True)
telefones = generic.GenericRelation('contatos.Telefone')
contatos = generic.GenericRelation('contatos.Contato')
class Meta:
ordering = ('nome',)
verbose_name_plural = 'fornecedores'
verbose_name_plural = _(u'fornecedores')
def __unicode__(self):
return self.nome
@ -35,8 +36,8 @@ class TipoEquipamento(models.Model):
class Meta:
ordering = ('tipo',)
verbose_name = 'tipo de equipamento'
verbose_name_plural = 'tipos de equipamentos'
verbose_name = _(u'tipo de equipamento')
verbose_name_plural = _(u'tipos de equipamentos')
def __unicode__(self):
return self.tipo
@ -45,14 +46,14 @@ class TipoEquipamento(models.Model):
class ModeloEquipamento(models.Model):
tipo = models.ForeignKey(
TipoEquipamento,
verbose_name='tipo de equipamento'
verbose_name=_(u'tipo de equipamento')
)
modelo = models.CharField(max_length=30)
class Meta:
ordering = ('modelo',)
verbose_name = 'modelo de equipamento'
verbose_name_plural = 'modelos de equipamentos'
verbose_name = _(u'modelo de equipamento')
verbose_name_plural = _(u'modelos de equipamentos')
def __unicode__(self):
return self.modelo
@ -75,20 +76,20 @@ class Bem(models.Model):
equipamento = models.ForeignKey(Equipamento)
fornecedor = models.ForeignKey(Fornecedor)
num_serie = models.CharField(
'número de série',
_(u'número de série'),
max_length=64,
help_text='Número fornecido pelo fabricante.',
help_text=_(u'Número fornecido pelo fabricante.'),
unique=True
)
recebido_por = models.CharField(
max_length=64,
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:
verbose_name_plural = 'bens'
verbose_name_plural = _(u'bens')
def __unicode__(self):
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.http import HttpResponse
from django.utils.html import escape
from django.utils.translation import ugettext as _
from sigi.apps.mesas.models import (Legislatura, Coligacao, ComposicaoColigacao,
SessaoLegislativa, MesaDiretora, Cargo,
@ -26,7 +27,7 @@ class LegislaturaAdmin(BaseModelAdmin):
def uf(self, obj):
return obj.casa_legislativa.municipio.uf.sigla
uf.short_description = 'UF'
uf.short_description = _(u'UF')
uf.admin_order_field = 'casa_legislativa__municipio__uf'
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
from django.db import models
from django.utils.translation import ugettext as _
from sigi.apps.casas.models import CasaLegislativa
class Legislatura(models.Model):
casa_legislativa = models.ForeignKey(CasaLegislativa)
numero = models.PositiveSmallIntegerField(u'número legislatura')
data_inicio = models.DateField(u'início')
data_fim = models.DateField(u'fim')
data_eleicao = models.DateField(u'data da eleição')
total_parlamentares = models.PositiveIntegerField(u"Total de parlamentares")
numero = models.PositiveSmallIntegerField(_(u'número legislatura'))
data_inicio = models.DateField(_(u'início'))
data_fim = models.DateField(_(u'fim'))
data_eleicao = models.DateField(_(u'data da eleição'))
total_parlamentares = models.PositiveIntegerField(_(u"Total de parlamentares"))
casa_legislativa.convenio_uf_filter = True
casa_legislativa.convenio_cl_tipo_filter = True
@ -19,34 +21,38 @@ class Legislatura(models.Model):
ordering = ['casa_legislativa__municipio__uf__sigla', '-data_inicio']
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):
nome = models.CharField(max_length=50)
legislatura = models.ForeignKey(Legislatura)
numero_votos = models.PositiveIntegerField(
u'número de votos',
_(u'número de votos'),
blank=True,
null=True,
)
class Meta:
ordering = ('legislatura', 'nome')
verbose_name = 'coligação'
verbose_name_plural = 'coligações'
verbose_name = _(u'coligação')
verbose_name_plural = _(u'coligações')
def __unicode__(self):
return self.nome
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')
class Meta:
verbose_name = 'composição da coligação'
verbose_name_plural = 'composições das coligações'
verbose_name = _(u'composição da coligação')
verbose_name_plural = _(u'composições das coligações')
def __unicode__(self):
return str(self.id)
@ -54,13 +60,13 @@ class ComposicaoColigacao(models.Model):
class SessaoLegislativa(models.Model):
SESSAO_CHOICES = (
('O', 'Ordinária'),
('E', 'Extraordinária'),
('O', _(u'Ordiná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(
'MesaDiretora',
verbose_name='Mesa Diretora'
verbose_name=_(u'Mesa Diretora')
)
legislatura = models.ForeignKey(Legislatura)
tipo = models.CharField(
@ -68,23 +74,23 @@ class SessaoLegislativa(models.Model):
choices=SESSAO_CHOICES,
default='O'
)
data_inicio = models.DateField(u'início')
data_fim = models.DateField('fim')
data_inicio = models.DateField(_(u'início'))
data_fim = models.DateField(_(u'fim'))
data_inicio_intervalo = models.DateField(
u'início de intervalo',
_(u'início de intervalo'),
blank=True,
null=True
)
data_fim_intervalo = models.DateField(
'fim de intervalo',
_(u'fim de intervalo'),
blank=True,
null=True
)
class Meta:
ordering = ('legislatura', 'numero')
verbose_name = 'Sessão Legislativa'
verbose_name_plural = 'Sessões Legislativas'
verbose_name = _(u'Sessão Legislativa')
verbose_name_plural = _(u'Sessões Legislativas')
def __unicode__(self):
return str(self.numero)
@ -93,19 +99,19 @@ class SessaoLegislativa(models.Model):
class MesaDiretora(models.Model):
casa_legislativa = models.ForeignKey(
'casas.CasaLegislativa',
verbose_name='Casa Legislativa'
verbose_name=_(u'Casa Legislativa')
)
class Meta:
verbose_name = 'Mesa Diretora'
verbose_name_plural = 'Mesas Diretoras'
verbose_name = _(u'Mesa Diretora')
verbose_name_plural = _(u'Mesas Diretoras')
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):
descricao = models.CharField(u'descrição', max_length=30)
descricao = models.CharField(_(u'descrição'), max_length=30)
class Meta:
ordering = ('descricao',)
@ -122,8 +128,8 @@ class MembroMesaDiretora(models.Model):
class Meta:
ordering = ('parlamentar',)
unique_together = ('cargo', 'mesa_diretora')
verbose_name = 'membro de Mesa Diretora'
verbose_name_plural = 'membros de Mesas Diretora'
verbose_name = _(u'membro de Mesa Diretora')
verbose_name_plural = _(u'membros de Mesas Diretora')
def __unicode__(self):
return '%s (%s)' % (unicode(self.parlamentar), unicode(self.cargo))

4
sigi/apps/metas/admin.py

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

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

@ -22,11 +22,13 @@
# 02110-1301, USA.
#
from django.core.management.base import BaseCommand
from django.utils.translation import ugettext as _
from sigi.apps.metas.views import gera_map_data_file
class Command(BaseCommand):
help = u'Gera arquivo de dados de plotagem do mapa de atuação do Interlegis.'
help = _(u'Gera arquivo de dados de plotagem do mapa de atuação do Interlegis.')
def handle(self, *args, **options):
result = gera_map_data_file(cronjob=True)

54
sigi/apps/metas/models.py

@ -1,32 +1,34 @@
# -*- coding: utf-8 -*-
from datetime import date, datetime
from datetime import date
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.diagnosticos.models import Diagnostico
from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.financeiro.models import Desembolso
class Meta(models.Model):
ALGORITMO_CHOICES = (
('SUM_GASTOS', u'Soma dos desembolsos'),
('COUNT_EQUI', u'Quantidade de casas equipadas'),
('COUNT_ADER', u'Quantidade de casas aderidas'),
('COUNT_DIAG', u'Quantidade de casas diagnosticadas'),
('COUNT_PDIR', u'Quantidade de planos diretores'),
('COUNT_CONV', u'Quantidade de casas conveniadas'),
('SUM_GASTOS', _(u'Soma dos desembolsos')),
('COUNT_EQUI', _(u'Quantidade de casas equipadas')),
('COUNT_ADER', _(u'Quantidade de casas aderidas')),
('COUNT_DIAG', _(u'Quantidade de casas diagnosticadas')),
('COUNT_PDIR', _(u'Quantidade de planos diretores')),
('COUNT_CONV', _(u'Quantidade de casas conveniadas')),
)
projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto', help_text=u'Projeto ao qual a meta se refere')
titulo = models.CharField(u'Título', max_length=40, help_text=u'Título da meta que aparecerá no dashboard')
descricao = models.TextField(u'Descrição')
data_inicio = models.DateField(u'Data inicial', help_text=u'Início do período de cômputo da meta')
data_fim = models.DateField(u'Data final', help_text=u'Prazo final para cumprimento da meta')
algoritmo = models.CharField(u'Algoritmo de cálculo', max_length=10, choices=ALGORITMO_CHOICES)
valor_meta = models.FloatField(u'Valor da meta', help_text=u'Valor que deve ser atingido até o prazo final da meta')
projeto = models.ForeignKey(Projeto, verbose_name=_(u'Projeto'), help_text=_(u'Projeto ao qual a meta se refere'))
titulo = models.CharField(_(u'Título'), max_length=40, help_text=_(u'Título da meta que aparecerá no dashboard'))
descricao = models.TextField(_(u'Descrição'))
data_inicio = models.DateField(_(u'Data inicial'), help_text=_(u'Início do período de cômputo da meta'))
data_fim = models.DateField(_(u'Data final'), help_text=_(u'Prazo final para cumprimento da meta'))
algoritmo = models.CharField(_(u'Algoritmo de cálculo'), max_length=10, choices=ALGORITMO_CHOICES)
valor_meta = models.FloatField(_(u'Valor da meta'), help_text=_(u'Valor que deve ser atingido até o prazo final da meta'))
class Meta:
verbose_name = 'Meta BID'
verbose_name_plural = 'Metas BID'
verbose_name = _(u'Meta BID')
verbose_name_plural = _(u'Metas BID')
def __unicode__(self):
return self.titulo
@ -109,19 +111,19 @@ class Meta(models.Model):
class PlanoDiretor(models.Model):
STATUS_CHOICE = (
('E', u'Entregue'),
('I', u'Implantado'),
('E', _(u'Entregue')),
('I', _(u'Implantado')),
)
projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto')
casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=u'Casa Legislativa')
projeto = models.ForeignKey(Projeto, verbose_name=_(u'Projeto'))
casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=_(u'Casa Legislativa'))
casa_legislativa.casa_uf_filter = True
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_implantacao = models.DateField(u'Data de implantação', blank=True, null=True)
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_implantacao = models.DateField(_(u'Data de implantação'), blank=True, null=True)
class Meta:
verbose_name = 'Plano Diretor'
verbose_name_plural = 'Planos Diretores'
verbose_name = _(u'Plano Diretor')
verbose_name_plural = _(u'Planos Diretores')
def __unicode__(self):
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 -->
<label for="searchbar"><img src="{% static 'admin/img/icon_searchbox.png' %}" alt="Search" /></label>
<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"/>
<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="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>
</form>
</div>

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

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

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

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

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

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

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

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

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

@ -1,9 +1,10 @@
{% load charts %}
{% load i18n %}
{# ------------- Todas as metas ------------- #}
{# ------------- Todas as metas ------------- #}
<div style="height: 300px;" class="module">
<h2>Todas as metas</h2>
<h3>Estado das metas do contrato BID</h3>
<h2>{% trans 'Todas as metas' %}</h2>
<h3>{% trans 'Estado das metas do contrato BID' %}</h3>
<table style="margin: auto;">
{% for meta in metas %}
<tr>
@ -17,17 +18,17 @@
{% endfor %}
</table>
<div class="legend">
<span><div style="background-color: #E74A69;">&nbsp;</div>Ruim</span>
<span><div style="background-color: #FFDB6E;">&nbsp;</div>Preocupante</span>
<span><div style="background-color: #89D7AF;">&nbsp;</div>Bom</span>
<span><div style="background-color: #A2BBED;">&nbsp;</div>Atingido</span>
<span><div style="background-color: #E74A69;">&nbsp;</div>{% trans 'Ruim' %}</span>
<span><div style="background-color: #FFDB6E;">&nbsp;</div>{% trans 'Preocupante' %}</span>
<span><div style="background-color: #89D7AF;">&nbsp;</div>{% trans 'Bom' %}</span>
<span><div style="background-color: #A2BBED;">&nbsp;</div>{% trans 'Atingido' %}</span>
</div>
</div>
{# ------------- Evolução dos desembolsos ------------- #}
<div style="height: 300px;" class="module">
<h2>Evolução dos desembolsos</h2>
<h3>Desembolsos últimos seis meses</h3>
<h2>{% trans 'Evolução dos desembolsos' %}</h2>
<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 }}" />
</div>
@ -35,6 +36,6 @@
{# ------------- Evolução dos desembolsos ------------- #}
<div style="height: 300px;" class="module">
<h2>Todas as metas</h2>
<h3>Estado das metas do contrato BID</h3>
<h3>Estado das metas do contrato BID</h3>
</div>
{% endcomment %}
{% endcomment %}

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

@ -1,35 +1,20 @@
# -*- coding: utf-8 -*-
from django import template
from django.utils.safestring import mark_safe
from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.metas.views import parliament_summary
register = template.Library()
@register.filter(name='map_desc_serv')
def descricao_servicos(value):
if not isinstance(value, CasaLegislativa):
def descricao_servicos(casa):
if not isinstance(casa, CasaLegislativa):
return ""
result = ""
for sv in value.servico_set.all():
result += u'<li>%s ativado em %s</li>' % (sv.tipo_servico.nome, sv.data_ativacao.strftime('%d/%m/%Y'))
for cv in value.convenio_set.all():
if (cv.data_retorno_assinatura is None) and (cv.equipada and cv.data_termo_aceite is not None):
result += u"<li>Equipada em %s pelo %s</li>" % (cv.data_termo_aceite.strftime('%d/%m/%Y'), cv.projeto.sigla)
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 >>")
summary = parliament_summary(casa)
result = ''.join('<li>%s</li>' % info for info in summary['info'])
return mark_safe(result)
descricao_servicos.is_safe = True

137
sigi/apps/metas/views.py

@ -1,29 +1,31 @@
# -*- coding: utf-8 -*-
import csv
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
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
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from django.utils.datastructures import SortedDict
from django.db.models import Q
from django.db.models.aggregates import Sum
from django.http import HttpResponse
from django.shortcuts import render_to_response
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.db.models.aggregates import Sum
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 easy_thumbnails.templatetags.thumbnail import thumbnail_url
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.metas.templatetags.mapa_tags import descricao_servicos
from functools import reduce
from easy_thumbnails.templatetags.thumbnail import thumbnail_url
import time
from sigi.apps.servicos.models import TipoServico
from sigi.apps.utils import to_ascii
from sigi.settings import MEDIA_ROOT, STATIC_URL
from sigi.shortcuts import render_to_pdf
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
if c.pk not in casas:
casa = {
'nome': c.nome + ', ' + c.municipio.uf.sigla,
'icone': '/static/img/mapmarker.png',
'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
summary = parliament_summary(c)
summary['info'] = "<br/>".join(summary['info'])
casas[c.pk] = summary
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
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
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 -*-
from django.contrib import admin
from django.contrib.admin.views.main import ChangeList
from django.utils.translation import ugettext as _
from filters import OcorrenciaListFilter
from sigi.apps.ocorrencias.models import Ocorrencia, Comentario, Anexo, Categoria, TipoContato
@ -13,7 +14,7 @@ class ComentarioViewInline(admin.TabularInline):
extra = 0
max_num = 0
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', )
readonly_fields = ('novo_status', 'encaminhar_setor', 'descricao', 'data_criacao', 'usuario',)
@ -21,7 +22,7 @@ class ComentarioViewInline(admin.TabularInline):
class ComentarioInline(admin.StackedInline):
model = Comentario
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', )}),)
def get_queryset(self, queryset):
@ -114,12 +115,12 @@ class OcorrenciaAdmin(BaseModelAdmin):
def get_uf(self, obj):
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'
def get_municipio(self, obj):
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'

8
sigi/apps/ocorrencias/filters.py

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

81
sigi/apps/ocorrencias/models.py

@ -1,24 +1,25 @@
# -*- coding: utf-8 -*-
from django.db import models
from django.utils.translation import ugettext as _
class Categoria(models.Model):
nome = models.CharField(u"Categoria", max_length=50)
descricao = models.TextField(u'descrição', blank=True, null=True)
setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=u"Setor responsável")
nome = models.CharField(_(u"Categoria"), max_length=50)
descricao = models.TextField(_(u'descrição'), blank=True, null=True)
setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=_(u"Setor responsável"))
class Meta:
verbose_name, verbose_name_plural = u'Categoria', u'Categorias'
verbose_name, verbose_name_plural = _(u'Categoria'), _(u'Categorias')
def __unicode__(self):
return self.nome
class TipoContato(models.Model):
descricao = models.CharField(u"Descrição", max_length=50)
descricao = models.CharField(_(u"Descrição"), max_length=50)
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):
return self.descricao
@ -26,40 +27,40 @@ class TipoContato(models.Model):
class Ocorrencia(models.Model):
STATUS_CHOICES = (
(1, u'Aberto'),
(2, u'Reaberto'),
(3, u'Resolvido'),
(4, u'Fechado'),
(5, u'Duplicado'),
(1, _(u'Aberto')),
(2, _(u'Reaberto')),
(3, _(u'Resolvido')),
(4, _(u'Fechado')),
(5, _(u'Duplicado')),
)
PRIORITY_CHOICES = (
(1, u'Altíssimo'),
(2, u'Alto'),
(3, u'Normal'),
(4, u'Baixo'),
(5, u'Baixíssimo'),
(1, _(u'Altíssimo')),
(2, _(u'Alto')),
(3, _(u'Normal')),
(4, _(u'Baixo')),
(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_cl_tipo_filter = 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)
categoria = models.ForeignKey(Categoria, verbose_name=u'Categoria')
tipo_contato = models.ForeignKey(TipoContato, verbose_name=u"Tipo de contato")
assunto = models.CharField(u'Assunto', max_length=200)
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)
categoria = models.ForeignKey(Categoria, verbose_name=_(u'Categoria'))
tipo_contato = models.ForeignKey(TipoContato, verbose_name=_(u"Tipo de contato"))
assunto = models.CharField(_(u'Assunto'), max_length=200)
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
prioridade = models.IntegerField(u'Prioridade', choices=PRIORITY_CHOICES, default=3, )
descricao = models.TextField(u'descriçã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")
setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=u"Setor responsável")
prioridade = models.IntegerField(_(u'Prioridade'), choices=PRIORITY_CHOICES, default=3, )
descricao = models.TextField(_(u'descriçã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"))
setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=_(u"Setor responsável"))
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', ]
def __unicode__(self):
@ -67,23 +68,23 @@ class Ocorrencia(models.Model):
class Comentario(models.Model):
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)
descricao = models.TextField(u'Descrição', blank=True, null=True)
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)
encaminhar_setor = models.ForeignKey('servidores.Servico', verbose_name=u'Encaminhar para setor', blank=True, null=True)
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)
descricao = models.TextField(_(u'Descrição'), blank=True, null=True)
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)
encaminhar_setor = models.ForeignKey('servidores.Servico', verbose_name=_(u'Encaminhar para setor'), blank=True, null=True)
class Anexo(models.Model):
ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência')
arquivo = models.FileField(u'Arquivo anexado', upload_to='apps/ocorrencia/anexo/arquivo',)
descricao = models.CharField(u'descrição do anexo', max_length='70')
data_pub = models.DateTimeField(u'data da publicação do anexo', null=True, blank=True, auto_now_add=True)
ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=_(u'ocorrência'))
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')
data_pub = models.DateTimeField(_(u'data da publicação do anexo'), null=True, blank=True, auto_now_add=True)
class Meta:
ordering = ('-data_pub',)
verbose_name, verbose_name_plural = u'Anexo', u'Anexos'
verbose_name, verbose_name_plural = _(u'Anexo'), _(u'Anexos')
def __unicode__(self):
return u"%(arquivo_name)s: %(descricao)s" % {'arquivo_name': self.arquivo.name, 'descricao': self.descricao}

13
sigi/apps/parlamentares/admin.py

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

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

105
sigi/apps/parlamentares/reports.py

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

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

@ -7,15 +7,15 @@
{% endblock %}
{% block title %}Parlamentares no Carrinho | SIGI{% endblock %}
{% block content_title %}<h1>Parlamentares no Carrinho</h1>{% endblock %}
{% block title %}{% trans 'Parlamentares no Carrinho | SIGI' %}{% endblock %}
{% block content_title %}<h1>{% trans 'Parlamentares no Carrinho' %}</h1>{% endblock %}
{% block mensagem%}
<ul class="messagelist">
{%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%}
<li>{{paginas.paginator.count}}Parlamentares no carrinho.</li>
<li>{{paginas.paginator.count}} {% trans 'Parlamentares no carrinho' %}.</li>
{%endif%}
</ul>
{% endblock %}
@ -30,9 +30,9 @@
<th class="sorted ascending"><!-- <input type="checkbox" id="action-toggle" style="display: inline;">-->
</th>
{% endif %}
<th class="sorted ascending">Nome</th>
<th class="sorted ascending">Nome parlamentar</th>
<th class="sorted ascending">Sexo</th>
<th class="sorted ascending">{% trans 'Nome' %}</th>
<th class="sorted ascending">{% trans 'Nome parlamentar' %}</th>
<th class="sorted ascending">{% trans 'Sexo' %}</th>
</tr>
</thead>
<tbody>
@ -54,12 +54,12 @@
{% block botoes %}
<div id="tabs">
<ul>
<li><a href="#tabs-1">Etiqueta</a></li>
<li><a href="#tabs-1">{% trans 'Etiqueta' %}</a></li>
</ul>
<div id="tabs-1">
<form action="../labels/{{query_str}}" method="post">{% csrf_token %}
<fieldset><legend>Formato da Etiqueta</legend>
<form id="generate_labels" action="../labels/{{query_str}}" method="post">{% csrf_token %}
<fieldset><legend>{% trans 'Formato da Etiqueta' %}</legend>
<ul class="formato_etiqueta">
<li><input type="radio" name="tamanho_etiqueta"
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
def some_parlamentarians():
a = G(Parlamentar, nome_completo=u"Andre Silva", foto=None)
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 some_parliamentarians():
return parliamentarians_from_names(["Andre Silva", "Bartolomeu Gusmao", "Camila Carla"])
def test_list(some_parlamentarians, admin_client):
response = admin_client.get('/parlamentares/parlamentar', follow=True)
def parliamentarians_from_names(names):
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
decoded_content = response.content.decode('utf-8')
for x in some_parlamentarians:
assert x.nome_completo in decoded_content
for x in some_parliamentarians:
assert x.nome_completo in response.content
def test_list_filtered_by_capital_letter(some_parlamentarians, admin_client):
response = admin_client.get('/parlamentares/parlamentar/?nome_completo=B', follow=True)
def test_list_filtered_by_capital_letter(some_parliamentarians, app):
response = app.get('/parlamentares/parlamentar/?nome_completo=B')
assert response.status_code == 200
decoded_content = response.content.decode('utf-8')
a, b, c = some_parlamentarians
assert a.nome_completo not in decoded_content
assert b.nome_completo in decoded_content
assert c.nome_completo not in decoded_content
a, b, c = some_parliamentarians
assert a.nome_completo not in response.content
assert b.nome_completo in response.content
assert c.nome_completo not in response.content

1
sigi/apps/parlamentares/views.py

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

30
sigi/apps/relatorios/reports.py

@ -1,20 +1,20 @@
#-*- coding:utf-8 -*-
import os
from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, \
landscape, SystemField, BAND_WIDTH, ReportGroup, \
FIELD_ACTION_SUM, FIELD_ACTION_COUNT, Line
from django.templatetags.static import static
from django.utils.translation import ugettext as _
from geraldo import Report, ReportBand, ObjectValue, DetailBand, Label, SystemField, BAND_WIDTH, FIELD_ACTION_COUNT, Line
from geraldo.graphics import Image
from reportlab.lib.units import cm
from reportlab.lib.pagesizes import A4
from reportlab.lib.colors import navy
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):
#__metaclass__ = ABCMeta
title = u'Relatório'
author = u'Interlegis'
title = _(u'Relatório')
author = _(u'Interlegis')
print_if_empty = True
page_size = A4
@ -27,18 +27,18 @@ class ReportDefault(Report):
#BASE_DIR = os.path.abspath(os.getcwd() + '../..')
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,
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,
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}
),
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}
),
SystemField(
@ -52,8 +52,8 @@ class ReportDefault(Report):
height = 1 * cm
elements = [
SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3 * cm),
SystemField(expression=u'Página %(page_number)d de %(page_count)d', top=0.3 * cm,
SystemField(expression=_(u'%(now:%d/%m/%Y)s às %(now:%H:%M)s'), top=0.3 * cm),
SystemField(expression=_(u'Página %(page_number)d de %(page_count)d'), top=0.3 * cm,
width=BAND_WIDTH, style={'alignment': TA_RIGHT}
),
]
@ -67,7 +67,7 @@ class ReportDefault(Report):
class band_summary(ReportBand):
height = 0.8 * cm
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,
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, {
'fields': ('casa_legislativa', 'data_ativacao',)
}),
('Serviço', {
(_(u'Serviço'), {
'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),)
}),
('Contatos', {
(_(u'Contatos'), {
'fields': ('contato_tecnico', 'contato_administrativo',)
}),
('Alterações', {
(_(u'Alterações'), {
'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',)
}))
readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao')
@ -76,17 +76,17 @@ class ServicoAdmin(BaseModelAdmin):
def get_codigo_interlegis(self, obj):
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'
def get_uf(self, obj):
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'
def getUrl(self, obj):
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
def get_link_erro(self, obj):
@ -98,15 +98,15 @@ class ServicoAdmin(BaseModelAdmin):
url += obj.tipo_servico.string_pesquisa
return u'<a href="%s" target="_blank">%s</a>' % (url, obj.erro_atualizacao)
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'
def calcular_data_uso(self, request, queryset):
for servico in queryset:
servico.atualiza_data_uso()
self.message_user(request, "Atualização concluída. Os sites que não responderam foram deixados com a data em branco")
self.message_user(request, _(u"Atualização concluída. Os sites que não responderam foram deixados com a data em branco"))
return HttpResponseRedirect('.')
calcular_data_uso.short_description = u"Atualizar a data do último uso do(s) serviço(s)"
calcular_data_uso.short_description = _(u"Atualizar a data do último uso do(s) serviço(s)")
def get_actions(self, request):
from django.utils.datastructures import SortedDict
@ -130,10 +130,10 @@ class ServicoAdmin(BaseModelAdmin):
def response_add(self, request, obj):
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:
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,))
elif "_save" in request.POST:
self.message_user(request, msg)
@ -143,10 +143,10 @@ class ServicoAdmin(BaseModelAdmin):
def response_change(self, request, obj):
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:
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,))
elif "_save" in request.POST:
self.message_user(request, msg)
@ -191,12 +191,15 @@ class CasaAtendidaAdmin(BaseModelAdmin):
def get_servicos(self, obj):
result = []
for servico in obj.servico_set.all():
result.append(u"%s (%s). Contato: %s" % (servico.tipo_servico.nome, 'ativo' if servico.data_desativacao is None
else 'Desativado', servico.contato_administrativo.nome))
result.append(u"%s (%s). %s: %s" % (
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>"
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):
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.
#
from django.core.management.base import BaseCommand
from django.utils.translation import ugettext as _
from sigi.apps.servicos.models import Servico
class Command(BaseCommand):
help = u'Atualiza a informação de data de último serviço dos serviços SEIT hospedados no Interlegis.'
help = _(u'Atualiza a informação de data de último serviço dos serviços SEIT hospedados no Interlegis.')
def handle(self, *args, **options):
verbosity = int(options['verbosity'])

98
sigi/apps/servicos/models.py

@ -1,22 +1,22 @@
# -*- coding: utf-8 -*-
from datetime import date
from django.db import models
from sigi.apps.casas.models import CasaLegislativa, Funcionario
from datetime import date
from django.core.mail import send_mail
from sigi.settings import DEFAULT_FROM_EMAIL
from django.utils.translation import ugettext as _
class TipoServico(models.Model):
email_help = u'''Use:<br/>
{url} para incluir a URL do serviço,<br/>
{senha} para incluir a senha inicial do serviço'''
nome = models.CharField(u'Nome', max_length=60)
sigla = models.CharField(u'Sigla', max_length='12')
string_pesquisa = models.CharField(u'String de pesquisa', blank=True, max_length=200,
help_text=u'Sufixo para pesquisa RSS para averiguar a data da última atualização do serviço')
template_email_ativa = models.TextField(u'Template de email de ativação', help_text=email_help, blank=True)
template_email_altera = models.TextField(u'Template de email de alteração', help_text=email_help, blank=True)
template_email_desativa = models.TextField(u'Template de email de desativação', help_text=email_help + u'<br/>{motivo} para incluir o motivo da desativação do serviço', blank=True)
nome = models.CharField(_(u'Nome'), max_length=60)
sigla = models.CharField(_(u'Sigla'), max_length='12')
string_pesquisa = models.CharField(_(u'String de pesquisa'), blank=True, max_length=200,
help_text=_(u'Sufixo para pesquisa RSS para averiguar a data da última atualização do serviço'))
template_email_ativa = models.TextField(_(u'Template de email de ativação'), help_text=email_help, blank=True)
template_email_altera = models.TextField(_(u'Template de email de alteração'), help_text=email_help, blank=True)
template_email_desativa = models.TextField(_(u'Template de email de desativação'), help_text=email_help + _(u'<br/>{motivo} para incluir o motivo da desativação do serviço'), blank=True)
@property
def qtde_casas_atendidas(self):
@ -24,32 +24,32 @@ class TipoServico(models.Model):
return self.servico_set.filter(data_desativacao=None).count()
class Meta:
verbose_name = u'Tipo de serviço'
verbose_name_plural = u'Tipos de serviço'
verbose_name = _(u'Tipo de serviço')
verbose_name_plural = _(u'Tipos de serviço')
def __unicode__(self):
return self.nome
class Servico(models.Model):
casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=u'Casa Legislativa')
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_administrativo = models.ForeignKey(Funcionario, verbose_name=u'Contato administrativo', related_name='contato_administrativo')
url = models.URLField(u'URL do serviço', blank=True)
hospedagem_interlegis = models.BooleanField(u'Hospedagem no Interlegis?', default=False)
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.')
porta_servico = models.PositiveSmallIntegerField(u'Porta de serviço (instância)', blank=True, null=True)
senha_inicial = models.CharField(u'Senha inicial', max_length=33, blank=True)
data_ativacao = models.DateField(u'Data de ativação', default=date.today)
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)
motivo_desativacao = models.TextField(u'Motivo da desativação', blank=True)
data_ultimo_uso = models.DateField(u'Data da última utilização', blank=True, null=True,
help_text=u'Data em que o serviço foi utilizado pela Casa Legislativa pela última vez<br/><strong>NÃO É ATUALIZADO AUTOMATICAMENTE!</strong>')
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")
casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=_(u'Casa Legislativa'))
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_administrativo = models.ForeignKey(Funcionario, verbose_name=_(u'Contato administrativo'), related_name='contato_administrativo')
url = models.URLField(_(u'URL do serviço'), blank=True)
hospedagem_interlegis = models.BooleanField(_(u'Hospedagem no Interlegis?'), default=False)
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.'))
porta_servico = models.PositiveSmallIntegerField(_(u'Porta de serviço (instância)'), blank=True, null=True)
senha_inicial = models.CharField(_(u'Senha inicial'), max_length=33, blank=True)
data_ativacao = models.DateField(_(u'Data de ativação'), default=date.today)
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)
motivo_desativacao = models.TextField(_(u'Motivo da desativação'), blank=True)
data_ultimo_uso = models.DateField(_(u'Data da última utilização'), blank=True, null=True,
help_text=_(u'Data em que o serviço foi utilizado pela Casa Legislativa pela última vez<br/><strong>NÃO É ATUALIZADO AUTOMATICAMENTE!</strong>'))
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"))
# casa_legislativa.casa_uf_filter = True
@ -87,14 +87,14 @@ class Servico(models.Model):
opener = urllib2.build_opener(proxy)
req = opener.open(fullurl=url, timeout=5)
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)
return
try:
rss = req.read()
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
try:
@ -108,12 +108,12 @@ class Servico(models.Model):
self.erro_atualizacao = ""
self.save()
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)
return
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):
# Reter o objeto original para verificar mudanças
@ -123,11 +123,11 @@ class Servico(models.Model):
if self.id is None:
# 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
elif self.data_desativacao is not None and original.data_desativacao is None:
# 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
elif (self.tipo_servico != original.tipo_servico or
self.contato_tecnico != original.contato_tecnico or
@ -135,7 +135,7 @@ class Servico(models.Model):
self.nome_servidor != original.nome_servidor or
self.senha_inicial != original.senha_inicial):
# 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
else:
# Salvar o Servico
@ -157,17 +157,17 @@ class Servico(models.Model):
class LogServico(models.Model):
servico = models.ForeignKey(Servico, verbose_name='Serviço')
descricao = models.CharField('Breve descrição da ação', max_length=60)
data = models.DateField('Data da ação', default=date.today)
log = models.TextField('Log da ação')
servico = models.ForeignKey(Servico, verbose_name=_(u'Serviço'))
descricao = models.CharField(_(u'Breve descrição da ação'), max_length=60)
data = models.DateField(_(u'Data da ação'), default=date.today)
log = models.TextField(_(u'Log da ação'))
def __unicode__(self):
return "%s (%s)" % (self.descricao, self.data)
class Meta:
verbose_name = 'Log do serviço'
verbose_name_plural = 'Logs do serviço'
verbose_name = _(u'Log do serviço')
verbose_name_plural = _(u'Logs do serviço')
class CasaAtendidaManager(models.Manager):
@ -182,7 +182,7 @@ class CasaAtendida(CasaLegislativa):
class Meta:
proxy = True
verbose_name_plural = 'Casas atendidas'
verbose_name_plural = _(u'Casas atendidas')
objects = CasaAtendidaManager()
@ -191,16 +191,16 @@ class CasaManifesta(models.Model):
casa_legislativa = models.OneToOneField(CasaLegislativa)
data_manifestacao = models.DateTimeField(auto_now_add=True)
data_atualizacao = models.DateTimeField(auto_now=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)
email = models.EmailField(u'E-mail de contato', 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)
email = models.EmailField(_(u'E-mail de contato'), blank=True)
class ServicoManifesto(models.Model):
casa_manifesta = models.ForeignKey(CasaManifesta)
servico = models.ForeignKey(TipoServico)
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:
unique_together = ('casa_manifesta', 'servico')
@ -213,4 +213,4 @@ class RegistroServico(models.Model):
data_registro = models.DateTimeField(auto_now=True)
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>
<thead>
<tr>
<th colspan="2">Tipo de serviço</th>
<th>Hospedagem no Interlegis?</th>
<th>Data de ativação</th>
<th>Data da última alteração</th>
<th>Data de desativação</th>
<th colspan="2">{% trans 'Tipo de serviço' %}</th>
<th>{% trans 'Hospedagem no Interlegis?' %}</th>
<th>{% trans 'Data de ativação' %}</th>
<th>{% trans 'Data da última alteração' %}</th>
<th>{% trans 'Data de desativação' %}</th>
</tr>
</thead>
<tbody>
@ -31,10 +31,10 @@
<td>{{ srv.data_desativacao|date:'SHORT_DATE_FORMAT' }}</td>
</tr>
{% 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 %}
<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>
</tbody>
</table>

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

@ -20,14 +20,14 @@
{% block breadcrumbs %}
<div class="breadcrumbs">
{% 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 %}
{% if casa %}
<a href="./">Unidade da Federação</a> &rsaquo;
<a href="./?uf={{ casa.municipio.uf.sigla }}">Casa Legislativa</a> &rsaquo;
<a href="./">{% trans 'Unidade da Federação' %}</a> &rsaquo;
<a href="./?uf={{ casa.municipio.uf.sigla }}">{% trans 'Casa Legislativa' %}</a> &rsaquo;
{{ casa.nome }}
{% else %}
Unidade da Federação
{% trans 'Unidade da Federação' %}
{% endif %}
{% endif %}
</div>
@ -36,7 +36,7 @@
{% block content %}
<div id="content-main">
{% 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>
{% for uf in uf_list %}
<li><a href="./?uf={{ uf.sigla }}">{{ uf.nome }}</a></li>
@ -45,7 +45,7 @@
{% endif %}
{% if casa_list %}
<h3>2. Identifique sua Casa Legislativa</h3>
<h3>2. {% trans 'Identifique sua Casa Legislativa' %}</h3>
<br/>
<ul>
{% for casa in casa_list %}
@ -55,7 +55,7 @@
{% endif %}
{% 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 %}
{% for fieldset in cmf.fieldsets %}
{% if forloop.first %}
@ -85,13 +85,13 @@
{% endfor %}
</fieldset>
<fieldset class="module aligned {{ fieldset.classes }}">
<h2>Serviços e produtos Interlegis</h2>
<h2>{% trans 'Serviços e produtos Interlegis' %}</h2>
<table>
<tr>
<th>Nome do serviço ou produto</th>
<th>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>Marque se o serviço ou produto está hospedado no Interlegis</th>
<th>{% trans 'Nome do serviço ou produto' %}</th>
<th>{% trans 'Marque se a Casa utiliza este serviço ou produto' %}</th>
<th>{% trans 'Informe a URL onde se localiza o serviço ou produto' %}</th>
<th>{% trans 'Marque se o serviço ou produto está hospedado no Interlegis' %}</th>
</tr>
{% else %}
<tr>
@ -113,14 +113,14 @@
{% endif %}
{% if thanks %}
<h1>Obrigado por responder à nossa pesquisa!</h1>
<h3>Quadro resumo das informações prestadas:</h3>
<h1>{% trans 'Obrigado por responder à nossa pesquisa' %}!</h1>
<h3>{% trans 'Quadro resumo das informações prestadas' %}:</h3>
<table>
{% 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 %}
</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 %}
{% endblock %}

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

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

38
sigi/apps/servicos/views.py

@ -1,20 +1,19 @@
# -*- coding: utf-8 -*-
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo
from django import forms
from django.db.models import Q
from django.forms.forms import BoundField
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.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.utils.encoding import force_unicode
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.utils.translation import ugettext as _
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):
@ -84,9 +83,9 @@ def casa_manifesta_view(request):
fieldsets = ((None, ('informante', 'cargo', 'email'),),)
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['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['possui_%s' % ts.pk] = forms.BooleanField(label=_(u'Possui o serviço de %s') % ts.nome, required=False)
campos['url_%s' % ts.pk] = forms.URLField(label=_(u'Informe a URL'), required=False)
campos['hospedagem_interlegis_%s' % ts.pk] = forms.BooleanField(label=_(u'Serviço está hospedado no Interlegis'), required=False)
fieldsets += ((ts.nome, ('possui_%s' % ts.pk, 'url_%s' % ts.pk, 'hospedagem_interlegis_%s' % ts.pk)),)
CasaManifestaForm = type('', (CasaManifestaProtoForm,), campos)
@ -100,20 +99,21 @@ def casa_manifesta_view(request):
cm.cargo = cmf.cleaned_data['cargo']
cm.email = cmf.cleaned_data['email']
cm.save()
thanks.append((u'Informante', cmf.cleaned_data['informante']))
thanks.append((u'Cargo', cmf.cleaned_data['cargo']))
thanks.append((u'E-mail', cmf.cleaned_data['email']))
thanks.append((_(u'Informante'), cmf.cleaned_data['informante']))
thanks.append((_(u'Cargo'), cmf.cleaned_data['cargo']))
thanks.append((_(u'E-mail'), cmf.cleaned_data['email']))
for ts in TipoServico.objects.all():
if cmf.cleaned_data['possui_%s' % ts.pk]:
sm, created = ServicoManifesto.objects.get_or_create(casa_manifesta=cm, servico=ts)
sm.url = cmf.cleaned_data['url_%s' % ts.pk]
sm.hospedagem_interlegis = cmf.cleaned_data['hospedagem_interlegis_%s' % ts.pk]
sm.save()
thanks.append((ts.nome, u'Possui o serviço acessível em %s %s' % (sm.url, u'hospedado no Interlegis' if
sm.hospedagem_interlegis else '')))
thanks.append((ts.nome, _(u'Possui o serviço acessível em %(url)s %(obs)s') % dict(
url=sm.url,
obs=_(u'hospedado no Interlegis') if sm.hospedagem_interlegis else '')))
else:
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}
else:
extra_context = {'casa': casa, 'cmf': cmf}

13
sigi/apps/servidores/admin.py

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

47
sigi/apps/servidores/forms.py

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

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

@ -1,12 +1,15 @@
# coding= utf-8
import sys
import csv
import re
from datetime import datetime
from django.core.management.base import BaseCommand, CommandError
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.servidores.models import Servidor, Servico, Subsecretaria
# Funcao.objects.all().delete()
# Ferias.objects.all().delete()
@ -21,7 +24,7 @@ class MigrationError(Exception):
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):
return datetime.strptime(data, "%Y-%m-%d 00:00:00")
@ -222,7 +225,7 @@ class Command(BaseCommand):
funcao.bap_saida = p['bap_saida']
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
pass

11
sigi/apps/servidores/models.py

@ -1,8 +1,9 @@
# -*- coding: utf-8 -*-
from django.contrib.auth.models import User
from django.contrib.contenttypes import generic
from django.db import models
from django.db.models.signals import post_save
from django.contrib.contenttypes import generic
from django.contrib.auth.models import User
from django.utils.translation import ugettext as _
class Subsecretaria(models.Model):
@ -27,7 +28,7 @@ class Servico(models.Model):
""" 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)
subsecretaria = models.ForeignKey(Subsecretaria, null=True)
# servidor responsavel por chefiar o serviço
@ -35,8 +36,8 @@ class Servico(models.Model):
class Meta:
ordering = ('nome',)
verbose_name = 'serviço'
verbose_name_plural = 'serviços'
verbose_name = _(u'serviço')
verbose_name_plural = _(u'serviços')
def __unicode__(self):
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' %}
{% load i18n %}
{% block form_top %}
{% if adminform.form.instance.user %}
<fieldset style="background:transparent" id="fieldset-2" class="_module _aligned">
<legend>
Dados do LDAP
{% trans 'Dados do LDAP' %}
</legend>
<div class="fields">
<div class="row"><div class="control-group">
<div class="col-md-12 form-group ">
<div class="control-label col-md-3">
<label>Primeiro Nome:</label>
<label>{% trans 'Primeiro Nome' %}:</label>
</div>
<div class="controls col-md-9">
<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="col-md-12 form-group ">
<div class="control-label col-md-3">
<label>Último Nome:</label>
<label>{% trans 'Último Nome' %}:</label>
</div>
<div class="controls col-md-9">
<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="col-md-12 form-group ">
<div class="control-label col-md-3">
<label>Email Principal:</label>
<label>{% trans 'Email Principal' %}:</label>
</div>
<div class="controls col-md-9">
<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 %}
<li><a href="/servidores/servidores_por_cargo.pdf" class="historylink">
<span class="glyphicon glyphicon-list-alt"></span>
Relatório por cargo
{% trans 'Relatório por cargo' %}
</a></li>
<li><a href="/servidores/servidores_por_funcao.pdf" class="historylink">
<span class="glyphicon glyphicon-list-alt"></span>
Relatório por função
{% trans 'Relatório por função' %}
</a></li>
{{ block.super }}
{% endblock %}

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

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

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

@ -1,4 +1,5 @@
{% extends "base_report.html" %}
{% load i18n %}
{% block extra_head %}
<style type="text/css">
@ -21,17 +22,17 @@
{% endblock %}
{% block subsecretaria %}
SUBSECRETARIA DE ADMINISTRAÇÃO – SSADM
{% trans 'SUBSECRETARIA DE ADMINISTRAÇÃO – SSADM' %}
{% endblock %}
{% block report %}
<div>
<h1>Relatório de Servidores por Função</h1>
<h1>{% trans 'Relatório de Servidores por Função' %}</h1>
<table class="report">
<tr class="title">
<td class="index"></td>
<td>Função</td>
<td>Servidores</td>
<td>{% trans 'Função' %}</td>
<td>{% trans 'Servidores' %}</td>
</tr>
{% for r in report %}
<tr class="data">
@ -42,7 +43,7 @@ SUBSECRETARIA DE ADMINISTRAÇÃO – SSADM
{% endfor %}
<tr class="data total">
<td></td>
<td>Total</td>
<td>{% trans 'Total' %}</td>
<td>{{ total }}</td>
</tr>
</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.utils.translation import ugettext as _
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext as _
class AdminImageWidget(AdminFileWidget):
@ -13,6 +13,6 @@ class AdminImageWidget(AdminFileWidget):
output.append(
u''' <a href="%s" target="_blank"><img src="%s" width="100"
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))
return mark_safe(u''.join(output))

14
sigi/apps/utils/email.py

@ -1,8 +1,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.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):
@ -16,13 +16,13 @@ def enviar_email(from_email, subject, template, tags):
template.
"""
if from_email is None:
raise ValueError("Insira o email do remetente.")
raise ValueError(_(u"Insira o email do remetente."))
elif subject is None:
raise ValueError("Insira o assunto da mensagem.")
raise ValueError(_(u"Insira o assunto da mensagem."))
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:
raise ValueError("Insira o conteúdo da mensagem.")
raise ValueError(_(u"Insira o conteúdo da mensagem."))
# Gerando a mensagem
mensagem = render_to_string(template, tags)

26
sigi/apps/utils/test_base_admin.py

@ -1,15 +1,23 @@
# -*- coding: utf-8 -*-
def test_clear_all_filters_is_disabled_if_no_filter_was_used(admin_client):
response = admin_client.get('/parlamentares/parlamentar', follow=True)
assert response.status_code == 200
assert '<li class="clear-all-filter disabled"><a href="?">Clear All Filters</a></li>' in response.content
def get_li_clear_all_filters(res):
text = res.html.find(text='Clear All Filters')
li = text.find_parent('li')
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
response = admin_client.get('/parlamentares/parlamentar/?nome_completo=B', follow=True)
assert response.status_code == 200
# and there is no "disabled" css class
assert '<li class="clear-all-filter"><a href="?">Clear All Filters</a></li>' in response.content
res = app.get('/parlamentares/parlamentar/?nome_completo=B')
assert res.status_code == 200
li = get_li_clear_all_filters(res)
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 -*-
from itertools import cycle
import datetime
from django.utils.translation import ugettext as _
from sigi.apps.casas.models import CasaLegislativa
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.metas.models import Meta
from sigi.apps.servicos.models import TipoServico
def charts_data(request):
@ -81,14 +83,14 @@ def busca_informacoes_camara():
# Cabecalho da esquerda na tabela
cabecalho_esquerda = (
u'Câmaras municipais',
u'Câmaras municipais não aderidas',
u'Câmaras municipais aderidas',
u'Câmaras municipais com convênios assinados',
u'Câmaras municipais convênios em andamento',
u'Câmaras municipais equipadas',
u'Diagnósticos digitados',
u'Diagnósticos publicados'
_(u'Câmaras municipais'),
_(u'Câmaras municipais não aderidas'),
_(u'Câmaras municipais aderidas'),
_(u'Câmaras municipais com convênios assinados'),
_(u'Câmaras municipais convênios em andamento'),
_(u'Câmaras municipais equipadas'),
_(u'Diagnósticos digitados'),
_(u'Diagnósticos publicados')
)
linhas = (
@ -184,6 +186,6 @@ def busca_informacoes_seit():
def busca_informacoes_diagnostico():
return [
{'title': 'Diagnósticos digitados', 'count': Diagnostico.objects.count()},
{'title': 'Diagnósticos publicados', 'count': Diagnostico.objects.filter(publicado=True).count()},
{'title': _(u'Diagnósticos digitados'), 'count': Diagnostico.objects.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

41
sigi/settings/base.py

@ -32,6 +32,7 @@ SITE_ID = 1
TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS + (
'sigi.context_processors.charts_data',
'django.core.context_processors.request',
)
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = ('django.template.loaders.filesystem.Loader',
@ -55,6 +56,7 @@ INSTALLED_APPS = (
'django.contrib.staticfiles',
# Local apps
'sigi.apps.home',
'sigi.apps.contatos',
'sigi.apps.servidores',
'sigi.apps.parlamentares',
@ -67,7 +69,7 @@ INSTALLED_APPS = (
'sigi.apps.ocorrencias',
'sigi.apps.financeiro',
'sigi.apps.diagnosticos',
# Integração com Saberes (moodle)
'sigi.apps.mdl',
'sigi.apps.saberes',
@ -77,7 +79,6 @@ INSTALLED_APPS = (
'reporting',
'django_extensions',
'googlecharts',
'treemenus',
'easy_thumbnails',
'image_cropping',
@ -131,10 +132,6 @@ SESSION_EXPIRE_AT_BROWSER_CLOSE = True
# Using pytest directly (without a test runner)
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
THUMBNAIL_PROCESSORS = (
'image_cropping.thumbnail_processors.crop_corners',
@ -142,8 +139,38 @@ THUMBNAIL_PROCESSORS = (
THUMBNAIL_ALIASES = {
'': {
'small': {'size': (300, 225), 'crop': True,},
'small': {'size': (300, 225), 'crop': True, },
},
}
IMAGE_CROPPING_SIZE_WARNING = True
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