Browse Source

Remove modificador u das strings

revisaoSidenav
Sesostris Vieira 3 years ago
parent
commit
a93a0cb48e
  1. 116
      sigi/apps/casas/admin.py
  2. 20
      sigi/apps/casas/forms.py
  3. 22
      sigi/apps/casas/management/commands/importa_gerentes.py
  4. 146
      sigi/apps/casas/models.py
  5. 12
      sigi/apps/casas/reports.py
  6. 110
      sigi/apps/casas/views.py
  7. 2
      sigi/apps/contatos/admin.py
  8. 10
      sigi/apps/contatos/filters.py
  9. 16
      sigi/apps/contatos/management/commands/importa_mesomicro.py
  10. 208
      sigi/apps/contatos/models.py
  11. 36
      sigi/apps/convenios/admin.py
  12. 296
      sigi/apps/convenios/models.py
  13. 50
      sigi/apps/convenios/reports.py
  14. 42
      sigi/apps/convenios/views.py
  15. 16
      sigi/apps/diagnosticos/admin.py
  16. 6
      sigi/apps/diagnosticos/forms.py
  17. 74
      sigi/apps/diagnosticos/management/commands/ls_export.py
  18. 42
      sigi/apps/diagnosticos/models.py
  19. 4
      sigi/apps/diagnosticos/views.py
  20. 10
      sigi/apps/diagnosticos/widgets.py
  21. 10
      sigi/apps/eventos/admin.py
  22. 4
      sigi/apps/eventos/forms.py
  23. 4
      sigi/apps/eventos/migrations/0001_initial.py
  24. 2
      sigi/apps/eventos/migrations/0006_auto_20210416_0841.py
  25. 186
      sigi/apps/eventos/models.py
  26. 20
      sigi/apps/eventos/views.py
  27. 16
      sigi/apps/financeiro/models.py
  28. 44
      sigi/apps/home/views.py
  29. 26
      sigi/apps/inventario/models.py
  30. 2
      sigi/apps/metas/admin.py
  31. 50
      sigi/apps/metas/models.py
  32. 10
      sigi/apps/metas/views.py
  33. 8
      sigi/apps/ocorrencias/admin.py
  34. 8
      sigi/apps/ocorrencias/filters.py
  35. 88
      sigi/apps/ocorrencias/models.py
  36. 20
      sigi/apps/ocorrencias/views.py
  37. 14
      sigi/apps/parlamentares/admin.py
  38. 84
      sigi/apps/parlamentares/models.py
  39. 88
      sigi/apps/parlamentares/reports.py
  40. 14
      sigi/apps/relatorios/reports.py
  41. 76
      sigi/apps/servicos/admin.py
  42. 4
      sigi/apps/servicos/management/commands/atualiza_uso_servico.py
  43. 30
      sigi/apps/servicos/management/commands/importa_servico.py
  44. 134
      sigi/apps/servicos/models.py
  45. 48
      sigi/apps/servicos/views.py
  46. 24
      sigi/apps/servidores/admin.py
  47. 4
      sigi/apps/servidores/forms.py
  48. 30
      sigi/apps/servidores/management/commands/mescla_servidor.py
  49. 2
      sigi/apps/servidores/management/commands/migra.py
  50. 2
      sigi/apps/servidores/management/commands/sync_ldap.py
  51. 40
      sigi/apps/servidores/management/commands/test_sync_ldap.py
  52. 16
      sigi/apps/servidores/models.py
  53. 2
      sigi/apps/utils/__init__.py
  54. 6
      sigi/apps/utils/admin_widgets.py
  55. 8
      sigi/apps/utils/email.py
  56. 1
      sigi/settings/base.py

116
sigi/apps/casas/admin.py

@ -51,7 +51,7 @@ class PresidenteInline(admin.StackedInline):
readonly_fields = ('ult_alteracao',) readonly_fields = ('ult_alteracao',)
extra = 1 extra = 1
max_num = 1 max_num = 1
verbose_name_plural = _(u'Presidente') verbose_name_plural = _('Presidente')
def get_queryset(self, request): def get_queryset(self, request):
return (self.model.objects.exclude(desativado=True) return (self.model.objects.exclude(desativado=True)
.extra(select={'ult_null': 'ult_alteracao is null'}) .extra(select={'ult_null': 'ult_alteracao is null'})
@ -69,7 +69,7 @@ class ContatoInterlegisInline(admin.StackedInline):
readonly_fields = ('ult_alteracao',) readonly_fields = ('ult_alteracao',)
extra = 1 extra = 1
inlines = (TelefonesInline,) inlines = (TelefonesInline,)
verbose_name_plural = _(u'Contato(s) Interlegis Vigente(s)') verbose_name_plural = _('Contato(s) Interlegis Vigente(s)')
def get_queryset(self, request): def get_queryset(self, request):
return (self.model.objects.filter(setor='contato_interlegis') return (self.model.objects.filter(setor='contato_interlegis')
.extra(select={'ult_null': 'ult_alteracao is null'}).order_by('-ult_alteracao') .extra(select={'ult_null': 'ult_alteracao is null'}).order_by('-ult_alteracao')
@ -101,7 +101,7 @@ class FuncionariosInline(admin.StackedInline):
readonly_fields = ('ult_alteracao',) readonly_fields = ('ult_alteracao',)
extra = 1 extra = 1
inlines = (TelefonesInline,) inlines = (TelefonesInline,)
verbose_name_plural = _(u'Outros Contatos da Casa') verbose_name_plural = _('Outros Contatos da Casa')
def get_queryset(self, request): def get_queryset(self, request):
return (self.model.objects.exclude(cargo='Presidente',) return (self.model.objects.exclude(cargo='Presidente',)
@ -138,18 +138,18 @@ class ConveniosInline(admin.TabularInline):
# def get_tramitacoes(self, obj): # def get_tramitacoes(self, obj):
# return '<br/>'.join([t.__unicode__() for t in obj.tramitacao_set.all()]) # return '<br/>'.join([t.__unicode__() for t in obj.tramitacao_set.all()])
# #
# get_tramitacoes.short_description = _(u'Tramitações') # get_tramitacoes.short_description = _('Tramitações')
# get_tramitacoes.allow_tags = True # get_tramitacoes.allow_tags = True
# #
def get_anexos(self, obj): def get_anexos(self, obj):
return '<br/>'.join(['<a href="%s" target="_blank">%s</a>' % (a.arquivo.url, a.__unicode__()) for a in obj.anexo_set.all()]) return '<br/>'.join(['<a href="%s" target="_blank">%s</a>' % (a.arquivo.url, a.__unicode__()) for a in obj.anexo_set.all()])
get_anexos.short_description = _(u'Anexos') get_anexos.short_description = _('Anexos')
get_anexos.allow_tags = True get_anexos.allow_tags = True
# #
# def get_equipamentos(self, obj): # def get_equipamentos(self, obj):
# return '<br/>'.join([e.__unicode__() for e in obj.equipamentoprevisto_set.all()]) # return '<br/>'.join([e.__unicode__() for e in obj.equipamentoprevisto_set.all()])
# #
# get_equipamentos.short_description = _(u'Equipamentos previstos') # get_equipamentos.short_description = _('Equipamentos previstos')
# get_equipamentos.allow_tags = True # get_equipamentos.allow_tags = True
def status_convenio(self, obj): def status_convenio(self, obj):
@ -157,17 +157,17 @@ class ConveniosInline(admin.TabularInline):
return "" return ""
status = obj.get_status() status = obj.get_status()
if status in [u"Vencido", u"Desistência", u"Cancelado"]: if status in ["Vencido", "Desistência", "Cancelado"]:
label = r"danger" label = r"danger"
elif status == u"Vigente": elif status == "Vigente":
label = r"success" label = r"success"
elif status == u"Pendente": elif status == "Pendente":
label = r"warning" label = r"warning"
else: else:
label = r"info" label = r"info"
return u'<p class="label label-{label}">{status}</p>'.format(label=label, status=status) return '<p class="label label-{label}">{status}</p>'.format(label=label, status=status)
status_convenio.short_description = _(u"Status do convênio") status_convenio.short_description = _("Status do convênio")
status_convenio.allow_tags = True status_convenio.allow_tags = True
@ -181,7 +181,7 @@ class ConveniosInline(admin.TabularInline):
Editar Editar
</a>""" % (obj.pk, obj.pk, url) </a>""" % (obj.pk, obj.pk, url)
link_convenio.short_description = _(u'Editar convenio') link_convenio.short_description = _('Editar convenio')
link_convenio.allow_tags = True link_convenio.allow_tags = True
def link_sigad(self, obj): def link_sigad(self, obj):
@ -208,7 +208,7 @@ class ConveniosInline(admin.TabularInline):
# Editar # Editar
# </a>""" % (obj.pk, obj.pk, url) # </a>""" % (obj.pk, obj.pk, url)
# link_parlamentares.short_description = _(u'Parlamentares') # link_parlamentares.short_description = _('Parlamentares')
# link_parlamentares.allow_tags = True # link_parlamentares.allow_tags = True
# class DiagnosticoInline(admin.TabularInline): # class DiagnosticoInline(admin.TabularInline):
@ -228,7 +228,7 @@ class ConveniosInline(admin.TabularInline):
# Abrir PDF # Abrir PDF
# </a>""" % (obj.pk, obj.pk, url) # </a>""" % (obj.pk, obj.pk, url)
# link_diagnostico.short_description = _(u'Ver PDF') # link_diagnostico.short_description = _('Ver PDF')
# link_diagnostico.allow_tags = True # link_diagnostico.allow_tags = True
# class BemInline(admin.TabularInline): # class BemInline(admin.TabularInline):
@ -249,8 +249,8 @@ class ServicoInline(admin.TabularInline):
def link_url(self, servico): def link_url(self, servico):
if servico.data_desativacao is not None: if servico.data_desativacao is not None:
return servico.url return servico.url
return u'<a href="{url}" target="_blank">{url}</a>'.format(url=servico.url) return '<a href="{url}" target="_blank">{url}</a>'.format(url=servico.url)
link_url.short_description = _(u'URL do serviço') link_url.short_description = _('URL do serviço')
link_url.allow_tags = True link_url.allow_tags = True
ordering = ('-data_alteracao',) ordering = ('-data_alteracao',)
@ -265,7 +265,7 @@ class ServicoInline(admin.TabularInline):
Editar Editar
</a>""" % (obj.pk, obj.pk, url) </a>""" % (obj.pk, obj.pk, url)
link_servico.short_description = _(u'Editar Serviço') link_servico.short_description = _('Editar Serviço')
link_servico.allow_tags = True link_servico.allow_tags = True
def has_add_permission(self, request): def has_add_permission(self, request):
@ -289,11 +289,11 @@ class OcorrenciaInline(admin.TabularInline):
if obj.pk is None: if obj.pk is None:
return "" return ""
url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk]) url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk])
return u"""<input id="edit_ocorrencia-%s" type="hidden"/> return """<input id="edit_ocorrencia-%s" type="hidden"/>
<a id="lookup_edit_ocorrencia-%s" href="%s" class="button" target="_blank" <a id="lookup_edit_ocorrencia-%s" href="%s" class="button" target="_blank"
onclick="return showRelatedObjectLookupPopup(this);">%s</a>""" % (obj.pk, obj.pk, url, _(u'Editar')) onclick="return showRelatedObjectLookupPopup(this);">%s</a>""" % (obj.pk, obj.pk, url, _('Editar'))
link_editar.short_description = _(u'Editar') link_editar.short_description = _('Editar')
link_editar.allow_tags = True link_editar.allow_tags = True
@ -306,13 +306,13 @@ class GerentesInterlegisFilter(admin.filters.RelatedFieldListFilter):
class ConvenioFilter(admin.SimpleListFilter): class ConvenioFilter(admin.SimpleListFilter):
title = _(u"Tipo de convênio") title = _("Tipo de convênio")
parameter_name = 'convenio' parameter_name = 'convenio'
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
return ( return (
('SC', _(u"Sem nenhum convênio")), ('SC', _("Sem nenhum convênio")),
('CC', _(u"Com algum convênio")), ('CC', _("Com algum convênio")),
) + tuple([(p.pk, p.sigla) for p in Projeto.objects.all()]) ) + tuple([(p.pk, p.sigla) for p in Projeto.objects.all()])
def queryset(self, request, queryset): def queryset(self, request, queryset):
@ -327,7 +327,7 @@ class ConvenioFilter(admin.SimpleListFilter):
return queryset.distinct('municipio__uf__nome', 'nome') return queryset.distinct('municipio__uf__nome', 'nome')
class ExcluirConvenioFilter(admin.SimpleListFilter): class ExcluirConvenioFilter(admin.SimpleListFilter):
title=_(u"Excluir convênio da pesquisa") title=_("Excluir convênio da pesquisa")
parameter_name = 'excluir_convenio' parameter_name = 'excluir_convenio'
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
@ -341,15 +341,15 @@ class ExcluirConvenioFilter(admin.SimpleListFilter):
return queryset return queryset
class ServicoFilter(admin.SimpleListFilter): class ServicoFilter(admin.SimpleListFilter):
title = _(u"Serviço") title = _("Serviço")
parameter_name = 'servico' parameter_name = 'servico'
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
return ( return (
('SS', _(u"Sem nenhum serviço")), ('SS', _("Sem nenhum serviço")),
('CS', _(u"Com algum serviço")), ('CS', _("Com algum serviço")),
('CH', _(u"Com algum serviço de hospedagem")), ('CH', _("Com algum serviço de hospedagem")),
('CR', _(u"Apenas serviço de registro")), ('CR', _("Apenas serviço de registro")),
) + tuple([(p.pk, p.nome) for p in TipoServico.objects.all()]) ) + tuple([(p.pk, p.nome) for p in TipoServico.objects.all()])
def queryset(self, request, queryset): def queryset(self, request, queryset):
@ -375,13 +375,13 @@ class ServicoFilter(admin.SimpleListFilter):
return queryset.distinct('municipio__uf__nome', 'nome') return queryset.distinct('municipio__uf__nome', 'nome')
class ServicoAtivoFilter(admin.SimpleListFilter): class ServicoAtivoFilter(admin.SimpleListFilter):
title = _(u"Serviço ativo") title = _("Serviço ativo")
parameter_name = 'ativo' parameter_name = 'ativo'
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
return ( return (
('ativo', _(u"Ativo")), ('ativo', _("Ativo")),
('desativado', _(u"Desativado")), ('desativado', _("Desativado")),
) )
def queryset(self, request, queryset): def queryset(self, request, queryset):
@ -410,15 +410,15 @@ class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin):
'fields': ('tipo', 'nome', 'sigla', 'cnpj', 'num_parlamentares', 'fields': ('tipo', 'nome', 'sigla', 'cnpj', 'num_parlamentares',
'gerentes_interlegis') 'gerentes_interlegis')
}), }),
(_(u'Endereço'), { (_('Endereço'), {
'fields': ('data_instalacao', 'logradouro', 'bairro', 'fields': ('data_instalacao', 'logradouro', 'bairro',
'municipio', 'cep', 'ult_alt_endereco'), 'municipio', 'cep', 'ult_alt_endereco'),
}), }),
(_(u'Presença na Internet'), { (_('Presença na Internet'), {
'fields': ('inclusao_digital', 'data_levantamento', 'pesquisador', 'fields': ('inclusao_digital', 'data_levantamento', 'pesquisador',
'pagina_web', 'email', 'obs_pesquisa',) 'pagina_web', 'email', 'obs_pesquisa',)
}), }),
(_(u'Outras informações'), { (_('Outras informações'), {
'fields': ('observacoes', 'horario_funcionamento', 'foto', 'fields': ('observacoes', 'horario_funcionamento', 'foto',
'recorte'), 'recorte'),
}), }),
@ -431,26 +431,26 @@ class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin):
def get_uf(self, obj): def get_uf(self, obj):
return obj.municipio.uf.nome return obj.municipio.uf.nome
get_uf.short_description = _(u'Unidade da Federação') get_uf.short_description = _('Unidade da Federação')
get_uf.admin_order_field = 'municipio__uf__nome' get_uf.admin_order_field = 'municipio__uf__nome'
def get_gerentes(self, obj): def get_gerentes(self, obj):
return obj.lista_gerentes() return obj.lista_gerentes()
get_gerentes.short_description = _(u'Gerente Interlegis') get_gerentes.short_description = _('Gerente Interlegis')
get_gerentes.allow_tags = True get_gerentes.allow_tags = True
def get_convenios(self, obj): def get_convenios(self, obj):
return '<ul>' + ''.join(['<li>%s</li>' % c.__unicode__() return '<ul>' + ''.join(['<li>%s</li>' % c.__unicode__()
for c in obj.convenio_set.all()]) + '</ul>' for c in obj.convenio_set.all()]) + '</ul>'
get_convenios.short_description = _(u'Convênios') get_convenios.short_description = _('Convênios')
get_convenios.allow_tags = True get_convenios.allow_tags = True
def get_servicos(self, obj): def get_servicos(self, obj):
return u'<ul>' + u''.join( return '<ul>' + ''.join(
[u'<li><a href="{url}" target="_blank">{servico}</a></li>'.format( ['<li><a href="{url}" target="_blank">{servico}</a></li>'.format(
url=s.url, servico=s.__unicode__()) for s in url=s.url, servico=s.__unicode__()) for s in
obj.servico_set.filter(data_desativacao__isnull=True)]) + u'</ul>' obj.servico_set.filter(data_desativacao__isnull=True)]) + '</ul>'
get_servicos.short_description = _(u'Serviços') get_servicos.short_description = _('Serviços')
get_servicos.allow_tags = True get_servicos.allow_tags = True
def changelist_view(self, request, extra_context=None): def changelist_view(self, request, extra_context=None):
@ -468,29 +468,29 @@ class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin):
def etiqueta(self, request, queryset): def etiqueta(self, request, queryset):
return labels_report(request, queryset=queryset) return labels_report(request, queryset=queryset)
etiqueta.short_description = _(u"Gerar etiqueta(s) da(s) casa(s) " etiqueta.short_description = _("Gerar etiqueta(s) da(s) casa(s) "
u"selecionada(s)") "selecionada(s)")
def etiqueta_sem_presidente(self, request, queryset): def etiqueta_sem_presidente(self, request, queryset):
return labels_report_sem_presidente(request, queryset=queryset) return labels_report_sem_presidente(request, queryset=queryset)
etiqueta_sem_presidente.short_description = _(u"Gerar etiqueta(s) sem " etiqueta_sem_presidente.short_description = _("Gerar etiqueta(s) sem "
u"presidente da(s) casa(s) " "presidente da(s) casa(s) "
u"selecionada(s)") "selecionada(s)")
def relatorio(self, request, queryset): def relatorio(self, request, queryset):
return report(request, queryset=queryset) return report(request, queryset=queryset)
relatorio.short_description = _(u"Exportar a(s) casa(s) selecionada(s) " relatorio.short_description = _("Exportar a(s) casa(s) selecionada(s) "
u"para PDF") "para PDF")
def relatorio_completo(self, request, queryset): def relatorio_completo(self, request, queryset):
return report_complete(request, queryset=queryset) return report_complete(request, queryset=queryset)
relatorio_completo.short_description = _(u"Gerar relatório completo da(s) " relatorio_completo.short_description = _("Gerar relatório completo da(s) "
u"casa(s) selecionada(s)") "casa(s) selecionada(s)")
def relatorio_csv(self, request, queryset): def relatorio_csv(self, request, queryset):
return export_csv(request) return export_csv(request)
relatorio_csv.short_description = _(u"Exportar casa(s) selecionada(s) " relatorio_csv.short_description = _("Exportar casa(s) selecionada(s) "
u"para CSV") "para CSV")
def adicionar_casas(self, request, queryset): def adicionar_casas(self, request, queryset):
if 'carrinho_casas' in request.session: if 'carrinho_casas' in request.session:
@ -503,14 +503,14 @@ class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin):
quant = q2 - q1 quant = q2 - q1
if quant: if quant:
self.message_user(request, str(q2 - q1) + " " + self.message_user(request, str(q2 - q1) + " " +
_(u"Casas Legislativas adicionadas no carrinho")) _("Casas Legislativas adicionadas no carrinho"))
else: else:
self.message_user(request, _(u"As Casas Legislativas selecionadas " self.message_user(request, _("As Casas Legislativas selecionadas "
u"já foram adicionadas anteriormente")) "já foram adicionadas anteriormente"))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
adicionar_casas.short_description = _(u"Armazenar casas no carrinho para " adicionar_casas.short_description = _("Armazenar casas no carrinho para "
u"exportar") "exportar")
def get_actions(self, request): def get_actions(self, request):
actions = super(OrgaoAdmin, self).get_actions(request) actions = super(OrgaoAdmin, self).get_actions(request)

20
sigi/apps/casas/forms.py

@ -9,17 +9,17 @@ from sigi.apps.servidores.models import Servidor
class AtualizaCasaForm(forms.Form): class AtualizaCasaForm(forms.Form):
arquivo = forms.FileField( arquivo = forms.FileField(
required=True, required=True,
label=_(u"arquivo a importar"), label=_("arquivo a importar"),
help_text=_(u"Envie um arquivo no formato CSV"), help_text=_("Envie um arquivo no formato CSV"),
) )
class OrgaoForm(forms.ModelForm): class OrgaoForm(forms.ModelForm):
# cnpj = BRCNPJField( # cnpj = BRCNPJField(
# label=_(u'CNPJ'), # label=_('CNPJ'),
# required=False, # required=False,
# help_text=_(u'Utilize o formato <em>XX.XXX.XXX/XXXX-XX</em> ou insira apenas os dígitos.') # help_text=_('Utilize o formato <em>XX.XXX.XXX/XXXX-XX</em> ou insira apenas os dígitos.')
#) #)
cep = BRZipCodeField(label=_(u'CEP'), help_text=_(u'Formato') + ': <em>XXXXX-XXX</em>.') cep = BRZipCodeField(label=_('CEP'), help_text=_('Formato') + ': <em>XXXXX-XXX</em>.')
class Meta: class Meta:
model = Orgao model = Orgao
@ -34,21 +34,21 @@ class OrgaoForm(forms.ModelForm):
class PortfolioForm(forms.Form): class PortfolioForm(forms.Form):
ACAO_CHOICES = ( ACAO_CHOICES = (
('ADD', _(u"Adicionar")), ('ADD', _("Adicionar")),
('DEL', _(u"Remover")) ('DEL', _("Remover"))
) )
acao = forms.ChoiceField( acao = forms.ChoiceField(
label=_(u"Ação"), label=_("Ação"),
choices=ACAO_CHOICES, choices=ACAO_CHOICES,
initial='ADD', initial='ADD',
widget=forms.RadioSelect widget=forms.RadioSelect
) )
gerente = forms.ModelChoiceField( gerente = forms.ModelChoiceField(
queryset=Servidor.objects.all(), queryset=Servidor.objects.all(),
label=_(u"Atribuir para") label=_("Atribuir para")
) )
# O label precisa ser trocado dependendo da região que se está visualizando # O label precisa ser trocado dependendo da região que se está visualizando
def __init__(self, label=_(u"Atribuir para"), *args, **kwargs): def __init__(self, label=_("Atribuir para"), *args, **kwargs):
super(PortfolioForm, self).__init__(*args, **kwargs) super(PortfolioForm, self).__init__(*args, **kwargs)
self.fields['gerente'].label = label self.fields['gerente'].label = label

22
sigi/apps/casas/management/commands/importa_gerentes.py

@ -30,8 +30,8 @@ from sigi.apps.servidores.models import Servidor
from sigi.apps.contatos.models import Municipio from sigi.apps.contatos.models import Municipio
class Command(BaseCommand): class Command(BaseCommand):
args = u"data_file.csv" args = "data_file.csv"
help = u"""Importa dados de atribuição de gerencia de relacionamentos de um arquivo CSV. help = """Importa dados de atribuição de gerencia de relacionamentos de um arquivo CSV.
A primeira linha do arquivo deve possuir um cabeçalho com os seguintes campos obrigatórios: A primeira linha do arquivo deve possuir um cabeçalho com os seguintes campos obrigatórios:
- cod_municipio : Código IBGE do município - cod_municipio : Código IBGE do município
@ -43,18 +43,18 @@ class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
if len(args) != 1: if len(args) != 1:
raise CommandError(u"Informe UM arquivo csv a importar") raise CommandError("Informe UM arquivo csv a importar")
file_name = args[0] file_name = args[0]
if not os.path.isfile(file_name): if not os.path.isfile(file_name):
raise CommandError(u"Arquivo %s não encontrado" % [file_name,]) raise CommandError("Arquivo %s não encontrado" % [file_name,])
with open(file_name, 'rb') as csvfile: with open(file_name, 'rb') as csvfile:
reader = csv.DictReader(csvfile) reader = csv.DictReader(csvfile)
if not self.campos.issubset(reader.fieldnames): if not self.campos.issubset(reader.fieldnames):
raise CommandError(u"O arquivo não possui todos os campos obrigatórios") raise CommandError("O arquivo não possui todos os campos obrigatórios")
Orgao.gerentes_interlegis.through.objects.all().delete() Orgao.gerentes_interlegis.through.objects.all().delete()
@ -66,8 +66,8 @@ class Command(BaseCommand):
codigo_ibge=reg['cod_municipio'] codigo_ibge=reg['cod_municipio']
) )
except Municipio.DoesNotExist: except Municipio.DoesNotExist:
self.stdout.write(u"{linha}: não existe Município com " self.stdout.write("{linha}: não existe Município com "
u"código IBGE {ibge}'".format( "código IBGE {ibge}'".format(
linha=reader.line_num, linha=reader.line_num,
ibge=reg['cod_municipio']) ibge=reg['cod_municipio'])
) )
@ -79,8 +79,8 @@ class Command(BaseCommand):
user__username=reg['user_id'] user__username=reg['user_id']
) )
except Servidor.DoesNotExist: except Servidor.DoesNotExist:
self.stdout.write(u"({linha}): não existe Servidor com " self.stdout.write("({linha}): não existe Servidor com "
u"userid {userid}".format( "userid {userid}".format(
linha=reader.line_num, linha=reader.line_num,
userid=reg['user_id']) userid=reg['user_id'])
) )
@ -92,7 +92,7 @@ class Command(BaseCommand):
casa.gerentes_interlegis.add(gerente) casa.gerentes_interlegis.add(gerente)
casa.save() casa.save()
self.stdout.write(u"Importação concluída. {erros} erros em {linhas}" self.stdout.write("Importação concluída. {erros} erros em {linhas}"
u" linhas".format(erros=erros, " linhas".format(erros=erros,
linhas=reader.line_num) linhas=reader.line_num)
) )

146
sigi/apps/casas/models.py

