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. 48
      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. 94
      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',)
extra = 1
max_num = 1
verbose_name_plural = _(u'Presidente')
verbose_name_plural = _('Presidente')
def get_queryset(self, request):
return (self.model.objects.exclude(desativado=True)
.extra(select={'ult_null': 'ult_alteracao is null'})
@ -69,7 +69,7 @@ class ContatoInterlegisInline(admin.StackedInline):
readonly_fields = ('ult_alteracao',)
extra = 1
inlines = (TelefonesInline,)
verbose_name_plural = _(u'Contato(s) Interlegis Vigente(s)')
verbose_name_plural = _('Contato(s) Interlegis Vigente(s)')
def get_queryset(self, request):
return (self.model.objects.filter(setor='contato_interlegis')
.extra(select={'ult_null': 'ult_alteracao is null'}).order_by('-ult_alteracao')
@ -101,7 +101,7 @@ class FuncionariosInline(admin.StackedInline):
readonly_fields = ('ult_alteracao',)
extra = 1
inlines = (TelefonesInline,)
verbose_name_plural = _(u'Outros Contatos da Casa')
verbose_name_plural = _('Outros Contatos da Casa')
def get_queryset(self, request):
return (self.model.objects.exclude(cargo='Presidente',)
@ -138,18 +138,18 @@ class ConveniosInline(admin.TabularInline):
# def get_tramitacoes(self, obj):
# 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
#
def get_anexos(self, obj):
return '<br/>'.join(['<a href="%s" target="_blank">%s</a>' % (a.arquivo.url, a.__unicode__()) for a in obj.anexo_set.all()])
get_anexos.short_description = _(u'Anexos')
get_anexos.short_description = _('Anexos')
get_anexos.allow_tags = True
#
# def get_equipamentos(self, obj):
# return '<br/>'.join([e.__unicode__() for e in obj.equipamentoprevisto_set.all()])
#
# get_equipamentos.short_description = _(u'Equipamentos previstos')
# get_equipamentos.short_description = _('Equipamentos previstos')
# get_equipamentos.allow_tags = True
def status_convenio(self, obj):
@ -157,17 +157,17 @@ class ConveniosInline(admin.TabularInline):
return ""
status = obj.get_status()
if status in [u"Vencido", u"Desistência", u"Cancelado"]:
if status in ["Vencido", "Desistência", "Cancelado"]:
label = r"danger"
elif status == u"Vigente":
elif status == "Vigente":
label = r"success"
elif status == u"Pendente":
elif status == "Pendente":
label = r"warning"
else:
label = r"info"
return u'<p class="label label-{label}">{status}</p>'.format(label=label, status=status)
status_convenio.short_description = _(u"Status do convênio")
return '<p class="label label-{label}">{status}</p>'.format(label=label, status=status)
status_convenio.short_description = _("Status do convênio")
status_convenio.allow_tags = True
@ -181,7 +181,7 @@ class ConveniosInline(admin.TabularInline):
Editar
</a>""" % (obj.pk, obj.pk, url)
link_convenio.short_description = _(u'Editar convenio')
link_convenio.short_description = _('Editar convenio')
link_convenio.allow_tags = True
def link_sigad(self, obj):
@ -208,7 +208,7 @@ class ConveniosInline(admin.TabularInline):
# Editar
# </a>""" % (obj.pk, obj.pk, url)
# link_parlamentares.short_description = _(u'Parlamentares')
# link_parlamentares.short_description = _('Parlamentares')
# link_parlamentares.allow_tags = True
# class DiagnosticoInline(admin.TabularInline):
@ -228,7 +228,7 @@ class ConveniosInline(admin.TabularInline):
# Abrir PDF
# </a>""" % (obj.pk, obj.pk, url)
# link_diagnostico.short_description = _(u'Ver PDF')
# link_diagnostico.short_description = _('Ver PDF')
# link_diagnostico.allow_tags = True
# class BemInline(admin.TabularInline):
@ -249,8 +249,8 @@ class ServicoInline(admin.TabularInline):
def link_url(self, servico):
if servico.data_desativacao is not None:
return servico.url
return u'<a href="{url}" target="_blank">{url}</a>'.format(url=servico.url)
link_url.short_description = _(u'URL do serviço')
return '<a href="{url}" target="_blank">{url}</a>'.format(url=servico.url)
link_url.short_description = _('URL do serviço')
link_url.allow_tags = True
ordering = ('-data_alteracao',)
@ -265,7 +265,7 @@ class ServicoInline(admin.TabularInline):
Editar
</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
def has_add_permission(self, request):
@ -289,11 +289,11 @@ class OcorrenciaInline(admin.TabularInline):
if obj.pk is None:
return ""
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"
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
@ -306,13 +306,13 @@ class GerentesInterlegisFilter(admin.filters.RelatedFieldListFilter):
class ConvenioFilter(admin.SimpleListFilter):
title = _(u"Tipo de convênio")
title = _("Tipo de convênio")
parameter_name = 'convenio'
def lookups(self, request, model_admin):
return (
('SC', _(u"Sem nenhum convênio")),
('CC', _(u"Com algum convênio")),
('SC', _("Sem nenhum convênio")),
('CC', _("Com algum convênio")),
) + tuple([(p.pk, p.sigla) for p in Projeto.objects.all()])
def queryset(self, request, queryset):
@ -327,7 +327,7 @@ class ConvenioFilter(admin.SimpleListFilter):
return queryset.distinct('municipio__uf__nome', 'nome')
class ExcluirConvenioFilter(admin.SimpleListFilter):
title=_(u"Excluir convênio da pesquisa")
title=_("Excluir convênio da pesquisa")
parameter_name = 'excluir_convenio'
def lookups(self, request, model_admin):
@ -341,15 +341,15 @@ class ExcluirConvenioFilter(admin.SimpleListFilter):
return queryset
class ServicoFilter(admin.SimpleListFilter):
title = _(u"Serviço")
title = _("Serviço")
parameter_name = 'servico'
def lookups(self, request, model_admin):
return (
('SS', _(u"Sem nenhum serviço")),
('CS', _(u"Com algum serviço")),
('CH', _(u"Com algum serviço de hospedagem")),
('CR', _(u"Apenas serviço de registro")),
('SS', _("Sem nenhum serviço")),
('CS', _("Com algum serviço")),
('CH', _("Com algum serviço de hospedagem")),
('CR', _("Apenas serviço de registro")),
) + tuple([(p.pk, p.nome) for p in TipoServico.objects.all()])
def queryset(self, request, queryset):
@ -375,13 +375,13 @@ class ServicoFilter(admin.SimpleListFilter):
return queryset.distinct('municipio__uf__nome', 'nome')
class ServicoAtivoFilter(admin.SimpleListFilter):
title = _(u"Serviço ativo")
title = _("Serviço ativo")
parameter_name = 'ativo'
def lookups(self, request, model_admin):
return (
('ativo', _(u"Ativo")),
('desativado', _(u"Desativado")),
('ativo', _("Ativo")),
('desativado', _("Desativado")),
)
def queryset(self, request, queryset):
@ -410,15 +410,15 @@ class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin):
'fields': ('tipo', 'nome', 'sigla', 'cnpj', 'num_parlamentares',
'gerentes_interlegis')
}),
(_(u'Endereço'), {
(_('Endereço'), {
'fields': ('data_instalacao', 'logradouro', 'bairro',
'municipio', 'cep', 'ult_alt_endereco'),
}),
(_(u'Presença na Internet'), {
(_('Presença na Internet'), {
'fields': ('inclusao_digital', 'data_levantamento', 'pesquisador',
'pagina_web', 'email', 'obs_pesquisa',)
}),
(_(u'Outras informações'), {
(_('Outras informações'), {
'fields': ('observacoes', 'horario_funcionamento', 'foto',
'recorte'),
}),
@ -431,26 +431,26 @@ class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin):
def get_uf(self, obj):
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'
def get_gerentes(self, obj):
return obj.lista_gerentes()
get_gerentes.short_description = _(u'Gerente Interlegis')
get_gerentes.short_description = _('Gerente Interlegis')
get_gerentes.allow_tags = True
def get_convenios(self, obj):
return '<ul>' + ''.join(['<li>%s</li>' % c.__unicode__()
for c in obj.convenio_set.all()]) + '</ul>'
get_convenios.short_description = _(u'Convênios')
get_convenios.short_description = _('Convênios')
get_convenios.allow_tags = True
def get_servicos(self, obj):
return u'<ul>' + u''.join(
[u'<li><a href="{url}" target="_blank">{servico}</a></li>'.format(
return '<ul>' + ''.join(
['<li><a href="{url}" target="_blank">{servico}</a></li>'.format(
url=s.url, servico=s.__unicode__()) for s in
obj.servico_set.filter(data_desativacao__isnull=True)]) + u'</ul>'
get_servicos.short_description = _(u'Serviços')
obj.servico_set.filter(data_desativacao__isnull=True)]) + '</ul>'
get_servicos.short_description = _('Serviços')
get_servicos.allow_tags = True
def changelist_view(self, request, extra_context=None):
@ -468,29 +468,29 @@ class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin):
def etiqueta(self, request, queryset):
return labels_report(request, queryset=queryset)
etiqueta.short_description = _(u"Gerar etiqueta(s) da(s) casa(s) "
u"selecionada(s)")
etiqueta.short_description = _("Gerar etiqueta(s) da(s) casa(s) "
"selecionada(s)")
def etiqueta_sem_presidente(self, request, queryset):
return labels_report_sem_presidente(request, queryset=queryset)
etiqueta_sem_presidente.short_description = _(u"Gerar etiqueta(s) sem "
u"presidente da(s) casa(s) "
u"selecionada(s)")
etiqueta_sem_presidente.short_description = _("Gerar etiqueta(s) sem "
"presidente da(s) casa(s) "
"selecionada(s)")
def relatorio(self, request, queryset):
return report(request, queryset=queryset)
relatorio.short_description = _(u"Exportar a(s) casa(s) selecionada(s) "
u"para PDF")
relatorio.short_description = _("Exportar a(s) casa(s) selecionada(s) "
"para PDF")
def relatorio_completo(self, request, queryset):
return report_complete(request, queryset=queryset)
relatorio_completo.short_description = _(u"Gerar relatório completo da(s) "
u"casa(s) selecionada(s)")
relatorio_completo.short_description = _("Gerar relatório completo da(s) "
"casa(s) selecionada(s)")
def relatorio_csv(self, request, queryset):
return export_csv(request)
relatorio_csv.short_description = _(u"Exportar casa(s) selecionada(s) "
u"para CSV")
relatorio_csv.short_description = _("Exportar casa(s) selecionada(s) "
"para CSV")
def adicionar_casas(self, request, queryset):
if 'carrinho_casas' in request.session:
@ -503,14 +503,14 @@ class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin):
quant = q2 - q1
if quant:
self.message_user(request, str(q2 - q1) + " " +
_(u"Casas Legislativas adicionadas no carrinho"))
_("Casas Legislativas adicionadas no carrinho"))
else:
self.message_user(request, _(u"As Casas Legislativas selecionadas "
u"já foram adicionadas anteriormente"))
self.message_user(request, _("As Casas Legislativas selecionadas "
"já foram adicionadas anteriormente"))
return HttpResponseRedirect('.')
adicionar_casas.short_description = _(u"Armazenar casas no carrinho para "
u"exportar")
adicionar_casas.short_description = _("Armazenar casas no carrinho para "
"exportar")
def get_actions(self, 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):
arquivo = forms.FileField(
required=True,
label=_(u"arquivo a importar"),
help_text=_(u"Envie um arquivo no formato CSV"),
label=_("arquivo a importar"),
help_text=_("Envie um arquivo no formato CSV"),
)
class OrgaoForm(forms.ModelForm):
# cnpj = BRCNPJField(
# label=_(u'CNPJ'),
# label=_('CNPJ'),
# 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:
model = Orgao
@ -34,21 +34,21 @@ class OrgaoForm(forms.ModelForm):
class PortfolioForm(forms.Form):
ACAO_CHOICES = (
('ADD', _(u"Adicionar")),
('DEL', _(u"Remover"))
('ADD', _("Adicionar")),
('DEL', _("Remover"))
)
acao = forms.ChoiceField(
label=_(u"Ação"),
label=_("Ação"),
choices=ACAO_CHOICES,
initial='ADD',
widget=forms.RadioSelect
)
gerente = forms.ModelChoiceField(
queryset=Servidor.objects.all(),
label=_(u"Atribuir para")
label=_("Atribuir para")
)
# 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)
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
class Command(BaseCommand):
args = u"data_file.csv"
help = u"""Importa dados de atribuição de gerencia de relacionamentos de um arquivo CSV.
args = "data_file.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:
- cod_municipio : Código IBGE do município
@ -43,18 +43,18 @@ class Command(BaseCommand):
def handle(self, *args, **options):
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]
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:
reader = csv.DictReader(csvfile)
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()
@ -66,8 +66,8 @@ class Command(BaseCommand):
codigo_ibge=reg['cod_municipio']
)
except Municipio.DoesNotExist:
self.stdout.write(u"{linha}: não existe Município com "
u"código IBGE {ibge}'".format(
self.stdout.write("{linha}: não existe Município com "
"código IBGE {ibge}'".format(
linha=reader.line_num,
ibge=reg['cod_municipio'])
)
@ -79,8 +79,8 @@ class Command(BaseCommand):
user__username=reg['user_id']
)
except Servidor.DoesNotExist:
self.stdout.write(u"({linha}): não existe Servidor com "
u"userid {userid}".format(
self.stdout.write("({linha}): não existe Servidor com "
"userid {userid}".format(
linha=reader.line_num,
userid=reg['user_id'])
)
@ -92,7 +92,7 @@ class Command(BaseCommand):
casa.gerentes_interlegis.add(gerente)
casa.save()
self.stdout.write(u"Importação concluída. {erros} erros em {linhas}"
u" linhas".format(erros=erros,
self.stdout.write("Importação concluída. {erros} erros em {linhas}"
" linhas".format(erros=erros,
linhas=reader.line_num)
)

146
sigi/apps/casas/models.py

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

12
sigi/apps/casas/reports.py

@ -100,7 +100,7 @@ class CasasLegislativasLabels(Report):
my_elements = [
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,
),
ObjectValue(
@ -113,7 +113,7 @@ class CasasLegislativasLabels(Report):
attribute_name='nome',
top=calc_top(2), left=calc_left, width=calc_width, height=calc_height(2),
get_value=lambda instance:
(_(u"Presidente da %s") % instance.nome)
(_("Presidente da %s") % instance.nome)
),
ObjectValue(
attribute_name='logradouro',
@ -125,7 +125,7 @@ class CasasLegislativasLabels(Report):
ObjectValue(
attribute_name='cep',
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(
@ -148,14 +148,14 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
my_elements = [
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,
),
ObjectValue(
attribute_name='nome',
top=calc_top(1), left=calc_left, width=calc_width, height=calc_height(2),
get_value=lambda instance:
(_(u"Presidente da %s") % instance.nome)
(_("Presidente da %s") % instance.nome)
),
ObjectValue(
attribute_name='logradouro',
@ -167,7 +167,7 @@ class CasasLegislativasLabelsSemPresidente(CasasLegislativasLabels):
ObjectValue(
attribute_name='cep',
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(

110
sigi/apps/casas/views.py

@ -125,8 +125,8 @@ class importa_casas(View):
return render(
request,
'casas/importar.html',
{'form': form, 'error': _(u"O arquivo não possui algum dos "
u"campos obrigatórios")}
{'form': form, 'error': _("O arquivo não possui algum dos "
"campos obrigatórios")}
)
if self.importa(reader):
@ -165,7 +165,7 @@ class importa_casas(View):
return render(
request,
'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
@ -448,7 +448,7 @@ def visualizar_carrinho(request):
def excluir_carrinho(request):
if 'carrinho_casas' in request.session:
del request.session['carrinho_casas']
messages.info(request, u'O carrinho foi esvaziado')
messages.info(request, 'O carrinho foi esvaziado')
return HttpResponseRedirect('../../')
@ -588,7 +588,7 @@ def report(request, id=None, tipo=None):
return HttpResponseRedirect('../')
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)
@ -617,7 +617,7 @@ def casas_sem_convenio_report(request):
return HttpResponseRedirect('../')
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)
@ -636,7 +636,7 @@ def export_csv(request):
atributos = request.POST.getlist("itens_csv_selected")
try:
atributos.insert(atributos.index(_(u'Município')), _(u'UF'))
atributos.insert(atributos.index(_('Município')), _('UF'))
except ValueError:
pass
@ -648,59 +648,59 @@ def export_csv(request):
lista = []
contatos = casa.funcionario_set.exclude(nome="")
for atributo in atributos:
if _(u"CNPJ") == atributo:
if _("CNPJ") == atributo:
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"))
elif _(u"Código TSE") == atributo:
elif _("Código TSE") == atributo:
lista.append(str(casa.municipio.codigo_tse).encode("utf-8"))
elif _(u"Nome") == atributo:
elif _("Nome") == atributo:
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.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
# É preciso descobrir o porque do erro e fazer a correção definitiva.
# lista.append(str(casa.presidente or "").encode("utf-8"))
lista.append(str(casa.presidente or ""))
elif _(u"Logradouro") == atributo:
elif _("Logradouro") == atributo:
lista.append(casa.logradouro.encode("utf-8"))
elif _(u"Bairro") == atributo:
elif _("Bairro") == atributo:
lista.append(casa.bairro.encode("utf-8"))
elif _(u"CEP") == atributo:
elif _("CEP") == atributo:
lista.append(casa.cep.encode("utf-8"))
elif _(u"Telefone") == atributo:
elif _("Telefone") == atributo:
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"))
elif _(u"Email") == atributo:
elif _("Email") == atributo:
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)
elif _(u"Última alteração de endereco") == atributo:
elif _("Última alteração de endereco") == atributo:
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')
for s in casa.servico_set.filter(
data_desativacao__isnull=True)])
)
elif _(u"Nome contato") == atributo:
elif _("Nome contato") == atributo:
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"))
else:
lista.append('')
elif _(u"Cargo contato") == atributo:
elif _("Cargo contato") == atributo:
if contatos:
cargos = u", ".join([c.cargo if c.cargo else u"?"
cargos = ", ".join([c.cargo if c.cargo else "?"
for c in contatos])
lista.append(cargos.encode("utf-8"))
else:
lista.append('')
elif _(u"Email contato") == atributo:
elif _("Email contato") == atributo:
if contatos:
emails = u", ".join([c.email if c.email else u"?"
emails = ", ".join([c.email if c.email else "?"
for c in contatos])
lista.append(emails.encode("utf-8"))
else:
@ -745,7 +745,7 @@ def portfolio(request):
data['mesorregioes'] = uf.mesorregiao_set.all()
data['microrregioes'] = mesorregiao.microrregiao_set.all()
data['form'] = PortfolioForm(
_(u'Atribuir casas da microrregiao {name} para').format(
_('Atribuir casas da microrregiao {name} para').format(
name=unicode(microrregiao))
)
data['querystring'] = 'micro={0}'.format(microrregiao.pk)
@ -762,7 +762,7 @@ def portfolio(request):
data['mesorregioes'] = uf.mesorregiao_set.all()
data['microrregioes'] = mesorregiao.microrregiao_set.all()
data['form'] = PortfolioForm(
_(u'Atribuir casas da mesorregiao {name} para').format(
_('Atribuir casas da mesorregiao {name} para').format(
name=unicode(mesorregiao)))
data['querystring'] = 'meso={0}'.format(mesorregiao.pk)
casas = Orgao.objects.filter(
@ -775,7 +775,7 @@ def portfolio(request):
data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao)
data['mesorregioes'] = uf.mesorregiao_set.all()
data['form'] = PortfolioForm(
_(u'Atribuir casas do estado {name} para').format(
_('Atribuir casas do estado {name} para').format(
name=unicode(uf)))
data['querystring'] = 'uf={0}'.format(uf.pk)
casas = Orgao.objects.filter(municipio__uf=uf)
@ -783,7 +783,7 @@ def portfolio(request):
data['regiao'] = regiao
data['ufs'] = UnidadeFederativa.objects.filter(regiao=regiao)
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
x[0] == regiao][0]))
data['querystring'] = 'regiao={0}'.format(regiao)
@ -814,21 +814,21 @@ def portfolio(request):
if acao == 'ADD':
gerente.casas_que_gerencia.add(*casas)
data['messages'].append(ungettext(
u"{count} casa adicionada para {gerente}",
u"{count} casas adicionadas para {gerente}",
"{count} casa adicionada para {gerente}",
"{count} casas adicionadas para {gerente}",
count).format(count=count,gerente=gerente.nome_completo)
)
elif acao == 'DEL':
gerente.casas_que_gerencia.remove(*casas)
data['messages'].append(ungettext(
u"{count} casa removida de {gerente}",
u"{count} casas removidas de {gerente}",
"{count} casa removida de {gerente}",
"{count} casas removidas de {gerente}",
count).format(count=count,gerente=gerente.nome_completo)
)
else:
data['errors'].append(_(u"Ação não definida"))
data['errors'].append(_("Ação não definida"))
else:
data['errors'].append(_(u"Dados inválidos"))
data['errors'].append(_("Dados inválidos"))
paginator = Paginator(casas, 30)
try:
@ -892,16 +892,16 @@ def resumo_carteira(casas):
else:
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.append([_(u"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([_(u"Casas sem nenhum produto"), sem_produto['total']] + [sem_produto[r[0]] for r in UnidadeFederativa.REGIAO_CHOICES])
resumo = [[_("Item"), _("Total nacional")] + [r[1] 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': _("Uso dos produtos Interlegis")})
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.append({'subtitle': _(u"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([_(u"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([_(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({'subtitle': _("Registros no sistema de ocorrências")})
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([_("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 pendentes"), dados_ocorrencia['pendentes']['total']] + [dados_ocorrencia['pendentes'][r[0]] 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
@ -1016,13 +1016,13 @@ def painel_relacionamento(request):
response['Content-Disposition'] = 'attachment; filename=casas.csv'
writer = csv.writer(response)
writer.writerow([
_(u"Casa legislativa").encode('utf8'),
_(u"Região").encode('utf8'),
_(u"Estado").encode('utf8'),
_(u"Mesorregião").encode('utf8'),
_(u"Microrregião").encode('utf8'),
_(u"Gerentes Interlegis").encode('utf8'),
_(u"Serviços").encode('utf8'),
_("Casa legislativa").encode('utf8'),
_("Região").encode('utf8'),
_("Estado").encode('utf8'),
_("Mesorregião").encode('utf8'),
_("Microrregião").encode('utf8'),
_("Gerentes Interlegis").encode('utf8'),
_("Serviços").encode('utf8'),
])
for c in casas:
writer.writerow([
@ -1032,7 +1032,7 @@ def painel_relacionamento(request):
c.municipio.microrregiao.mesorregiao.nome.encode('utf8'),
c.municipio.microrregiao.nome.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 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',
'is_capital', 'populacao', 'is_polo', 'idh', 'pib_ano', 'pib_total', 'pib_percapita')
}),
(_(u'Posição geográfica'), {
(_('Posição geográfica'), {
'fields': ('latitude', 'longitude'),
}),
)

10
sigi/apps/contatos/filters.py

@ -6,7 +6,7 @@ from django.utils.translation import gettext as _
class PopulationFilter(admin.SimpleListFilter):
# Human-readable title which will be displayed in the
# 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_name = 'faixa'
@ -20,10 +20,10 @@ class PopulationFilter(admin.SimpleListFilter):
in the right sidebar.
"""
return (
('1', _(u'< 100 Mil')),
('2', _(u'100 Mil a 1 Milhão')),
('3', _(u'1 Milhão a 100 Milhões')),
('4', _(u'> 100 Milhões')),
('1', _('< 100 Mil')),
('2', _('100 Mil a 1 Milhão')),
('3', _('1 Milhão a 100 Milhões')),
('4', _('> 100 Milhões')),
)
def queryset(self, request, queryset):

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

@ -27,9 +27,9 @@ from django.core.management.base import BaseCommand, CommandError
from sigi.apps.contatos.models import Municipio, UnidadeFederativa, Mesorregiao, Microrregiao
class Command(BaseCommand):
args = u"data_file.csv"
help = u"""Importa arquivo do IBGE para preencher as tabelas de meso e microrregiões para os municípios.
args = "data_file.csv"
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:
- cod_uf : Código IBGE da Unidade da Federação
- cod_mesorregiao : Código IBGE da mesorregião
@ -37,64 +37,64 @@ class Command(BaseCommand):
- cod_microrregiao : Código IBGE da microrregião
- nome_microrregiao : Nome da microrregião
- cod_municipio : Código IBGE do município
* Os nomes dos campos devem ser grafados exatamente como descrito."""
campos = {'cod_uf', 'cod_mesorregiao', 'nome_mesorregiao', 'cod_microrregiao',
'nome_microrregiao', 'cod_municipio'}
def handle(self, *args, **options):
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]
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:
reader = csv.DictReader(csvfile)
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
for reg in reader:
try:
uf = UnidadeFederativa.objects.get(codigo_ibge=reg['cod_uf'])
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'],))
erros = erros + 1
continue
try:
municipio = Municipio.objects.get(codigo_ibge=reg['cod_municipio'])
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'],))
erros = erros + 1
continue
cod_meso = reg['cod_uf'] + reg['cod_mesorregiao']
cod_micro = cod_meso + reg['cod_microrregiao']
if Mesorregiao.objects.filter(codigo_ibge=cod_meso).exists():
meso = Mesorregiao.objects.get(codigo_ibge=cod_meso)
else:
meso = Mesorregiao(codigo_ibge=cod_meso, uf=uf, nome=reg['nome_mesorregiao'])
meso.nome = reg['nome_mesorregiao']
meso.save()
if Microrregiao.objects.filter(codigo_ibge=cod_micro).exists():
micro = Microrregiao.objects.get(codigo_ibge=cod_micro)
else:
micro = Microrregiao(codigo_ibge=cod_micro, mesorregiao=meso, nome=reg['nome_microrregiao'])
micro.nome = reg['nome_microrregiao']
micro.save()
municipio.microrregiao = micro
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
"""
REGIAO_CHOICES = (
('CO', _(u'Centro-Oeste')),
('NE', _(u'Nordeste')),
('NO', _(u'Norte')),
('SD', _(u'Sudeste')),
('SL', _(u'Sul')),
('CO', _('Centro-Oeste')),
('NE', _('Nordeste')),
('NO', _('Norte')),
('SD', _('Sudeste')),
('SL', _('Sul')),
)
codigo_ibge = models.PositiveIntegerField(
u'código IBGE',
'código IBGE',
primary_key=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
search_text = SearchField(field_names=['nome'])
sigla = models.CharField(
max_length=2,
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)
populacao = models.PositiveIntegerField(_(u'população'))
regiao = models.CharField(_('região'), max_length=2, choices=REGIAO_CHOICES)
populacao = models.PositiveIntegerField(_('população'))
class Meta:
ordering = ('nome',)
verbose_name = _(u'Unidade Federativa')
verbose_name_plural = _(u'Unidades Federativas')
verbose_name = _('Unidade Federativa')
verbose_name_plural = _('Unidades Federativas')
def __unicode__(self):
return self.nome
class Mesorregiao(models.Model):
codigo_ibge = models.PositiveIntegerField(
_(u'Código IBGE'),
_('Código IBGE'),
primary_key=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(
UnidadeFederativa,
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
search_text = SearchField(field_names=['nome'])
class Meta:
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):
return self.nome
class Microrregiao(models.Model):
codigo_ibge = models.PositiveIntegerField(
_(u'Código IBGE'),
_('Código IBGE'),
primary_key=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,
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
search_text = SearchField(field_names=['nome'])
class Meta:
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):
return u"%s (%s)" % (self.nome, self.mesorregiao.nome)
return "%s (%s)" % (self.nome, self.mesorregiao.nome)
class Municipio(models.Model):
""" Modelo para representar as cidades brasileiras
"""
codigo_ibge = models.PositiveIntegerField(
_(u'código IBGE'),
_('código IBGE'),
primary_key=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,
on_delete=models.PROTECT,
verbose_name=_(u'Microrregião'),
verbose_name=_('Microrregião'),
blank=True,
null=True
)
# codio designado pelo Tribunal Superior Eleitoral
codigo_tse = models.PositiveIntegerField(
_(u'código TSE'),
_('código TSE'),
unique=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)
search_text = SearchField(field_names=[_(u'nome'), _(u'uf')])
search_text = SearchField(field_names=[_('nome'), _('uf')])
uf = models.ForeignKey(
UnidadeFederativa,
on_delete=models.PROTECT,
verbose_name=_(u'UF')
verbose_name=_('UF')
)
# verdadeiro se o município é capital do estado
is_capital = models.BooleanField(_(u'capital'), default=False)
populacao = models.PositiveIntegerField(_(u'população'))
is_capital = models.BooleanField(_('capital'), default=False)
populacao = models.PositiveIntegerField(_('população'))
populacao.list_filter_range = [10000, 100000, 1000000]
is_polo = models.BooleanField(_(u'pólo'), default=False)
data_criacao = models.DateField(_(u'data de criação do município'), null=True, blank=True)
is_polo = models.BooleanField(_('pólo'), default=False)
data_criacao = models.DateField(_('data de criação do município'), null=True, blank=True)
# posição geográfica do município
latitude = models.DecimalField(
@ -136,28 +136,28 @@ class Municipio(models.Model):
decimal_places=8,
null=True,
blank=True,
help_text=_(u'Exemplo') + ': <em>-20,464</em>.'
help_text=_('Exemplo') + ': <em>-20,464</em>.'
)
longitude = models.DecimalField(
max_digits=11,
decimal_places=8,
null=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)])
idh.list_filter_range = [0.500, 0.800]
pib_total = models.DecimalField(_(u'PIB total'), max_digits=18, decimal_places=3, blank=True, null=True)
pib_percapita = models.DecimalField(_(u'PIB per capita'), max_digits=18, decimal_places=3, blank=True, null=True)
pib_ano = models.IntegerField(_(u'Ano de apuração do PIB'), blank=True, null=True)
pib_total = models.DecimalField(_('PIB total'), 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(_('Ano de apuração do PIB'), blank=True, null=True)
class Meta:
ordering = ('nome', 'codigo_ibge')
verbose_name = _(u'município')
verbose_name_plural = _(u'municípios')
verbose_name = _('município')
verbose_name_plural = _('municípios')
def __unicode__(self):
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
"""
TELEFONE_CHOICES = (
('F', _(u'Fixo')),
('M', _(u'Móvel')),
('X', _(u'Fax')),
('I', _(u'Indefinido')),
('F', _('Fixo')),
('M', _('Móvel')),
('X', _('Fax')),
('I', _('Indefinido')),
)
numero = models.CharField(
_(u'número'),
_('número'),
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(
max_length=1,
@ -188,7 +188,7 @@ class Telefone(models.Model):
default='I'
)
nota = models.CharField(max_length=70, null=True, blank=True)
ult_alteracao = models.DateTimeField(_(u'Última alteração'), null=True, blank=True, editable=False, auto_now=True)
ult_alteracao = models.DateTimeField(_('Última alteração'), null=True, blank=True, editable=False, auto_now=True)
# guarda o tipo do objeto (classe) vinculado a esse registro
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
@ -212,17 +212,17 @@ class Contato(models.Model):
""" Modelo generico para registrar contatos vinculados aos
modulos do sistema
"""
nome = models.CharField(_(u'nome completo'), max_length=120)
nome = models.CharField(_('nome completo'), max_length=120)
nome.alphabetic_filter = 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)
municipio = models.ForeignKey(
Municipio,
on_delete=models.SET_NULL,
verbose_name=_(u'município'),
verbose_name=_('município'),
blank=True,
null=True,
)
@ -238,8 +238,8 @@ class Contato(models.Model):
class Meta:
ordering = ('nome',)
verbose_name = _(u'contato Interlegis')
verbose_name_plural = _(u'contatos Interlegis')
verbose_name = _('contato Interlegis')
verbose_name_plural = _('contatos Interlegis')
def __unicode__(self):
return self.nome
@ -247,51 +247,51 @@ class Contato(models.Model):
class Endereco(models.Model):
TIPO_CHOICES = (
('aeroporto', _(u'Aeroporto')),
('alameda', _(u'Alameda')),
('area', _(u'Área')),
('avenida', _(u'Avenida')),
('campo', _(u'Campo')),
('chacara', _(u'Chácara')),
('colonia', _(u'Colônia')),
('condominio', _(u'Condomínio')),
('conjunto', _(u'Conjunto')),
('distrito', _(u'Distrito')),
('esplanada', _(u'Esplanada')),
('estacao', _(u'Estação')),
('estrada', _(u'Estrada')),
('favela', _(u'Favela')),
('fazenda', _(u'Fazenda')),
('feira', _(u'Feira')),
('jardim', _(u'Jardim')),
('ladeira', _(u'Ladeira')),
('lago', _(u'Lago')),
('lagoa', _(u'Lagoa')),
('largo', _(u'Largo')),
('loteamento', _(u'Loteamento')),
('morro', _(u'Morro')),
('nucleo', _(u'Núcleo')),
('parque', _(u'Parque')),
('passarela', _(u'Passarela')),
('patio', _(u'Pátio')),
('praca', _(u'Praça')),
('quadra', _(u'Quadra')),
('recanto', _(u'Recanto')),
('residencial', _(u'Residencial')),
('rodovia', _(u'Rodovia')),
('rua', _(u'Rua')),
('setor', _(u'Setor')),
('sitio', _(u'Sítio')),
('travessa', _(u'Travessa')),
('trecho', _(u'Trecho')),
('trevo', _(u'Trevo')),
('vale', _(u'Vale')),
('vereda', _(u'Vereda')),
('via', _(u'Via')),
('viaduto', _(u'Viaduto')),
('viela', _(u'Viela')),
('vila', _(u'Vila')),
('outro', _(u'Outro')),
('aeroporto', _('Aeroporto')),
('alameda', _('Alameda')),
('area', _('Área')),
('avenida', _('Avenida')),
('campo', _('Campo')),
('chacara', _('Chácara')),
('colonia', _('Colônia')),
('condominio', _('Condomínio')),
('conjunto', _('Conjunto')),
('distrito', _('Distrito')),
('esplanada', _('Esplanada')),
('estacao', _('Estação')),
('estrada', _('Estrada')),
('favela', _('Favela')),
('fazenda', _('Fazenda')),
('feira', _('Feira')),
('jardim', _('Jardim')),
('ladeira', _('Ladeira')),
('lago', _('Lago')),
('lagoa', _('Lagoa')),
('largo', _('Largo')),
('loteamento', _('Loteamento')),
('morro', _('Morro')),
('nucleo', _('Núcleo')),
('parque', _('Parque')),
('passarela', _('Passarela')),
('patio', _('Pátio')),
('praca', _('Praça')),
('quadra', _('Quadra')),
('recanto', _('Recanto')),
('residencial', _('Residencial')),
('rodovia', _('Rodovia')),
('rua', _('Rua')),
('setor', _('Setor')),
('sitio', _('Sítio')),
('travessa', _('Travessa')),
('trecho', _('Trecho')),
('trevo', _('Trevo')),
('vale', _('Vale')),
('vereda', _('Vereda')),
('via', _('Via')),
('viaduto', _('Viaduto')),
('viela', _('Viela')),
('vila', _('Vila')),
('outro', _('Outro')),
)
# 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)
cep = models.CharField(
_(u'CEP'),
_('CEP'),
max_length=9,
blank=True,
null=True,
help_text=_(u"Formato") + ": <em>XXXXX-XXX</em>."
help_text=_("Formato") + ": <em>XXXXX-XXX</em>."
)
municipio = models.ForeignKey(
Municipio,
on_delete=models.SET_NULL,
verbose_name=_(u'município'),
verbose_name=_('município'),
blank=True,
null=True,
)
@ -334,8 +334,8 @@ class Endereco(models.Model):
class Meta:
ordering = ('logradouro', 'numero')
verbose_name = _(u'endereço')
verbose_name_plural = _(u'endereços')
verbose_name = _('endereço')
verbose_name_plural = _('endereços')
def __unicode__(self):
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',
'projeto', 'data_sigi',)}
),
(_(u"Acompanhamento no gabinete"),
(_("Acompanhamento no gabinete"),
{'fields': ('data_solicitacao', 'data_sigad', 'observacao',)}
),
(_(u"Gestão do convênio"),
(_("Gestão do convênio"),
{'fields': ('servico_gestao', 'servidor_gestao',)}
),
(_(u'Datas'),
(_('Datas'),
{'fields': ('data_retorno_assinatura', 'data_termino_vigencia',
'data_pub_diario',)}
),
(_(u'Gescon'),
(_('Gescon'),
{'fields': ('atualizacao_gescon', 'observacao_gescon', 'link_gescon')}
),
)
@ -86,7 +86,7 @@ class ConvenioAdmin(BaseModelAdmin):
def get_uf(self, obj):
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'
def status_convenio(self, obj):
@ -94,17 +94,17 @@ class ConvenioAdmin(BaseModelAdmin):
return ""
status = obj.get_status()
if status in [u"Vencido", u"Desistência", u"Cancelado"]:
if status in ["Vencido", "Desistência", "Cancelado"]:
label = r"danger"
elif status == u"Vigente":
elif status == "Vigente":
label = r"success"
elif status == u"Pendente":
elif status == "Pendente":
label = r"warning"
else:
label = r"info"
return u'<p class="label label-{label}">{status}</p>'.format(label=label, status=status)
status_convenio.short_description = _(u"Status do convênio")
return '<p class="label label-{label}">{status}</p>'.format(label=label, status=status)
status_convenio.short_description = _("Status do convênio")
status_convenio.allow_tags = True
def link_sigad(self, obj):
@ -117,11 +117,11 @@ class ConvenioAdmin(BaseModelAdmin):
def link_gescon(self, obj):
if not obj.id_contrato_gescon:
return u""
return ""
return (
u"<a href='https://adm.senado.gov.br/gestao-contratos/api/"
u"contratos/buscaTexto/{id}'>https://adm.senado.gov.br/"
u"gestao-contratos/api/{id}</a>").format(id=obj.id_contrato_gescon)
"<a href='https://adm.senado.gov.br/gestao-contratos/api/"
"contratos/buscaTexto/{id}'>https://adm.senado.gov.br/"
"gestao-contratos/api/{id}</a>").format(id=obj.id_contrato_gescon)
link_gescon.short_description = _("Download MINUTA ASSINADA do Gescon")
link_gescon.allow_tags = True
@ -149,7 +149,7 @@ class ConvenioAdmin(BaseModelAdmin):
report = ConvenioReport(queryset=queryset)
report.generate_by(PDFGenerator, filename=response)
return response
relatorio.short_description = _(u'Exportar convênios selecionados para PDF')
relatorio.short_description = _('Exportar convênios selecionados para PDF')
def adicionar_convenios(self, request, queryset):
if 'carrinho_convenios' in request.session:
@ -160,11 +160,11 @@ class ConvenioAdmin(BaseModelAdmin):
q2 = len(request.session['carrinho_convenios'])
quant = q2 - q1
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:
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('.')
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):
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):
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:
ordering = ('nome',)
verbose_name = _(u"Estado de convenios")
verbose_name_plural = _(u"Estados de convenios")
verbose_name = _("Estado de convenios")
verbose_name_plural = _("Estados de convenios")
def __unicode__(self):
return self.nome
@ -41,8 +41,8 @@ class TipoSolicitacao(models.Model):
class Meta:
ordering = ('nome',)
verbose_name = _(u"tipo de solicitação")
verbose_name_plural = _(u"Tipos de solicitação")
verbose_name = _("tipo de solicitação")
verbose_name_plural = _("Tipos de solicitação")
def __unicode__(self):
return self.nome
@ -51,47 +51,47 @@ class Convenio(models.Model):
casa_legislativa = models.ForeignKey(
'casas.Orgao',
on_delete=models.PROTECT,
verbose_name=_(u'órgão conveniado')
verbose_name=_('órgão conveniado')
)
# campo de busca em caixa baixa e sem acentos
projeto = models.ForeignKey(
Projeto,
on_delete=models.PROTECT,
verbose_name=_(u'Tipo de Convenio')
verbose_name=_('Tipo de Convenio')
)
# numero designado pelo Senado Federal para o convênio
num_processo_sf = models.CharField(
_(u'número do processo SF (Senado Federal)'),
_('número do processo SF (Senado Federal)'),
max_length=20,
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')
num_convenio = models.CharField(
_(u'número do convênio'),
_('número do convênio'),
max_length=10,
blank=True
)
id_contrato_gescon = models.CharField(
_(u"ID do contrato no Gescon"),
_("ID do contrato no Gescon"),
max_length=20,
blank=True,
default="",
editable=False
)
data_sigi = models.DateField(
_(u"data de cadastro no SIGI"),
_("data de cadastro no SIGI"),
blank=True,
null=True,
auto_now_add=True
)
data_sigad = models.DateField(
_(u"data de cadastro no SIGAD"),
_("data de cadastro no SIGAD"),
null=True,
blank=True
)
data_solicitacao = models.DateField(
_(u"data do e-mail de solicitação"),
_("data do e-mail de solicitação"),
null=True,
blank=True
)
@ -100,12 +100,12 @@ class Convenio(models.Model):
on_delete=models.PROTECT,
null=True,
blank=True,
verbose_name=_(u"tipo de solicitação")
verbose_name=_("tipo de solicitação")
)
status = models.ForeignKey(
StatusConvenio,
on_delete=models.SET_NULL,
verbose_name=_(u"estado atual"),
verbose_name=_("estado atual"),
null=True,
blank=True
)
@ -113,12 +113,12 @@ class Convenio(models.Model):
Servidor,
on_delete=models.SET_NULL,
related_name='convenios_acompanhados',
verbose_name=_(u"acompanhado por"),
verbose_name=_("acompanhado por"),
null=True,
blank=True
)
observacao = models.TextField(
_(u"observações"),
_("observações"),
null=True,
blank=True,
)
@ -128,97 +128,97 @@ class Convenio(models.Model):
null=True,
blank=True,
related_name='convenios_geridos',
verbose_name=_(u"serviço de gestão")
verbose_name=_("serviço de gestão")
)
servidor_gestao = models.ForeignKey(
Servidor,
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name=_(u"servidor de gestão")
verbose_name=_("servidor de gestão")
)
data_adesao = models.DateField(
_(u'aderidas'),
_('aderidas'),
null=True,
blank=True,
)
data_retorno_assinatura = models.DateField(
_(u'data início vigência'),
_('data início vigência'),
null=True,
blank=True,
help_text=_(u'Convênio firmado.')
help_text=_('Convênio firmado.')
)
data_termino_vigencia = models.DateField(
_(u'Data término vigência'),
_('Data término vigência'),
null=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(
_(u'data da publicação no Diário Oficial'),
_('data da publicação no Diário Oficial'),
null=True,
blank=True
)
data_termo_aceite = models.DateField(
_(u'equipadas'),
_('equipadas'),
null=True,
blank=True,
help_text=_(u'Equipamentos recebidos.')
help_text=_('Equipamentos recebidos.')
)
data_devolucao_via = models.DateField(
_(u'data de devolução da via'),
_('data de devolução da via'),
null=True,
blank=True,
help_text=_(u'Data de devolução da via do convênio à Câmara Municipal.')
help_text=_('Data de devolução da via do convênio à Câmara Municipal.')
)
data_postagem_correio = models.DateField(
_(u'data postagem correio'),
_('data postagem correio'),
null=True,
blank=True,
)
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,
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(
_(u'data do retorno sem assinatura'),
_('data do retorno sem assinatura'),
null=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)
equipada = models.BooleanField(default=False)
atualizacao_gescon = models.DateTimeField(
_(u"Data de atualização pelo Gescon"),
_("Data de atualização pelo Gescon"),
blank=True,
null=True
)
observacao_gescon = models.TextField(
_(u"Observações da atualização do Gescon"),
_("Observações da atualização do Gescon"),
blank=True
)
def get_status(self):
if self.status and self.status.cancela:
return _(u"Cancelado")
return _("Cancelado")
if self.data_retorno_assinatura is not None:
if self.data_termino_vigencia is not None:
if date.today() >= self.data_termino_vigencia:
return _(u"Vencido")
return _(u"Vigente")
return _("Vencido")
return _("Vigente")
if (self.data_retorno_assinatura is None and
self.data_devolucao_sem_assinatura is None and
self.data_retorno_sem_assinatura is None):
return _(u"Pendente")
return _("Pendente")
if (self.data_devolucao_sem_assinatura is not None or
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):
if obj.pk is None:
@ -250,43 +250,43 @@ class Convenio(models.Model):
class Meta:
get_latest_by = 'id'
ordering = ('id',)
verbose_name = _(u'convênio')
verbose_name = _('convênio')
def __unicode__(self):
# 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,
# project=self.projeto.sigla,
# date=self.data_retorno_assinatura,
# status=self.get_status()))
# 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,
# date=self.data_adesao)
if ((self.data_retorno_assinatura is None) and
(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,
date=self.data_termo_aceite.strftime('%d/%m/%Y'),
project=self.projeto.sigla)
elif self.data_retorno_assinatura is None:
return _(u"{project}, nº {number}, início "
u"em {date}").format(number=self.num_convenio,
return _("{project}, nº {number}, início "
"em {date}").format(number=self.num_convenio,
project=self.projeto.sigla,
date=self.data_adesao)
if ((self.data_retorno_assinatura is not None) and not
(self.equipada and self.data_termo_aceite is not None)):
return _(u"{project}, nº {number}, inicio em "
u"{date}. Status: {status}").format(
return _("{project}, nº {number}, inicio em "
"{date}. Status: {status}").format(
number=self.num_convenio,
project=self.projeto.sigla,
date=self.data_retorno_assinatura.strftime('%d/%m/%Y'),
status=self.get_status())
if ((self.data_retorno_assinatura is not None) and
(self.equipada and self.data_termo_aceite is not None)):
return _(u"{project}, nº {number}, início em {date}"
u" e equipada em {equipped_date}. Status: {status}"
return _("{project}, nº {number}, início em {date}"
" e equipada em {equipped_date}. Status: {status}"
).format(number=self.num_convenio,
project=self.projeto.sigla,
date=self.data_retorno_assinatura.strftime(
@ -304,7 +304,7 @@ class EquipamentoPrevisto(models.Model):
convenio = models.ForeignKey(
Convenio,
on_delete=models.CASCADE,
verbose_name=_(u'convênio')
verbose_name=_('convênio')
)
equipamento = models.ForeignKey(
'inventario.Equipamento',
@ -313,11 +313,11 @@ class EquipamentoPrevisto(models.Model):
quantidade = models.PositiveSmallIntegerField(default=1)
class Meta:
verbose_name = _(u'equipamento previsto')
verbose_name_plural = _(u'equipamentos previstos')
verbose_name = _('equipamento previsto')
verbose_name_plural = _('equipamentos previstos')
def __unicode__(self):
return u'%s %s(s)' % (self.quantidade, self.equipamento)
return '%s %s(s)' % (self.quantidade, self.equipamento)
class Anexo(models.Model):
@ -328,13 +328,13 @@ class Anexo(models.Model):
convenio = models.ForeignKey(
Convenio,
on_delete=models.CASCADE,
verbose_name=_(u'convênio')
verbose_name=_('convênio')
)
# caminho no sistema para o documento anexo
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(
_(u'data da publicação do anexo'),
_('data da publicação do anexo'),
default=datetime.now
)
@ -366,74 +366,74 @@ class Tramitacao(models.Model):
convenio = models.ForeignKey(
Convenio,
on_delete=models.CASCADE,
verbose_name=_(u'convênio')
verbose_name=_('convênio')
)
unid_admin = models.ForeignKey(
UnidadeAdministrativa,
on_delete=models.PROTECT,
verbose_name=_(u'Unidade Administrativa')
verbose_name=_('Unidade Administrativa')
)
data = models.DateField()
observacao = models.CharField(
_(u'observação'),
_('observação'),
max_length='512',
null=True,
blank=True,
)
class Meta:
verbose_name_plural = _(u'Tramitações')
verbose_name_plural = _('Tramitações')
def __unicode__(self):
in_date = _(u"em %(date)s") % dict(date=self.data) # for focused translation
result = u"%s %s" % (self.unid_admin, in_date)
in_date = _("em %(date)s") % dict(date=self.data) # for focused translation
result = "%s %s" % (self.unid_admin, in_date)
if self.observacao:
result = result + u" (%s)" % (self.observacao)
result = result + " (%s)" % (self.observacao)
return unicode(result) # XXX is this unicode(...) really necessary???
class Gescon(models.Model):
url_gescon = models.URLField(
_(u"Webservice Gescon"),
default=(u"https://adm.senado.gov.br/gestao-contratos/api/contratos"
u"/busca?especie={s}"),
help_text=_(u"Informe o ponto de consulta do webservice do Gescon, "
u"inclusive com a querystring. No ponto onde deve ser "
u"inserida a sigla da subespecie do contrato, use a "
u"marcação {s}.<br/><strong>Por exemplo:</strong> "
u"https://adm.senado.gov.br/gestao-contratos/api/contratos"
u"/busca?especie=<strong>{s}</strong>")
_("Webservice Gescon"),
default=("https://adm.senado.gov.br/gestao-contratos/api/contratos"
"/busca?especie={s}"),
help_text=_("Informe o ponto de consulta do webservice do Gescon, "
"inclusive com a querystring. No ponto onde deve ser "
"inserida a sigla da subespecie do contrato, use a "
"marcação {s}.<br/><strong>Por exemplo:</strong> "
"https://adm.senado.gov.br/gestao-contratos/api/contratos"
"/busca?especie=<strong>{s}</strong>")
)
subespecies = models.TextField(
_(u"Subespécies"),
default=u"AC=ACT\nPI=PI\nCN=PML\nTA=PML",
help_text=_(u"Informe as siglas das subespécies de contratos que "
u"devem ser pesquisados no Gescon com a sigla "
u"correspondente do projeto no SIGI. Coloque um par de "
u"siglas por linha, no formato SIGLA_GESTON=SIGLA_SIGI. "
u"As siglas não encontradas serão ignoradas.")
_("Subespécies"),
default="AC=ACT\nPI=PI\nCN=PML\nTA=PML",
help_text=_("Informe as siglas das subespécies de contratos que "
"devem ser pesquisados no Gescon com a sigla "
"correspondente do projeto no SIGI. Coloque um par de "
"siglas por linha, no formato SIGLA_GESTON=SIGLA_SIGI. "
"As siglas não encontradas serão ignoradas.")
)
palavras = models.TextField(
_(u"Palavras de filtro"),
default=u"ILB\nINTERLEGIS",
help_text=_(u"Palavras que devem aparecer no campo OBJETO dos dados do "
u"Gescon para identificar se o contrato pertence ao ILB. "
u"<ul><li>Informe uma palavra por linha.</li>"
u"<li>Ocorrendo qualquer uma das palavras, o contrato será "
u"importado.</li></ul>")
_("Palavras de filtro"),
default="ILB\nINTERLEGIS",
help_text=_("Palavras que devem aparecer no campo OBJETO dos dados do "
"Gescon para identificar se o contrato pertence ao ILB. "
"<ul><li>Informe uma palavra por linha.</li>"
"<li>Ocorrendo qualquer uma das palavras, o contrato será "
"importado.</li></ul>")
)
email = models.EmailField(
_(u"E-mail"),
help_text=_(u"Caixa de e-mail para onde o relatório diário de "
u"importação será enviado.")
_("E-mail"),
help_text=_("Caixa de e-mail para onde o relatório diário de "
"importação será enviado.")
)
ultima_importacao = models.TextField(
_(u"Resultado da última importação"),
_("Resultado da última importação"),
blank=True
)
class Meta:
verbose_name = _(u"Configuração do Gescon")
verbose_name_plural = _(u"Configurações do Gescon")
verbose_name = _("Configuração do Gescon")
verbose_name_plural = _("Configurações do Gescon")
def __unicode__(self):
return self.url_gescon
@ -454,43 +454,43 @@ class Gescon(models.Model):
def email_report(self):
if self.email:
send_mail(
subject=_(u"Relatório de importação GESCON"),
subject=_("Relatório de importação GESCON"),
message=self.ultima_importacao,
recipient_list=self.email,
fail_silently=True
)
else:
self.ultima_importacao += _(
u"\n\n*Não foi definida uma caixa de e-mail nas configurações "
u"do Gescon*"
"\n\n*Não foi definida uma caixa de e-mail nas configurações "
"do Gescon*"
)
self.save()
def importa_contratos(self):
self.ultima_importacao = ""
self.add_message(
_(u"Importação iniciada em {:%d/%m/%Y %H:%M:%S}\n"
u"==========================================\n").format(
_("Importação iniciada em {:%d/%m/%Y %H:%M:%S}\n"
"==========================================\n").format(
datetime.now()
)
)
if self.palavras == "":
self.add_message(_(u"Nenhuma palavra de pesquisa definida - "
u"processo abortado."), True)
self.add_message(_("Nenhuma palavra de pesquisa definida - "
"processo abortado."), True)
return
if self.subespecies == "":
self.add_message(_(u"Nenhuma subespécie definida - processo "
u"abortado."), True)
self.add_message(_("Nenhuma subespécie definida - processo "
"abortado."), True)
return
if "{s}" not in self.url_gescon:
self.add_message(
_(
u"Falta a marcação {s} na URL para indicar o local onde "
u"inserir a sigla da subespécia na consulta ao webservice "
u"- processo abortado."
"Falta a marcação {s} na URL para indicar o local onde "
"inserir a sigla da subespécia na consulta ao webservice "
"- processo abortado."
),
True
)
@ -500,7 +500,7 @@ class Gescon(models.Model):
subespecies = {tuple(s.split("=")) for s in self.subespecies.split()}
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)))
url = self.url_gescon.format(s=sigla_gescon)
@ -510,7 +510,7 @@ class Gescon(models.Model):
response = requests.get(url, verify=False)
except Exception as e:
self.add_message(
_(u"\tErro ao acessar {url}: {errmsg}").format(
_("\tErro ao acessar {url}: {errmsg}").format(
url=url,
errmsg=e.message.decode("utf8")
)
@ -519,7 +519,7 @@ class Gescon(models.Model):
if not response.ok:
self.add_message(
_(u"\tErro ao acessar {url}: {reason}").format(
_("\tErro ao acessar {url}: {reason}").format(
url=url,
reason=response.reason
)
@ -527,8 +527,8 @@ class Gescon(models.Model):
continue
if not 'application/json' in response.headers.get('Content-Type'):
self.add_message(_(u"\tResultado da consulta à {url} não "
u"retornou dados em formato json").format(
self.add_message(_("\tResultado da consulta à {url} não "
"retornou dados em formato json").format(
url=url
)
)
@ -542,7 +542,7 @@ class Gescon(models.Model):
if any(palavra in c['objeto'] for palavra in palavras)]
self.add_message(
_(u"\t{count} contratos encontrados no Gescon").format(
_("\t{count} contratos encontrados no Gescon").format(
count=len(nossos)
)
)
@ -570,7 +570,7 @@ class Gescon(models.Model):
if 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.strip()
@ -581,8 +581,8 @@ class Gescon(models.Model):
if (cnpj is None) and (nome is None):
self.add_message(
_(u"\tO contrato {numero} no Gescon não informa o CNPJ "
u"nem o nome do órgão.").format(numero=numero)
_("\tO contrato {numero} no Gescon não informa o CNPJ "
"nem o nome do órgão.").format(numero=numero)
)
erros += 1
continue
@ -609,10 +609,10 @@ class Gescon(models.Model):
if orgao is None:
self.add_message(
_(u"\tÓrgão não encontrado no SIGI ou mais de um órgão"
u"encontrado com o mesmo CNPJ ou nome. Favor "
u"regularizar o cadastro: CNPJ: {cnpj}, "
u"Nome: {nome}".format(
_("\tÓrgão não encontrado no SIGI ou mais de um órgão"
"encontrado com o mesmo CNPJ ou nome. Favor "
"regularizar o cadastro: CNPJ: {cnpj}, "
"Nome: {nome}".format(
cnpj=contrato['cnpjCpfFornecedor'],
nome=contrato['nomeFornecedor']
)
@ -656,8 +656,8 @@ class Gescon(models.Model):
data_termino_vigencia=contrato['terminoVigencia'],
data_pub_diario=contrato['publicacao'],
atualizacao_gescon=datetime.now(),
observacao_gescon=_(u"Importado integralmente do"
u"Gescon")
observacao_gescon=_("Importado integralmente do"
"Gescon")
)
convenio.save()
novos += 1
@ -668,8 +668,8 @@ class Gescon(models.Model):
convenio.observacao_gescon = ''
if convenio.casa_legislativa != orgao:
self.add_message(
_(u"\tO órgao no convênio {url} diverge do que "
u"consta no Gescon ({cnpj}, {nome})").format(
_("\tO órgao no convênio {url} diverge do que "
"consta no Gescon ({cnpj}, {nome})").format(
url=reverse('admin:%s_%s_change' % (
convenio._meta.app_label,
convenio._meta.model_name),
@ -679,7 +679,7 @@ class Gescon(models.Model):
)
)
convenio.observacao_gescon = _(
u'ERRO: Órgão diverge do Gescon. Não atualizado!'
'ERRO: Órgão diverge do Gescon. Não atualizado!'
)
convenio.save()
erros += 1
@ -687,10 +687,10 @@ class Gescon(models.Model):
if convenio.num_processo_sf != sigad:
self.add_message(
_(u"\tO contrato Gescon nº {numero} corresponde"
u" ao convênio SIGI {url}, mas o NUP sigad "
u"diverge (Gescon: {sigad_gescon}, "
u"SIGI: {sigad_sigi}). CORRIGIDO!").format(
_("\tO contrato Gescon nº {numero} corresponde"
" ao convênio SIGI {url}, mas o NUP sigad "
"diverge (Gescon: {sigad_gescon}, "
"SIGI: {sigad_sigi}). CORRIGIDO!").format(
numero=numero,
url=reverse('admin:%s_%s_change' % (
convenio._meta.app_label,
@ -702,16 +702,16 @@ class Gescon(models.Model):
)
convenio.num_processo_sf = sigad
convenio.observacao_gescon += _(
u"Número do SIGAD atualizado.\n"
"Número do SIGAD atualizado.\n"
)
alertas += 1
if convenio.num_convenio != numero:
self.add_message(
_(u"\tO contrato Gescon ID {id} corresponde ao "
u"convênio SIGI {url}, mas o número do convênio"
u" diverge (Gescon: {numero_gescon}, SIGI: "
u"{numero_sigi}). CORRIGIDO!").format(
_("\tO contrato Gescon ID {id} corresponde ao "
"convênio SIGI {url}, mas o número do convênio"
" diverge (Gescon: {numero_gescon}, SIGI: "
"{numero_sigi}). CORRIGIDO!").format(
id=contrato['id'],
url=reverse('admin:%s_%s_change' % (
convenio._meta.app_label,
@ -724,14 +724,14 @@ class Gescon(models.Model):
)
convenio.num_convenio = numero
convenio.observacao_gescon += _(
u"Número do convênio atualizado.\n"
"Número do convênio atualizado.\n"
)
alertas += 1
if contrato['objeto'] not in convenio.observacao:
convenio.observacao += "\n" + contrato['objeto']
convenio.observacao_gescon += _(
u"Observação atualizada.\n"
"Observação atualizada.\n"
)
convenio.data_sigad = contrato['assinatura']
@ -753,10 +753,10 @@ class Gescon(models.Model):
convenio.save()
except Exception as e:
self.add_message(
_(u"Ocorreu um erro ao salvar o convênio {url} no "
u"SIGI. Alguma informação do Gescon pode ter "
u"quebrado o sistema. Informe ao suporte. Erro:"
u"{errmsg}").format(
_("Ocorreu um erro ao salvar o convênio {url} no "
"SIGI. Alguma informação do Gescon pode ter "
"quebrado o sistema. Informe ao suporte. Erro:"
"{errmsg}").format(
url=reverse('admin:%s_%s_change' % (
convenio._meta.app_label,
convenio._meta.model_name),
@ -770,10 +770,10 @@ class Gescon(models.Model):
atualizados += 1
else:
self.add_message(_(u"\tExistem {count} convênios no SIGI "
u"que correspondem ao mesmo contrato no "
u"Gescon (contrato {numero}, sigad "
u"{sigad})").format(
self.add_message(_("\tExistem {count} convênios no SIGI "
"que correspondem ao mesmo contrato no "
"Gescon (contrato {numero}, sigad "
"{sigad})").format(
count=chk,
numero=numero,
sigad=sigad
@ -783,9 +783,9 @@ class Gescon(models.Model):
continue
self.add_message(
_(u"\t{novos} novos convenios adicionados ao SIGI, "
u"{atualizados} atualizados, sendo {alertas} com alertas, e "
u"{erros} reportados com erro.").format(
_("\t{novos} novos convenios adicionados ao SIGI, "
"{atualizados} atualizados, sendo {alertas} com alertas, e "
"{erros} reportados com erro.").format(
novos=novos,
atualizados=atualizados,
alertas=alertas,

50
sigi/apps/convenios/reports.py

@ -26,7 +26,7 @@ class SemEquipamentosReport(object):
class ConvenioReport(ReportDefault):
title = _(u'Relatório de Parcerias')
title = _('Relatório de Parcerias')
class band_page_header(ReportDefault.band_page_header):
@ -37,41 +37,41 @@ class ConvenioReport(ReportDefault):
elements += [
Label(
text=_(u"UF"),
text=_("UF"),
left=label_left[0] * cm,
top=label_top + 0.4 * cm,
),
Label(
text=_(u"Municipio"),
text=_("Municipio"),
left=label_left[1] * cm,
top=label_top + 0.4 * cm,
),
Label(
text=_(u"Número do Convênio"),
text=_("Número do Convênio"),
left=label_left[2] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_(u"Projeto"),
text=_("Projeto"),
left=label_left[3] * cm,
top=label_top + 0.4 * cm,
width=2 * cm,
),
Label(
text=_(u"Data do Convênio"),
text=_("Data do Convênio"),
left=label_left[4] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_(u"Data de Publicação"),
text=_("Data de Publicação"),
left=label_left[5] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_(u"Orgão"),
text=_("Orgão"),
left=label_left[6] * cm,
top=label_top + 0.4 * cm,
width=2 * cm,
@ -126,7 +126,7 @@ class ConvenioReport(ReportDefault):
# height=0.7 * cm,
# elements=[
# 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},
@ -146,35 +146,35 @@ class ConvenioReportSemAceite(ConvenioReport):
elements += [
Label(
text=_(u"UF"),
text=_("UF"),
left=label_left[0] * cm,
top=label_top + 0.4 * cm,
),
Label(
text=_(u"Município"),
text=_("Município"),
left=label_left[1] * cm,
top=label_top + 0.4 * cm,
),
Label(
text=_(u"Número do Convênio"),
text=_("Número do Convênio"),
left=label_left[2] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_(u"Projeto"),
text=_("Projeto"),
left=label_left[3] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_(u"Data do Convênio"),
text=_("Data do Convênio"),
left=label_left[4] * cm,
top=label_top,
width=2 * cm,
),
Label(
text=_(u"Orgão"),
text=_("Orgão"),
left=label_left[5] * cm,
top=label_top + 0.4 * cm,
width=2 * cm,
@ -219,7 +219,7 @@ float_duas_casas = lambda instance: '%.2f' % (instance)
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):
label_top = ReportDefault.band_page_header.label_top
@ -229,11 +229,11 @@ class ConvenioReportRegiao(ReportDefault):
elements = list(ReportDefault.band_page_header.elements)
elements += [
Label(text=_(u"UF"), left=label_left[0] * cm, top=label_top,),
Label(text=_(u"Total"), left=label_left[1] * cm, top=label_top,),
Label(text=_(u"Aderidas"), left=label_left[2] * cm, top=label_top,),
Label(text=_("UF"), left=label_left[0] * cm, top=label_top,),
Label(text=_("Total"), left=label_left[1] * cm, top=label_top,),
Label(text=_("Aderidas"), left=label_left[2] * cm, top=label_top,),
Label(text="%", 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),
]
@ -255,7 +255,7 @@ class ConvenioReportRegiao(ReportDefault):
class band_summary(ReportBand):
label_left = [0.5, 6, 8, 10, 12, 14]
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_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,
@ -270,16 +270,16 @@ class ConvenioReportRegiao(ReportDefault):
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):
title = _(u'Relatório de Parcerias por Assembléia Legislativa')
title = _('Relatório de Parcerias por Assembléia Legislativa')
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):
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):
if 'carrinho_convenios' in request.session:
del request.session['carrinho_convenios']
messages.info(request, u'O carrinho foi esvaziado')
messages.info(request, 'O carrinho foi esvaziado')
return HttpResponseRedirect('../../')
@login_required
@ -260,12 +260,12 @@ def casas_estado_to_tabela(casas, convenios, regiao):
)
cabecalho_topo = (
_(u'UF'),
_(u'Câmaras municipais'),
_(u'Não Aderidas'),
_(u'Aderidas'),
_(u'Conveniadas'),
_(u'Equipadas')
_('UF'),
_('Câmaras municipais'),
_('Não Aderidas'),
_('Aderidas'),
_('Conveniadas'),
_('Equipadas')
)
return {
@ -291,7 +291,7 @@ def report_regiao(request, regiao='NE'):
# Geral
convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM')
tabela = casas_estado_to_tabela(camaras, convenios, regiao)
tabela["projeto"] = _(u"Geral")
tabela["projeto"] = _("Geral")
tabelas.append(tabela)
@ -325,47 +325,47 @@ def export_csv(request):
if not convenios:
return HttpResponseRedirect('../')
atributos = [_(u"No. Processo"), _(u"No. Convênio"), _(u"Projeto"), _(u"Casa Legislativa"), _(u"Data de Adesão"), _(u"Data de Convênio"),
_(u"Data da Publicacao no D.O."), _(u"Data Equipada"), ]
atributos = [_("No. Processo"), _("No. Convênio"), _("Projeto"), _("Casa Legislativa"), _("Data de Adesão"), _("Data de Convênio"),
_("Data da Publicacao no D.O."), _("Data Equipada"), ]
if request.POST:
atributos = request.POST.getlist("itens_csv_selected")
col_titles = atributos
if _(u"Casa Legislativa") in col_titles:
pos = col_titles.index(_(u"Casa Legislativa")) + 1
col_titles.insert(pos, _(u"uf"))
if _("Casa Legislativa") in col_titles:
pos = col_titles.index(_("Casa Legislativa")) + 1
col_titles.insert(pos, _("uf"))
csv_writer.writerow([s.encode("utf-8") for s in col_titles])
for convenio in convenios:
lista = []
for atributo in atributos:
if _(u"No. Processo") == atributo:
if _("No. Processo") == atributo:
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"))
elif _(u"Projeto") == atributo:
elif _("Projeto") == atributo:
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.municipio.uf.sigla.encode("utf-8"))
elif _(u"Data de Adesão") == atributo:
elif _("Data de Adesão") == atributo:
data = ''
if convenio.data_adesao:
data = convenio.data_adesao.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8"))
elif _(u"Data de Convênio") == atributo:
elif _("Data de Convênio") == atributo:
data = ''
if convenio.data_retorno_assinatura:
data = convenio.data_retorno_assinatura.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8"))
elif _(u"Data da Publicacao no D.O.") == atributo:
elif _("Data da Publicacao no D.O.") == atributo:
data = ''
if convenio.data_pub_diario:
data = convenio.data_pub_diario.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8"))
data = ''
elif _(u"Data Equipada") == atributo:
elif _("Data Equipada") == atributo:
if convenio.data_termo_aceite:
data = convenio.data_termo_aceite.strftime("%d/%m/%Y")
lista.append(data.encode("utf-8"))

16
sigi/apps/diagnosticos/admin.py

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

6
sigi/apps/diagnosticos/forms.py

@ -115,7 +115,7 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm):
defaults.update({'queryset': schema.get_choices(),
'initial': choice.pk if choice else None,
# 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.update(self.FIELD_WIDGET.get(schema.name, {}))
@ -133,7 +133,7 @@ class DiagnosticoMobileForm(BaseDynamicEntityForm):
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()
class Meta:
@ -143,7 +143,7 @@ class OrgaoMobileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(OrgaoMobileForm, self).__init__(*args, **kwargs)
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,
required=False)

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

@ -16,27 +16,27 @@ DATATYPES = {
}
class Command(BaseCommand):
help = u"""Exporta dados do diagnóstico para o formato Tab-Separated-Values
do LimeSurvey, conforme documentado em
help = """Exporta dados do diagnóstico para o formato Tab-Separated-Values
do LimeSurvey, conforme documentado em
https://manual.limesurvey.org/Tab_Separated_Value_survey_structure"""
def handle(self, *args, **options):
def normalize(l):
return [s.encode('utf-8') for s in l]
nonum = lambda s: s[s.index(' ')+1:]
avalue = lambda e: ('Y' if e.title == u'Sim' else 'N'
if e.title == u'Não' else e.id)
avalue = lambda e: ('Y' if e.title == 'Sim' else 'N'
if e.title == 'Não' else e.id)
setores = [(i+1, s[0], s[1]) for i, s in enumerate(
Funcionario.SETOR_CHOICES)]
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]
lsf = csv.writer(open(args[1], 'wb+'), delimiter="\t",
lsf = csv.writer(open(args[1], 'wb+'), delimiter="\t",
quoting=csv.QUOTE_MINIMAL)
struct = ['id', 'token', 'submitdate', 'lastpage', 'startlanguage',
@ -56,55 +56,55 @@ class Command(BaseCommand):
'pt-BR'],
['', '', 'SL', '', 'surveyls_language', '', 'pt-BR', '', 'pt-BR'],
['', '', 'SL', '', 'surveyls_title', '',
u'Diagnóstico PML'.encode('utf-8'), '', 'pt-BR']])
'Diagnóstico PML'.encode('utf-8'), '', 'pt-BR']])
self.stdout.write("Done!")
# Identificação da Casa Legislativa e sua equipe #
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']))
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')
lsf.writerows([normalize(['1001', '', 'A', '0', sigla, '', nome, '',
'pt-BR']) for sigla, nome in UnidadeFederativa.REGIAO_CHOICES])
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')
lsf.writerows([normalize(['1002', '', 'A', '0', u.sigla, '', u.nome, '',
'pt-BR']) for u in UnidadeFederativa.objects.all()])
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')
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']))
struct.append('c001q004')
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')
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']))
struct.append('c001q006')
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')
lsf.writerow(normalize(['1008', '', 'Q', 'S', 'c001q008', '1',
u'CNPJ', '', 'pt-BR', '', 'N', 'N', '', '0']))
'CNPJ', '', 'pt-BR', '', 'N', 'N', '', '0']))
struct.append('c001q008')
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')
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')
lsf.writerow(normalize(['1011', '', 'Q', ';', 'c001q011', '1',
u'Pessoas de contato', '', 'pt-BR', '', 'N', 'N', '', '0']))
lsf.writerow(normalize(['101198', '', 'SQ', '1', 'SQ00101', '', u'Nome',
'Pessoas de contato', '', 'pt-BR', '', 'N', 'N', '', '0']))
lsf.writerow(normalize(['101198', '', 'SQ', '1', 'SQ00101', '', 'Nome',
'', 'pt-BR', '', '', 'N', '', '0']))
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:
lsf.writerow(normalize(['10110{0}'.format(i), '', 'SQ', '',
'SQ1010{0}'.format(i), '1', v, '', 'pt-BR', '', '', 'N',
@ -117,25 +117,25 @@ class Command(BaseCommand):
self.stdout.write("Done!")
# Equipe de diagnóstico #
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']))
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')
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')
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')
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')
self.stdout.write("Done!")
for c in Categoria.objects.all():
self.stdout.write("\t{0}...".format(nonum(c.nome).encode('utf-8')), ending=" ")
lsf.writerow(normalize([str(c.id), '', 'G', '',
lsf.writerow(normalize([str(c.id), '', 'G', '',
nonum(c.nome), '', nonum(c.nome), '',
'pt-BR']))
perguntas = sorted([(p.title, p) for p in c.perguntas.all()])
@ -143,16 +143,16 @@ class Command(BaseCommand):
lstype = DATATYPES[p.datatype]
# Hack para perguntas SIM/NÃO que foram cadastradas como Choice
if lstype == 'L':
if ("".join([e.title for e in p.choices.all()]) in
[u"SimNão", u"NãoSim"]):
if ("".join([e.title for e in p.choices.all()]) in
["SimNão", "NãoSim"]):
lstype = 'Y'
########
relevance = "1"
if p.abre_por.exists():
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,
qid=e.schema.id, value=avalue(e)) for e in
qid=e.schema.id, value=avalue(e)) for e in
p.abre_por.all()]) + ")"
lsf.writerow(normalize([str(p.id), '', 'Q', lstype,
@ -160,12 +160,12 @@ class Command(BaseCommand):
nonum(p.title), p.help_text, 'pt-BR', '', 'NY'[p.required],
'N', '', '0']))
if lstype == 'L':
lsf.writerows([normalize([str(p.id), u'', u'A', u'0',
str(e.id), u'', e.title, u'', u'pt-BR'])
lsf.writerows([normalize([str(p.id), '', 'A', '0',
str(e.id), '', e.title, '', 'pt-BR'])
for e in p.choices.all()])
if lstype == 'M':
lsf.writerows([normalize([str(p.id*1000+e.id), u'', u'SQ',
u'', str(e.id), u'1', e.title, u'', u'pt-BR'])
lsf.writerows([normalize([str(p.id*1000+e.id), '', 'SQ',
'', str(e.id), '1', e.title, '', 'pt-BR'])
for e in p.choices.all()])
struct.extend(['c{0:03}q{1:03}_{2}'.format(c.id, p.id,
e.id) for e in p.choices.all()])
@ -184,7 +184,7 @@ class Command(BaseCommand):
dtf.writerow(struct)
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}')
@ -207,9 +207,9 @@ class Command(BaseCommand):
form['c001q006'] = \
d.casa_legislativa.data_instalacao.isoformat()
form['c001q007'] = (
u"{logradouro}{{cr}}{{newline}}"
u"{bairro}{{cr}}{{newline}}"
u"{cep} - {municipio} - {uf}".format(
"{logradouro}{{cr}}{{newline}}"
"{bairro}{{cr}}{{newline}}"
"{cep} - {municipio} - {uf}".format(
logradouro=d.casa_legislativa.logradouro,
bairro=d.casa_legislativa.bairro,
cep=d.casa_legislativa.cep,
@ -252,9 +252,9 @@ class Command(BaseCommand):
if r.schema.datatype == 'one':
if value is None:
value = '{question_not_shown}'
elif value.title == u'Sim':
elif value.title == 'Sim':
value = 'Y'
elif value.title == u'Não':
elif value.title == 'Não':
value = 'N'
else:
value = r.value.id
@ -264,12 +264,12 @@ class Command(BaseCommand):
replace('\r', '{cr}{newline}').\
replace('\n', '{cr}{newline}').\
replace('\t', ' ')
if value is None:
value = '{question_not_shown}'
form[key] = u'{0}'.format(value)
form[key] = '{0}'.format(value)
dtf.writerow(normalize(form.values()))
self.stdout.write('Done!')

42
sigi/apps/diagnosticos/models.py

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

10
sigi/apps/diagnosticos/widgets.py

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

10
sigi/apps/eventos/admin.py

@ -80,13 +80,13 @@ class EventoAdmin(admin.ModelAdmin):
quant = q2 - q1
if quant:
self.message_user(request, str(q2 - q1) + " " +
_(u"Eventos adicionados no carrinho"))
_("Eventos adicionados no carrinho"))
else:
self.message_user(request, _(u"Os Eventos selecionados "
u"já foram adicionados anteriormente"))
self.message_user(request, _("Os Eventos selecionados "
"já foram adicionados anteriormente"))
return HttpResponseRedirect('.')
adicionar_eventos.short_description = _(u"Armazenar eventos no carrinho "
u"para exportar")
adicionar_eventos.short_description = _("Armazenar eventos no carrinho "
"para exportar")
def lookup_allowed(self, lookup, value):
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:
raise forms.ValidationError(
_(u"Data término deve ser posterior à data inicio"),
_("Data término deve ser posterior à data inicio"),
code="invalid_period"
)
@ -28,5 +28,5 @@ class SelecionaModeloForm(forms.Form):
modelo = forms.ModelChoiceField(
queryset=ModeloDeclaracao.objects.all(),
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)),
('data_convite', models.DateField(verbose_name='Data do 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')),
],
options={
@ -127,7 +127,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='convite',
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,
),
migrations.AlterUniqueTogether(

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

@ -21,7 +21,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='convite',
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,
),
migrations.AlterField(

186
sigi/apps/eventos/models.py

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

20
sigi/apps/eventos/views.py

@ -157,14 +157,14 @@ def alocacao_equipe(request):
locale.setlocale(locale.LC_ALL, lang)
meses = [calendar.month_name[m] for m in range(1,13)]
linhas = [[_(u"Servidor")] + meses + ['total']]
linhas = [[_("Servidor")] + meses + ['total']]
for r in dados:
r[2].append(reduce(lambda x,y:{'dias': x['dias'] + y['dias'],
'eventos': x['eventos'] + y['eventos']}, r[2]))
linhas.append([r[1]] +
[_(ungettext(u"%(dias)s dia", u"%(dias)s dias", d['dias']) + " em " +
ungettext(u"%(eventos)s evento", u"%(eventos)s eventos", d['eventos'])
[_(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 r[2]])
# 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 -
# part.evento.data_inicio).days + 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
@ -277,7 +277,7 @@ def visualizar_carrinho(request):
def excluir_carrinho(request):
if 'carrinho_eventos' in request.session:
del request.session['carrinho_eventos']
messages.info(request, u'O carrinho foi esvaziado')
messages.info(request, 'O carrinho foi esvaziado')
return HttpResponseRedirect('../../')
@login_required
@ -295,7 +295,7 @@ def deleta_itens_carrinho(request):
else:
del lista
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('.')
@login_required
@ -320,14 +320,14 @@ def export_csv(request):
eventos.select_related('equipe', 'convite')
if not eventos:
messages.info(request, _(u"Nenhum evento a exportar"))
messages.info(request, _("Nenhum evento a exportar"))
return HttpResponseRedirect('../')
max_equipe = max([e.equipe_set.count() for e in eventos])
mun_casa = u'Município da Casa Anfitriã'.encode('utf8')
uf_casa = u'UF da Casa Anfitriã'.encode('utf8')
reg_casa = u'Região da Casa Anfitriã'.encode('utf8')
mun_casa = 'Município da Casa Anfitriã'.encode('utf8')
uf_casa = 'UF 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.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,
on_delete=models.CASCADE,
verbose_name=_(u'Projeto')
verbose_name=_('Projeto')
)
descricao = models.CharField(_(u'Descrição da despesa'), max_length=100)
data = models.DateField(_(u'Data do desembolso'))
valor_reais = models.DecimalField(_(u'Valor em R$'), max_digits=18, decimal_places=2)
valor_dolar = models.DecimalField(_(u'Valor em US$'), max_digits=18, decimal_places=2)
descricao = models.CharField(_('Descrição da despesa'), max_length=100)
data = models.DateField(_('Data do desembolso'))
valor_reais = models.DecimalField(_('Valor em R$'), max_digits=18, decimal_places=2)
valor_dolar = models.DecimalField(_('Valor em US$'), max_digits=18, decimal_places=2)
class Meta:
verbose_name = _(u'Desembolso')
verbose_name_plural = _(u'Desembolsos')
verbose_name = _('Desembolso')
verbose_name_plural = _('Desembolsos')
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',
'options': {'responsive': True},
'data': [
{'label': _(u"Utilizam serviços"),
{'label': _("Utilizam serviços"),
'value': casas.exclude(servico=None).count(),
'color': '#91e8e1'},
{'label': _(u"Não utilizam serviços"),
{'label': _("Não utilizam serviços"),
'value': casas.filter(servico=None).count(),
'color': '#f7a35c'},
]
@ -174,31 +174,31 @@ def report_sem_convenio(request):
if modo == 'H':
casas = sc['hospedagem']
titulo = _(u"Casas sem convenio que utilizam algum serviço de "
u"hospedagem")
titulo = _("Casas sem convenio que utilizam algum serviço de "
"hospedagem")
elif modo == 'R':
casas = sc['registro']
titulo = _(u"Casas sem convenio que utilizam somente serviço de "
u"registro")
titulo = _("Casas sem convenio que utilizam somente serviço de "
"registro")
else:
casas = sc['total']
titulo = _(u"Casas sem convenio que utilizam algum serviço de registro "
u"e/ou hospedagem")
titulo = _("Casas sem convenio que utilizam algum serviço de registro "
"e/ou hospedagem")
if fmt == 'csv':
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename=casas.csv'
writer = csv.writer(response)
writer.writerow([titulo.encode('utf8')])
writer.writerow([u''])
writer.writerow([u'casa', u'uf', u'gerentes',
u'serviços'.encode('utf8')])
writer.writerow([''])
writer.writerow(['casa', 'uf', 'gerentes',
'serviços'.encode('utf8')])
for casa in casas:
writer.writerow([
casa.nome.encode('utf8'),
casa.municipio.uf.sigla.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(
'tipo_servico__nome', flat=True))).encode('utf8'),
])
@ -273,14 +273,14 @@ def busca_informacoes_camara():
# Cabecalho da esquerda na tabela
cabecalho_esquerda = (
_(u'Câmaras municipais'),
_(u'Câmaras municipais não aderidas'),
_(u'Câmaras municipais aderidas'),
_(u'Câmaras municipais com convênios assinados'),
_(u'Câmaras municipais convênios em andamento'),
_(u'Câmaras municipais equipadas'),
_(u'Diagnósticos digitados'),
_(u'Diagnósticos publicados')
_('Câmaras municipais'),
_('Câmaras municipais não aderidas'),
_('Câmaras municipais aderidas'),
_('Câmaras municipais com convênios assinados'),
_('Câmaras municipais convênios em andamento'),
_('Câmaras municipais equipadas'),
_('Diagnósticos digitados'),
_('Diagnósticos publicados')
)
linhas = (
@ -383,8 +383,8 @@ def busca_informacoes_seit(mes_atual=None):
def busca_informacoes_diagnostico():
return [
{'title': _(u'Diagnósticos digitados'), 'count': Diagnostico.objects.count()},
{'title': _(u'Diagnósticos publicados'), 'count': Diagnostico.objects.filter(publicado=True).count()},
{'title': _('Diagnósticos digitados'), 'count': Diagnostico.objects.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):
nome = models.CharField(max_length=40)
nome.alphabetic_filter = True
email = models.EmailField(_(u'e-mail'), blank=True)
pagina_web = models.URLField(_(u'página web'), blank=True)
email = models.EmailField(_('e-mail'), blank=True)
pagina_web = models.URLField(_('página web'), blank=True)
telefones = GenericRelation('contatos.Telefone')
contatos = GenericRelation('contatos.Contato')
class Meta:
ordering = ('nome',)
verbose_name_plural = _(u'fornecedores')
verbose_name_plural = _('fornecedores')
def __unicode__(self):
return self.nome
@ -36,8 +36,8 @@ class TipoEquipamento(models.Model):
class Meta:
ordering = ('tipo',)
verbose_name = _(u'tipo de equipamento')
verbose_name_plural = _(u'tipos de equipamentos')
verbose_name = _('tipo de equipamento')
verbose_name_plural = _('tipos de equipamentos')
def __unicode__(self):
return self.tipo
@ -47,14 +47,14 @@ class ModeloEquipamento(models.Model):
tipo = models.ForeignKey(
TipoEquipamento,
on_delete=models.PROTECT,
verbose_name=_(u'tipo de equipamento')
verbose_name=_('tipo de equipamento')
)
modelo = models.CharField(max_length=30)
class Meta:
ordering = ('modelo',)
verbose_name = _(u'modelo de equipamento')
verbose_name_plural = _(u'modelos de equipamentos')
verbose_name = _('modelo de equipamento')
verbose_name_plural = _('modelos de equipamentos')
def __unicode__(self):
return self.modelo
@ -86,20 +86,20 @@ class Bem(models.Model):
equipamento = models.ForeignKey(Equipamento, on_delete=models.CASCADE)
fornecedor = models.ForeignKey(Fornecedor, on_delete=models.PROTECT)
num_serie = models.CharField(
_(u'número de série'),
_('número de série'),
max_length=64,
help_text=_(u'Número fornecido pelo fabricante.'),
help_text=_('Número fornecido pelo fabricante.'),
unique=True
)
recebido_por = models.CharField(
max_length=64,
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:
verbose_name_plural = _(u'bens')
verbose_name_plural = _('bens')
def __unicode__(self):
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):
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'
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):
ALGORITMO_CHOICES = (
('SUM_GASTOS', _(u'Soma dos desembolsos')),
('COUNT_EQUI', _(u'Quantidade de casas equipadas')),
('COUNT_ADER', _(u'Quantidade de casas aderidas')),
('COUNT_DIAG', _(u'Quantidade de casas diagnosticadas')),
('COUNT_PDIR', _(u'Quantidade de planos diretores')),
('COUNT_CONV', _(u'Quantidade de casas conveniadas')),
('SUM_GASTOS', _('Soma dos desembolsos')),
('COUNT_EQUI', _('Quantidade de casas equipadas')),
('COUNT_ADER', _('Quantidade de casas aderidas')),
('COUNT_DIAG', _('Quantidade de casas diagnosticadas')),
('COUNT_PDIR', _('Quantidade de planos diretores')),
('COUNT_CONV', _('Quantidade de casas conveniadas')),
)
projeto = models.ForeignKey(
Projeto,
on_delete=models.CASCADE,
verbose_name=_(u'Projeto'),
help_text=_(u'Projeto ao qual a meta se refere')
verbose_name=_('Projeto'),
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'))
descricao = models.TextField(_(u'Descrição'))
data_inicio = models.DateField(_(u'Data inicial'), help_text=_(u'Início do período de cômputo da meta'))
data_fim = models.DateField(_(u'Data final'), help_text=_(u'Prazo final para cumprimento da meta'))
algoritmo = models.CharField(_(u'Algoritmo de cálculo'), max_length=10, choices=ALGORITMO_CHOICES)
valor_meta = models.FloatField(_(u'Valor da meta'), help_text=_(u'Valor que deve ser atingido até o prazo final da meta'))
titulo = models.CharField(_('Título'), max_length=40, help_text=_('Título da meta que aparecerá no dashboard'))
descricao = models.TextField(_('Descrição'))
data_inicio = models.DateField(_('Data inicial'), help_text=_('Início do período de cômputo da meta'))
data_fim = models.DateField(_('Data final'), help_text=_('Prazo final para cumprimento da meta'))
algoritmo = models.CharField(_('Algoritmo de cálculo'), max_length=10, choices=ALGORITMO_CHOICES)
valor_meta = models.FloatField(_('Valor da meta'), help_text=_('Valor que deve ser atingido até o prazo final da meta'))
class Meta:
verbose_name = _(u'Meta BID')
verbose_name_plural = _(u'Metas BID')
verbose_name = _('Meta BID')
verbose_name_plural = _('Metas BID')
def __unicode__(self):
return self.titulo
@ -116,27 +116,27 @@ class Meta(models.Model):
class PlanoDiretor(models.Model):
STATUS_CHOICE = (
('E', _(u'Entregue')),
('I', _(u'Implantado')),
('E', _('Entregue')),
('I', _('Implantado')),
)
projeto = models.ForeignKey(
Projeto,
on_delete=models.CASCADE,
verbose_name=_(u'Projeto')
verbose_name=_('Projeto')
)
casa_legislativa = models.ForeignKey(
Orgao,
on_delete=models.CASCADE,
verbose_name=_(u'Casa Legislativa')
verbose_name=_('Casa Legislativa')
)
casa_legislativa.casa_uf_filter = True
status = models.CharField(_(u'Status'), max_length=1, choices=STATUS_CHOICE, default='E')
data_entrega = models.DateField(_(u'Data de entrega'), blank=True, null=True)
data_implantacao = models.DateField(_(u'Data de implantação'), blank=True, null=True)
status = models.CharField(_('Status'), max_length=1, choices=STATUS_CHOICE, default='E')
data_entrega = models.DateField(_('Data de entrega'), blank=True, null=True)
data_implantacao = models.DateField(_('Data de implantação'), blank=True, null=True)
class Meta:
verbose_name = _(u'Plano Diretor')
verbose_name_plural = _(u'Planos Diretores')
verbose_name = _('Plano Diretor')
verbose_name_plural = _('Planos Diretores')
def __unicode__(self):
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(
"%d/%m/%Y").encode('utf8')
if casa.ult_alt_endereco else ""),
'telefones': u", ".join(casa.telefones.values_list('numero',
'telefones': ", ".join(casa.telefones.values_list('numero',
flat=True)
).encode('utf8'),
'emails': u", ".join([casa.email] + list(
'emails': ", ".join([casa.email] + list(
casa.funcionario_set.values_list('email',flat=True))
).encode('utf8'),
'contatos': u", ".join(casa.funcionario_set.values_list(
'contatos': ", ".join(casa.funcionario_set.values_list(
'nome', flat=True)).encode('utf8'),
'convenios': u", ".join([c.__unicode__() for c in
'convenios': ", ".join([c.__unicode__() for c in
casa.convenio_set.all()]
).encode('utf8'),
'servicos': u", ".join([u"{tipo} ({url})".format(
'servicos': ", ".join(["{tipo} ({url})".format(
tipo=s.tipo_servico.nome, url=s.url)
for s in casa.servico_set.all()]
).encode('utf8')

8
sigi/apps/ocorrencias/admin.py

@ -14,7 +14,7 @@ class ComentarioViewInline(admin.TabularInline):
extra = 0
max_num = 0
can_delete = False
verbose_name, verbose_name_plural = _(u"Comentário anterior"), _(u"Comentários anteriores")
verbose_name, verbose_name_plural = _("Comentário anterior"), _("Comentários anteriores")
fields = ('usuario', 'data_criacao', 'novo_status', 'encaminhar_setor', 'descricao', )
readonly_fields = ('novo_status', 'encaminhar_setor', 'descricao', 'data_criacao', 'usuario',)
@ -22,7 +22,7 @@ class ComentarioViewInline(admin.TabularInline):
class ComentarioInline(admin.StackedInline):
model = Comentario
extra = 1
verbose_name, verbose_name_plural = _(u"Comentário novo"), _(u"Comentários novos")
verbose_name, verbose_name_plural = _("Comentário novo"), _("Comentários novos")
fieldsets = ((None, {'fields': (('novo_status', 'encaminhar_setor',), 'descricao', )}),)
def get_queryset(self, queryset):
@ -119,12 +119,12 @@ class OcorrenciaAdmin(BaseModelAdmin):
def get_uf(self, obj):
return obj.casa_legislativa.municipio.uf
get_uf.short_description = _(u'UF')
get_uf.short_description = _('UF')
get_uf.admin_order_field = 'casa_legislativa__municipio__uf'
def get_municipio(self, obj):
return obj.casa_legislativa.municipio.nome
get_municipio.short_description = _(u'Município')
get_municipio.short_description = _('Município')
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):
title = _(u'Relacionadas a Mim')
title = _('Relacionadas a Mim')
parameter_name = 'minhas'
def lookups(self, request, model_admin):
if request.user.servidor is None:
return None
return (
('S', _(u'Atribuídos ao meu setor')),
('M', _(u'Registrados por mim')),
('G', _(u'Sobre casas que gerencio')),
('S', _('Atribuídos ao meu setor')),
('M', _('Registrados por mim')),
('G', _('Sobre casas que gerencio')),
)
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):
nome = models.CharField(_(u"Categoria"), max_length=50)
descricao = models.TextField(_(u'descrição'), blank=True, null=True)
nome = models.CharField(_("Categoria"), max_length=50)
descricao = models.TextField(_('descrição'), blank=True, null=True)
setor_responsavel = models.ForeignKey(
'servidores.Servico',
on_delete=models.PROTECT,
verbose_name=_(u"Setor responsável")
verbose_name=_("Setor responsável")
)
class Meta:
verbose_name, verbose_name_plural = _(u'Categoria'), _(u'Categorias')
verbose_name, verbose_name_plural = _('Categoria'), _('Categorias')
ordering = ('nome',)
def __unicode__(self):
@ -24,10 +24,10 @@ class Categoria(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:
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):
return self.descricao
@ -41,65 +41,65 @@ class Ocorrencia(models.Model):
STATUS_DUPLICADO = 5
STATUS_CHOICES = (
(STATUS_ABERTO , _(u'Aberto')),
(STATUS_REABERTO , _(u'Reaberto')),
(STATUS_RESOLVIDO, _(u'Resolvido')),
(STATUS_FECHADO , _(u'Fechado')),
(STATUS_DUPLICADO, _(u'Duplicado')),
(STATUS_ABERTO , _('Aberto')),
(STATUS_REABERTO , _('Reaberto')),
(STATUS_RESOLVIDO, _('Resolvido')),
(STATUS_FECHADO , _('Fechado')),
(STATUS_DUPLICADO, _('Duplicado')),
)
PRIORITY_CHOICES = (
(1, _(u'Altíssimo')),
(2, _(u'Alto')),
(3, _(u'Normal')),
(4, _(u'Baixo')),
(5, _(u'Baixíssimo')),
(1, _('Altíssimo')),
(2, _('Alto')),
(3, _('Normal')),
(4, _('Baixo')),
(5, _('Baixíssimo')),
)
casa_legislativa = models.ForeignKey(
'casas.Orgao',
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_modificacao = models.DateField(_(u'Data de modificação'), null=True, blank=True, auto_now=True)
data_criacao = models.DateField(_('Data de criação'), null=True, blank=True, auto_now_add=True)
data_modificacao = models.DateField(_('Data de modificação'), null=True, blank=True, auto_now=True)
categoria = models.ForeignKey(
Categoria,
on_delete=models.PROTECT,
verbose_name=_(u'Categoria')
verbose_name=_('Categoria')
)
tipo_contato = models.ForeignKey(
TipoContato,
on_delete=models.PROTECT,
verbose_name=_(u"Tipo de contato")
verbose_name=_("Tipo de contato")
)
assunto = models.CharField(_(u'Assunto'), max_length=200)
status = models.IntegerField(_(u'Status'), choices=STATUS_CHOICES, default=1,)
prioridade = models.IntegerField(_(u'Prioridade'), choices=PRIORITY_CHOICES, default=3, )
descricao = models.TextField(_(u'descrição'), blank=True,)
resolucao = models.TextField(_(u'resolução'), blank=True,)
assunto = models.CharField(_('Assunto'), max_length=200)
status = models.IntegerField(_('Status'), choices=STATUS_CHOICES, default=1,)
prioridade = models.IntegerField(_('Prioridade'), choices=PRIORITY_CHOICES, default=3, )
descricao = models.TextField(_('descrição'), blank=True,)
resolucao = models.TextField(_('resolução'), blank=True,)
servidor_registro = models.ForeignKey(
'servidores.Servidor',
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(
'servidores.Servico',
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:
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', ]
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):
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()
def get_ticket_url(self):
@ -109,21 +109,21 @@ class Comentario(models.Model):
ocorrencia = models.ForeignKey(
Ocorrencia,
on_delete=models.CASCADE,
verbose_name=_(u'Ocorrência'),
verbose_name=_('Ocorrência'),
related_name='comentarios'
)
data_criacao = models.DateTimeField(_(u'Data de criação'), null=True, blank=True, auto_now_add=True)
descricao = models.TextField(_(u'Descrição'), blank=True, null=True)
data_criacao = models.DateTimeField(_('Data de criação'), null=True, blank=True, auto_now_add=True)
descricao = models.TextField(_('Descrição'), blank=True, null=True)
usuario = models.ForeignKey(
'servidores.Servidor',
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(
'servidores.Servico',
on_delete=models.PROTECT,
verbose_name=_(u'Encaminhar para setor'),
verbose_name=_('Encaminhar para setor'),
blank=True,
null=True
)
@ -142,15 +142,15 @@ class Anexo(models.Model):
ocorrencia = models.ForeignKey(
Ocorrencia,
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)
descricao = models.CharField(_(u'descrição do anexo'), max_length='70')
data_pub = models.DateTimeField(_(u'data da publicação do anexo'), null=True, blank=True, auto_now_add=True)
arquivo = models.FileField(_('Arquivo anexado'), upload_to='apps/ocorrencia/anexo/arquivo', max_length=500)
descricao = models.CharField(_('descrição do anexo'), max_length='70')
data_pub = models.DateTimeField(_('data da publicação do anexo'), null=True, blank=True, auto_now_add=True)
class Meta:
ordering = ('-data_pub',)
verbose_name, verbose_name_plural = _(u'Anexo'), _(u'Anexos')
verbose_name, verbose_name_plural = _('Anexo'), _('Anexos')
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':
casa = get_object_or_404(Orgao, pk=id)
ocorrencias = casa.ocorrencia_set.all()
panel_title = u"{casa}, {uf}".format(
panel_title = "{casa}, {uf}".format(
casa=casa.nome,
uf=casa.municipio.uf.sigla
)
@ -42,8 +42,8 @@ def painel_ocorrencias(request):
servidor = get_object_or_404(Servidor, pk=id)
panel_title = servidor.nome_completo
paineis = {'gerente': u"Minhas casas", 'servico': u"Meu setor",
'timeline': u"Comentados por mim"}
paineis = {'gerente': "Minhas casas", 'servico': "Meu setor",
'timeline': "Comentados por mim"}
if painel is None:
if Orgao.objects.filter(
@ -72,7 +72,7 @@ def painel_ocorrencias(request):
elif tipo == 'servico':
servico = get_object_or_404(Servico, pk=id)
ocorrencias = servico.ocorrencia_set.all()
panel_title = _(u"{sigla} - {nome}").format(
panel_title = _("{sigla} - {nome}").format(
sigla=servico.sigla, nome=servico.nome)
ocorrencias = ocorrencias.filter(status__in=[1, 2])
@ -103,7 +103,7 @@ def painel_ocorrencias(request):
def busca_nominal(request, origin="tudo"):
term = request.GET.get('term', 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 = []
@ -131,10 +131,10 @@ def muda_prioridade(request):
prioridade = request.POST.get('prioridade', 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]):
return JsonResponse({'result': 'error', 'message': _(u'Valor de prioridade não aceito')})
return JsonResponse({'result': 'error', 'message': _('Valor de prioridade não aceito')})
try:
ocorrencia = Ocorrencia.objects.get(pk=id_ocorrencia)
@ -144,14 +144,14 @@ def muda_prioridade(request):
ocorrencia.prioridade = prioridade
ocorrencia.save()
return JsonResponse({'result': 'success', 'message': _(u'Prioridade alterada')})
return JsonResponse({'result': 'success', 'message': _('Prioridade alterada')})
@login_required
def exclui_anexo(request):
anexo_id = request.GET.get('anexo_id', 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:
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},
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})
@login_required

14
sigi/apps/parlamentares/admin.py

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

84
sigi/apps/parlamentares/models.py

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

88
sigi/apps/parlamentares/reports.py

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

14
sigi/apps/relatorios/reports.py

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

76
sigi/apps/servicos/admin.py

@ -53,18 +53,18 @@ class TipoServicoAdmin(BaseModelAdmin):
ordering = ['id']
class DataUtimoUsoFilter(admin.SimpleListFilter):
title = _(u"Atualização")
title = _("Atualização")
parameter_name = 'atualizacao'
def lookups(self, request, model_admin):
return (
('err', _(u"Erro na verificação")),
('year', _(u"Sem atualização há um ano ou mais")),
('semester', _(u"Sem atualização de seis meses a um ano")),
('quarter', _(u"Sem atualização de três a seis meses")),
('month', _(u"Sem atualização de um a três meses")),
('week', _(u"Sem atualização de uma semana a um mês")),
('updated', _(u"Atualizado na última semana")),
('err', _("Erro na verificação")),
('year', _("Sem atualização há um ano ou mais")),
('semester', _("Sem atualização de seis meses a um ano")),
('quarter', _("Sem atualização de três a seis meses")),
('month', _("Sem atualização de um a três meses")),
('week', _("Sem atualização de uma semana a um mês")),
('updated', _("Atualizado na última semana")),
)
def queryset(self, request, queryset):
@ -94,13 +94,13 @@ class DataUtimoUsoFilter(admin.SimpleListFilter):
return queryset
class ServicoAtivoFilter(admin.SimpleListFilter):
title = _(u"Serviço ativo")
title = _("Serviço ativo")
parameter_name = 'ativo'
def lookups(self, request, model_admin):
return (
('ativo', _(u"Ativo")),
('desativado', _(u"Desativado")),
('ativo', _("Ativo")),
('desativado', _("Desativado")),
)
def queryset(self, request, queryset):
@ -120,13 +120,13 @@ class ServicoAdmin(BaseModelAdmin):
fieldsets = ((None, {
'fields': ('casa_legislativa', 'data_ativacao',)
}),
(_(u'Serviço'), {
(_('Serviço'), {
'fields': ('tipo_servico', ('url', 'hospedagem_interlegis'), ('nome_servidor', 'porta_servico', 'senha_inicial'),)
}),
(_(u'Contatos'), {
(_('Contatos'), {
'fields': ('contato_tecnico', 'contato_administrativo',)
}),
(_(u'Alterações'), {
(_('Alterações'), {
'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',)
}))
readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao')
@ -146,30 +146,30 @@ class ServicoAdmin(BaseModelAdmin):
def get_codigo_interlegis(self, obj):
return obj.casa_legislativa.codigo_interlegis
get_codigo_interlegis.short_description = _(u'Código Interlegis')
get_codigo_interlegis.short_description = _('Código Interlegis')
get_codigo_interlegis.admin_order_field = 'casa_legislativa__codigo_interlegis'
def get_uf(self, obj):
return u'%s' % (obj.casa_legislativa.municipio.uf)
get_uf.short_description = _(u'UF')
return '%s' % (obj.casa_legislativa.municipio.uf)
get_uf.short_description = _('UF')
get_uf.admin_order_field = 'casa_legislativa__municipio__uf'
def getUrl(self, obj):
return u'<a href="%s" target="_blank">%s</a>' % (obj.url, obj.url)
getUrl.short_description = _(u'Url')
return '<a href="%s" target="_blank">%s</a>' % (obj.url, obj.url)
getUrl.short_description = _('Url')
getUrl.allow_tags = True
def get_link_erro(self, obj):
if not obj.erro_atualizacao:
return u""
return ""
url = obj.url
if url[-1] != '/':
url += '/'
if obj.tipo_servico.string_pesquisa:
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.short_description = _(u"Erro na atualização")
get_link_erro.short_description = _("Erro na atualização")
get_link_erro.admin_order_field = 'erro_atualizacao'
def adicionar_servicos(self, request, queryset):
@ -181,19 +181,19 @@ class ServicoAdmin(BaseModelAdmin):
q2 = len(request.session['carrinho_servicos'])
quant = q2 - q1
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:
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('.')
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):
for servico in queryset:
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('.')
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):
from django.utils.datastructures import SortedDict
@ -217,10 +217,10 @@ class ServicoAdmin(BaseModelAdmin):
def response_add(self, request, obj):
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:
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,))
elif "_save" in request.POST:
self.message_user(request, msg)
@ -230,10 +230,10 @@ class ServicoAdmin(BaseModelAdmin):
def response_change(self, request, obj):
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:
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,))
elif "_save" in request.POST:
self.message_user(request, msg)
@ -275,11 +275,11 @@ class ServicoAdmin(BaseModelAdmin):
q2 = len(request.session['carrinho_servicos'])
quant = q2 - q1
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:
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('.')
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):
result = []
for servico in obj.servico_set.all():
result.append(u"%s (%s). %s: %s" % (
result.append("%s (%s). %s: %s" % (
servico.tipo_servico.nome,
_(u'ativo') if servico.data_desativacao is None else _(u'desativado'),
_(u'Contato'),
_('ativo') if servico.data_desativacao is None else _('desativado'),
_('Contato'),
servico.contato_administrativo.nome))
return "<ul><li>" + "</li><li>".join(result) + "</li></ul>"
get_servicos.allow_tags = True
get_servicos.short_description = _(u"Serviços")
get_servicos.short_description = _("Serviços")
def lookup_allowed(self, lookup, value):
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):
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):
verbosity = int(options['verbosity'])
@ -36,4 +36,4 @@ class Command(BaseCommand):
for obj in queryset:
obj.atualiza_data_uso()
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):
args = "nome_do_arquivo.txt"
help = u"""
help = """
Importa dados de serviços de arquivos TXT gerados pela COTIN.
"""
def handle(self, *args, **options):
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]
self.stdout.write(u'Verificando estrutura do arquivo...')
self.stdout.write('Verificando estrutura do arquivo...')
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:
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 'COD_ORGAO' in reader.fieldnames):
print reader.fieldnames
raise CommandError(u"Formato inválido do arquivo.")
self.stdout.write(u'Estrutura parece ok.')
raise CommandError("Formato inválido do arquivo.")
self.stdout.write('Estrutura parece ok.')
self.stdout.write("Preparando dados...")
casas = {
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'):
nome_casa = nome_casa.replace('cm','')
url = u"https://{subdominio}.{dominio}.{sufixo}".format(
url = "https://{subdominio}.{dominio}.{sufixo}".format(
subdominio=subdominios[sigla],
dominio=dominio,
sufixo=sufixo
@ -152,7 +152,7 @@ Importa dados de serviços de arquivos TXT gerados pela COTIN.
try:
contato, created = casa.funcionario_set.get_or_create(
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:
contato = casa.funcionario_set.filter(
@ -174,8 +174,8 @@ Importa dados de serviços de arquivos TXT gerados pela COTIN.
servico.save()
except Servico.MultipleObjectsReturned:
self.stdout.write(
u"{template} {name} {cod_orgao} mais de um servico "
u"encontrado ({s})".format(
"{template} {name} {cod_orgao} mais de um servico "
"encontrado ({s})".format(
template=template,
name=name,
cod_orgao=cod_orgao,
@ -190,14 +190,14 @@ Importa dados de serviços de arquivos TXT gerados pela COTIN.
data_alteracao__lt=agora
).update(
data_desativacao=agora,
motivo_desativacao=(u"[AUTOMÁTICO] Não consta da lista "
u"da COTIN")
motivo_desativacao=("[AUTOMÁTICO] Não consta da lista "
"da COTIN")
)
else:
self.stdout.write(
self.style.ERROR(u"Os serviços excendentes não podem ser "
u"desativados porque foram encontradas "
u"inconsistências no arquivo de origem")
self.style.ERROR("Os serviços excendentes não podem ser "
"desativados porque foram encontradas "
"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):
MODO_CHOICES = (
('H', _(u"Hospedagem")),
('R', _(u"Registro"))
('H', _("Hospedagem")),
('R', _("Registro"))
)
email_help = u'''Use:<br/>
email_help = '''Use:<br/>
{url} para incluir a URL do serviço,<br/>
{senha} para incluir a senha inicial do serviço'''
string_pesquisa_help = (u"Parâmetros da pesquisa para averiguar a data da "
u"última atualização do serviço. Formato:<br/>"
u"<ul><li>/caminho/da/pesquisa/?parametros "
u"[xml|json] campo.de.data</li>")
nome = models.CharField(_(u'nome'), max_length=60)
sigla = models.CharField(_(u'sigla'), max_length='12')
string_pesquisa_help = ("Parâmetros da pesquisa para averiguar a data da "
"última atualização do serviço. Formato:<br/>"
"<ul><li>/caminho/da/pesquisa/?parametros "
"[xml|json] campo.de.data</li>")
nome = models.CharField(_('nome'), max_length=60)
sigla = models.CharField(_('sigla'), max_length='12')
modo = models.CharField(
_(u'modo de prestação do serviço'),
_('modo de prestação do serviço'),
max_length=1,
choices=MODO_CHOICES
)
string_pesquisa = models.TextField(
_(u'string de pesquisa'),
_('string de pesquisa'),
blank=True,
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_altera = models.TextField(_(u'Template de email de alteração'), help_text=email_help, blank=True)
template_email_desativa = models.TextField(_(u'Template de email de desativação'), help_text=email_help + _(u'<br/>{motivo} para incluir o motivo da desativação do serviço'), blank=True)
template_email_ativa = models.TextField(_('Template de email de ativaçã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(_('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
def qtde_casas_atendidas(self):
u"""Quantidade de casas atendidas"""
"""Quantidade de casas atendidas"""
return self.servico_set.filter(data_desativacao=None).count()
class Meta:
verbose_name = _(u'Tipo de serviço')
verbose_name_plural = _(u'Tipos de serviço')
verbose_name = _('Tipo de serviço')
verbose_name_plural = _('Tipos de serviço')
def __unicode__(self):
return self.nome
@ -51,75 +51,75 @@ class Servico(models.Model):
casa_legislativa = models.ForeignKey(
Orgao,
on_delete=models.PROTECT,
verbose_name=_(u'Casa Legislativa')
verbose_name=_('Casa Legislativa')
)
tipo_servico = models.ForeignKey(
TipoServico,
on_delete=models.PROTECT,
verbose_name=_(u'Tipo de serviço')
verbose_name=_('Tipo de serviço')
)
contato_tecnico = models.ForeignKey(
Funcionario,
on_delete=models.PROTECT,
verbose_name=_(u'Contato técnico'),
verbose_name=_('Contato técnico'),
related_name='contato_tecnico'
)
contato_administrativo = models.ForeignKey(
Funcionario,
on_delete=models.PROTECT,
verbose_name=_(u'Contato administrativo'),
verbose_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(
_(u'Hospedagem no Interlegis?'),
_('Hospedagem no Interlegis?'),
default=False
)
nome_servidor = models.CharField(
_(u'Hospedado em'),
_('Hospedado em'),
max_length=60,
blank=True,
help_text=_(u'Se hospedado no Interlegis, informe o nome do servidor.'
u'<br/>Senão, informe o nome do provedor de serviços.')
help_text=_('Se hospedado no Interlegis, informe o nome do servidor.'
'<br/>Senão, informe o nome do provedor de serviços.')
)
porta_servico = models.PositiveSmallIntegerField(
_(u'Porta de serviço (instância)'),
_('Porta de serviço (instância)'),
blank=True,
null=True
)
senha_inicial = models.CharField(
_(u'Senha inicial'),
_('Senha inicial'),
max_length=33,
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(
_(u'Data da última alteração'),
_('Data da última alteração'),
blank=True,
null=True,
auto_now=True
)
data_desativacao = models.DateField(
_(u'Data de desativação'),
_('Data de desativação'),
blank=True,
null=True
)
motivo_desativacao = models.TextField(
_(u'Motivo da desativação'),
_('Motivo da desativação'),
blank=True
)
data_ultimo_uso = models.DateField(
_(u'Data da última utilização'),
_('Data da última utilização'),
blank=True,
null=True,
help_text=_(u'Data em que o serviço foi utilizado pela Casa Legislativa'
u' pela última vez')
help_text=_('Data em que o serviço foi utilizado pela Casa Legislativa'
' pela última vez')
)
erro_atualizacao = models.TextField(
_(u"Erro na atualização"),
_("Erro na atualização"),
blank=True,
help_text=_(u"Erro ocorrido na última tentativa de verificar a data "
u"de última atualização do serviço")
help_text=_("Erro ocorrido na última tentativa de verificar a data "
"de última atualização do serviço")
)
# casa_legislativa.casa_uf_filter = True
@ -140,8 +140,8 @@ class Servico(models.Model):
if len(param_pesquisa) != 3:
return {
'data': '',
'erro':_(u"String de pesquisa mal configurada"),
'comment':_(u"Corrija a string de pesquisa")
'erro':_("String de pesquisa mal configurada"),
'comment':_("Corrija a string de pesquisa")
}
campos = [int(s) if s.isdigit() else s for s in
param_pesquisa[2].split('.')]
@ -154,9 +154,9 @@ class Servico(models.Model):
return {
'data': '',
'erro':str(e),
'comment':_(u"Não foi possível conectar com o servidor. "
u"Pode estar fora do ar ou não ser "
u"um {tipo}".format(
'comment':_("Não foi possível conectar com o servidor. "
"Pode estar fora do ar ou não ser "
"um {tipo}".format(
tipo=self.tipo_servico.nome))
}
@ -164,8 +164,8 @@ class Servico(models.Model):
return {
'data': '',
'erro': req.reason,
'comment':_(u"Não foi possível receber os dados do "
u"servidor. O acesso pode ter sido negado.")
'comment':_("Não foi possível receber os dados do "
"servidor. O acesso pode ter sido negado.")
}
try:
@ -176,7 +176,7 @@ class Servico(models.Model):
else:
return {
'data': '',
'erro': _(u'String de pesquisa mal configurada'),
'erro': _('String de pesquisa mal configurada'),
'comment': ''
}
@ -185,8 +185,8 @@ class Servico(models.Model):
if (len(data)-1) < c:
return {
'data': '',
'erro': _(u'Sem dados para verificação'),
'comment': _(u'Parece que nunca foi usado')
'erro': _('Sem dados para verificação'),
'comment': _('Parece que nunca foi usado')
}
data = data[c]
else:
@ -204,7 +204,7 @@ class Servico(models.Model):
return {
'data': '',
'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))
}
@ -216,7 +216,7 @@ class Servico(models.Model):
if not url:
reset()
self.erro_atualizacao = _(u"Serviço sem URL")
self.erro_atualizacao = _("Serviço sem URL")
self.save()
return
@ -234,7 +234,7 @@ class Servico(models.Model):
# Nenhuma busca deu resultado, guardar log de erro
self.data_ultimo_uso = None
self.erro_atualizacao = "<br/>".join(set(
[u"{erro} ({comment})".format(erro=r['erro'],
["{erro} ({comment})".format(erro=r['erro'],
comment=r['comment'])
for r in resultados if r['erro'] != '' and r['comment'] != ''
]))
@ -248,7 +248,7 @@ class Servico(models.Model):
return
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):
# Reter o objeto original para verificar mudanças
@ -258,11 +258,11 @@ class Servico(models.Model):
if self.id is None:
# Novo serviço, email de ativação
subject = _(u'INTERLEGIS - Ativação de serviço %s') % (self.tipo_servico.nome,)
subject = _('INTERLEGIS - Ativação de serviço %s') % (self.tipo_servico.nome,)
body = self.tipo_servico.template_email_ativa
elif self.data_desativacao is not None and original.data_desativacao is None:
# Serviço foi desativado. Email de desativação
subject = _(u'INTERLEGIS - Desativação de serviço %s') % (self.tipo_servico.nome,)
subject = _('INTERLEGIS - Desativação de serviço %s') % (self.tipo_servico.nome,)
body = self.tipo_servico.template_email_desativa
elif (self.tipo_servico != original.tipo_servico or
self.contato_tecnico != original.contato_tecnico or
@ -270,7 +270,7 @@ class Servico(models.Model):
self.nome_servidor != original.nome_servidor or
self.senha_inicial != original.senha_inicial):
# Serviço foi alterado
subject = _(u'INTERLEGIS - Alteração de serviço %s') % (self.tipo_servico.nome,)
subject = _('INTERLEGIS - Alteração de serviço %s') % (self.tipo_servico.nome,)
body = self.tipo_servico.template_email_altera
else:
# Salvar o Servico
@ -295,18 +295,18 @@ class LogServico(models.Model):
servico = models.ForeignKey(
Servico,
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)
data = models.DateField(_(u'Data da ação'), default=date.today)
log = models.TextField(_(u'Log da ação'))
descricao = models.CharField(_('Breve descrição da ação'), max_length=60)
data = models.DateField(_('Data da ação'), default=date.today)
log = models.TextField(_('Log da ação'))
def __unicode__(self):
return "%s (%s)" % (self.descricao, self.data)
class Meta:
verbose_name = _(u'Log do serviço')
verbose_name_plural = _(u'Logs do serviço')
verbose_name = _('Log do serviço')
verbose_name_plural = _('Logs do serviço')
class CasaAtendidaManager(models.Manager):
@ -321,7 +321,7 @@ class CasaAtendida(Orgao):
class Meta:
proxy = True
verbose_name_plural = _(u'Casas atendidas')
verbose_name_plural = _('Casas atendidas')
objects = CasaAtendidaManager()
@ -330,16 +330,16 @@ class CasaManifesta(models.Model):
casa_legislativa = models.OneToOneField(Orgao, on_delete=models.CASCADE)
data_manifestacao = models.DateTimeField(auto_now_add=True)
data_atualizacao = models.DateTimeField(auto_now=True)
informante = models.CharField(_(u'Nome do informante'), max_length=100, blank=True)
cargo = models.CharField(_(u'Cargo do informante'), max_length=100, blank=True)
email = models.EmailField(_(u'E-mail de contato'), blank=True)
informante = models.CharField(_('Nome do informante'), max_length=100, blank=True)
cargo = models.CharField(_('Cargo do informante'), max_length=100, blank=True)
email = models.EmailField(_('E-mail de contato'), blank=True)
class ServicoManifesto(models.Model):
casa_manifesta = models.ForeignKey(CasaManifesta, on_delete=models.CASCADE)
servico = models.ForeignKey(TipoServico, on_delete=models.CASCADE)
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:
unique_together = ('casa_manifesta', 'servico')
@ -352,5 +352,5 @@ class RegistroServico(models.Model):
data_registro = models.DateTimeField(auto_now=True)
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'),),)
for ts in TipoServico.objects.all():
campos['possui_%s' % ts.pk] = forms.BooleanField(label=_(u'Possui o serviço de %s') % ts.nome, required=False)
campos['url_%s' % ts.pk] = forms.URLField(label=_(u'Informe a URL'), required=False)
campos['hospedagem_interlegis_%s' % ts.pk] = forms.BooleanField(label=_(u'Serviço está hospedado no Interlegis'), required=False)
campos['possui_%s' % ts.pk] = forms.BooleanField(label=_('Possui o serviço de %s') % ts.nome, required=False)
campos['url_%s' % ts.pk] = forms.URLField(label=_('Informe a URL'), 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)),)
CasaManifestaForm = type('', (CasaManifestaProtoForm,), campos)
@ -106,21 +106,21 @@ def casa_manifesta_view(request):
cm.cargo = cmf.cleaned_data['cargo']
cm.email = cmf.cleaned_data['email']
cm.save()
thanks.append((_(u'Informante'), cmf.cleaned_data['informante']))
thanks.append((_(u'Cargo'), cmf.cleaned_data['cargo']))
thanks.append((_(u'E-mail'), cmf.cleaned_data['email']))
thanks.append((_('Informante'), cmf.cleaned_data['informante']))
thanks.append((_('Cargo'), cmf.cleaned_data['cargo']))
thanks.append((_('E-mail'), cmf.cleaned_data['email']))
for ts in TipoServico.objects.all():
if cmf.cleaned_data['possui_%s' % ts.pk]:
sm, created = ServicoManifesto.objects.get_or_create(casa_manifesta=cm, servico=ts)
sm.url = cmf.cleaned_data['url_%s' % ts.pk]
sm.hospedagem_interlegis = cmf.cleaned_data['hospedagem_interlegis_%s' % ts.pk]
sm.save()
thanks.append((ts.nome, _(u'Possui o serviço acessível em %(url)s %(obs)s') % dict(
thanks.append((ts.nome, _('Possui o serviço acessível em %(url)s %(obs)s') % dict(
url=sm.url,
obs=_(u'hospedado no Interlegis') if sm.hospedagem_interlegis else '')))
obs=_('hospedado no Interlegis') if sm.hospedagem_interlegis else '')))
else:
ServicoManifesto.objects.filter(casa_manifesta=cm, servico=ts).delete()
thanks.append((ts.nome, _(u'Não possui')))
thanks.append((ts.nome, _('Não possui')))
extra_context = {'casa': casa, 'thanks': thanks}
else:
extra_context = {'casa': casa, 'cmf': cmf}
@ -198,7 +198,7 @@ def adicionar_servicos_carrinho(request, queryset=None, id=None):
def excluir_carrinho(request):
if 'carrinho_servicos' in request.session:
del request.session['carrinho_servicos']
messages.info(request, u'O carrinho foi esvaziado')
messages.info(request, 'O carrinho foi esvaziado')
return HttpResponseRedirect('../../')
@login_required
@ -282,31 +282,31 @@ def export_csv(request):
if not servicos:
return HttpResponseRedirect('../')
atributos = [_(u"Casa Legislativa"), _(u"Contato Interlegis"), _(u"Produto"),
_(u"Data de Ativação"), ]
atributos = [_("Casa Legislativa"), _("Contato Interlegis"), _("Produto"),
_("Data de Ativação"), ]
if request.POST:
atributos = request.POST.getlist("itens_csv_selected")
col_titles = atributos
if _(u"Casa Legislativa") in col_titles:
pos = col_titles.index(_(u"Casa Legislativa")) + 1
col_titles.insert(pos, _(u"uf"))
if _("Casa Legislativa") in col_titles:
pos = col_titles.index(_("Casa Legislativa")) + 1
col_titles.insert(pos, _("uf"))
pos+=1
col_titles.insert(pos, _(u"email"))
col_titles.insert(pos, _("email"))
pos+=1
col_titles.insert(pos, _(u"telefone"))
col_titles.insert(pos, _("telefone"))
if _(u"Contato Interlegis") in col_titles:
pos = col_titles.index(_(u"Contato Interlegis")) + 1
col_titles.insert(pos, _(u"Email do contato"))
if _("Contato Interlegis") in col_titles:
pos = col_titles.index(_("Contato Interlegis")) + 1
col_titles.insert(pos, _("Email do contato"))
csv_writer.writerow([s.encode("utf-8") for s in col_titles])
for servico in servicos:
lista = []
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.municipio.uf.sigla.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)
else:
lista.append("")
elif _(u"Contato Interlegis") == atributo:
elif _("Contato Interlegis") == atributo:
if servico.casa_legislativa.contato_interlegis is not None:
lista.append(servico.casa_legislativa.contato_interlegis)
lista.append(servico.casa_legislativa.contato_interlegis.email.encode("utf-8"))
else:
lista.append("")
lista.append("")
elif _(u"Produto") == atributo:
elif _("Produto") == atributo:
lista.append(servico.tipo_servico.nome.encode("utf-8"))
elif _(u"Data de Ativação") == atributo:
elif _("Data de Ativação") == atributo:
data = ''
if servico.data_ativacao:
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
class ServidorFilter(AlphabeticFilter):
title = _(u'Nome do Servidor')
title = _('Nome do Servidor')
parameter_name = 'servidor__nome_completo'
class ServicoFilter(admin.SimpleListFilter):
title = _(u"Subordinados à")
title = _("Subordinados à")
parameter_name = 'subordinado__id__exact'
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)])
def queryset(self, request, queryset):
@ -47,10 +47,10 @@ class ServidorInline(admin.TabularInline):
def imagem_foto(sels, servidor):
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:
return u""
imagem_foto.short_description = _(u"foto")
return ""
imagem_foto.short_description = _("foto")
imagem_foto.allow_tags = True
def is_active(self, servidor):
@ -60,7 +60,7 @@ class ServidorInline(admin.TabularInline):
return False
is_active.admin_order_field = 'user__is_active'
is_active.boolean = True
is_active.short_description = _(u'ativo')
is_active.short_description = _('ativo')
@admin.register(Servico)
@ -83,7 +83,7 @@ class ServidorAdmin(BaseModelAdmin):
(None, {
'fields': ('user', 'nome_completo', 'foto', 'servico',)
}),
(_(u"outros órgãos"), {
(_("outros órgãos"), {
'fields': ('externo', 'orgao_origem', 'qualificacoes'),
}),
)
@ -109,12 +109,12 @@ class ServidorAdmin(BaseModelAdmin):
return False
is_active.admin_order_field = 'user__is_active'
is_active.boolean = True
is_active.short_description = _(u'ativo')
is_active.short_description = _('ativo')
def imagem_foto(sels, servidor):
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:
return u""
imagem_foto.short_description = _(u"foto")
return ""
imagem_foto.short_description = _("foto")
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):
if data.get(chave_ini) >= data.get(chave_fim):
raise forms.ValidationError(_(
u"A data de início deve ser menor que a data final. Verifique novamente"))
"A data de início deve ser menor que a data final. Verifique novamente"))
class FeriasForm(forms.ModelForm):
@ -62,5 +62,5 @@ class FuncaoForm(forms.ModelForm):
Periodo(funcao.inicio_funcao, funcao.fim_funcao),
Periodo(data.get('inicio_funcao'), data.get('fim_funcao'))):
raise forms.ValidationError(_(
u"Este período coincide com o de outra função exercida."))
"Este período coincide com o de outra função exercida."))
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
class Command(BaseCommand):
help = u'Transfere os dados do servidor OLD para o servidor NEW.'
args = u'old_id new_id'
help = 'Transfere os dados do servidor OLD para o servidor NEW.'
args = 'old_id new_id'
def handle(self, *args, **options):
if len(args) != 2:
self.stderr.write(u"Informe old_id e new_id")
self.stderr.write("Informe old_id e new_id")
return
old_id = args[0]
@ -19,42 +19,42 @@ class Command(BaseCommand):
new = Servidor.objects.get(id=new_id)
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,
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():
new.casas_que_gerencia.add(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)
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)
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)
self.stdout.write(u"\t* Transferindo convênios acompanhados...")
self.stdout.write("\t* Transferindo convênios acompanhados...")
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)
self.stdout.write(u"\t* Transferindo convites para eventos...")
self.stdout.write("\t* Transferindo convites para eventos...")
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)
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)
self.stdout.write(u"\t* Transferindo dados de autenticação...")
self.stdout.write("\t* Transferindo dados de autenticação...")
if new.user:
old.user.logentry_set.all().update(user=new)
@ -65,4 +65,4 @@ class Command(BaseCommand):
old.user = None
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):
help = _(u'Migra usuários do antigo Sistema de RH')
help = _('Migra usuários do antigo Sistema de RH')
def to_date(self, data):
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):
help = u'Sincroniza Usuários e Servidores com o LDAP'
help = 'Sincroniza Usuários e Servidores com o LDAP'
def handle(self, *args, **options):
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
([],
[ALEX_LDAP],
[(u'alexlima', u'Alex Lima', u'Alex', u'Lima', u'alexlima@interlegis.leg.br')],
u'''
[('alexlima', 'Alex Lima', 'Alex', 'Lima', 'alexlima@interlegis.leg.br')],
'''
User 'alexlima' created.
Users are synchronized.
'''),
# 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],
[(u'alexlima', u'Alex Lima', u'Alex', u'Lima', u'alexlima@interlegis.leg.br')],
u'''
[('alexlima', 'Alex Lima', 'Alex', 'Lima', 'alexlima@interlegis.leg.br')],
'''
Users are synchronized.
'''),
# 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],
[(u'claudia', u'Cláudia de Cássia', u'Cláudia', u'de Cássia', u'claudia@interlegis.leg.br', )],
u'''
[('claudia', 'Cláudia de Cássia', 'Cláudia', 'de Cássia', 'claudia@interlegis.leg.br', )],
'''
Users are synchronized.
'''),
# update: full name, first name, last name, email
([('alexlima', '___', '___', '___', '___', ),
('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],
[(u'alexlima', u'Alex Lima', u'Alex', u'Lima', u'alexlima@interlegis.leg.br', ),
(u'bruno', u'Bruno Almeida Prado', u'Bruno', u'Almeida Prado', u'bruno@interlegis.leg.br', ),
(u'claudia', u'Cláudia de Cássia', u'Cláudia', u'de Cássia', u'claudia@interlegis.leg.br', )],
u'''
[('alexlima', 'Alex Lima', 'Alex', 'Lima', 'alexlima@interlegis.leg.br', ),
('bruno', 'Bruno Almeida Prado', 'Bruno', 'Almeida Prado', 'bruno@interlegis.leg.br', ),
('claudia', 'Cláudia de Cássia', 'Cláudia', 'de Cássia', 'claudia@interlegis.leg.br', )],
'''
User 'alexlima' first name updated.
User 'alexlima' last name updated.
User 'alexlima' email updated.
@ -106,14 +106,14 @@ Users are synchronized.
# user not present in ldap is NOT deleted
([(u'alexlima', u'Alex Lima', u'Alex', u'Lima', u'alexlima@interlegis.leg.br', ),
(u'bruno', u'Bruno Almeida Prado', u'Bruno', u'Almeida Prado', u'bruno@interlegis.leg.br', ),
(u'claudia', u'Cláudia de Cássia', u'Cláudia', u'de Cássia', u'claudia@interlegis.leg.br', )],
([('alexlima', 'Alex Lima', 'Alex', 'Lima', 'alexlima@interlegis.leg.br', ),
('bruno', 'Bruno Almeida Prado', 'Bruno', 'Almeida Prado', 'bruno@interlegis.leg.br', ),
('claudia', 'Cláudia de Cássia', 'Cláudia', 'de Cássia', 'claudia@interlegis.leg.br', )],
[ALEX_LDAP, RITA_LDAP],
[(u'alexlima', u'Alex Lima', u'Alex', u'Lima', u'alexlima@interlegis.leg.br', ),
(u'bruno', u'Bruno Almeida Prado', u'Bruno', u'Almeida Prado', u'bruno@interlegis.leg.br', ),
(u'claudia', u'Cláudia de Cássia', u'Cláudia', u'de Cássia', u'claudia@interlegis.leg.br', )],
u'''
[('alexlima', 'Alex Lima', 'Alex', 'Lima', 'alexlima@interlegis.leg.br', ),
('bruno', 'Bruno Almeida Prado', 'Bruno', 'Almeida Prado', 'bruno@interlegis.leg.br', ),
('claudia', 'Cláudia de Cássia', 'Cláudia', 'de Cássia', 'claudia@interlegis.leg.br', )],
'''
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 _
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)
subordinado = models.ForeignKey(
'self',
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name=_(u"subordinado a")
verbose_name=_("subordinado a")
)
responsavel = models.ForeignKey(
'servidores.Servidor',
@ -24,11 +24,11 @@ class Servico(models.Model):
class Meta:
ordering = ('-subordinado__sigla', 'nome',)
verbose_name = _(u'serviço')
verbose_name_plural = _(u'serviços')
verbose_name = _('serviço')
verbose_name_plural = _('serviços')
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):
user = models.ForeignKey(
@ -53,12 +53,12 @@ class Servidor(models.Model):
blank=True,
null=True
)
externo = models.BooleanField(_(u"colaborador externo"), default=False)
externo = models.BooleanField(_("colaborador externo"), default=False)
orgao_origem = models.CharField(
_(u"órgão de origem, "),
_("órgão de origem, "),
max_length=100, blank=True
)
qualificacoes = models.TextField(_(u"qualificações"), blank=True)
qualificacoes = models.TextField(_("qualificações"), blank=True)
class Meta:
ordering = ('nome_completo',)

2
sigi/apps/utils/__init__.py

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

6
sigi/apps/utils/admin_widgets.py

@ -11,8 +11,8 @@ class AdminImageWidget(AdminFileWidget):
image_url = value.url
file_name = str(value)
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''' %
(image_url, image_url, file_name, _(u'Change') + ':'))
(image_url, image_url, file_name, _('Change') + ':'))
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.
"""
if from_email is None:
raise ValueError(_(u"Insira o email do remetente."))
raise ValueError(_("Insira o email do remetente."))
elif subject is None:
raise ValueError(_(u"Insira o assunto da mensagem."))
raise ValueError(_("Insira o assunto da mensagem."))
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:
raise ValueError(_(u"Insira o conteúdo da mensagem."))
raise ValueError(_("Insira o conteúdo da mensagem."))
# Gerando a mensagem
mensagem = render_to_string(template, tags)

1
sigi/settings/base.py

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

Loading…
Cancel
Save