diff --git a/sigi/apps/casas/admin.py b/sigi/apps/casas/admin.py index 1279809..9145e9b 100644 --- a/sigi/apps/casas/admin.py +++ b/sigi/apps/casas/admin.py @@ -1,16 +1,17 @@ # -*- coding: utf-8 -*- from django.contrib import admin from django.contrib.contenttypes import generic -from sigi.apps.casas.forms import CasaLegislativaForm -from sigi.apps.casas.models import CasaLegislativa -from sigi.apps.contatos.models import Contato, Telefone -from sigi.apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo +from apps.casas.forms import CasaLegislativaForm +from apps.casas.models import CasaLegislativa +from apps.contatos.models import Contato, Telefone +from apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo from django.http import HttpResponse, HttpResponseRedirect -from sigi.apps.casas.reports import CasasLegislativasLabels, CasasLegislativasReport +from apps.casas.reports import CasasLegislativasLabels, CasasLegislativasReport from geraldo.generators import PDFGenerator -from sigi.apps.casas.views import casa_info, labels_report, export_csv, \ - labels_report_sem_presidente, report -from sigi.apps.utils import queryset_ascii +from apps.casas.views import report_complete, labels_report, export_csv, \ + labels_report_sem_presidente, report, \ + adicionar_casas_carrinho +from apps.utils import queryset_ascii class ContatosInline(generic.GenericTabularInline): model = Contato @@ -30,7 +31,7 @@ class CasaLegislativaAdmin(admin.ModelAdmin): form = CasaLegislativaForm change_form_template = 'casas/change_form.html' change_list_template = 'casas/change_list.html' - actions = ['etiqueta','relatorio','relatorio_csv','relatorio_completo','etiqueta_sem_presidente', 'adicionar_casas', 'teste'] + actions = ['adicionar_casas',] inlines = (TelefonesInline, ContatosInline, ConveniosInline) list_display = ('nome','municipio','presidente','logradouro') list_display_links = ('nome',) @@ -61,41 +62,42 @@ class CasaLegislativaAdmin(admin.ModelAdmin): extra_context={'query_str': '?' + request.META['QUERY_STRING']} ) - def etiqueta(modelAdmin,request,queryset): + 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(modelAdmin,request,queryset): + 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(modelAdmin,request,queryset): + def relatorio(self,request,queryset): return report(request,queryset=queryset) relatorio.short_description = u"Exportar a(s) casa(s) selecionada(s) para PDF" - def relatorio_completo(modelAdmin,request,queryset): - return casa_info(request,queryset=queryset) + def relatorio_completo(self,request,queryset): + return report_complete(request,queryset=queryset) relatorio_completo.short_description = u"Gerar relatório completo da(s) casa(s) selecionada(s)" - def relatorio_csv(modelAdmin,request,queryset): + def relatorio_csv(self,request,queryset): return export_csv(request) relatorio_csv.short_description = u"Exportar casa(s) selecionada(s) para CSV" - def adicionar_casas(modelAdmin, request, queryset): - if request.method == 'POST': - ids_selecionados = request.POST.getlist('_selected_action') - print "Selecionados atual :", - print ids_selecionados - if request.session.has_key('ids_selecionados_etiqueta') == False: - request.session['ids_selecionados_etiqueta'] = ids_selecionados - else: - lista = request.session['ids_selecionados_etiqueta'] - print "Selecionados anteriormente :", - print lista - lista.extend(ids_selecionados) - print "Todos selecionados :", - print lista - request.session['ids_selecionados_etiqueta'] = lista + def adicionar_casas(self, request, queryset): + 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 = u"Armazenar casas no carrinho para exportar" + def get_actions(self, request): actions = super(CasaLegislativaAdmin, self).get_actions(request) diff --git a/sigi/apps/casas/reports.py b/sigi/apps/casas/reports.py index b727e85..e2627d5 100644 --- a/sigi/apps/casas/reports.py +++ b/sigi/apps/casas/reports.py @@ -3,7 +3,7 @@ from reportlab.lib.pagesizes import A4 from reportlab.lib.units import cm from reportlab.lib.enums import TA_CENTER, TA_RIGHT from geraldo import Report, DetailBand, Label, ObjectValue, ManyElements, \ - ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH + ReportGroup, ReportBand, landscape, SubReport, BAND_WIDTH,SystemField from sigi.apps.relatorios.reports import ReportDefault @@ -220,6 +220,15 @@ class CasasSemConvenioReport(CasasLegislativasReport): class InfoCasaLegislativa(ReportDefault): title = u'Casa legislativa' + class band_summary(ReportBand): + pass + class band_page_footer(ReportBand): + height = 1*cm + + elements = [ + SystemField(expression=u'%(now:%d/%m/%Y)s às %(now:%H:%M)s', top=0.3*cm), + ] + class band_detail(ReportDefault.band_detail): posicao_left = [ @@ -403,7 +412,7 @@ class InfoCasaLegislativa(ReportDefault): ), ObjectValue(attribute_name='nota',left=tel_left[2]*cm), ], - borders = {'all':True}, + #borders = {'all':True}, ), ), #Contatos @@ -433,7 +442,7 @@ class InfoCasaLegislativa(ReportDefault): ObjectValue(attribute_name='nota',left=cont_left[1]*cm), ObjectValue(attribute_name='email',left=cont_left[2]*cm), ], - borders = {'all':True}, + #borders = {'all':True}, ), ), #Convenios @@ -483,7 +492,7 @@ class InfoCasaLegislativa(ReportDefault): instance.data_pub_diario.strftime('%d/%m/%Y') if instance.data_pub_diario != None else '-' ), ], - borders = {'all':True}, + #borders = {'all':True}, ), ) ] diff --git a/sigi/apps/casas/templates/casas/carrinho.html b/sigi/apps/casas/templates/casas/carrinho.html new file mode 100644 index 0000000..e606365 --- /dev/null +++ b/sigi/apps/casas/templates/casas/carrinho.html @@ -0,0 +1,158 @@ +{% extends "admin/carrinho.html" %} +{% load adminmedia admin_list i18n %} +{% block extrastyle %} + {{ block.super }} + {% include "admin/tabs_style.html" %} + + +{% endblock %} + +{% block title %}Casas legislativas no Carrinho | SIGI{% endblock %} +{% block content_title %}