@ -20,14 +20,14 @@ class TipoOrgao(models.Model):
Câmara Distrital ou Legislativo Federal Câmara Distrital ou Legislativo Federal
""" """
sigla = models.CharField(_(u"Sigla"), max_length=5) sigla = models.CharField(_("Sigla"), max_length=5)
nome = models.CharField(_(u"Nome"), max_length=100) nome = models.CharField(_("Nome"), max_length=100)
legislativo = models.BooleanField(_(u"Poder legislativo"), default=False) legislativo = models.BooleanField(_("Poder legislativo"), default=False)
class Meta: class Meta:
ordering = ('nome',) ordering = ('nome',)
verbose_name = _(u"Tipo de órgão") verbose_name = _("Tipo de órgão")
verbose_name_plural = _(u"Tipos de órgão") verbose_name_plural = _("Tipos de órgão")
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
@ -37,19 +37,19 @@ class Orgao(models.Model):
""" """
INCLUSAO_DIGITAL_CHOICES = ( INCLUSAO_DIGITAL_CHOICES = (
('NAO PESQUISADO', _(u'Não pesquisado')), ('NAO PESQUISADO', _('Não pesquisado')),
('NAO POSSUI PORTAL', _(u'Não possui portal')), ('NAO POSSUI PORTAL', _('Não possui portal')),
('PORTAL MODELO', _(u'Possui Portal Modelo')), ('PORTAL MODELO', _('Possui Portal Modelo')),
('OUTRO PORTAL', _(u'Possui outro portal')), ('OUTRO PORTAL', _('Possui outro portal')),
) )
nome = models.CharField( nome = models.CharField(
_(u"Nome"), _("Nome"),
max_length=60, max_length=60,
help_text=_(u'Exemplo: <em>Câmara Municipal de Pains</em>.') help_text=_('Exemplo: <em>Câmara Municipal de Pains</em>.')
) )
sigla = models.CharField( sigla = models.CharField(
_(u"sigla do órgão"), _("sigla do órgão"),
max_length=30, max_length=30,
blank=True blank=True
) )
@ -58,18 +58,18 @@ class Orgao(models.Model):
tipo = models.ForeignKey( tipo = models.ForeignKey(
TipoOrgao, TipoOrgao,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u"Tipo") verbose_name=_("Tipo")
) )
cnpj = models.CharField(_(u"CNPJ"), max_length=32, blank=True) cnpj = models.CharField(_("CNPJ"), max_length=32, blank=True)
observacoes = models.TextField(_(u'observações'), blank=True) observacoes = models.TextField(_('observações'), blank=True)
horario_funcionamento = models.CharField( horario_funcionamento = models.CharField(
_(u"Horário de funcionamento da Casa Legislativa"), _("Horário de funcionamento da Casa Legislativa"),
max_length=100, max_length=100,
blank=True, blank=True,
) )
# num_parlamentares = models.PositiveIntegerField('Número de parlamentares') # num_parlamentares = models.PositiveIntegerField('Número de parlamentares')
codigo_interlegis = models.CharField( codigo_interlegis = models.CharField(
_(u'Código Interlegis'), _('Código Interlegis'),
max_length=3, max_length=3,
blank=True blank=True
) )
@ -77,57 +77,57 @@ class Orgao(models.Model):
gerentes_interlegis = models.ManyToManyField( gerentes_interlegis = models.ManyToManyField(
Servidor, Servidor,
verbose_name=_(u"Gerentes Interlegis"), verbose_name=_("Gerentes Interlegis"),
related_name='casas_que_gerencia', related_name='casas_que_gerencia',
blank=True, blank=True,
) )
# Informações de contato # Informações de contato
logradouro = models.CharField( logradouro = models.CharField(
_(u"Logradouro"), _("Logradouro"),
max_length=100, max_length=100,
help_text=_(u'Avenida, rua, praça, jardim, parque...') help_text=_('Avenida, rua, praça, jardim, parque...')
) )
bairro = models.CharField(_(u"Bairro"), max_length=100, blank=True) bairro = models.CharField(_("Bairro"), max_length=100, blank=True)
municipio = models.ForeignKey( municipio = models.ForeignKey(
'contatos.Municipio', 'contatos.Municipio',
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Município') verbose_name=_('Município')
) )
# municipio.uf_filter = True # municipio.uf_filter = True
cep = models.CharField(_(u"CEP"), max_length=32) cep = models.CharField(_("CEP"), max_length=32)
email = models.EmailField(_(u'E-mail'), max_length=128, blank=True) email = models.EmailField(_('E-mail'), max_length=128, blank=True)
pagina_web = models.URLField( pagina_web = models.URLField(
_(u'Página web'), _('Página web'),
help_text=_(u'Exemplo: <em>http://www.camarapains.mg.gov.br</em>.'), help_text=_('Exemplo: <em>http://www.camarapains.mg.gov.br</em>.'),
blank=True, blank=True,
) )
inclusao_digital = models.CharField( inclusao_digital = models.CharField(
_(u"Inclusão digital"), _("Inclusão digital"),
max_length=30, max_length=30,
choices=INCLUSAO_DIGITAL_CHOICES, choices=INCLUSAO_DIGITAL_CHOICES,
default=INCLUSAO_DIGITAL_CHOICES[0][0] default=INCLUSAO_DIGITAL_CHOICES[0][0]
) )
data_levantamento = models.DateTimeField( data_levantamento = models.DateTimeField(
_(u"Data/hora da pesquisa"), _("Data/hora da pesquisa"),
null=True, null=True,
blank=True blank=True
) )
pesquisador = models.ForeignKey( pesquisador = models.ForeignKey(
Servidor, Servidor,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
verbose_name=_(u"Pesquisador"), verbose_name=_("Pesquisador"),
null=True, null=True,
blank=True blank=True
) )
obs_pesquisa = models.TextField( obs_pesquisa = models.TextField(
_(u"Observações do pesquisador"), _("Observações do pesquisador"),
blank=True blank=True
) )
ult_alt_endereco = models.DateTimeField( ult_alt_endereco = models.DateTimeField(
_(u'Última alteração do endereço'), _('Última alteração do endereço'),
null=True, null=True,
blank=True, blank=True,
editable=True editable=True
@ -135,7 +135,7 @@ class Orgao(models.Model):
telefones = GenericRelation('contatos.Telefone') telefones = GenericRelation('contatos.Telefone')
foto = models.ImageField( foto = models.ImageField(
_(u"Foto"), _("Foto"),
upload_to='imagens/casas', upload_to='imagens/casas',
width_field='foto_largura', width_field='foto_largura',
height_field='foto_altura', height_field='foto_altura',
@ -145,25 +145,25 @@ class Orgao(models.Model):
foto_largura = models.SmallIntegerField(editable=False, null=True) foto_largura = models.SmallIntegerField(editable=False, null=True)
foto_altura = models.SmallIntegerField(editable=False, null=True) foto_altura = models.SmallIntegerField(editable=False, null=True)
data_instalacao = models.DateField( data_instalacao = models.DateField(
_(u'Data de instalação da Casa Legislativa'), _('Data de instalação da Casa Legislativa'),
null=True, null=True,
blank=True blank=True
) )
class Meta: class Meta:
ordering = ('nome',) ordering = ('nome',)
verbose_name = _(u'Órgão') verbose_name = _('Órgão')
verbose_name_plural = _(u'Órgãos') verbose_name_plural = _('Órgãos')
def lista_gerentes(self, fmt='html'): def lista_gerentes(self, fmt='html'):
if not self.gerentes_interlegis.exists(): if not self.gerentes_interlegis.exists():
return "" return ""
if fmt == 'html': if fmt == 'html':
return u"<ul><li>"+u"</li><li>".join( return "<ul><li>"+"</li><li>".join(
[g.nome_completo for g in self.gerentes_interlegis.all()])+\ [g.nome_completo for g in self.gerentes_interlegis.all()])+\
u"</li></ul>" "</li></ul>"
else: else:
return u", ".join([g.nome_completo for g in return ", ".join([g.nome_completo for g in
self.gerentes_interlegis.all()]) self.gerentes_interlegis.all()])
@property @property
@ -275,7 +275,7 @@ class Orgao(models.Model):
if Orgao.objects.filter(codigo_interlegis=codigo).count() > 0: if Orgao.objects.filter(codigo_interlegis=codigo).count() > 0:
codigo_cons = cityName.replace('A', '').replace('E', '').\ codigo_cons = cityName.replace('A', '').replace('E', '').\
replace('I', '').replace('O', '').replace('U', '')[:3] replace('I', '').replace('O', '').replace('', '')[:3]
if len(codigo_cons) == 3 and \ if len(codigo_cons) == 3 and \
Orgao.objects.filter(codigo_interlegis=codigo).count() > 0: Orgao.objects.filter(codigo_interlegis=codigo).count() > 0:
codigo = codigo_cons codigo = codigo_cons
@ -325,7 +325,7 @@ class Orgao(models.Model):
tipo=self.tipo, tipo=self.tipo,
municipio=self.municipio).exclude(pk=self.pk).exists(): municipio=self.municipio).exclude(pk=self.pk).exists():
raise ValidationError( raise ValidationError(
_(u"Já existe um(a) %(tipo)s em %(municipio)s"), _("Já existe um(a) %(tipo)s em %(municipio)s"),
code='integrity', code='integrity',
params={'tipo': self.tipo, 'municipio': self.municipio}) params={'tipo': self.tipo, 'municipio': self.municipio})
@ -355,98 +355,98 @@ class Funcionario(models.Model):
""" """
SETOR_CHOICES = [ SETOR_CHOICES = [
("presidente", _(u"Presidente")), ("presidente", _("Presidente")),
("contato_interlegis", _(u"Contato Interlegis")), ("contato_interlegis", _("Contato Interlegis")),
("infraestrutura_fisica", _(u"Infraestrutura Física")), ("infraestrutura_fisica", _("Infraestrutura Física")),
("estrutura_de_ti", _(u"Estrutura de TI")), ("estrutura_de_ti", _("Estrutura de TI")),
("organizacao_do_processo_legislativo", ("organizacao_do_processo_legislativo",
_(u"Organização do Processo Legislativo")), _("Organização do Processo Legislativo")),
("producao_legislativa", _(u"Produção Legislativa")), ("producao_legislativa", _("Produção Legislativa")),
("estrutura_de_comunicacao_social", ("estrutura_de_comunicacao_social",
_(u"Estrutura de Comunicação Social")), _("Estrutura de Comunicação Social")),
("estrutura_de_recursos_humanos", _(u"Estrutura de Recursos Humanos")), ("estrutura_de_recursos_humanos", _("Estrutura de Recursos Humanos")),
("gestao", _(u"Gestão")), ("gestao", _("Gestão")),
("outros", _(u"Outros")), ("outros", _("Outros")),
] ]
SEXO_CHOICES = [ SEXO_CHOICES = [
("M", _(u"Masculino")), ("M", _("Masculino")),
("F", _(u"Feminino")) ("F", _("Feminino"))
] ]
casa_legislativa = models.ForeignKey( casa_legislativa = models.ForeignKey(
Orgao, Orgao,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u"órgão"), verbose_name=_("órgão"),
) )
nome = models.CharField(_(u'nome completo'), max_length=60, blank=False) nome = models.CharField(_('nome completo'), max_length=60, blank=False)
# nome.alphabetic_filter = True # nome.alphabetic_filter = True
sexo = models.CharField( sexo = models.CharField(
_(u"Sexo"), _("Sexo"),
max_length=1, max_length=1,
choices=SEXO_CHOICES, choices=SEXO_CHOICES,
default="M" default="M"
) )
data_nascimento = models.DateField( data_nascimento = models.DateField(
_(u"Data de nascimento"), _("Data de nascimento"),
blank=True, blank=True,
null=True null=True
) )
nota = models.CharField( nota = models.CharField(
_(u"Telefones"), _("Telefones"),
max_length=250, max_length=250,
null=True, null=True,
blank=True blank=True
) )
email = models.CharField(_(u'e-mail'), max_length=250, blank=True) email = models.CharField(_('e-mail'), max_length=250, blank=True)
# endereco = generic.GenericRelation('contatos.Endereco') # endereco = generic.GenericRelation('contatos.Endereco')
endereco = models.CharField(_(u'Endereço'), max_length=100, blank=True) endereco = models.CharField(_('Endereço'), max_length=100, blank=True)
municipio = models.ForeignKey( municipio = models.ForeignKey(
Municipio, Municipio,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
verbose_name=_(u'Municipio'), verbose_name=_('Municipio'),
null=True, null=True,
blank=True, blank=True,
) )
bairro = models.CharField(_(u'Bairro'), max_length=100, blank=True) bairro = models.CharField(_('Bairro'), max_length=100, blank=True)
cep = models.CharField(_(u'CEP'), max_length=10, blank=True) cep = models.CharField(_('CEP'), max_length=10, blank=True)
redes_sociais = models.TextField( redes_sociais = models.TextField(
_(u'Redes sociais'), _('Redes sociais'),
help_text=_(u'Colocar um por linha'), help_text=_('Colocar um por linha'),
blank=True blank=True
) )
cargo = models.CharField(_(u"Cargo"), max_length=100, null=True, blank=True) cargo = models.CharField(_("Cargo"), max_length=100, null=True, blank=True)
funcao = models.CharField( funcao = models.CharField(
_(u'função'), _('função'),
max_length=100, max_length=100,
null=True, null=True,
blank=True blank=True
) )
setor = models.CharField( setor = models.CharField(
_(u"Setor"), _("Setor"),
max_length=100, max_length=100,
choices=SETOR_CHOICES, choices=SETOR_CHOICES,
default="outros" default="outros"
) )
tempo_de_servico = models.CharField( tempo_de_servico = models.CharField(
_(u'Tempo de serviço'), _('Tempo de serviço'),
max_length=50, max_length=50,
null=True, null=True,
blank=True blank=True
) )
ult_alteracao = models.DateTimeField( ult_alteracao = models.DateTimeField(
_(u'Última alteração'), _('Última alteração'),
null=True, null=True,
blank=True, blank=True,
editable=True, editable=True,
auto_now=True auto_now=True
) )
desativado = models.BooleanField(_(u"Desativado"), default=False) desativado = models.BooleanField(_("Desativado"), default=False)
observacoes = models.TextField(_(u"Observações"), blank=True) observacoes = models.TextField(_("Observações"), blank=True)
class Meta: class Meta:
ordering = ('nome',) ordering = ('nome',)
verbose_name = _(u'contato da Casa Legislativa') verbose_name = _('contato da Casa Legislativa')
verbose_name_plural = _(u'contatos da Casa Legislativa') verbose_name_plural = _('contatos da Casa Legislativa')
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome

12
sigi/apps/casas/reports.py

@ -100,7 +100,7 @@ class CasasLegislativasLabels(Report):
my_elements = [ my_elements = [
Label( Label(
text=label_text(_(u'A Sua Excelência o(a) Senhor(a)')), text=label_text(_('A Sua Excelência o(a) Senhor(a)')),
top=calc_top(0), left=calc_left, width=calc_width, top=calc_top(0), left=calc_left, width=calc_width,
), ),
ObjectValue( ObjectValue(
@ -113,7 +113,7 @@ class CasasLegislativasLabels(Report):
attribute_name='nome', attribute_name='nome',
top=calc_top(2), left=calc_left, width=calc_width, height=calc_height(2), top=calc_top(2), left=calc_left, width=calc_width, height=calc_height(2),
get_value=lambda instance: get_value=lambda instance:
(_(u"Presidente da %s") % instance.nome) (_("Presidente da %s") % instance.nome)
), ),
ObjectValue( ObjectValue(
attribute_name='logradouro', attribute_name='logradouro',
@ -125,7 +125,7 @@ class CasasLegislativasLabels(Report):
ObjectValue( ObjectValue(
attribute_name='cep', attribute_name='cep',
top=calc_top(8), left=calc_left, width=calc_width, top=calc_top(8), left=calc_left, width=calc_width,
get_value=lambda instance: "%s: %s" % (_(u"CEP"), instance.cep) get_value=lambda instance: "%s: %s" % (_("CEP"), instance.cep)
), ),
] ]
self.band_detail = DetailBand( self.band_detail = DetailBand(
@ -148,14 +148,14 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
my_elements = [ my_elements = [
Label( Label(
text=label_text(_(u'A Sua Excelência o(a) Senhor(a)')), text=label_text(_('A Sua Excelência o(a) Senhor(a)')),
top=calc_top(0), left=calc_left, width=calc_width, top=calc_top(0), left=calc_left, width=calc_width,
), ),
ObjectValue( ObjectValue(
attribute_name='nome', attribute_name='nome',
top=calc_top(1), left=calc_left, width=calc_width, height=calc_height(2), top=calc_top(1), left=calc_left, width=calc_width, height=calc_height(2),
get_value=lambda instance: get_value=lambda instance:
(_(u"Presidente da %s") % instance.nome) (_("Presidente da %s") % instance.nome)
), ),
ObjectValue( ObjectValue(
attribute_name='logradouro', attribute_name='logradouro',
@ -167,7 +167,7 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
ObjectValue( ObjectValue(
attribute_name='cep', attribute_name='cep',
top=calc_top(8), left=calc_left, width=calc_width, top=calc_top(8), left=calc_left, width=calc_width,
get_value=lambda instance: "%s: %s" % (_(u"CEP"), instance.cep) get_value=lambda instance: "%s: %s" % (_("CEP"), instance.cep)
), ),
] ]
self.band_detail = DetailBand( self.band_detail = DetailBand(

110
sigi/apps/casas/views.py

@ -125,8 +125,8 @@ class importa_casas(View):
return render( return render(
request, request,
'casas/importar.html', 'casas/importar.html',
{'form': form, 'error': _(u"O arquivo não possui algum dos " {'form': form, 'error': _("O arquivo não possui algum dos "
u"campos obrigatórios")} "campos obrigatórios")}
) )
if self.importa(reader): if self.importa(reader):
@ -165,7 +165,7 @@ class importa_casas(View):
return render( return render(
request, request,
'casas/importar.html', 'casas/importar.html',
{'form': form, 'error': u"Erro no preenchimento do formulário."} {'form': form, 'error': "Erro no preenchimento do formulário."}
) )
# Atualiza ou cria funcionário # Atualiza ou cria funcionário
@ -448,7 +448,7 @@ def visualizar_carrinho(request):
def excluir_carrinho(request): def excluir_carrinho(request):
if 'carrinho_casas' in request.session: if 'carrinho_casas' in request.session:
del request.session['carrinho_casas'] del request.session['carrinho_casas']
messages.info(request, u'O carrinho foi esvaziado') messages.info(request, 'O carrinho foi esvaziado')
return HttpResponseRedirect('../../') return HttpResponseRedirect('../../')
@ -588,7 +588,7 @@ def report(request, id=None, tipo=None):
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
qs = qs.order_by('municipio__uf', 'nome') qs = qs.order_by('municipio__uf', 'nome')
context = {'casas': qs, 'title': _(u"Relação de Casas Legislativas")} context = {'casas': qs, 'title': _("Relação de Casas Legislativas")}
return render_to_pdf('casas/report_pdf.html', context) return render_to_pdf('casas/report_pdf.html', context)
@ -617,7 +617,7 @@ def casas_sem_convenio_report(request):
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
qs = qs.order_by('municipio__uf', 'nome') qs = qs.order_by('municipio__uf', 'nome')
context = {'casas': qs, 'title': _(u"Casas sem convênio")} context = {'casas': qs, 'title': _("Casas sem convênio")}
return render_to_pdf('casas/report_pdf.html', context) return render_to_pdf('casas/report_pdf.html', context)
@ -636,7 +636,7 @@ def export_csv(request):
atributos = request.POST.getlist("itens_csv_selected") atributos = request.POST.getlist("itens_csv_selected")
try: try:
atributos.insert(atributos.index(_(u'Município')), _(u'UF')) atributos.insert(atributos.index(_('Município')), _('UF'))
except ValueError: except ValueError:
pass pass
@ -648,59 +648,59 @@ def export_csv(request):
lista = [] lista = []
contatos = casa.funcionario_set.exclude(nome="") contatos = casa.funcionario_set.exclude(nome="")
for atributo in atributos: for atributo in atributos:
if _(u"CNPJ") == atributo: if _("CNPJ") == atributo:
lista.append(casa.cnpj.encode("utf-8")) lista.append(casa.cnpj.encode("utf-8"))
elif _(u"Código IBGE") == atributo: elif _("Código IBGE") == atributo:
lista.append(str(casa.municipio.codigo_ibge).encode("utf-8")) lista.append(str(casa.municipio.codigo_ibge).encode("utf-8"))
elif _(u"Código TSE") == atributo: elif _("Código TSE") == atributo:
lista.append(str(casa.municipio.codigo_tse).encode("utf-8")) lista.append(str(casa.municipio.codigo_tse).encode("utf-8"))
elif _(u"Nome") == atributo: elif _("Nome") == atributo:
lista.append(casa.nome.encode("utf-8")) lista.append(casa.nome.encode("utf-8"))
elif _(u"Município") == atributo: elif _("Município") == atributo:
lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8")) lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8"))
lista.append(unicode(casa.municipio.nome).encode("utf-8")) lista.append(unicode(casa.municipio.nome).encode("utf-8"))
elif _(u"Presidente") == atributo: elif _("Presidente") == atributo:
# TODO: Esse encode deu erro em 25/04/2012. Comentei para que o usuário pudesse continuar seu trabalho # TODO: Esse encode deu erro em 25/04/2012. Comentei para que o usuário pudesse continuar seu trabalho
# É preciso descobrir o porque do erro e fazer a correção definitiva. # É preciso descobrir o porque do erro e fazer a correção definitiva.
# lista.append(str(casa.presidente or "").encode("utf-8")) # lista.append(str(casa.presidente or "").encode("utf-8"))
lista.append(str(casa.presidente or "")) lista.append(str(casa.presidente or ""))
elif _(u"Logradouro") == atributo: elif _("Logradouro") == atributo:
lista.append(casa.logradouro.encode("utf-8")) lista.append(casa.logradouro.encode("utf-8"))
elif _(u"Bairro") == atributo: elif _("Bairro") == atributo:
lista.append(casa.bairro.encode("utf-8")) lista.append(casa.bairro.encode("utf-8"))
elif _(u"CEP") == atributo: elif _("CEP") == atributo:
lista.append(casa.cep.encode("utf-8")) lista.append(casa.cep.encode("utf-8"))
elif _(u"Telefone") == atributo: elif _("Telefone") == atributo:
lista.append(str(casa.telefone or "")) lista.append(str(casa.telefone or ""))
elif _(u"Página web") == atributo: elif _("Página web") == atributo:
lista.append(casa.pagina_web.encode("utf-8")) lista.append(casa.pagina_web.encode("utf-8"))
elif _(u"Email") == atributo: elif _("Email") == atributo:
lista.append(casa.email.encode("utf-8")) lista.append(casa.email.encode("utf-8"))
elif _(u"Número de parlamentares") == atributo: elif _("Número de parlamentares") == atributo:
lista.append(casa.total_parlamentares) lista.append(casa.total_parlamentares)
elif _(u"Última alteração de endereco") == atributo: elif _("Última alteração de endereco") == atributo:
lista.append(casa.ult_alt_endereco) lista.append(casa.ult_alt_endereco)
elif _(u"Servicos SEIT") == atributo: elif _("Servicos SEIT") == atributo:
lista.append(", ".join([s.tipo_servico.nome.encode('utf-8') lista.append(", ".join([s.tipo_servico.nome.encode('utf-8')
for s in casa.servico_set.filter( for s in casa.servico_set.filter(
data_desativacao__isnull=True)]) data_desativacao__isnull=True)])
) )
elif _(u"Nome contato") == atributo: elif _("Nome contato") == atributo:
if contatos: if contatos:
nomes = u", ".join([c.nome for c in contatos]) nomes = ", ".join([c.nome for c in contatos])
lista.append(nomes.encode("utf-8")) lista.append(nomes.encode("utf-8"))
else: else:
lista.append('') lista.append('')
elif _(u"Cargo contato") == atributo: elif _("Cargo contato") == atributo:
if contatos: if contatos:
cargos = u", ".join([c.cargo if c.cargo else u"?" cargos = ", ".join([c.cargo if c.cargo else "?"
for c in contatos]) for c in contatos])
lista.append(cargos.encode("utf-8")) lista.append(cargos.encode("utf-8"))
else: else:
lista.append('') lista.append('')
elif _(u"Email contato") == atributo: elif _("Email contato") == atributo:
if contatos: if contatos:
emails = u", ".join([c.email if c.email else u"?" emails = ", ".join([c.email if c.email else "?"
for c in contatos]) for c in contatos])
lista.append(emails.encode("utf-8")) lista.append(emails.encode("utf-8"))
else: else:
@ -745,7 +745,7 @@ def portfolio(request):
data['mesorregioes'] = uf.mesorregiao_set.all() data['mesorregioes'] = uf.mesorregiao_set.all()
data['microrregioes'] = mesorregiao.microrregiao_set.all() data['microrregioes'] = mesorregiao.microrregiao_set.all()
data['form'] = PortfolioForm( data['form'] = PortfolioForm(
_(u'Atribuir casas da microrregiao {name} para').format( _('Atribuir casas da microrregiao {name} para').format(
name=unicode(microrregiao)) name=unicode(microrregiao))
) )
data['querystring'] = 'micro={0}'.format(microrregiao.pk) data['querystring'] = 'micro={0}'.format(microrregiao.pk)
@ -762,7 +762,7 @@ def portfolio(request):
data['mesorregioes'] = uf.mesorregiao_set.all() data['mesorregioes'] = uf.mesorregiao_set.all()
data['microrregioes'] = mesorregiao.microrregiao_set.all() data['microrregioes'] = mesorregiao.microrregiao_set.all()
data['form'] = PortfolioForm( data['form'] = PortfolioForm(
_(u'Atribuir casas da mesorregiao {name} para').format( _('Atribuir casas da mesorregiao {name} para').format(
name=unicode(mesorregiao))) name=unicode(mesorregiao)))
data['querystring'] = 'meso={0}'.format(mesorregiao.pk) data['querystring'] = 'meso={0}'.format(mesorregiao.pk)
casas = Orgao.objects.filter( casas = Orgao.objects.filter(
@ -775,7 +775,7 @@ def portfolio(request):
data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao) data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao)
data['mesorregioes'] = uf.mesorregiao_set.all() data['mesorregioes'] = uf.mesorregiao_set.all()
data['form'] = PortfolioForm( data['form'] = PortfolioForm(
_(u'Atribuir casas do estado {name} para').format( _('Atribuir casas do estado {name} para').format(
name=unicode(uf))) name=unicode(uf)))
data['querystring'] = 'uf={0}'.format(uf.pk) data['querystring'] = 'uf={0}'.format(uf.pk)
casas = Orgao.objects.filter(municipio__uf=uf) casas = Orgao.objects.filter(municipio__uf=uf)
@ -783,7 +783,7 @@ def portfolio(request):
data['regiao'] = regiao data['regiao'] = regiao
data['ufs'] = UnidadeFederativa.objects.filter(regiao=regiao) data['ufs'] = UnidadeFederativa.objects.filter(regiao=regiao)
data['form'] = PortfolioForm( data['form'] = PortfolioForm(
_(u'Atribuir casas da região {name} para').format( _('Atribuir casas da região {name} para').format(
name=[x[1] for x in UnidadeFederativa.REGIAO_CHOICES if name=[x[1] for x in UnidadeFederativa.REGIAO_CHOICES if
x[0] == regiao][0])) x[0] == regiao][0]))
data['querystring'] = 'regiao={0}'.format(regiao) data['querystring'] = 'regiao={0}'.format(regiao)
@ -814,21 +814,21 @@ def portfolio(request):
if acao == 'ADD': if acao == 'ADD':
gerente.casas_que_gerencia.add(*casas) gerente.casas_que_gerencia.add(*casas)
data['messages'].append(ungettext( data['messages'].append(ungettext(
u"{count} casa adicionada para {gerente}", "{count} casa adicionada para {gerente}",
u"{count} casas adicionadas para {gerente}", "{count} casas adicionadas para {gerente}",
count).format(count=count,gerente=gerente.nome_completo) count).format(count=count,gerente=gerente.nome_completo)
) )
elif acao == 'DEL': elif acao == 'DEL':
gerente.casas_que_gerencia.remove(*casas) gerente.casas_que_gerencia.remove(*casas)
data['messages'].append(ungettext( data['messages'].append(ungettext(
u"{count} casa removida de {gerente}", "{count} casa removida de {gerente}",
u"{count} casas removidas de {gerente}", "{count} casas removidas de {gerente}",
count).format(count=count,gerente=gerente.nome_completo) count).format(count=count,gerente=gerente.nome_completo)
) )
else: else:
data['errors'].append(_(u"Ação não definida")) data['errors'].append(_("Ação não definida"))
else: else:
data['errors'].append(_(u"Dados inválidos")) data['errors'].append(_("Dados inválidos"))
paginator = Paginator(casas, 30) paginator = Paginator(casas, 30)
try: try:
@ -892,16 +892,16 @@ def resumo_carteira(casas):
else: else:
dados_ocorrencia['media'][r] = (1.0 * dados_ocorrencia['registradas'][r] / (total[r] - dados_ocorrencia['sem'][r])) dados_ocorrencia['media'][r] = (1.0 * dados_ocorrencia['registradas'][r] / (total[r] - dados_ocorrencia['sem'][r]))
resumo = [[_(u"Item"), _(u"Total nacional")] + [r[1] for r in UnidadeFederativa.REGIAO_CHOICES]] resumo = [[_("Item"), _("Total nacional")] + [r[1] for r in UnidadeFederativa.REGIAO_CHOICES]]
resumo.append([_(u"Casas em sua carteira"), total['total']] + [total[r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) resumo.append([_("Casas em sua carteira"), total['total']] + [total[r[0]] for r in UnidadeFederativa.REGIAO_CHOICES])
resumo.append({'subtitle': _(u"Uso dos produtos Interlegis")}) resumo.append({'subtitle': _("Uso dos produtos Interlegis")})
resumo.append([_(u"Casas sem nenhum produto"), sem_produto['total']] + [sem_produto[r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) resumo.append([_("Casas sem nenhum produto"), sem_produto['total']] + [sem_produto[r[0]] for r in UnidadeFederativa.REGIAO_CHOICES])
resumo.extend([[ts.nome, dados[ts.id]['total']] + [dados[ts.id][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES] for ts in tipos_servico]) resumo.extend([[ts.nome, dados[ts.id]['total']] + [dados[ts.id][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES] for ts in tipos_servico])
resumo.append({'subtitle': _(u"Registros no sistema de ocorrências")}) resumo.append({'subtitle': _("Registros no sistema de ocorrências")})
resumo.append([_(u"Casas que nunca registraram ocorrências"), dados_ocorrencia['sem']['total']] + [dados_ocorrencia['sem'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) resumo.append([_("Casas que nunca registraram ocorrências"), dados_ocorrencia['sem']['total']] + [dados_ocorrencia['sem'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES])
resumo.append([_(u"Total de ocorrências registradas"), dados_ocorrencia['registradas']['total']] + [dados_ocorrencia['registradas'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) resumo.append([_("Total de ocorrências registradas"), dados_ocorrencia['registradas']['total']] + [dados_ocorrencia['registradas'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES])
resumo.append([_(u"Total de ocorrências pendentes"), dados_ocorrencia['pendentes']['total']] + [dados_ocorrencia['pendentes'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES]) resumo.append([_("Total de ocorrências pendentes"), dados_ocorrencia['pendentes']['total']] + [dados_ocorrencia['pendentes'][r[0]] for r in UnidadeFederativa.REGIAO_CHOICES])
resumo.append([_(u"Média de ocorrências por casa"), round(dados_ocorrencia['media']['total'], 2)] + [round(dados_ocorrencia['media'][r[0]], 2) for r in UnidadeFederativa.REGIAO_CHOICES]) resumo.append([_("Média de ocorrências por casa"), round(dados_ocorrencia['media']['total'], 2)] + [round(dados_ocorrencia['media'][r[0]], 2) for r in UnidadeFederativa.REGIAO_CHOICES])
return resumo return resumo
@ -1016,13 +1016,13 @@ def painel_relacionamento(request):
response['Content-Disposition'] = 'attachment; filename=casas.csv' response['Content-Disposition'] = 'attachment; filename=casas.csv'
writer = csv.writer(response) writer = csv.writer(response)
writer.writerow([ writer.writerow([
_(u"Casa legislativa").encode('utf8'), _("Casa legislativa").encode('utf8'),
_(u"Região").encode('utf8'), _("Região").encode('utf8'),
_(u"Estado").encode('utf8'), _("Estado").encode('utf8'),
_(u"Mesorregião").encode('utf8'), _("Mesorregião").encode('utf8'),
_(u"Microrregião").encode('utf8'), _("Microrregião").encode('utf8'),
_(u"Gerentes Interlegis").encode('utf8'), _("Gerentes Interlegis").encode('utf8'),
_(u"Serviços").encode('utf8'), _("Serviços").encode('utf8'),
]) ])
for c in casas: for c in casas:
writer.writerow([ writer.writerow([
@ -1032,7 +1032,7 @@ def painel_relacionamento(request):
c.municipio.microrregiao.mesorregiao.nome.encode('utf8'), c.municipio.microrregiao.mesorregiao.nome.encode('utf8'),
c.municipio.microrregiao.nome.encode('utf8'), c.municipio.microrregiao.nome.encode('utf8'),
c.lista_gerentes(fmt='lista').encode('utf8'), c.lista_gerentes(fmt='lista').encode('utf8'),
(u", ".join([s.tipo_servico.nome for s in c.servico_set.filter(data_desativacao__isnull=True)])).encode('utf8'), (", ".join([s.tipo_servico.nome for s in c.servico_set.filter(data_desativacao__isnull=True)])).encode('utf8'),
]) ])
return response return response
return render(request, 'casas/lista_casas_carteira_snippet.html', context) return render(request, 'casas/lista_casas_carteira_snippet.html', context)

2
sigi/apps/contatos/admin.py

@ -44,7 +44,7 @@ class MunicipioAdmin(BaseModelAdmin):
'fields': ('codigo_ibge', 'codigo_tse', 'nome', 'data_criacao', 'uf', 'microrregiao', 'fields': ('codigo_ibge', 'codigo_tse', 'nome', 'data_criacao', 'uf', 'microrregiao',
'is_capital', 'populacao', 'is_polo', 'idh', 'pib_ano', 'pib_total', 'pib_percapita') 'is_capital', 'populacao', 'is_polo', 'idh', 'pib_ano', 'pib_total', 'pib_percapita')
}), }),
(_(u'Posição geográfica'), { (_('Posição geográfica'), {
'fields': ('latitude', 'longitude'), 'fields': ('latitude', 'longitude'),
}), }),
) )

10
sigi/apps/contatos/filters.py

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

16
sigi/apps/contatos/management/commands/importa_mesomicro.py

@ -27,8 +27,8 @@ from django.core.management.base import BaseCommand, CommandError
from sigi.apps.contatos.models import Municipio, UnidadeFederativa, Mesorregiao, Microrregiao from sigi.apps.contatos.models import Municipio, UnidadeFederativa, Mesorregiao, Microrregiao
class Command(BaseCommand): class Command(BaseCommand):
args = u"data_file.csv" args = "data_file.csv"
help = u"""Importa arquivo do IBGE para preencher as tabelas de meso e microrregiões para os municípios. help = """Importa arquivo do IBGE para preencher as tabelas de meso e microrregiões para os municípios.
A primeira linha do arquivo deve possuir um cabeçalho com os seguintes campos obrigatórios: A primeira linha do arquivo deve possuir um cabeçalho com os seguintes campos obrigatórios:
- cod_uf : Código IBGE da Unidade da Federação - cod_uf : Código IBGE da Unidade da Federação
@ -45,18 +45,18 @@ class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
if len(args) != 1: if len(args) != 1:
raise CommandError(u"Informe UM arquivo csv a importar") raise CommandError("Informe UM arquivo csv a importar")
file_name = args[0] file_name = args[0]
if not os.path.isfile(file_name): if not os.path.isfile(file_name):
raise CommandError(u"Arquivo %s não encontrado" % [file_name,]) raise CommandError("Arquivo %s não encontrado" % [file_name,])
with open(file_name, 'rb') as csvfile: with open(file_name, 'rb') as csvfile:
reader = csv.DictReader(csvfile) reader = csv.DictReader(csvfile)
if not self.campos.issubset(reader.fieldnames): if not self.campos.issubset(reader.fieldnames):
raise CommandError(u"O arquivo não possui todos os campos obrigatórios") raise CommandError("O arquivo não possui todos os campos obrigatórios")
erros = 0 erros = 0
@ -64,7 +64,7 @@ class Command(BaseCommand):
try: try:
uf = UnidadeFederativa.objects.get(codigo_ibge=reg['cod_uf']) uf = UnidadeFederativa.objects.get(codigo_ibge=reg['cod_uf'])
except UnidadeFederativa.DoesNotExist: except UnidadeFederativa.DoesNotExist:
self.stdout.write(u"(Linha %s): não existe UF com código IBGE '%s'" % self.stdout.write("(Linha %s): não existe UF com código IBGE '%s'" %
(reader.line_num, reg['cod_uf'],)) (reader.line_num, reg['cod_uf'],))
erros = erros + 1 erros = erros + 1
continue continue
@ -72,7 +72,7 @@ class Command(BaseCommand):
try: try:
municipio = Municipio.objects.get(codigo_ibge=reg['cod_municipio']) municipio = Municipio.objects.get(codigo_ibge=reg['cod_municipio'])
except Municipio.DoesNotExist: except Municipio.DoesNotExist:
self.stdout.write(u"(Linha %s): não existe Município com código IBGE '%s'" % self.stdout.write("(Linha %s): não existe Município com código IBGE '%s'" %
(reader.line_num, reg['cod_municipio'],)) (reader.line_num, reg['cod_municipio'],))
erros = erros + 1 erros = erros + 1
continue continue
@ -97,4 +97,4 @@ class Command(BaseCommand):
municipio.microrregiao = micro municipio.microrregiao = micro
municipio.save() municipio.save()
self.stdout.write(u"Importação concluída. %s erros em %s linhas" % (erros, reader.line_num,)) self.stdout.write("Importação concluída. %s erros em %s linhas" % (erros, reader.line_num,))

208
sigi/apps/contatos/models.py

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

36
sigi/apps/convenios/admin.py

@ -51,17 +51,17 @@ class ConvenioAdmin(BaseModelAdmin):
{'fields': ('casa_legislativa', 'num_processo_sf', 'num_convenio', {'fields': ('casa_legislativa', 'num_processo_sf', 'num_convenio',
'projeto', 'data_sigi',)} 'projeto', 'data_sigi',)}
), ),
(_(u"Acompanhamento no gabinete"), (_("Acompanhamento no gabinete"),
{'fields': ('data_solicitacao', 'data_sigad', 'observacao',)} {'fields': ('data_solicitacao', 'data_sigad', 'observacao',)}
), ),
(_(u"Gestão do convênio"), (_("Gestão do convênio"),
{'fields': ('servico_gestao', 'servidor_gestao',)} {'fields': ('servico_gestao', 'servidor_gestao',)}
), ),
(_(u'Datas'), (_('Datas'),
{'fields': ('data_retorno_assinatura', 'data_termino_vigencia', {'fields': ('data_retorno_assinatura', 'data_termino_vigencia',
'data_pub_diario',)} 'data_pub_diario',)}
), ),
(_(u'Gescon'), (_('Gescon'),
{'fields': ('atualizacao_gescon', 'observacao_gescon', 'link_gescon')} {'fields': ('atualizacao_gescon', 'observacao_gescon', 'link_gescon')}
), ),
) )
@ -86,7 +86,7 @@ class ConvenioAdmin(BaseModelAdmin):
def get_uf(self, obj): def get_uf(self, obj):
return obj.casa_legislativa.municipio.uf.sigla return obj.casa_legislativa.municipio.uf.sigla
get_uf.short_description = _(u'UF') get_uf.short_description = _('UF')
get_uf.admin_order_field = 'casa_legislativa__municipio__uf__sigla' get_uf.admin_order_field = 'casa_legislativa__municipio__uf__sigla'
def status_convenio(self, obj): def status_convenio(self, obj):
@ -94,17 +94,17 @@ class ConvenioAdmin(BaseModelAdmin):
return "" return ""
status = obj.get_status() status = obj.get_status()
if status in [u"Vencido", u"Desistência", u"Cancelado"]: if status in ["Vencido", "Desistência", "Cancelado"]:
label = r"danger" label = r"danger"
elif status == u"Vigente": elif status == "Vigente":
label = r"success" label = r"success"
elif status == u"Pendente": elif status == "Pendente":
label = r"warning" label = r"warning"
else: else:
label = r"info" label = r"info"
return u'<p class="label label-{label}">{status}</p>'.format(label=label, status=status) return '<p class="label label-{label}">{status}</p>'.format(label=label, status=status)
status_convenio.short_description = _(u"Status do convênio") status_convenio.short_description = _("Status do convênio")
status_convenio.allow_tags = True status_convenio.allow_tags = True
def link_sigad(self, obj): def link_sigad(self, obj):
@ -117,11 +117,11 @@ class ConvenioAdmin(BaseModelAdmin):
def link_gescon(self, obj): def link_gescon(self, obj):
if not obj.id_contrato_gescon: if not obj.id_contrato_gescon:
return u"" return ""
return ( return (
u"<a href='https://adm.senado.gov.br/gestao-contratos/api/" "<a href='https://adm.senado.gov.br/gestao-contratos/api/"
u"contratos/buscaTexto/{id}'>https://adm.senado.gov.br/" "contratos/buscaTexto/{id}'>https://adm.senado.gov.br/"
u"gestao-contratos/api/{id}</a>").format(id=obj.id_contrato_gescon) "gestao-contratos/api/{id}</a>").format(id=obj.id_contrato_gescon)
link_gescon.short_description = _("Download MINUTA ASSINADA do Gescon") link_gescon.short_description = _("Download MINUTA ASSINADA do Gescon")
link_gescon.allow_tags = True link_gescon.allow_tags = True
@ -149,7 +149,7 @@ class ConvenioAdmin(BaseModelAdmin):
report = ConvenioReport(queryset=queryset) report = ConvenioReport(queryset=queryset)
report.generate_by(PDFGenerator, filename=response) report.generate_by(PDFGenerator, filename=response)
return response return response
relatorio.short_description = _(u'Exportar convênios selecionados para PDF') relatorio.short_description = _('Exportar convênios selecionados para PDF')
def adicionar_convenios(self, request, queryset): def adicionar_convenios(self, request, queryset):
if 'carrinho_convenios' in request.session: if 'carrinho_convenios' in request.session:
@ -160,11 +160,11 @@ class ConvenioAdmin(BaseModelAdmin):
q2 = len(request.session['carrinho_convenios']) q2 = len(request.session['carrinho_convenios'])
quant = q2 - q1 quant = q2 - q1
if quant: if quant:
self.message_user(request, str(q2 - q1) + _(u" Convênios adicionados no carrinho")) self.message_user(request, str(q2 - q1) + _(" Convênios adicionados no carrinho"))
else: else:
self.message_user(request, _(u"Os Convênios selecionados já foram adicionadas anteriormente")) self.message_user(request, _("Os Convênios selecionados já foram adicionadas anteriormente"))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
adicionar_convenios.short_description = _(u"Armazenar convênios no carrinho para exportar") adicionar_convenios.short_description = _("Armazenar convênios no carrinho para exportar")
def get_actions(self, request): def get_actions(self, request):
actions = super(ConvenioAdmin, self).get_actions(request) actions = super(ConvenioAdmin, self).get_actions(request)

296
sigi/apps/convenios/models.py

@ -26,12 +26,12 @@ class Projeto(models.Model):
class StatusConvenio(models.Model): class StatusConvenio(models.Model):
nome = models.CharField(max_length=100) nome = models.CharField(max_length=100)
cancela = models.BooleanField(_(u"Cancela o convênio"), default=False) cancela = models.BooleanField(_("Cancela o convênio"), default=False)
class Meta: class Meta:
ordering = ('nome',) ordering = ('nome',)
verbose_name = _(u"Estado de convenios") verbose_name = _("Estado de convenios")
verbose_name_plural = _(u"Estados de convenios") verbose_name_plural = _("Estados de convenios")
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
@ -41,8 +41,8 @@ class TipoSolicitacao(models.Model):
class Meta: class Meta:
ordering = ('nome',) ordering = ('nome',)
verbose_name = _(u"tipo de solicitação") verbose_name = _("tipo de solicitação")
verbose_name_plural = _(u"Tipos de solicitação") verbose_name_plural = _("Tipos de solicitação")
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
@ -51,47 +51,47 @@ class Convenio(models.Model):
casa_legislativa = models.ForeignKey( casa_legislativa = models.ForeignKey(
'casas.Orgao', 'casas.Orgao',
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'órgão conveniado') verbose_name=_('órgão conveniado')
) )
# campo de busca em caixa baixa e sem acentos # campo de busca em caixa baixa e sem acentos
projeto = models.ForeignKey( projeto = models.ForeignKey(
Projeto, Projeto,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Tipo de Convenio') verbose_name=_('Tipo de Convenio')
) )
# numero designado pelo Senado Federal para o convênio # numero designado pelo Senado Federal para o convênio
num_processo_sf = models.CharField( num_processo_sf = models.CharField(
_(u'número do processo SF (Senado Federal)'), _('número do processo SF (Senado Federal)'),
max_length=20, max_length=20,
blank=True, blank=True,
help_text=_(u'Formatos:<br/>Antigo: <em>XXXXXX/XX-X</em>.<br/><em>SIGAD: XXXXX.XXXXXX/XXXX-XX</em>') help_text=_('Formatos:<br/>Antigo: <em>XXXXXX/XX-X</em>.<br/><em>SIGAD: XXXXX.XXXXXX/XXXX-XX</em>')
) )
# link_processo_stf = ('get_sigad_url') # link_processo_stf = ('get_sigad_url')
num_convenio = models.CharField( num_convenio = models.CharField(
_(u'número do convênio'), _('número do convênio'),
max_length=10, max_length=10,
blank=True blank=True
) )
id_contrato_gescon = models.CharField( id_contrato_gescon = models.CharField(
_(u"ID do contrato no Gescon"), _("ID do contrato no Gescon"),
max_length=20, max_length=20,
blank=True, blank=True,
default="", default="",
editable=False editable=False
) )
data_sigi = models.DateField( data_sigi = models.DateField(
_(u"data de cadastro no SIGI"), _("data de cadastro no SIGI"),
blank=True, blank=True,
null=True, null=True,
auto_now_add=True auto_now_add=True
) )
data_sigad = models.DateField( data_sigad = models.DateField(
_(u"data de cadastro no SIGAD"), _("data de cadastro no SIGAD"),
null=True, null=True,
blank=True blank=True
) )
data_solicitacao = models.DateField( data_solicitacao = models.DateField(
_(u"data do e-mail de solicitação"), _("data do e-mail de solicitação"),
null=True, null=True,
blank=True blank=True
) )
@ -100,12 +100,12 @@ class Convenio(models.Model):
on_delete=models.PROTECT, on_delete=models.PROTECT,
null=True, null=True,
blank=True, blank=True,
verbose_name=_(u"tipo de solicitação") verbose_name=_("tipo de solicitação")
) )
status = models.ForeignKey( status = models.ForeignKey(
StatusConvenio, StatusConvenio,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
verbose_name=_(u"estado atual"), verbose_name=_("estado atual"),
null=True, null=True,
blank=True blank=True
) )
@ -113,12 +113,12 @@ class Convenio(models.Model):
Servidor, Servidor,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
related_name='convenios_acompanhados', related_name='convenios_acompanhados',
verbose_name=_(u"acompanhado por"), verbose_name=_("acompanhado por"),
null=True, null=True,
blank=True blank=True
) )
observacao = models.TextField( observacao = models.TextField(
_(u"observações"), _("observações"),
null=True, null=True,
blank=True, blank=True,
) )
@ -128,97 +128,97 @@ class Convenio(models.Model):
null=True, null=True,
blank=True, blank=True,
related_name='convenios_geridos', related_name='convenios_geridos',
verbose_name=_(u"serviço de gestão") verbose_name=_("serviço de gestão")
) )
servidor_gestao = models.ForeignKey( servidor_gestao = models.ForeignKey(
Servidor, Servidor,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
null=True, null=True,
blank=True, blank=True,
verbose_name=_(u"servidor de gestão") verbose_name=_("servidor de gestão")
) )
data_adesao = models.DateField( data_adesao = models.DateField(
_(u'aderidas'), _('aderidas'),
null=True, null=True,
blank=True, blank=True,
) )
data_retorno_assinatura = models.DateField( data_retorno_assinatura = models.DateField(
_(u'data início vigência'), _('data início vigência'),
null=True, null=True,
blank=True, blank=True,
help_text=_(u'Convênio firmado.') help_text=_('Convênio firmado.')
) )
data_termino_vigencia = models.DateField( data_termino_vigencia = models.DateField(
_(u'Data término vigência'), _('Data término vigência'),
null=True, null=True,
blank=True, blank=True,
help_text=_(u'Término da vigência do convênio.') help_text=_('Término da vigência do convênio.')
) )
data_pub_diario = models.DateField( data_pub_diario = models.DateField(
_(u'data da publicação no Diário Oficial'), _('data da publicação no Diário Oficial'),
null=True, null=True,
blank=True blank=True
) )
data_termo_aceite = models.DateField( data_termo_aceite = models.DateField(
_(u'equipadas'), _('equipadas'),
null=True, null=True,
blank=True, blank=True,
help_text=_(u'Equipamentos recebidos.') help_text=_('Equipamentos recebidos.')
) )
data_devolucao_via = models.DateField( data_devolucao_via = models.DateField(
_(u'data de devolução da via'), _('data de devolução da via'),
null=True, null=True,
blank=True, blank=True,
help_text=_(u'Data de devolução da via do convênio à Câmara Municipal.') help_text=_('Data de devolução da via do convênio à Câmara Municipal.')
) )
data_postagem_correio = models.DateField( data_postagem_correio = models.DateField(
_(u'data postagem correio'), _('data postagem correio'),
null=True, null=True,
blank=True, blank=True,
) )
data_devolucao_sem_assinatura = models.DateField( data_devolucao_sem_assinatura = models.DateField(
_(u'data de devolução por falta de assinatura'), _('data de devolução por falta de assinatura'),
null=True, null=True,
blank=True, blank=True,
help_text=_(u'Data de devolução por falta de assinatura'), help_text=_('Data de devolução por falta de assinatura'),
) )
data_retorno_sem_assinatura = models.DateField( data_retorno_sem_assinatura = models.DateField(
_(u'data do retorno sem assinatura'), _('data do retorno sem assinatura'),
null=True, null=True,
blank=True, blank=True,
help_text=_(u'Data do retorno do convênio sem assinatura'), help_text=_('Data do retorno do convênio sem assinatura'),
) )
conveniada = models.BooleanField(default=False) conveniada = models.BooleanField(default=False)
equipada = models.BooleanField(default=False) equipada = models.BooleanField(default=False)
atualizacao_gescon = models.DateTimeField( atualizacao_gescon = models.DateTimeField(
_(u"Data de atualização pelo Gescon"), _("Data de atualização pelo Gescon"),
blank=True, blank=True,
null=True null=True
) )
observacao_gescon = models.TextField( observacao_gescon = models.TextField(
_(u"Observações da atualização do Gescon"), _("Observações da atualização do Gescon"),
blank=True blank=True
) )
def get_status(self): def get_status(self):
if self.status and self.status.cancela: if self.status and self.status.cancela:
return _(u"Cancelado") return _("Cancelado")
if self.data_retorno_assinatura is not None: if self.data_retorno_assinatura is not None:
if self.data_termino_vigencia is not None: if self.data_termino_vigencia is not None:
if date.today() >= self.data_termino_vigencia: if date.today() >= self.data_termino_vigencia:
return _(u"Vencido") return _("Vencido")
return _(u"Vigente") return _("Vigente")
if (self.data_retorno_assinatura is None and if (self.data_retorno_assinatura is None and
self.data_devolucao_sem_assinatura is None and self.data_devolucao_sem_assinatura is None and
self.data_retorno_sem_assinatura is None): self.data_retorno_sem_assinatura is None):
return _(u"Pendente") return _("Pendente")
if (self.data_devolucao_sem_assinatura is not None or if (self.data_devolucao_sem_assinatura is not None or
self.data_retorno_sem_assinatura is not None): self.data_retorno_sem_assinatura is not None):
return _(u"Desistência") return _("Desistência")
return _(u"Indefinido") return _("Indefinido")
def link_sigad(self, obj): def link_sigad(self, obj):
if obj.pk is None: if obj.pk is None:
@ -250,43 +250,43 @@ class Convenio(models.Model):
class Meta: class Meta:
get_latest_by = 'id' get_latest_by = 'id'
ordering = ('id',) ordering = ('id',)
verbose_name = _(u'convênio') verbose_name = _('convênio')
def __unicode__(self): def __unicode__(self):
# if self.data_retorno_assinatura is not None: # if self.data_retorno_assinatura is not None:
# return _(u"Convênio {project} nº {number} assinado em {date}. Status: {status}".format( # return _("Convênio {project} nº {number} assinado em {date}. Status: {status}".format(
# number=self.num_convenio, # number=self.num_convenio,
# project=self.projeto.sigla, # project=self.projeto.sigla,
# date=self.data_retorno_assinatura, # date=self.data_retorno_assinatura,
# status=self.get_status())) # status=self.get_status()))
# else: # else:
# return _(u"Adesão ao projeto %(project)s, em %(date)s") % dict( # return _("Adesão ao projeto %(project)s, em %(date)s") % dict(
# project=self.projeto.sigla, # project=self.projeto.sigla,
# date=self.data_adesao) # date=self.data_adesao)
if ((self.data_retorno_assinatura is None) and if ((self.data_retorno_assinatura is None) and
(self.equipada and self.data_termo_aceite is not None)): (self.equipada and self.data_termo_aceite is not None)):
return _(u"{project}{number} - equipada em {date}" return _("{project}{number} - equipada em {date}"
).format(number=self.num_convenio, ).format(number=self.num_convenio,
date=self.data_termo_aceite.strftime('%d/%m/%Y'), date=self.data_termo_aceite.strftime('%d/%m/%Y'),
project=self.projeto.sigla) project=self.projeto.sigla)
elif self.data_retorno_assinatura is None: elif self.data_retorno_assinatura is None:
return _(u"{project}, nº {number}, início " return _("{project}, nº {number}, início "
u"em {date}").format(number=self.num_convenio, "em {date}").format(number=self.num_convenio,
project=self.projeto.sigla, project=self.projeto.sigla,
date=self.data_adesao) date=self.data_adesao)
if ((self.data_retorno_assinatura is not None) and not if ((self.data_retorno_assinatura is not None) and not
(self.equipada and self.data_termo_aceite is not None)): (self.equipada and self.data_termo_aceite is not None)):
return _(u"{project}, nº {number}, inicio em " return _("{project}, nº {number}, inicio em "
u"{date}. Status: {status}").format( "{date}. Status: {status}").format(
number=self.num_convenio, number=self.num_convenio,
project=self.projeto.sigla, project=self.projeto.sigla,
date=self.data_retorno_assinatura.strftime('%d/%m/%Y'), date=self.data_retorno_assinatura.strftime('%d/%m/%Y'),
status=self.get_status()) status=self.get_status())
if ((self.data_retorno_assinatura is not None) and if ((self.data_retorno_assinatura is not None) and
(self.equipada and self.data_termo_aceite is not None)): (self.equipada and self.data_termo_aceite is not None)):
return _(u"{project}, nº {number}, início em {date}" return _("{project}, nº {number}, início em {date}"
u" e equipada em {equipped_date}. Status: {status}" " e equipada em {equipped_date}. Status: {status}"
).format(number=self.num_convenio, ).format(number=self.num_convenio,
project=self.projeto.sigla, project=self.projeto.sigla,
date=self.data_retorno_assinatura.strftime( date=self.data_retorno_assinatura.strftime(
@ -304,7 +304,7 @@ class EquipamentoPrevisto(models.Model):
convenio = models.ForeignKey( convenio = models.ForeignKey(
Convenio, Convenio,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'convênio') verbose_name=_('convênio')
) )
equipamento = models.ForeignKey( equipamento = models.ForeignKey(
'inventario.Equipamento', 'inventario.Equipamento',
@ -313,11 +313,11 @@ class EquipamentoPrevisto(models.Model):
quantidade = models.PositiveSmallIntegerField(default=1) quantidade = models.PositiveSmallIntegerField(default=1)
class Meta: class Meta:
verbose_name = _(u'equipamento previsto') verbose_name = _('equipamento previsto')
verbose_name_plural = _(u'equipamentos previstos') verbose_name_plural = _('equipamentos previstos')
def __unicode__(self): def __unicode__(self):
return u'%s %s(s)' % (self.quantidade, self.equipamento) return '%s %s(s)' % (self.quantidade, self.equipamento)
class Anexo(models.Model): class Anexo(models.Model):
@ -328,13 +328,13 @@ class Anexo(models.Model):
convenio = models.ForeignKey( convenio = models.ForeignKey(
Convenio, Convenio,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'convênio') verbose_name=_('convênio')
) )
# caminho no sistema para o documento anexo # caminho no sistema para o documento anexo
arquivo = models.FileField(upload_to='apps/convenios/anexo/arquivo', max_length=500) arquivo = models.FileField(upload_to='apps/convenios/anexo/arquivo', max_length=500)
descricao = models.CharField(_(u'descrição'), max_length='70') descricao = models.CharField(_('descrição'), max_length='70')
data_pub = models.DateTimeField( data_pub = models.DateTimeField(
_(u'data da publicação do anexo'), _('data da publicação do anexo'),
default=datetime.now default=datetime.now
) )
@ -366,74 +366,74 @@ class Tramitacao(models.Model):
convenio = models.ForeignKey( convenio = models.ForeignKey(
Convenio, Convenio,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'convênio') verbose_name=_('convênio')
) )
unid_admin = models.ForeignKey( unid_admin = models.ForeignKey(
UnidadeAdministrativa, UnidadeAdministrativa,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Unidade Administrativa') verbose_name=_('Unidade Administrativa')
) )
data = models.DateField() data = models.DateField()
observacao = models.CharField( observacao = models.CharField(
_(u'observação'), _('observação'),
max_length='512', max_length='512',
null=True, null=True,
blank=True, blank=True,
) )
class Meta: class Meta:
verbose_name_plural = _(u'Tramitações') verbose_name_plural = _('Tramitações')
def __unicode__(self): def __unicode__(self):
in_date = _(u"em %(date)s") % dict(date=self.data) # for focused translation in_date = _("em %(date)s") % dict(date=self.data) # for focused translation
result = u"%s %s" % (self.unid_admin, in_date) result = "%s %s" % (self.unid_admin, in_date)
if self.observacao: if self.observacao:
result = result + u" (%s)" % (self.observacao) result = result + " (%s)" % (self.observacao)
return unicode(result) # XXX is this unicode(...) really necessary??? return unicode(result) # XXX is this unicode(...) really necessary???
class Gescon(models.Model): class Gescon(models.Model):
url_gescon = models.URLField( url_gescon = models.URLField(
_(u"Webservice Gescon"), _("Webservice Gescon"),
default=(u"https://adm.senado.gov.br/gestao-contratos/api/contratos" default=("https://adm.senado.gov.br/gestao-contratos/api/contratos"
u"/busca?especie={s}"), "/busca?especie={s}"),
help_text=_(u"Informe o ponto de consulta do webservice do Gescon, " help_text=_("Informe o ponto de consulta do webservice do Gescon, "
u"inclusive com a querystring. No ponto onde deve ser " "inclusive com a querystring. No ponto onde deve ser "
u"inserida a sigla da subespecie do contrato, use a " "inserida a sigla da subespecie do contrato, use a "
u"marcação {s}.<br/><strong>Por exemplo:</strong> " "marcação {s}.<br/><strong>Por exemplo:</strong> "
u"https://adm.senado.gov.br/gestao-contratos/api/contratos" "https://adm.senado.gov.br/gestao-contratos/api/contratos"
u"/busca?especie=<strong>{s}</strong>") "/busca?especie=<strong>{s}</strong>")
) )
subespecies = models.TextField( subespecies = models.TextField(
_(u"Subespécies"), _("Subespécies"),
default=u"AC=ACT\nPI=PI\nCN=PML\nTA=PML", default="AC=ACT\nPI=PI\nCN=PML\nTA=PML",
help_text=_(u"Informe as siglas das subespécies de contratos que " help_text=_("Informe as siglas das subespécies de contratos que "
u"devem ser pesquisados no Gescon com a sigla " "devem ser pesquisados no Gescon com a sigla "
u"correspondente do projeto no SIGI. Coloque um par de " "correspondente do projeto no SIGI. Coloque um par de "
u"siglas por linha, no formato SIGLA_GESTON=SIGLA_SIGI. " "siglas por linha, no formato SIGLA_GESTON=SIGLA_SIGI. "
u"As siglas não encontradas serão ignoradas.") "As siglas não encontradas serão ignoradas.")
) )
palavras = models.TextField( palavras = models.TextField(
_(u"Palavras de filtro"), _("Palavras de filtro"),
default=u"ILB\nINTERLEGIS", default="ILB\nINTERLEGIS",
help_text=_(u"Palavras que devem aparecer no campo OBJETO dos dados do " help_text=_("Palavras que devem aparecer no campo OBJETO dos dados do "
u"Gescon para identificar se o contrato pertence ao ILB. " "Gescon para identificar se o contrato pertence ao ILB. "
u"<ul><li>Informe uma palavra por linha.</li>" "<ul><li>Informe uma palavra por linha.</li>"
u"<li>Ocorrendo qualquer uma das palavras, o contrato será " "<li>Ocorrendo qualquer uma das palavras, o contrato será "
u"importado.</li></ul>") "importado.</li></ul>")
) )
email = models.EmailField( email = models.EmailField(
_(u"E-mail"), _("E-mail"),
help_text=_(u"Caixa de e-mail para onde o relatório diário de " help_text=_("Caixa de e-mail para onde o relatório diário de "
u"importação será enviado.") "importação será enviado.")
) )
ultima_importacao = models.TextField( ultima_importacao = models.TextField(
_(u"Resultado da última importação"), _("Resultado da última importação"),
blank=True blank=True
) )
class Meta: class Meta:
verbose_name = _(u"Configuração do Gescon") verbose_name = _("Configuração do Gescon")
verbose_name_plural = _(u"Configurações do Gescon") verbose_name_plural = _("Configurações do Gescon")
def __unicode__(self): def __unicode__(self):
return self.url_gescon return self.url_gescon
@ -454,43 +454,43 @@ class Gescon(models.Model):
def email_report(self): def email_report(self):
if self.email: if self.email:
send_mail( send_mail(
subject=_(u"Relatório de importação GESCON"), subject=_("Relatório de importação GESCON"),
message=self.ultima_importacao, message=self.ultima_importacao,
recipient_list=self.email, recipient_list=self.email,
fail_silently=True fail_silently=True
) )
else: else:
self.ultima_importacao += _( self.ultima_importacao += _(
u"\n\n*Não foi definida uma caixa de e-mail nas configurações " "\n\n*Não foi definida uma caixa de e-mail nas configurações "
u"do Gescon*" "do Gescon*"
) )
self.save() self.save()
def importa_contratos(self): def importa_contratos(self):
self.ultima_importacao = "" self.ultima_importacao = ""
self.add_message( self.add_message(
_(u"Importação iniciada em {:%d/%m/%Y %H:%M:%S}\n" _("Importação iniciada em {:%d/%m/%Y %H:%M:%S}\n"
u"==========================================\n").format( "==========================================\n").format(
datetime.now() datetime.now()
) )
) )
if self.palavras == "": if self.palavras == "":
self.add_message(_(u"Nenhuma palavra de pesquisa definida - " self.add_message(_("Nenhuma palavra de pesquisa definida - "
u"processo abortado."), True) "processo abortado."), True)
return return
if self.subespecies == "": if self.subespecies == "":
self.add_message(_(u"Nenhuma subespécie definida - processo " self.add_message(_("Nenhuma subespécie definida - processo "
u"abortado."), True) "abortado."), True)
return return
if "{s}" not in self.url_gescon: if "{s}" not in self.url_gescon:
self.add_message( self.add_message(
_( _(
u"Falta a marcação {s} na URL para indicar o local onde " "Falta a marcação {s} na URL para indicar o local onde "
u"inserir a sigla da subespécia na consulta ao webservice " "inserir a sigla da subespécia na consulta ao webservice "
u"- processo abortado." "- processo abortado."
), ),
True True
) )
@ -500,7 +500,7 @@ class Gescon(models.Model):
subespecies = {tuple(s.split("=")) for s in self.subespecies.split()} subespecies = {tuple(s.split("=")) for s in self.subespecies.split()}
for sigla_gescon, sigla_sigi in subespecies: for sigla_gescon, sigla_sigi in subespecies:
self.add_message(_(u"\nImportando subespécie {s}".format( self.add_message(_("\nImportando subespécie {s}".format(
s=sigla_gescon))) s=sigla_gescon)))
url = self.url_gescon.format(s=sigla_gescon) url = self.url_gescon.format(s=sigla_gescon)
@ -510,7 +510,7 @@ class Gescon(models.Model):
response = requests.get(url, verify=False) response = requests.get(url, verify=False)
except Exception as e: except Exception as e:
self.add_message( self.add_message(
_(u"\tErro ao acessar {url}: {errmsg}").format( _("\tErro ao acessar {url}: {errmsg}").format(
url=url, url=url,
errmsg=e.message.decode("utf8") errmsg=e.message.decode("utf8")
) )
@ -519,7 +519,7 @@ class Gescon(models.Model):
if not response.ok: if not response.ok:
self.add_message( self.add_message(
_(u"\tErro ao acessar {url}: {reason}").format( _("\tErro ao acessar {url}: {reason}").format(
url=url, url=url,
reason=response.reason reason=response.reason
) )
@ -527,8 +527,8 @@ class Gescon(models.Model):
continue continue
if not 'application/json' in response.headers.get('Content-Type'): if not 'application/json' in response.headers.get('Content-Type'):
self.add_message(_(u"\tResultado da consulta à {url} não " self.add_message(_("\tResultado da consulta à {url} não "
u"retornou dados em formato json").format( "retornou dados em formato json").format(
url=url url=url
) )
) )
@ -542,7 +542,7 @@ class Gescon(models.Model):
if any(palavra in c['objeto'] for palavra in palavras)] if any(palavra in c['objeto'] for palavra in palavras)]
self.add_message( self.add_message(
_(u"\t{count} contratos encontrados no Gescon").format( _("\t{count} contratos encontrados no Gescon").format(
count=len(nossos) count=len(nossos)
) )
) )
@ -570,7 +570,7 @@ class Gescon(models.Model):
if contrato['nomeFornecedor']: if contrato['nomeFornecedor']:
nome = contrato['nomeFornecedor'] nome = contrato['nomeFornecedor']
nome = nome.replace(u'VEREADORES DE', '') nome = nome.replace('VEREADORES DE', '')
nome = nome.split('-')[0] nome = nome.split('-')[0]
nome = nome.split('/')[0] nome = nome.split('/')[0]
nome = nome.strip() nome = nome.strip()
@ -581,8 +581,8 @@ class Gescon(models.Model):
if (cnpj is None) and (nome is None): if (cnpj is None) and (nome is None):
self.add_message( self.add_message(
_(u"\tO contrato {numero} no Gescon não informa o CNPJ " _("\tO contrato {numero} no Gescon não informa o CNPJ "
u"nem o nome do órgão.").format(numero=numero) "nem o nome do órgão.").format(numero=numero)
) )
erros += 1 erros += 1
continue continue
@ -609,10 +609,10 @@ class Gescon(models.Model):
if orgao is None: if orgao is None:
self.add_message( self.add_message(
_(u"\tÓrgão não encontrado no SIGI ou mais de um órgão" _("\tÓrgão não encontrado no SIGI ou mais de um órgão"
u"encontrado com o mesmo CNPJ ou nome. Favor " "encontrado com o mesmo CNPJ ou nome. Favor "
u"regularizar o cadastro: CNPJ: {cnpj}, " "regularizar o cadastro: CNPJ: {cnpj}, "
u"Nome: {nome}".format( "Nome: {nome}".format(
cnpj=contrato['cnpjCpfFornecedor'], cnpj=contrato['cnpjCpfFornecedor'],
nome=contrato['nomeFornecedor'] nome=contrato['nomeFornecedor']
) )
@ -656,8 +656,8 @@ class Gescon(models.Model):
data_termino_vigencia=contrato['terminoVigencia'], data_termino_vigencia=contrato['terminoVigencia'],
data_pub_diario=contrato['publicacao'], data_pub_diario=contrato['publicacao'],
atualizacao_gescon=datetime.now(), atualizacao_gescon=datetime.now(),
observacao_gescon=_(u"Importado integralmente do" observacao_gescon=_("Importado integralmente do"
u"Gescon") "Gescon")
) )
convenio.save() convenio.save()
novos += 1 novos += 1
@ -668,8 +668,8 @@ class Gescon(models.Model):
convenio.observacao_gescon = '' convenio.observacao_gescon = ''
if convenio.casa_legislativa != orgao: if convenio.casa_legislativa != orgao:
self.add_message( self.add_message(
_(u"\tO órgao no convênio {url} diverge do que " _("\tO órgao no convênio {url} diverge do que "
u"consta no Gescon ({cnpj}, {nome})").format( "consta no Gescon ({cnpj}, {nome})").format(
url=reverse('admin:%s_%s_change' % ( url=reverse('admin:%s_%s_change' % (
convenio._meta.app_label, convenio._meta.app_label,
convenio._meta.model_name), convenio._meta.model_name),
@ -679,7 +679,7 @@ class Gescon(models.Model):
) )
) )
convenio.observacao_gescon = _( convenio.observacao_gescon = _(
u'ERRO: Órgão diverge do Gescon. Não atualizado!' 'ERRO: Órgão diverge do Gescon. Não atualizado!'
) )
convenio.save() convenio.save()
erros += 1 erros += 1
@ -687,10 +687,10 @@ class Gescon(models.Model):
if convenio.num_processo_sf != sigad: if convenio.num_processo_sf != sigad:
self.add_message( self.add_message(
_(u"\tO contrato Gescon nº {numero} corresponde" _("\tO contrato Gescon nº {numero} corresponde"
u" ao convênio SIGI {url}, mas o NUP sigad " " ao convênio SIGI {url}, mas o NUP sigad "
u"diverge (Gescon: {sigad_gescon}, " "diverge (Gescon: {sigad_gescon}, "
u"SIGI: {sigad_sigi}). CORRIGIDO!").format( "SIGI: {sigad_sigi}). CORRIGIDO!").format(
numero=numero, numero=numero,
url=reverse('admin:%s_%s_change' % ( url=reverse('admin:%s_%s_change' % (
convenio._meta.app_label, convenio._meta.app_label,
@ -702,16 +702,16 @@ class Gescon(models.Model):
) )
convenio.num_processo_sf = sigad convenio.num_processo_sf = sigad
convenio.observacao_gescon += _( convenio.observacao_gescon += _(
u"Número do SIGAD atualizado.\n" "Número do SIGAD atualizado.\n"
) )
alertas += 1 alertas += 1
if convenio.num_convenio != numero: if convenio.num_convenio != numero:
self.add_message( self.add_message(
_(u"\tO contrato Gescon ID {id} corresponde ao " _("\tO contrato Gescon ID {id} corresponde ao "
u"convênio SIGI {url}, mas o número do convênio" "convênio SIGI {url}, mas o número do convênio"
u" diverge (Gescon: {numero_gescon}, SIGI: " " diverge (Gescon: {numero_gescon}, SIGI: "
u"{numero_sigi}). CORRIGIDO!").format( "{numero_sigi}). CORRIGIDO!").format(
id=contrato['id'], id=contrato['id'],
url=reverse('admin:%s_%s_change' % ( url=reverse('admin:%s_%s_change' % (
convenio._meta.app_label, convenio._meta.app_label,
@ -724,14 +724,14 @@ class Gescon(models.Model):
) )
convenio.num_convenio = numero convenio.num_convenio = numero
convenio.observacao_gescon += _( convenio.observacao_gescon += _(
u"Número do convênio atualizado.\n" "Número do convênio atualizado.\n"
) )
alertas += 1 alertas += 1
if contrato['objeto'] not in convenio.observacao: if contrato['objeto'] not in convenio.observacao:
convenio.observacao += "\n" + contrato['objeto'] convenio.observacao += "\n" + contrato['objeto']
convenio.observacao_gescon += _( convenio.observacao_gescon += _(
u"Observação atualizada.\n" "Observação atualizada.\n"
) )
convenio.data_sigad = contrato['assinatura'] convenio.data_sigad = contrato['assinatura']
@ -753,10 +753,10 @@ class Gescon(models.Model):
convenio.save() convenio.save()
except Exception as e: except Exception as e:
self.add_message( self.add_message(
_(u"Ocorreu um erro ao salvar o convênio {url} no " _("Ocorreu um erro ao salvar o convênio {url} no "
u"SIGI. Alguma informação do Gescon pode ter " "SIGI. Alguma informação do Gescon pode ter "
u"quebrado o sistema. Informe ao suporte. Erro:" "quebrado o sistema. Informe ao suporte. Erro:"
u"{errmsg}").format( "{errmsg}").format(
url=reverse('admin:%s_%s_change' % ( url=reverse('admin:%s_%s_change' % (
convenio._meta.app_label, convenio._meta.app_label,
convenio._meta.model_name), convenio._meta.model_name),
@ -770,10 +770,10 @@ class Gescon(models.Model):
atualizados += 1 atualizados += 1
else: else:
self.add_message(_(u"\tExistem {count} convênios no SIGI " self.add_message(_("\tExistem {count} convênios no SIGI "
u"que correspondem ao mesmo contrato no " "que correspondem ao mesmo contrato no "
u"Gescon (contrato {numero}, sigad " "Gescon (contrato {numero}, sigad "
u"{sigad})").format( "{sigad})").format(
count=chk, count=chk,
numero=numero, numero=numero,
sigad=sigad sigad=sigad
@ -783,9 +783,9 @@ class Gescon(models.Model):
continue continue
self.add_message( self.add_message(
_(u"\t{novos} novos convenios adicionados ao SIGI, " _("\t{novos} novos convenios adicionados ao SIGI, "
u"{atualizados} atualizados, sendo {alertas} com alertas, e " "{atualizados} atualizados, sendo {alertas} com alertas, e "
u"{erros} reportados com erro.").format( "{erros} reportados com erro.").format(
novos=novos, novos=novos,
atualizados=atualizados, atualizados=atualizados,
alertas=alertas, alertas=alertas,

50
sigi/apps/convenios/reports.py

@ -26,7 +26,7 @@ class SemEquipamentosReport(object):
class ConvenioReport(ReportDefault): class ConvenioReport(ReportDefault):
title = _(u'Relatório de Parcerias') title = _('Relatório de Parcerias')
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
@ -37,41 +37,41 @@ class ConvenioReport(ReportDefault):
elements += [ elements += [
Label( Label(
text=_(u"UF"), text=_("UF"),
left=label_left[0] * cm, left=label_left[0] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text=_(u"Municipio"), text=_("Municipio"),
left=label_left[1] * cm, left=label_left[1] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text=_(u"Número do Convênio"), text=_("Número do Convênio"),
left=label_left[2] * cm, left=label_left[2] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text=_(u"Projeto"), text=_("Projeto"),
left=label_left[3] * cm, left=label_left[3] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text=_(u"Data do Convênio"), text=_("Data do Convênio"),
left=label_left[4] * cm, left=label_left[4] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text=_(u"Data de Publicação"), text=_("Data de Publicação"),
left=label_left[5] * cm, left=label_left[5] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text=_(u"Orgão"), text=_("Orgão"),
left=label_left[6] * cm, left=label_left[6] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
width=2 * cm, width=2 * cm,
@ -126,7 +126,7 @@ class ConvenioReport(ReportDefault):
# height=0.7 * cm, # height=0.7 * cm,
# elements=[ # elements=[
# ObjectValue(attribute_name='casa_legislativa.municipio.uf', # ObjectValue(attribute_name='casa_legislativa.municipio.uf',
# get_Value=lambda instance: '%s: %s' % (_(u'Casa Legislativa'), instance.casa_legislativa.uf) # get_Value=lambda instance: '%s: %s' % (_('Casa Legislativa'), instance.casa_legislativa.uf)
# ) # )
# ], # ],
# borders={'top': True}, # borders={'top': True},
@ -146,35 +146,35 @@ class ConvenioReportSemAceite(ConvenioReport):
elements += [ elements += [
Label( Label(
text=_(u"UF"), text=_("UF"),
left=label_left[0] * cm, left=label_left[0] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text=_(u"Município"), text=_("Município"),
left=label_left[1] * cm, left=label_left[1] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
), ),
Label( Label(
text=_(u"Número do Convênio"), text=_("Número do Convênio"),
left=label_left[2] * cm, left=label_left[2] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text=_(u"Projeto"), text=_("Projeto"),
left=label_left[3] * cm, left=label_left[3] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text=_(u"Data do Convênio"), text=_("Data do Convênio"),
left=label_left[4] * cm, left=label_left[4] * cm,
top=label_top, top=label_top,
width=2 * cm, width=2 * cm,
), ),
Label( Label(
text=_(u"Orgão"), text=_("Orgão"),
left=label_left[5] * cm, left=label_left[5] * cm,
top=label_top + 0.4 * cm, top=label_top + 0.4 * cm,
width=2 * cm, width=2 * cm,
@ -219,7 +219,7 @@ float_duas_casas = lambda instance: '%.2f' % (instance)
class ConvenioReportRegiao(ReportDefault): class ConvenioReportRegiao(ReportDefault):
title = _(u'Relatório de Parcerias por Região') title = _('Relatório de Parcerias por Região')
class band_page_header(ReportDefault.band_page_header): class band_page_header(ReportDefault.band_page_header):
label_top = ReportDefault.band_page_header.label_top label_top = ReportDefault.band_page_header.label_top
@ -229,11 +229,11 @@ class ConvenioReportRegiao(ReportDefault):
elements = list(ReportDefault.band_page_header.elements) elements = list(ReportDefault.band_page_header.elements)
elements += [ elements += [
Label(text=_(u"UF"), left=label_left[0] * cm, top=label_top,), Label(text=_("UF"), left=label_left[0] * cm, top=label_top,),
Label(text=_(u"Total"), left=label_left[1] * cm, top=label_top,), Label(text=_("Total"), left=label_left[1] * cm, top=label_top,),
Label(text=_(u"Aderidas"), left=label_left[2] * cm, top=label_top,), Label(text=_("Aderidas"), left=label_left[2] * cm, top=label_top,),
Label(text="%", left=label_left[3] * cm, top=label_top), Label(text="%", left=label_left[3] * cm, top=label_top),
Label(text=_(u"Ñ Aderidas"), left=label_left[4] * cm, top=label_top,), Label(text=_("Ñ Aderidas"), left=label_left[4] * cm, top=label_top,),
Label(text="%", left=label_left[5] * cm, top=label_top), Label(text="%", left=label_left[5] * cm, top=label_top),
] ]
@ -255,7 +255,7 @@ class ConvenioReportRegiao(ReportDefault):
class band_summary(ReportBand): class band_summary(ReportBand):
label_left = [0.5, 6, 8, 10, 12, 14] label_left = [0.5, 6, 8, 10, 12, 14]
elements = [ elements = [
Label(text=_(u"Total"), top=0.1 * cm, left=label_left[0] * cm), Label(text=_("Total"), top=0.1 * cm, left=label_left[0] * cm),
ObjectValue(attribute_name='quant_casas', action=FIELD_ACTION_SUM, left=label_left[1] * cm, ), ObjectValue(attribute_name='quant_casas', action=FIELD_ACTION_SUM, left=label_left[1] * cm, ),
ObjectValue(attribute_name='quant_casas_aderidas', action=FIELD_ACTION_SUM, left=label_left[2] * cm), ObjectValue(attribute_name='quant_casas_aderidas', action=FIELD_ACTION_SUM, left=label_left[2] * cm),
# ObjectValue(attribute_name='porc_casas_aderidas', action=FIELD_ACTION_AVG, left=label_left[3]*cm, # ObjectValue(attribute_name='porc_casas_aderidas', action=FIELD_ACTION_AVG, left=label_left[3]*cm,
@ -270,16 +270,16 @@ class ConvenioReportRegiao(ReportDefault):
class ConvenioPorCMReport(ConvenioReport): class ConvenioPorCMReport(ConvenioReport):
title = _(u'Relatório de Parcerias por Câmara Municipal') title = _('Relatório de Parcerias por Câmara Municipal')
class ConvenioPorALReport(ConvenioReport): class ConvenioPorALReport(ConvenioReport):
title = _(u'Relatório de Parcerias por Assembléia Legislativa') title = _('Relatório de Parcerias por Assembléia Legislativa')
class ConvenioReportSemAceiteCM(ConvenioReportSemAceite): class ConvenioReportSemAceiteCM(ConvenioReportSemAceite):
title = _(u'Relatório de Parcerias por Câmara Municipal') title = _('Relatório de Parcerias por Câmara Municipal')
class ConvenioReportSemAceiteAL(ConvenioReportSemAceite): class ConvenioReportSemAceiteAL(ConvenioReportSemAceite):
title = _(u'Relatório de Parcerias por Assembléia Legislativa') title = _('Relatório de Parcerias por Assembléia Legislativa')

42
sigi/apps/convenios/views.py

@ -115,7 +115,7 @@ def adicionar_convenios_carrinho(request, queryset=None, id=None):
def excluir_carrinho(request): def excluir_carrinho(request):
if 'carrinho_convenios' in request.session: if 'carrinho_convenios' in request.session:
del request.session['carrinho_convenios'] del request.session['carrinho_convenios']
messages.info(request, u'O carrinho foi esvaziado') messages.info(request, 'O carrinho foi esvaziado')
return HttpResponseRedirect('../../') return HttpResponseRedirect('../../')
@login_required @login_required
@ -260,12 +260,12 @@ def casas_estado_to_tabela(casas, convenios, regiao):
) )
cabecalho_topo = ( cabecalho_topo = (
_(u'UF'), _('UF'),
_(u'Câmaras municipais'), _('Câmaras municipais'),
_(u'Não Aderidas'), _('Não Aderidas'),
_(u'Aderidas'), _('Aderidas'),
_(u'Conveniadas'), _('Conveniadas'),
_(u'Equipadas') _('Equipadas')
) )
return { return {
@ -291,7 +291,7 @@ def report_regiao(request, regiao='NE'):
# Geral # Geral
convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM') convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM')
tabela = casas_estado_to_tabela(camaras, convenios, regiao) tabela = casas_estado_to_tabela(camaras, convenios, regiao)
tabela["projeto"] = _(u"Geral") tabela["projeto"] = _("Geral")
tabelas.append(tabela) tabelas.append(tabela)
@ -325,47 +325,47 @@ def export_csv(request):
if not convenios: if not convenios:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
atributos = [_(u"No. Processo"), _(u"No. Convênio"), _(u"Projeto"), _(u"Casa Legislativa"), _(u"Data de Adesão"), _(u"Data de Convênio"), atributos = [_("No. Processo"), _("No. Convênio"), _("Projeto"), _("Casa Legislativa"), _("Data de Adesão"), _("Data de Convênio"),
_(u"Data da Publicacao no D.O."), _(u"Data Equipada"), ] _("Data da Publicacao no D.O."), _("Data Equipada"), ]
if request.POST: if request.POST:
atributos = request.POST.getlist("itens_csv_selected") atributos = request.POST.getlist("itens_csv_selected")
col_titles = atributos col_titles = atributos
if _(u"Casa Legislativa") in col_titles: if _("Casa Legislativa") in col_titles:
pos = col_titles.index(_(u"Casa Legislativa")) + 1 pos = col_titles.index(_("Casa Legislativa")) + 1
col_titles.insert(pos, _(u"uf")) col_titles.insert(pos, _("uf"))
csv_writer.writerow([s.encode("utf-8") for s in col_titles]) csv_writer.writerow([s.encode("utf-8") for s in col_titles])
for convenio in convenios: for convenio in convenios:
lista = [] lista = []
for atributo in atributos: for atributo in atributos:
if _(u"No. Processo") == atributo: if _("No. Processo") == atributo:
lista.append(convenio.num_processo_sf.encode("utf-8")) lista.append(convenio.num_processo_sf.encode("utf-8"))
elif _(u"No. Convênio") == atributo: elif _("No. Convênio") == atributo:
lista.append(convenio.num_convenio.encode("utf-8")) lista.append(convenio.num_convenio.encode("utf-8"))
elif _(u"Projeto") == atributo: elif _("Projeto") == atributo:
lista.append(convenio.projeto.nome.encode("utf-8")) lista.append(convenio.projeto.nome.encode("utf-8"))
elif _(u"Casa Legislativa") == atributo: elif _("Casa Legislativa") == atributo:
lista.append(convenio.casa_legislativa.nome.encode("utf-8")) lista.append(convenio.casa_legislativa.nome.encode("utf-8"))
lista.append(convenio.casa_legislativa.municipio.uf.sigla.encode("utf-8")) lista.append(convenio.casa_legislativa.municipio.uf.sigla.encode("utf-8"))
elif _(u"Data de Adesão") == atributo: elif _("Data de Adesão") == atributo:
data = '' data = ''
if convenio.data_adesao: if convenio.data_adesao:
data = convenio.data_adesao.strftime("%d/%m/%Y") data = convenio.data_adesao.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8")) lista.append(data.encode("utf-8"))
elif _(u"Data de Convênio") == atributo: elif _("Data de Convênio") == atributo:
data = '' data = ''
if convenio.data_retorno_assinatura: if convenio.data_retorno_assinatura:
data = convenio.data_retorno_assinatura.strftime("%d/%m/%Y") data = convenio.data_retorno_assinatura.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8")) lista.append(data.encode("utf-8"))
elif _(u"Data da Publicacao no D.O.") == atributo: elif _("Data da Publicacao no D.O.") == atributo:
data = '' data = ''
if convenio.data_pub_diario: if convenio.data_pub_diario:
data = convenio.data_pub_diario.strftime("%d/%m/%Y") data = convenio.data_pub_diario.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8")) lista.append(data.encode("utf-8"))
data = '' data = ''
elif _(u"Data Equipada") == atributo: elif _("Data Equipada") == atributo:
if convenio.data_termo_aceite: if convenio.data_termo_aceite:
data = convenio.data_termo_aceite.strftime("%d/%m/%Y") data = convenio.data_termo_aceite.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8")) lista.append(data.encode("utf-8"))

16
sigi/apps/diagnosticos/admin.py

@ -21,14 +21,14 @@ def publicar_diagnostico(self, request, queryset):
email = diagnostico.responsavel.user.email email = diagnostico.responsavel.user.email
if email: if email:
diagnostico.email_diagnostico_publicado(email, request.get_host()) diagnostico.email_diagnostico_publicado(email, request.get_host())
self.message_user(request, _(u"Diagnóstico(s) publicado(s) com sucesso!")) self.message_user(request, _("Diagnóstico(s) publicado(s) com sucesso!"))
publicar_diagnostico.short_description = _(u""" publicar_diagnostico.short_description = _("""
Definir diagnósticos como publicado""") Definir diagnósticos como publicado""")
def despublicar_diagnostico(self, request, queryset): def despublicar_diagnostico(self, request, queryset):
queryset.update(publicado=False) queryset.update(publicado=False)
despublicar_diagnostico.short_description = _(u""" despublicar_diagnostico.short_description = _("""
Definir diagnósticos como não publicado""") Definir diagnósticos como não publicado""")
@ -62,9 +62,9 @@ class DiagnosticoAdmin(BaseEntityAdmin):
ordering = ('casa_legislativa',) ordering = ('casa_legislativa',)
eav_fieldsets = ( eav_fieldsets = (
(u'00. Identificação do Diagnóstico', {'fields': ('responsavel', 'data_visita_inicio', 'data_visita_fim',)}), ('00. Identificação do Diagnóstico', {'fields': ('responsavel', 'data_visita_inicio', 'data_visita_fim',)}),
(u'01. Identificação da Casa Legislativa', {'fields': ('casa_legislativa',)}), ('01. Identificação da Casa Legislativa', {'fields': ('casa_legislativa',)}),
(u'02. Identificação de Competências da Casa Legislativa', {'fields': ()}) ('02. Identificação de Competências da Casa Legislativa', {'fields': ()})
) )
# popula o eav fieldsets ordenando as categorias e as perguntas # popula o eav fieldsets ordenando as categorias e as perguntas
@ -86,7 +86,7 @@ class DiagnosticoAdmin(BaseEntityAdmin):
def get_uf(self, obj): def get_uf(self, obj):
return '%s' % (obj.casa_legislativa.municipio.uf) return '%s' % (obj.casa_legislativa.municipio.uf)
get_uf.short_description = _(u'UF') get_uf.short_description = _('UF')
get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome' get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome'
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
@ -128,7 +128,7 @@ class EscolhaInline(admin.TabularInline):
model = Escolha model = Escolha
fk_name = 'schema' fk_name = 'schema'
raw_id_fields = ('schema_to_open',) raw_id_fields = ('schema_to_open',)
verbose_name = _(u'Escolhas (apenas para choices ou multiple choices)') verbose_name = _('Escolhas (apenas para choices ou multiple choices)')
extra = 0 extra = 0

6
sigi/apps/diagnosticos/forms.py

@ -115,7 +115,7 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm):
defaults.update({'queryset': schema.get_choices(), defaults.update({'queryset': schema.get_choices(),
'initial': choice.pk if choice else None, 'initial': choice.pk if choice else None,
# if schema is required remove --------- from ui # if schema is required remove --------- from ui
'empty_label': None if schema.required else u"---------"}) 'empty_label': None if schema.required else "---------"})
extra = self.FIELD_EXTRA.get(datatype, {}) extra = self.FIELD_EXTRA.get(datatype, {})
extra.update(self.FIELD_WIDGET.get(schema.name, {})) extra.update(self.FIELD_WIDGET.get(schema.name, {}))
@ -133,7 +133,7 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm):
class OrgaoMobileForm(forms.ModelForm): class OrgaoMobileForm(forms.ModelForm):
data_instalacao = forms.DateField(label=_(u'Data de instalação da Casa Legislativa'), required=False) data_instalacao = forms.DateField(label=_('Data de instalação da Casa Legislativa'), required=False)
data_criacao = forms.DateField() data_criacao = forms.DateField()
class Meta: class Meta:
@ -143,7 +143,7 @@ class OrgaoMobileForm(forms.ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(OrgaoMobileForm, self).__init__(*args, **kwargs) super(OrgaoMobileForm, self).__init__(*args, **kwargs)
self.fields['data_criacao'] = forms.DateField( self.fields['data_criacao'] = forms.DateField(
label=_(u'Data de criação do Município'), label=_('Data de criação do Município'),
initial=self.instance.municipio.data_criacao, initial=self.instance.municipio.data_criacao,
required=False) required=False)

74
sigi/apps/diagnosticos/management/commands/ls_export.py

@ -16,7 +16,7 @@ DATATYPES = {
} }
class Command(BaseCommand): class Command(BaseCommand):
help = u"""Exporta dados do diagnóstico para o formato Tab-Separated-Values help = """Exporta dados do diagnóstico para o formato Tab-Separated-Values
do LimeSurvey, conforme documentado em do LimeSurvey, conforme documentado em
https://manual.limesurvey.org/Tab_Separated_Value_survey_structure""" https://manual.limesurvey.org/Tab_Separated_Value_survey_structure"""
@ -25,14 +25,14 @@ class Command(BaseCommand):
return [s.encode('utf-8') for s in l] return [s.encode('utf-8') for s in l]
nonum = lambda s: s[s.index(' ')+1:] nonum = lambda s: s[s.index(' ')+1:]
avalue = lambda e: ('Y' if e.title == u'Sim' else 'N' avalue = lambda e: ('Y' if e.title == 'Sim' else 'N'
if e.title == u'Não' else e.id) if e.title == 'Não' else e.id)
setores = [(i+1, s[0], s[1]) for i, s in enumerate( setores = [(i+1, s[0], s[1]) for i, s in enumerate(
Funcionario.SETOR_CHOICES)] Funcionario.SETOR_CHOICES)]
if len(args) < 2: if len(args) < 2:
raise CommandError(u"Use: ls_export survey_id struct.txt data.csv") raise CommandError("Use: ls_export survey_id struct.txt data.csv")
survey_id = args[0] survey_id = args[0]
@ -56,55 +56,55 @@ class Command(BaseCommand):
'pt-BR'], 'pt-BR'],
['', '', 'SL', '', 'surveyls_language', '', 'pt-BR', '', 'pt-BR'], ['', '', 'SL', '', 'surveyls_language', '', 'pt-BR', '', 'pt-BR'],
['', '', 'SL', '', 'surveyls_title', '', ['', '', 'SL', '', 'surveyls_title', '',
u'Diagnóstico PML'.encode('utf-8'), '', 'pt-BR']]) 'Diagnóstico PML'.encode('utf-8'), '', 'pt-BR']])
self.stdout.write("Done!") self.stdout.write("Done!")
# Identificação da Casa Legislativa e sua equipe # # Identificação da Casa Legislativa e sua equipe #
self.stdout.write("\tIdentificação da Casa...", ending=" ") self.stdout.write("\tIdentificação da Casa...", ending=" ")
lsf.writerow(normalize(['1000', '', 'G', '', u'Identificação da Casa', lsf.writerow(normalize(['1000', '', 'G', '', 'Identificação da Casa',
'', '', '', 'pt-BR'])) '', '', '', 'pt-BR']))
lsf.writerow(normalize(['1001', '', 'Q', 'L', 'c001q001', '1', lsf.writerow(normalize(['1001', '', 'Q', 'L', 'c001q001', '1',
u'Região', '', 'pt-BR', '', 'Y', 'N', '', '0'])) 'Região', '', 'pt-BR', '', 'Y', 'N', '', '0']))
struct.append('c001q001') struct.append('c001q001')
lsf.writerows([normalize(['1001', '', 'A', '0', sigla, '', nome, '', lsf.writerows([normalize(['1001', '', 'A', '0', sigla, '', nome, '',
'pt-BR']) for sigla, nome in UnidadeFederativa.REGIAO_CHOICES]) 'pt-BR']) for sigla, nome in UnidadeFederativa.REGIAO_CHOICES])
lsf.writerow(normalize(['1002', '', 'Q', '!', 'c001q002', '1', lsf.writerow(normalize(['1002', '', 'Q', '!', 'c001q002', '1',
u'Estado (UF)', '', 'pt-BR', '', 'Y', 'N', '', '0'])) 'Estado (UF)', '', 'pt-BR', '', 'Y', 'N', '', '0']))
struct.append('c001q002') struct.append('c001q002')
lsf.writerows([normalize(['1002', '', 'A', '0', u.sigla, '', u.nome, '', lsf.writerows([normalize(['1002', '', 'A', '0', u.sigla, '', u.nome, '',
'pt-BR']) for u in UnidadeFederativa.objects.all()]) 'pt-BR']) for u in UnidadeFederativa.objects.all()])
lsf.writerow(normalize(['1003', '', 'Q', 'S', 'c001q003', '1', lsf.writerow(normalize(['1003', '', 'Q', 'S', 'c001q003', '1',
u'Município', '', 'pt-BR', '', 'Y', 'N', '', '0'])) 'Município', '', 'pt-BR', '', 'Y', 'N', '', '0']))
struct.append('c001q003') struct.append('c001q003')
lsf.writerow(normalize(['1004', '', 'Q', 'D', 'c001q004', '1', lsf.writerow(normalize(['1004', '', 'Q', 'D', 'c001q004', '1',
u'Data de criação do município', '', 'pt-BR', '', 'Y', 'N', '', 'Data de criação do município', '', 'pt-BR', '', 'Y', 'N', '',
'0'])) '0']))
struct.append('c001q004') struct.append('c001q004')
lsf.writerow(normalize(['1005', '', 'Q', 'S', 'c001q005', '1', lsf.writerow(normalize(['1005', '', 'Q', 'S', 'c001q005', '1',
u'Nome da Casa', '', 'pt-BR', '', 'Y', 'N', '', '0'])) 'Nome da Casa', '', 'pt-BR', '', 'Y', 'N', '', '0']))
struct.append('c001q005') struct.append('c001q005')
lsf.writerow(normalize(['1006', '', 'Q', 'D', 'c001q006', '1', lsf.writerow(normalize(['1006', '', 'Q', 'D', 'c001q006', '1',
u'Data de instalação do legislativo', '', 'pt-BR', '', 'Y', 'N', '', 'Data de instalação do legislativo', '', 'pt-BR', '', 'Y', 'N', '',
'0'])) '0']))
struct.append('c001q006') struct.append('c001q006')
lsf.writerow(normalize(['1007', '', 'Q', 'T', 'c001q007', '1', lsf.writerow(normalize(['1007', '', 'Q', 'T', 'c001q007', '1',
u'Endereço', '', 'pt-BR', '', 'N', 'N', '', '0'])) 'Endereço', '', 'pt-BR', '', 'N', 'N', '', '0']))
struct.append('c001q007') struct.append('c001q007')
lsf.writerow(normalize(['1008', '', 'Q', 'S', 'c001q008', '1', lsf.writerow(normalize(['1008', '', 'Q', 'S', 'c001q008', '1',
u'CNPJ', '', 'pt-BR', '', 'N', 'N', '', '0'])) 'CNPJ', '', 'pt-BR', '', 'N', 'N', '', '0']))
struct.append('c001q008') struct.append('c001q008')
lsf.writerow(normalize(['1009', '', 'Q', 'S', 'c001q009', '1', lsf.writerow(normalize(['1009', '', 'Q', 'S', 'c001q009', '1',
u'E-mail principal', '', 'pt-BR', '', 'N', 'N', '', '0'])) 'E-mail principal', '', 'pt-BR', '', 'N', 'N', '', '0']))
struct.append('c001q009') struct.append('c001q009')
lsf.writerow(normalize(['1010', '', 'Q', 'S', 'c001q010', '1', lsf.writerow(normalize(['1010', '', 'Q', 'S', 'c001q010', '1',
u'Endereço Web', '', 'pt-BR', '', 'N', 'N', '', '0'])) 'Endereço Web', '', 'pt-BR', '', 'N', 'N', '', '0']))
struct.append('c001q010') struct.append('c001q010')
lsf.writerow(normalize(['1011', '', 'Q', ';', 'c001q011', '1', lsf.writerow(normalize(['1011', '', 'Q', ';', 'c001q011', '1',
u'Pessoas de contato', '', 'pt-BR', '', 'N', 'N', '', '0'])) 'Pessoas de contato', '', 'pt-BR', '', 'N', 'N', '', '0']))
lsf.writerow(normalize(['101198', '', 'SQ', '1', 'SQ00101', '', u'Nome', lsf.writerow(normalize(['101198', '', 'SQ', '1', 'SQ00101', '', 'Nome',
'', 'pt-BR', '', '', 'N', '', '0'])) '', 'pt-BR', '', '', 'N', '', '0']))
lsf.writerow(normalize(['101199', '', 'SQ', '1', 'SQ00102', '', lsf.writerow(normalize(['101199', '', 'SQ', '1', 'SQ00102', '',
u'E-mail', '', 'pt-BR', '', '', 'N', '', '0'])) 'E-mail', '', 'pt-BR', '', '', 'N', '', '0']))
for i, k, v in setores: for i, k, v in setores:
lsf.writerow(normalize(['10110{0}'.format(i), '', 'SQ', '', lsf.writerow(normalize(['10110{0}'.format(i), '', 'SQ', '',
'SQ1010{0}'.format(i), '1', v, '', 'pt-BR', '', '', 'N', 'SQ1010{0}'.format(i), '1', v, '', 'pt-BR', '', '', 'N',
@ -117,19 +117,19 @@ class Command(BaseCommand):
self.stdout.write("Done!") self.stdout.write("Done!")
# Equipe de diagnóstico # # Equipe de diagnóstico #
self.stdout.write("\tEquipe de diagnóstico...", ending=" ") self.stdout.write("\tEquipe de diagnóstico...", ending=" ")
lsf.writerow(normalize(['2000', '', 'G', '', u'Equipe de diagnóstico', lsf.writerow(normalize(['2000', '', 'G', '', 'Equipe de diagnóstico',
'', '', '', 'pt-BR'])) '', '', '', 'pt-BR']))
lsf.writerow(normalize(['2001', '', 'Q', 'D', 'c002q001', '1', lsf.writerow(normalize(['2001', '', 'Q', 'D', 'c002q001', '1',
u'Data de início da visita', '', 'pt-BR', '', 'Y', 'N', '', '0'])) 'Data de início da visita', '', 'pt-BR', '', 'Y', 'N', '', '0']))
struct.append('c002q001') struct.append('c002q001')
lsf.writerow(normalize(['2002', '', 'Q', 'D', 'c002q002', '1', lsf.writerow(normalize(['2002', '', 'Q', 'D', 'c002q002', '1',
u'Data de término da visita', '', 'pt-BR', '', 'Y', 'N', '', '0'])) 'Data de término da visita', '', 'pt-BR', '', 'Y', 'N', '', '0']))
struct.append('c002q002') struct.append('c002q002')
lsf.writerow(normalize(['2003', '', 'Q', 'S', 'c002q003', '1', lsf.writerow(normalize(['2003', '', 'Q', 'S', 'c002q003', '1',
u'Líder da equipe', '', 'pt-BR', '', 'Y', 'N', '', '0'])) 'Líder da equipe', '', 'pt-BR', '', 'Y', 'N', '', '0']))
struct.append('c002q003') struct.append('c002q003')
lsf.writerow(normalize(['2004', '', 'Q', 'T', 'c002q004', '1', lsf.writerow(normalize(['2004', '', 'Q', 'T', 'c002q004', '1',
u'Membros da equipe', '', 'pt-BR', '', 'Y', 'N', '', '0'])) 'Membros da equipe', '', 'pt-BR', '', 'Y', 'N', '', '0']))
struct.append('c002q004') struct.append('c002q004')
self.stdout.write("Done!") self.stdout.write("Done!")
@ -144,13 +144,13 @@ class Command(BaseCommand):
# Hack para perguntas SIM/NÃO que foram cadastradas como Choice # Hack para perguntas SIM/NÃO que foram cadastradas como Choice
if lstype == 'L': if lstype == 'L':
if ("".join([e.title for e in p.choices.all()]) in if ("".join([e.title for e in p.choices.all()]) in
[u"SimNão", u"NãoSim"]): ["SimNão", "NãoSim"]):
lstype = 'Y' lstype = 'Y'
######## ########
relevance = "1" relevance = "1"
if p.abre_por.exists(): if p.abre_por.exists():
relevance = "(" + " or ".join( relevance = "(" + " or ".join(
[u'({sid}X{gid}X{qid}.NAOK == "{value}")'.format( ['({sid}X{gid}X{qid}.NAOK == "{value}")'.format(
sid=survey_id, gid=e.schema.categoria.id, sid=survey_id, gid=e.schema.categoria.id,
qid=e.schema.id, value=avalue(e)) for e in qid=e.schema.id, value=avalue(e)) for e in
p.abre_por.all()]) + ")" p.abre_por.all()]) + ")"
@ -160,12 +160,12 @@ class Command(BaseCommand):
nonum(p.title), p.help_text, 'pt-BR', '', 'NY'[p.required], nonum(p.title), p.help_text, 'pt-BR', '', 'NY'[p.required],
'N', '', '0'])) 'N', '', '0']))
if lstype == 'L': if lstype == 'L':
lsf.writerows([normalize([str(p.id), u'', u'A', u'0', lsf.writerows([normalize([str(p.id), '', 'A', '0',
str(e.id), u'', e.title, u'', u'pt-BR']) str(e.id), '', e.title, '', 'pt-BR'])
for e in p.choices.all()]) for e in p.choices.all()])
if lstype == 'M': if lstype == 'M':
lsf.writerows([normalize([str(p.id*1000+e.id), u'', u'SQ', lsf.writerows([normalize([str(p.id*1000+e.id), '', 'SQ',
u'', str(e.id), u'1', e.title, u'', u'pt-BR']) '', str(e.id), '1', e.title, '', 'pt-BR'])
for e in p.choices.all()]) for e in p.choices.all()])
struct.extend(['c{0:03}q{1:03}_{2}'.format(c.id, p.id, struct.extend(['c{0:03}q{1:03}_{2}'.format(c.id, p.id,
e.id) for e in p.choices.all()]) e.id) for e in p.choices.all()])
@ -184,7 +184,7 @@ class Command(BaseCommand):
dtf.writerow(struct) dtf.writerow(struct)
for d in Diagnostico.objects.all(): for d in Diagnostico.objects.all():
self.stdout.write(u"\t{0}".format(d.casa_legislativa.nome)) self.stdout.write("\t{0}".format(d.casa_legislativa.nome))
form = OrderedDict.fromkeys(struct, '{question_not_shown}') form = OrderedDict.fromkeys(struct, '{question_not_shown}')
@ -207,9 +207,9 @@ class Command(BaseCommand):
form['c001q006'] = \ form['c001q006'] = \
d.casa_legislativa.data_instalacao.isoformat() d.casa_legislativa.data_instalacao.isoformat()
form['c001q007'] = ( form['c001q007'] = (
u"{logradouro}{{cr}}{{newline}}" "{logradouro}{{cr}}{{newline}}"
u"{bairro}{{cr}}{{newline}}" "{bairro}{{cr}}{{newline}}"
u"{cep} - {municipio} - {uf}".format( "{cep} - {municipio} - {uf}".format(
logradouro=d.casa_legislativa.logradouro, logradouro=d.casa_legislativa.logradouro,
bairro=d.casa_legislativa.bairro, bairro=d.casa_legislativa.bairro,
cep=d.casa_legislativa.cep, cep=d.casa_legislativa.cep,
@ -252,9 +252,9 @@ class Command(BaseCommand):
if r.schema.datatype == 'one': if r.schema.datatype == 'one':
if value is None: if value is None:
value = '{question_not_shown}' value = '{question_not_shown}'
elif value.title == u'Sim': elif value.title == 'Sim':
value = 'Y' value = 'Y'
elif value.title == u'Não': elif value.title == 'Não':
value = 'N' value = 'N'
else: else:
value = r.value.id value = r.value.id
@ -267,7 +267,7 @@ class Command(BaseCommand):
if value is None: if value is None:
value = '{question_not_shown}' value = '{question_not_shown}'
form[key] = u'{0}'.format(value) form[key] = '{0}'.format(value)
dtf.writerow(normalize(form.values())) dtf.writerow(normalize(form.values()))
self.stdout.write('Done!') self.stdout.write('Done!')

42
sigi/apps/diagnosticos/models.py

@ -16,7 +16,7 @@ class Diagnostico(BaseEntity):
casa_legislativa = models.ForeignKey( casa_legislativa = models.ForeignKey(
'casas.Orgao', 'casas.Orgao',
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Casa Legislativa') verbose_name=_('Casa Legislativa')
) )
# campo de busca em caixa baixa e sem acento # campo de busca em caixa baixa e sem acento
@ -24,18 +24,18 @@ class Diagnostico(BaseEntity):
# casa_legislativa.casa_uf_filter = True # casa_legislativa.casa_uf_filter = True
# casa_legislativa.casa_tipo_filter = True # casa_legislativa.casa_tipo_filter = True
data_visita_inicio = models.DateField( data_visita_inicio = models.DateField(
u'data inicial da visita', 'data inicial da visita',
null=True, null=True,
blank=True, blank=True,
) )
data_visita_fim = models.DateField( data_visita_fim = models.DateField(
u'data final da visita', 'data final da visita',
null=True, null=True,
blank=True, blank=True,
) )
publicado = models.BooleanField(default=False) publicado = models.BooleanField(default=False)
data_publicacao = models.DateField( data_publicacao = models.DateField(
u'data de publicação do diagnóstico', 'data de publicação do diagnóstico',
null=True, null=True,
blank=True, blank=True,
) )
@ -43,11 +43,11 @@ class Diagnostico(BaseEntity):
responsavel = models.ForeignKey( responsavel = models.ForeignKey(
'servidores.Servidor', 'servidores.Servidor',
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'responsável') verbose_name=_('responsável')
) )
class Meta: class Meta:
verbose_name, verbose_name_plural = _(u'diagnóstico'), _(u'diagnósticos') verbose_name, verbose_name_plural = _('diagnóstico'), _('diagnósticos')
@property @property
def membros(self): def membros(self):
@ -90,7 +90,7 @@ class Diagnostico(BaseEntity):
* host - O Host do sistema, para ser usado na * host - O Host do sistema, para ser usado na
construção do endereço do diagnóstico construção do endereço do diagnóstico
""" """
enviar_email(from_email, _(u"Diagnóstico publicado"), enviar_email(from_email, _("Diagnóstico publicado"),
'diagnosticos/email_diagnostico_publicado.txt', 'diagnosticos/email_diagnostico_publicado.txt',
{ {
'responsavel': self.responsavel.nome_completo, 'responsavel': self.responsavel.nome_completo,
@ -98,7 +98,7 @@ class Diagnostico(BaseEntity):
'data_diagnostico': self.data_visita_inicio, 'data_diagnostico': self.data_visita_inicio,
'host': host, 'host': host,
'url_diagnostico': self.get_absolute_url(), 'url_diagnostico': self.get_absolute_url(),
'status': _(u"Publicado"), 'status': _("Publicado"),
}) })
def email_diagnostico_alterado(self, from_email, host): def email_diagnostico_alterado(self, from_email, host):
@ -108,7 +108,7 @@ class Diagnostico(BaseEntity):
* host - O Host do sistema, para ser usado na * host - O Host do sistema, para ser usado na
construção do endereço do diagnóstico construção do endereço do diagnóstico
""" """
enviar_email(from_email, _(u"Diagnóstico alterado"), enviar_email(from_email, _("Diagnóstico alterado"),
'diagnosticos/email_diagnostico_alterado.txt', 'diagnosticos/email_diagnostico_alterado.txt',
{ {
'servidor': self.responsavel.nome_completo, 'servidor': self.responsavel.nome_completo,
@ -116,7 +116,7 @@ class Diagnostico(BaseEntity):
'data_diagnostico': self.data_visita_inicio, 'data_diagnostico': self.data_visita_inicio,
'host': host, 'host': host,
'url_diagnostico': self.get_absolute_url(), 'url_diagnostico': self.get_absolute_url(),
'status': _(u"Alterado"), 'status': _("Alterado"),
}) })
def get_schemata(self, category=None, *args, **kwargs): def get_schemata(self, category=None, *args, **kwargs):
@ -197,7 +197,7 @@ class Pergunta(BaseSchema):
class Meta: class Meta:
ordering = ('title',) ordering = ('title',)
verbose_name, verbose_name_plural = _(u'pergunta'), _(u'perguntas') verbose_name, verbose_name_plural = _('pergunta'), _('perguntas')
class Escolha(BaseChoice): class Escolha(BaseChoice):
@ -209,13 +209,13 @@ class Escolha(BaseChoice):
Pergunta, Pergunta,
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='choices', related_name='choices',
verbose_name=_(u'pergunta') verbose_name=_('pergunta')
) )
schema_to_open = models.ForeignKey( schema_to_open = models.ForeignKey(
Pergunta, Pergunta,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
related_name='abre_por', related_name='abre_por',
verbose_name=_(u'pergunta para abrir'), verbose_name=_('pergunta para abrir'),
blank=True, blank=True,
null=True null=True
) )
@ -223,7 +223,7 @@ class Escolha(BaseChoice):
class Meta: class Meta:
ordering = ('schema', 'ordem') ordering = ('schema', 'ordem')
verbose_name, verbose_name_plural = _(u'escolha'), _(u'escolhas') verbose_name, verbose_name_plural = _('escolha'), _('escolhas')
class Resposta(BaseAttribute): class Resposta(BaseAttribute):
@ -235,18 +235,18 @@ class Resposta(BaseAttribute):
Pergunta, Pergunta,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='attrs', related_name='attrs',
verbose_name=_(u'pergunta') verbose_name=_('pergunta')
) )
choice = models.ForeignKey( choice = models.ForeignKey(
Escolha, Escolha,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'escolha'), verbose_name=_('escolha'),
blank=True, blank=True,
null=True null=True
) )
class Meta: class Meta:
verbose_name, verbose_name_plural = _(u'resposta'), _(u'respostas') verbose_name, verbose_name_plural = _('resposta'), _('respostas')
class Equipe(models.Model): class Equipe(models.Model):
@ -260,7 +260,7 @@ class Equipe(models.Model):
) )
class Meta: class Meta:
verbose_name, verbose_name_plural = _(u'equipe'), _(u'equipe') verbose_name, verbose_name_plural = _('equipe'), _('equipe')
def __unicode__(self): def __unicode__(self):
return self.membro.__unicode__() return self.membro.__unicode__()
@ -274,11 +274,11 @@ class Anexo(models.Model):
diagnostico = models.ForeignKey( diagnostico = models.ForeignKey(
Diagnostico, Diagnostico,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=u'diagnóstico' verbose_name='diagnóstico'
) )
arquivo = models.FileField(upload_to='apps/diagnostico/anexo/arquivo', max_length=500) arquivo = models.FileField(upload_to='apps/diagnostico/anexo/arquivo', max_length=500)
descricao = models.CharField(_(u'descrição'), max_length='70') descricao = models.CharField(_('descrição'), max_length='70')
data_pub = models.DateTimeField(_(u'data da publicação do anexo'), data_pub = models.DateTimeField(_('data da publicação do anexo'),
default=datetime.now) default=datetime.now)
class Meta: class Meta:

4
sigi/apps/diagnosticos/views.py

@ -186,7 +186,7 @@ def categoria_contatos(request, id_diagnostico):
for form_telefones in form.telefones.forms: for form_telefones in form.telefones.forms:
tel = form_telefones.instance tel = form_telefones.instance
if tel._state.adding and tel.numero != '': if tel._state.adding and tel.numero != '':
s += _(u'<p>Novo telefone %(type)s: %(number)s</p>') % dict( s += _('<p>Novo telefone %(type)s: %(number)s</p>') % dict(
type=form_telefones.instance.get_tipo_display(), type=form_telefones.instance.get_tipo_display(),
number=form_telefones.instance.numero) number=form_telefones.instance.numero)
resposta['clean'] += ('id_' + form_telefones.prefix + '-numero',) resposta['clean'] += ('id_' + form_telefones.prefix + '-numero',)
@ -207,7 +207,7 @@ def categoria_contatos(request, id_diagnostico):
Telefone.objects.get(pk=form_telefones.fields['id'].initial).delete() Telefone.objects.get(pk=form_telefones.fields['id'].initial).delete()
if form.prefix not in resposta['fones']: if form.prefix not in resposta['fones']:
resposta['fones'][form.prefix] = '' resposta['fones'][form.prefix] = ''
resposta['fones'][form.prefix] += _(u'<p>O telefone %(type)s %(number)s foi excluído da base de dados</p>') % dict( resposta['fones'][form.prefix] += _('<p>O telefone %(type)s %(number)s foi excluído da base de dados</p>') % dict(
type=form_telefones.instance.get_tipo_display(), type=form_telefones.instance.get_tipo_display(),
number=form_telefones.instance.numero) number=form_telefones.instance.numero)
else: else:

10
sigi/apps/diagnosticos/widgets.py

@ -12,11 +12,11 @@ class EavCheckboxSelectMultiple(CheckboxSelectMultiple):
if value is None: if value is None:
value = [] value = []
final_attrs = self.build_attrs(attrs, name=name) final_attrs = self.build_attrs(attrs, name=name)
output = [u'<ul>'] output = ['<ul>']
str_values = set([force_unicode(v) for v in value]) str_values = set([force_unicode(v) for v in value])
for i, (option_value, option_label) in enumerate(chain(self.choices, choices)): for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i)) final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
label_for = u' for="%s"' % final_attrs['id'] label_for = ' for="%s"' % final_attrs['id']
# Caso exista uma pergunta para abrir # Caso exista uma pergunta para abrir
# adiciona um atripbuto no checkbox # adiciona um atripbuto no checkbox
@ -28,9 +28,9 @@ class EavCheckboxSelectMultiple(CheckboxSelectMultiple):
option_value = force_unicode(option_value) option_value = force_unicode(option_value)
rendered_cb = cb.render(name, option_value) rendered_cb = cb.render(name, option_value)
option_label = conditional_escape(force_unicode(option_label)) option_label = conditional_escape(force_unicode(option_label))
output.append(u'<li><label%s>%s %s</label></li>' % (label_for, rendered_cb, option_label)) output.append('<li><label%s>%s %s</label></li>' % (label_for, rendered_cb, option_label))
output.append(u'</ul>') output.append('</ul>')
return mark_safe(u'\n'.join(output)) return mark_safe('\n'.join(output))
class EavRadioFieldRenderer(RadioFieldRenderer): class EavRadioFieldRenderer(RadioFieldRenderer):

10
sigi/apps/eventos/admin.py

@ -80,13 +80,13 @@ class EventoAdmin(admin.ModelAdmin):
quant = q2 - q1 quant = q2 - q1
if quant: if quant:
self.message_user(request, str(q2 - q1) + " " + self.message_user(request, str(q2 - q1) + " " +
_(u"Eventos adicionados no carrinho")) _("Eventos adicionados no carrinho"))
else: else:
self.message_user(request, _(u"Os Eventos selecionados " self.message_user(request, _("Os Eventos selecionados "
u"já foram adicionados anteriormente")) "já foram adicionados anteriormente"))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
adicionar_eventos.short_description = _(u"Armazenar eventos no carrinho " adicionar_eventos.short_description = _("Armazenar eventos no carrinho "
u"para exportar") "para exportar")
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
return (super(EventoAdmin, self).lookup_allowed(lookup, value) or return (super(EventoAdmin, self).lookup_allowed(lookup, value) or

4
sigi/apps/eventos/forms.py

@ -20,7 +20,7 @@ class EventoAdminForm(forms.ModelForm):
if data_inicio > data_termino: if data_inicio > data_termino:
raise forms.ValidationError( raise forms.ValidationError(
_(u"Data término deve ser posterior à data inicio"), _("Data término deve ser posterior à data inicio"),
code="invalid_period" code="invalid_period"
) )
@ -28,5 +28,5 @@ class SelecionaModeloForm(forms.Form):
modelo = forms.ModelChoiceField( modelo = forms.ModelChoiceField(
queryset=ModeloDeclaracao.objects.all(), queryset=ModeloDeclaracao.objects.all(),
required=True, required=True,
label=_(u"Modelo de declaração"), label=_("Modelo de declaração"),
) )

4
sigi/apps/eventos/migrations/0001_initial.py

@ -19,7 +19,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('data_convite', models.DateField(verbose_name='Data do convite')), ('data_convite', models.DateField(verbose_name='Data do convite')),
('aceite', models.BooleanField(default=False, verbose_name='Aceitou o convite')), ('aceite', models.BooleanField(default=False, verbose_name='Aceitou o convite')),
('participou', models.BooleanField(default=False, verbose_name='Participou do evento')), ('participo', models.BooleanField(default=False, verbose_name='Participou do evento')),
('casa', models.ForeignKey(verbose_name='Casa convidada', to='casas.CasaLegislativa')), ('casa', models.ForeignKey(verbose_name='Casa convidada', to='casas.CasaLegislativa')),
], ],
options={ options={
@ -127,7 +127,7 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='convite', model_name='convite',
name='servidor', name='servidor',
field=models.ForeignKey(verbose_name='Servidor que convidou', to='servidores.Servidor'), field=models.ForeignKey(verbose_name='Servidor que convido', to='servidores.Servidor'),
preserve_default=True, preserve_default=True,
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(

2
sigi/apps/eventos/migrations/0006_auto_20210416_0841.py

@ -21,7 +21,7 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='convite', model_name='convite',
name='servidor', name='servidor',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, verbose_name='Servidor que convidou', to='servidores.Servidor'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, verbose_name='Servidor que convido', to='servidores.Servidor'),
preserve_default=True, preserve_default=True,
), ),
migrations.AlterField( migrations.AlterField(

186
sigi/apps/eventos/models.py

@ -14,61 +14,61 @@ from tinymce.models import HTMLField
class TipoEvento(models.Model): class TipoEvento(models.Model):
CATEGORIA_CHOICES = ( CATEGORIA_CHOICES = (
('C', _(u'Curso')), ('C', _('Curso')),
('E', _(u'Encontro')), ('E', _('Encontro')),
('O', _(u'Oficina')), ('O', _('Oficina')),
('S', _(u'Seminário')), ('S', _('Seminário')),
('V', _(u'Visita')), ('V', _('Visita')),
) )
nome = models.CharField(_(u"Nome"), max_length=100) nome = models.CharField(_("Nome"), max_length=100)
categoria = models.CharField( categoria = models.CharField(
_(u'Categoaria'), _('Categoaria'),
max_length=1, max_length=1,
choices=CATEGORIA_CHOICES choices=CATEGORIA_CHOICES
) )
class Meta: class Meta:
ordering = ("nome",) ordering = ("nome",)
verbose_name, verbose_name_plural = _(u"Tipo de evento"), _(u"Tipos de evento") verbose_name, verbose_name_plural = _("Tipo de evento"), _("Tipos de evento")
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
class Evento(models.Model): class Evento(models.Model):
STATUS_CHOICES = ( STATUS_CHOICES = (
('P', _(u"Previsão")), ('P', _("Previsão")),
('A', _(u"A confirmar")), ('A', _("A confirmar")),
('O', _(u"Confirmado")), ('O', _("Confirmado")),
('R', _(u"Realizado")), ('R', _("Realizado")),
('C', _(u"Cancelado")) ('C', _("Cancelado"))
) )
tipo_evento = models.ForeignKey( tipo_evento = models.ForeignKey(
TipoEvento, TipoEvento,
on_delete=models.PROTECT, on_delete=models.PROTECT,
) )
nome = models.CharField(_(u"Nome do evento"), max_length=100) nome = models.CharField(_("Nome do evento"), max_length=100)
descricao = models.TextField(_(u"Descrição do evento")) descricao = models.TextField(_("Descrição do evento"))
virtual = models.BooleanField(_("Virtual"), default=False) virtual = models.BooleanField(_("Virtual"), default=False)
solicitante = models.CharField(_(u"Solicitante"), max_length=100) solicitante = models.CharField(_("Solicitante"), max_length=100)
data_inicio = models.DateTimeField( data_inicio = models.DateTimeField(
_(u"Data/hora do Início"), _("Data/hora do Início"),
null=True, null=True,
blank=True blank=True
) )
data_termino = models.DateTimeField( data_termino = models.DateTimeField(
_(u"Data/hora do Termino"), _("Data/hora do Termino"),
null=True, null=True,
blank=True blank=True
) )
carga_horaria = models.PositiveIntegerField( carga_horaria = models.PositiveIntegerField(
_(u"carga horária"), _("carga horária"),
default=0 default=0
) )
casa_anfitria = models.ForeignKey( casa_anfitria = models.ForeignKey(
Orgao, Orgao,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u"Casa anfitriã"), verbose_name=_("Casa anfitriã"),
blank=True, blank=True,
null=True null=True
) )
@ -76,22 +76,22 @@ class Evento(models.Model):
Municipio, Municipio,
on_delete=models.PROTECT on_delete=models.PROTECT
) )
local = models.TextField(_(u"Local do evento"), blank=True) local = models.TextField(_("Local do evento"), blank=True)
publico_alvo = models.TextField(_(u"Público alvo"), blank=True) publico_alvo = models.TextField(_("Público alvo"), blank=True)
total_participantes = models.PositiveIntegerField( total_participantes = models.PositiveIntegerField(
_(u"Total de participantes"), _("Total de participantes"),
default=0, default=0,
help_text=_(u"Se informar quantidade de participantes na aba de " help_text=_("Se informar quantidade de participantes na aba de "
u"convites, este campo será ajustado com a somatória " "convites, este campo será ajustado com a somatória "
u"dos participantes naquela aba.") "dos participantes naquela aba.")
) )
status = models.CharField(_(u"Status"), max_length=1, choices=STATUS_CHOICES) status = models.CharField(_("Status"), max_length=1, choices=STATUS_CHOICES)
data_cancelamento = models.DateField(_(u"Data de cancelamento"), blank=True, null=True) data_cancelamento = models.DateField(_("Data de cancelamento"), blank=True, null=True)
motivo_cancelamento = models.TextField(_(u"Motivo do cancelamento"), blank=True) motivo_cancelamento = models.TextField(_("Motivo do cancelamento"), blank=True)
class Meta: class Meta:
ordering = ("-data_inicio",) ordering = ("-data_inicio",)
verbose_name, verbose_name_plural = _(u"Evento"), _(u"Eventos") verbose_name, verbose_name_plural = _("Evento"), _("Eventos")
def __unicode__(self): def __unicode__(self):
return _("%(nome)s (%(tipo_evento)s): de %(data_inicio)s a %(data_termino)s") % dict( return _("%(nome)s (%(tipo_evento)s): de %(data_inicio)s a %(data_termino)s") % dict(
@ -105,8 +105,8 @@ class Evento(models.Model):
self.data_cancelamento = None self.data_cancelamento = None
self.motivo_cancelamento = "" self.motivo_cancelamento = ""
if self.data_inicio > self.data_termino: if self.data_inicio > self.data_termino:
raise ValidationError(_(u"Data de término deve ser posterior à " raise ValidationError(_("Data de término deve ser posterior à "
u"data de início")) "data de início"))
total = self.convite_set.aggregate(total=Sum('qtde_participantes')) total = self.convite_set.aggregate(total=Sum('qtde_participantes'))
total = total['total'] total = total['total']
if (total is not None) or (total > 0): if (total is not None) or (total > 0):
@ -114,12 +114,12 @@ class Evento(models.Model):
return super(Evento, self).save(*args, **kwargs) return super(Evento, self).save(*args, **kwargs)
class Funcao(models.Model): class Funcao(models.Model):
nome = models.CharField(_(u"Função na equipe de evento"), max_length=100) nome = models.CharField(_("Função na equipe de evento"), max_length=100)
descricao = models.TextField(_(u"Descrição da função")) descricao = models.TextField(_("Descrição da função"))
class Meta: class Meta:
ordering = ("nome",) ordering = ("nome",)
verbose_name, verbose_name_plural = _(u"Função"), _(u"Funções") verbose_name, verbose_name_plural = _("Função"), _("Funções")
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
@ -137,16 +137,16 @@ class Equipe(models.Model):
funcao = models.ForeignKey( funcao = models.ForeignKey(
Funcao, Funcao,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u"Função na equipe") verbose_name=_("Função na equipe")
) )
observacoes = models.TextField(_(u"Observações"), blank=True) observacoes = models.TextField(_("Observações"), blank=True)
class Meta: class Meta:
ordering = ('evento', 'funcao', 'membro',) ordering = ('evento', 'funcao', 'membro',)
verbose_name, verbose_name_plural = _(u"Membro da equipe"), _(u"Membros da equipe") verbose_name, verbose_name_plural = _("Membro da equipe"), _("Membros da equipe")
def __unicode__(self): def __unicode__(self):
return u"%s (%s)" % (unicode(self.membro), unicode(self.funcao),) return "%s (%s)" % (unicode(self.membro), unicode(self.funcao),)
class Convite(models.Model): class Convite(models.Model):
evento = models.ForeignKey( evento = models.ForeignKey(
@ -156,54 +156,54 @@ class Convite(models.Model):
casa = models.ForeignKey( casa = models.ForeignKey(
Orgao, Orgao,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u"Casa convidada") verbose_name=_("Casa convidada")
) )
servidor = models.ForeignKey( servidor = models.ForeignKey(
Servidor, Servidor,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u"Servidor que convidou") verbose_name=_("Servidor que convidou")
) )
data_convite = models.DateField(_(u"Data do convite")) data_convite = models.DateField(_("Data do convite"))
aceite = models.BooleanField(_("Aceitou o convite"), default=False) aceite = models.BooleanField(_("Aceitou o convite"), default=False)
participou = models.BooleanField(_(u"Participou do evento"), default=False) participou = models.BooleanField(_("Participou do evento"), default=False)
qtde_participantes = models.PositiveIntegerField( qtde_participantes = models.PositiveIntegerField(
_(u"número de participantes"), _("número de participantes"),
default=0 default=0
) )
nomes_participantes = models.TextField( nomes_participantes = models.TextField(
_(u"nome dos participantes"), _("nome dos participantes"),
blank=True, blank=True,
help_text=_(u"Favor colocar um participante por linha") help_text=_("Favor colocar um participante por linha")
) )
class Meta: class Meta:
ordering = ('evento', 'casa', '-data_convite') ordering = ('evento', 'casa', '-data_convite')
unique_together = ('evento', 'casa') unique_together = ('evento', 'casa')
verbose_name = _(u"Casa convidada") verbose_name = _("Casa convidada")
verbose_name_plural = _(u"Casas convidadas") verbose_name_plural = _("Casas convidadas")
class Modulo(models.Model): class Modulo(models.Model):
TIPO_CHOICES = ( TIPO_CHOICES = (
('A', _(u'Aula')), ('A', _('Aula')),
('P', _(u'Palestra')), ('P', _('Palestra')),
('R', _(u'Apresentação')), ('R', _('Apresentação')),
) )
evento = models.ForeignKey(Evento, verbose_name=_(u"Evento")) evento = models.ForeignKey(Evento, verbose_name=_("Evento"))
nome = models.CharField(_(u"Nome"), max_length=100) nome = models.CharField(_("Nome"), max_length=100)
descricao = models.TextField(_(u"Descrição do módulo")) descricao = models.TextField(_("Descrição do módulo"))
tipo = models.CharField(_(u'Tipo'), max_length=1, choices=TIPO_CHOICES) tipo = models.CharField(_('Tipo'), max_length=1, choices=TIPO_CHOICES)
inicio = models.DateTimeField( inicio = models.DateTimeField(
_(u"Data/hora de início"), _("Data/hora de início"),
null=True, null=True,
blank=True blank=True
) )
termino = models.DateTimeField( termino = models.DateTimeField(
_(u"Data/hora de término"), _("Data/hora de término"),
null=True, null=True,
blank=True blank=True
) )
carga_horaria = models.PositiveIntegerField( carga_horaria = models.PositiveIntegerField(
_(u"carga horária"), _("carga horária"),
default=0 default=0
) )
apresentador = models.ForeignKey( apresentador = models.ForeignKey(
@ -212,7 +212,7 @@ class Modulo(models.Model):
related_name="modulo_apresentador", related_name="modulo_apresentador",
null=True, null=True,
blank=True, blank=True,
verbose_name=_(u"Apresentador"), verbose_name=_("Apresentador"),
) )
monitor = models.ForeignKey( monitor = models.ForeignKey(
Servidor, Servidor,
@ -220,67 +220,67 @@ class Modulo(models.Model):
related_name="modulo_monitor", related_name="modulo_monitor",
null=True, null=True,
blank=True, blank=True,
verbose_name=_(u"Monitor"), verbose_name=_("Monitor"),
help_text=_(u"Monitor, mediador, auxiliar, etc.") help_text=_("Monitor, mediador, auxiliar, etc.")
) )
qtde_participantes = models.PositiveIntegerField( qtde_participantes = models.PositiveIntegerField(
_(u"número de participantes"), _("número de participantes"),
default=0, default=0,
help_text=_(u"Deixar Zero significa que todos os participantes " help_text=_("Deixar Zero significa que todos os participantes "
u"do evento participaram do módulo"), "do evento participaram do módulo"),
) )
class Meta: class Meta:
ordering = ('inicio',) ordering = ('inicio',)
verbose_name = _(u"Módulo do evento") verbose_name = _("Módulo do evento")
verbose_name_plural = _(u"Módulos do evento") verbose_name_plural = _("Módulos do evento")
def __unicode__(self): def __unicode__(self):
return _(u"{nome} ({tipo})").format( return _("{nome} ({tipo})").format(
nome=self.nome, nome=self.nome,
tipo=self.get_tipo_display() tipo=self.get_tipo_display()
) )
class ModeloDeclaracao(models.Model): class ModeloDeclaracao(models.Model):
FORMATO_CHOICES = ( FORMATO_CHOICES = (
('A4 portrait', _(u"A4 retrato")), ('A4 portrait', _("A4 retrato")),
('A4 landscape', _(u"A4 paisagem")), ('A4 landscape', _("A4 paisagem")),
('letter portrait', _(u"Carta retrato")), ('letter portrait', _("Carta retrato")),
('letter landscape', _(u"Carta paisagem")) ('letter landscape', _("Carta paisagem"))
) )
nome = models.CharField(_(u"Nome do modelo"), max_length=100) nome = models.CharField(_("Nome do modelo"), max_length=100)
formato = models.CharField( formato = models.CharField(
_(u"Formato da página"), _("Formato da página"),
max_length=30, max_length=30,
choices=FORMATO_CHOICES, choices=FORMATO_CHOICES,
default=FORMATO_CHOICES[0][0] default=FORMATO_CHOICES[0][0]
) )
margem = models.PositiveIntegerField( margem = models.PositiveIntegerField(
_(u"Margem"), _("Margem"),
help_text=_(u"Margem da página em centímetros"), help_text=_("Margem da página em centímetros"),
default=4 default=4
) )
texto = HTMLField( texto = HTMLField(
_(u"Texto da declaração"), _("Texto da declaração"),
help_text=_(u"Use as seguintes marcações:<ul><li>{{ casa.nome }} para o" help_text=_("Use as seguintes marcações:<ul><li>{{ casa.nome }} para o"
u" nome da Casa Legislativa / órgão</li>" " nome da Casa Legislativa / órgão</li>"
u"<li>{{ casa.municipio.uf.sigla }} para a sigla da UF da " "<li>{{ casa.municipio.uf.sigla }} para a sigla da UF da "
u"Casa legislativa</li><li>{{ nome }} " "Casa legislativa</li><li>{{ nome }} "
u"para o nome do visitante</li><li>{{ data }} para a data " "para o nome do visitante</li><li>{{ data }} para a data "
u"de emissão da declaração</li><li>{{ evento.data_inicio }}" "de emissão da declaração</li><li>{{ evento.data_inicio }}"
u" para a data/hora do início da visita</li>" " para a data/hora do início da visita</li>"
u"<li>{{ evento.data_termino }} para a data/hora do " "<li>{{ evento.data_termino }} para a data/hora do "
u"término da visita</li><li>{{ evento.nome }} para o nome " "término da visita</li><li>{{ evento.nome }} para o nome "
u"do evento</li><li>{{ evento.descricao }} para a descrição" "do evento</li><li>{{ evento.descricao }} para a descrição"
u" do evento</li></ul>") " do evento</li></ul>")
) )
class Meta: class Meta:
verbose_name = _(u"modelo de declaração") verbose_name = _("modelo de declaração")
verbose_name_plural = _(u"modelos de declaração") verbose_name_plural = _("modelos de declaração")
def __unicode__(self): def __unicode__(self):
return _(u"{nome} ({formato})").format( return _("{nome} ({formato})").format(
nome=self.nome, nome=self.nome,
formato=self.get_formato_display() formato=self.get_formato_display()
) )
@ -289,13 +289,13 @@ class Anexo(models.Model):
evento = models.ForeignKey( evento = models.ForeignKey(
Evento, Evento,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'evento') verbose_name=_('evento')
) )
# caminho no sistema para o documento anexo # caminho no sistema para o documento anexo
arquivo = models.FileField(upload_to='apps/eventos/anexo/arquivo', max_length=500) arquivo = models.FileField(upload_to='apps/eventos/anexo/arquivo', max_length=500)
descricao = models.CharField(_(u'descrição'), max_length='70') descricao = models.CharField(_('descrição'), max_length='70')
data_pub = models.DateTimeField( data_pub = models.DateTimeField(
_(u'data da publicação do anexo'), _('data da publicação do anexo'),
default=datetime.now default=datetime.now
) )

20
sigi/apps/eventos/views.py

@ -157,14 +157,14 @@ def alocacao_equipe(request):
locale.setlocale(locale.LC_ALL, lang) locale.setlocale(locale.LC_ALL, lang)
meses = [calendar.month_name[m] for m in range(1,13)] meses = [calendar.month_name[m] for m in range(1,13)]
linhas = [[_(u"Servidor")] + meses + ['total']] linhas = [[_("Servidor")] + meses + ['total']]
for r in dados: for r in dados:
r[2].append(reduce(lambda x,y:{'dias': x['dias'] + y['dias'], r[2].append(reduce(lambda x,y:{'dias': x['dias'] + y['dias'],
'eventos': x['eventos'] + y['eventos']}, r[2])) 'eventos': x['eventos'] + y['eventos']}, r[2]))
linhas.append([r[1]] + linhas.append([r[1]] +
[_(ungettext(u"%(dias)s dia", u"%(dias)s dias", d['dias']) + " em " + [_(ungettext("%(dias)s dia", "%(dias)s dias", d['dias']) + " em " +
ungettext(u"%(eventos)s evento", u"%(eventos)s eventos", d['eventos']) ungettext("%(eventos)s evento", "%(eventos)s eventos", d['eventos'])
) % d if d['dias'] > 0 or d['eventos'] > 0 else '' for d in r[2]]) ) % d if d['dias'] > 0 or d['eventos'] > 0 else '' for d in r[2]])
# for registro in Servidor.objects.filter(equipe_evento__evento__data_inicio__year=ano_pesquisa).exclude(equipe_evento__evento__status='C').distinct(): # for registro in Servidor.objects.filter(equipe_evento__evento__data_inicio__year=ano_pesquisa).exclude(equipe_evento__evento__status='C').distinct():
@ -173,7 +173,7 @@ def alocacao_equipe(request):
# dados[part.evento.data_inicio.month-1]['dias'] += (part.evento.data_termino - # dados[part.evento.data_inicio.month-1]['dias'] += (part.evento.data_termino -
# part.evento.data_inicio).days + 1 # part.evento.data_inicio).days + 1
# dados[part.evento.data_inicio.month-1]['eventos'] += 1 # dados[part.evento.data_inicio.month-1]['eventos'] += 1
# dados.append([registro.nome_completo] + [_(ungettext(u"%(dias)s dia", u"%(dias)s dias", d['dias']) + " em " + ungettext(u"%(eventos)s evento", u"%(eventos)s eventos", d['eventos'])) % d if d['dias'] > 0 or d['eventos'] > 0 else '' for d in dados]) # dados.append([registro.nome_completo] + [_(ungettext("%(dias)s dia", "%(dias)s dias", d['dias']) + " em " + ungettext("%(eventos)s evento", "%(eventos)s eventos", d['eventos'])) % d if d['dias'] > 0 or d['eventos'] > 0 else '' for d in dados])
data['linhas'] = linhas data['linhas'] = linhas
@ -277,7 +277,7 @@ def visualizar_carrinho(request):
def excluir_carrinho(request): def excluir_carrinho(request):
if 'carrinho_eventos' in request.session: if 'carrinho_eventos' in request.session:
del request.session['carrinho_eventos'] del request.session['carrinho_eventos']
messages.info(request, u'O carrinho foi esvaziado') messages.info(request, 'O carrinho foi esvaziado')
return HttpResponseRedirect('../../') return HttpResponseRedirect('../../')
@login_required @login_required
@ -295,7 +295,7 @@ def deleta_itens_carrinho(request):
else: else:
del lista del lista
del request.session['carrinho_eventos'] del request.session['carrinho_eventos']
messages.info(request, u"{0} itens removidos do carrinho".format(removed)) messages.info(request, "{0} itens removidos do carrinho".format(removed))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
@login_required @login_required
@ -320,14 +320,14 @@ def export_csv(request):
eventos.select_related('equipe', 'convite') eventos.select_related('equipe', 'convite')
if not eventos: if not eventos:
messages.info(request, _(u"Nenhum evento a exportar")) messages.info(request, _("Nenhum evento a exportar"))
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
max_equipe = max([e.equipe_set.count() for e in eventos]) max_equipe = max([e.equipe_set.count() for e in eventos])
mun_casa = u'Município da Casa Anfitriã'.encode('utf8') mun_casa = 'Município da Casa Anfitriã'.encode('utf8')
uf_casa = u'UF da Casa Anfitriã'.encode('utf8') uf_casa = 'UF da Casa Anfitriã'.encode('utf8')
reg_casa = u'Região da Casa Anfitriã'.encode('utf8') reg_casa = 'Região da Casa Anfitriã'.encode('utf8')
head = [f.verbose_name.encode('utf8') for f in Evento._meta.fields] head = [f.verbose_name.encode('utf8') for f in Evento._meta.fields]
head.extend([mun_casa, uf_casa, reg_casa]) head.extend([mun_casa, uf_casa, reg_casa])

16
sigi/apps/financeiro/models.py

@ -9,16 +9,16 @@ class Desembolso(models.Model):
projeto = models.ForeignKey( projeto = models.ForeignKey(
Projeto, Projeto,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'Projeto') verbose_name=_('Projeto')
) )
descricao = models.CharField(_(u'Descrição da despesa'), max_length=100) descricao = models.CharField(_('Descrição da despesa'), max_length=100)
data = models.DateField(_(u'Data do desembolso')) data = models.DateField(_('Data do desembolso'))
valor_reais = models.DecimalField(_(u'Valor em R$'), max_digits=18, decimal_places=2) valor_reais = models.DecimalField(_('Valor em R$'), max_digits=18, decimal_places=2)
valor_dolar = models.DecimalField(_(u'Valor em US$'), max_digits=18, decimal_places=2) valor_dolar = models.DecimalField(_('Valor em US$'), max_digits=18, decimal_places=2)
class Meta: class Meta:
verbose_name = _(u'Desembolso') verbose_name = _('Desembolso')
verbose_name_plural = _(u'Desembolsos') verbose_name_plural = _('Desembolsos')
def __unicode__(self): def __unicode__(self):
return u"%s (US$ %s)" % (self.descricao, self.valor_dolar) return "%s (US$ %s)" % (self.descricao, self.valor_dolar)

44
sigi/apps/home/views.py

@ -153,10 +153,10 @@ def chart_performance(request):
'type': 'pie', 'type': 'pie',
'options': {'responsive': True}, 'options': {'responsive': True},
'data': [ 'data': [
{'label': _(u"Utilizam serviços"), {'label': _("Utilizam serviços"),
'value': casas.exclude(servico=None).count(), 'value': casas.exclude(servico=None).count(),
'color': '#91e8e1'}, 'color': '#91e8e1'},
{'label': _(u"Não utilizam serviços"), {'label': _("Não utilizam serviços"),
'value': casas.filter(servico=None).count(), 'value': casas.filter(servico=None).count(),
'color': '#f7a35c'}, 'color': '#f7a35c'},
] ]
@ -174,31 +174,31 @@ def report_sem_convenio(request):
if modo == 'H': if modo == 'H':
casas = sc['hospedagem'] casas = sc['hospedagem']
titulo = _(u"Casas sem convenio que utilizam algum serviço de " titulo = _("Casas sem convenio que utilizam algum serviço de "
u"hospedagem") "hospedagem")
elif modo == 'R': elif modo == 'R':
casas = sc['registro'] casas = sc['registro']
titulo = _(u"Casas sem convenio que utilizam somente serviço de " titulo = _("Casas sem convenio que utilizam somente serviço de "
u"registro") "registro")
else: else:
casas = sc['total'] casas = sc['total']
titulo = _(u"Casas sem convenio que utilizam algum serviço de registro " titulo = _("Casas sem convenio que utilizam algum serviço de registro "
u"e/ou hospedagem") "e/ou hospedagem")
if fmt == 'csv': if fmt == 'csv':
response = HttpResponse(content_type='text/csv') response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename=casas.csv' response['Content-Disposition'] = 'attachment; filename=casas.csv'
writer = csv.writer(response) writer = csv.writer(response)
writer.writerow([titulo.encode('utf8')]) writer.writerow([titulo.encode('utf8')])
writer.writerow([u'']) writer.writerow([''])
writer.writerow([u'casa', u'uf', u'gerentes', writer.writerow(['casa', 'uf', 'gerentes',
u'serviços'.encode('utf8')]) 'serviços'.encode('utf8')])
for casa in casas: for casa in casas:
writer.writerow([ writer.writerow([
casa.nome.encode('utf8'), casa.nome.encode('utf8'),
casa.municipio.uf.sigla.encode('utf8'), casa.municipio.uf.sigla.encode('utf8'),
casa.lista_gerentes(fmt='lista').encode('utf8'), casa.lista_gerentes(fmt='lista').encode('utf8'),
(u', '.join(casa.servico_set.filter( (', '.join(casa.servico_set.filter(
data_desativacao__isnull=True).values_list( data_desativacao__isnull=True).values_list(
'tipo_servico__nome', flat=True))).encode('utf8'), 'tipo_servico__nome', flat=True))).encode('utf8'),
]) ])
@ -273,14 +273,14 @@ def busca_informacoes_camara():
# Cabecalho da esquerda na tabela # Cabecalho da esquerda na tabela
cabecalho_esquerda = ( cabecalho_esquerda = (
_(u'Câmaras municipais'), _('Câmaras municipais'),
_(u'Câmaras municipais não aderidas'), _('Câmaras municipais não aderidas'),
_(u'Câmaras municipais aderidas'), _('Câmaras municipais aderidas'),
_(u'Câmaras municipais com convênios assinados'), _('Câmaras municipais com convênios assinados'),
_(u'Câmaras municipais convênios em andamento'), _('Câmaras municipais convênios em andamento'),
_(u'Câmaras municipais equipadas'), _('Câmaras municipais equipadas'),
_(u'Diagnósticos digitados'), _('Diagnósticos digitados'),
_(u'Diagnósticos publicados') _('Diagnósticos publicados')
) )
linhas = ( linhas = (
@ -383,8 +383,8 @@ def busca_informacoes_seit(mes_atual=None):
def busca_informacoes_diagnostico(): def busca_informacoes_diagnostico():
return [ return [
{'title': _(u'Diagnósticos digitados'), 'count': Diagnostico.objects.count()}, {'title': _('Diagnósticos digitados'), 'count': Diagnostico.objects.count()},
{'title': _(u'Diagnósticos publicados'), 'count': Diagnostico.objects.filter(publicado=True).count()}, {'title': _('Diagnósticos publicados'), 'count': Diagnostico.objects.filter(publicado=True).count()},
] ]

26
sigi/apps/inventario/models.py

@ -7,14 +7,14 @@ from django.utils.translation import gettext as _
class Fornecedor(models.Model): class Fornecedor(models.Model):
nome = models.CharField(max_length=40) nome = models.CharField(max_length=40)
nome.alphabetic_filter = True nome.alphabetic_filter = True
email = models.EmailField(_(u'e-mail'), blank=True) email = models.EmailField(_('e-mail'), blank=True)
pagina_web = models.URLField(_(u'página web'), blank=True) pagina_web = models.URLField(_('página web'), blank=True)
telefones = GenericRelation('contatos.Telefone') telefones = GenericRelation('contatos.Telefone')
contatos = GenericRelation('contatos.Contato') contatos = GenericRelation('contatos.Contato')
class Meta: class Meta:
ordering = ('nome',) ordering = ('nome',)
verbose_name_plural = _(u'fornecedores') verbose_name_plural = _('fornecedores')
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
@ -36,8 +36,8 @@ class TipoEquipamento(models.Model):
class Meta: class Meta:
ordering = ('tipo',) ordering = ('tipo',)
verbose_name = _(u'tipo de equipamento') verbose_name = _('tipo de equipamento')
verbose_name_plural = _(u'tipos de equipamentos') verbose_name_plural = _('tipos de equipamentos')
def __unicode__(self): def __unicode__(self):
return self.tipo return self.tipo
@ -47,14 +47,14 @@ class ModeloEquipamento(models.Model):
tipo = models.ForeignKey( tipo = models.ForeignKey(
TipoEquipamento, TipoEquipamento,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'tipo de equipamento') verbose_name=_('tipo de equipamento')
) )
modelo = models.CharField(max_length=30) modelo = models.CharField(max_length=30)
class Meta: class Meta:
ordering = ('modelo',) ordering = ('modelo',)
verbose_name = _(u'modelo de equipamento') verbose_name = _('modelo de equipamento')
verbose_name_plural = _(u'modelos de equipamentos') verbose_name_plural = _('modelos de equipamentos')
def __unicode__(self): def __unicode__(self):
return self.modelo return self.modelo
@ -86,20 +86,20 @@ class Bem(models.Model):
equipamento = models.ForeignKey(Equipamento, on_delete=models.CASCADE) equipamento = models.ForeignKey(Equipamento, on_delete=models.CASCADE)
fornecedor = models.ForeignKey(Fornecedor, on_delete=models.PROTECT) fornecedor = models.ForeignKey(Fornecedor, on_delete=models.PROTECT)
num_serie = models.CharField( num_serie = models.CharField(
_(u'número de série'), _('número de série'),
max_length=64, max_length=64,
help_text=_(u'Número fornecido pelo fabricante.'), help_text=_('Número fornecido pelo fabricante.'),
unique=True unique=True
) )
recebido_por = models.CharField( recebido_por = models.CharField(
max_length=64, max_length=64,
blank=True, blank=True,
help_text=_(u'Nome de quem recebeu o equipamento.') help_text=_('Nome de quem recebeu o equipamento.')
) )
observacoes = models.TextField(_(u'observações'), blank=True) observacoes = models.TextField(_('observações'), blank=True)
class Meta: class Meta:
verbose_name_plural = _(u'bens') verbose_name_plural = _('bens')
def __unicode__(self): def __unicode__(self):
return unicode('%s (%s)') % (self.equipamento, self.casa_legislativa) return unicode('%s (%s)') % (self.equipamento, self.casa_legislativa)

2
sigi/apps/metas/admin.py

@ -20,7 +20,7 @@ class PlanoDiretorAdmin(BaseModelAdmin):
def get_uf(self, obj): def get_uf(self, obj):
return obj.casa_legislativa.municipio.uf.nome return obj.casa_legislativa.municipio.uf.nome
get_uf.short_description = _(u"UF") get_uf.short_description = _("UF")
get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome' get_uf.admin_order_field = 'casa_legislativa__municipio__uf__nome'
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):

50
sigi/apps/metas/models.py

@ -11,29 +11,29 @@ from sigi.apps.financeiro.models import Desembolso
class Meta(models.Model): class Meta(models.Model):
ALGORITMO_CHOICES = ( ALGORITMO_CHOICES = (
('SUM_GASTOS', _(u'Soma dos desembolsos')), ('SUM_GASTOS', _('Soma dos desembolsos')),
('COUNT_EQUI', _(u'Quantidade de casas equipadas')), ('COUNT_EQUI', _('Quantidade de casas equipadas')),
('COUNT_ADER', _(u'Quantidade de casas aderidas')), ('COUNT_ADER', _('Quantidade de casas aderidas')),
('COUNT_DIAG', _(u'Quantidade de casas diagnosticadas')), ('COUNT_DIAG', _('Quantidade de casas diagnosticadas')),
('COUNT_PDIR', _(u'Quantidade de planos diretores')), ('COUNT_PDIR', _('Quantidade de planos diretores')),
('COUNT_CONV', _(u'Quantidade de casas conveniadas')), ('COUNT_CONV', _('Quantidade de casas conveniadas')),
) )
projeto = models.ForeignKey( projeto = models.ForeignKey(
Projeto, Projeto,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'Projeto'), verbose_name=_('Projeto'),
help_text=_(u'Projeto ao qual a meta se refere') help_text=_('Projeto ao qual a meta se refere')
) )
titulo = models.CharField(_(u'Título'), max_length=40, help_text=_(u'Título da meta que aparecerá no dashboard')) titulo = models.CharField(_('Título'), max_length=40, help_text=_('Título da meta que aparecerá no dashboard'))
descricao = models.TextField(_(u'Descrição')) descricao = models.TextField(_('Descrição'))
data_inicio = models.DateField(_(u'Data inicial'), help_text=_(u'Início do período de cômputo da meta')) data_inicio = models.DateField(_('Data inicial'), help_text=_('Início do período de cômputo da meta'))
data_fim = models.DateField(_(u'Data final'), help_text=_(u'Prazo final para cumprimento da meta')) data_fim = models.DateField(_('Data final'), help_text=_('Prazo final para cumprimento da meta'))
algoritmo = models.CharField(_(u'Algoritmo de cálculo'), max_length=10, choices=ALGORITMO_CHOICES) algoritmo = models.CharField(_('Algoritmo de cálculo'), max_length=10, choices=ALGORITMO_CHOICES)
valor_meta = models.FloatField(_(u'Valor da meta'), help_text=_(u'Valor que deve ser atingido até o prazo final da meta')) valor_meta = models.FloatField(_('Valor da meta'), help_text=_('Valor que deve ser atingido até o prazo final da meta'))
class Meta: class Meta:
verbose_name = _(u'Meta BID') verbose_name = _('Meta BID')
verbose_name_plural = _(u'Metas BID') verbose_name_plural = _('Metas BID')
def __unicode__(self): def __unicode__(self):
return self.titulo return self.titulo
@ -116,27 +116,27 @@ class Meta(models.Model):
class PlanoDiretor(models.Model): class PlanoDiretor(models.Model):
STATUS_CHOICE = ( STATUS_CHOICE = (
('E', _(u'Entregue')), ('E', _('Entregue')),
('I', _(u'Implantado')), ('I', _('Implantado')),
) )
projeto = models.ForeignKey( projeto = models.ForeignKey(
Projeto, Projeto,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'Projeto') verbose_name=_('Projeto')
) )
casa_legislativa = models.ForeignKey( casa_legislativa = models.ForeignKey(
Orgao, Orgao,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'Casa Legislativa') verbose_name=_('Casa Legislativa')
) )
casa_legislativa.casa_uf_filter = True casa_legislativa.casa_uf_filter = True
status = models.CharField(_(u'Status'), max_length=1, choices=STATUS_CHOICE, default='E') status = models.CharField(_('Status'), max_length=1, choices=STATUS_CHOICE, default='E')
data_entrega = models.DateField(_(u'Data de entrega'), blank=True, null=True) data_entrega = models.DateField(_('Data de entrega'), blank=True, null=True)
data_implantacao = models.DateField(_(u'Data de implantação'), blank=True, null=True) data_implantacao = models.DateField(_('Data de implantação'), blank=True, null=True)
class Meta: class Meta:
verbose_name = _(u'Plano Diretor') verbose_name = _('Plano Diretor')
verbose_name_plural = _(u'Planos Diretores') verbose_name_plural = _('Planos Diretores')
def __unicode__(self): def __unicode__(self):
return self.casa_legislativa.nome return self.casa_legislativa.nome

10
sigi/apps/metas/views.py

@ -122,18 +122,18 @@ def openmap(request):
'ult_alt_endereco': (casa.ult_alt_endereco.strftime( 'ult_alt_endereco': (casa.ult_alt_endereco.strftime(
"%d/%m/%Y").encode('utf8') "%d/%m/%Y").encode('utf8')
if casa.ult_alt_endereco else ""), if casa.ult_alt_endereco else ""),
'telefones': u", ".join(casa.telefones.values_list('numero', 'telefones': ", ".join(casa.telefones.values_list('numero',
flat=True) flat=True)
).encode('utf8'), ).encode('utf8'),
'emails': u", ".join([casa.email] + list( 'emails': ", ".join([casa.email] + list(
casa.funcionario_set.values_list('email',flat=True)) casa.funcionario_set.values_list('email',flat=True))
).encode('utf8'), ).encode('utf8'),
'contatos': u", ".join(casa.funcionario_set.values_list( 'contatos': ", ".join(casa.funcionario_set.values_list(
'nome', flat=True)).encode('utf8'), 'nome', flat=True)).encode('utf8'),
'convenios': u", ".join([c.__unicode__() for c in 'convenios': ", ".join([c.__unicode__() for c in
casa.convenio_set.all()] casa.convenio_set.all()]
).encode('utf8'), ).encode('utf8'),
'servicos': u", ".join([u"{tipo} ({url})".format( 'servicos': ", ".join(["{tipo} ({url})".format(
tipo=s.tipo_servico.nome, url=s.url) tipo=s.tipo_servico.nome, url=s.url)
for s in casa.servico_set.all()] for s in casa.servico_set.all()]
).encode('utf8') ).encode('utf8')

8
sigi/apps/ocorrencias/admin.py

@ -14,7 +14,7 @@ class ComentarioViewInline(admin.TabularInline):
extra = 0 extra = 0
max_num = 0 max_num = 0
can_delete = False can_delete = False
verbose_name, verbose_name_plural = _(u"Comentário anterior"), _(u"Comentários anteriores") verbose_name, verbose_name_plural = _("Comentário anterior"), _("Comentários anteriores")
fields = ('usuario', 'data_criacao', 'novo_status', 'encaminhar_setor', 'descricao', ) fields = ('usuario', 'data_criacao', 'novo_status', 'encaminhar_setor', 'descricao', )
readonly_fields = ('novo_status', 'encaminhar_setor', 'descricao', 'data_criacao', 'usuario',) readonly_fields = ('novo_status', 'encaminhar_setor', 'descricao', 'data_criacao', 'usuario',)
@ -22,7 +22,7 @@ class ComentarioViewInline(admin.TabularInline):
class ComentarioInline(admin.StackedInline): class ComentarioInline(admin.StackedInline):
model = Comentario model = Comentario
extra = 1 extra = 1
verbose_name, verbose_name_plural = _(u"Comentário novo"), _(u"Comentários novos") verbose_name, verbose_name_plural = _("Comentário novo"), _("Comentários novos")
fieldsets = ((None, {'fields': (('novo_status', 'encaminhar_setor',), 'descricao', )}),) fieldsets = ((None, {'fields': (('novo_status', 'encaminhar_setor',), 'descricao', )}),)
def get_queryset(self, queryset): def get_queryset(self, queryset):
@ -119,12 +119,12 @@ class OcorrenciaAdmin(BaseModelAdmin):
def get_uf(self, obj): def get_uf(self, obj):
return obj.casa_legislativa.municipio.uf return obj.casa_legislativa.municipio.uf
get_uf.short_description = _(u'UF') get_uf.short_description = _('UF')
get_uf.admin_order_field = 'casa_legislativa__municipio__uf' get_uf.admin_order_field = 'casa_legislativa__municipio__uf'
def get_municipio(self, obj): def get_municipio(self, obj):
return obj.casa_legislativa.municipio.nome return obj.casa_legislativa.municipio.nome
get_municipio.short_description = _(u'Município') get_municipio.short_description = _('Município')
get_municipio.admin_order_field = 'casa_legislativa__municipio__nome' get_municipio.admin_order_field = 'casa_legislativa__municipio__nome'

8
sigi/apps/ocorrencias/filters.py

@ -7,16 +7,16 @@ from sigi.apps.servidores.models import Servidor
class OcorrenciaListFilter(admin.SimpleListFilter): class OcorrenciaListFilter(admin.SimpleListFilter):
title = _(u'Relacionadas a Mim') title = _('Relacionadas a Mim')
parameter_name = 'minhas' parameter_name = 'minhas'
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
if request.user.servidor is None: if request.user.servidor is None:
return None return None
return ( return (
('S', _(u'Atribuídos ao meu setor')), ('S', _('Atribuídos ao meu setor')),
('M', _(u'Registrados por mim')), ('M', _('Registrados por mim')),
('G', _(u'Sobre casas que gerencio')), ('G', _('Sobre casas que gerencio')),
) )
def queryset(self, request, queryset): def queryset(self, request, queryset):

88
sigi/apps/ocorrencias/models.py

@ -7,16 +7,16 @@ from django.utils.safestring import mark_safe
class Categoria(models.Model): class Categoria(models.Model):
nome = models.CharField(_(u"Categoria"), max_length=50) nome = models.CharField(_("Categoria"), max_length=50)
descricao = models.TextField(_(u'descrição'), blank=True, null=True) descricao = models.TextField(_('descrição'), blank=True, null=True)
setor_responsavel = models.ForeignKey( setor_responsavel = models.ForeignKey(
'servidores.Servico', 'servidores.Servico',
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u"Setor responsável") verbose_name=_("Setor responsável")
) )
class Meta: class Meta:
verbose_name, verbose_name_plural = _(u'Categoria'), _(u'Categorias') verbose_name, verbose_name_plural = _('Categoria'), _('Categorias')
ordering = ('nome',) ordering = ('nome',)
def __unicode__(self): def __unicode__(self):
@ -24,10 +24,10 @@ class Categoria(models.Model):
class TipoContato(models.Model): class TipoContato(models.Model):
descricao = models.CharField(_(u"Descrição"), max_length=50) descricao = models.CharField(_("Descrição"), max_length=50)
class Meta: class Meta:
verbose_name, verbose_name_plural = _(u"Tipo de contato"), _(u"Tipos de contato") verbose_name, verbose_name_plural = _("Tipo de contato"), _("Tipos de contato")
def __unicode__(self): def __unicode__(self):
return self.descricao return self.descricao
@ -41,65 +41,65 @@ class Ocorrencia(models.Model):
STATUS_DUPLICADO = 5 STATUS_DUPLICADO = 5
STATUS_CHOICES = ( STATUS_CHOICES = (
(STATUS_ABERTO , _(u'Aberto')), (STATUS_ABERTO , _('Aberto')),
(STATUS_REABERTO , _(u'Reaberto')), (STATUS_REABERTO , _('Reaberto')),
(STATUS_RESOLVIDO, _(u'Resolvido')), (STATUS_RESOLVIDO, _('Resolvido')),
(STATUS_FECHADO , _(u'Fechado')), (STATUS_FECHADO , _('Fechado')),
(STATUS_DUPLICADO, _(u'Duplicado')), (STATUS_DUPLICADO, _('Duplicado')),
) )
PRIORITY_CHOICES = ( PRIORITY_CHOICES = (
(1, _(u'Altíssimo')), (1, _('Altíssimo')),
(2, _(u'Alto')), (2, _('Alto')),
(3, _(u'Normal')), (3, _('Normal')),
(4, _(u'Baixo')), (4, _('Baixo')),
(5, _(u'Baixíssimo')), (5, _('Baixíssimo')),
) )
casa_legislativa = models.ForeignKey( casa_legislativa = models.ForeignKey(
'casas.Orgao', 'casas.Orgao',
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'Casa Legislativa') verbose_name=_('Casa Legislativa')
) )
data_criacao = models.DateField(_(u'Data de criação'), null=True, blank=True, auto_now_add=True) data_criacao = models.DateField(_('Data de criação'), null=True, blank=True, auto_now_add=True)
data_modificacao = models.DateField(_(u'Data de modificação'), null=True, blank=True, auto_now=True) data_modificacao = models.DateField(_('Data de modificação'), null=True, blank=True, auto_now=True)
categoria = models.ForeignKey( categoria = models.ForeignKey(
Categoria, Categoria,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Categoria') verbose_name=_('Categoria')
) )
tipo_contato = models.ForeignKey( tipo_contato = models.ForeignKey(
TipoContato, TipoContato,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u"Tipo de contato") verbose_name=_("Tipo de contato")
) )
assunto = models.CharField(_(u'Assunto'), max_length=200) assunto = models.CharField(_('Assunto'), max_length=200)
status = models.IntegerField(_(u'Status'), choices=STATUS_CHOICES, default=1,) status = models.IntegerField(_('Status'), choices=STATUS_CHOICES, default=1,)
prioridade = models.IntegerField(_(u'Prioridade'), choices=PRIORITY_CHOICES, default=3, ) prioridade = models.IntegerField(_('Prioridade'), choices=PRIORITY_CHOICES, default=3, )
descricao = models.TextField(_(u'descrição'), blank=True,) descricao = models.TextField(_('descrição'), blank=True,)
resolucao = models.TextField(_(u'resolução'), blank=True,) resolucao = models.TextField(_('resolução'), blank=True,)
servidor_registro = models.ForeignKey( servidor_registro = models.ForeignKey(
'servidores.Servidor', 'servidores.Servidor',
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u"Servidor que registrou a ocorrência") verbose_name=_("Servidor que registrou a ocorrência")
) )
setor_responsavel = models.ForeignKey( setor_responsavel = models.ForeignKey(
'servidores.Servico', 'servidores.Servico',
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u"Setor responsável") verbose_name=_("Setor responsável")
) )
ticket = models.PositiveIntegerField(_(u'Número do ticket'), blank=True, null=True, help_text=_(u"Número do ticket no osTicket")) ticket = models.PositiveIntegerField(_('Número do ticket'), blank=True, null=True, help_text=_("Número do ticket no osTicket"))
class Meta: class Meta:
verbose_name, verbose_name_plural = _(u'ocorrência'), _(u'ocorrências') verbose_name, verbose_name_plural = _('ocorrência'), _('ocorrências')
ordering = ['prioridade', 'data_modificacao', 'data_criacao', ] ordering = ['prioridade', 'data_modificacao', 'data_criacao', ]
def __unicode__(self): def __unicode__(self):
return u"%(casa_legislativa)s: %(assunto)s" % {'assunto': self.assunto, 'casa_legislativa': self.casa_legislativa} return "%(casa_legislativa)s: %(assunto)s" % {'assunto': self.assunto, 'casa_legislativa': self.casa_legislativa}
def clean(self): def clean(self):
if self.ticket is not None and Ocorrencia.objects.exclude(pk=self.pk).filter(ticket=self.ticket).exists(): if self.ticket is not None and Ocorrencia.objects.exclude(pk=self.pk).filter(ticket=self.ticket).exists():
raise ValidationError({'ticket': _(u"Já existe ocorrência registrada para este ticket")}) raise ValidationError({'ticket': _("Já existe ocorrência registrada para este ticket")})
return super(Ocorrencia, self).clean() return super(Ocorrencia, self).clean()
def get_ticket_url(self): def get_ticket_url(self):
@ -109,21 +109,21 @@ class Comentario(models.Model):
ocorrencia = models.ForeignKey( ocorrencia = models.ForeignKey(
Ocorrencia, Ocorrencia,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'Ocorrência'), verbose_name=_('Ocorrência'),
related_name='comentarios' related_name='comentarios'
) )
data_criacao = models.DateTimeField(_(u'Data de criação'), null=True, blank=True, auto_now_add=True) data_criacao = models.DateTimeField(_('Data de criação'), null=True, blank=True, auto_now_add=True)
descricao = models.TextField(_(u'Descrição'), blank=True, null=True) descricao = models.TextField(_('Descrição'), blank=True, null=True)
usuario = models.ForeignKey( usuario = models.ForeignKey(
'servidores.Servidor', 'servidores.Servidor',
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Usuário') verbose_name=_('Usuário')
) )
novo_status = models.IntegerField(_(u'Novo status'), choices=Ocorrencia.STATUS_CHOICES, blank=True, null=True) novo_status = models.IntegerField(_('Novo status'), choices=Ocorrencia.STATUS_CHOICES, blank=True, null=True)
encaminhar_setor = models.ForeignKey( encaminhar_setor = models.ForeignKey(
'servidores.Servico', 'servidores.Servico',
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Encaminhar para setor'), verbose_name=_('Encaminhar para setor'),
blank=True, blank=True,
null=True null=True
) )
@ -142,15 +142,15 @@ class Anexo(models.Model):
ocorrencia = models.ForeignKey( ocorrencia = models.ForeignKey(
Ocorrencia, Ocorrencia,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'ocorrência') verbose_name=_('ocorrência')
) )
arquivo = models.FileField(_(u'Arquivo anexado'), upload_to='apps/ocorrencia/anexo/arquivo', max_length=500) arquivo = models.FileField(_('Arquivo anexado'), upload_to='apps/ocorrencia/anexo/arquivo', max_length=500)
descricao = models.CharField(_(u'descrição do anexo'), max_length='70') descricao = models.CharField(_('descrição do anexo'), max_length='70')
data_pub = models.DateTimeField(_(u'data da publicação do anexo'), null=True, blank=True, auto_now_add=True) data_pub = models.DateTimeField(_('data da publicação do anexo'), null=True, blank=True, auto_now_add=True)
class Meta: class Meta:
ordering = ('-data_pub',) ordering = ('-data_pub',)
verbose_name, verbose_name_plural = _(u'Anexo'), _(u'Anexos') verbose_name, verbose_name_plural = _('Anexo'), _('Anexos')
def __unicode__(self): def __unicode__(self):
return u"%(arquivo_name)s: %(descricao)s" % {'arquivo_name': self.arquivo.name, 'descricao': self.descricao} return "%(arquivo_name)s: %(descricao)s" % {'arquivo_name': self.arquivo.name, 'descricao': self.descricao}

20
sigi/apps/ocorrencias/views.py

@ -34,7 +34,7 @@ def painel_ocorrencias(request):
if tipo == 'casa': if tipo == 'casa':
casa = get_object_or_404(Orgao, pk=id) casa = get_object_or_404(Orgao, pk=id)
ocorrencias = casa.ocorrencia_set.all() ocorrencias = casa.ocorrencia_set.all()
panel_title = u"{casa}, {uf}".format( panel_title = "{casa}, {uf}".format(
casa=casa.nome, casa=casa.nome,
uf=casa.municipio.uf.sigla uf=casa.municipio.uf.sigla
) )
@ -42,8 +42,8 @@ def painel_ocorrencias(request):
servidor = get_object_or_404(Servidor, pk=id) servidor = get_object_or_404(Servidor, pk=id)
panel_title = servidor.nome_completo panel_title = servidor.nome_completo
paineis = {'gerente': u"Minhas casas", 'servico': u"Meu setor", paineis = {'gerente': "Minhas casas", 'servico': "Meu setor",
'timeline': u"Comentados por mim"} 'timeline': "Comentados por mim"}
if painel is None: if painel is None:
if Orgao.objects.filter( if Orgao.objects.filter(
@ -72,7 +72,7 @@ def painel_ocorrencias(request):
elif tipo == 'servico': elif tipo == 'servico':
servico = get_object_or_404(Servico, pk=id) servico = get_object_or_404(Servico, pk=id)
ocorrencias = servico.ocorrencia_set.all() ocorrencias = servico.ocorrencia_set.all()
panel_title = _(u"{sigla} - {nome}").format( panel_title = _("{sigla} - {nome}").format(
sigla=servico.sigla, nome=servico.nome) sigla=servico.sigla, nome=servico.nome)
ocorrencias = ocorrencias.filter(status__in=[1, 2]) ocorrencias = ocorrencias.filter(status__in=[1, 2])
@ -103,7 +103,7 @@ def painel_ocorrencias(request):
def busca_nominal(request, origin="tudo"): def busca_nominal(request, origin="tudo"):
term = request.GET.get('term', None) term = request.GET.get('term', None)
if term is None: if term is None:
return JsonResponse([{'label': _(u'Erro na pesquisa por termo'), 'value': 'type=error'}], safe=False) return JsonResponse([{'label': _('Erro na pesquisa por termo'), 'value': 'type=error'}], safe=False)
data = [] data = []
@ -131,10 +131,10 @@ def muda_prioridade(request):
prioridade = request.POST.get('prioridade', None) prioridade = request.POST.get('prioridade', None)
if id_ocorrencia is None or prioridade is None: if id_ocorrencia is None or prioridade is None:
return JsonResponse({'result': 'error', 'message': _(u'Erro nos parâmetros')}) return JsonResponse({'result': 'error', 'message': _('Erro nos parâmetros')})
if not any([int(prioridade) == p[0] for p in Ocorrencia.PRIORITY_CHOICES]): if not any([int(prioridade) == p[0] for p in Ocorrencia.PRIORITY_CHOICES]):
return JsonResponse({'result': 'error', 'message': _(u'Valor de prioridade não aceito')}) return JsonResponse({'result': 'error', 'message': _('Valor de prioridade não aceito')})
try: try:
ocorrencia = Ocorrencia.objects.get(pk=id_ocorrencia) ocorrencia = Ocorrencia.objects.get(pk=id_ocorrencia)
@ -144,14 +144,14 @@ def muda_prioridade(request):
ocorrencia.prioridade = prioridade ocorrencia.prioridade = prioridade
ocorrencia.save() ocorrencia.save()
return JsonResponse({'result': 'success', 'message': _(u'Prioridade alterada')}) return JsonResponse({'result': 'success', 'message': _('Prioridade alterada')})
@login_required @login_required
def exclui_anexo(request): def exclui_anexo(request):
anexo_id = request.GET.get('anexo_id', None) anexo_id = request.GET.get('anexo_id', None)
if anexo_id is None: if anexo_id is None:
return JsonResponse({'result': 'error', 'message': _(u'Erro nos parâmetros')}) return JsonResponse({'result': 'error', 'message': _('Erro nos parâmetros')})
try: try:
anexo = Anexo.objects.get(pk=anexo_id) anexo = Anexo.objects.get(pk=anexo_id)
@ -167,7 +167,7 @@ def exclui_anexo(request):
painel = render_to_string('ocorrencias/anexos_snippet.html', {'ocorrencia': ocorrencia}, painel = render_to_string('ocorrencias/anexos_snippet.html', {'ocorrencia': ocorrencia},
context_instance=RequestContext(request)) context_instance=RequestContext(request))
return JsonResponse({'result': 'success', 'message': _(u'Anexo %s excluído com sucesso' % (anexo_id,)), return JsonResponse({'result': 'success', 'message': _('Anexo %s excluído com sucesso' % (anexo_id,)),
'link_label': link_label, 'anexos_panel': painel}) 'link_label': link_label, 'anexos_panel': painel})
@login_required @login_required

14
sigi/apps/parlamentares/admin.py

@ -32,7 +32,7 @@ class PartidoAdmin(BaseModelAdmin):
class ParlamentarNomeCompletoFilter(AlphabeticFilter): class ParlamentarNomeCompletoFilter(AlphabeticFilter):
title = _(u'Inicial do Nome Completo') title = _('Inicial do Nome Completo')
parameter_name = 'nome_completo' parameter_name = 'nome_completo'
@ -46,10 +46,10 @@ class ParlamentarAdmin(BaseModelAdmin):
(None, { (None, {
'fields': ('nome_completo', 'nome_parlamentar', 'sexo'), 'fields': ('nome_completo', 'nome_parlamentar', 'sexo'),
}), }),
# (_(u'Endereço'), { # (_('Endereço'), {
# 'fields': ('logradouro', 'bairro', 'municipio', 'cep'), # 'fields': ('logradouro', 'bairro', 'municipio', 'cep'),
# }), # }),
(_(u'Outras informações'), { (_('Outras informações'), {
'fields': ('data_nascimento', 'email', 'pagina_web', 'foto'), 'fields': ('data_nascimento', 'email', 'pagina_web', 'foto'),
}), }),
) )
@ -67,12 +67,12 @@ class ParlamentarAdmin(BaseModelAdmin):
q2 = len(request.session['carrinho_parlamentar']) q2 = len(request.session['carrinho_parlamentar'])
quant = q2 - q1 quant = q2 - q1
if quant: if quant:
self.message_user(request, _(u"%s Parlamentares adicionados no carrinho") % (quant)) self.message_user(request, _("%s Parlamentares adicionados no carrinho") % (quant))
else: else:
self.message_user(request, _(u"Os parlamentares selecionadas já foram adicionadas anteriormente")) self.message_user(request, _("Os parlamentares selecionadas já foram adicionadas anteriormente"))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
adiciona_parlamentar.short_description = _(u"Armazenar parlamentar no carrinho para exportar") adiciona_parlamentar.short_description = _("Armazenar parlamentar no carrinho para exportar")
class MandatoAdmin(BaseModelAdmin): class MandatoAdmin(BaseModelAdmin):
@ -102,7 +102,7 @@ class LegislaturaAdmin(BaseModelAdmin):
def uf(self, obj): def uf(self, obj):
return obj.casa_legislativa.municipio.uf.sigla return obj.casa_legislativa.municipio.uf.sigla
uf.short_description = _(u'UF') uf.short_description = _('UF')
uf.admin_order_field = 'casa_legislativa__municipio__uf' uf.admin_order_field = 'casa_legislativa__municipio__uf'
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):

84
sigi/apps/parlamentares/models.py

@ -18,8 +18,8 @@ class Partido(models.Model):
class Parlamentar(models.Model): class Parlamentar(models.Model):
SEXO_CHOICES = ( SEXO_CHOICES = (
('M', _(u'Masculino')), ('M', _('Masculino')),
('F', _(u'Feminino')), ('F', _('Feminino')),
) )
nome_completo = models.CharField(max_length=128) nome_completo = models.CharField(max_length=128)
nome_parlamentar = models.CharField(max_length=35, blank=True) nome_parlamentar = models.CharField(max_length=35, blank=True)
@ -36,17 +36,17 @@ class Parlamentar(models.Model):
choices=SEXO_CHOICES, choices=SEXO_CHOICES,
) )
data_nascimento = models.DateField( data_nascimento = models.DateField(
_(u'data de nascimento'), _('data de nascimento'),
blank=True, blank=True,
null=True, null=True,
) )
email = models.EmailField(_(u'e-mail'), blank=True) email = models.EmailField(_('e-mail'), blank=True)
pagina_web = models.URLField(_(u'página web'), pagina_web = models.URLField(_('página web'),
blank=True) blank=True)
class Meta: class Meta:
ordering = ('nome_completo',) ordering = ('nome_completo',)
verbose_name_plural = _(u'parlamentares') verbose_name_plural = _('parlamentares')
def __unicode__(self): def __unicode__(self):
if self.nome_parlamentar: if self.nome_parlamentar:
@ -56,8 +56,8 @@ class Parlamentar(models.Model):
class Mandato(models.Model): class Mandato(models.Model):
SUPLENCIA_CHOICES = ( SUPLENCIA_CHOICES = (
('T', _(u'Titular')), ('T', _('Titular')),
('S', _(u'Suplente')), ('S', _('Suplente')),
) )
parlamentar = models.ForeignKey(Parlamentar, on_delete=models.CASCADE) parlamentar = models.ForeignKey(Parlamentar, on_delete=models.CASCADE)
legislatura = models.ForeignKey( legislatura = models.ForeignKey(
@ -66,16 +66,16 @@ class Mandato(models.Model):
) )
partido = models.ForeignKey(Partido, on_delete=models.CASCADE) partido = models.ForeignKey(Partido, on_delete=models.CASCADE)
cargo = models.ForeignKey('parlamentares.Cargo', on_delete=models.PROTECT) cargo = models.ForeignKey('parlamentares.Cargo', on_delete=models.PROTECT)
inicio_mandato = models.DateField(_(u'início de mandato')) inicio_mandato = models.DateField(_('início de mandato'))
fim_mandato = models.DateField(_(u'fim de mandato')) fim_mandato = models.DateField(_('fim de mandato'))
is_afastado = models.BooleanField( is_afastado = models.BooleanField(
_(u'afastado'), _('afastado'),
default=False, default=False,
help_text=_(u'Marque caso parlamentar não esteja ativo.') help_text=_('Marque caso parlamentar não esteja ativo.')
) )
# suplencia = models.CharField( # suplencia = models.CharField(
# _(u'suplência'), # _('suplência'),
# max_length=1, # max_length=1,
# choices=SUPLENCIA_CHOICES, # choices=SUPLENCIA_CHOICES,
# ) # )
@ -86,11 +86,11 @@ class Mandato(models.Model):
class Legislatura(models.Model): class Legislatura(models.Model):
casa_legislativa = models.ForeignKey(Orgao, on_delete=models.CASCADE) casa_legislativa = models.ForeignKey(Orgao, on_delete=models.CASCADE)
numero = models.PositiveSmallIntegerField(_(u'número legislatura')) numero = models.PositiveSmallIntegerField(_('número legislatura'))
data_inicio = models.DateField(_(u'início')) data_inicio = models.DateField(_('início'))
data_fim = models.DateField(_(u'fim')) data_fim = models.DateField(_('fim'))
data_eleicao = models.DateField(_(u'data da eleição')) data_eleicao = models.DateField(_('data da eleição'))
total_parlamentares = models.PositiveIntegerField(_(u"Total de parlamentares")) total_parlamentares = models.PositiveIntegerField(_("Total de parlamentares"))
casa_legislativa.convenio_uf_filter = True casa_legislativa.convenio_uf_filter = True
casa_legislativa.convenio_cl_tipo_filter = True casa_legislativa.convenio_cl_tipo_filter = True
@ -100,7 +100,7 @@ class Legislatura(models.Model):
ordering = ['casa_legislativa__municipio__uf__sigla', '-data_inicio'] ordering = ['casa_legislativa__municipio__uf__sigla', '-data_inicio']
def __unicode__(self): def __unicode__(self):
return _(u"%(number)sª legislatura da %(parliament)s (%(initial_year)s-%(final_year)s)") % dict( return _("%(number)sª legislatura da %(parliament)s (%(initial_year)s-%(final_year)s)") % dict(
number=self.numero, number=self.numero,
parliament=self.casa_legislativa.__unicode__(), parliament=self.casa_legislativa.__unicode__(),
initial_year=self.data_inicio.year, initial_year=self.data_inicio.year,
@ -111,15 +111,15 @@ class Coligacao(models.Model):
nome = models.CharField(max_length=50) nome = models.CharField(max_length=50)
legislatura = models.ForeignKey(Legislatura, on_delete=models.CASCADE) legislatura = models.ForeignKey(Legislatura, on_delete=models.CASCADE)
numero_votos = models.PositiveIntegerField( numero_votos = models.PositiveIntegerField(
_(u'número de votos'), _('número de votos'),
blank=True, blank=True,
null=True, null=True,
) )
class Meta: class Meta:
ordering = ('legislatura', 'nome') ordering = ('legislatura', 'nome')
verbose_name = _(u'coligação') verbose_name = _('coligação')
verbose_name_plural = _(u'coligações') verbose_name_plural = _('coligações')
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
@ -129,7 +129,7 @@ class ComposicaoColigacao(models.Model):
coligacao = models.ForeignKey( coligacao = models.ForeignKey(
Coligacao, Coligacao,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'coligação') verbose_name=_('coligação')
) )
partido = models.ForeignKey( partido = models.ForeignKey(
'parlamentares.Partido', 'parlamentares.Partido',
@ -137,8 +137,8 @@ class ComposicaoColigacao(models.Model):
) )
class Meta: class Meta:
verbose_name = _(u'composição da coligação') verbose_name = _('composição da coligação')
verbose_name_plural = _(u'composições das coligações') verbose_name_plural = _('composições das coligações')
def __unicode__(self): def __unicode__(self):
return str(self.id) return str(self.id)
@ -146,14 +146,14 @@ class ComposicaoColigacao(models.Model):
class SessaoLegislativa(models.Model): class SessaoLegislativa(models.Model):
SESSAO_CHOICES = ( SESSAO_CHOICES = (
('O', _(u'Ordinária')), ('O', _('Ordinária')),
('E', _(u'Extraordinária')), ('E', _('Extraordinária')),
) )
numero = models.PositiveSmallIntegerField(_(u'número da sessão'), unique=True) numero = models.PositiveSmallIntegerField(_('número da sessão'), unique=True)
mesa_diretora = models.ForeignKey( mesa_diretora = models.ForeignKey(
'MesaDiretora', 'MesaDiretora',
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Mesa Diretora') verbose_name=_('Mesa Diretora')
) )
legislatura = models.ForeignKey(Legislatura, on_delete=models.CASCADE) legislatura = models.ForeignKey(Legislatura, on_delete=models.CASCADE)
tipo = models.CharField( tipo = models.CharField(
@ -161,23 +161,23 @@ class SessaoLegislativa(models.Model):
choices=SESSAO_CHOICES, choices=SESSAO_CHOICES,
default='O' default='O'
) )
data_inicio = models.DateField(_(u'início')) data_inicio = models.DateField(_('início'))
data_fim = models.DateField(_(u'fim')) data_fim = models.DateField(_('fim'))
data_inicio_intervalo = models.DateField( data_inicio_intervalo = models.DateField(
_(u'início de intervalo'), _('início de intervalo'),
blank=True, blank=True,
null=True null=True
) )
data_fim_intervalo = models.DateField( data_fim_intervalo = models.DateField(
_(u'fim de intervalo'), _('fim de intervalo'),
blank=True, blank=True,
null=True null=True
) )
class Meta: class Meta:
ordering = ('legislatura', 'numero') ordering = ('legislatura', 'numero')
verbose_name = _(u'Sessão Legislativa') verbose_name = _('Sessão Legislativa')
verbose_name_plural = _(u'Sessões Legislativas') verbose_name_plural = _('Sessões Legislativas')
def __unicode__(self): def __unicode__(self):
return str(self.numero) return str(self.numero)
@ -187,19 +187,19 @@ class MesaDiretora(models.Model):
casa_legislativa = models.ForeignKey( casa_legislativa = models.ForeignKey(
'casas.Orgao', 'casas.Orgao',
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'Casa Legislativa') verbose_name=_('Casa Legislativa')
) )
class Meta: class Meta:
verbose_name = _(u'Mesa Diretora') verbose_name = _('Mesa Diretora')
verbose_name_plural = _(u'Mesas Diretoras') verbose_name_plural = _('Mesas Diretoras')
def __unicode__(self): def __unicode__(self):
return _(u'Mesa Diretora da %s') % unicode(self.casa_legislativa) return _('Mesa Diretora da %s') % unicode(self.casa_legislativa)
class Cargo(models.Model): class Cargo(models.Model):
descricao = models.CharField(_(u'descrição'), max_length=30) descricao = models.CharField(_('descrição'), max_length=30)
class Meta: class Meta:
ordering = ('descricao',) ordering = ('descricao',)
@ -219,8 +219,8 @@ class MembroMesaDiretora(models.Model):
class Meta: class Meta:
ordering = ('parlamentar',) ordering = ('parlamentar',)
unique_together = ('cargo', 'mesa_diretora') unique_together = ('cargo', 'mesa_diretora')
verbose_name = _(u'membro de Mesa Diretora') verbose_name = _('membro de Mesa Diretora')
verbose_name_plural = _(u'membros de Mesa Diretora') verbose_name_plural = _('membros de Mesa Diretora')
def __unicode__(self): def __unicode__(self):
return '%s (%s)' % (unicode(self.parlamentar), unicode(self.cargo)) return '%s (%s)' % (unicode(self.parlamentar), unicode(self.cargo))

88
sigi/apps/parlamentares/reports.py

@ -85,7 +85,7 @@ class ParlamentaresLabels(Report):
my_elements = [ my_elements = [
Label( Label(
text=_(u'A Sua Excelência o(a) Senhor(a)'), text=_('A Sua Excelência o(a) Senhor(a)'),
top=(self.start + self.delta) * cm, left=self.y * cm, width=(self.largura_etiqueta - self.y) * cm, top=(self.start + self.delta) * cm, left=self.y * cm, width=(self.largura_etiqueta - self.y) * cm,
), ),
ObjectValue( ObjectValue(
@ -126,32 +126,32 @@ def logradouro_parlamentar(instance):
try: try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.logradouro return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.logradouro
except: except:
return _(u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>") return _("<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>")
def bairro_parlamentar(instance): def bairro_parlamentar(instance):
try: try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.bairro return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.bairro
except: except:
return _(u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>") return _("<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>")
def municipio_parlamentar(instance): def municipio_parlamentar(instance):
try: try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.municipio return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.municipio
except: except:
return _(u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>") return _("<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>")
def cep_parlamentar(instance): def cep_parlamentar(instance):
try: try:
return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.cep return instance.mandato_set.latest('inicio_mandato').legislatura.casa_legislativa.cep
except: except:
return _(u"<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>") return _("<<PARLAMENTAR SEM MANDATO - impossivel definir endereço>>")
class CasasLegislativasReport(ReportDefault): class CasasLegislativasReport(ReportDefault):
title = _(u'Relatório de Casas Legislativas') title = _('Relatório de Casas Legislativas')
height = 80 * cm height = 80 * cm
page_size = landscape(A4) page_size = landscape(A4)
@ -170,10 +170,10 @@ class CasasLegislativasReport(ReportDefault):
left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=3 * cm, height=3 * cm, width=3 * cm, height=3 * cm,
), ),
Label(text=_(u"SENADO FEDERAL"), top=1 * cm, left=0, width=BAND_WIDTH, Label(text=_("SENADO FEDERAL"), top=1 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}
), ),
Label(text=_(u"SINTER - Secretaria Especial do Interlegis"), top=1.5 * cm, left=0, width=BAND_WIDTH, Label(text=_("SINTER - Secretaria Especial do Interlegis"), top=1.5 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER}
), ),
SystemField( SystemField(
@ -181,32 +181,32 @@ class CasasLegislativasReport(ReportDefault):
style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}
), ),
Label( Label(
text=_(u"UF"), text=_("UF"),
left=label_left[0] * cm, left=label_left[0] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=_(u"Municipio"), text=_("Municipio"),
left=label_left[1] * cm, left=label_left[1] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=_(u"Presidente"), text=_("Presidente"),
left=label_left[2] * cm, left=label_left[2] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=_(u"Endereço"), text=_("Endereço"),
left=label_left[3] * cm, left=label_left[3] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=_(u"Endereço na Internet"), text=_("Endereço na Internet"),
left=label_left[4] * cm, left=label_left[4] * cm,
top=label_top, top=label_top,
), ),
Label( Label(
text=_(u"Email"), text=_("Email"),
left=label_left[5] * cm, left=label_left[5] * cm,
top=label_top, top=label_top,
), ),
@ -269,7 +269,7 @@ def label_text(text):
class InfoOrgao(ReportDefault): class InfoOrgao(ReportDefault):
title = _(u'Casa Legislativa') title = _('Casa Legislativa')
class band_summary(ReportBand): class band_summary(ReportBand):
pass pass
@ -278,7 +278,7 @@ class InfoOrgao(ReportDefault):
height = 1 * cm height = 1 * cm
elements = [ elements = [
SystemField(expression=_(u'%(now:%d/%m/%Y)s às %(now:%H:%M)s'), top=0.3 * cm), SystemField(expression=_('%(now:%d/%m/%Y)s às %(now:%H:%M)s'), top=0.3 * cm),
] ]
class band_detail(ReportDefault.band_detail): class band_detail(ReportDefault.band_detail):
@ -316,7 +316,7 @@ class InfoOrgao(ReportDefault):
elements = [ elements = [
Label( Label(
text=label_text(_(u"Tipo")), text=label_text(_("Tipo")),
left=posicao_left[0] * cm, left=posicao_left[0] * cm,
top=posicao_top[0] * cm, top=posicao_top[0] * cm,
), ),
@ -327,7 +327,7 @@ class InfoOrgao(ReportDefault):
width=6 * cm, width=6 * cm,
), ),
Label( Label(
text=label_text(_(u"Região")), text=label_text(_("Região")),
left=posicao_left[2] * cm, left=posicao_left[2] * cm,
top=posicao_top[1] * cm, top=posicao_top[1] * cm,
), ),
@ -336,11 +336,11 @@ class InfoOrgao(ReportDefault):
left=posicao_left[3] * cm, left=posicao_left[3] * cm,
top=posicao_top[1] * cm, top=posicao_top[1] * cm,
get_value=lambda instance: get_value=lambda instance:
{'SL': _(u'Sul'), 'SD': _(u'Sudeste'), 'CO': _(u'Centro-Oeste'), 'NE': _(u'Nordeste'), 'NO': _(u'Norte'), } {'SL': _('Sul'), 'SD': _('Sudeste'), 'CO': _('Centro-Oeste'), 'NE': _('Nordeste'), 'NO': _('Norte'), }
[instance.municipio.uf.regiao] [instance.municipio.uf.regiao]
), ),
Label( Label(
text=label_text(_(u"UF")), text=label_text(_("UF")),
left=posicao_left[4] * cm, left=posicao_left[4] * cm,
top=posicao_top[2] * cm, top=posicao_top[2] * cm,
), ),
@ -350,7 +350,7 @@ class InfoOrgao(ReportDefault):
top=posicao_top[2] * cm, top=posicao_top[2] * cm,
), ),
Label( Label(
text=label_text(_(u"Município")), text=label_text(_("Município")),
left=posicao_left[6] * cm, left=posicao_left[6] * cm,
top=posicao_top[3] * cm, top=posicao_top[3] * cm,
), ),
@ -362,7 +362,7 @@ class InfoOrgao(ReportDefault):
), ),
# Linha 3 # Linha 3
Label( Label(
text=label_text(_(u"Endereço")), text=label_text(_("Endereço")),
left=posicao_left[8] * cm, left=posicao_left[8] * cm,
top=posicao_top[4] * cm, top=posicao_top[4] * cm,
), ),
@ -373,7 +373,7 @@ class InfoOrgao(ReportDefault):
width=20 * cm, width=20 * cm,
), ),
Label( Label(
text=label_text(_(u"Bairro")), text=label_text(_("Bairro")),
left=posicao_left[10] * cm, left=posicao_left[10] * cm,
top=posicao_top[5] * cm, top=posicao_top[5] * cm,
), ),
@ -383,7 +383,7 @@ class InfoOrgao(ReportDefault):
top=posicao_top[5] * cm, top=posicao_top[5] * cm,
), ),
Label( Label(
text=label_text(_(u"CEP")), text=label_text(_("CEP")),
left=posicao_left[12] * cm, left=posicao_left[12] * cm,
top=posicao_top[6] * cm, top=posicao_top[6] * cm,
), ),
@ -393,7 +393,7 @@ class InfoOrgao(ReportDefault):
top=posicao_top[6] * cm, top=posicao_top[6] * cm,
), ),
Label( Label(
text=label_text(_(u"CNPJ")), text=label_text(_("CNPJ")),
left=posicao_left[14] * cm, left=posicao_left[14] * cm,
top=posicao_top[7] * cm, top=posicao_top[7] * cm,
), ),
@ -403,7 +403,7 @@ class InfoOrgao(ReportDefault):
top=posicao_top[7] * cm, top=posicao_top[7] * cm,
), ),
Label( Label(
text=label_text(_(u"Telefone")), text=label_text(_("Telefone")),
left=posicao_left[16] * cm, left=posicao_left[16] * cm,
top=posicao_top[8] * cm, top=posicao_top[8] * cm,
), ),
@ -413,7 +413,7 @@ class InfoOrgao(ReportDefault):
top=posicao_top[8] * cm, top=posicao_top[8] * cm,
), ),
Label( Label(
text=label_text(_(u"Presidente")), text=label_text(_("Presidente")),
left=posicao_left[18] * cm, left=posicao_left[18] * cm,
top=posicao_top[9] * cm, top=posicao_top[9] * cm,
), ),
@ -442,14 +442,14 @@ class InfoOrgao(ReportDefault):
height=2.5 * cm, height=2.5 * cm,
elements=[ elements=[
Label( Label(
text=_(u"Telefone(s)"), text=_("Telefone(s)"),
style={'fontSize': 14, 'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1 * cm, top=1 * cm,
), ),
Label(text=_(u"Número"), left=tel_left[0] * cm, top=tel_top), Label(text=_("Número"), left=tel_left[0] * cm, top=tel_top),
Label(text=_(u"Tipo"), left=tel_left[1] * cm, top=tel_top), Label(text=_("Tipo"), left=tel_left[1] * cm, top=tel_top),
Label(text=_(u"Nota"), left=tel_left[2] * cm, top=tel_top), Label(text=_("Nota"), left=tel_left[2] * cm, top=tel_top),
], ],
borders={'bottom': True}, borders={'bottom': True},
), ),
@ -460,7 +460,7 @@ class InfoOrgao(ReportDefault):
ObjectValue(attribute_name='__unicode__', left=tel_left[0] * cm), ObjectValue(attribute_name='__unicode__', left=tel_left[0] * cm),
ObjectValue(attribute_name='tipo', left=tel_left[1] * cm, ObjectValue(attribute_name='tipo', left=tel_left[1] * cm,
get_value=lambda instance: get_value=lambda instance:
{'F': _(u'Fixo'), 'M': _(u'Móvel'), 'X': _(u'Fax'), 'I': _(u'Indefinido')}[instance.tipo], {'F': _('Fixo'), 'M': _('Móvel'), 'X': _('Fax'), 'I': _('Indefinido')}[instance.tipo],
), ),
ObjectValue(attribute_name='nota', left=tel_left[2] * cm), ObjectValue(attribute_name='nota', left=tel_left[2] * cm),
], ],
@ -475,14 +475,14 @@ class InfoOrgao(ReportDefault):
height=2.5 * cm, height=2.5 * cm,
elements=[ elements=[
Label( Label(
text=_(u"Contato(s)"), text=_("Contato(s)"),
style={'fontSize': 14, 'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1 * cm, top=1 * cm,
), ),
Label(text=_(u"Nome"), left=cont_left[0] * cm, top=cont_top), Label(text=_("Nome"), left=cont_left[0] * cm, top=cont_top),
Label(text=_(u"Nota"), left=cont_left[1] * cm, top=cont_top), Label(text=_("Nota"), left=cont_left[1] * cm, top=cont_top),
Label(text=_(u"E-mail"), left=cont_left[2] * cm, top=cont_top), Label(text=_("E-mail"), left=cont_left[2] * cm, top=cont_top),
], ],
borders={'bottom': True, 'top': True}, borders={'bottom': True, 'top': True},
), ),
@ -505,18 +505,18 @@ class InfoOrgao(ReportDefault):
height=2.5 * cm, height=2.5 * cm,
elements=[ elements=[
Label( Label(
text=_(u"Convênio(s)"), text=_("Convênio(s)"),
style={'fontSize': 14, 'alignment': TA_CENTER}, style={'fontSize': 14, 'alignment': TA_CENTER},
width=BAND_WIDTH, width=BAND_WIDTH,
top=1 * cm, top=1 * cm,
), ),
Label(text=_(u"Projeto"), left=convenio_left[0] * cm, top=convenio_top), Label(text=_("Projeto"), left=convenio_left[0] * cm, top=convenio_top),
Label(text=_(u"Nº Convenio"), left=convenio_left[1] * cm, top=convenio_top), Label(text=_("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=_("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=_("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=_("Convênio"), left=convenio_left[4] * cm, top=convenio_top),
Label(text=_(u"Equipada"), left=convenio_left[5] * cm, top=convenio_top), Label(text=_("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=_("Data D.O."), left=convenio_left[6] * cm, top=convenio_top),
], ],
borders={'bottom': True} borders={'bottom': True}
), ),

14
sigi/apps/relatorios/reports.py

@ -13,8 +13,8 @@ from reportlab.lib.units import cm
class ReportDefault(Report): class ReportDefault(Report):
#__metaclass__ = ABCMeta #__metaclass__ = ABCMeta
title = _(u'Relatório') title = _('Relatório')
author = _(u'Interlegis') author = _('Interlegis')
print_if_empty = True print_if_empty = True
page_size = A4 page_size = A4
@ -35,10 +35,10 @@ class ReportDefault(Report):
left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm, left=1 * cm, right=1 * cm, top=0.1 * cm, bottom=1 * cm,
width=3 * cm, height=3 * cm, width=3 * cm, height=3 * cm,
), ),
Label(text=_(u"SENADO FEDERAL"), top=1 * cm, left=0, width=BAND_WIDTH, Label(text=_("SENADO FEDERAL"), top=1 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}
), ),
Label(text=_(u"SINTER - Secretaria Especial do Interlegis"), top=1.5 * cm, left=0, width=BAND_WIDTH, Label(text=_("SINTER - Secretaria Especial do Interlegis"), top=1.5 * cm, left=0, width=BAND_WIDTH,
style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER} style={'fontName': 'Helvetica-Bold', 'fontSize': 13, 'alignment': TA_CENTER}
), ),
SystemField( SystemField(
@ -52,8 +52,8 @@ class ReportDefault(Report):
height = 1 * cm height = 1 * cm
elements = [ elements = [
SystemField(expression=_(u'%(now:%d/%m/%Y)s às %(now:%H:%M)s'), top=0.3 * cm), SystemField(expression=_('%(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=_('Página %(page_number)d de %(page_count)d'), top=0.3 * cm,
width=BAND_WIDTH, style={'alignment': TA_RIGHT} width=BAND_WIDTH, style={'alignment': TA_RIGHT}
), ),
] ]
@ -67,7 +67,7 @@ class ReportDefault(Report):
class band_summary(ReportBand): class band_summary(ReportBand):
height = 0.8 * cm height = 0.8 * cm
elements = [ elements = [
Label(text=_(u"Total") + ":", top=0.1 * cm, left=0), Label(text=_("Total") + ":", top=0.1 * cm, left=0),
ObjectValue(attribute_name='id', top=0.1 * cm, left=1 * cm, ObjectValue(attribute_name='id', top=0.1 * cm, left=1 * cm,
action=FIELD_ACTION_COUNT, display_format='%s'), action=FIELD_ACTION_COUNT, display_format='%s'),
] ]

76
sigi/apps/servicos/admin.py

@ -53,18 +53,18 @@ class TipoServicoAdmin(BaseModelAdmin):
ordering = ['id'] ordering = ['id']
class DataUtimoUsoFilter(admin.SimpleListFilter): class DataUtimoUsoFilter(admin.SimpleListFilter):
title = _(u"Atualização") title = _("Atualização")
parameter_name = 'atualizacao' parameter_name = 'atualizacao'
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
return ( return (
('err', _(u"Erro na verificação")), ('err', _("Erro na verificação")),
('year', _(u"Sem atualização há um ano ou mais")), ('year', _("Sem atualização há um ano ou mais")),
('semester', _(u"Sem atualização de seis meses a um ano")), ('semester', _("Sem atualização de seis meses a um ano")),
('quarter', _(u"Sem atualização de três a seis meses")), ('quarter', _("Sem atualização de três a seis meses")),
('month', _(u"Sem atualização de um a três meses")), ('month', _("Sem atualização de um a três meses")),
('week', _(u"Sem atualização de uma semana a um mês")), ('week', _("Sem atualização de uma semana a um mês")),
('updated', _(u"Atualizado na última semana")), ('updated', _("Atualizado na última semana")),
) )
def queryset(self, request, queryset): def queryset(self, request, queryset):
@ -94,13 +94,13 @@ class DataUtimoUsoFilter(admin.SimpleListFilter):
return queryset return queryset
class ServicoAtivoFilter(admin.SimpleListFilter): class ServicoAtivoFilter(admin.SimpleListFilter):
title = _(u"Serviço ativo") title = _("Serviço ativo")
parameter_name = 'ativo' parameter_name = 'ativo'
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
return ( return (
('ativo', _(u"Ativo")), ('ativo', _("Ativo")),
('desativado', _(u"Desativado")), ('desativado', _("Desativado")),
) )
def queryset(self, request, queryset): def queryset(self, request, queryset):
@ -120,13 +120,13 @@ class ServicoAdmin(BaseModelAdmin):
fieldsets = ((None, { fieldsets = ((None, {
'fields': ('casa_legislativa', 'data_ativacao',) 'fields': ('casa_legislativa', 'data_ativacao',)
}), }),
(_(u'Serviço'), { (_('Serviço'), {
'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),) 'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),)
}), }),
(_(u'Contatos'), { (_('Contatos'), {
'fields': ('contato_tecnico', 'contato_administrativo',) 'fields': ('contato_tecnico', 'contato_administrativo',)
}), }),
(_(u'Alterações'), { (_('Alterações'), {
'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',) 'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',)
})) }))
readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao') readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao')
@ -146,30 +146,30 @@ class ServicoAdmin(BaseModelAdmin):
def get_codigo_interlegis(self, obj): def get_codigo_interlegis(self, obj):
return obj.casa_legislativa.codigo_interlegis return obj.casa_legislativa.codigo_interlegis
get_codigo_interlegis.short_description = _(u'Código Interlegis') get_codigo_interlegis.short_description = _('Código Interlegis')
get_codigo_interlegis.admin_order_field = 'casa_legislativa__codigo_interlegis' get_codigo_interlegis.admin_order_field = 'casa_legislativa__codigo_interlegis'
def get_uf(self, obj): def get_uf(self, obj):
return u'%s' % (obj.casa_legislativa.municipio.uf) return '%s' % (obj.casa_legislativa.municipio.uf)
get_uf.short_description = _(u'UF') get_uf.short_description = _('UF')
get_uf.admin_order_field = 'casa_legislativa__municipio__uf' get_uf.admin_order_field = 'casa_legislativa__municipio__uf'
def getUrl(self, obj): def getUrl(self, obj):
return u'<a href="%s" target="_blank">%s</a>' % (obj.url, obj.url) return '<a href="%s" target="_blank">%s</a>' % (obj.url, obj.url)
getUrl.short_description = _(u'Url') getUrl.short_description = _('Url')
getUrl.allow_tags = True getUrl.allow_tags = True
def get_link_erro(self, obj): def get_link_erro(self, obj):
if not obj.erro_atualizacao: if not obj.erro_atualizacao:
return u"" return ""
url = obj.url url = obj.url
if url[-1] != '/': if url[-1] != '/':
url += '/' url += '/'
if obj.tipo_servico.string_pesquisa: if obj.tipo_servico.string_pesquisa:
url += obj.tipo_servico.string_pesquisa.splitlines()[0].split(" ")[0] url += obj.tipo_servico.string_pesquisa.splitlines()[0].split(" ")[0]
return u'<a href="%s" target="_blank">%s</a>' % (url, obj.erro_atualizacao) return '<a href="%s" target="_blank">%s</a>' % (url, obj.erro_atualizacao)
get_link_erro.allow_tags = True get_link_erro.allow_tags = True
get_link_erro.short_description = _(u"Erro na atualização") get_link_erro.short_description = _("Erro na atualização")
get_link_erro.admin_order_field = 'erro_atualizacao' get_link_erro.admin_order_field = 'erro_atualizacao'
def adicionar_servicos(self, request, queryset): def adicionar_servicos(self, request, queryset):
@ -181,19 +181,19 @@ class ServicoAdmin(BaseModelAdmin):
q2 = len(request.session['carrinho_servicos']) q2 = len(request.session['carrinho_servicos'])
quant = q2 - q1 quant = q2 - q1
if quant: if quant:
self.message_user(request, str(q2 - q1) + _(u" Serviços adicionados no carrinho")) self.message_user(request, str(q2 - q1) + _(" Serviços adicionados no carrinho"))
else: else:
self.message_user(request, _(u"Os Serviços selecionados já foram adicionadas anteriormente")) self.message_user(request, _("Os Serviços selecionados já foram adicionadas anteriormente"))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
adicionar_servicos.short_description = _(u"Armazenar serviços no carrinho para exportar") adicionar_servicos.short_description = _("Armazenar serviços no carrinho para exportar")
def calcular_data_uso(self, request, queryset): def calcular_data_uso(self, request, queryset):
for servico in queryset: for servico in queryset:
servico.atualiza_data_uso() servico.atualiza_data_uso()
self.message_user(request, _(u"Atualização concluída. Os sites que não responderam foram deixados com a data em branco")) self.message_user(request, _("Atualização concluída. Os sites que não responderam foram deixados com a data em branco"))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
calcular_data_uso.short_description = _(u"Atualizar a data do último uso do(s) serviço(s)") calcular_data_uso.short_description = _("Atualizar a data do último uso do(s) serviço(s)")
def get_actions(self, request): def get_actions(self, request):
from django.utils.datastructures import SortedDict from django.utils.datastructures import SortedDict
@ -217,10 +217,10 @@ class ServicoAdmin(BaseModelAdmin):
def response_add(self, request, obj): def response_add(self, request, obj):
opts = obj._meta opts = obj._meta
msg = _(u'The %(name)s "%(obj)s" was added successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)} msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)}
if "_addanother" in request.POST: if "_addanother" in request.POST:
self.message_user(request, msg + ' ' + (_(u"You may add another %s below.") % force_unicode(opts.verbose_name))) self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(opts.verbose_name)))
return HttpResponseRedirect(request.path + '?id_casa=%s' % (obj.casa_legislativa.id,)) return HttpResponseRedirect(request.path + '?id_casa=%s' % (obj.casa_legislativa.id,))
elif "_save" in request.POST: elif "_save" in request.POST:
self.message_user(request, msg) self.message_user(request, msg)
@ -230,10 +230,10 @@ class ServicoAdmin(BaseModelAdmin):
def response_change(self, request, obj): def response_change(self, request, obj):
opts = obj._meta opts = obj._meta
msg = _(u'The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)} msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)}
if "_addanother" in request.POST: if "_addanother" in request.POST:
self.message_user(request, msg + ' ' + (_(u"You may add another %s below.") % force_unicode(opts.verbose_name))) self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(opts.verbose_name)))
return HttpResponseRedirect("../add/?id_casa=%s" % (obj.casa_legislativa.id,)) return HttpResponseRedirect("../add/?id_casa=%s" % (obj.casa_legislativa.id,))
elif "_save" in request.POST: elif "_save" in request.POST:
self.message_user(request, msg) self.message_user(request, msg)
@ -275,11 +275,11 @@ class ServicoAdmin(BaseModelAdmin):
q2 = len(request.session['carrinho_servicos']) q2 = len(request.session['carrinho_servicos'])
quant = q2 - q1 quant = q2 - q1
if quant: if quant:
self.message_user(request, str(q2 - q1) + _(u" Convênios adicionados no carrinho")) self.message_user(request, str(q2 - q1) + _(" Convênios adicionados no carrinho"))
else: else:
self.message_user(request, _(u"Os Convênios selecionados já foram adicionadas anteriormente")) self.message_user(request, _("Os Convênios selecionados já foram adicionadas anteriormente"))
return HttpResponseRedirect('.') return HttpResponseRedirect('.')
adicionar_servicos.short_description = _(u"Armazenar Serviços no carrinho para exportar") adicionar_servicos.short_description = _("Armazenar Serviços no carrinho para exportar")
@ -316,15 +316,15 @@ class CasaAtendidaAdmin(BaseModelAdmin):
def get_servicos(self, obj): def get_servicos(self, obj):
result = [] result = []
for servico in obj.servico_set.all(): for servico in obj.servico_set.all():
result.append(u"%s (%s). %s: %s" % ( result.append("%s (%s). %s: %s" % (
servico.tipo_servico.nome, servico.tipo_servico.nome,
_(u'ativo') if servico.data_desativacao is None else _(u'desativado'), _('ativo') if servico.data_desativacao is None else _('desativado'),
_(u'Contato'), _('Contato'),
servico.contato_administrativo.nome)) servico.contato_administrativo.nome))
return "<ul><li>" + "</li><li>".join(result) + "</li></ul>" return "<ul><li>" + "</li><li>".join(result) + "</li></ul>"
get_servicos.allow_tags = True get_servicos.allow_tags = True
get_servicos.short_description = _(u"Serviços") get_servicos.short_description = _("Serviços")
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
return super(CasaAtendidaAdmin, self).lookup_allowed(lookup, value) or \ return super(CasaAtendidaAdmin, self).lookup_allowed(lookup, value) or \

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

