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 '' + #TODO: Descomentar após migração da app Convênios + # return mark_safe( + # '' + # ) + 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 '' + #TODO: Descomentar após migrar a app Servicos + # return mark_safe( + # '' + # ) + 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 %} + + + + + + + + + + + + + + + {% for casa in casas %} + {% ifchanged casa.municipio.uf %} + + {% endifchanged %} + + + + + + + + + + + {% endfor %} +
{% trans 'Casa' %}{% trans 'Presidente' %}{% trans 'Tipo' %}{% trans 'Endereço' %}{% trans 'Bairro' %}{% trans 'CEP' %}{% trans 'Telefone' %}{% trans 'E-mail' %}

{{ casa.municipio.uf.nome }}

{{ casa.nome }}{{ casa.presidente }}{{ casa.tipo.sigla }}{{ casa.logradouro }}{{ casa.bairro }}{{ casa.cep }}{{ casa.telefone }}{{ casa.email }}
+{% 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 - - - - - - - - - - - - - - - - - - - - {% for casa in casas %} - {% ifchanged casa.municipio.uf %} - - {% endifchanged %} - - - - - - - - - - - {% endfor %} -
{% trans 'Casa' %}{% trans 'Presidente' %}{% trans 'Tipo' %}{% trans 'Endereço' %}{% trans 'Bairro' %}{% trans 'CEP' %}{% trans 'Telefone' %}{% trans 'E-mail' %}

{{ casa.municipio.uf.nome }}

{{ casa.nome }}{{ casa.presidente }}{{ casa.tipo.sigla }}{{ casa.logradouro }}{{ casa.bairro }}{{ casa.cep }}{{ casa.telefone }}{{ casa.email }}
- - - - 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 header %} +

    {% trans 'SENADO FEDERAL' %}

    +

    {% trans 'Instituto Legislativo Brasileiro - ILB' %}

    +

    {% trans "INTERLEGIS" %}

    +

    {{ title|upper }}

    {% endblock header %} +
    + + + + {% 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