Casas Legislativas no Carrinho

{% endblock %} + +{% block mensagem%} + +{% endblock %} + +{% block action %}/casas/casalegislativa/carrinho/deleta_itens_carrinho{% endblock %} + +{% block tabela %} + + + + {%if not carIsEmpty%} + + {% endif %} + + + + + + + + {% for casa in paginas.object_list %} + + {%if not carIsEmpty%} + + {% endif %} + + + + + + {% endfor %} + +
+ NomeMunicípioPresidenteEndereço
{{casa.nome}}{{casa.municipio}}{{casa.presidente}}{{casa.logradouro}}
+{% endblock %} + +{% block botoes %} +
+ + +
+
+
Tipo de etiqueta +
    +
  • +
  • +
  • +
+
+
    +
  • +
+
+ +
+
+
+
Tipo de relatório +
    +
  • +
  • +
+
+
    +
  • +
+
+
+
+
+
Escolha os atributos para exportar +
    +
  • + + + +
  • +
  • + + + +
  • +
  • + + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + + +
  • +
  • + + + +
  • +
+
+
    +
  • +
+
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/sigi/apps/casas/templates/casas/change_form.html b/sigi/apps/casas/templates/casas/change_form.html index aff4757..b59cb99 100644 --- a/sigi/apps/casas/templates/casas/change_form.html +++ b/sigi/apps/casas/templates/casas/change_form.html @@ -4,7 +4,7 @@ {% block object-tools %} {% if change %}{% if not is_popup %} + {% endblock %} diff --git a/sigi/apps/casas/views.py b/sigi/apps/casas/views.py index 92e1e24..0d0db98 100644 --- a/sigi/apps/casas/views.py +++ b/sigi/apps/casas/views.py @@ -1,15 +1,21 @@ # -*- coding: utf-8 -*- from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import render_to_response from geraldo.generators import PDFGenerator -from sigi.apps.casas.models import CasaLegislativa +from apps.casas.models import CasaLegislativa -from sigi.apps.casas.reports import CasasLegislativasLabels -from sigi.apps.casas.reports import CasasLegislativasLabelsSemPresidente -from sigi.apps.casas.reports import CasasLegislativasReport -from sigi.apps.casas.reports import CasasSemConvenioReport -from sigi.apps.casas.reports import InfoCasaLegislativa +from apps.casas.reports import CasasLegislativasLabels +from apps.casas.reports import CasasLegislativasLabelsSemPresidente +from apps.casas.reports import CasasLegislativasReport +from apps.casas.reports import CasasSemConvenioReport +from apps.casas.reports import InfoCasaLegislativa + +from django.core.paginator import Paginator, InvalidPage, EmptyPage + +from django.conf import settings import csv +from bzrlib.switch import switch def query_ordena(qs,o,ot): list_display = ('nome','municipio','presidente','logradouro') @@ -22,93 +28,186 @@ def query_ordena(qs,o,ot): return qs def get_for_qs(get,qs): + """ + Verifica atributos do GET e retorna queryset correspondente + """ kwargs = {} for k,v in get.iteritems(): - if not k == 'o': - if k == "ot": - qs = query_ordena(qs,get["o"],get["ot"]) - else: - kwargs[str(k)] = v - qs = qs.filter(**kwargs) + if not (k == 'page' or k == 'pop' or k == 'q'): + if not k == 'o': + if k == "ot": + qs = query_ordena(qs,get["o"],get["ot"]) + else: + kwargs[str(k)] = v + qs = qs.filter(**kwargs) return qs - -def labels_report(request, id=None,queryset=None): - """ TODO: adicionar suporte para resultado de pesquisa do admin. +def carrinhoOrGet_for_qs(request): + """ + Verifica se existe casas na sessão se não verifica get e retorna qs correspondente. """ - if request.session.has_key('ids_selecionados_etiqueta') == True: - ids = request.session['ids_selecionados_etiqueta'] - del request.session['ids_selecionados_etiqueta'] -# request.session.modified = True - print "Impressao", - print ids - qs = CasaLegislativa.objects.filter(pk__in=ids) - elif queryset: - qs = queryset + if request.session.has_key('carrinho_casas'): + ids = request.session['carrinho_casas'] + qs = CasaLegislativa.objects.filter(pk__in=ids) else: - qs = CasaLegislativa.objects.all() - if id: - qs = qs.filter(pk=id) - elif request.GET: + qs = CasaLegislativa.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 not request.session.has_key('carrinho_casas'): + 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 not id in lista: + lista.append(id) + request.session['carrinho_casas'] = lista + + + +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(request.session.has_key('carrinho_casas')) + + return render_to_response( + 'casas/carrinho.html', + { + "ADMIN_MEDIA_PREFIX":settings.ADMIN_MEDIA_PREFIX, + 'MEDIA_URL':settings.MEDIA_URL, + 'carIsEmpty':carrinhoIsEmpty, + 'paginas':paginas, + 'query_str':'?'+request.META['QUERY_STRING'] + } + ) + +def excluir_carrinho(request): + if request.session.has_key('carrinho_casas'): + del request.session['carrinho_casas'] + return HttpResponseRedirect('.') + +def deleta_itens_carrinho(request): + if request.method == 'POST': + ids_selecionados = request.POST.getlist('_selected_action') + if request.session.has_key('carrinho_casas'): + 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('.') + + + + +def labels_report(request, id=None, tipo=None): + """ TODO: adicionar suporte para resultado de pesquisa do admin. + """ + + if request.POST: + if request.POST.has_key('tipo_etiqueta'): + tipo = request.POST['tipo_etiqueta'] + + if tipo =='sem_presidente': + return labels_report_sem_presidente(request, id) + + if id: + qs = CasaLegislativa.objects.filter(pk=id) + else: + qs = carrinhoOrGet_for_qs(request) + + if not qs: + return HttpResponseRedirect('../') response = HttpResponse(mimetype='application/pdf') + response['Content-Disposition'] = 'attachment; filename=casas.pdf' report = CasasLegislativasLabels(queryset=qs) report.generate_by(PDFGenerator, filename=response) return response -def labels_report_sem_presidente(request, id=None,queryset=None): +def labels_report_sem_presidente(request, id=None): """ TODO: adicionar suporte para resultado de pesquisa do admin. """ - if queryset: - qs = queryset - else: - qs = CasaLegislativa.objects.all() - if id: - qs = qs.filter(pk=id) - elif request.GET: - qs = get_for_qs(request.GET,qs) + + if id: + qs = CasaLegislativa.objects.filter(pk=id) + else: + qs = carrinhoOrGet_for_qs(request) + + if not qs: + return HttpResponseRedirect('../') response = HttpResponse(mimetype='application/pdf') + response['Content-Disposition'] = 'attachment; filename=casas.pdf' report = CasasLegislativasLabelsSemPresidente(queryset=qs) report.generate_by(PDFGenerator, filename=response) return response -def report(request, id=None,queryset=None): - if queryset: - qs = queryset - else: - qs = CasaLegislativa.objects.all() - if id: - qs = qs.filter(pk=id) - elif request.GET: - qs = get_for_qs(request.GET,qs) +def report(request, id=None,tipo=None): + + if request.POST: + if request.POST.has_key('tipo_relatorio'): + tipo = request.POST['tipo_relatorio'] + + if tipo =='completo': + return report_complete(request, id) + + + if id: + qs = CasaLegislativa.objects.filter(pk=id) + else: + qs = carrinhoOrGet_for_qs(request) - if not qs: - return HttpResponseRedirect('../') + if not qs: + return HttpResponseRedirect('../') #qs.order_by('municipio__uf','nome') response = HttpResponse(mimetype='application/pdf') + response['Content-Disposition'] = 'attachment; filename=casas.pdf' report = CasasLegislativasReport(queryset=qs) report.generate_by(PDFGenerator, filename=response) return response -def casa_info(request,id=None,queryset=None): - if queryset: - qs = queryset - else: - qs = CasaLegislativa.objects.all() - if id: - qs = qs.filter(pk=id) - elif request.GET: - qs = get_for_qs(request.GET,qs) +def report_complete(request,id=None): + + if id: + qs = CasaLegislativa.objects.filter(pk=id) + else: + qs = carrinhoOrGet_for_qs(request) + if not qs: return HttpResponseRedirect('../') response = HttpResponse(mimetype='application/pdf') + response['Content-Disposition'] = 'attachment; filename=casas.pdf' # Gera um relatorio para cada casa e concatena os relatorios cont = 0 @@ -154,8 +253,39 @@ def export_csv(request): response['Content-Disposition'] = 'attachment; filename=casas.csv' csv_writer = csv.writer(response) - casas = CasaLegislativa.objects.all() + casas = carrinhoOrGet_for_qs(request) + if not casas: + return HttpResponseRedirect('../') + + if request.POST: + atributos = request.POST.getlist("itens_csv_selected") + map(unicode,atributos) + csv_writer.writerow(atributos) + for casa in casas: - csv_writer.writerow([casa.nome.encode("utf-8"), casa.municipio.uf.sigla.encode("utf-8")]) + lista = [] + for atributo in atributos: + if u"CNPJ" == atributo: + lista.append(casa.cnpj.encode("utf-8")) + elif u"Código IBGE" == atributo: + lista.append(str(casa.municipio.codigo_ibge).encode("utf-8")) + elif u"Nome" == atributo: + lista.append(casa.nome.encode("utf-8")) + elif u"Município" == atributo: + lista.append(str(casa.municipio).encode("utf-8")) + elif u"Presidente" == atributo: + lista.append(casa.presidente.encode("utf-8")) + elif u"Logradouro" == atributo: + lista.append(casa.logradouro.encode("utf-8")) + elif u"Bairro" == atributo: + lista.append(casa.bairro.encode("utf-8")) + elif u"CEP" == atributo: + lista.append(casa.cep.encode("utf-8")) + elif u"Telefone" == atributo: + lista.append(casa.telefone.encode("utf-8")) + else: + pass + + csv_writer.writerow(lista) return response diff --git a/sigi/apps/convenios/admin.py b/sigi/apps/convenios/admin.py index b3909e4..3f968ae 100644 --- a/sigi/apps/convenios/admin.py +++ b/sigi/apps/convenios/admin.py @@ -1,13 +1,15 @@ # -*- coding: utf-8 -*- from django.contrib import admin -from sigi.apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo -from sigi.apps.casas.models import CasaLegislativa -from sigi.apps.servicos.models import Servico +from apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo +from apps.casas.models import CasaLegislativa +from apps.servicos.models import Servico from django.http import HttpResponse, HttpResponseRedirect -from sigi.apps.convenios.reports import ConvenioReport -from sigi.apps.utils import queryset_ascii +from apps.convenios.reports import ConvenioReport +from apps.utils import queryset_ascii from geraldo.generators import PDFGenerator +from apps.convenios.views import adicionar_convenios_carrinho + class AnexosInline(admin.TabularInline): model = Anexo extra = 2 @@ -38,7 +40,7 @@ class ConvenioAdmin(admin.ModelAdmin): 'data_devolucao_via', 'data_postagem_correio')} ), ) - actions = ['delete_selected', 'relatorio'] + actions = ['adicionar_convenios'] inlines = (AnexosInline, EquipamentoPrevistoInline) list_display = ('num_convenio', 'casa_legislativa', 'data_adesao','data_retorno_assinatura','data_termo_aceite', @@ -47,7 +49,7 @@ class ConvenioAdmin(admin.ModelAdmin): list_display_links = ('num_convenio','casa_legislativa',) list_filter = ('projeto','casa_legislativa','conveniada', 'equipada') #date_hierarchy = 'data_adesao' - ordering = ('casa_legislativa__municipio__uf','casa_legislativa','-id',) + ordering = ('casa_legislativa__tipo__sigla','casa_legislativa__municipio__uf','casa_legislativa') raw_id_fields = ('casa_legislativa',) queryset = queryset_ascii search_fields = ('id', 'search_text',#'casa_legislativa__nome', @@ -58,15 +60,34 @@ class ConvenioAdmin(admin.ModelAdmin): request, extra_context={'query_str': '?' + request.META['QUERY_STRING']} ) - def relatorio(modeladmin, request, queryset): + def relatorio(self, request, queryset): #queryset.order_by('casa_legislativa__municipio__uf') response = HttpResponse(mimetype='application/pdf') report = ConvenioReport(queryset=queryset) report.generate_by(PDFGenerator, filename=response) - return response - + return response relatorio.short_description = u'Exportar convênios selecionados para PDF' + def adicionar_convenios(self, request, queryset): + if request.session.has_key('carrinho_convenios'): + q1 = len(request.session['carrinho_convenios']) + else: + q1 = 0 + adicionar_convenios_carrinho(request,queryset=queryset) + q2 = len(request.session['carrinho_convenios']) + quant = q2 - q1 + if quant: + self.message_user(request,str(q2-q1)+" Convênios adicionados no carrinho" ) + else: + self.message_user(request,"Os Convênios selecionados já foram adicionadas anteriormente" ) + return HttpResponseRedirect('.') + adicionar_convenios.short_description = u"Armazenar convênios no carrinho para exportar" + + def get_actions(self, request): + actions = super(ConvenioAdmin, self).get_actions(request) + del actions['delete_selected'] + return actions + class EquipamentoPrevistoAdmin(admin.ModelAdmin): list_display = ('convenio', 'equipamento', 'quantidade') diff --git a/sigi/apps/convenios/templates/convenios/carrinho.html b/sigi/apps/convenios/templates/convenios/carrinho.html new file mode 100644 index 0000000..22d00c6 --- /dev/null +++ b/sigi/apps/convenios/templates/convenios/carrinho.html @@ -0,0 +1,98 @@ +{% extends "admin/carrinho.html" %} +{% load adminmedia admin_list i18n %} +{% block extrastyle %} + {{ block.super }} + {% include "admin/tabs_style.html" %} +{% endblock %} + +{% block title %}Convênios no Carrinho | SIGI{% endblock %} +{% block content_title %}