@ -28,7 +28,7 @@ from sigi.apps.servicos.models import Servico
class Command(BaseCommand): class Command(BaseCommand):
help = _(u'Atualiza a informação de data de último serviço dos serviços SEIT hospedados no Interlegis.') help = _('Atualiza a informação de data de último serviço dos serviços SEIT hospedados no Interlegis.')
def handle(self, *args, **options): def handle(self, *args, **options):
verbosity = int(options['verbosity']) verbosity = int(options['verbosity'])
@ -36,4 +36,4 @@ class Command(BaseCommand):
for obj in queryset: for obj in queryset:
obj.atualiza_data_uso() obj.atualiza_data_uso()
if ((verbosity == 1) and (obj.data_ultimo_uso is None)) or (verbosity > 1): if ((verbosity == 1) and (obj.data_ultimo_uso is None)) or (verbosity > 1):
self.stdout.write(u"%s \t %s \t %s\n" % (obj.url, obj.data_ultimo_uso, obj.erro_atualizacao)) self.stdout.write("%s \t %s \t %s\n" % (obj.url, obj.data_ultimo_uso, obj.erro_atualizacao))

30
sigi/apps/servicos/management/commands/importa_servico.py

@ -10,17 +10,17 @@ from sigi.apps.casas.models import Orgao, Funcionario
class Command(BaseCommand): class Command(BaseCommand):
args = "nome_do_arquivo.txt" args = "nome_do_arquivo.txt"
help = u""" help = """
Importa dados de serviços de arquivos TXT gerados pela COTIN. Importa dados de serviços de arquivos TXT gerados pela COTIN.
""" """
def handle(self, *args, **options): def handle(self, *args, **options):
if len(args) != 1: if len(args) != 1:
raise CommandError(u"Informe UM arquivo TXT a importar") raise CommandError("Informe UM arquivo TXT a importar")
file_name = args[0] file_name = args[0]
self.stdout.write(u'Verificando estrutura do arquivo...') self.stdout.write('Verificando estrutura do arquivo...')
if not os.path.isfile(file_name): if not os.path.isfile(file_name):
raise CommandError(u"Arquivo '%s' não encontrado" % file_name) raise CommandError("Arquivo '%s' não encontrado" % file_name)
with open(file_name, 'r') as f: with open(file_name, 'r') as f:
reader = csv.DictReader(f, delimiter=" ") reader = csv.DictReader(f, delimiter=" ")
@ -28,8 +28,8 @@ Importa dados de serviços de arquivos TXT gerados pela COTIN.
not 'NAME' in reader.fieldnames or not 'NAME' in reader.fieldnames or
not 'COD_ORGAO' in reader.fieldnames): not 'COD_ORGAO' in reader.fieldnames):
print reader.fieldnames print reader.fieldnames
raise CommandError(u"Formato inválido do arquivo.") raise CommandError("Formato inválido do arquivo.")
self.stdout.write(u'Estrutura parece ok.') self.stdout.write('Estrutura parece ok.')
self.stdout.write("Preparando dados...") self.stdout.write("Preparando dados...")
casas = { casas = {
to_ascii(c.municipio.nome).replace(' ','').replace('-','').replace("'", '').lower() to_ascii(c.municipio.nome).replace(' ','').replace('-','').replace("'", '').lower()
@ -79,7 +79,7 @@ Importa dados de serviços de arquivos TXT gerados pela COTIN.
if nome_casa.startswith('cm'): if nome_casa.startswith('cm'):
nome_casa = nome_casa.replace('cm','') nome_casa = nome_casa.replace('cm','')
url = u"https://{subdominio}.{dominio}.{sufixo}".format( url = "https://{subdominio}.{dominio}.{sufixo}".format(
subdominio=subdominios[sigla], subdominio=subdominios[sigla],
dominio=dominio, dominio=dominio,
sufixo=sufixo sufixo=sufixo
@ -152,7 +152,7 @@ Importa dados de serviços de arquivos TXT gerados pela COTIN.
try: try:
contato, created = casa.funcionario_set.get_or_create( contato, created = casa.funcionario_set.get_or_create(
setor='contato_interlegis', setor='contato_interlegis',
defaults={'nome': u"<<CRIADO PELA IMPORTAÇÃO DE SERVIÇOS SEIT>>"} defaults={'nome': "<<CRIADO PELA IMPORTAÇÃO DE SERVIÇOS SEIT>>"}
) )
except Funcionario.MultipleObjectsReturned: except Funcionario.MultipleObjectsReturned:
contato = casa.funcionario_set.filter( contato = casa.funcionario_set.filter(
@ -174,8 +174,8 @@ Importa dados de serviços de arquivos TXT gerados pela COTIN.
servico.save() servico.save()
except Servico.MultipleObjectsReturned: except Servico.MultipleObjectsReturned:
self.stdout.write( self.stdout.write(
u"{template} {name} {cod_orgao} mais de um servico " "{template} {name} {cod_orgao} mais de um servico "
u"encontrado ({s})".format( "encontrado ({s})".format(
template=template, template=template,
name=name, name=name,
cod_orgao=cod_orgao, cod_orgao=cod_orgao,
@ -190,14 +190,14 @@ Importa dados de serviços de arquivos TXT gerados pela COTIN.
data_alteracao__lt=agora data_alteracao__lt=agora
).update( ).update(
data_desativacao=agora, data_desativacao=agora,
motivo_desativacao=(u"[AUTOMÁTICO] Não consta da lista " motivo_desativacao=("[AUTOMÁTICO] Não consta da lista "
u"da COTIN") "da COTIN")
) )
else: else:
self.stdout.write( self.stdout.write(
self.style.ERROR(u"Os serviços excendentes não podem ser " self.style.ERROR("Os serviços excendentes não podem ser "
u"desativados porque foram encontradas " "desativados porque foram encontradas "
u"inconsistências no arquivo de origem") "inconsistências no arquivo de origem")
) )

134
sigi/apps/servicos/models.py

@ -8,40 +8,40 @@ from django.utils.translation import gettext as _
class TipoServico(models.Model): class TipoServico(models.Model):
MODO_CHOICES = ( MODO_CHOICES = (
('H', _(u"Hospedagem")), ('H', _("Hospedagem")),
('R', _(u"Registro")) ('R', _("Registro"))
) )
email_help = u'''Use:<br/> email_help = '''Use:<br/>
{url} para incluir a URL do serviço,<br/> {url} para incluir a URL do serviço,<br/>
{senha} para incluir a senha inicial do serviço''' {senha} para incluir a senha inicial do serviço'''
string_pesquisa_help = (u"Parâmetros da pesquisa para averiguar a data da " string_pesquisa_help = ("Parâmetros da pesquisa para averiguar a data da "
u"última atualização do serviço. Formato:<br/>" "última atualização do serviço. Formato:<br/>"
u"<ul><li>/caminho/da/pesquisa/?parametros " "<ul><li>/caminho/da/pesquisa/?parametros "
u"[xml|json] campo.de.data</li>") "[xml|json] campo.de.data</li>")
nome = models.CharField(_(u'nome'), max_length=60) nome = models.CharField(_('nome'), max_length=60)
sigla = models.CharField(_(u'sigla'), max_length='12') sigla = models.CharField(_('sigla'), max_length='12')
modo = models.CharField( modo = models.CharField(
_(u'modo de prestação do serviço'), _('modo de prestação do serviço'),
max_length=1, max_length=1,
choices=MODO_CHOICES choices=MODO_CHOICES
) )
string_pesquisa = models.TextField( string_pesquisa = models.TextField(
_(u'string de pesquisa'), _('string de pesquisa'),
blank=True, blank=True,
help_text=string_pesquisa_help help_text=string_pesquisa_help
) )
template_email_ativa = models.TextField(_(u'Template de email de ativação'), help_text=email_help, blank=True) template_email_ativa = models.TextField(_('Template de email de ativação'), help_text=email_help, blank=True)
template_email_altera = models.TextField(_(u'Template de email de alteração'), help_text=email_help, blank=True) template_email_altera = models.TextField(_('Template de email de alteração'), help_text=email_help, blank=True)
template_email_desativa = models.TextField(_(u'Template de email de desativação'), help_text=email_help + _(u'<br/>{motivo} para incluir o motivo da desativação do serviço'), blank=True) template_email_desativa = models.TextField(_('Template de email de desativação'), help_text=email_help + _('<br/>{motivo} para incluir o motivo da desativação do serviço'), blank=True)
@property @property
def qtde_casas_atendidas(self): def qtde_casas_atendidas(self):
u"""Quantidade de casas atendidas""" """Quantidade de casas atendidas"""
return self.servico_set.filter(data_desativacao=None).count() return self.servico_set.filter(data_desativacao=None).count()
class Meta: class Meta:
verbose_name = _(u'Tipo de serviço') verbose_name = _('Tipo de serviço')
verbose_name_plural = _(u'Tipos de serviço') verbose_name_plural = _('Tipos de serviço')
def __unicode__(self): def __unicode__(self):
return self.nome return self.nome
@ -51,75 +51,75 @@ class Servico(models.Model):
casa_legislativa = models.ForeignKey( casa_legislativa = models.ForeignKey(
Orgao, Orgao,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Casa Legislativa') verbose_name=_('Casa Legislativa')
) )
tipo_servico = models.ForeignKey( tipo_servico = models.ForeignKey(
TipoServico, TipoServico,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Tipo de serviço') verbose_name=_('Tipo de serviço')
) )
contato_tecnico = models.ForeignKey( contato_tecnico = models.ForeignKey(
Funcionario, Funcionario,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Contato técnico'), verbose_name=_('Contato técnico'),
related_name='contato_tecnico' related_name='contato_tecnico'
) )
contato_administrativo = models.ForeignKey( contato_administrativo = models.ForeignKey(
Funcionario, Funcionario,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_(u'Contato administrativo'), verbose_name=_('Contato administrativo'),
related_name='contato_administrativo' related_name='contato_administrativo'
) )
url = models.URLField(_(u'URL do serviço'), blank=True) url = models.URLField(_('URL do serviço'), blank=True)
hospedagem_interlegis = models.BooleanField( hospedagem_interlegis = models.BooleanField(
_(u'Hospedagem no Interlegis?'), _('Hospedagem no Interlegis?'),
default=False default=False
) )
nome_servidor = models.CharField( nome_servidor = models.CharField(
_(u'Hospedado em'), _('Hospedado em'),
max_length=60, max_length=60,
blank=True, blank=True,
help_text=_(u'Se hospedado no Interlegis, informe o nome do servidor.' help_text=_('Se hospedado no Interlegis, informe o nome do servidor.'
u'<br/>Senão, informe o nome do provedor de serviços.') '<br/>Senão, informe o nome do provedor de serviços.')
) )
porta_servico = models.PositiveSmallIntegerField( porta_servico = models.PositiveSmallIntegerField(
_(u'Porta de serviço (instância)'), _('Porta de serviço (instância)'),
blank=True, blank=True,
null=True null=True
) )
senha_inicial = models.CharField( senha_inicial = models.CharField(
_(u'Senha inicial'), _('Senha inicial'),
max_length=33, max_length=33,
blank=True blank=True
) )
data_ativacao = models.DateField(_(u'Data de ativação'), default=date.today) data_ativacao = models.DateField(_('Data de ativação'), default=date.today)
data_alteracao = models.DateField( data_alteracao = models.DateField(
_(u'Data da última alteração'), _('Data da última alteração'),
blank=True, blank=True,
null=True, null=True,
auto_now=True auto_now=True
) )
data_desativacao = models.DateField( data_desativacao = models.DateField(
_(u'Data de desativação'), _('Data de desativação'),
blank=True, blank=True,
null=True null=True
) )
motivo_desativacao = models.TextField( motivo_desativacao = models.TextField(
_(u'Motivo da desativação'), _('Motivo da desativação'),
blank=True blank=True
) )
data_ultimo_uso = models.DateField( data_ultimo_uso = models.DateField(
_(u'Data da última utilização'), _('Data da última utilização'),
blank=True, blank=True,
null=True, null=True,
help_text=_(u'Data em que o serviço foi utilizado pela Casa Legislativa' help_text=_('Data em que o serviço foi utilizado pela Casa Legislativa'
u' pela última vez') ' pela última vez')
) )
erro_atualizacao = models.TextField( erro_atualizacao = models.TextField(
_(u"Erro na atualização"), _("Erro na atualização"),
blank=True, blank=True,
help_text=_(u"Erro ocorrido na última tentativa de verificar a data " help_text=_("Erro ocorrido na última tentativa de verificar a data "
u"de última atualização do serviço") "de última atualização do serviço")
) )
# casa_legislativa.casa_uf_filter = True # casa_legislativa.casa_uf_filter = True
@ -140,8 +140,8 @@ class Servico(models.Model):
if len(param_pesquisa) != 3: if len(param_pesquisa) != 3:
return { return {
'data': '', 'data': '',
'erro':_(u"String de pesquisa mal configurada"), 'erro':_("String de pesquisa mal configurada"),
'comment':_(u"Corrija a string de pesquisa") 'comment':_("Corrija a string de pesquisa")
} }
campos = [int(s) if s.isdigit() else s for s in campos = [int(s) if s.isdigit() else s for s in
param_pesquisa[2].split('.')] param_pesquisa[2].split('.')]
@ -154,9 +154,9 @@ class Servico(models.Model):
return { return {
'data': '', 'data': '',
'erro':str(e), 'erro':str(e),
'comment':_(u"Não foi possível conectar com o servidor. " 'comment':_("Não foi possível conectar com o servidor. "
u"Pode estar fora do ar ou não ser " "Pode estar fora do ar ou não ser "
u"um {tipo}".format( "um {tipo}".format(
tipo=self.tipo_servico.nome)) tipo=self.tipo_servico.nome))
} }
@ -164,8 +164,8 @@ class Servico(models.Model):
return { return {
'data': '', 'data': '',
'erro': req.reason, 'erro': req.reason,
'comment':_(u"Não foi possível receber os dados do " 'comment':_("Não foi possível receber os dados do "
u"servidor. O acesso pode ter sido negado.") "servidor. O acesso pode ter sido negado.")
} }
try: try:
@ -176,7 +176,7 @@ class Servico(models.Model):
else: else:
return { return {
'data': '', 'data': '',
'erro': _(u'String de pesquisa mal configurada'), 'erro': _('String de pesquisa mal configurada'),
'comment': '' 'comment': ''
} }
@ -185,8 +185,8 @@ class Servico(models.Model):
if (len(data)-1) < c: if (len(data)-1) < c:
return { return {
'data': '', 'data': '',
'erro': _(u'Sem dados para verificação'), 'erro': _('Sem dados para verificação'),
'comment': _(u'Parece que nunca foi usado') 'comment': _('Parece que nunca foi usado')
} }
data = data[c] data = data[c]
else: else:
@ -204,7 +204,7 @@ class Servico(models.Model):
return { return {
'data': '', 'data': '',
'erro': str(e), 'erro': str(e),
'comment': _(u"Parece que não é um {tipo}".format( 'comment': _("Parece que não é um {tipo}".format(
tipo=self.tipo_servico.nome)) tipo=self.tipo_servico.nome))
} }
@ -216,7 +216,7 @@ class Servico(models.Model):
if not url: if not url:
reset() reset()
self.erro_atualizacao = _(u"Serviço sem URL") self.erro_atualizacao = _("Serviço sem URL")
self.save() self.save()
return return
@ -234,7 +234,7 @@ class Servico(models.Model):
# Nenhuma busca deu resultado, guardar log de erro # Nenhuma busca deu resultado, guardar log de erro
self.data_ultimo_uso = None self.data_ultimo_uso = None
self.erro_atualizacao = "<br/>".join(set( self.erro_atualizacao = "<br/>".join(set(
[u"{erro} ({comment})".format(erro=r['erro'], ["{erro} ({comment})".format(erro=r['erro'],
comment=r['comment']) comment=r['comment'])
for r in resultados if r['erro'] != '' and r['comment'] != '' for r in resultados if r['erro'] != '' and r['comment'] != ''
])) ]))
@ -248,7 +248,7 @@ class Servico(models.Model):
return return
def __unicode__(self): def __unicode__(self):
return "%s (%s)" % (self.tipo_servico.nome, _(u'ativo') if self.data_desativacao is None else _(u'Desativado')) return "%s (%s)" % (self.tipo_servico.nome, _('ativo') if self.data_desativacao is None else _('Desativado'))
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
# Reter o objeto original para verificar mudanças # Reter o objeto original para verificar mudanças
@ -258,11 +258,11 @@ class Servico(models.Model):
if self.id is None: if self.id is None:
# Novo serviço, email de ativação # Novo serviço, email de ativação
subject = _(u'INTERLEGIS - Ativação de serviço %s') % (self.tipo_servico.nome,) subject = _('INTERLEGIS - Ativação de serviço %s') % (self.tipo_servico.nome,)
body = self.tipo_servico.template_email_ativa body = self.tipo_servico.template_email_ativa
elif self.data_desativacao is not None and original.data_desativacao is None: elif self.data_desativacao is not None and original.data_desativacao is None:
# Serviço foi desativado. Email de desativação # Serviço foi desativado. Email de desativação
subject = _(u'INTERLEGIS - Desativação de serviço %s') % (self.tipo_servico.nome,) subject = _('INTERLEGIS - Desativação de serviço %s') % (self.tipo_servico.nome,)
body = self.tipo_servico.template_email_desativa body = self.tipo_servico.template_email_desativa
elif (self.tipo_servico != original.tipo_servico or elif (self.tipo_servico != original.tipo_servico or
self.contato_tecnico != original.contato_tecnico or self.contato_tecnico != original.contato_tecnico or
@ -270,7 +270,7 @@ class Servico(models.Model):
self.nome_servidor != original.nome_servidor or self.nome_servidor != original.nome_servidor or
self.senha_inicial != original.senha_inicial): self.senha_inicial != original.senha_inicial):
# Serviço foi alterado # Serviço foi alterado
subject = _(u'INTERLEGIS - Alteração de serviço %s') % (self.tipo_servico.nome,) subject = _('INTERLEGIS - Alteração de serviço %s') % (self.tipo_servico.nome,)
body = self.tipo_servico.template_email_altera body = self.tipo_servico.template_email_altera
else: else:
# Salvar o Servico # Salvar o Servico
@ -295,18 +295,18 @@ class LogServico(models.Model):
servico = models.ForeignKey( servico = models.ForeignKey(
Servico, Servico,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name=_(u'Serviço') verbose_name=_('Serviço')
) )
descricao = models.CharField(_(u'Breve descrição da ação'), max_length=60) descricao = models.CharField(_('Breve descrição da ação'), max_length=60)
data = models.DateField(_(u'Data da ação'), default=date.today) data = models.DateField(_('Data da ação'), default=date.today)
log = models.TextField(_(u'Log da ação')) log = models.TextField(_('Log da ação'))
def __unicode__(self): def __unicode__(self):
return "%s (%s)" % (self.descricao, self.data) return "%s (%s)" % (self.descricao, self.data)
class Meta: class Meta:
verbose_name = _(u'Log do serviço') verbose_name = _('Log do serviço')
verbose_name_plural = _(u'Logs do serviço') verbose_name_plural = _('Logs do serviço')
class CasaAtendidaManager(models.Manager): class CasaAtendidaManager(models.Manager):
@ -321,7 +321,7 @@ class CasaAtendida(Orgao):
class Meta: class Meta:
proxy = True proxy = True
verbose_name_plural = _(u'Casas atendidas') verbose_name_plural = _('Casas atendidas')
objects = CasaAtendidaManager() objects = CasaAtendidaManager()
@ -330,16 +330,16 @@ class CasaManifesta(models.Model):
casa_legislativa = models.OneToOneField(Orgao, on_delete=models.CASCADE) casa_legislativa = models.OneToOneField(Orgao, on_delete=models.CASCADE)
data_manifestacao = models.DateTimeField(auto_now_add=True) data_manifestacao = models.DateTimeField(auto_now_add=True)
data_atualizacao = models.DateTimeField(auto_now=True) data_atualizacao = models.DateTimeField(auto_now=True)
informante = models.CharField(_(u'Nome do informante'), max_length=100, blank=True) informante = models.CharField(_('Nome do informante'), max_length=100, blank=True)
cargo = models.CharField(_(u'Cargo do informante'), max_length=100, blank=True) cargo = models.CharField(_('Cargo do informante'), max_length=100, blank=True)
email = models.EmailField(_(u'E-mail de contato'), blank=True) email = models.EmailField(_('E-mail de contato'), blank=True)
class ServicoManifesto(models.Model): class ServicoManifesto(models.Model):
casa_manifesta = models.ForeignKey(CasaManifesta, on_delete=models.CASCADE) casa_manifesta = models.ForeignKey(CasaManifesta, on_delete=models.CASCADE)
servico = models.ForeignKey(TipoServico, on_delete=models.CASCADE) servico = models.ForeignKey(TipoServico, on_delete=models.CASCADE)
url = models.URLField(blank=True) url = models.URLField(blank=True)
hospedagem_interlegis = models.BooleanField(_(u'Hospedagem no Interlegis?'), default=False) hospedagem_interlegis = models.BooleanField(_('Hospedagem no Interlegis?'), default=False)
class Meta: class Meta:
unique_together = ('casa_manifesta', 'servico') unique_together = ('casa_manifesta', 'servico')
@ -352,5 +352,5 @@ class RegistroServico(models.Model):
data_registro = models.DateTimeField(auto_now=True) data_registro = models.DateTimeField(auto_now=True)
class Meta: class Meta:
verbose_name_plural = _(u'Registro de serviços') verbose_name_plural = _('Registro de serviços')

48
sigi/apps/servicos/views.py

@ -90,9 +90,9 @@ def casa_manifesta_view(request):
fieldsets = ((None, ('informante', 'cargo', 'email'),),) fieldsets = ((None, ('informante', 'cargo', 'email'),),)
for ts in TipoServico.objects.all(): for ts in TipoServico.objects.all():
campos['possui_%s' % ts.pk] = forms.BooleanField(label=_(u'Possui o serviço de %s') % ts.nome, required=False) campos['possui_%s' % ts.pk] = forms.BooleanField(label=_('Possui o serviço de %s') % ts.nome, required=False)
campos['url_%s' % ts.pk] = forms.URLField(label=_(u'Informe a URL'), required=False) campos['url_%s' % ts.pk] = forms.URLField(label=_('Informe a URL'), required=False)
campos['hospedagem_interlegis_%s' % ts.pk] = forms.BooleanField(label=_(u'Serviço está hospedado no Interlegis'), required=False) campos['hospedagem_interlegis_%s' % ts.pk] = forms.BooleanField(label=_('Serviço está hospedado no Interlegis'), required=False)
fieldsets += ((ts.nome, ('possui_%s' % ts.pk, 'url_%s' % ts.pk, 'hospedagem_interlegis_%s' % ts.pk)),) fieldsets += ((ts.nome, ('possui_%s' % ts.pk, 'url_%s' % ts.pk, 'hospedagem_interlegis_%s' % ts.pk)),)
CasaManifestaForm = type('', (CasaManifestaProtoForm,), campos) CasaManifestaForm = type('', (CasaManifestaProtoForm,), campos)
@ -106,21 +106,21 @@ def casa_manifesta_view(request):
cm.cargo = cmf.cleaned_data['cargo'] cm.cargo = cmf.cleaned_data['cargo']
cm.email = cmf.cleaned_data['email'] cm.email = cmf.cleaned_data['email']
cm.save() cm.save()
thanks.append((_(u'Informante'), cmf.cleaned_data['informante'])) thanks.append((_('Informante'), cmf.cleaned_data['informante']))
thanks.append((_(u'Cargo'), cmf.cleaned_data['cargo'])) thanks.append((_('Cargo'), cmf.cleaned_data['cargo']))
thanks.append((_(u'E-mail'), cmf.cleaned_data['email'])) thanks.append((_('E-mail'), cmf.cleaned_data['email']))
for ts in TipoServico.objects.all(): for ts in TipoServico.objects.all():
if cmf.cleaned_data['possui_%s' % ts.pk]: if cmf.cleaned_data['possui_%s' % ts.pk]:
sm, created = ServicoManifesto.objects.get_or_create(casa_manifesta=cm, servico=ts) sm, created = ServicoManifesto.objects.get_or_create(casa_manifesta=cm, servico=ts)
sm.url = cmf.cleaned_data['url_%s' % ts.pk] sm.url = cmf.cleaned_data['url_%s' % ts.pk]
sm.hospedagem_interlegis = cmf.cleaned_data['hospedagem_interlegis_%s' % ts.pk] sm.hospedagem_interlegis = cmf.cleaned_data['hospedagem_interlegis_%s' % ts.pk]
sm.save() sm.save()
thanks.append((ts.nome, _(u'Possui o serviço acessível em %(url)s %(obs)s') % dict( thanks.append((ts.nome, _('Possui o serviço acessível em %(url)s %(obs)s') % dict(
url=sm.url, url=sm.url,
obs=_(u'hospedado no Interlegis') if sm.hospedagem_interlegis else ''))) obs=_('hospedado no Interlegis') if sm.hospedagem_interlegis else '')))
else: else:
ServicoManifesto.objects.filter(casa_manifesta=cm, servico=ts).delete() ServicoManifesto.objects.filter(casa_manifesta=cm, servico=ts).delete()
thanks.append((ts.nome, _(u'Não possui'))) thanks.append((ts.nome, _('Não possui')))
extra_context = {'casa': casa, 'thanks': thanks} extra_context = {'casa': casa, 'thanks': thanks}
else: else:
extra_context = {'casa': casa, 'cmf': cmf} extra_context = {'casa': casa, 'cmf': cmf}
@ -198,7 +198,7 @@ def adicionar_servicos_carrinho(request, queryset=None, id=None):
def excluir_carrinho(request): def excluir_carrinho(request):
if 'carrinho_servicos' in request.session: if 'carrinho_servicos' in request.session:
del request.session['carrinho_servicos'] del request.session['carrinho_servicos']
messages.info(request, u'O carrinho foi esvaziado') messages.info(request, 'O carrinho foi esvaziado')
return HttpResponseRedirect('../../') return HttpResponseRedirect('../../')
@login_required @login_required
@ -282,31 +282,31 @@ def export_csv(request):
if not servicos: if not servicos:
return HttpResponseRedirect('../') return HttpResponseRedirect('../')
atributos = [_(u"Casa Legislativa"), _(u"Contato Interlegis"), _(u"Produto"), atributos = [_("Casa Legislativa"), _("Contato Interlegis"), _("Produto"),
_(u"Data de Ativação"), ] _("Data de Ativação"), ]
if request.POST: if request.POST:
atributos = request.POST.getlist("itens_csv_selected") atributos = request.POST.getlist("itens_csv_selected")
col_titles = atributos col_titles = atributos
if _(u"Casa Legislativa") in col_titles: if _("Casa Legislativa") in col_titles:
pos = col_titles.index(_(u"Casa Legislativa")) + 1 pos = col_titles.index(_("Casa Legislativa")) + 1
col_titles.insert(pos, _(u"uf")) col_titles.insert(pos, _("uf"))
pos+=1 pos+=1
col_titles.insert(pos, _(u"email")) col_titles.insert(pos, _("email"))
pos+=1 pos+=1
col_titles.insert(pos, _(u"telefone")) col_titles.insert(pos, _("telefone"))
if _(u"Contato Interlegis") in col_titles: if _("Contato Interlegis") in col_titles:
pos = col_titles.index(_(u"Contato Interlegis")) + 1 pos = col_titles.index(_("Contato Interlegis")) + 1
col_titles.insert(pos, _(u"Email do contato")) col_titles.insert(pos, _("Email do contato"))
csv_writer.writerow([s.encode("utf-8") for s in col_titles]) csv_writer.writerow([s.encode("utf-8") for s in col_titles])
for servico in servicos: for servico in servicos:
lista = [] lista = []
for atributo in atributos: for atributo in atributos:
if _(u"Casa Legislativa") == atributo: if _("Casa Legislativa") == atributo:
lista.append(servico.casa_legislativa.nome.encode("utf-8")) lista.append(servico.casa_legislativa.nome.encode("utf-8"))
lista.append(servico.casa_legislativa.municipio.uf.sigla.encode("utf-8")) lista.append(servico.casa_legislativa.municipio.uf.sigla.encode("utf-8"))
lista.append(servico.casa_legislativa.email.encode("utf-8")) lista.append(servico.casa_legislativa.email.encode("utf-8"))
@ -314,16 +314,16 @@ def export_csv(request):
lista.append(servico.casa_legislativa.telefone) lista.append(servico.casa_legislativa.telefone)
else: else:
lista.append("") lista.append("")
elif _(u"Contato Interlegis") == atributo: elif _("Contato Interlegis") == atributo:
if servico.casa_legislativa.contato_interlegis is not None: if servico.casa_legislativa.contato_interlegis is not None:
lista.append(servico.casa_legislativa.contato_interlegis) lista.append(servico.casa_legislativa.contato_interlegis)
lista.append(servico.casa_legislativa.contato_interlegis.email.encode("utf-8")) lista.append(servico.casa_legislativa.contato_interlegis.email.encode("utf-8"))
else: else:
lista.append("") lista.append("")
lista.append("") lista.append("")
elif _(u"Produto") == atributo: elif _("Produto") == atributo:
lista.append(servico.tipo_servico.nome.encode("utf-8")) lista.append(servico.tipo_servico.nome.encode("utf-8"))
elif _(u"Data de Ativação") == atributo: elif _("Data de Ativação") == atributo:
data = '' data = ''
if servico.data_ativacao: if servico.data_ativacao:
data = servico.data_ativacao.strftime("%d/%m/%Y") data = servico.data_ativacao.strftime("%d/%m/%Y")

24
sigi/apps/servidores/admin.py

@ -10,15 +10,15 @@ from sigi.apps.utils.base_admin import BaseModelAdmin
from sigi.apps.utils.filters import AlphabeticFilter from sigi.apps.utils.filters import AlphabeticFilter
class ServidorFilter(AlphabeticFilter): class ServidorFilter(AlphabeticFilter):
title = _(u'Nome do Servidor') title = _('Nome do Servidor')
parameter_name = 'servidor__nome_completo' parameter_name = 'servidor__nome_completo'
class ServicoFilter(admin.SimpleListFilter): class ServicoFilter(admin.SimpleListFilter):
title = _(u"Subordinados à") title = _("Subordinados à")
parameter_name = 'subordinado__id__exact' parameter_name = 'subordinado__id__exact'
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
return ([('None', _(u"Nenhum"))] + return ([('None', _("Nenhum"))] +
[(s.id, s.nome) for s in Servico.objects.exclude(servico=None)]) [(s.id, s.nome) for s in Servico.objects.exclude(servico=None)])
def queryset(self, request, queryset): def queryset(self, request, queryset):
@ -47,10 +47,10 @@ class ServidorInline(admin.TabularInline):
def imagem_foto(sels, servidor): def imagem_foto(sels, servidor):
if servidor.foto: if servidor.foto:
return u'<img src="{url}" style="height: 60px; width: 60px; border-radius: 50%;">'.format(url=servidor.foto.url) return '<img src="{url}" style="height: 60px; width: 60px; border-radius: 50%;">'.format(url=servidor.foto.url)
else: else:
return u"" return ""
imagem_foto.short_description = _(u"foto") imagem_foto.short_description = _("foto")
imagem_foto.allow_tags = True imagem_foto.allow_tags = True
def is_active(self, servidor): def is_active(self, servidor):
@ -60,7 +60,7 @@ class ServidorInline(admin.TabularInline):
return False return False
is_active.admin_order_field = 'user__is_active' is_active.admin_order_field = 'user__is_active'
is_active.boolean = True is_active.boolean = True
is_active.short_description = _(u'ativo') is_active.short_description = _('ativo')
@admin.register(Servico) @admin.register(Servico)
@ -83,7 +83,7 @@ class ServidorAdmin(BaseModelAdmin):
(None, { (None, {
'fields': ('user', 'nome_completo', 'foto', 'servico',) 'fields': ('user', 'nome_completo', 'foto', 'servico',)
}), }),
(_(u"outros órgãos"), { (_("outros órgãos"), {
'fields': ('externo', 'orgao_origem', 'qualificacoes'), 'fields': ('externo', 'orgao_origem', 'qualificacoes'),
}), }),
) )
@ -109,12 +109,12 @@ class ServidorAdmin(BaseModelAdmin):
return False return False
is_active.admin_order_field = 'user__is_active' is_active.admin_order_field = 'user__is_active'
is_active.boolean = True is_active.boolean = True
is_active.short_description = _(u'ativo') is_active.short_description = _('ativo')
def imagem_foto(sels, servidor): def imagem_foto(sels, servidor):
if servidor.foto: if servidor.foto:
return u'<img src="{url}" style="height: 60px; width: 60px; border-radius: 50%;">'.format(url=servidor.foto.url) return '<img src="{url}" style="height: 60px; width: 60px; border-radius: 50%;">'.format(url=servidor.foto.url)
else: else:
return u"" return ""
imagem_foto.short_description = _(u"foto") imagem_foto.short_description = _("foto")
imagem_foto.allow_tags = True imagem_foto.allow_tags = True

4
sigi/apps/servidores/forms.py

@ -10,7 +10,7 @@ from sigi.apps.servidores.models import Ferias, Licenca, Funcao, Servidor
def valida_data_inicial_menor_que_final(data, chave_ini, chave_fim): def valida_data_inicial_menor_que_final(data, chave_ini, chave_fim):
if data.get(chave_ini) >= data.get(chave_fim): if data.get(chave_ini) >= data.get(chave_fim):
raise forms.ValidationError(_( raise forms.ValidationError(_(
u"A data de início deve ser menor que a data final. Verifique novamente")) "A data de início deve ser menor que a data final. Verifique novamente"))
class FeriasForm(forms.ModelForm): class FeriasForm(forms.ModelForm):
@ -62,5 +62,5 @@ class FuncaoForm(forms.ModelForm):
Periodo(funcao.inicio_funcao, funcao.fim_funcao), Periodo(funcao.inicio_funcao, funcao.fim_funcao),
Periodo(data.get('inicio_funcao'), data.get('fim_funcao'))): Periodo(data.get('inicio_funcao'), data.get('fim_funcao'))):
raise forms.ValidationError(_( raise forms.ValidationError(_(
u"Este período coincide com o de outra função exercida.")) "Este período coincide com o de outra função exercida."))
return data return data

30
sigi/apps/servidores/management/commands/mescla_servidor.py

@ -4,12 +4,12 @@ from sigi.apps.servidores.models import Servidor
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
class Command(BaseCommand): class Command(BaseCommand):
help = u'Transfere os dados do servidor OLD para o servidor NEW.' help = 'Transfere os dados do servidor OLD para o servidor NEW.'
args = u'old_id new_id' args = 'old_id new_id'
def handle(self, *args, **options): def handle(self, *args, **options):
if len(args) != 2: if len(args) != 2:
self.stderr.write(u"Informe old_id e new_id") self.stderr.write("Informe old_id e new_id")
return return
old_id = args[0] old_id = args[0]
@ -19,42 +19,42 @@ class Command(BaseCommand):
new = Servidor.objects.get(id=new_id) new = Servidor.objects.get(id=new_id)
self.stdout.write(self.style.WARNING( self.stdout.write(self.style.WARNING(
u"Transferir dados de {old_name} para {new_name}".format( "Transferir dados de {old_name} para {new_name}".format(
old_name=old.nome_completo, old_name=old.nome_completo,
new_name=new.nome_completo new_name=new.nome_completo
) )
)) ))
self.stdout.write(u"\t* Transferindo a carteira de atendimento...") self.stdout.write("\t* Transferindo a carteira de atendimento...")
for casa in old.casas_que_gerencia.all(): for casa in old.casas_que_gerencia.all():
new.casas_que_gerencia.add(casa) new.casas_que_gerencia.add(casa)
old.casas_que_gerencia.remove(casa) old.casas_que_gerencia.remove(casa)
self.stdout.write(u"\t* Transferindo ocorrências registradas...") self.stdout.write("\t* Transferindo ocorrências registradas...")
old.ocorrencia_set.all().update(servidor_registro=new) old.ocorrencia_set.all().update(servidor_registro=new)
self.stdout.write(u"\t* Transferindo comentários de ocorrências...") self.stdout.write("\t* Transferindo comentários de ocorrências...")
old.comentario_set.all().update(usuario=new) old.comentario_set.all().update(usuario=new)
self.stdout.write(u"\t* Transferindo convênios geridos...") self.stdout.write("\t* Transferindo convênios geridos...")
old.convenio_set.all().update(servidor_gestao=new) old.convenio_set.all().update(servidor_gestao=new)
self.stdout.write(u"\t* Transferindo convênios acompanhados...") self.stdout.write("\t* Transferindo convênios acompanhados...")
old.convenio_set.all().update(acompanha=new) old.convenio_set.all().update(acompanha=new)
self.stdout.write(u"\t* Transferindo participação em eventos...") self.stdout.write("\t* Transferindo participação em eventos...")
old.equipe_evento.all().update(membro=new) old.equipe_evento.all().update(membro=new)
self.stdout.write(u"\t* Transferindo convites para eventos...") self.stdout.write("\t* Transferindo convites para eventos...")
old.convite_set.all().update(servidor=new) old.convite_set.all().update(servidor=new)
self.stdout.write(u"\t* Transferindo diagnósticos...") self.stdout.write("\t* Transferindo diagnósticos...")
old.diagnostico_set.all().update(responsavel=new) old.diagnostico_set.all().update(responsavel=new)
self.stdout.write(u"\t* Transferindo participação em diagnósticos...") self.stdout.write("\t* Transferindo participação em diagnósticos...")
old.equipe_set.all().update(membro=new) old.equipe_set.all().update(membro=new)
self.stdout.write(u"\t* Transferindo dados de autenticação...") self.stdout.write("\t* Transferindo dados de autenticação...")
if new.user: if new.user:
old.user.logentry_set.all().update(user=new) old.user.logentry_set.all().update(user=new)
@ -65,4 +65,4 @@ class Command(BaseCommand):
old.user = None old.user = None
old.save() old.save()
self.stdout.write(u"Concluído!") self.stdout.write("Concluído!")

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

@ -24,7 +24,7 @@ class MigrationError(Exception):
class Command(BaseCommand): class Command(BaseCommand):
help = _(u'Migra usuários do antigo Sistema de RH') help = _('Migra usuários do antigo Sistema de RH')
def to_date(self, data): def to_date(self, data):
return datetime.strptime(data, "%Y-%m-%d 00:00:00") return datetime.strptime(data, "%Y-%m-%d 00:00:00")

2
sigi/apps/servidores/management/commands/sync_ldap.py

@ -8,7 +8,7 @@ from sigi.settings import *
class Command(BaseCommand): class Command(BaseCommand):
help = u'Sincroniza Usuários e Servidores com o LDAP' help = 'Sincroniza Usuários e Servidores com o LDAP'
def handle(self, *args, **options): def handle(self, *args, **options):
self.sync_groups() self.sync_groups()

40
sigi/apps/servidores/management/commands/test_sync_ldap.py

@ -52,37 +52,37 @@ ALEX_LDAP, BRUNO_LDAP, RITA_LDAP = [
# new user from ldap is created # new user from ldap is created
([], ([],
[ALEX_LDAP], [ALEX_LDAP],
[(u'alexlima', u'Alex Lima', u'Alex', u'Lima', u'alexlima@interlegis.leg.br')], [('alexlima', 'Alex Lima', 'Alex', 'Lima', 'alexlima@interlegis.leg.br')],
u''' '''
User 'alexlima' created. User 'alexlima' created.
Users are synchronized. Users are synchronized.
'''), '''),
# nothing changes # nothing changes
([(u'alexlima', u'Alex Lima', u'Alex', u'Lima', u'alexlima@interlegis.leg.br')], ([('alexlima', 'Alex Lima', 'Alex', 'Lima', 'alexlima@interlegis.leg.br')],
[ALEX_LDAP], [ALEX_LDAP],
[(u'alexlima', u'Alex Lima', u'Alex', u'Lima', u'alexlima@interlegis.leg.br')], [('alexlima', 'Alex Lima', 'Alex', 'Lima', 'alexlima@interlegis.leg.br')],
u''' '''
Users are synchronized. Users are synchronized.
'''), '''),
# unicode encoding from LDAP data works well # unicode encoding from LDAP data works well
([('claudia', u'Cláudia de Cássia', u'Cláudia', u'de Cássia', 'claudia@interlegis.leg.br', )], ([('claudia', 'Cláudia de Cássia', 'Cláudia', 'de Cássia', 'claudia@interlegis.leg.br', )],
[RITA_LDAP], [RITA_LDAP],
[(u'claudia', u'Cláudia de Cássia', u'Cláudia', u'de Cássia', u'claudia@interlegis.leg.br', )], [('claudia', 'Cláudia de Cássia', 'Cláudia', 'de Cássia', 'claudia@interlegis.leg.br', )],
u''' '''
Users are synchronized. Users are synchronized.
'''), '''),
# update: full name, first name, last name, email # update: full name, first name, last name, email
([('alexlima', '___', '___', '___', '___', ), ([('alexlima', '___', '___', '___', '___', ),
('bruno', 'Bruno Almeida Prado', '___', 'Almeida Prado', '___', ), ('bruno', 'Bruno Almeida Prado', '___', 'Almeida Prado', '___', ),
('claudia', '___', u'Cláudia', '___', 'claudia@interlegis.leg.br', )], ('claudia', '___', 'Cláudia', '___', 'claudia@interlegis.leg.br', )],
[ALEX_LDAP, BRUNO_LDAP, RITA_LDAP], [ALEX_LDAP, BRUNO_LDAP, RITA_LDAP],
[(u'alexlima', u'Alex Lima', u'Alex', u'Lima', u'alexlima@interlegis.leg.br', ), [('alexlima', 'Alex Lima', 'Alex', 'Lima', 'alexlima@interlegis.leg.br', ),
(u'bruno', u'Bruno Almeida Prado', u'Bruno', u'Almeida Prado', u'bruno@interlegis.leg.br', ), ('bruno', 'Bruno Almeida Prado', 'Bruno', 'Almeida Prado', 'bruno@interlegis.leg.br', ),
(u'claudia', u'Cláudia de Cássia', u'Cláudia', u'de Cássia', u'claudia@interlegis.leg.br', )], ('claudia', 'Cláudia de Cássia', 'Cláudia', 'de Cássia', 'claudia@interlegis.leg.br', )],
u''' '''
User 'alexlima' first name updated. User 'alexlima' first name updated.
User 'alexlima' last name updated. User 'alexlima' last name updated.
User 'alexlima' email updated. User 'alexlima' email updated.
@ -106,14 +106,14 @@ Users are synchronized.
# user not present in ldap is NOT deleted # user not present in ldap is NOT deleted
([(u'alexlima', u'Alex Lima', u'Alex', u'Lima', u'alexlima@interlegis.leg.br', ), ([('alexlima', 'Alex Lima', 'Alex', 'Lima', 'alexlima@interlegis.leg.br', ),
(u'bruno', u'Bruno Almeida Prado', u'Bruno', u'Almeida Prado', u'bruno@interlegis.leg.br', ), ('bruno', 'Bruno Almeida Prado', 'Bruno', 'Almeida Prado', 'bruno@interlegis.leg.br', ),
(u'claudia', u'Cláudia de Cássia', u'Cláudia', u'de Cássia', u'claudia@interlegis.leg.br', )], ('claudia', 'Cláudia de Cássia', 'Cláudia', 'de Cássia', 'claudia@interlegis.leg.br', )],
[ALEX_LDAP, RITA_LDAP], [ALEX_LDAP, RITA_LDAP],
[(u'alexlima', u'Alex Lima', u'Alex', u'Lima', u'alexlima@interlegis.leg.br', ), [('alexlima', 'Alex Lima', 'Alex', 'Lima', 'alexlima@interlegis.leg.br', ),
(u'bruno', u'Bruno Almeida Prado', u'Bruno', u'Almeida Prado', u'bruno@interlegis.leg.br', ), ('bruno', 'Bruno Almeida Prado', 'Bruno', 'Almeida Prado', 'bruno@interlegis.leg.br', ),
(u'claudia', u'Cláudia de Cássia', u'Cláudia', u'de Cássia', u'claudia@interlegis.leg.br', )], ('claudia', 'Cláudia de Cássia', 'Cláudia', 'de Cássia', 'claudia@interlegis.leg.br', )],
u''' '''
Users are synchronized. Users are synchronized.
'''), '''),
]) ])

16
sigi/apps/servidores/models.py

@ -5,14 +5,14 @@ from django.db.models.signals import post_save, pre_save
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
class Servico(models.Model): class Servico(models.Model):
nome = models.CharField(_(u'Setor'), max_length=250, null=True) nome = models.CharField(_('Setor'), max_length=250, null=True)
sigla = models.CharField(max_length=10, null=True) sigla = models.CharField(max_length=10, null=True)
subordinado = models.ForeignKey( subordinado = models.ForeignKey(
'self', 'self',
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
null=True, null=True,
blank=True, blank=True,
verbose_name=_(u"subordinado a") verbose_name=_("subordinado a")
) )
responsavel = models.ForeignKey( responsavel = models.ForeignKey(
'servidores.Servidor', 'servidores.Servidor',
@ -24,11 +24,11 @@ class Servico(models.Model):
class Meta: class Meta:
ordering = ('-subordinado__sigla', 'nome',) ordering = ('-subordinado__sigla', 'nome',)
verbose_name = _(u'serviço') verbose_name = _('serviço')
verbose_name_plural = _(u'serviços') verbose_name_plural = _('serviços')
def __unicode__(self): def __unicode__(self):
return u"{sigla} - {nome}".format(sigla=self.sigla, nome=self.nome) return "{sigla} - {nome}".format(sigla=self.sigla, nome=self.nome)
class Servidor(models.Model): class Servidor(models.Model):
user = models.ForeignKey( user = models.ForeignKey(
@ -53,12 +53,12 @@ class Servidor(models.Model):
blank=True, blank=True,
null=True null=True
) )
externo = models.BooleanField(_(u"colaborador externo"), default=False) externo = models.BooleanField(_("colaborador externo"), default=False)
orgao_origem = models.CharField( orgao_origem = models.CharField(
_(u"órgão de origem, "), _("órgão de origem, "),
max_length=100, blank=True max_length=100, blank=True
) )
qualificacoes = models.TextField(_(u"qualificações"), blank=True) qualificacoes = models.TextField(_("qualificações"), blank=True)
class Meta: class Meta:
ordering = ('nome_completo',) ordering = ('nome_completo',)

2
sigi/apps/utils/__init__.py

@ -12,7 +12,7 @@ class SearchField(models.TextField):
for field_name in self.field_names: for field_name in self.field_names:
val = unicode(to_ascii(getattr(model_instance, field_name))) val = unicode(to_ascii(getattr(model_instance, field_name)))
search_text.append(val) search_text.append(val)
value = u' '.join(search_text) value = ' '.join(search_text)
setattr(model_instance, self.name, value) setattr(model_instance, self.name, value)
return value return value

6
sigi/apps/utils/admin_widgets.py

@ -11,8 +11,8 @@ class AdminImageWidget(AdminFileWidget):
image_url = value.url image_url = value.url
file_name = str(value) file_name = str(value)
output.append( output.append(
u''' <a href="%s" target="_blank"><img src="%s" width="100" ''' <a href="%s" target="_blank"><img src="%s" width="100"
height="100" alt="%s"/></a> <br/> %s''' % height="100" alt="%s"/></a> <br/> %s''' %
(image_url, image_url, file_name, _(u'Change') + ':')) (image_url, image_url, file_name, _('Change') + ':'))
output.append(super(AdminFileWidget, self).render(name, value, attrs)) output.append(super(AdminFileWidget, self).render(name, value, attrs))
return mark_safe(u''.join(output)) return mark_safe(''.join(output))

8
sigi/apps/utils/email.py

@ -16,13 +16,13 @@ def enviar_email(from_email, subject, template, tags):
template. template.
""" """
if from_email is None: if from_email is None:
raise ValueError(_(u"Insira o email do remetente.")) raise ValueError(_("Insira o email do remetente."))
elif subject is None: elif subject is None:
raise ValueError(_(u"Insira o assunto da mensagem.")) raise ValueError(_("Insira o assunto da mensagem."))
elif template is None: elif template is None:
raise ValueError(_(u"Template da mensagem não encontrado")) raise ValueError(_("Template da mensagem não encontrado"))
elif tags is None: elif tags is None:
raise ValueError(_(u"Insira o conteúdo da mensagem.")) raise ValueError(_("Insira o conteúdo da mensagem."))
# Gerando a mensagem # Gerando a mensagem
mensagem = render_to_string(template, tags) mensagem = render_to_string(template, tags)

1
sigi/settings/base.py

@ -25,6 +25,7 @@ INSTALLED_APPS = [
'django.contrib.sessions', 'django.contrib.sessions',
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'sigi.apps.servidores',
] ]
MIDDLEWARE = [ MIDDLEWARE = [

Loading…
Cancel
Save