diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 5ae955a..4619552 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -1,6 +1,10 @@
ipython==7.30.1
+weasyprint==54.0
Django==4.0.1
+django-localflavor==3.1
django-extensions==3.1.5
+django-weasyprint==2.1.0
psycopg2==2.9.3
django-bootstrap5==21.3
Pillow==9.0.0
+django-localflavor==3.1
diff --git a/sigi/apps/casas/admin.py b/sigi/apps/casas/admin.py
index 72796f7..4c2631e 100644
--- a/sigi/apps/casas/admin.py
+++ b/sigi/apps/casas/admin.py
@@ -1,53 +1,35 @@
-# -*- coding: utf-8 -*-
-
from unicodedata import name
from django.contrib import admin
-from django.contrib.contenttypes import generic
-from django.core.urlresolvers import reverse
+from django.contrib.admin.options import ModelAdmin
+from django.contrib.contenttypes.admin import GenericTabularInline
from django.http import HttpResponseRedirect
-from django.shortcuts import render
+from django.urls import reverse
+from django.utils.safestring import mark_safe
from django.utils.translation import gettext as _
-#from geraldo.site.newsite.django_1_0.django.forms import extras
-from image_cropping import ImageCroppingMixin
-
from sigi.apps.casas.forms import OrgaoForm
from sigi.apps.casas.models import Orgao, Presidente, Funcionario, TipoOrgao
-from sigi.apps.casas.views import report_complete, labels_report, export_csv, \
- labels_report_sem_presidente, report, \
- adicionar_casas_carrinho
+# from sigi.apps.casas.views import report_complete, labels_report, export_csv, \
+# labels_report_sem_presidente, report, \
+# adicionar_casas_carrinho
+from sigi.apps.casas.filters import GerentesInterlegisFilter
from sigi.apps.contatos.models import Telefone
-from sigi.apps.convenios.models import Convenio, Projeto
-# from sigi.apps.diagnosticos.models import Diagnostico
-# from sigi.apps.inventario.models import Bem
-from sigi.apps.metas.models import PlanoDiretor
-from sigi.apps.ocorrencias.models import Ocorrencia
-# from sigi.apps.parlamentares.models import Legislatura
-from sigi.apps.servicos.models import Servico, TipoServico
-from sigi.apps.servidores.models import Servidor
+# from sigi.apps.convenios.models import Convenio, Projeto
+# from sigi.apps.ocorrencias.models import Ocorrencia
+# from sigi.apps.servicos.models import Servico, TipoServico
from sigi.apps.utils import queryset_ascii
-from sigi.apps.utils.base_admin import BaseModelAdmin
-class TelefonesInline(generic.GenericTabularInline):
+class TelefonesInline(GenericTabularInline):
model = Telefone
readonly_fields = ('ult_alteracao',)
extra = 1
-
class PresidenteInline(admin.StackedInline):
model = Presidente
fields = ('nome', 'sexo', 'data_nascimento', 'nota', 'email',
'tempo_de_servico', 'ult_alteracao', 'endereco', 'municipio',
'bairro', 'cep', 'redes_sociais',)
raw_id_fields = ('municipio',)
- # fieldsets = ((None, {
- # 'fields': (
- # ('nome', 'sexo', 'data_nascimento'),
- # ('nota', 'email', 'tempo_de_servico'),
- # ('ult_alteracao',),
- # )
- # }),)
-# exclude = ['setor', 'cargo', 'funcao']
readonly_fields = ('ult_alteracao',)
extra = 1
max_num = 1
@@ -56,7 +38,8 @@ class PresidenteInline(admin.StackedInline):
return (self.model.objects.exclude(desativado=True)
.extra(select={'ult_null': 'ult_alteracao is null'})
.order_by('ult_null', '-ult_alteracao')
- # A função extra foi usada para quando existir um registro com o campo igual a null não aparecer na frente dos mais novos
+ # A função extra foi usada para quando existir um registro com o
+ # campo igual a null não aparecer na frente dos mais novos
)
class ContatoInterlegisInline(admin.StackedInline):
@@ -72,7 +55,8 @@ class ContatoInterlegisInline(admin.StackedInline):
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')
+ .extra(select={'ult_null': 'ult_alteracao is null'}).order_by(
+ '-ult_alteracao')
)
def get_extra(self, request, obj=None , **kwargs):
extra = 0
@@ -85,19 +69,6 @@ class FuncionariosInline(admin.StackedInline):
'endereco', 'municipio', 'bairro', 'cep', 'redes_sociais',
'desativado', 'observacoes')
raw_id_fields = ('municipio',)
-
- # fieldsets = ((None, {
- # 'fields': (
- # ('nome', 'sexo', 'data_nascimento'),
- # ('nota', 'email'),
- # ('cargo', 'funcao', 'setor'),
- # ('tempo_de_servico', 'ult_alteracao'),
- # ('endereco', 'municipio'),
- # ('bairro', 'cep'),
- # ('redes_sociais'),
- # ('desativado', 'observacoes'),
- # )
- # }),)
readonly_fields = ('ult_alteracao',)
extra = 1
inlines = (TelefonesInline,)
@@ -105,304 +76,167 @@ class FuncionariosInline(admin.StackedInline):
def get_queryset(self, request):
return (self.model.objects.exclude(cargo='Presidente',)
- .exclude(desativado=True).extra(select={'ult_null': 'ult_alteracao is null'})
+ .exclude(desativado=True).extra(
+ select={'ult_null': 'ult_alteracao is null'})
.order_by('ult_null', '-ult_alteracao')
- # A função extra foi usada para quando existir um registro com o campo igual a null não aparecer na frente dos mais novos
+ # A função extra foi usada para quando existir um registro com
+ # o campo igual a null não aparecer na frente dos mais novos
)
-class ConveniosInline(admin.TabularInline):
- model = Convenio
- fieldsets = (
- (None, {'fields': (
- ('link_sigad', 'status_convenio', 'num_convenio',
- 'projeto', 'observacao'),
- ('data_retorno_assinatura', 'data_pub_diario',),
- ('get_anexos',),
- ('link_convenio',),
- )}),
- )
- readonly_fields = ['link_convenio', 'link_sigad', 'status_convenio',
- 'num_convenio', 'projeto', 'observacao', 'data_adesao',
- 'data_retorno_assinatura', 'data_termo_aceite',
- 'data_pub_diario', 'data_devolucao_via',
- 'data_postagem_correio', 'data_devolucao_sem_assinatura',
- 'data_retorno_sem_assinatura', 'get_anexos']
- extra = 0
- can_delete = False
- template = 'admin/casas/convenios_inline.html'
- ordering = ('-data_retorno_assinatura',)
-
- def has_add_permission(self, request):
- return False
-
-# def get_tramitacoes(self, obj):
-# return '
'.join([t.__unicode__() for t in obj.tramitacao_set.all()])
-#
-# get_tramitacoes.short_description = _('Tramitações')
-# get_tramitacoes.allow_tags = True
-#
- def get_anexos(self, obj):
- return '
'.join(['%s' % (a.arquivo.url, a.__unicode__()) for a in obj.anexo_set.all()])
- get_anexos.short_description = _('Anexos')
- get_anexos.allow_tags = True
-#
-# def get_equipamentos(self, obj):
-# return '
'.join([e.__unicode__() for e in obj.equipamentoprevisto_set.all()])
-#
-# get_equipamentos.short_description = _('Equipamentos previstos')
-# get_equipamentos.allow_tags = True
-
- def status_convenio(self, obj):
- if obj.pk is None:
- return ""
- status = obj.get_status()
-
- if status in ["Vencido", "Desistência", "Cancelado"]:
- label = r"danger"
- elif status == "Vigente":
- label = r"success"
- elif status == "Pendente":
- label = r"warning"
- else:
- label = r"info"
-
- return '
{status}
'.format(label=label, status=status)
- status_convenio.short_description = _("Status do convênio")
- status_convenio.allow_tags = True
-
-
- def link_convenio(self, obj):
- if obj.pk is None:
- return ""
- url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk])
- url = url + '?_popup=1'
- return """
-
- Editar
- """ % (obj.pk, obj.pk, url)
-
- link_convenio.short_description = _('Editar convenio')
- link_convenio.allow_tags = True
-
- def link_sigad(self, obj):
- if obj.pk is None:
- return ""
- return obj.get_sigad_url()
-
- link_sigad.short_description = _("Processo no Senado")
- link_sigad.allow_tags = True
-
-# class LegislaturaInline(admin.TabularInline):
-# model = Legislatura
-# fields = ['numero', 'data_inicio', 'data_fim', 'data_eleicao', 'total_parlamentares', 'link_parlamentares', ]
-# readonly_fields = ['link_parlamentares', ]
-
-# def link_parlamentares(self, obj):
+# class ConveniosInline(admin.TabularInline):
+# model = Convenio
+# fieldsets = (
+# (None, {'fields': (
+# ('link_sigad', 'status_convenio', 'num_convenio',
+# 'projeto', 'observacao'),
+# ('data_retorno_assinatura', 'data_pub_diario',),
+# ('get_anexos',),
+# ('link_convenio',),
+# )}),
+# )
+# readonly_fields = ['link_convenio', 'link_sigad', 'status_convenio',
+# 'num_convenio', 'projeto', 'observacao', 'data_adesao',
+# 'data_retorno_assinatura', 'data_termo_aceite',
+# 'data_pub_diario', 'data_devolucao_via',
+# 'data_postagem_correio', 'data_devolucao_sem_assinatura',
+# 'data_retorno_sem_assinatura', 'get_anexos']
+# extra = 0
+# can_delete = False
+# template = 'admin/casas/convenios_inline.html'
+# ordering = ('-data_retorno_assinatura',)
+
+# def has_add_permission(self, request):
+# return False
+
+# def get_anexos(self, obj):
+# return mark_safe('
'.join(
+# [f'{a}'
+# for a in obj.anexo_set.all()])
+# )
+# get_anexos.short_description = _('Anexos')
+
+# def status_convenio(self, obj):
+# if obj.pk is None:
+# return ""
+# status = obj.get_status()
+
+# if status in ["Vencido", "Desistência", "Cancelado"]:
+# label = r"danger"
+# elif status == "Vigente":
+# label = r"success"
+# elif status == "Pendente":
+# label = r"warning"
+# else:
+# label = r"info"
+
+# return mark_safe(f'{status}
')
+# status_convenio.short_description = _("Status do convênio")
+
+# def link_convenio(self, obj):
+# if obj.pk is None:
+# return ""
+# url = reverse(
+# f'admin:{obj._meta.app_label}_{obj._meta.module_name}_change',
+# args=[obj.pk]
+# ) + '?_popup=1'
+# return mark_safe(
+# f''
+# f''
+# f'{_("Editar")}'
+# )
+# link_convenio.short_description = _('Editar convenio')
+
+# def link_sigad(self, obj):
# if obj.pk is None:
# return ""
-# from django.core.urlresolvers import reverse
-# url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk])
-# url = url + '?_popup=1'
-# return """
-#
-# Editar
-# """ % (obj.pk, obj.pk, url)
-
-# link_parlamentares.short_description = _('Parlamentares')
-# link_parlamentares.allow_tags = True
-
-# class DiagnosticoInline(admin.TabularInline):
-# model = Diagnostico
-# fields = ['data_visita_inicio', 'data_visita_fim', 'publicado', 'data_publicacao', 'responsavel', 'link_diagnostico', ]
-# readonly_fields = ['data_visita_inicio', 'data_visita_fim', 'publicado', 'data_publicacao', 'responsavel', 'link_diagnostico', ]
+# return mark_safe(obj.get_sigad_url())
+# link_sigad.short_description = _("Processo no Senado")
+
+# class ServicoInline(admin.TabularInline):
+# model = Servico
+# fields = ('link_url', 'contato_tecnico', 'contato_administrativo',
+# 'hospedagem_interlegis', 'data_ativacao', 'data_alteracao',
+# 'data_desativacao', 'link_servico')
+# readonly_fields = ['link_url', 'contato_tecnico', 'contato_administrativo',
+# 'hospedagem_interlegis', 'data_ativacao',
+# 'data_alteracao', 'data_desativacao', 'link_servico']
# extra = 0
# max_num = 0
# can_delete = False
+# ordering = ('-data_alteracao',)
-# def link_diagnostico(self, obj):
+# def link_url(self, servico):
+# if servico.data_desativacao is not None:
+# return servico.url
+# return mark_safe(
+# f'{servico.url}'
+# )
+# link_url.short_description = _('URL do serviço')
+
+# def link_servico(self, obj):
# if obj.pk is None:
# return ""
-# url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=["%s.pdf" % obj.pk])
-# return """
-#
-# Abrir PDF
-# """ % (obj.pk, obj.pk, url)
-
-# link_diagnostico.short_description = _('Ver PDF')
-# link_diagnostico.allow_tags = True
-
-# class BemInline(admin.TabularInline):
-# model = Bem
-
-class ServicoInline(admin.TabularInline):
- model = Servico
- fields = ('link_url', 'contato_tecnico', 'contato_administrativo',
- 'hospedagem_interlegis', 'data_ativacao', 'data_alteracao',
- 'data_desativacao', 'link_servico')
- readonly_fields = ['link_url', 'contato_tecnico', 'contato_administrativo',
- 'hospedagem_interlegis', 'data_ativacao',
- 'data_alteracao', 'data_desativacao', 'link_servico']
- extra = 0
- max_num = 0
- can_delete = False
-
- def link_url(self, servico):
- if servico.data_desativacao is not None:
- return servico.url
- return '{url}'.format(url=servico.url)
- link_url.short_description = _('URL do serviço')
- link_url.allow_tags = True
-
- ordering = ('-data_alteracao',)
-
- def link_servico(self, obj):
- if obj.pk is None:
- return ""
- url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk])
- url = url + '?_popup=1'
- return """
-
- Editar
- """ % (obj.pk, obj.pk, url)
-
- link_servico.short_description = _('Editar Serviço')
- link_servico.allow_tags = True
-
- def has_add_permission(self, request):
- return False
-
-# class PlanoDiretorInline(admin.TabularInline):
-# model = PlanoDiretor
-
-class OcorrenciaInline(admin.TabularInline):
- model = Ocorrencia
- fields = ('data_criacao', 'assunto', 'prioridade', 'status', 'data_modificacao', 'setor_responsavel', 'link_editar',)
- readonly_fields = ('data_criacao', 'assunto', 'prioridade', 'status', 'data_modificacao', 'setor_responsavel', 'link_editar',)
- extra = 0
- max_num = 0
- can_delete = False
- template = 'admin/casas/ocorrencia_inline.html'
-
- ordering = ('-data_modificacao',)
-
- def link_editar(self, obj):
- if obj.pk is None:
- return ""
- url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=[obj.pk])
- return """
- %s""" % (obj.pk, obj.pk, url, _('Editar'))
-
- link_editar.short_description = _('Editar')
- link_editar.allow_tags = True
-
-
-class GerentesInterlegisFilter(admin.filters.RelatedFieldListFilter):
-
- def __init__(self, *args, **kwargs):
- super(GerentesInterlegisFilter, self).__init__(*args, **kwargs)
- gerentes = Servidor.objects.filter(casas_que_gerencia__isnull=False).order_by('nome_completo').distinct()
- self.lookup_choices = [(x.id, x) for x in gerentes]
-
-
-class ConvenioFilter(admin.SimpleListFilter):
- title = _("Tipo de convênio")
- parameter_name = 'convenio'
-
- def lookups(self, request, model_admin):
- return (
- ('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):
- if self.value() is not None:
- if self.value() == 'SC':
- queryset = queryset.filter(convenio=None)
- elif self.value() == 'CC':
- queryset = queryset.exclude(convenio=None)
- else:
- queryset = queryset.filter(convenio__projeto_id=self.value())
-
- return queryset.distinct('municipio__uf__nome', 'nome')
-
-class ExcluirConvenioFilter(admin.SimpleListFilter):
- title=_("Excluir convênio da pesquisa")
- parameter_name = 'excluir_convenio'
-
- def lookups(self, request, model_admin):
- return tuple([(p.pk, p.sigla) for p in Projeto.objects.all()])
-
- def queryset(self, request, queryset):
- if (self.value() is None):
- return queryset
- else:
- queryset = queryset.exclude(convenio__projeto_id=self.value()).distinct('municipio__uf__nome', 'nome')
- return queryset
-
-class ServicoFilter(admin.SimpleListFilter):
- title = _("Serviço")
- parameter_name = 'servico'
-
- def lookups(self, request, model_admin):
- return (
- ('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):
- if self.value() is not None:
- if self.value() == 'SS':
- queryset = queryset.filter(servico=None)
- elif self.value() == 'CS':
- queryset = queryset.exclude(servico=None).filter(
- servico__data_desativacao__isnull=True)
- elif self.value() == 'CR':
- queryset = queryset.exclude(servico__tipo_servico__modo='H') \
- .exclude(servico=None)
- elif self.value() == 'CH':
- queryset = queryset.filter(
- servico__tipo_servico__modo='H',
- servico__data_desativacao__isnull=True
- )
- else:
- queryset = queryset.filter(
- servico__tipo_servico_id=self.value()
- )
-
- return queryset.distinct('municipio__uf__nome', 'nome')
-
-class ServicoAtivoFilter(admin.SimpleListFilter):
- title = _("Serviço ativo")
- parameter_name = 'ativo'
-
- def lookups(self, request, model_admin):
- return (
- ('ativo', _("Ativo")),
- ('desativado', _("Desativado")),
- )
+# url = reverse(
+# f'admin:{obj._meta.app_label}_{obj._meta.module_name_change}',
+# args=[obj.pk]
+# ) + '?_popup=1'
+# return mark_safe(
+# f''
+# f'Editar'
+# )
+# link_servico.short_description = _('Editar Serviço')
+
+# def has_add_permission(self, request):
+# return False
+
+# class OcorrenciaInline(admin.TabularInline):
+# model = Ocorrencia
+# fields = ('data_criacao', 'assunto', 'prioridade', 'status',
+# 'data_modificacao', 'setor_responsavel', 'link_editar',)
+# readonly_fields = ('data_criacao', 'assunto', 'prioridade', 'status',
+# 'data_modificacao', 'setor_responsavel', 'link_editar',)
+# extra = 0
+# max_num = 0
+# can_delete = False
+# template = 'admin/casas/ocorrencia_inline.html'
+# ordering = ('-data_modificacao',)
+
+# def link_editar(self, obj):
+# if obj.pk is None:
+# return ""
+# url = reverse(
+# f'admin:{obj._meta.app_label}_{obj._meta.module_name}_change',
+# args=[obj.pk]
+# )
+# return mark_safe(
+# f''
+# f''
+# f'{_("Editar")}'
+# )
+# link_editar.short_description = _('Editar')
+
- def queryset(self, request, queryset):
- if self.value() is not None:
- if self.value() == 'ativo':
- queryset = queryset.filter(servico__data_desativacao__isnull=True)
- else:
- queryset = queryset.filter(servico__data_desativacao__isnull=False)
- return queryset
@admin.register(Orgao)
-class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin):
+class OrgaoAdmin(admin.ModelAdmin):
form = OrgaoForm
- actions = ['adicionar_casas', ]
- inlines = (TelefonesInline, PresidenteInline, ContatoInterlegisInline, FuncionariosInline,
- ConveniosInline, ServicoInline, OcorrenciaInline,)
- list_display = ('id', 'sigla', 'nome', 'get_uf', 'get_gerentes', 'get_convenios',
- 'get_servicos')
+ # actions = ['adicionar_casas', ]
+ inlines = (TelefonesInline, PresidenteInline, ContatoInterlegisInline,
+ FuncionariosInline, ) #ConveniosInline, ServicoInline,
+ # OcorrenciaInline,)
+ list_display = ('id', 'sigla', 'nome', 'get_uf', 'get_gerentes',
+ 'get_convenios', 'get_servicos')
list_display_links = ('sigla', 'nome',)
+ # list_filter = ('tipo', ('gerentes_interlegis', GerentesInterlegisFilter),
+ # 'municipio__uf__nome', ConvenioFilter, ServicoAtivoFilter,
+ # ExcluirConvenioFilter, ServicoFilter, 'inclusao_digital',)
list_filter = ('tipo', ('gerentes_interlegis', GerentesInterlegisFilter),
- 'municipio__uf__nome', ConvenioFilter, ServicoAtivoFilter, ExcluirConvenioFilter, ServicoFilter,
- 'inclusao_digital',)
+ 'municipio__uf__nome', 'inclusao_digital',)
ordering = ('municipio__uf__nome', 'nome')
queryset = queryset_ascii
fieldsets = (
@@ -435,23 +269,33 @@ class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin):
get_uf.admin_order_field = 'municipio__uf__nome'
def get_gerentes(self, obj):
- return obj.lista_gerentes()
+ return mark_safe(obj.lista_gerentes())
get_gerentes.short_description = _('Gerente Interlegis')
- get_gerentes.allow_tags = True
def get_convenios(self, obj):
- return '' + ''.join(['- %s
' % c.__unicode__()
- for c in obj.convenio_set.all()]) + '
'
+ #TODO: Descomentar após migração da app Convênios
+ # return mark_safe(
+ # '' +
+ # ''.join([f'- {c}
' for c in obj.convenio_set.all()]) +
+ # '
'
+ # )
+ return "TODO: Descomentar após migração da app Convênios"
get_convenios.short_description = _('Convênios')
- get_convenios.allow_tags = True
def get_servicos(self, obj):
- return '' + ''.join(
- ['- {servico}
'.format(
- url=s.url, servico=s.__unicode__()) for s in
- obj.servico_set.filter(data_desativacao__isnull=True)]) + '
'
+ #TODO: Descomentar após migrar a app Servicos
+ # return mark_safe(
+ # '' +
+ # ''.join(
+ # [f'- {s}
'
+ # for s in obj.servico_set.filter(
+ # data_desativacao__isnull=True)
+ # ]
+ # ) +
+ # '
'
+ # )
+ return "TODO: Descomentar após migrar a app Servicos"
get_servicos.short_description = _('Serviços')
- get_servicos.allow_tags = True
def changelist_view(self, request, extra_context=None):
return super(OrgaoAdmin, self).changelist_view(
@@ -466,56 +310,55 @@ class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin):
'municipio__uf__codigo_ibge__exact',
'convenio__projeto__id__exact'])
- def etiqueta(self, request, queryset):
- return labels_report(request, queryset=queryset)
- 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 = _("Gerar etiqueta(s) sem "
- "presidente da(s) casa(s) "
- "selecionada(s)")
-
- def relatorio(self, request, queryset):
- return report(request, queryset=queryset)
- 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 = _("Gerar relatório completo da(s) "
- "casa(s) selecionada(s)")
-
- def relatorio_csv(self, request, queryset):
- return export_csv(request)
- relatorio_csv.short_description = _("Exportar casa(s) selecionada(s) "
- "para CSV")
-
- def adicionar_casas(self, request, queryset):
- if 'carrinho_casas' in request.session:
- # if request.session.has_key('carrinho_casas'):
- q1 = len(request.session['carrinho_casas'])
- else:
- q1 = 0
- response = adicionar_casas_carrinho(request, queryset=queryset)
- q2 = len(request.session['carrinho_casas'])
- quant = q2 - q1
- if quant:
- self.message_user(request, str(q2 - q1) + " " +
- _("Casas Legislativas adicionadas no carrinho"))
- else:
- self.message_user(request, _("As Casas Legislativas selecionadas "
- "já foram adicionadas anteriormente"))
- return HttpResponseRedirect('.')
-
- adicionar_casas.short_description = _("Armazenar casas no carrinho para "
- "exportar")
+ #TODO: Resolver depois - sigi-boys???
+ # def etiqueta(self, request, queryset):
+ # return labels_report(request, queryset=queryset)
+ # 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 = _("Gerar etiqueta(s) sem "
+ # "presidente da(s) casa(s) "
+ # "selecionada(s)")
+
+ # def relatorio(self, request, queryset):
+ # return report(request, queryset=queryset)
+ # 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 = _("Gerar relatório completo da(s) "
+ # "casa(s) selecionada(s)")
+
+ # def relatorio_csv(self, request, queryset):
+ # return export_csv(request)
+ # relatorio_csv.short_description = _("Exportar casa(s) selecionada(s) "
+ # "para CSV")
+
+ # def adicionar_casas(self, request, queryset):
+ # if 'carrinho_casas' in request.session:
+ # # if request.session.has_key('carrinho_casas'):
+ # q1 = len(request.session['carrinho_casas'])
+ # else:
+ # q1 = 0
+ # response = adicionar_casas_carrinho(request, queryset=queryset)
+ # q2 = len(request.session['carrinho_casas'])
+ # quant = q2 - q1
+ # if quant:
+ # self.message_user(request, str(q2 - q1) + " " +
+ # _("Casas Legislativas adicionadas no carrinho"))
+ # else:
+ # self.message_user(request, _("As Casas Legislativas selecionadas "
+ # "já foram adicionadas anteriormente"))
+ # return HttpResponseRedirect('.')
+
+ # adicionar_casas.short_description = _("Armazenar casas no carrinho para "
+ # "exportar")
def get_actions(self, request):
actions = super(OrgaoAdmin, self).get_actions(request)
if 'delete_selected' in actions:
del actions['delete_selected']
- return actions
-
-admin.site.register(TipoOrgao)
+ return actions
\ No newline at end of file
diff --git a/sigi/apps/casas/apps.py b/sigi/apps/casas/apps.py
new file mode 100644
index 0000000..78c131f
--- /dev/null
+++ b/sigi/apps/casas/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+from django.utils.translation import gettext_lazy as _
+
+class CasasConfig(AppConfig):
+ name = 'sigi.apps.casas'
+ verbose_name = _('casas legislativas')
diff --git a/sigi/apps/casas/filters.py b/sigi/apps/casas/filters.py
new file mode 100644
index 0000000..749a260
--- /dev/null
+++ b/sigi/apps/casas/filters.py
@@ -0,0 +1,97 @@
+from django.contrib import admin
+from sigi.apps.servidores.models import Servidor
+
+
+class GerentesInterlegisFilter(admin.filters.RelatedFieldListFilter):
+
+ def __init__(self, *args, **kwargs):
+ super(GerentesInterlegisFilter, self).__init__(*args, **kwargs)
+ gerentes = Servidor.objects.filter(casas_que_gerencia__isnull=False).order_by('nome_completo').distinct()
+ self.lookup_choices = [(x.id, x) for x in gerentes]
+
+# class ConvenioFilter(admin.SimpleListFilter):
+# title = _("Tipo de convênio")
+# parameter_name = 'convenio'
+
+# def lookups(self, request, model_admin):
+# return (
+# ('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):
+# if self.value() is not None:
+# if self.value() == 'SC':
+# queryset = queryset.filter(convenio=None)
+# elif self.value() == 'CC':
+# queryset = queryset.exclude(convenio=None)
+# else:
+# queryset = queryset.filter(convenio__projeto_id=self.value())
+
+# return queryset.distinct('municipio__uf__nome', 'nome')
+
+# class ExcluirConvenioFilter(admin.SimpleListFilter):
+# title=_("Excluir convênio da pesquisa")
+# parameter_name = 'excluir_convenio'
+
+# def lookups(self, request, model_admin):
+# return tuple([(p.pk, p.sigla) for p in Projeto.objects.all()])
+
+# def queryset(self, request, queryset):
+# if (self.value() is None):
+# return queryset
+# else:
+# queryset = queryset.exclude(convenio__projeto_id=self.value()).distinct('municipio__uf__nome', 'nome')
+# return queryset
+
+# class ServicoFilter(admin.SimpleListFilter):
+# title = _("Serviço")
+# parameter_name = 'servico'
+
+# def lookups(self, request, model_admin):
+# return (
+# ('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):
+# if self.value() is not None:
+# if self.value() == 'SS':
+# queryset = queryset.filter(servico=None)
+# elif self.value() == 'CS':
+# queryset = queryset.exclude(servico=None).filter(
+# servico__data_desativacao__isnull=True)
+# elif self.value() == 'CR':
+# queryset = queryset.exclude(servico__tipo_servico__modo='H') \
+# .exclude(servico=None)
+# elif self.value() == 'CH':
+# queryset = queryset.filter(
+# servico__tipo_servico__modo='H',
+# servico__data_desativacao__isnull=True
+# )
+# else:
+# queryset = queryset.filter(
+# servico__tipo_servico_id=self.value()
+# )
+
+# return queryset.distinct('municipio__uf__nome', 'nome')
+
+# class ServicoAtivoFilter(admin.SimpleListFilter):
+# title = _("Serviço ativo")
+# parameter_name = 'ativo'
+
+# def lookups(self, request, model_admin):
+# return (
+# ('ativo', _("Ativo")),
+# ('desativado', _("Desativado")),
+# )
+
+# def queryset(self, request, queryset):
+# if self.value() is not None:
+# if self.value() == 'ativo':
+# queryset = queryset.filter(servico__data_desativacao__isnull=True)
+# else:
+# queryset = queryset.filter(servico__data_desativacao__isnull=False)
+# return queryset
diff --git a/sigi/apps/casas/forms.py b/sigi/apps/casas/forms.py
index fb347d4..d2c1ce0 100644
--- a/sigi/apps/casas/forms.py
+++ b/sigi/apps/casas/forms.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from django import forms
from django.utils.translation import gettext as _
from localflavor.br.forms import BRZipCodeField
diff --git a/sigi/apps/casas/migrations/0001_initial.py b/sigi/apps/casas/migrations/0001_initial.py
index 7e06ed2..4577a98 100644
--- a/sigi/apps/casas/migrations/0001_initial.py
+++ b/sigi/apps/casas/migrations/0001_initial.py
@@ -1,8 +1,6 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
-import image_cropping.fields
import sigi.apps.utils
@@ -30,12 +28,12 @@ class Migration(migrations.Migration):
('pagina_web', models.URLField(help_text=b'Exemplo: http://www.camarapains.mg.gov.br.', verbose_name='p\xe1gina web', blank=True)),
('ult_alt_endereco', models.DateTimeField(null=True, verbose_name='\xdaltima altera\xe7\xe3o do endere\xe7o', blank=True)),
('foto', models.ImageField(height_field=b'foto_altura', width_field=b'foto_largura', upload_to=b'imagens/casas', blank=True)),
- (b'recorte', image_cropping.fields.ImageRatioField(b'foto', '400x300', hide_image_field=False, size_warning=True, allow_fullsize=False, free_crop=False, adapt_rotation=False, help_text=None, verbose_name=b'Recorte')),
+ ('recorte', models.CharField('foto', max_length=255)),
('foto_largura', models.SmallIntegerField(null=True, editable=False)),
('foto_altura', models.SmallIntegerField(null=True, editable=False)),
('data_instalacao', models.DateField(null=True, verbose_name='Data de instala\xe7\xe3o da Casa Legislativa', blank=True)),
- ('gerente_contas', models.ForeignKey(verbose_name=b'Gerente de contas', blank=True, to='servidores.Servidor', null=True)),
- ('municipio', models.ForeignKey(verbose_name=b'munic\xc3\xadpio', to='contatos.Municipio')),
+ ('gerente_contas', models.ForeignKey(verbose_name=b'Gerente de contas', blank=True, to='servidores.Servidor', null=True, on_delete=models.CASCADE)),
+ ('municipio', models.ForeignKey(verbose_name=b'munic\xc3\xadpio', to='contatos.Municipio', on_delete=models.CASCADE)),
],
options={
'ordering': ('nome',),
@@ -57,7 +55,7 @@ class Migration(migrations.Migration):
('setor', models.CharField(default=b'outros', max_length=100, choices=[(b'presidente', b'Presidente'), (b'contato_interlegis', b'Contato Interlegis'), (b'infraestrutura_fisica', b'Infraestrutura F\xc3\xadsica'), (b'estrutura_de_ti', b'Estrutura de TI'), (b'organizacao_do_processo_legislativo', b'Organiza\xc3\xa7\xc3\xa3o do Processo Legislativo'), (b'producao_legislativa', b'Produ\xc3\xa7\xc3\xa3o Legislativa'), (b'estrutura_de_comunicacao_social', b'Estrutura de Comunica\xc3\xa7\xc3\xa3o Social'), (b'estrutura_de_recursos_humanos', b'Estrutura de Recursos Humanos'), (b'gestao', b'Gest\xc3\xa3o'), (b'outros', b'Outros')])),
('tempo_de_servico', models.CharField(max_length=50, null=True, verbose_name='tempo de servi\xe7o', blank=True)),
('ult_alteracao', models.DateTimeField(null=True, verbose_name='\xdaltima altera\xe7\xe3o', blank=True)),
- ('casa_legislativa', models.ForeignKey(to='casas.CasaLegislativa')),
+ ('casa_legislativa', models.ForeignKey(to='casas.CasaLegislativa', on_delete=models.CASCADE)),
],
options={
'ordering': ('nome',),
@@ -80,7 +78,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='casalegislativa',
name='tipo',
- field=models.ForeignKey(verbose_name=b'Tipo', to='casas.TipoCasaLegislativa'),
+ field=models.ForeignKey(verbose_name=b'Tipo', to='casas.TipoCasaLegislativa', on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AlterUniqueTogether(
diff --git a/sigi/apps/casas/migrations/0002_auto_20150710_1247.py b/sigi/apps/casas/migrations/0002_auto_20150710_1247.py
index 45a066a..070cea8 100644
--- a/sigi/apps/casas/migrations/0002_auto_20150710_1247.py
+++ b/sigi/apps/casas/migrations/0002_auto_20150710_1247.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
@@ -33,13 +32,13 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='casalegislativa',
name='pesquisador',
- field=models.ForeignKey(verbose_name='Pesquisador', blank=True, to='servidores.Servidor', null=True),
+ field=models.ForeignKey(verbose_name='Pesquisador', blank=True, to='servidores.Servidor', null=True, on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AlterField(
model_name='casalegislativa',
name='gerente_contas',
- field=models.ForeignKey(related_name='casas_que_gerencia', verbose_name=b'Gerente de contas', blank=True, to='servidores.Servidor', null=True),
+ field=models.ForeignKey(related_name='casas_que_gerencia', verbose_name=b'Gerente de contas', blank=True, to='servidores.Servidor', null=True, on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AlterField(
diff --git a/sigi/apps/casas/migrations/0003_auto_20200207_0919.py b/sigi/apps/casas/migrations/0003_auto_20200207_0919.py
index ffc534f..8b57026 100644
--- a/sigi/apps/casas/migrations/0003_auto_20200207_0919.py
+++ b/sigi/apps/casas/migrations/0003_auto_20200207_0919.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0004_auto_20201015_0810.py b/sigi/apps/casas/migrations/0004_auto_20201015_0810.py
index 39f3463..dd855bf 100644
--- a/sigi/apps/casas/migrations/0004_auto_20201015_0810.py
+++ b/sigi/apps/casas/migrations/0004_auto_20201015_0810.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
@@ -14,7 +13,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='casalegislativa',
name='gerente_contas',
- field=models.ForeignKey(related_name='casas_que_gerencia_old', verbose_name=b'Gerente de contas', blank=True, to='servidores.Servidor', null=True),
+ field=models.ForeignKey(related_name='casas_que_gerencia_old', verbose_name=b'Gerente de contas', blank=True, to='servidores.Servidor', null=True, on_delete=models.CASCADE),
preserve_default=True,
),
]
diff --git a/sigi/apps/casas/migrations/0005_casalegislativa_gerentes_interlegis.py b/sigi/apps/casas/migrations/0005_casalegislativa_gerentes_interlegis.py
index 56254f7..ad036ee 100644
--- a/sigi/apps/casas/migrations/0005_casalegislativa_gerentes_interlegis.py
+++ b/sigi/apps/casas/migrations/0005_casalegislativa_gerentes_interlegis.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0006_remove_casalegislativa_gerente_contas.py b/sigi/apps/casas/migrations/0006_remove_casalegislativa_gerente_contas.py
index 3d356eb..a9e3e7a 100644
--- a/sigi/apps/casas/migrations/0006_remove_casalegislativa_gerente_contas.py
+++ b/sigi/apps/casas/migrations/0006_remove_casalegislativa_gerente_contas.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0007_auto_20201016_1632.py b/sigi/apps/casas/migrations/0007_auto_20201016_1632.py
index 160bc5d..25fff60 100644
--- a/sigi/apps/casas/migrations/0007_auto_20201016_1632.py
+++ b/sigi/apps/casas/migrations/0007_auto_20201016_1632.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
@@ -68,7 +67,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='casalegislativa',
name='municipio',
- field=models.ForeignKey(verbose_name='Munic\xedpio', to='contatos.Municipio'),
+ field=models.ForeignKey(verbose_name='Munic\xedpio', to='contatos.Municipio', on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AlterField(
diff --git a/sigi/apps/casas/migrations/0008_auto_20210218_1007.py b/sigi/apps/casas/migrations/0008_auto_20210218_1007.py
index a4294ff..b76582b 100644
--- a/sigi/apps/casas/migrations/0008_auto_20210218_1007.py
+++ b/sigi/apps/casas/migrations/0008_auto_20210218_1007.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
@@ -33,7 +32,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='funcionario',
name='municipio',
- field=models.ForeignKey(verbose_name='Municipio', to='contatos.Municipio', null=True),
+ field=models.ForeignKey(verbose_name='Municipio', to='contatos.Municipio', null=True, on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AddField(
diff --git a/sigi/apps/casas/migrations/0009_auto_20210406_1055.py b/sigi/apps/casas/migrations/0009_auto_20210406_1055.py
index e1b1c5e..19a280a 100644
--- a/sigi/apps/casas/migrations/0009_auto_20210406_1055.py
+++ b/sigi/apps/casas/migrations/0009_auto_20210406_1055.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
@@ -14,7 +13,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='funcionario',
name='municipio',
- field=models.ForeignKey(verbose_name='Municipio', blank=True, to='contatos.Municipio', null=True),
+ field=models.ForeignKey(verbose_name='Municipio', blank=True, to='contatos.Municipio', null=True, on_delete=models.CASCADE),
preserve_default=True,
),
]
diff --git a/sigi/apps/casas/migrations/0010_auto_20210406_1101.py b/sigi/apps/casas/migrations/0010_auto_20210406_1101.py
index dfc8436..b6b9876 100644
--- a/sigi/apps/casas/migrations/0010_auto_20210406_1101.py
+++ b/sigi/apps/casas/migrations/0010_auto_20210406_1101.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0011_auto_20210406_1135.py b/sigi/apps/casas/migrations/0011_auto_20210406_1135.py
index 276d3bb..763bd13 100644
--- a/sigi/apps/casas/migrations/0011_auto_20210406_1135.py
+++ b/sigi/apps/casas/migrations/0011_auto_20210406_1135.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0012_auto_20210406_1420.py b/sigi/apps/casas/migrations/0012_auto_20210406_1420.py
index 1e237c2..012326a 100644
--- a/sigi/apps/casas/migrations/0012_auto_20210406_1420.py
+++ b/sigi/apps/casas/migrations/0012_auto_20210406_1420.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0013_auto_20210406_1428.py b/sigi/apps/casas/migrations/0013_auto_20210406_1428.py
index 4b1851d..0cac340 100644
--- a/sigi/apps/casas/migrations/0013_auto_20210406_1428.py
+++ b/sigi/apps/casas/migrations/0013_auto_20210406_1428.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0014_auto_20210406_1945.py b/sigi/apps/casas/migrations/0014_auto_20210406_1945.py
index 32ee5a2..00033eb 100644
--- a/sigi/apps/casas/migrations/0014_auto_20210406_1945.py
+++ b/sigi/apps/casas/migrations/0014_auto_20210406_1945.py
@@ -1,8 +1,6 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
-import image_cropping.fields
import sigi.apps.utils
@@ -14,7 +12,7 @@ class Migration(migrations.Migration):
('servidores', '0001_initial'),
# ('parlamentares', '0002_auto_20210406_1945'),
# ('servicos', '0005_auto_20210406_1945'),
- ('servicos', '0004_delete_casaatendida'),
+ # ('servicos', '0004_delete_casaatendida'),
# ('inventario', '0002_auto_20210406_1945'),
# ('convenios', '0003_auto_20210406_1945'),
# ('ocorrencias', '0003_auto_20210406_1945'),
diff --git a/sigi/apps/casas/migrations/0015_auto_20210407_0801.py b/sigi/apps/casas/migrations/0015_auto_20210407_0801.py
index 93f7b4b..744c050 100644
--- a/sigi/apps/casas/migrations/0015_auto_20210407_0801.py
+++ b/sigi/apps/casas/migrations/0015_auto_20210407_0801.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0016_auto_20210407_1559.py b/sigi/apps/casas/migrations/0016_auto_20210407_1559.py
index 91b5347..a87b846 100644
--- a/sigi/apps/casas/migrations/0016_auto_20210407_1559.py
+++ b/sigi/apps/casas/migrations/0016_auto_20210407_1559.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0017_auto_20210416_0841.py b/sigi/apps/casas/migrations/0017_auto_20210416_0841.py
index 7f6cc71..a831992 100644
--- a/sigi/apps/casas/migrations/0017_auto_20210416_0841.py
+++ b/sigi/apps/casas/migrations/0017_auto_20210416_0841.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
@@ -15,7 +14,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='funcionario',
name='casa_legislativa',
- field=models.ForeignKey(verbose_name='\xf3rg\xe3o', to='casas.Orgao'),
+ field=models.ForeignKey(verbose_name='\xf3rg\xe3o', to='casas.Orgao', on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AlterField(
diff --git a/sigi/apps/casas/migrations/0018_orgao_sigla.py b/sigi/apps/casas/migrations/0018_orgao_sigla.py
index fcc6370..70aaed7 100644
--- a/sigi/apps/casas/migrations/0018_orgao_sigla.py
+++ b/sigi/apps/casas/migrations/0018_orgao_sigla.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0019_auto_20210501_1058.py b/sigi/apps/casas/migrations/0019_auto_20210501_1058.py
index 0dc0e4b..9a406fa 100644
--- a/sigi/apps/casas/migrations/0019_auto_20210501_1058.py
+++ b/sigi/apps/casas/migrations/0019_auto_20210501_1058.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0020_auto_20210611_0946.py b/sigi/apps/casas/migrations/0020_auto_20210611_0946.py
index 378731e..2b4f310 100644
--- a/sigi/apps/casas/migrations/0020_auto_20210611_0946.py
+++ b/sigi/apps/casas/migrations/0020_auto_20210611_0946.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
diff --git a/sigi/apps/casas/migrations/0021_alter_orgao_options_remove_orgao_recorte_and_more.py b/sigi/apps/casas/migrations/0021_alter_orgao_options_remove_orgao_recorte_and_more.py
new file mode 100644
index 0000000..63421a9
--- /dev/null
+++ b/sigi/apps/casas/migrations/0021_alter_orgao_options_remove_orgao_recorte_and_more.py
@@ -0,0 +1,200 @@
+# Generated by Django 4.0.1 on 2022-01-11 18:44
+
+from django.db import migrations, models
+import django.db.models.deletion
+import sigi.apps.utils
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('servidores', '0008_alter_servico_id_alter_servidor_foto_and_more'),
+ ('contatos', '0005_alter_mesorregiao_options_alter_microrregiao_options_and_more'),
+ ('casas', '0020_auto_20210611_0946'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='orgao',
+ options={'ordering': ('nome',), 'verbose_name': 'órgão', 'verbose_name_plural': 'órgãos'},
+ ),
+ migrations.RemoveField(
+ model_name='orgao',
+ name='recorte',
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='bairro',
+ field=models.CharField(blank=True, max_length=100, verbose_name='bairro'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='cargo',
+ field=models.CharField(blank=True, max_length=100, null=True, verbose_name='cargo'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='data_nascimento',
+ field=models.DateField(blank=True, null=True, verbose_name='data de nascimento'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='desativado',
+ field=models.BooleanField(default=False, verbose_name='desativado'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='endereco',
+ field=models.CharField(blank=True, max_length=100, verbose_name='endereço'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='id',
+ field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='municipio',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='contatos.municipio', verbose_name='municipio'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='nome',
+ field=models.CharField(max_length=60, verbose_name='nome completo'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='nota',
+ field=models.CharField(blank=True, max_length=250, null=True, verbose_name='telefones'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='observacoes',
+ field=models.TextField(blank=True, verbose_name='observações'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='redes_sociais',
+ field=models.TextField(blank=True, help_text='Colocar um por linha', verbose_name='redes sociais'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='setor',
+ field=models.CharField(choices=[('presidente', 'Presidente'), ('contato_interlegis', 'Contato Interlegis'), ('infraestrutura_fisica', 'Infraestrutura Física'), ('estrutura_de_ti', 'Estrutura de TI'), ('organizacao_do_processo_legislativo', 'Organização do Processo Legislativo'), ('producao_legislativa', 'Produção Legislativa'), ('estrutura_de_comunicacao_social', 'Estrutura de Comunicação Social'), ('estrutura_de_recursos_humanos', 'Estrutura de Recursos Humanos'), ('gestao', 'Gestão'), ('outros', 'Outros')], default='outros', max_length=100, verbose_name='setor'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='sexo',
+ field=models.CharField(choices=[('M', 'Masculino'), ('F', 'Feminino')], default='M', max_length=1, verbose_name='sexo'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='tempo_de_servico',
+ field=models.CharField(blank=True, max_length=50, null=True, verbose_name='tempo de serviço'),
+ ),
+ migrations.AlterField(
+ model_name='funcionario',
+ name='ult_alteracao',
+ field=models.DateTimeField(auto_now=True, null=True, verbose_name='última alteração'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='bairro',
+ field=models.CharField(blank=True, max_length=100, verbose_name='bairro'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='cnpj',
+ field=models.CharField(blank=True, max_length=32, verbose_name='CNPJ'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='codigo_interlegis',
+ field=models.CharField(blank=True, max_length=3, verbose_name='código Interlegis'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='data_instalacao',
+ field=models.DateField(blank=True, null=True, verbose_name='data de instalação da Casa Legislativa'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='data_levantamento',
+ field=models.DateTimeField(blank=True, null=True, verbose_name='data/hora da pesquisa'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='email',
+ field=models.EmailField(blank=True, max_length=128, verbose_name='e-mail'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='foto',
+ field=models.ImageField(blank=True, height_field='foto_altura', upload_to='imagens/casas', verbose_name='foto', width_field='foto_largura'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='horario_funcionamento',
+ field=models.CharField(blank=True, max_length=100, verbose_name='horário de funcionamento da Casa Legislativa'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='id',
+ field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='inclusao_digital',
+ field=models.CharField(choices=[('NAO PESQUISADO', 'Não pesquisado'), ('NAO POSSUI PORTAL', 'Não possui portal'), ('PORTAL MODELO', 'Possui Portal Modelo'), ('OUTRO PORTAL', 'Possui outro portal')], default='NAO PESQUISADO', max_length=30, verbose_name='inclusão digital'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='logradouro',
+ field=models.CharField(help_text='Avenida, rua, praça, jardim, parque...', max_length=100, verbose_name='logradouro'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='municipio',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='contatos.municipio', verbose_name='município'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='nome',
+ field=models.CharField(help_text='Exemplo: Câmara Municipal de Pains.', max_length=60, verbose_name='nome'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='obs_pesquisa',
+ field=models.TextField(blank=True, verbose_name='observações do pesquisador'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='pagina_web',
+ field=models.URLField(blank=True, help_text='Exemplo: http://www.camarapains.mg.gov.br.', verbose_name='página web'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='pesquisador',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servidores.servidor', verbose_name='pesquisador'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='search_text',
+ field=sigi.apps.utils.SearchField(editable=False, field_names=['nome']),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='tipo',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='casas.tipoorgao', verbose_name='tipo'),
+ ),
+ migrations.AlterField(
+ model_name='orgao',
+ name='ult_alt_endereco',
+ field=models.DateTimeField(blank=True, null=True, verbose_name='última alteração do endereço'),
+ ),
+ migrations.AlterField(
+ model_name='tipoorgao',
+ name='id',
+ field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
+ ),
+ ]
diff --git a/sigi/apps/casas/models.py b/sigi/apps/casas/models.py
index f62c327..ce7f461 100644
--- a/sigi/apps/casas/models.py
+++ b/sigi/apps/casas/models.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
from datetime import datetime
import random
from string import ascii_uppercase
@@ -7,19 +6,12 @@ from django.core.exceptions import ValidationError
from django.utils.translation import gettext as _
from django.contrib.contenttypes.fields import GenericRelation
from django.db import models
-from image_cropping import ImageRatioField
from sigi.apps.contatos.models import Municipio
from sigi.apps.servidores.models import Servidor
from sigi.apps.utils import SearchField
class TipoOrgao(models.Model):
- """ Modelo para representar o tipo da Casa Legislativa
-
- Geralmente: Câmara Municipal, Assembléia Legislativa,
- Câmara Distrital ou Legislativo Federal
- """
-
sigla = models.CharField(_("Sigla"), max_length=5)
nome = models.CharField(_("Nome"), max_length=100)
legislativo = models.BooleanField(_("Poder legislativo"), default=False)
@@ -29,13 +21,10 @@ class TipoOrgao(models.Model):
verbose_name = _("Tipo de órgão")
verbose_name_plural = _("Tipos de órgão")
- def __unicode__(self):
+ def __str__(self):
return self.nome
class Orgao(models.Model):
- """ Modelo para representar uma Casa Legislativa
- """
-
INCLUSAO_DIGITAL_CHOICES = (
('NAO PESQUISADO', _('Não pesquisado')),
('NAO POSSUI PORTAL', _('Não possui portal')),
@@ -44,7 +33,7 @@ class Orgao(models.Model):
)
nome = models.CharField(
- _("Nome"),
+ _("nome"),
max_length=60,
help_text=_('Exemplo: Câmara Municipal de Pains.')
)
@@ -58,102 +47,93 @@ class Orgao(models.Model):
tipo = models.ForeignKey(
TipoOrgao,
on_delete=models.PROTECT,
- verbose_name=_("Tipo")
+ verbose_name=_("tipo")
)
cnpj = models.CharField(_("CNPJ"), max_length=32, blank=True)
observacoes = models.TextField(_('observações'), blank=True)
horario_funcionamento = models.CharField(
- _("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(
- _('Código Interlegis'),
+ _('código Interlegis'),
max_length=3,
blank=True
)
- # codigo_interlegis.ts_filter = True
-
gerentes_interlegis = models.ManyToManyField(
Servidor,
verbose_name=_("Gerentes Interlegis"),
related_name='casas_que_gerencia',
blank=True,
)
-
# Informações de contato
logradouro = models.CharField(
- _("Logradouro"),
+ _("logradouro"),
max_length=100,
help_text=_('Avenida, rua, praça, jardim, parque...')
)
- bairro = models.CharField(_("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=_('Município')
+ verbose_name=_('município')
)
- # municipio.uf_filter = True
-
cep = models.CharField(_("CEP"), max_length=32)
- email = models.EmailField(_('E-mail'), max_length=128, blank=True)
+ email = models.EmailField(_('e-mail'), max_length=128, blank=True)
pagina_web = models.URLField(
- _('Página web'),
+ _('página web'),
help_text=_('Exemplo: http://www.camarapains.mg.gov.br.'),
blank=True,
)
inclusao_digital = models.CharField(
- _("Inclusão digital"),
+ _("inclusão digital"),
max_length=30,
choices=INCLUSAO_DIGITAL_CHOICES,
default=INCLUSAO_DIGITAL_CHOICES[0][0]
)
data_levantamento = models.DateTimeField(
- _("Data/hora da pesquisa"),
+ _("data/hora da pesquisa"),
null=True,
blank=True
)
pesquisador = models.ForeignKey(
Servidor,
on_delete=models.SET_NULL,
- verbose_name=_("Pesquisador"),
+ verbose_name=_("pesquisador"),
null=True,
blank=True
)
obs_pesquisa = models.TextField(
- _("Observações do pesquisador"),
+ _("observações do pesquisador"),
blank=True
)
ult_alt_endereco = models.DateTimeField(
- _('Última alteração do endereço'),
+ _('última alteração do endereço'),
null=True,
blank=True,
editable=True
)
telefones = GenericRelation('contatos.Telefone')
-
foto = models.ImageField(
- _("Foto"),
+ _("foto"),
upload_to='imagens/casas',
width_field='foto_largura',
height_field='foto_altura',
blank=True
)
- recorte = ImageRatioField('foto', '400x300', verbose_name=_("Recorte"))
foto_largura = models.SmallIntegerField(editable=False, null=True)
foto_altura = models.SmallIntegerField(editable=False, null=True)
data_instalacao = models.DateField(
- _('Data de instalação da Casa Legislativa'),
+ _('data de instalação da Casa Legislativa'),
null=True,
blank=True
)
class Meta:
ordering = ('nome',)
- verbose_name = _('Órgão')
- verbose_name_plural = _('Órgãos')
+ verbose_name = _('órgão')
+ verbose_name_plural = _('órgãos')
def lista_gerentes(self, fmt='html'):
if not self.gerentes_interlegis.exists():
@@ -168,15 +148,14 @@ class Orgao(models.Model):
@property
def num_parlamentares(self):
- if not self.legislatura_set.exists():
- return 0
- return self.legislatura_set.latest('data_inicio').total_parlamentares
+ # TODO: Descomentar assim que a app Parlamentares for migrada
+ # if not self.legislatura_set.exists():
+ # return 0
+ # return self.legislatura_set.latest('data_inicio').total_parlamentares
+ return 0
@property
def telefone(self):
- """ Link para acessar diretamente o primeiro telefone cadastrado da casa
- Util para relatorios antigos
- """
telefones = self.telefones.all()
if telefones:
return telefones[0]
@@ -184,9 +163,6 @@ class Orgao(models.Model):
@property
def presidente(self):
- """ Link para acessar diretamente o contato do presidente da casa
- Util para relatorios antigos
- """
try:
if self.funcionario_set.filter(setor='presidente').count() > 1:
return self.funcionario_set.filter(setor='presidente')[0]
@@ -197,9 +173,6 @@ class Orgao(models.Model):
@property
def contato_interlegis(self):
- """ Link para acessar diretamente o contato do presidente da casa
- Util para relatorios antigos
- """
try:
if self.funcionario_set.filter(setor='contato_interlegis').count() > 1:
return self.funcionario_set.filter(setor='contato_interlegis')[0]
@@ -208,23 +181,6 @@ class Orgao(models.Model):
except Funcionario.DoesNotExist:
return None
- @property
- def total_parlamentares(self):
- """
- Calcula o total de parlamentares atual da Casa:
- - O total de parlamentares da legislatura mais recente, ou
- - num_parlamentares ou
- - 0 se não tiver nenhuma das informações
- """
-
- if self.legislatura_set.exists():
- return self.legislatura_set.all()[0].total_parlamentares
-
- if self.num_parlamentares is not None:
- return self.num_parlamentares
-
- return 0
-
def gerarCodigoInterlegis(self):
codigo = self.codigo_interlegis
@@ -238,7 +194,8 @@ class Orgao(models.Model):
return codigo
# Se já existe, então trata a Assembleia como uma Casa qualquer.
- cityName = normalize('NFKD', unicode(self.municipio.nome)).encode('ascii', 'ignore')
+ cityName = normalize('NFKD', self.municipio.nome).encode(
+ 'ascii', 'ignore')
cityName = cityName.upper().strip()
cityName = cityName.replace(' DA ', ' ')
cityName = cityName.replace(' DE ', ' ')
@@ -315,7 +272,7 @@ class Orgao(models.Model):
return codigo
- def __unicode__(self):
+ def __str__(self):
return self.nome
def clean(self):
@@ -347,13 +304,7 @@ class Orgao(models.Model):
return super(Orgao, self).save(*args, **kwargs)
-
class Funcionario(models.Model):
-
- """ Modelo para registrar contatos vinculados às
- Casas Legislativas
- """
-
SETOR_CHOICES = [
("presidente", _("Presidente")),
("contato_interlegis", _("Contato Interlegis")),
@@ -379,42 +330,40 @@ class Funcionario(models.Model):
verbose_name=_("órgão"),
)
nome = models.CharField(_('nome completo'), max_length=60, blank=False)
- # nome.alphabetic_filter = True
sexo = models.CharField(
- _("Sexo"),
+ _("sexo"),
max_length=1,
choices=SEXO_CHOICES,
default="M"
)
data_nascimento = models.DateField(
- _("Data de nascimento"),
+ _("data de nascimento"),
blank=True,
null=True
)
nota = models.CharField(
- _("Telefones"),
+ _("telefones"),
max_length=250,
null=True,
blank=True
)
email = models.CharField(_('e-mail'), max_length=250, blank=True)
- # endereco = generic.GenericRelation('contatos.Endereco')
- endereco = models.CharField(_('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=_('Municipio'),
+ verbose_name=_('municipio'),
null=True,
blank=True,
)
- bairro = models.CharField(_('Bairro'), max_length=100, blank=True)
+ bairro = models.CharField(_('bairro'), max_length=100, blank=True)
cep = models.CharField(_('CEP'), max_length=10, blank=True)
redes_sociais = models.TextField(
- _('Redes sociais'),
+ _('redes sociais'),
help_text=_('Colocar um por linha'),
blank=True
)
- cargo = models.CharField(_("Cargo"), max_length=100, null=True, blank=True)
+ cargo = models.CharField(_("cargo"), max_length=100, null=True, blank=True)
funcao = models.CharField(
_('função'),
max_length=100,
@@ -422,46 +371,42 @@ class Funcionario(models.Model):
blank=True
)
setor = models.CharField(
- _("Setor"),
+ _("setor"),
max_length=100,
choices=SETOR_CHOICES,
default="outros"
)
tempo_de_servico = models.CharField(
- _('Tempo de serviço'),
+ _('tempo de serviço'),
max_length=50,
null=True,
blank=True
)
ult_alteracao = models.DateTimeField(
- _('Última alteração'),
+ _('última alteração'),
null=True,
blank=True,
editable=True,
auto_now=True
)
- desativado = models.BooleanField(_("Desativado"), default=False)
- observacoes = models.TextField(_("Observações"), blank=True)
+ desativado = models.BooleanField(_("desativado"), default=False)
+ observacoes = models.TextField(_("observações"), blank=True)
class Meta:
ordering = ('nome',)
verbose_name = _('contato da Casa Legislativa')
verbose_name_plural = _('contatos da Casa Legislativa')
- def __unicode__(self):
+ def __str__(self):
return self.nome
-
class PresidenteManager(models.Manager):
-
def get_queryset(self):
qs = super(PresidenteManager, self).get_queryset()
qs = qs.filter(setor='presidente')
return qs
-
class Presidente(Funcionario):
-
class Meta:
proxy = True
@@ -471,4 +416,4 @@ class Presidente(Funcionario):
self.setor = 'presidente'
self.cargo = 'Presidente'
self.funcao = 'Presidente'
- return super(Presidente, self).save(*args, **kwargs)
+ return super(Presidente, self).save(*args, **kwargs)
\ No newline at end of file
diff --git a/sigi/apps/casas/templates/casas/casas_sem_convenio_pdf.html b/sigi/apps/casas/templates/casas/casas_sem_convenio_pdf.html
new file mode 100644
index 0000000..2d6abe8
--- /dev/null
+++ b/sigi/apps/casas/templates/casas/casas_sem_convenio_pdf.html
@@ -0,0 +1,37 @@
+{% extends 'pdf/base_report.html' %}
+{% load static i18n %}
+
+{% block page_size %}A4 landscape{% endblock %}
+
+{% block main_content %}
+
+
+
+ {% trans 'Casa' %} |
+ {% trans 'Presidente' %} |
+ {% trans 'Tipo' %} |
+ {% trans 'Endereço' %} |
+ {% trans 'Bairro' %} |
+ {% trans 'CEP' %} |
+ {% trans 'Telefone' %} |
+ {% trans 'E-mail' %} |
+
+
+
+ {% for casa in casas %}
+ {% ifchanged casa.municipio.uf %}
+ {{ casa.municipio.uf.nome }} |
+ {% endifchanged %}
+
+ {{ casa.nome }} |
+ {{ casa.presidente }} |
+ {{ casa.tipo.sigla }} |
+ {{ casa.logradouro }} |
+ {{ casa.bairro }} |
+ {{ casa.cep }} |
+ {{ casa.telefone }} |
+ {{ casa.email }} |
+
+ {% endfor %}
+
+{% endblock main_content %}
\ No newline at end of file
diff --git a/sigi/apps/casas/templates/casas/report_pdf.html b/sigi/apps/casas/templates/casas/report_pdf.html
deleted file mode 100644
index 485e7de..0000000
--- a/sigi/apps/casas/templates/casas/report_pdf.html
+++ /dev/null
@@ -1,132 +0,0 @@
-{% load smart_if %}
-{% load static from staticfiles %}
-{% load i18n %}
-
-
-
-
- Casa Legislativa
-
-
-
-
-
-
-
-
- {% trans 'Casa' %} |
- {% trans 'Presidente' %} |
- {% trans 'Tipo' %} |
- {% trans 'Endereço' %} |
- {% trans 'Bairro' %} |
- {% trans 'CEP' %} |
- {% trans 'Telefone' %} |
- {% trans 'E-mail' %} |
-
-
-
- {% for casa in casas %}
- {% ifchanged casa.municipio.uf %}
- {{ casa.municipio.uf.nome }} |
- {% endifchanged %}
-
- {{ casa.nome }} |
- {{ casa.presidente }} |
- {{ casa.tipo.sigla }} |
- {{ casa.logradouro }} |
- {{ casa.bairro }} |
- {{ casa.cep }} |
- {{ casa.telefone }} |
- {{ casa.email }} |
-
- {% endfor %}
-
-
-
-
-
diff --git a/sigi/apps/casas/tests.py b/sigi/apps/casas/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/sigi/apps/casas/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/sigi/apps/casas/urls.py b/sigi/apps/casas/urls.py
index 38f0687..db9a5d9 100644
--- a/sigi/apps/casas/urls.py
+++ b/sigi/apps/casas/urls.py
@@ -1,4 +1,13 @@
-# coding: utf-8
+from django.urls import path, include
+from sigi.apps.casas.views import CasasSemConvenioReport
+
+urlpatterns = [
+ path('orgao/casas_sem_convenio_report/', CasasSemConvenioReport.as_view(),
+ name='casas-sem-convenio-report'),
+]
+
+
+"""
from django.conf.urls import patterns, url
from django.contrib.auth.decorators import login_required
from sigi.apps.casas.views import importa_casas
@@ -55,3 +64,4 @@ urlpatterns = patterns(
url(r'^gerentes/$', 'gerentes_interlegis',
name='gerentes_interlegis'),
)
+"""
\ No newline at end of file
diff --git a/sigi/apps/casas/views.py b/sigi/apps/casas/views.py
index 4f2c549..0f64e62 100644
--- a/sigi/apps/casas/views.py
+++ b/sigi/apps/casas/views.py
@@ -1,320 +1,97 @@
-# -*- coding: utf-8 -*-
import csv
from datetime import datetime
from functools import reduce
from django.contrib import messages
from sigi.apps.utils import to_ascii
-from geraldo.generators import PDFGenerator
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.db.models import Count, Q
-from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
+from django.http import (HttpResponse, HttpResponseRedirect,
+ HttpResponseForbidden)
from django.shortcuts import render, get_object_or_404
-from django.utils.translation import gettext as _, ungettext
+from django.utils.translation import gettext as _, ngettext
from django.views.generic import View
+from django_weasyprint.views import WeasyTemplateView
from sigi.apps.casas.forms import PortfolioForm, AtualizaCasaForm
from sigi.apps.casas.models import Orgao, TipoOrgao, Funcionario
-from sigi.apps.casas.reports import (CasasLegislativasLabels,
- CasasLegislativasLabelsSemPresidente)
-from sigi.apps.contatos.models import (UnidadeFederativa, Municipio,
- Mesorregiao, Microrregiao)
-from sigi.apps.ocorrencias.models import Ocorrencia
-from sigi.apps.parlamentares.reports import ParlamentaresLabels
-from sigi.apps.servicos.models import TipoServico
from sigi.apps.servidores.models import Servidor
-from sigi.shortcuts import render_to_pdf
-
-class importa_casas(View):
- errors = []
- total_registros = 0
-
- TIPO = 'tipo'
- MUNICIPIO = 'municipio'
- UF = 'uf'
- ORGAO_ENDERECO = 'orgao_endereco'
- ORGAO_BAIRRO = 'orgao_bairro'
- ORGAO_CEP = 'orgao_cep'
- ORGAO_EMAIL = 'orgao_email'
- ORGAO_PORTAL = 'orgao_portal'
- ORGAO_TELEFONES = 'orgao_telefones'
- PRESIDENTE_NOME = 'presidente_nome'
- PRESIDENTE_DATA_NASCIMENTO = 'presidente_data_nascimento'
- PRESIDENTE_TELEFONES = 'presidente_telefones'
- PRESIDENTE_EMAILS = 'presidente_emails'
- PRESIDENTE_ENDERECO = 'presidente_endereco'
- PRESIDENTE_MUNICIPIO = 'presidente_municipio'
- PRESIDENTE_BAIRRO = 'presidente_bairro'
- PRESIDENTE_CEP = 'presidente_cep'
- PRESIDENTE_REDES_SOCIAIS = 'presidente_redes_sociais'
- SERVIDOR_NOME = 'contato_nome'
- SERVIDOR_DATA_NASCIMENTO = 'contato_data_nascimento'
- SERVIDOR_TELEFONES = 'contato_telefones'
- SERVIDOR_EMAILS = 'contato_emails'
- SERVIDOR_ENDERECO = 'contato_endereco'
- SERVIDOR_MUNICIPIO = 'contato_municipio'
- SERVIDOR_BAIRRO = 'contato_bairro'
- SERVIDOR_CEP = 'contato_cep'
- SERVIDOR_REDES_SOCIAIS = 'contato_redes_sociais'
- ERROS = 'erros_importacao'
-
- fieldnames = [TIPO, MUNICIPIO, UF, ORGAO_ENDERECO, ORGAO_BAIRRO, ORGAO_CEP,
- ORGAO_EMAIL, ORGAO_PORTAL, ORGAO_TELEFONES, PRESIDENTE_NOME,
- PRESIDENTE_DATA_NASCIMENTO, PRESIDENTE_TELEFONES,
- PRESIDENTE_EMAILS, PRESIDENTE_ENDERECO, PRESIDENTE_MUNICIPIO,
- PRESIDENTE_BAIRRO, PRESIDENTE_CEP, PRESIDENTE_REDES_SOCIAIS,
- SERVIDOR_NOME, SERVIDOR_DATA_NASCIMENTO, SERVIDOR_TELEFONES,
- SERVIDOR_EMAILS, SERVIDOR_ENDERECO, SERVIDOR_MUNICIPIO,
- SERVIDOR_BAIRRO, SERVIDOR_CEP, SERVIDOR_REDES_SOCIAIS, ERROS,]
-
- ID_FIELDS = {TIPO, MUNICIPIO, UF}
-
- ORGAO_FIELDS = {
- ORGAO_ENDERECO: 'logradouro',
- ORGAO_BAIRRO: 'bairro',
- ORGAO_CEP: 'cep',
- ORGAO_EMAIL: 'email',
- ORGAO_PORTAL: 'pagina_web',
- ORGAO_TELEFONES: 'telefones',
- }
-
- PRESIDENTE_FIELDS = {
- PRESIDENTE_NOME: 'nome',
- PRESIDENTE_DATA_NASCIMENTO: 'data_nascimento',
- PRESIDENTE_TELEFONES: 'nota',
- PRESIDENTE_EMAILS: 'email',
- PRESIDENTE_ENDERECO: 'endereco',
- PRESIDENTE_MUNICIPIO: 'municipio_id',
- PRESIDENTE_BAIRRO: 'bairro',
- PRESIDENTE_CEP: 'cep',
- PRESIDENTE_REDES_SOCIAIS: 'redes_sociais',
- }
-
- SERVIDOR_FIELDS = {
- SERVIDOR_NOME: 'nome',
- SERVIDOR_DATA_NASCIMENTO: 'data_nascimento',
- SERVIDOR_TELEFONES: 'nota',
- SERVIDOR_EMAILS: 'email',
- SERVIDOR_ENDERECO: 'endereco',
- SERVIDOR_MUNICIPIO: 'municipio_id',
- SERVIDOR_BAIRRO: 'bairro',
- SERVIDOR_CEP: 'cep',
- SERVIDOR_REDES_SOCIAIS: 'redes_sociais',
- }
-
- def get(self, request):
- if not request.user.is_superuser:
- return HttpResponseForbidden()
-
- form = AtualizaCasaForm()
- return render(request, 'casas/importar.html', {'form': form})
-
- def post(self, request):
- if not request.user.is_superuser:
- return HttpResponseForbidden()
-
- form = AtualizaCasaForm(request.POST, request.FILES)
-
- if form.is_valid():
- file = form.cleaned_data['arquivo']
- reader = csv.DictReader(file)
- if not self.ID_FIELDS.issubset(reader.fieldnames):
- return render(
- request,
- 'casas/importar.html',
- {'form': form, 'error': _("O arquivo não possui algum dos "
- "campos obrigatórios")}
- )
-
- if self.importa(reader):
- # Importação concluída com êxito
- return render(
- request,
- 'casas/importar_result.html',
- {'file_name': file.name, 'total': self.total_registros,
- 'com_erros': 0}
- )
- else:
- # Importado com erros
- file_name = "casas-erros-{:%Y-%m-%d-%H%M}.csv".format(
- datetime.now())
- fields = self.fieldnames
- for f in reader.fieldnames:
- if f not in fields:
- fields.append(f)
- with open(settings.MEDIA_ROOT+'/temp/'+file_name, "w+") as f:
- writer = csv.DictWriter(f, fieldnames=fields)
- writer.writeheader()
- writer.writerows(self.errors)
- return render(
- request,
- 'casas/importar_result.html',
- {'file_name': file.name, 'result_file': file_name,
- 'total': self.total_registros,
- 'com_erros': len(self.errors)}
- )
-
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = (
- 'attachment; filename="somefilename.csv"')
- return response
- else:
- return render(
- request,
- 'casas/importar.html',
- {'form': form, 'error': "Erro no preenchimento do formulário."}
- )
-
- # Atualiza ou cria funcionário
- def funcionario_update(self, setor, fields, orgao, reg):
- field_nome = (self.PRESIDENTE_NOME if setor == 'presidente' else
- self.SERVIDOR_NOME)
-
- # Se não tem nome do contato (ou presidente), então não há nada a
- # atualizar. Volta o reg inalterado.
- if field_nome not in reg:
- return reg
-
- funcionario = orgao.funcionario_set.filter(
- setor=setor,
- nome__iexact=reg[field_nome].strip()
+# from sigi.shortcuts import render_to_pdf
+# from sigi.apps.casas.reports import (CasasLegislativasLabels,
+# CasasLegislativasLabelsSemPresidente)
+# from sigi.apps.contatos.models import (UnidadeFederativa, Municipio,
+# Mesorregiao, Microrregiao)
+# from sigi.apps.ocorrencias.models import Ocorrencia
+# from sigi.apps.parlamentares.reports import ParlamentaresLabels
+# from sigi.apps.servicos.models import TipoServico
+
+class CasasSemConvenioReport(WeasyTemplateView):
+ template_name = "casas/casas_sem_convenio_pdf.html"
+
+ def get_context_data(self, **kwargs):
+ # qs = Orgao.objects.filter(convenio=None).order_by(
+ # 'municipio__uf',
+ # 'nome'
+ # )
+ qs = Orgao.objects.order_by(
+ 'municipio__uf',
+ 'nome'
)
- if funcionario.count() == 0:
- funcionario = Funcionario(
- casa_legislativa=orgao,
- nome=reg[field_nome].strip(),
- setor=setor
- )
- else:
- funcionario = funcionario.first() #HACK: Sempre atualiza o primeiro
-
- for key in fields:
- field_name = fields[key]
- if key in reg:
- value = reg[key].strip()
- else:
- value = ""
-
- if value != "":
- if field_name == 'municipio_id':
- if ',' in value:
- municipio, uf = value.split(',')
- else:
- municipio = value
- uf = reg[self.UF]
-
- try:
- value = Municipio.objects.get(
- nome__iexact=municipio.strip(),
- uf__sigla=uf.strip()).pk
- except:
- value = None
- reg[self.ERROS].append(
- "Impossivel identificar o Municipio de "
- "residencia do {contato}".format(
- contato="Presidente" if setor == 'presidente'
- else "Contato")
- )
- continue
- if field_name == 'redes_sociais':
- value = value.replace(" ", "\r")
- if field_name == 'data_nascimento':
- sd = value.split('/')
- if len(sd) < 3:
- reg[self.ERROS].append(
- "Data de nascimento do {contato} esta em um "
- "formato nao reconhecido. Use DD/MM/AAAA".format(
- contato="Presidente" if setor == 'presidente'
- else "Contato"
- )
- )
- continue
- else:
- value = "{ano}-{mes}-{dia}".format(
- ano=sd[2],
- mes=sd[1],
- dia=sd[0]
- )
- if value != getattr(funcionario, field_name):
- setattr(funcionario, field_name, value)
- try:
- funcionario.save()
- except Exception as e:
- reg[self.ERROS].append(
- "Erro salvando {contato}: '{message}'".format(
- message=e.message,
- contato="Presidente" if setor == 'presidente'
- else "Contato")
- )
-
- return reg
-
- def importa(self, reader):
- self.errors = []
- self.total_registros = 0
-
- for reg in reader:
- self.total_registros += 1
- reg[self.ERROS] = []
- nome_orgao = to_ascii(reg[self.MUNICIPIO])
- orgao = Orgao.objects.filter(
- tipo__sigla=reg[self.TIPO],
- municipio__search_text__icontains=nome_orgao,
- municipio__uf__sigla=reg[self.UF]
- )
- if orgao.count() == 0:
- reg[self.ERROS].append("Nao existe orgao com esta identificacao")
- self.errors.append(reg)
- continue
- elif orgao.count() > 1:
- reg[self.ERROS].append("Existem {count} orgaos com esta mesma "
- "identificacao").format(count=orgao.count())
- self.errors.append(reg)
- continue
- else:
- orgao = orgao.get()
-
- # Atualiza os dados do órgão
- for key in self.ORGAO_FIELDS:
- field_name = self.ORGAO_FIELDS[key]
- if key in reg:
- value = reg[key].strip()
- if key == self.ORGAO_TELEFONES:
- for numero in value.split(";"):
- numero = numero.strip()
- try:
- orgao.telefones.update_or_create(numero=numero)
- except:
- reg[self.ERROS].append(
- 'Telefone {numero} não foi '
- 'atualizado'.format(numero=numero)
- )
- elif value != "" and value != getattr(orgao, field_name):
- setattr(orgao, field_name, value)
- try:
- orgao.save()
- except Exception as e:
- reg[self.ERROS].append(
- "Erro salvando o orgao: '{message}'".format(
- message=e.message)
- )
-
- # Atualiza o presidente
- reg = self.funcionario_update("presidente", self.PRESIDENTE_FIELDS,
- orgao, reg)
-
- # Atualiza o contato
- reg = self.funcionario_update("outros", self.SERVIDOR_FIELDS,
- orgao, reg)
-
- if len(reg[self.ERROS]) > 0:
- self.errors.append(reg)
-
- return len(self.errors) == 0
+ if self.request.GET:
+ qs = get_for_qs(self.request.GET, qs)
+ if not qs:
+ return HttpResponseRedirect('../')
+
+ qs = qs.order_by('municipio__uf', 'nome')
+ return {'casas': qs, 'title': _("Casas sem convênio")}
+
+def get_for_qs(get, qs):
+ kwargs = {}
+ for k, v in get.items():
+ if str(k) not in ('page', 'pop', 'q', '_popup', 'o', 'ot'):
+ kwargs[str(k)] = v
+
+ # if 'convenio' in kwargs:
+ # if kwargs['convenio'] == 'SC':
+ # qs = qs.filter(convenio=None)
+ # elif kwargs['convenio'] == 'CC':
+ # qs = qs.exclude(convenio=None)
+ # else:
+ # qs = qs.filter(convenio__projeto_id=kwargs['convenio'])
+
+ # qs = qs.distinct('municipio__uf__nome', 'nome')
+ # del(kwargs['convenio'])
+
+ # if 'servico' in kwargs:
+ # if kwargs['servico'] == 'SS':
+ # qs = qs.filter(servico=None)
+ # elif kwargs['servico'] == 'CS':
+ # qs = qs.exclude(servico=None).filter(
+ # servico__data_desativacao__isnull=True)
+ # elif kwargs['servico'] == 'CR':
+ # qs = qs.exclude(servico__tipo_servico__modo='H') \
+ # .exclude(servico=None)
+ # elif kwargs['servico'] == 'CH':
+ # qs = qs.filter(
+ # servico__tipo_servico__modo='H',
+ # servico__data_desativacao__isnull=True
+ # )
+ # else:
+ # qs = qs.filter(servico__tipo_servico_id=kwargs['servico'])
+
+ # qs = qs.distinct('municipio__uf__nome', 'nome')
+
+ # del(kwargs['servico'])
+
+ qs = qs.filter(**kwargs)
+ if 'o' in get:
+ qs = query_ordena(qs, get['o'])
+
+ return qs
# @param qs: queryset
# @param o: (int) number of order field
@@ -335,770 +112,1062 @@ def query_ordena(qs, o):
return qs
-def get_for_qs(get, qs):
- """
- Verifica atributos do GET e retorna queryset correspondente
- """
- kwargs = {}
- for k, v in get.iteritems():
- if str(k) not in ('page', 'pop', 'q', '_popup', 'o', 'ot'):
- kwargs[str(k)] = v
- if 'convenio' in kwargs:
- if kwargs['convenio'] == 'SC':
- qs = qs.filter(convenio=None)
- elif kwargs['convenio'] == 'CC':
- qs = qs.exclude(convenio=None)
- else:
- qs = qs.filter(convenio__projeto_id=kwargs['convenio'])
-
- qs = qs.distinct('municipio__uf__nome', 'nome')
- del(kwargs['convenio'])
-
- if 'servico' in kwargs:
- if kwargs['servico'] == 'SS':
- qs = qs.filter(servico=None)
- elif kwargs['servico'] == 'CS':
- qs = qs.exclude(servico=None).filter(
- servico__data_desativacao__isnull=True)
- elif kwargs['servico'] == 'CR':
- qs = qs.exclude(servico__tipo_servico__modo='H') \
- .exclude(servico=None)
- elif kwargs['servico'] == 'CH':
- qs = qs.filter(
- servico__tipo_servico__modo='H',
- servico__data_desativacao__isnull=True
- )
- else:
- qs = qs.filter(servico__tipo_servico_id=kwargs['servico'])
-
- qs = qs.distinct('municipio__uf__nome', 'nome')
-
- del(kwargs['servico'])
- qs = qs.filter(**kwargs)
- if 'o' in get:
- qs = query_ordena(qs, get['o'])
+# class importa_casas(View):
+# errors = []
+# total_registros = 0
+
+# TIPO = 'tipo'
+# MUNICIPIO = 'municipio'
+# UF = 'uf'
+# ORGAO_ENDERECO = 'orgao_endereco'
+# ORGAO_BAIRRO = 'orgao_bairro'
+# ORGAO_CEP = 'orgao_cep'
+# ORGAO_EMAIL = 'orgao_email'
+# ORGAO_PORTAL = 'orgao_portal'
+# ORGAO_TELEFONES = 'orgao_telefones'
+# PRESIDENTE_NOME = 'presidente_nome'
+# PRESIDENTE_DATA_NASCIMENTO = 'presidente_data_nascimento'
+# PRESIDENTE_TELEFONES = 'presidente_telefones'
+# PRESIDENTE_EMAILS = 'presidente_emails'
+# PRESIDENTE_ENDERECO = 'presidente_endereco'
+# PRESIDENTE_MUNICIPIO = 'presidente_municipio'
+# PRESIDENTE_BAIRRO = 'presidente_bairro'
+# PRESIDENTE_CEP = 'presidente_cep'
+# PRESIDENTE_REDES_SOCIAIS = 'presidente_redes_sociais'
+# SERVIDOR_NOME = 'contato_nome'
+# SERVIDOR_DATA_NASCIMENTO = 'contato_data_nascimento'
+# SERVIDOR_TELEFONES = 'contato_telefones'
+# SERVIDOR_EMAILS = 'contato_emails'
+# SERVIDOR_ENDERECO = 'contato_endereco'
+# SERVIDOR_MUNICIPIO = 'contato_municipio'
+# SERVIDOR_BAIRRO = 'contato_bairro'
+# SERVIDOR_CEP = 'contato_cep'
+# SERVIDOR_REDES_SOCIAIS = 'contato_redes_sociais'
+# ERROS = 'erros_importacao'
+
+# fieldnames = [TIPO, MUNICIPIO, UF, ORGAO_ENDERECO, ORGAO_BAIRRO, ORGAO_CEP,
+# ORGAO_EMAIL, ORGAO_PORTAL, ORGAO_TELEFONES, PRESIDENTE_NOME,
+# PRESIDENTE_DATA_NASCIMENTO, PRESIDENTE_TELEFONES,
+# PRESIDENTE_EMAILS, PRESIDENTE_ENDERECO, PRESIDENTE_MUNICIPIO,
+# PRESIDENTE_BAIRRO, PRESIDENTE_CEP, PRESIDENTE_REDES_SOCIAIS,
+# SERVIDOR_NOME, SERVIDOR_DATA_NASCIMENTO, SERVIDOR_TELEFONES,
+# SERVIDOR_EMAILS, SERVIDOR_ENDERECO, SERVIDOR_MUNICIPIO,
+# SERVIDOR_BAIRRO, SERVIDOR_CEP, SERVIDOR_REDES_SOCIAIS, ERROS,]
+
+# ID_FIELDS = {TIPO, MUNICIPIO, UF}
+
+# ORGAO_FIELDS = {
+# ORGAO_ENDERECO: 'logradouro',
+# ORGAO_BAIRRO: 'bairro',
+# ORGAO_CEP: 'cep',
+# ORGAO_EMAIL: 'email',
+# ORGAO_PORTAL: 'pagina_web',
+# ORGAO_TELEFONES: 'telefones',
+# }
+
+# PRESIDENTE_FIELDS = {
+# PRESIDENTE_NOME: 'nome',
+# PRESIDENTE_DATA_NASCIMENTO: 'data_nascimento',
+# PRESIDENTE_TELEFONES: 'nota',
+# PRESIDENTE_EMAILS: 'email',
+# PRESIDENTE_ENDERECO: 'endereco',
+# PRESIDENTE_MUNICIPIO: 'municipio_id',
+# PRESIDENTE_BAIRRO: 'bairro',
+# PRESIDENTE_CEP: 'cep',
+# PRESIDENTE_REDES_SOCIAIS: 'redes_sociais',
+# }
+
+# SERVIDOR_FIELDS = {
+# SERVIDOR_NOME: 'nome',
+# SERVIDOR_DATA_NASCIMENTO: 'data_nascimento',
+# SERVIDOR_TELEFONES: 'nota',
+# SERVIDOR_EMAILS: 'email',
+# SERVIDOR_ENDERECO: 'endereco',
+# SERVIDOR_MUNICIPIO: 'municipio_id',
+# SERVIDOR_BAIRRO: 'bairro',
+# SERVIDOR_CEP: 'cep',
+# SERVIDOR_REDES_SOCIAIS: 'redes_sociais',
+# }
+
+# def get(self, request):
+# if not request.user.is_superuser:
+# return HttpResponseForbidden()
+
+# form = AtualizaCasaForm()
+# return render(request, 'casas/importar.html', {'form': form})
+
+# def post(self, request):
+# if not request.user.is_superuser:
+# return HttpResponseForbidden()
+
+# form = AtualizaCasaForm(request.POST, request.FILES)
+
+# if form.is_valid():
+# file = form.cleaned_data['arquivo']
+# reader = csv.DictReader(file)
+# if not self.ID_FIELDS.issubset(reader.fieldnames):
+# return render(
+# request,
+# 'casas/importar.html',
+# {'form': form, 'error': _("O arquivo não possui algum dos "
+# "campos obrigatórios")}
+# )
+
+# if self.importa(reader):
+# # Importação concluída com êxito
+# return render(
+# request,
+# 'casas/importar_result.html',
+# {'file_name': file.name, 'total': self.total_registros,
+# 'com_erros': 0}
+# )
+# else:
+# # Importado com erros
+# file_name = "casas-erros-{:%Y-%m-%d-%H%M}.csv".format(
+# datetime.now())
+# fields = self.fieldnames
+# for f in reader.fieldnames:
+# if f not in fields:
+# fields.append(f)
+# with open(settings.MEDIA_ROOT+'/temp/'+file_name, "w+") as f:
+# writer = csv.DictWriter(f, fieldnames=fields)
+# writer.writeheader()
+# writer.writerows(self.errors)
+# return render(
+# request,
+# 'casas/importar_result.html',
+# {'file_name': file.name, 'result_file': file_name,
+# 'total': self.total_registros,
+# 'com_erros': len(self.errors)}
+# )
+
+# response = HttpResponse(content_type='text/csv')
+# response['Content-Disposition'] = (
+# 'attachment; filename="somefilename.csv"')
+# return response
+# else:
+# return render(
+# request,
+# 'casas/importar.html',
+# {'form': form, 'error': "Erro no preenchimento do formulário."}
+# )
+
+# # Atualiza ou cria funcionário
+# def funcionario_update(self, setor, fields, orgao, reg):
+# field_nome = (self.PRESIDENTE_NOME if setor == 'presidente' else
+# self.SERVIDOR_NOME)
+
+# # Se não tem nome do contato (ou presidente), então não há nada a
+# # atualizar. Volta o reg inalterado.
+# if field_nome not in reg:
+# return reg
+
+# funcionario = orgao.funcionario_set.filter(
+# setor=setor,
+# nome__iexact=reg[field_nome].strip()
+# )
+
+# if funcionario.count() == 0:
+# funcionario = Funcionario(
+# casa_legislativa=orgao,
+# nome=reg[field_nome].strip(),
+# setor=setor
+# )
+# else:
+# funcionario = funcionario.first() #HACK: Sempre atualiza o primeiro
+
+# for key in fields:
+# field_name = fields[key]
+# if key in reg:
+# value = reg[key].strip()
+# else:
+# value = ""
+
+# if value != "":
+# if field_name == 'municipio_id':
+# if ',' in value:
+# municipio, uf = value.split(',')
+# else:
+# municipio = value
+# uf = reg[self.UF]
+
+# try:
+# value = Municipio.objects.get(
+# nome__iexact=municipio.strip(),
+# uf__sigla=uf.strip()).pk
+# except:
+# value = None
+# reg[self.ERROS].append(
+# "Impossivel identificar o Municipio de "
+# "residencia do {contato}".format(
+# contato="Presidente" if setor == 'presidente'
+# else "Contato")
+# )
+# continue
+# if field_name == 'redes_sociais':
+# value = value.replace(" ", "\r")
+# if field_name == 'data_nascimento':
+# sd = value.split('/')
+# if len(sd) < 3:
+# reg[self.ERROS].append(
+# "Data de nascimento do {contato} esta em um "
+# "formato nao reconhecido. Use DD/MM/AAAA".format(
+# contato="Presidente" if setor == 'presidente'
+# else "Contato"
+# )
+# )
+# continue
+# else:
+# value = "{ano}-{mes}-{dia}".format(
+# ano=sd[2],
+# mes=sd[1],
+# dia=sd[0]
+# )
+# if value != getattr(funcionario, field_name):
+# setattr(funcionario, field_name, value)
+# try:
+# funcionario.save()
+# except Exception as e:
+# reg[self.ERROS].append(
+# "Erro salvando {contato}: '{message}'".format(
+# message=e.message,
+# contato="Presidente" if setor == 'presidente'
+# else "Contato")
+# )
+
+# return reg
+
+# def importa(self, reader):
+# self.errors = []
+# self.total_registros = 0
+
+# for reg in reader:
+# self.total_registros += 1
+# reg[self.ERROS] = []
+# nome_orgao = to_ascii(reg[self.MUNICIPIO])
+# orgao = Orgao.objects.filter(
+# tipo__sigla=reg[self.TIPO],
+# municipio__search_text__icontains=nome_orgao,
+# municipio__uf__sigla=reg[self.UF]
+# )
+# if orgao.count() == 0:
+# reg[self.ERROS].append("Nao existe orgao com esta identificacao")
+# self.errors.append(reg)
+# continue
+# elif orgao.count() > 1:
+# reg[self.ERROS].append("Existem {count} orgaos com esta mesma "
+# "identificacao").format(count=orgao.count())
+# self.errors.append(reg)
+# continue
+# else:
+# orgao = orgao.get()
+
+# # Atualiza os dados do órgão
+# for key in self.ORGAO_FIELDS:
+# field_name = self.ORGAO_FIELDS[key]
+# if key in reg:
+# value = reg[key].strip()
+# if key == self.ORGAO_TELEFONES:
+# for numero in value.split(";"):
+# numero = numero.strip()
+# try:
+# orgao.telefones.update_or_create(numero=numero)
+# except:
+# reg[self.ERROS].append(
+# 'Telefone {numero} não foi '
+# 'atualizado'.format(numero=numero)
+# )
+# elif value != "" and value != getattr(orgao, field_name):
+# setattr(orgao, field_name, value)
+# try:
+# orgao.save()
+# except Exception as e:
+# reg[self.ERROS].append(
+# "Erro salvando o orgao: '{message}'".format(
+# message=e.message)
+# )
+
+# # Atualiza o presidente
+# reg = self.funcionario_update("presidente", self.PRESIDENTE_FIELDS,
+# orgao, reg)
+
+# # Atualiza o contato
+# reg = self.funcionario_update("outros", self.SERVIDOR_FIELDS,
+# orgao, reg)
+
+# if len(reg[self.ERROS]) > 0:
+# self.errors.append(reg)
+
+# return len(self.errors) == 0
+
+
+
+# def get_for_qs(get, qs):
+# """
+# Verifica atributos do GET e retorna queryset correspondente
+# """
+# kwargs = {}
+# for k, v in get.iteritems():
+# if str(k) not in ('page', 'pop', 'q', '_popup', 'o', 'ot'):
+# kwargs[str(k)] = v
+
+# if 'convenio' in kwargs:
+# if kwargs['convenio'] == 'SC':
+# qs = qs.filter(convenio=None)
+# elif kwargs['convenio'] == 'CC':
+# qs = qs.exclude(convenio=None)
+# else:
+# qs = qs.filter(convenio__projeto_id=kwargs['convenio'])
+
+# qs = qs.distinct('municipio__uf__nome', 'nome')
+# del(kwargs['convenio'])
+
+# if 'servico' in kwargs:
+# if kwargs['servico'] == 'SS':
+# qs = qs.filter(servico=None)
+# elif kwargs['servico'] == 'CS':
+# qs = qs.exclude(servico=None).filter(
+# servico__data_desativacao__isnull=True)
+# elif kwargs['servico'] == 'CR':
+# qs = qs.exclude(servico__tipo_servico__modo='H') \
+# .exclude(servico=None)
+# elif kwargs['servico'] == 'CH':
+# qs = qs.filter(
+# servico__tipo_servico__modo='H',
+# servico__data_desativacao__isnull=True
+# )
+# else:
+# qs = qs.filter(servico__tipo_servico_id=kwargs['servico'])
+
+# qs = qs.distinct('municipio__uf__nome', 'nome')
+
+# del(kwargs['servico'])
+
+# qs = qs.filter(**kwargs)
+# if 'o' in get:
+# qs = query_ordena(qs, get['o'])
+
+# return qs
+
+
+# def carrinhoOrGet_for_qs(request):
+# """
+# Verifica se existe casas na sessão se não verifica get e retorna qs correspondente.
+# """
+# if 'carrinho_casas' in request.session:
+# ids = request.session['carrinho_casas']
+# qs = Orgao.objects.filter(pk__in=ids)
+# else:
+# qs = Orgao.objects.all()
+# if request.GET:
+# qs = get_for_qs(request.GET, qs)
+# return qs
+
+
+# def adicionar_casas_carrinho(request, queryset=None, id=None):
+# if request.method == 'POST':
+# ids_selecionados = request.POST.getlist('_selected_action')
+# if 'carrinho_casas' not in request.session:
+# request.session['carrinho_casas'] = ids_selecionados
+# else:
+# lista = request.session['carrinho_casas']
+# # Verifica se id já não está adicionado
+# for id in ids_selecionados:
+# if id not in lista:
+# lista.append(id)
+# request.session['carrinho_casas'] = lista
+
+
+# @login_required
+# def visualizar_carrinho(request):
+
+# qs = carrinhoOrGet_for_qs(request)
+
+# paginator = Paginator(qs, 100)
+
+# # Make sure page request is an int. If not, deliver first page.
+# # Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página.
+# try:
+# page = int(request.GET.get('page', '1'))
+# except ValueError:
+# page = 1
+
+# # Se o page request (9999) está fora da lista, mostre a última página.
+# try:
+# paginas = paginator.page(page)
+# except (EmptyPage, InvalidPage):
+# paginas = paginator.page(paginator.num_pages)
+
+# carrinhoIsEmpty = not('carrinho_casas' in request.session)
+
+# return render(
+# request,
+# 'casas/carrinho.html',
+# {
+# 'carIsEmpty': carrinhoIsEmpty,
+# 'paginas': paginas,
+# 'query_str': '?' + request.META['QUERY_STRING']
+# }
+# )
+
+
+# @login_required
+# def excluir_carrinho(request):
+# if 'carrinho_casas' in request.session:
+# del request.session['carrinho_casas']
+# messages.info(request, 'O carrinho foi esvaziado')
+# return HttpResponseRedirect('../../')
+
+
+# @login_required
+# def deleta_itens_carrinho(request):
+# if request.method == 'POST':
+# ids_selecionados = request.POST.getlist('_selected_action')
+# if 'carrinho_casas' in request.session:
+# lista = request.session['carrinho_casas']
+# for item in ids_selecionados:
+# lista.remove(item)
+# if lista:
+# request.session['carrinho_casas'] = lista
+# else:
+# del lista
+# del request.session['carrinho_casas']
+
+# return HttpResponseRedirect('.')
+
+
+# # @login_required
+# # def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'):
+# # """ TODO: adicionar suporte para resultado de pesquisa do admin.
+# # """
+
+# # if request.POST:
+# # if 'tipo_etiqueta' in request.POST:
+# # tipo = request.POST['tipo_etiqueta']
+# # if 'tamanho_etiqueta' in request.POST:
+# # formato = request.POST['tamanho_etiqueta']
+
+# # if tipo == 'sem_presidente':
+# # return labels_report_sem_presidente(request, id, formato)
+
+# # if id:
+# # qs = Orgao.objects.filter(pk=id)
+# # else:
+# # qs = carrinhoOrGet_for_qs(request)
+
+# # if not qs:
+# # return HttpResponseRedirect('../')
+
+# # response = HttpResponse(content_type='application/pdf')
+# # response['Content-Disposition'] = 'attachment; filename=casas.pdf'
+# # report = CasasLegislativasLabels(queryset=qs, formato=formato)
+# # report.generate_by(PDFGenerator, filename=response)
- return qs
+# # return response
+
+
+# # @login_required
+# # def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
+# # """ TODO: adicionar suporte para resultado de pesquisa do admin.
+# # """
+# # if request.POST:
+# # if 'tamanho_etiqueta' in request.POST:
+# # formato = request.POST['tamanho_etiqueta']
-def carrinhoOrGet_for_qs(request):
- """
- Verifica se existe casas na sessão se não verifica get e retorna qs correspondente.
- """
- if 'carrinho_casas' in request.session:
- ids = request.session['carrinho_casas']
- qs = Orgao.objects.filter(pk__in=ids)
- else:
- qs = Orgao.objects.all()
- if request.GET:
- qs = get_for_qs(request.GET, qs)
- return qs
+# # if id:
+# # legislaturas = [c.legislatura_set.latest('data_inicio') for c in Orgao.objects.filter(pk__in=id, legislatura__id__isnull=False).distinct()]
+# # mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
+# # parlamentares = [m.parlamentar for m in mandatos]
+# # qs = parlamentares
+# # else:
+# # qs = carrinhoOrGet_for_parlamentar_qs(request)
-def adicionar_casas_carrinho(request, queryset=None, id=None):
- if request.method == 'POST':
- ids_selecionados = request.POST.getlist('_selected_action')
- if 'carrinho_casas' not in request.session:
- request.session['carrinho_casas'] = ids_selecionados
- else:
- lista = request.session['carrinho_casas']
- # Verifica se id já não está adicionado
- for id in ids_selecionados:
- if id not in lista:
- lista.append(id)
- request.session['carrinho_casas'] = lista
-
-
-@login_required
-def visualizar_carrinho(request):
-
- qs = carrinhoOrGet_for_qs(request)
-
- paginator = Paginator(qs, 100)
-
- # Make sure page request is an int. If not, deliver first page.
- # Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página.
- try:
- page = int(request.GET.get('page', '1'))
- except ValueError:
- page = 1
-
- # Se o page request (9999) está fora da lista, mostre a última página.
- try:
- paginas = paginator.page(page)
- except (EmptyPage, InvalidPage):
- paginas = paginator.page(paginator.num_pages)
-
- carrinhoIsEmpty = not('carrinho_casas' in request.session)
-
- return render(
- request,
- 'casas/carrinho.html',
- {
- 'carIsEmpty': carrinhoIsEmpty,
- 'paginas': paginas,
- 'query_str': '?' + request.META['QUERY_STRING']
- }
- )
-
-
-@login_required
-def excluir_carrinho(request):
- if 'carrinho_casas' in request.session:
- del request.session['carrinho_casas']
- messages.info(request, 'O carrinho foi esvaziado')
- return HttpResponseRedirect('../../')
-
-
-@login_required
-def deleta_itens_carrinho(request):
- if request.method == 'POST':
- ids_selecionados = request.POST.getlist('_selected_action')
- if 'carrinho_casas' in request.session:
- lista = request.session['carrinho_casas']
- for item in ids_selecionados:
- lista.remove(item)
- if lista:
- request.session['carrinho_casas'] = lista
- else:
- del lista
- del request.session['carrinho_casas']
-
- return HttpResponseRedirect('.')
-
-
-@login_required
-def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'):
- """ TODO: adicionar suporte para resultado de pesquisa do admin.
- """
-
- if request.POST:
- if 'tipo_etiqueta' in request.POST:
- tipo = request.POST['tipo_etiqueta']
- if 'tamanho_etiqueta' in request.POST:
- formato = request.POST['tamanho_etiqueta']
-
- if tipo == 'sem_presidente':
- return labels_report_sem_presidente(request, id, formato)
-
- if id:
- qs = Orgao.objects.filter(pk=id)
- else:
- qs = carrinhoOrGet_for_qs(request)
-
- if not qs:
- return HttpResponseRedirect('../')
-
- response = HttpResponse(content_type='application/pdf')
- response['Content-Disposition'] = 'attachment; filename=casas.pdf'
- report = CasasLegislativasLabels(queryset=qs, formato=formato)
- report.generate_by(PDFGenerator, filename=response)
-
- return response
-
-
-@login_required
-def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
- """ TODO: adicionar suporte para resultado de pesquisa do admin.
- """
-
- if request.POST:
- if 'tamanho_etiqueta' in request.POST:
- formato = request.POST['tamanho_etiqueta']
-
- if id:
- legislaturas = [c.legislatura_set.latest('data_inicio') for c in Orgao.objects.filter(pk__in=id, legislatura__id__isnull=False).distinct()]
- mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
- parlamentares = [m.parlamentar for m in mandatos]
- qs = parlamentares
-
- else:
- qs = carrinhoOrGet_for_parlamentar_qs(request)
-
- if not qs:
- return HttpResponseRedirect('../')
-
- response = HttpResponse(content_type='application/pdf')
- response['Content-Disposition'] = 'attachment; filename=casas.pdf'
- report = ParlamentaresLabels(queryset=qs, formato=formato)
- report.generate_by(PDFGenerator, filename=response)
-
- return response
-
-
-def carrinhoOrGet_for_parlamentar_qs(request):
- """
- Verifica se existe parlamentares na sessão se não verifica get e retorna qs correspondente.
- """
- if 'carrinho_casas' in request.session:
- ids = request.session['carrinho_casas']
- legislaturas = [c.legislatura_set.latest('data_inicio') for c in Orgao.objects.filter(pk__in=ids, legislatura__id__isnull=False).distinct()]
- mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
- parlamentares = [m.parlamentar for m in mandatos]
- qs = parlamentares
- else:
- legislaturas = [c.legislatura_set.latest('data_inicio') for c in Orgao.objects.all().distinct()]
- mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
- parlamentares = [m.parlamentar for m in mandatos]
- qs = parlamentares
- if request.GET:
- qs = get_for_qs(request.GET, qs)
- return qs
+# # if not qs:
+# # return HttpResponseRedirect('../')
+# # response = HttpResponse(content_type='application/pdf')
+# # response['Content-Disposition'] = 'attachment; filename=casas.pdf'
+# # report = ParlamentaresLabels(queryset=qs, formato=formato)
+# # report.generate_by(PDFGenerator, filename=response)
-@login_required
-def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'):
- """ TODO: adicionar suporte para resultado de pesquisa do admin.
- """
+# # return response
- if id:
- qs = Orgao.objects.filter(pk=id)
- else:
- qs = carrinhoOrGet_for_qs(request)
- if not qs:
- return HttpResponseRedirect('../')
+# def carrinhoOrGet_for_parlamentar_qs(request):
+# """
+# Verifica se existe parlamentares na sessão se não verifica get e retorna qs correspondente.
+# """
+# if 'carrinho_casas' in request.session:
+# ids = request.session['carrinho_casas']
+# legislaturas = [c.legislatura_set.latest('data_inicio') for c in Orgao.objects.filter(pk__in=ids, legislatura__id__isnull=False).distinct()]
+# mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
+# parlamentares = [m.parlamentar for m in mandatos]
+# qs = parlamentares
+# else:
+# legislaturas = [c.legislatura_set.latest('data_inicio') for c in Orgao.objects.all().distinct()]
+# mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
+# parlamentares = [m.parlamentar for m in mandatos]
+# qs = parlamentares
+# if request.GET:
+# qs = get_for_qs(request.GET, qs)
+# return qs
- response = HttpResponse(content_type='application/pdf')
- response['Content-Disposition'] = 'attachment; filename=casas.pdf'
- report = CasasLegislativasLabelsSemPresidente(queryset=qs, formato=formato)
- report.generate_by(PDFGenerator, filename=response)
- return response
+# @login_required
+# def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'):
+# """ TODO: adicionar suporte para resultado de pesquisa do admin.
+# """
+# if id:
+# qs = Orgao.objects.filter(pk=id)
+# else:
+# qs = carrinhoOrGet_for_qs(request)
-@login_required
-def report(request, id=None, tipo=None):
+# if not qs:
+# return HttpResponseRedirect('../')
- if request.POST:
- if 'tipo_relatorio' in request.POST:
- tipo = request.POST['tipo_relatorio']
+# response = HttpResponse(content_type='application/pdf')
+# response['Content-Disposition'] = 'attachment; filename=casas.pdf'
+# report = CasasLegislativasLabelsSemPresidente(queryset=qs, formato=formato)
+# report.generate_by(PDFGenerator, filename=response)
- if tipo == 'completo':
- return report_complete(request, id)
+# return response
- if id:
- qs = Orgao.objects.filter(pk=id)
- else:
- qs = carrinhoOrGet_for_qs(request)
-
- if not qs:
- return HttpResponseRedirect('../')
-
- qs = qs.order_by('municipio__uf', 'nome')
- context = {'casas': qs, 'title': _("Relação de Casas Legislativas")}
-
- return render_to_pdf('casas/report_pdf.html', context)
-
-
-@login_required
-def report_complete(request, id=None):
-
- if id:
- qs = Orgao.objects.filter(pk=id)
- else:
- qs = carrinhoOrGet_for_qs(request)
-
- if not qs:
- return HttpResponseRedirect('../')
-
- return render_to_pdf('casas/report_complete_pdf.html', {'casas': qs})
-
-
-@login_required
-def casas_sem_convenio_report(request):
- qs = Orgao.objects.filter(convenio=None).order_by('municipio__uf', 'nome')
-
- if request.GET:
- qs = get_for_qs(request.GET, qs)
- if not qs:
- return HttpResponseRedirect('../')
-
- qs = qs.order_by('municipio__uf', 'nome')
- context = {'casas': qs, 'title': _("Casas sem convênio")}
-
- return render_to_pdf('casas/report_pdf.html', context)
-
-
-@login_required
-def export_csv(request):
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = 'attachment; filename=casas.csv'
-
- writer = csv.writer(response)
-
- casas = carrinhoOrGet_for_qs(request)
- if not casas or not request.POST:
- return HttpResponseRedirect('../')
-
- atributos = request.POST.getlist("itens_csv_selected")
-
- try:
- atributos.insert(atributos.index(_('Município')), _('UF'))
- except ValueError:
- pass
-
- atributos2 = [s.encode("utf-8") for s in atributos]
-
- writer.writerow(atributos2)
-
- for casa in casas:
- lista = []
- contatos = casa.funcionario_set.exclude(nome="")
- for atributo in atributos:
- if _("CNPJ") == atributo:
- lista.append(casa.cnpj.encode("utf-8"))
- elif _("Código IBGE") == atributo:
- lista.append(str(casa.municipio.codigo_ibge).encode("utf-8"))
- elif _("Código TSE") == atributo:
- lista.append(str(casa.municipio.codigo_tse).encode("utf-8"))
- elif _("Nome") == atributo:
- lista.append(casa.nome.encode("utf-8"))
- elif _("Município") == atributo:
- lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8"))
- lista.append(unicode(casa.municipio.nome).encode("utf-8"))
- 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 _("Logradouro") == atributo:
- lista.append(casa.logradouro.encode("utf-8"))
- elif _("Bairro") == atributo:
- lista.append(casa.bairro.encode("utf-8"))
- elif _("CEP") == atributo:
- lista.append(casa.cep.encode("utf-8"))
- elif _("Telefone") == atributo:
- lista.append(str(casa.telefone or ""))
- elif _("Página web") == atributo:
- lista.append(casa.pagina_web.encode("utf-8"))
- elif _("Email") == atributo:
- lista.append(casa.email.encode("utf-8"))
- elif _("Número de parlamentares") == atributo:
- lista.append(casa.total_parlamentares)
- elif _("Última alteração de endereco") == atributo:
- lista.append(casa.ult_alt_endereco)
- 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 _("Nome contato") == atributo:
- if contatos:
- nomes = ", ".join([c.nome for c in contatos])
- lista.append(nomes.encode("utf-8"))
- else:
- lista.append('')
- elif _("Cargo contato") == atributo:
- if contatos:
- cargos = ", ".join([c.cargo if c.cargo else "?"
- for c in contatos])
- lista.append(cargos.encode("utf-8"))
- else:
- lista.append('')
- elif _("Email contato") == atributo:
- if contatos:
- emails = ", ".join([c.email if c.email else "?"
- for c in contatos])
- lista.append(emails.encode("utf-8"))
- else:
- lista.append('')
- else:
- pass
-
- writer.writerow(lista)
-
- return response
-
-
-@login_required
-def portfolio(request):
- page = request.GET.get('page', 1)
- tipo = request.GET.get('tipo', None)
- regiao = request.GET.get('regiao', None)
- uf_id = request.GET.get('uf', None)
- meso_id = request.GET.get('meso', None)
- micro_id = request.GET.get('micro', None)
-
- data = {}
- data['errors'] = []
- data['messages'] = []
- data['regioes'] = UnidadeFederativa.REGIAO_CHOICES
- data['tipos_casas'] = TipoOrgao.objects.all()
- casas = None
- gerente = None
-
- if tipo:
- data['tipo'] = tipo
-
- if micro_id:
- microrregiao = get_object_or_404(Microrregiao, pk=micro_id)
- mesorregiao = microrregiao.mesorregiao
- uf = mesorregiao.uf
- data['regiao'] = uf.regiao
- data['uf_id'] = uf.pk
- data['meso_id'] = mesorregiao.pk
- data['micro_id'] = microrregiao.pk
- data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao)
- data['mesorregioes'] = uf.mesorregiao_set.all()
- data['microrregioes'] = mesorregiao.microrregiao_set.all()
- data['form'] = PortfolioForm(
- _('Atribuir casas da microrregiao {name} para').format(
- name=unicode(microrregiao))
- )
- data['querystring'] = 'micro={0}'.format(microrregiao.pk)
- casas = Orgao.objects.filter(
- municipio__microrregiao=microrregiao
- )
- elif meso_id:
- mesorregiao = get_object_or_404(Mesorregiao, pk=meso_id)
- uf = mesorregiao.uf
- data['regiao'] = uf.regiao
- data['uf_id'] = uf.pk
- data['meso_id'] = mesorregiao.pk
- data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao)
- data['mesorregioes'] = uf.mesorregiao_set.all()
- data['microrregioes'] = mesorregiao.microrregiao_set.all()
- data['form'] = PortfolioForm(
- _('Atribuir casas da mesorregiao {name} para').format(
- name=unicode(mesorregiao)))
- data['querystring'] = 'meso={0}'.format(mesorregiao.pk)
- casas = Orgao.objects.filter(
- municipio__microrregiao__mesorregiao=mesorregiao
- )
- elif uf_id:
- uf = get_object_or_404(UnidadeFederativa, pk=uf_id)
- data['regiao'] = uf.regiao
- data['uf_id'] = uf.pk
- data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao)
- data['mesorregioes'] = uf.mesorregiao_set.all()
- data['form'] = PortfolioForm(
- _('Atribuir casas do estado {name} para').format(
- name=unicode(uf)))
- data['querystring'] = 'uf={0}'.format(uf.pk)
- casas = Orgao.objects.filter(municipio__uf=uf)
- elif regiao:
- data['regiao'] = regiao
- data['ufs'] = UnidadeFederativa.objects.filter(regiao=regiao)
- data['form'] = PortfolioForm(
- _('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)
- casas = Orgao.objects.filter(municipio__uf__regiao=regiao)
-
- if casas:
- casas = casas.order_by('municipio__uf',
- 'municipio__microrregiao__mesorregiao',
- 'municipio__microrregiao', 'municipio')
-
- casas.prefetch_related('municipio', 'municipio__uf',
- 'municipio__microrregiao',
- 'municipio__microrregiao__mesorregiao',
- 'gerentes_interlegis')
-
- if tipo:
- casas = casas.filter(tipo__sigla=tipo)
- data['querystring'] += "&tipo={0}".format(tipo)
-
- if request.method == 'POST':
- form = PortfolioForm(data=request.POST)
- if form.is_valid():
- gerente = form.cleaned_data['gerente']
- acao = form.cleaned_data['acao']
-
- count = casas.count()
-
- if acao == 'ADD':
- gerente.casas_que_gerencia.add(*casas)
- data['messages'].append(ungettext(
- "{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(
- "{count} casa removida de {gerente}",
- "{count} casas removidas de {gerente}",
- count).format(count=count,gerente=gerente.nome_completo)
- )
- else:
- data['errors'].append(_("Ação não definida"))
- else:
- data['errors'].append(_("Dados inválidos"))
-
- paginator = Paginator(casas, 30)
- try:
- pagina = paginator.page(page)
- except (EmptyPage, InvalidPage):
- pagina = paginator.page(paginator.num_pages)
- data['page_obj'] = pagina
-
- return render(request, 'casas/portfolio.html', data)
-
-
-def resumo_carteira(casas):
- regioes = {r[0]: 0 for r in UnidadeFederativa.REGIAO_CHOICES}
- regioes['total'] = 0
- total = regioes.copy()
- sem_produto = regioes.copy()
- tipos_servico = TipoServico.objects.all()
- dados = {ts.id: regioes.copy() for ts in tipos_servico}
-
- for r in casas.values('municipio__uf__regiao').annotate(quantidade=Count('id')).order_by():
- regiao = r['municipio__uf__regiao']
- quantidade = r['quantidade']
- total[regiao] = quantidade
- total['total'] += quantidade
-
- for r in casas.values('municipio__uf__regiao', 'servico__tipo_servico__id').annotate(quantidade=Count('id')).order_by():
- regiao = r['municipio__uf__regiao']
- servico = r['servico__tipo_servico__id']
- quantidade = r['quantidade']
- if servico is None:
- sem_produto[regiao] = quantidade
- sem_produto['total'] += quantidade
- else:
- dados[servico][regiao] = quantidade
- dados[servico]['total'] += quantidade
-
- dados_ocorrencia = {
- 'registradas': regioes.copy(),
- 'pendentes': regioes.copy(),
- 'sem': regioes.copy(),
- 'media': regioes.copy(),
- }
-
- for r in casas.values('ocorrencia__status', 'municipio__uf__regiao').annotate(quantidade=Count('id')).order_by():
- status = r['ocorrencia__status']
- regiao = r['municipio__uf__regiao']
- quantidade = r['quantidade']
- if status is None:
- dados_ocorrencia['sem'][regiao] += quantidade
- dados_ocorrencia['sem']['total'] += quantidade
- else:
- dados_ocorrencia['registradas'][regiao] += quantidade
- dados_ocorrencia['registradas']['total'] += quantidade
- if status in [Ocorrencia.STATUS_ABERTO, Ocorrencia.STATUS_REABERTO]:
- dados_ocorrencia['pendentes'][regiao] += quantidade
- dados_ocorrencia['pendentes']['total'] += quantidade
-
- for r in regioes:
- if (total[r] - dados_ocorrencia['sem'][r]) == 0:
- dados_ocorrencia['media'][r] = 0
- else:
- dados_ocorrencia['media'][r] = (1.0 * dados_ocorrencia['registradas'][r] / (total[r] - dados_ocorrencia['sem'][r]))
-
- 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': _("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
-
-
-def casas_carteira(request, casas, context):
- servicos = request.GET.getlist('servico')
- sigla_regiao = request.GET.get('r', None)
- sigla_uf = request.GET.get('uf', None)
- meso_id = request.GET.get('meso', None)
- micro_id = request.GET.get('micro', None)
- servicos = request.GET.getlist('servico')
- tipos_servico = context['servicos']
-
- context['qs_regiao'] = ''
-
- if micro_id is not None:
- context['micro'] = get_object_or_404(Microrregiao, pk=micro_id)
- context['qs_regiao'] = 'micro=%s' % micro_id
- context['meso'] = context['micro'].mesorregiao
- context['uf'] = context['meso'].uf
- context['regiao'] = context['uf'].regiao
- casas = casas.filter(municipio__microrregiao=context['micro'])
- elif meso_id is not None:
- context['meso'] = get_object_or_404(Mesorregiao, pk=meso_id)
- context['qs_regiao'] = 'meso=%s' % meso_id
- context['uf'] = context['meso'].uf
- context['regiao'] = context['uf'].regiao
- casas = casas.filter(municipio__microrregiao__mesorregiao=context['meso'])
- elif sigla_uf is not None:
- context['uf'] = get_object_or_404(UnidadeFederativa, sigla=sigla_uf)
- context['qs_regiao'] = 'uf=%s' % sigla_uf
- context['regiao'] = context['uf'].regiao
- casas = casas.filter(municipio__uf=context['uf'])
- elif sigla_regiao is not None:
- context['regiao'] = sigla_regiao
- context['qs_regiao'] = 'r=%s' % sigla_regiao
- casas = casas.filter(municipio__uf__regiao=sigla_regiao)
-
- if 'regiao' in context:
- context['ufs'] = UnidadeFederativa.objects.filter(regiao=context['regiao'])
-
- todos_servicos = ['_none_'] + [s.sigla for s in tipos_servico]
-
- if not servicos or set(servicos) == set(todos_servicos):
- servicos = todos_servicos
- context['qs_servico'] = ''
- else:
- if '_none_' in servicos:
- casas = casas.filter(Q(servico=None) | Q(servico__tipo_servico__sigla__in=servicos))
- else:
- casas = casas.filter(servico__tipo_servico__sigla__in=servicos)
- casas = casas.distinct('nome', 'municipio__uf')
- context['qs_servico'] = "&".join(['servico=%s' % s for s in servicos])
-
- context['servicos_check'] = servicos
-
- casas = casas.select_related('municipio', 'municipio__uf', 'municipio__microrregiao', 'municipio__microrregiao__mesorregiao').prefetch_related('servico_set')
-
- return casas, context
-
-
-@login_required
-def painel_relacionamento(request):
- page = request.GET.get('page', 1)
- snippet = request.GET.get('snippet', '')
- seletor = request.GET.get('s', None)
- servidor = request.GET.get('servidor', None)
- fmt = request.GET.get('f', 'html')
-
- if servidor is None:
- gerente = request.user.servidor
- elif servidor == '_all':
- gerente = None
- else:
- gerente = get_object_or_404(Servidor, pk=servidor)
-
- if gerente is not None:
- casas = gerente.casas_que_gerencia.all()
-
- if gerente is None or not casas.exists():
- casas = Orgao.objects.exclude(gerentes_interlegis=None)
- gerente = None
-
- tipos_servico = TipoServico.objects.all()
- regioes = UnidadeFederativa.REGIAO_CHOICES
-
- context = {
- 'seletor': seletor,
- 'snippet': snippet,
- 'regioes': regioes,
- 'servicos': tipos_servico,
- 'gerentes': Servidor.objects.exclude(casas_que_gerencia=None),
- 'gerente': gerente,
- 'qs_servidor': ('servidor=%s' % gerente.pk) if gerente else '',
- }
-
- if snippet != 'lista':
- context['resumo'] = resumo_carteira(casas)
-
- if snippet != 'resumo':
- casas, context = casas_carteira(request, casas, context)
- paginator = Paginator(casas, 30)
- try:
- pagina = paginator.page(page)
- except (EmptyPage, InvalidPage):
- pagina = paginator.page(paginator.num_pages)
- context['page_obj'] = pagina
-
- if snippet == 'lista':
- if fmt == 'csv':
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = 'attachment; filename=casas.csv'
- writer = csv.writer(response)
- writer.writerow([
- _("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([
- c.nome.encode('utf8'),
- c.municipio.uf.get_regiao_display().encode('utf8'),
- c.municipio.uf.sigla.encode('utf8'),
- c.municipio.microrregiao.mesorregiao.nome.encode('utf8'),
- c.municipio.microrregiao.nome.encode('utf8'),
- c.lista_gerentes(fmt='lista').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)
- if snippet == 'resumo':
- return render(request, 'casas/resumo_carteira_snippet.html', context)
-
- return render(request, 'casas/painel.html', context)
-
-@login_required
-def gerentes_interlegis(request):
- formato = request.GET.get('fmt', 'html')
- inclui_casas = (request.GET.get('casas', 'no') == 'yes')
- gerentes = Servidor.objects.exclude(
- casas_que_gerencia=None).select_related('casas_que_gerencia')
- dados = []
- for gerente in gerentes:
- row = {'gerente': gerente, 'ufs': []}
- for uf in (gerente.casas_que_gerencia.distinct('municipio__uf__sigla')
- .order_by('municipio__uf__sigla')
- .values_list('municipio__uf__sigla', 'municipio__uf__nome')
- ):
- row['ufs'].append((
- uf[0],
- uf[1],
- gerente.casas_que_gerencia.filter(municipio__uf__sigla=uf[0])
- ))
- dados.append(row)
-
- if formato == 'pdf':
- return render_to_pdf(
- 'casas/gerentes_interlegis_pdf.html',
- {'gerentes': dados}
- )
- elif formato == 'csv':
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = ('attachment; '
- 'filename="gerentes_interlegis.csv"')
- fieldnames = ['gerente', 'total_casas', 'uf', 'total_casas_uf']
- if inclui_casas:
- fieldnames.append('casa_legislativa')
- writer = csv.DictWriter(response, fieldnames=fieldnames)
- writer.writeheader()
- for linha in dados:
- rec = {
- 'gerente': linha['gerente'].nome_completo.encode('utf8'),
- 'total_casas': linha['gerente'].casas_que_gerencia.count()
- }
- for uf in linha['ufs']:
- rec['uf'] = uf[1].encode('utf8')
- rec['total_casas_uf'] = uf[2].count()
- if inclui_casas:
- for casa in uf[2]:
- rec['casa_legislativa'] = casa.nome.encode('utf8')
- writer.writerow(rec)
- rec['gerente'] = ''
- rec['total_casas'] = ''
- rec['uf'] = ''
- rec['total_casas_uf'] = ''
- else:
- writer.writerow(rec)
- rec['gerente'] = ''
- rec['total_casas'] = ''
- return response
-
- return render(
- request,
- 'casas/gerentes_interlegis.html',
- {'gerentes': dados}
- )
+
+# @login_required
+# def report(request, id=None, tipo=None):
+
+# if request.POST:
+# if 'tipo_relatorio' in request.POST:
+# tipo = request.POST['tipo_relatorio']
+
+# if tipo == 'completo':
+# return report_complete(request, id)
+
+# if id:
+# qs = Orgao.objects.filter(pk=id)
+# else:
+# qs = carrinhoOrGet_for_qs(request)
+
+# if not qs:
+# return HttpResponseRedirect('../')
+
+# qs = qs.order_by('municipio__uf', 'nome')
+# context = {'casas': qs, 'title': _("Relação de Casas Legislativas")}
+
+# return render_to_pdf('casas/report_pdf.html', context)
+
+
+# @login_required
+# def report_complete(request, id=None):
+
+# if id:
+# qs = Orgao.objects.filter(pk=id)
+# else:
+# qs = carrinhoOrGet_for_qs(request)
+
+# if not qs:
+# return HttpResponseRedirect('../')
+
+# return render_to_pdf('casas/report_complete_pdf.html', {'casas': qs})
+
+
+# @login_required
+# def casas_sem_convenio_report(request):
+# qs = Orgao.objects.filter(convenio=None).order_by('municipio__uf', 'nome')
+
+# if request.GET:
+# qs = get_for_qs(request.GET, qs)
+# if not qs:
+# return HttpResponseRedirect('../')
+
+# qs = qs.order_by('municipio__uf', 'nome')
+# context = {'casas': qs, 'title': _("Casas sem convênio")}
+
+# return render_to_pdf('casas/report_pdf.html', context)
+
+
+# @login_required
+# def export_csv(request):
+# response = HttpResponse(content_type='text/csv')
+# response['Content-Disposition'] = 'attachment; filename=casas.csv'
+
+# writer = csv.writer(response)
+
+# casas = carrinhoOrGet_for_qs(request)
+# if not casas or not request.POST:
+# return HttpResponseRedirect('../')
+
+# atributos = request.POST.getlist("itens_csv_selected")
+
+# try:
+# atributos.insert(atributos.index(_('Município')), _('UF'))
+# except ValueError:
+# pass
+
+# atributos2 = [s.encode("utf-8") for s in atributos]
+
+# writer.writerow(atributos2)
+
+# for casa in casas:
+# lista = []
+# contatos = casa.funcionario_set.exclude(nome="")
+# for atributo in atributos:
+# if _("CNPJ") == atributo:
+# lista.append(casa.cnpj.encode("utf-8"))
+# elif _("Código IBGE") == atributo:
+# lista.append(str(casa.municipio.codigo_ibge).encode("utf-8"))
+# elif _("Código TSE") == atributo:
+# lista.append(str(casa.municipio.codigo_tse).encode("utf-8"))
+# elif _("Nome") == atributo:
+# lista.append(casa.nome.encode("utf-8"))
+# elif _("Município") == atributo:
+# lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8"))
+# lista.append(unicode(casa.municipio.nome).encode("utf-8"))
+# 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 _("Logradouro") == atributo:
+# lista.append(casa.logradouro.encode("utf-8"))
+# elif _("Bairro") == atributo:
+# lista.append(casa.bairro.encode("utf-8"))
+# elif _("CEP") == atributo:
+# lista.append(casa.cep.encode("utf-8"))
+# elif _("Telefone") == atributo:
+# lista.append(str(casa.telefone or ""))
+# elif _("Página web") == atributo:
+# lista.append(casa.pagina_web.encode("utf-8"))
+# elif _("Email") == atributo:
+# lista.append(casa.email.encode("utf-8"))
+# elif _("Número de parlamentares") == atributo:
+# lista.append(casa.total_parlamentares)
+# elif _("Última alteração de endereco") == atributo:
+# lista.append(casa.ult_alt_endereco)
+# 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 _("Nome contato") == atributo:
+# if contatos:
+# nomes = ", ".join([c.nome for c in contatos])
+# lista.append(nomes.encode("utf-8"))
+# else:
+# lista.append('')
+# elif _("Cargo contato") == atributo:
+# if contatos:
+# cargos = ", ".join([c.cargo if c.cargo else "?"
+# for c in contatos])
+# lista.append(cargos.encode("utf-8"))
+# else:
+# lista.append('')
+# elif _("Email contato") == atributo:
+# if contatos:
+# emails = ", ".join([c.email if c.email else "?"
+# for c in contatos])
+# lista.append(emails.encode("utf-8"))
+# else:
+# lista.append('')
+# else:
+# pass
+
+# writer.writerow(lista)
+
+# return response
+
+
+# @login_required
+# def portfolio(request):
+# page = request.GET.get('page', 1)
+# tipo = request.GET.get('tipo', None)
+# regiao = request.GET.get('regiao', None)
+# uf_id = request.GET.get('uf', None)
+# meso_id = request.GET.get('meso', None)
+# micro_id = request.GET.get('micro', None)
+
+# data = {}
+# data['errors'] = []
+# data['messages'] = []
+# data['regioes'] = UnidadeFederativa.REGIAO_CHOICES
+# data['tipos_casas'] = TipoOrgao.objects.all()
+# casas = None
+# gerente = None
+
+# if tipo:
+# data['tipo'] = tipo
+
+# if micro_id:
+# microrregiao = get_object_or_404(Microrregiao, pk=micro_id)
+# mesorregiao = microrregiao.mesorregiao
+# uf = mesorregiao.uf
+# data['regiao'] = uf.regiao
+# data['uf_id'] = uf.pk
+# data['meso_id'] = mesorregiao.pk
+# data['micro_id'] = microrregiao.pk
+# data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao)
+# data['mesorregioes'] = uf.mesorregiao_set.all()
+# data['microrregioes'] = mesorregiao.microrregiao_set.all()
+# data['form'] = PortfolioForm(
+# _('Atribuir casas da microrregiao {name} para').format(
+# name=unicode(microrregiao))
+# )
+# data['querystring'] = 'micro={0}'.format(microrregiao.pk)
+# casas = Orgao.objects.filter(
+# municipio__microrregiao=microrregiao
+# )
+# elif meso_id:
+# mesorregiao = get_object_or_404(Mesorregiao, pk=meso_id)
+# uf = mesorregiao.uf
+# data['regiao'] = uf.regiao
+# data['uf_id'] = uf.pk
+# data['meso_id'] = mesorregiao.pk
+# data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao)
+# data['mesorregioes'] = uf.mesorregiao_set.all()
+# data['microrregioes'] = mesorregiao.microrregiao_set.all()
+# data['form'] = PortfolioForm(
+# _('Atribuir casas da mesorregiao {name} para').format(
+# name=unicode(mesorregiao)))
+# data['querystring'] = 'meso={0}'.format(mesorregiao.pk)
+# casas = Orgao.objects.filter(
+# municipio__microrregiao__mesorregiao=mesorregiao
+# )
+# elif uf_id:
+# uf = get_object_or_404(UnidadeFederativa, pk=uf_id)
+# data['regiao'] = uf.regiao
+# data['uf_id'] = uf.pk
+# data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao)
+# data['mesorregioes'] = uf.mesorregiao_set.all()
+# data['form'] = PortfolioForm(
+# _('Atribuir casas do estado {name} para').format(
+# name=unicode(uf)))
+# data['querystring'] = 'uf={0}'.format(uf.pk)
+# casas = Orgao.objects.filter(municipio__uf=uf)
+# elif regiao:
+# data['regiao'] = regiao
+# data['ufs'] = UnidadeFederativa.objects.filter(regiao=regiao)
+# data['form'] = PortfolioForm(
+# _('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)
+# casas = Orgao.objects.filter(municipio__uf__regiao=regiao)
+
+# if casas:
+# casas = casas.order_by('municipio__uf',
+# 'municipio__microrregiao__mesorregiao',
+# 'municipio__microrregiao', 'municipio')
+
+# casas.prefetch_related('municipio', 'municipio__uf',
+# 'municipio__microrregiao',
+# 'municipio__microrregiao__mesorregiao',
+# 'gerentes_interlegis')
+
+# if tipo:
+# casas = casas.filter(tipo__sigla=tipo)
+# data['querystring'] += "&tipo={0}".format(tipo)
+
+# if request.method == 'POST':
+# form = PortfolioForm(data=request.POST)
+# if form.is_valid():
+# gerente = form.cleaned_data['gerente']
+# acao = form.cleaned_data['acao']
+
+# count = casas.count()
+
+# if acao == 'ADD':
+# gerente.casas_que_gerencia.add(*casas)
+# data['messages'].append(ungettext(
+# "{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(
+# "{count} casa removida de {gerente}",
+# "{count} casas removidas de {gerente}",
+# count).format(count=count,gerente=gerente.nome_completo)
+# )
+# else:
+# data['errors'].append(_("Ação não definida"))
+# else:
+# data['errors'].append(_("Dados inválidos"))
+
+# paginator = Paginator(casas, 30)
+# try:
+# pagina = paginator.page(page)
+# except (EmptyPage, InvalidPage):
+# pagina = paginator.page(paginator.num_pages)
+# data['page_obj'] = pagina
+
+# return render(request, 'casas/portfolio.html', data)
+
+
+# def resumo_carteira(casas):
+# regioes = {r[0]: 0 for r in UnidadeFederativa.REGIAO_CHOICES}
+# regioes['total'] = 0
+# total = regioes.copy()
+# sem_produto = regioes.copy()
+# tipos_servico = TipoServico.objects.all()
+# dados = {ts.id: regioes.copy() for ts in tipos_servico}
+
+# for r in casas.values('municipio__uf__regiao').annotate(quantidade=Count('id')).order_by():
+# regiao = r['municipio__uf__regiao']
+# quantidade = r['quantidade']
+# total[regiao] = quantidade
+# total['total'] += quantidade
+
+# for r in casas.values('municipio__uf__regiao', 'servico__tipo_servico__id').annotate(quantidade=Count('id')).order_by():
+# regiao = r['municipio__uf__regiao']
+# servico = r['servico__tipo_servico__id']
+# quantidade = r['quantidade']
+# if servico is None:
+# sem_produto[regiao] = quantidade
+# sem_produto['total'] += quantidade
+# else:
+# dados[servico][regiao] = quantidade
+# dados[servico]['total'] += quantidade
+
+# dados_ocorrencia = {
+# 'registradas': regioes.copy(),
+# 'pendentes': regioes.copy(),
+# 'sem': regioes.copy(),
+# 'media': regioes.copy(),
+# }
+
+# for r in casas.values('ocorrencia__status', 'municipio__uf__regiao').annotate(quantidade=Count('id')).order_by():
+# status = r['ocorrencia__status']
+# regiao = r['municipio__uf__regiao']
+# quantidade = r['quantidade']
+# if status is None:
+# dados_ocorrencia['sem'][regiao] += quantidade
+# dados_ocorrencia['sem']['total'] += quantidade
+# else:
+# dados_ocorrencia['registradas'][regiao] += quantidade
+# dados_ocorrencia['registradas']['total'] += quantidade
+# if status in [Ocorrencia.STATUS_ABERTO, Ocorrencia.STATUS_REABERTO]:
+# dados_ocorrencia['pendentes'][regiao] += quantidade
+# dados_ocorrencia['pendentes']['total'] += quantidade
+
+# for r in regioes:
+# if (total[r] - dados_ocorrencia['sem'][r]) == 0:
+# dados_ocorrencia['media'][r] = 0
+# else:
+# dados_ocorrencia['media'][r] = (1.0 * dados_ocorrencia['registradas'][r] / (total[r] - dados_ocorrencia['sem'][r]))
+
+# 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': _("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
+
+
+# def casas_carteira(request, casas, context):
+# servicos = request.GET.getlist('servico')
+# sigla_regiao = request.GET.get('r', None)
+# sigla_uf = request.GET.get('uf', None)
+# meso_id = request.GET.get('meso', None)
+# micro_id = request.GET.get('micro', None)
+# servicos = request.GET.getlist('servico')
+# tipos_servico = context['servicos']
+
+# context['qs_regiao'] = ''
+
+# if micro_id is not None:
+# context['micro'] = get_object_or_404(Microrregiao, pk=micro_id)
+# context['qs_regiao'] = 'micro=%s' % micro_id
+# context['meso'] = context['micro'].mesorregiao
+# context['uf'] = context['meso'].uf
+# context['regiao'] = context['uf'].regiao
+# casas = casas.filter(municipio__microrregiao=context['micro'])
+# elif meso_id is not None:
+# context['meso'] = get_object_or_404(Mesorregiao, pk=meso_id)
+# context['qs_regiao'] = 'meso=%s' % meso_id
+# context['uf'] = context['meso'].uf
+# context['regiao'] = context['uf'].regiao
+# casas = casas.filter(municipio__microrregiao__mesorregiao=context['meso'])
+# elif sigla_uf is not None:
+# context['uf'] = get_object_or_404(UnidadeFederativa, sigla=sigla_uf)
+# context['qs_regiao'] = 'uf=%s' % sigla_uf
+# context['regiao'] = context['uf'].regiao
+# casas = casas.filter(municipio__uf=context['uf'])
+# elif sigla_regiao is not None:
+# context['regiao'] = sigla_regiao
+# context['qs_regiao'] = 'r=%s' % sigla_regiao
+# casas = casas.filter(municipio__uf__regiao=sigla_regiao)
+
+# if 'regiao' in context:
+# context['ufs'] = UnidadeFederativa.objects.filter(regiao=context['regiao'])
+
+# todos_servicos = ['_none_'] + [s.sigla for s in tipos_servico]
+
+# if not servicos or set(servicos) == set(todos_servicos):
+# servicos = todos_servicos
+# context['qs_servico'] = ''
+# else:
+# if '_none_' in servicos:
+# casas = casas.filter(Q(servico=None) | Q(servico__tipo_servico__sigla__in=servicos))
+# else:
+# casas = casas.filter(servico__tipo_servico__sigla__in=servicos)
+# casas = casas.distinct('nome', 'municipio__uf')
+# context['qs_servico'] = "&".join(['servico=%s' % s for s in servicos])
+
+# context['servicos_check'] = servicos
+
+# casas = casas.select_related('municipio', 'municipio__uf', 'municipio__microrregiao', 'municipio__microrregiao__mesorregiao').prefetch_related('servico_set')
+
+# return casas, context
+
+
+# @login_required
+# def painel_relacionamento(request):
+# page = request.GET.get('page', 1)
+# snippet = request.GET.get('snippet', '')
+# seletor = request.GET.get('s', None)
+# servidor = request.GET.get('servidor', None)
+# fmt = request.GET.get('f', 'html')
+
+# if servidor is None:
+# gerente = request.user.servidor
+# elif servidor == '_all':
+# gerente = None
+# else:
+# gerente = get_object_or_404(Servidor, pk=servidor)
+
+# if gerente is not None:
+# casas = gerente.casas_que_gerencia.all()
+
+# if gerente is None or not casas.exists():
+# casas = Orgao.objects.exclude(gerentes_interlegis=None)
+# gerente = None
+
+# tipos_servico = TipoServico.objects.all()
+# regioes = UnidadeFederativa.REGIAO_CHOICES
+
+# context = {
+# 'seletor': seletor,
+# 'snippet': snippet,
+# 'regioes': regioes,
+# 'servicos': tipos_servico,
+# 'gerentes': Servidor.objects.exclude(casas_que_gerencia=None),
+# 'gerente': gerente,
+# 'qs_servidor': ('servidor=%s' % gerente.pk) if gerente else '',
+# }
+
+# if snippet != 'lista':
+# context['resumo'] = resumo_carteira(casas)
+
+# if snippet != 'resumo':
+# casas, context = casas_carteira(request, casas, context)
+# paginator = Paginator(casas, 30)
+# try:
+# pagina = paginator.page(page)
+# except (EmptyPage, InvalidPage):
+# pagina = paginator.page(paginator.num_pages)
+# context['page_obj'] = pagina
+
+# if snippet == 'lista':
+# if fmt == 'csv':
+# response = HttpResponse(content_type='text/csv')
+# response['Content-Disposition'] = 'attachment; filename=casas.csv'
+# writer = csv.writer(response)
+# writer.writerow([
+# _("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([
+# c.nome.encode('utf8'),
+# c.municipio.uf.get_regiao_display().encode('utf8'),
+# c.municipio.uf.sigla.encode('utf8'),
+# c.municipio.microrregiao.mesorregiao.nome.encode('utf8'),
+# c.municipio.microrregiao.nome.encode('utf8'),
+# c.lista_gerentes(fmt='lista').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)
+# if snippet == 'resumo':
+# return render(request, 'casas/resumo_carteira_snippet.html', context)
+
+# return render(request, 'casas/painel.html', context)
+
+# @login_required
+# def gerentes_interlegis(request):
+# formato = request.GET.get('fmt', 'html')
+# inclui_casas = (request.GET.get('casas', 'no') == 'yes')
+# gerentes = Servidor.objects.exclude(
+# casas_que_gerencia=None).select_related('casas_que_gerencia')
+# dados = []
+# for gerente in gerentes:
+# row = {'gerente': gerente, 'ufs': []}
+# for uf in (gerente.casas_que_gerencia.distinct('municipio__uf__sigla')
+# .order_by('municipio__uf__sigla')
+# .values_list('municipio__uf__sigla', 'municipio__uf__nome')
+# ):
+# row['ufs'].append((
+# uf[0],
+# uf[1],
+# gerente.casas_que_gerencia.filter(municipio__uf__sigla=uf[0])
+# ))
+# dados.append(row)
+
+# if formato == 'pdf':
+# return render_to_pdf(
+# 'casas/gerentes_interlegis_pdf.html',
+# {'gerentes': dados}
+# )
+# elif formato == 'csv':
+# response = HttpResponse(content_type='text/csv')
+# response['Content-Disposition'] = ('attachment; '
+# 'filename="gerentes_interlegis.csv"')
+# fieldnames = ['gerente', 'total_casas', 'uf', 'total_casas_uf']
+# if inclui_casas:
+# fieldnames.append('casa_legislativa')
+# writer = csv.DictWriter(response, fieldnames=fieldnames)
+# writer.writeheader()
+# for linha in dados:
+# rec = {
+# 'gerente': linha['gerente'].nome_completo.encode('utf8'),
+# 'total_casas': linha['gerente'].casas_que_gerencia.count()
+# }
+# for uf in linha['ufs']:
+# rec['uf'] = uf[1].encode('utf8')
+# rec['total_casas_uf'] = uf[2].count()
+# if inclui_casas:
+# for casa in uf[2]:
+# rec['casa_legislativa'] = casa.nome.encode('utf8')
+# writer.writerow(rec)
+# rec['gerente'] = ''
+# rec['total_casas'] = ''
+# rec['uf'] = ''
+# rec['total_casas_uf'] = ''
+# else:
+# writer.writerow(rec)
+# rec['gerente'] = ''
+# rec['total_casas'] = ''
+# return response
+
+# return render(
+# request,
+# 'casas/gerentes_interlegis.html',
+# {'gerentes': dados}
+# )
diff --git a/sigi/settings/base.py b/sigi/settings/base.py
index 85289e1..1724944 100644
--- a/sigi/settings/base.py
+++ b/sigi/settings/base.py
@@ -21,7 +21,9 @@ BASE_DIR = Path(__file__).resolve().parent.parent
INSTALLED_APPS = [
'sigi.apps.servidores',
'sigi.apps.contatos',
+ 'sigi.apps.casas',
'django_bootstrap5',
+ 'localflavor',
'django.forms',
'django.contrib.admin',
'django.contrib.auth',
@@ -85,6 +87,8 @@ USE_THOUSAND_SEPARATOR = True
# https://docs.djangoproject.com/en/4.0/howto/static-files/
STATIC_URL = 'static/'
+STATICFILES_DIRS = [BASE_DIR / "static",]
+STATIC_ROOT = '/var/www/sigi/static/'
# Default primary key field type
# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
diff --git a/sigi/settings/development.py b/sigi/settings/development.py
index e7f3df7..97edc29 100644
--- a/sigi/settings/development.py
+++ b/sigi/settings/development.py
@@ -50,3 +50,8 @@ AUTH_PASSWORD_VALIDATORS = [
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/4.0/howto/static-files/
+
+STATIC_ROOT = BASE_DIR / '../static/'
\ No newline at end of file
diff --git a/sigi/static/img/logo-interlegis.png b/sigi/static/img/logo-interlegis.png
new file mode 100644
index 0000000..042ffac
Binary files /dev/null and b/sigi/static/img/logo-interlegis.png differ
diff --git a/sigi/static/img/logo-senado.png b/sigi/static/img/logo-senado.png
new file mode 100644
index 0000000..248e796
Binary files /dev/null and b/sigi/static/img/logo-senado.png differ
diff --git a/templates/change_list_with_cart.html b/sigi/templates/change_list_with_cart.html
similarity index 87%
rename from templates/change_list_with_cart.html
rename to sigi/templates/change_list_with_cart.html
index 14cdf1c..bfaa2f4 100644
--- a/templates/change_list_with_cart.html
+++ b/sigi/templates/change_list_with_cart.html
@@ -1,5 +1,5 @@
{% extends "admin/change_list.html" %}
-{% load admin_list i18n reporting_tags %}
+{% load admin_list i18n %}
{% block object-tools-items %}
diff --git a/sigi/templates/pdf/base.html b/sigi/templates/pdf/base.html
new file mode 100644
index 0000000..b771339
--- /dev/null
+++ b/sigi/templates/pdf/base.html
@@ -0,0 +1,45 @@
+{% load static i18n %}
+
+
+
+
+
+
+
+ {% block extra_head %}{% endblock extra_head %}
+ {% block title %}{% endblock title %}
+
+
+ {% block body_content %}{% endblock body_content %}
+
+
diff --git a/sigi/templates/pdf/base_report.html b/sigi/templates/pdf/base_report.html
new file mode 100644
index 0000000..74fd9d4
--- /dev/null
+++ b/sigi/templates/pdf/base_report.html
@@ -0,0 +1,59 @@
+{% extends 'pdf/base.html' %}
+{% load static i18n %}
+
+{% block title %}{{ title }}{% endblock title %}
+{% block extra_style %}
+h1, h2, h3, h4, h5, h6 {
+ margin: 0;
+}
+h1 {font-size: 1.6em;}
+h2 {font-size: 1.5em;}
+h3 {font-size: 1.4em;}
+h4 {font-size: 1.3em;}
+h5 {font-size: 1.2em;}
+h6 {font-size: 1.1em;}
+header {
+ font-size: 1.4em;
+ font-weight: bold;
+ text-align: center;
+}
+header p {
+ margin: 5px;
+}
+.report_name {
+ font-size: 1.6em;
+}
+
+table {
+ border: 2px white;
+ width: 100%;
+}
+th,td {
+ padding: 4px;
+}
+th {
+ background-color: #007433;
+ color: white;
+}
+tr:nth-child(even) {
+ background-color: #d2d2d2;
+}
+.title_row {
+ background-color: #b2b2b2;
+}
+{% endblock extra_style %}
+
+{% block body_content %}
+
+
+
+
+ {% block main_content %}{% endblock main_content %}
+{% endblock body_content %}
\ No newline at end of file
diff --git a/sigi/urls.py b/sigi/urls.py
index 40febb3..14875ef 100644
--- a/sigi/urls.py
+++ b/sigi/urls.py
@@ -18,6 +18,7 @@ from django.urls import path, include
from django.conf import settings
urlpatterns = [
+ path('admin/casas/', include('sigi.apps.casas.urls')),
path('admin/', admin.site.urls),
]
diff --git a/sigiStatic/img/logo-interlegis.png b/sigiStatic/img/logo-interlegis.png
deleted file mode 100644
index 3f48302..0000000
Binary files a/sigiStatic/img/logo-interlegis.png and /dev/null differ
diff --git a/sigiStatic/img/logo-senado.png b/sigiStatic/img/logo-senado.png
deleted file mode 100644
index bee0ada..0000000
Binary files a/sigiStatic/img/logo-senado.png and /dev/null differ