Convênios no Carrinho

{% endblock %} + +{% block mensagem%} + +{% endblock %} + +{% block action %}/convenios/convenio/carrinho/deleta_itens_carrinho{% endblock %} + +{% block tabela %} + + + + {%if not carIsEmpty%} + + {% endif %} + + + + + + + + + + {% for convenio in paginas.object_list %} + + {%if not carIsEmpty%} + + {% endif %} + + + + + + + + {% endfor %} + +
+ Numero do convênioCasa LegislativaAderidasConvêniadasEquipadasProjeto
{{convenio.num_convenio}}{{convenio.casa_legislativa}}{{convenio.data_adesao}}{{convenio.data_retorno_assinatura}}{{convenio.data_termo_aceite}}{{convenio.projeto}}
+{% endblock %} + +{% block botoes %} +
+ + +
+
+
+ Relatório por +
    +
  • + + +
  • +
  • + + +
  • +
+
+
+ Com data de aceite? (Equipada) +
    +
  • + + +
  • +
  • + + +
  • +
+
+
    +
  • +
+
+
+
+ {% endblock %} \ No newline at end of file diff --git a/sigi/apps/convenios/templates/convenios/change_list.html b/sigi/apps/convenios/templates/convenios/change_list.html index c29fb10..eea3b0c 100644 --- a/sigi/apps/convenios/templates/convenios/change_list.html +++ b/sigi/apps/convenios/templates/convenios/change_list.html @@ -3,65 +3,21 @@ {% block extrastyle %} {{ block.super }} - {% include "jquery/tabs_style.html" %} + {% include "admin/tabs_style.html" %} {% endblock %} {% block object-tools %} - {% if has_add_permission %} + {% if has_add_permission %} -
- - -
-

