From 2b21ad137d5a48915b8e2ffef4587ebc12968d09 Mon Sep 17 00:00:00 2001 From: Sesostris Vieira Date: Wed, 4 Nov 2015 12:17:22 -0200 Subject: [PATCH] Add relationship portfolio management board and utils --- sigi/apps/casas/forms.py | 8 ++ sigi/apps/casas/management/__init__.py | 0 .../casas/management/commands/__init__.py | 0 .../management/commands/importa_gerentes.py | 84 +++++++++++++++ .../apps/casas/templates/casas/portfolio.html | 101 ++++++++++++++++++ sigi/apps/casas/urls.py | 1 + sigi/apps/casas/views.py | 93 +++++++++++++++- 7 files changed, 284 insertions(+), 3 deletions(-) create mode 100644 sigi/apps/casas/management/__init__.py create mode 100644 sigi/apps/casas/management/commands/__init__.py create mode 100644 sigi/apps/casas/management/commands/importa_gerentes.py create mode 100644 sigi/apps/casas/templates/casas/portfolio.html diff --git a/sigi/apps/casas/forms.py b/sigi/apps/casas/forms.py index 947463e..2b87e5c 100644 --- a/sigi/apps/casas/forms.py +++ b/sigi/apps/casas/forms.py @@ -4,6 +4,7 @@ from django.utils.translation import ugettext as _ from localflavor.br.forms import BRZipCodeField from sigi.apps.casas.models import CasaLegislativa +from sigi.apps.servidores.models import Servidor class CasaLegislativaForm(forms.ModelForm): @@ -17,3 +18,10 @@ class CasaLegislativaForm(forms.ModelForm): class Meta: model = CasaLegislativa fields = '__all__' + +class PortfolioForm(forms.Form): + gerente_contas = forms.ModelChoiceField(queryset=Servidor.objects.all(), label=_(u"Atribuir casas para")) + + def __init__(self, label=_(u"Atribuir casas para"), *args, **kwargs): + super(PortfolioForm, self).__init__(*args, **kwargs) + self.fields['gerente_contas'].label = label diff --git a/sigi/apps/casas/management/__init__.py b/sigi/apps/casas/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sigi/apps/casas/management/commands/__init__.py b/sigi/apps/casas/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sigi/apps/casas/management/commands/importa_gerentes.py b/sigi/apps/casas/management/commands/importa_gerentes.py new file mode 100644 index 0000000..f43744c --- /dev/null +++ b/sigi/apps/casas/management/commands/importa_gerentes.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# +# sigi.apps.casas.management.commands.importa_gerentes +# +# Copyright (c) 2015 by Interlegis +# +# GNU General Public License (GPL) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# + +import csv +import os +from django.core.management.base import BaseCommand, CommandError +from sigi.apps.casas.models import CasaLegislativa +from sigi.apps.servidores.models import Servidor +from sigi.apps.contatos.models import Municipio + +class Command(BaseCommand): + args = u"data_file.csv" + help = u"""Importa dados de atribuição de gerencia de relacionamentos de um arquivo CSV. + + A primeira linha do arquivo deve possuir um cabeçalho com os seguintes campos obrigatórios: + - cod_municipio : Código IBGE do município + - user_id : Nome de usuário (usado no login) do gerente de relacionamento da Casa + + * Os nomes dos campos devem ser grafados exatamente como descrito.""" + + campos = {'cod_municipio', 'user_id'} + + def handle(self, *args, **options): + if len(args) != 1: + raise CommandError(u"Informe UM arquivo csv a importar") + + file_name = args[0] + + if not os.path.isfile(file_name): + raise CommandError(u"Arquivo %s não encontrado" % [file_name,]) + + with open(file_name, 'rb') as csvfile: + reader = csv.DictReader(csvfile) + + if not self.campos.issubset(reader.fieldnames): + raise CommandError(u"O arquivo não possui todos os campos obrigatórios") + + CasaLegislativa.objects.update(gerente_contas=None) + + erros = 0 + + for reg in reader: + try: + municipio = Municipio.objects.get(codigo_ibge=reg['cod_municipio']) + except Municipio.DoesNotExist: + self.stdout.write(u"(Linha %s): não existe Município com código IBGE '%s'" % + (reader.line_num, reg['cod_municipio'],)) + erros = erros + 1 + continue + + try: + gerente = Servidor.objects.get(user__username=reg['user_id']) + except Servidor.DoesNotExist: + self.stdout.write(u"(Linha %s): não existe Servidor com userid '%s'" % + (reader.line_num, reg['user_id'],)) + erros = erros + 1 + continue + + for casa in municipio.casalegislativa_set.filter(tipo__sigla__in=['AL', 'CM']): + casa.gerente_contas = gerente + casa.save() + + self.stdout.write(u"Importação concluída. %s erros em %s linhas" % (erros, reader.line_num,)) \ No newline at end of file diff --git a/sigi/apps/casas/templates/casas/portfolio.html b/sigi/apps/casas/templates/casas/portfolio.html new file mode 100644 index 0000000..ab60d48 --- /dev/null +++ b/sigi/apps/casas/templates/casas/portfolio.html @@ -0,0 +1,101 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_static %} +{% load static from staticfiles %} +{% load smart_pagination %} + +{% block extrastyle %} + + {{ block.super }} +{% endblock %} + +{% block extrahead %} + {{ block.super }} +{% endblock %} + +{% block coltype %}colMS{% endblock %} + +{% block content_title %}

