Browse Source

Add relationship portfolio management board and utils

stable/2.1
Sesostris Vieira 9 years ago
parent
commit
2b21ad137d
  1. 8
      sigi/apps/casas/forms.py
  2. 0
      sigi/apps/casas/management/__init__.py
  3. 0
      sigi/apps/casas/management/commands/__init__.py
  4. 84
      sigi/apps/casas/management/commands/importa_gerentes.py
  5. 101
      sigi/apps/casas/templates/casas/portfolio.html
  6. 1
      sigi/apps/casas/urls.py
  7. 93
      sigi/apps/casas/views.py

8
sigi/apps/casas/forms.py

@ -4,6 +4,7 @@ from django.utils.translation import ugettext as _
from localflavor.br.forms import BRZipCodeField from localflavor.br.forms import BRZipCodeField
from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.servidores.models import Servidor
class CasaLegislativaForm(forms.ModelForm): class CasaLegislativaForm(forms.ModelForm):
@ -17,3 +18,10 @@ class CasaLegislativaForm(forms.ModelForm):
class Meta: class Meta:
model = CasaLegislativa model = CasaLegislativa
fields = '__all__' 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

0
sigi/apps/casas/management/__init__.py

0
sigi/apps/casas/management/commands/__init__.py

84
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,))

101
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 %}
<style type="text/css">
</style>
{{ block.super }}
{% endblock %}
{% block extrahead %}
{{ block.super }}
{% endblock %}
{% block coltype %}colMS{% endblock %}
{% block content_title %}<h1>{% blocktrans %}Portfólio de relacionamento com Casas{% endblocktrans %}</h1>{% endblock %}
{% block content %}
{% for e in errors %}
<div class="alert alert-danger">{{ e }}</div>
{% endfor %}
<div class="nav">
<ul class="object-tools pull-left nav nav-pills">
{% for key, value in regioes %}
<li{% if regiao == key %} class="active"{% endif %}><a href="?regiao={{ key }}">{{ value }}</a></li>
{% endfor %}
</ul>
</div>
{% if ufs %}
<div class="nav">
<ul class="object-tools pull-left nav nav-tabs">
{% for uf in ufs %}
<li{% if uf_id == uf.pk %} class="active"{% endif %}><a href="?uf={{ uf.pk|safe }}">{{ uf.nome }}</a></li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if mesorregioes %}
<div class="nav">
<ul class="object-tools pull-left nav nav-pills">
{% for meso in mesorregioes %}
<li{% if meso_id == meso.pk %} class="active"{% endif %}><a href="?meso={{ meso.pk|safe }}">{{ meso.nome }}</a></li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if microrregioes %}
<div class="nav">
<ul class="object-tools pull-left nav nav-pills">
{% for micro in microrregioes %}
<li{% if micro_id == micro.pk %} class="active"{% endif %}><a href="?micro={{ micro.pk|safe }}">{{ micro.nome }}</a></li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if form %}
<form action="" method="post" id="atribui_gerente_form">
{% csrf_token %}
{{ form }}
<input type="submit" name="_save" value="Atribuir" class="btn btn-default" />
</form>
{% endif %}
{% if page_obj %}
<div class="table-responsive">
<table class="table table-striped">
<tr>
<th>{% trans "Nome da Casa" %}</th>
<th>{% trans "UF" %}</th>
<th>{% trans "Mesorregião" %}</th>
<th>{% trans "Microrregião" %}</th>
<th>{% trans "Gerente de relacionamento" %}</th>
</tr>
{% for casa in page_obj.object_list %}
<tr>
<td>{{ casa.nome }}</td>
<td>{{ casa.municipio.uf }}</td>
<td>{{ casa.municipio.microrregiao.mesorregiao }}</td>
<td>{{ casa.municipio.microrregiao.nome }}</td>
<td>{{ casa.gerente_contas }}</td>
</tr>
{% endfor %}
</table>
</div>
<p>{% blocktrans with count=page_obj.paginator.count %}{{ count }} casas encontradas.{% endblocktrans %}</p>
{% if page_obj.paginator.num_pages > 1 %}
{% smart_paginator page_obj=page_obj querystring=querystring %}
{% endif %}
{% endif %}
{% endblock %}

1
sigi/apps/casas/urls.py

@ -33,5 +33,6 @@ urlpatterns = patterns(
url(r'^casalegislativa/carrinho/$', 'visualizar_carrinho', name='visualizar-carrinho'), 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/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'^casalegislativa/carrinho/deleta_itens_carrinho$', 'deleta_itens_carrinho', name='deleta-itens-carrinho'), # Error
url(r'^portfolio/$', 'portfolio', name='casas-portfolio'), # Error
) )

93
sigi/apps/casas/views.py

@ -4,13 +4,15 @@ from functools import reduce
from django.core.paginator import Paginator, InvalidPage, EmptyPage from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render from django.shortcuts import render, get_object_or_404
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _, ungettext
from geraldo.generators import PDFGenerator from geraldo.generators import PDFGenerator
from sigi.apps.casas.models import CasaLegislativa from sigi.apps.casas.models import CasaLegislativa
from sigi.apps.casas.reports import CasasLegislativasLabels, CasasLegislativasLabelsSemPresidente, CasasLegislativasReport, CasasSemConvenioReport, InfoCasaLegislativa from sigi.apps.casas.reports import CasasLegislativasLabels, CasasLegislativasLabelsSemPresidente, CasasLegislativasReport, CasasSemConvenioReport, InfoCasaLegislativa
from sigi.apps.parlamentares.reports import ParlamentaresLabels 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 # @param qs: queryset
@ -291,7 +293,6 @@ def report_complete(request, id=None):
return response return response
def casas_sem_convenio_report(request): def casas_sem_convenio_report(request):
qs = CasaLegislativa.objects.filter(convenio=None).order_by('municipio__uf', 'nome') qs = CasaLegislativa.objects.filter(convenio=None).order_by('municipio__uf', 'nome')
@ -383,3 +384,89 @@ def export_csv(request):
writer.writerow(lista) writer.writerow(lista)
return response 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)
Loading…
Cancel
Save