Escolha uma das opções abaixo para exportar todos os convênios listados. - Caso queira selecionar convênios especificos, utilize a opção "exportar - convênios selecionados" na caixa "Ação".

- -
-
-

Escolha uma das opções abaixo para obter um resumo de informações do Projeto Interlegis por região. - Outros projetos como PPM e PML não serão incluidos.

- -
-
- - + + {% endif %} {% endblock %} diff --git a/sigi/apps/convenios/templates/convenios/relatorio_por_regiao.html b/sigi/apps/convenios/templates/convenios/tabela_regiao.html similarity index 58% rename from sigi/apps/convenios/templates/convenios/relatorio_por_regiao.html rename to sigi/apps/convenios/templates/convenios/tabela_regiao.html index d5a6247..1f11bf4 100644 --- a/sigi/apps/convenios/templates/convenios/relatorio_por_regiao.html +++ b/sigi/apps/convenios/templates/convenios/tabela_regiao.html @@ -52,11 +52,12 @@ padding-top: 0.15cm; } #footerContent #esquerda{ - text-align: left; + text-align: left; } #footerContent #direita{ text-align: right; - } + background-image: url("/media/images/logo-senado.png"); + } .tabela { padding-top: 0.1cm; padding-left: 0.1cm; @@ -79,12 +80,8 @@ .tabela .sumario{ font-weight: bold; background-color: #CFCFCF; - } - .tabela .aderidas{ - /*background-color: #E8E8E8;*/ - border: blue solid; - } - .tabela .estado{ + } + .tabela .cabecalho_esquerda{ background-color: #E8E8E8; font-weight: bold; } @@ -102,53 +99,33 @@ Logo Interlegis -