{% blocktrans %}Portfólio de relacionamento com Casas{% endblocktrans %}

{% endblock %} + +{% block content %} + {% for e in errors %} +
{{ e }}
+ {% endfor %} + + + + {% if ufs %} + + {% endif %} + + {% if mesorregioes %} + + {% endif %} + + {% if microrregioes %} + + {% endif %} + + {% if form %} +
+ {% csrf_token %} + {{ form }} + +
+ {% endif %} + + {% if page_obj %} +
+ + + + + + + + + + {% for casa in page_obj.object_list %} + + + + + + + + {% endfor %} +
{% trans "Nome da Casa" %}{% trans "UF" %}{% trans "Mesorregião" %}{% trans "Microrregião" %}{% trans "Gerente de relacionamento" %}
{{ casa.nome }}{{ casa.municipio.uf }}{{ casa.municipio.microrregiao.mesorregiao }}{{ casa.municipio.microrregiao.nome }}{{ casa.gerente_contas }}
+
+ +

{% blocktrans with count=page_obj.paginator.count %}{{ count }} casas encontradas.{% endblocktrans %}

+ + {% if page_obj.paginator.num_pages > 1 %} + {% smart_paginator page_obj=page_obj querystring=querystring %} + {% endif %} + {% endif %} + +{% endblock %} diff --git a/sigi/apps/casas/urls.py b/sigi/apps/casas/urls.py index 4a4a609..84d2b71 100644 --- a/sigi/apps/casas/urls.py +++ b/sigi/apps/casas/urls.py @@ -33,5 +33,6 @@ urlpatterns = patterns( url(r'^casalegislativa/carrinho/$', 'visualizar_carrinho', name='visualizar-carrinho'), url(r'^casalegislativa/carrinho/excluir_carrinho/$', 'excluir_carrinho', name='excluir-carrinho'), # Error url(r'^casalegislativa/carrinho/deleta_itens_carrinho$', 'deleta_itens_carrinho', name='deleta-itens-carrinho'), # Error + url(r'^portfolio/$', 'portfolio', name='casas-portfolio'), # Error ) diff --git a/sigi/apps/casas/views.py b/sigi/apps/casas/views.py index ef70aad..2ef60d3 100644 --- a/sigi/apps/casas/views.py +++ b/sigi/apps/casas/views.py @@ -4,13 +4,15 @@ from functools import reduce from django.core.paginator import Paginator, InvalidPage, EmptyPage from django.http import HttpResponse, HttpResponseRedirect -from django.shortcuts import render -from django.utils.translation import ugettext as _ +from django.shortcuts import render, get_object_or_404 +from django.utils.translation import ugettext as _, ungettext from geraldo.generators import PDFGenerator from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.reports import CasasLegislativasLabels, CasasLegislativasLabelsSemPresidente, CasasLegislativasReport, CasasSemConvenioReport, InfoCasaLegislativa from sigi.apps.parlamentares.reports import ParlamentaresLabels +from sigi.apps.contatos.models import UnidadeFederativa, Mesorregiao, Microrregiao +from sigi.apps.casas.forms import PortfolioForm # @param qs: queryset @@ -291,7 +293,6 @@ def report_complete(request, id=None): return response - def casas_sem_convenio_report(request): qs = CasaLegislativa.objects.filter(convenio=None).order_by('municipio__uf', 'nome') @@ -383,3 +384,89 @@ def export_csv(request): writer.writerow(lista) return response + +def portfolio(request): + page = request.GET.get('page', 1) + 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 + casas = None + gerente_contas = None + + if request.method == 'POST': + form = PortfolioForm(data=request.POST) + if form.is_valid(): + gerente_contas = form.cleaned_data['gerente_contas'] + else: + data['errors'].append(_(u"Dados inválidos")) + + 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(_(u'Atribuir casas da microrregiao %s para') % (unicode(microrregiao),)) + data['querystring'] = 'micro=%s' % (microrregiao.pk,) + casas = CasaLegislativa.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(_(u'Atribuir casas da mesorregiao %s para') % (unicode(mesorregiao),)) + data['querystring'] = 'meso=%s' % (mesorregiao.pk,) + casas = CasaLegislativa.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(_(u'Atribuir casas do estado %s para') % (unicode(uf),)) + data['querystring'] = 'uf=%s' % (uf.pk,) + casas = CasaLegislativa.objects.filter(municipio__uf=uf) + elif regiao: + data['regiao'] = regiao + data['ufs'] = UnidadeFederativa.objects.filter(regiao=regiao) + data['form'] = PortfolioForm(_(u'Atribuir casas da região %s para') % [x[1] for x in UnidadeFederativa.REGIAO_CHOICES if x[0]==regiao][0]) + data['querystring'] = 'regiao=%s' % (regiao,) + casas = CasaLegislativa.objects.filter(municipio__uf__regiao=regiao) + + if casas: + if gerente_contas: + count = casas.update(gerente_contas=gerente_contas) + data['messages'].append(ungettext( + u"%(count)s casa atribuída para %(name)s", + u"%(count)s casas atribuídas para %(name)s", + count) % {'count': count, 'name': unicode(gerente_contas)}) + + casas = casas.order_by('municipio__uf', 'municipio__microrregiao__mesorregiao', + 'municipio__microrregiao', 'municipio') + + casas.prefetch_related('municipio', 'municipio__uf', 'municipio__microrregiao', + 'municipio__microrregiao__mesorregiao', 'gerente_contas') + + 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) \ No newline at end of file