Resumo por Região

+

{{tabela.regiao}}

- + - - - - - - - - - - + {%for item in tabela.cabecalho%} + + {%endfor%} - {%for r in lista%} - - - - - - - - - - - - - - {%endfor%} - - - - - - - - - - - - + {% for linha in tabela.linhas %} + + + {% for item in linha.lista %} + + {% endfor %} + + {% endfor %} + + + {% for item in tabela.sumario %} + + {% endfor %} +
{{sumario_regiao.regiao}}{{tabela.projeto}} - {{tabela.regiao}}
UFTotalNão Aderidas%Aderidas%Não Equipadas%Equipadas%{{item}}
{{r.estado}}{{r.quant_casas}}{{r.quant_casas_nao_aderidas}}{{r.porc_casas_nao_aderidas}}{{r.quant_casas_aderidas}}{{r.porc_casas_aderidas}}{{r.quant_casas_nao_equipadas}}{{r.porc_casas_nao_equipadas}}{{r.quant_casas_equipadas}}{{r.porc_casas_equipadas}}
Total{{sumario_regiao.total}}{{sumario_regiao.total_casas_nao_aderidas}}{{sumario_regiao.porc_casas_nao_aderidas}}{{sumario_regiao.total_casas_aderidas}}{{sumario_regiao.porc_casas_aderidas}}{{sumario_regiao.total_casas_nao_equipadas }}{{sumario_regiao.porc_casas_nao_equipadas }}{{sumario_regiao.total_casas_equipadas }}{{sumario_regiao.porc_casas_equipadas }}
{{linha.estado}}{{item}}
Total{{item}}
diff --git a/sigi/apps/convenios/views.py b/sigi/apps/convenios/views.py index 3e35d2b..67e957a 100644 --- a/sigi/apps/convenios/views.py +++ b/sigi/apps/convenios/views.py @@ -1,19 +1,23 @@ +#-*- coding:utf-8 -*- from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render_to_response, get_list_or_404 from geraldo.generators import PDFGenerator -from sigi.apps.convenios.models import Convenio -from sigi.apps.convenios.reports import ConvenioReport, \ - ConvenioPorCMReport, \ - ConvenioPorALReport, \ - ConvenioReportRegiao, \ - ConvenioReportSemAceiteAL, \ - ConvenioReportSemAceiteCM -from sigi.apps.casas.models import CasaLegislativa -from sigi.apps.contatos.models import UnidadeFederativa +from apps.convenios.models import Convenio +from apps.convenios.reports import ConvenioReport \ + ,ConvenioPorCMReport \ + ,ConvenioPorALReport \ + ,ConvenioReportSemAceiteAL \ + ,ConvenioReportSemAceiteCM +from apps.casas.models import CasaLegislativa +from apps.contatos.models import UnidadeFederativa import ho.pisa as pisa from django.template import Context, loader +from django.core.paginator import Paginator, InvalidPage, EmptyPage + +from django.conf import settings + import datetime def query_ordena(qs,o,ot): @@ -33,120 +37,147 @@ def get_for_qs(get,qs): kwargs = {} ids = 0 for k,v in get.iteritems(): - if not k == 'o': - if k == "ot": - qs = query_ordena(qs,get["o"],get["ot"]) - else: - kwargs[str(k)] = v - if(str(k)=='ids'): - ids = 1 - break - qs = qs.filter(**kwargs) + if not (k == 'page' or k == 'pop' or k == 'q'): + if not k == 'o': + if k == "ot": + qs = query_ordena(qs,get["o"],get["ot"]) + else: + kwargs[str(k)] = v + if(str(k)=='ids'): + ids = 1 + break + qs = qs.filter(**kwargs) if ids: query = 'id IN ('+ kwargs['ids'].__str__()+')' qs = Convenio.objects.extra(where=[query]) return qs -def report_por_cm(request, id=None): - qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM').order_by('casa_legislativa__municipio__uf','casa_legislativa') - if id: - qs = qs.filter(pk=id) - elif request.GET: #Se tiver algum parametro de pesquisa - qs = get_for_qs(request.GET,qs) - if not qs: - return HttpResponseRedirect('../') - response = HttpResponse(mimetype='application/pdf') - report = ConvenioPorCMReport(queryset=qs) - report.generate_by(PDFGenerator, filename=response) - return response +def carrinhoOrGet_for_qs(request): + """ + Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente. + """ + if request.session.has_key('carrinho_convenios'): + ids = request.session['carrinho_convenios'] + qs = Convenio.objects.filter(pk__in=ids) + else: + qs = Convenio.objects.all() + if request.GET: + qs = qs.order_by("casa_legislativa__municipio__uf","casa_legislativa__municipio") + qs = get_for_qs(request.GET,qs) + return qs -def report_por_al(request, id=None): - qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='AL').order_by('casa_legislativa__municipio__uf','casa_legislativa') - if id: - qs = qs.filter(pk=id) - elif request.GET: #Se tiver algum parametro de pesquisa - qs = get_for_qs(request.GET,qs) - if not qs: - return HttpResponseRedirect('../') - response = HttpResponse(mimetype='application/pdf') - report = ConvenioPorALReport(queryset=qs) - report.generate_by(PDFGenerator, filename=response) - return response +def adicionar_convenios_carrinho(request,queryset=None,id=None): + if request.method == 'POST': + ids_selecionados = request.POST.getlist('_selected_action') + if not request.session.has_key('carrinho_convenios'): + request.session['carrinho_convenios'] = ids_selecionados + else: + lista = request.session['carrinho_convenios'] + # Verifica se id já não está adicionado + for id in ids_selecionados: + if not id in lista: + lista.append(id) + request.session['carrinho_convenios'] = lista + +def excluir_carrinho(request): + if request.session.has_key('carrinho_convenios'): + del request.session['carrinho_convenios'] + return HttpResponseRedirect('.') -def report_semaceite_por_cm(request, id=None): - qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM').order_by('casa_legislativa__municipio__uf','casa_legislativa') - if id: - qs = qs.filter(pk=id) - elif request.GET: #Se tiver algum parametro de pesquisa - qs = get_for_qs(request.GET,qs) - if not qs: - return HttpResponseRedirect('../') - response = HttpResponse(mimetype='application/pdf') - report = ConvenioReportSemAceiteCM(queryset=qs) - report.generate_by(PDFGenerator, filename=response) - return response +def deleta_itens_carrinho(request): + if request.method == 'POST': + ids_selecionados = request.POST.getlist('_selected_action') + if request.session.has_key('carrinho_convenios'): + lista = request.session['carrinho_convenios'] + for item in ids_selecionados: + lista.remove(item) + if lista: + request.session['carrinho_convenios'] = lista + else: + del lista; + del request.session['carrinho_convenios'] + + return HttpResponseRedirect('.') -def report_semaceite_por_al(request, id=None): - qs = Convenio.objects.filter(casa_legislativa__tipo__sigla='AL').order_by('casa_legislativa__municipio__uf','casa_legislativa') +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(request.session.has_key('carrinho_convenios')) + + return render_to_response( + 'convenios/carrinho.html', + { + "ADMIN_MEDIA_PREFIX":settings.ADMIN_MEDIA_PREFIX, + 'MEDIA_URL':settings.MEDIA_URL, + 'carIsEmpty':carrinhoIsEmpty, + 'paginas':paginas, + 'query_str':'?'+request.META['QUERY_STRING'] + } + ) + +def report(request, id=None): + if id: - qs = qs.filter(pk=id) - elif request.GET: #Se tiver algum parametro de pesquisa - qs = get_for_qs(request.GET,qs) + qs = Convenio.objects.filter(pk=id) + else: + qs = carrinhoOrGet_for_qs(request) + if not qs: - return HttpResponseRedirect('../') - response = HttpResponse(mimetype='application/pdf') - report = ConvenioReportSemAceiteAL(queryset=qs) - report.generate_by(PDFGenerator, filename=response) - return response + return HttpResponseRedirect('../') - -class RelatorioRegiao(object): - def __init__(self, estado, casas, casas_aderidas, casas_equipadas,casas_nao_equipadas): - self.estado = estado - self.quant_casas = casas - self.quant_casas_aderidas = casas_aderidas - self.quant_casas_nao_aderidas = (casas - casas_aderidas) - self.quant_casas_equipadas = casas_equipadas - self.quant_casas_nao_equipadas = casas_nao_equipadas - if(casas!=0): - self.porc_casas_aderidas = "%.2f" % (float(casas_aderidas)*100/float(casas)) - self.porc_casas_nao_aderidas = "%.2f" % (float(self.quant_casas_nao_aderidas)*100/float(casas)) - else: - self.porc_casas_aderidas = 0 - self.porc_casas_nao_aderidas = 0 - - if(casas_aderidas!=0): - self.porc_casas_equipadas = "%.2f" % (float(casas_equipadas)*100/float(casas_aderidas)) - self.porc_casas_nao_equipadas = "%.2f" % (float(self.quant_casas_nao_equipadas)*100/float(casas_aderidas)) - else: - self.porc_casas_equipadas = 0 - self.porc_casas_nao_equipadas = 0 - -class RelatorioRegiaoTotal: - def __init__(self,regiao,total,total_casas_aderidas,total_casas_equipadas,total_casas_nao_equipadas): - self.regiao = regiao - self.total = total - self.total_casas_aderidas = total_casas_aderidas - self.total_casas_nao_aderidas = (total - total_casas_aderidas) - self.total_casas_equipadas = total_casas_equipadas - self.total_casas_nao_equipadas = total_casas_nao_equipadas - - if(total!=0): - self.porc_casas_aderidas = "%.2f" % (float(self.total_casas_aderidas)*100/float(total)) - self.porc_casas_nao_aderidas = "%.2f" % (float(self.total_casas_nao_aderidas)*100/float(total)) - else: - self.porc_casas_aderidas = 0 - self.porc_casas_nao_aderidas = 0 - - if(total_casas_aderidas!=0): - self.porc_casas_equipadas = "%.2f" % (float(self.total_casas_equipadas)*100/float(total_casas_aderidas)) - self.porc_casas_nao_equipadas = "%.2f" % (float(total_casas_nao_equipadas)*100/float(total_casas_aderidas)) + tipo = '' + data_aceite_has = '' + report = None + if request.POST: + if request.POST.has_key('filtro_casa'): + tipo = request.POST['filtro_casa'] + if request.POST.has_key('data_aceite'): + data_aceite_has = request.POST['data_aceite'] + # Verifica filtro se é por Assembleia + if tipo == 'al': + qs = qs.filter(casa_legislativa__tipo__sigla='AL') + # Verifica se é com data de aceite + if data_aceite_has == 'nao': + report = ConvenioReportSemAceiteAL(queryset=qs) + else: + report = ConvenioPorALReport(queryset=qs) else: - self.porc_casas_equipadas = 0 - self.porc_casas_nao_equipadas = 0 + qs = qs.filter(casa_legislativa__tipo__sigla='CM') + if data_aceite_has == 'nao': + report = ConvenioReportSemAceiteCM(queryset=qs) + else: + report = ConvenioPorCMReport(queryset=qs) + + + response = HttpResponse(mimetype='application/pdf') + if report: + report.generate_by(PDFGenerator, filename=response) + else: + return HttpResponseRedirect('../') + return response def report_regiao(request,regiao='NE'): + + if request.POST: + if request.POST.has_key('regiao'): + regiao = request.POST['regiao'] REGIAO_CHOICES = { 'SL': 'Sul', @@ -154,54 +185,108 @@ def report_regiao(request,regiao='NE'): 'CO': 'Centro-Oeste', 'NE': 'Nordeste', 'NO': 'Norte', - } + } + + camaras = CasaLegislativa.objects.filter(tipo__sigla='CM') + convenios = Convenio.objects.filter(casa_legislativa__tipo__sigla='CM',projeto__sigla='PI') + + camaras_sem_processo = camaras.exclude(convenio__projeto__sigla='PI') + + convenios_assinados = convenios.exclude(data_retorno_assinatura=None) + convenios_em_andamento = convenios.filter(data_retorno_assinatura=None) - get_list_or_404(UnidadeFederativa,regiao=regiao) + convenios_sem_adesao = convenios.filter(data_adesao=None) + convenios_com_adesao = convenios.exclude(data_adesao=None) + convenios_com_aceite = convenios.exclude(data_termo_aceite=None) + # Contando casas por estado estados = get_list_or_404(UnidadeFederativa,regiao=regiao) - + + class LinhaEstado(): + pass + lista = [] + for estado in estados: - - casas = CasaLegislativa.objects.filter(municipio__uf=estado) - casas_aderidas = casas.exclude(convenio=None).distinct() - casas_equipadas = casas_aderidas.exclude(convenio__data_termo_aceite=None).distinct() - casas_nao_equipadas = casas_aderidas.filter(convenio__data_termo_aceite=None).distinct() - - lista.append( - RelatorioRegiao( - estado.sigla,casas.count(), - casas_aderidas.count(), - casas_equipadas.count(), - casas_nao_equipadas.count() - ) + linha = LinhaEstado() + conv_sem_adesao_est = convenios_sem_adesao.filter(casa_legislativa__municipio__uf=estado) + conv_com_adesao_est = convenios_com_adesao.filter(casa_legislativa__municipio__uf=estado) + conv_assinados_est = convenios_assinados.filter(casa_legislativa__municipio__uf=estado) + conv_em_andamento_est = convenios_em_andamento.filter(casa_legislativa__municipio__uf=estado) + conv_equipadas_est = convenios_com_aceite.filter(casa_legislativa__municipio__uf=estado) + + camaras_est = camaras.filter(municipio__uf=estado,tipo__sigla='CM').count() + camaras_sem_processo_est = camaras_sem_processo.filter(municipio__uf=estado).count() + camaras_nao_aderidas_est = camaras.filter(convenio__in=conv_sem_adesao_est).count() + camaras_aderidas_est = camaras.filter(convenio__in=conv_com_adesao_est).count() + camaras_convenios_assinados_est = camaras.filter(convenio__in=conv_assinados_est).count() + camaras_convenios_em_andamento_est = camaras.filter(convenio__in=conv_em_andamento_est).count() + camaras_equipadas_est = camaras.filter(convenio__in=conv_equipadas_est).count() + + linha.lista = ( + camaras_est, + camaras_sem_processo_est, + camaras_nao_aderidas_est, + camaras_aderidas_est, + camaras_convenios_assinados_est, + camaras_convenios_em_andamento_est, + camaras_equipadas_est, ) - - # Total de casas na regiao - casas = CasaLegislativa.objects.filter(municipio__uf__regiao=regiao) - casas_aderidas = casas.exclude(convenio=None).distinct() - casas_equipadas = casas_aderidas.exclude(convenio__data_termo_aceite=None).distinct() - casas_nao_equipadas = casas_aderidas.filter(convenio__data_termo_aceite=None).distinct() - sumario_regiao = RelatorioRegiaoTotal( - REGIAO_CHOICES[regiao], - casas.count(), - casas_aderidas.count(), - casas_equipadas.count(), - casas_nao_equipadas.count(), - ) - -# response = HttpResponse(mimetype='application/pdf') -# relatorio = ConvenioReportRegiao(queryset=lista) -# relatorio.generate_by(PDFGenerator, filename=response) + + linha.estado = estado.sigla + + lista.append(linha) + # Total + total_cm = camaras.filter(municipio__uf__regiao=regiao,tipo__sigla='CM').count() + total_sem_processo = camaras_sem_processo.filter(municipio__uf__regiao=regiao).count() + total_sem_adesao = camaras.filter(convenio__in=convenios_sem_adesao,municipio__uf__regiao=regiao).count() + total_com_adesao = camaras.filter(convenio__in=convenios_com_adesao,municipio__uf__regiao=regiao).count() + total_conv_assin = camaras.filter(convenio__in=convenios_assinados,municipio__uf__regiao=regiao).count() + total_conv_andam = camaras.filter(convenio__in=convenios_em_andamento,municipio__uf__regiao=regiao).count() + total_equipadas = camaras.filter(convenio__in=convenios_com_aceite,municipio__uf__regiao=regiao).count() + + sumario = [ + total_cm, + total_sem_processo, + total_sem_adesao, + total_com_adesao, + total_conv_assin, + total_conv_andam, + total_equipadas, + ] + + + + + cabecalho_topo = ( + u'UF', + u'Câmaras municipais', + u'Sem processo', + u'Sem adesão', + u'Com adesão', + u'Convênios assinados', + u'Convênios andamento', + u'Equipadas' + ) + + projeto = "Projeto Interlegis" + + tabela = { + "regiao":REGIAO_CHOICES[regiao], + "linhas":lista, + "cabecalho":cabecalho_topo, + "sumario":sumario, + "projeto":projeto, + } data = datetime.datetime.now().strftime('%d/%m/%Y') hora = datetime.datetime.now().strftime('%H:%M') pisa.showLogging() response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=RelatorioRegiao_' + regiao + '.pdf' - t = loader.get_template('convenios/relatorio_por_regiao.html') - c = Context({'lista': lista,'sumario_regiao':sumario_regiao,'data':data,'hora':hora}) + t = loader.get_template('convenios/tabela_regiao.html') + c = Context({'tabela':tabela,'data':data,'hora':hora}) pdf = pisa.CreatePDF(t.render(c),response) if not pdf.err: pisa.startViewer(response) diff --git a/sigi/templates/admin/carrinho.html b/sigi/templates/admin/carrinho.html new file mode 100644 index 0000000..38ca4c7 --- /dev/null +++ b/sigi/templates/admin/carrinho.html @@ -0,0 +1,109 @@ +{% extends "admin/change_list.html" %} +{% load adminmedia admin_list i18n %} +{% block extrastyle %} + {{ block.super }} + + +{% endblock %} + + +{% block branding %} {% endblock %} +{% block userlinks %} {% endblock %} +{% block nav-global %} {% endblock %} + +{% block title %}Carrinho | SIGI{% endblock %} +{% block content_title %}

Carrinho

{% endblock %} + +{% block content %} +
+ + + {% block mensagem %} + + {% endblock %} + + +
+
+ {%if not carIsEmpty%} +
+ +
+ {% endif %} +
+ {% block tabela %}{% endblock %} +
+ {%if not carIsEmpty%} +
+ +
+ {% endif %} + +
+ + {% if paginas.has_previous %} + Anterior + {% endif %} + + + Página {{ paginas.number }} of {{ paginas.paginator.num_pages }}. + + + {% if paginas.has_next %} + Próxima + {% endif %} + + {{paginas.paginator.count}} itens +
+
+ + {% block botoes %}{% endblock %} + +
+ +
+{% endblock %} + +{% block footer %}{% endblock %} + diff --git a/sigi/templates/jquery/tabs_style.html b/sigi/templates/admin/tabs_style.html similarity index 52% rename from sigi/templates/jquery/tabs_style.html rename to sigi/templates/admin/tabs_style.html index 8ce3817..61bbcb1 100644 --- a/sigi/templates/jquery/tabs_style.html +++ b/sigi/templates/admin/tabs_style.html @@ -7,27 +7,25 @@ + + - + - - + + + diff --git a/sigi/templates/snippets/modules/charts-convenios.html b/sigi/templates/snippets/modules/charts-convenios.html index b54853f..145276f 100644 --- a/sigi/templates/snippets/modules/charts-convenios.html +++ b/sigi/templates/snippets/modules/charts-convenios.html @@ -58,6 +58,26 @@ +
+

Resumo de informações

+

Resumo de informações por região

+
+

+ Resumo de informações de Câmaras Municipais por região levando em conta + apenas o Projeto Interlegis. Demais projetos como PPM e PML não estão inclusos. +

+ + + +
+
+

Convênios

Processos de convênios por projeto

diff --git a/sigi/urls.py b/sigi/urls.py index 095364c..3916f43 100644 --- a/sigi/urls.py +++ b/sigi/urls.py @@ -1,16 +1,19 @@ +#-*- coding:utf-8 -*- from django.conf import settings from django.conf.urls.defaults import * -from sigi import sites +import sites # register admin filters -import sigi.admin.filterspecs +import admin.filterspecs urlpatterns = patterns( '', # Informacoes de uma casa legislativa - (r'^casas/casalegislativa/(?P\w+)/casa_info/', - 'sigi.apps.casas.views.casa_info'), + (r'^casas/casalegislativa/(?P\w+)/report_complete/', + 'sigi.apps.casas.views.report_complete'), + (r'^casas/casalegislativa/report_complete/', + 'sigi.apps.casas.views.report_complete'), # reports labels (r'^casas/casalegislativa/labels/', 'sigi.apps.casas.views.labels_report'), @@ -21,24 +24,35 @@ urlpatterns = patterns( 'sigi.apps.casas.views.labels_report_sem_presidente'), (r'^casas/casalegislativa/(?P\w+)/labels_sem_presidente/', 'sigi.apps.casas.views.labels_report_sem_presidente'), - # reports + # reports casa (r'^casas/casalegislativa/reports/', - 'sigi.apps.casas.views.report'), - (r'^casas/casalegislativa/csv/', - 'sigi.apps.casas.views.export_csv'), + 'sigi.apps.casas.views.report'), (r'^casas/casalegislativa/casas_sem_convenio_report/', 'sigi.apps.casas.views.casas_sem_convenio_report'), - (r'^convenios/convenio/reports_por_cm/', - 'sigi.apps.convenios.views.report_por_cm'), - (r'^convenios/convenio/reports_por_al/', - 'sigi.apps.convenios.views.report_por_al'), - (r'^convenios/convenio/reportsRegiao/(?P\w+)', - 'sigi.apps.convenios.views.report_regiao'), - #reports sem data de aceite - (r'^convenios/convenio/report_semaceite_por_cm/', - 'sigi.apps.convenios.views.report_semaceite_por_cm'), - (r'^convenios/convenio/report_semaceite_por_al/', - 'sigi.apps.convenios.views.report_semaceite_por_al'), + # reports convenios + (r'^convenios/convenio/reports/', + 'sigi.apps.convenios.views.report'), + #Carrinho Casa + (r'^casas/casalegislativa/carrinho/deleta_itens_carrinho', + 'sigi.apps.casas.views.deleta_itens_carrinho'), + (r'^casas/casalegislativa/carrinho/excluir_carrinho', + 'sigi.apps.casas.views.excluir_carrinho'), + (r'^casas/casalegislativa/carrinho/', + 'sigi.apps.casas.views.visualizar_carrinho'), + #Carrinho Convenio + (r'^convenios/convenio/carrinho/deleta_itens_carrinho', + 'sigi.apps.convenios.views.deleta_itens_carrinho'), + (r'^convenios/convenio/carrinho/excluir_carrinho', + 'sigi.apps.convenios.views.excluir_carrinho'), + (r'^convenios/convenio/carrinho/', + 'sigi.apps.convenios.views.visualizar_carrinho'), + #CSV Casa + (r'^casas/casalegislativa/csv/', + 'sigi.apps.casas.views.export_csv'), + # Resumo por região PDF + (r'^reportsRegiao/(?P\w+)', + 'sigi.apps.convenios.views.report_regiao'), + # automatic interface based on admin (r'^(.*)', sites.default.root), )