mirror of https://github.com/interlegis/sigi.git
Sesostris Vieira
2 years ago
5 changed files with 247 additions and 439 deletions
@ -0,0 +1,120 @@ |
|||||
|
{% load static i18n %}<!DOCTYPE html> |
||||
|
<html lang="pt_BR"> |
||||
|
<head> |
||||
|
<meta charset="UTF-8"> |
||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.2/font/bootstrap-icons.css"> |
||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> |
||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script> |
||||
|
<title>Órgãos Legislativos atendidos pelo Interlegis</title> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div class="mb-5"> |
||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light"> |
||||
|
<div class="container-fluid"> |
||||
|
<a class="navbar-brand" href="{% url 'openmap' %}">Interlegis</a> |
||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> |
||||
|
<span class="navbar-toggler-icon"></span> |
||||
|
</button> |
||||
|
<div class="collapse navbar-collapse" id="navbarSupportedContent"> |
||||
|
<ul class="navbar-nav me-auto mb-2 mb-lg-0"> |
||||
|
<li class="nav-item"> |
||||
|
<a class="nav-link" aria-current="page" href="{% url 'servicos_casas_atendidas' %}">{% trans "Tudo" %}</a> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<a class="nav-link" aria-current="page" href="{% url 'servicos_casas_atendidas' 'ZZ' %}">{% trans "Estrangeiros" %}</a> |
||||
|
</li> |
||||
|
{% for regiao, ufs in regioes %} |
||||
|
<li class="nav-item dropdown"> |
||||
|
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown-{{ regiao }}" role="button" data-bs-toggle="dropdown" aria-expanded="false"> |
||||
|
{{ regiao }} |
||||
|
</a> |
||||
|
<ul class="dropdown-menu" aria-labelledby="navbarDropdown-{{ regiao }}"> |
||||
|
{% for uf in ufs %} |
||||
|
<li><a class="dropdown-item" href="{% url 'servicos_casas_atendidas' uf.sigla %}">{{ uf.nome }}</a></li> |
||||
|
{% endfor %} |
||||
|
</ul> |
||||
|
</li> |
||||
|
{% endfor %} |
||||
|
</ul> |
||||
|
<ul class="navbar-nav mb-2 mb-lg-0"> |
||||
|
<li class="nav-item"> |
||||
|
<a class="nav-link btn btn-outline-primary" aria-current="page" href="?format=csv{% if search_param %}?search={{ search_param }}{% endif %}"><i class="bi bi-filetype-pdf"></i> {% trans "Download CSV" %}</a> |
||||
|
</li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
</div> |
||||
|
</nav> |
||||
|
<div class="container mt-3"> |
||||
|
<div class="alert alert-info" role="alert"> |
||||
|
{% blocktranslate count counter=tot_orgaos %} |
||||
|
Um órgão encontrado |
||||
|
{% plural %} |
||||
|
{{ counter }} órgãos encontrados |
||||
|
{% endblocktranslate %} |
||||
|
{% if uf %} |
||||
|
{% blocktranslate with uf_name=uf.nome%} em {{ uf_name}}{% endblocktranslate %} |
||||
|
{% endif %} |
||||
|
{% if search_param %} |
||||
|
{% blocktranslate with exp=search_param %} que contém <em>{{ exp }}</em>.{% endblocktranslate %} |
||||
|
{% endif %} |
||||
|
</div> |
||||
|
<form class="d-flex"> |
||||
|
<div class="input-group"> |
||||
|
<input class="form-control" name="search"{% if search_param %} value="{{ search_param }}"{% endif %} type="search" placeholder="{% trans "Pesquisar" %}" aria-label="{% trans "Pesquisar" %}"> |
||||
|
<button class="btn btn-secondary" type="submit"><i class="bi bi-search"></i></button> |
||||
|
</div> |
||||
|
</form> |
||||
|
{% include "servicos/navigator_snippet.html" %} |
||||
|
{% for srv in page_obj %} |
||||
|
{% ifchanged srv.casa_legislativa %} |
||||
|
{% if not forloop.first %} |
||||
|
</table></div></div></div> |
||||
|
{% endif %} |
||||
|
|
||||
|
{% ifchanged srv.casa_legislativa.municipio.uf %} |
||||
|
<h6 class="mt-3">{% blocktranslate with nome_uf=srv.casa_legislativa.municipio.uf.nome%}Unidade da Federação: {{ nome_uf }}{% endblocktranslate %}</h6> |
||||
|
{% endifchanged %} |
||||
|
|
||||
|
<div class="card text-dark bg-light shadow mb-3"> |
||||
|
<div class="card-header"> |
||||
|
<div class="d-inline-flex"> |
||||
|
<div class="me-3 d-none d-lg-block"> |
||||
|
{% if srv.casa_legislativa.foto %} |
||||
|
<img src="{{ srv.casa_legislativa.foto.url }}" style="height: 120px;" height="120"/> |
||||
|
{% else %} |
||||
|
<i class="bi bi-buildings" style="font-size: 5rem;"></i> |
||||
|
{% endif %} |
||||
|
</div> |
||||
|
<div class="d-block"> |
||||
|
<strong>{{ srv.casa_legislativa.nome }}</strong><br/> |
||||
|
<small>{{ srv.casa_legislativa.cnpj}} - {{ srv.casa_legislativa.tipo.nome }}</small> |
||||
|
<address> |
||||
|
<strong>{{ srv.casa_legislativa.logradouro }} {{ srv.casa_legislativa.bairro }}</strong><br/> |
||||
|
{{ srv.casa_legislativa.cep }} - {{ srv.casa_legislativa.municipio.nome }}, {{ srv.casa_legislativa.municipio.uf.sigla }}<br/> |
||||
|
<a href="mailto:{{ srv.casa_legislativa.email }}" target="_blank">{{ srv.casa_legislativa.email }}</a> - <a href="tel:{{ srv.casa_legislativa.telefone|phone2numeric }}" target="_blank">{{ srv.casa_legislativa.telefone }}</a> |
||||
|
</address> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="card-body"> |
||||
|
<div class="table-responsive"> |
||||
|
<table class="table table-sm"> |
||||
|
<tr> |
||||
|
<th>{% trans "Tipo de serviço" %}</th> |
||||
|
<th>{% trans "Data de instalação" %}</th> |
||||
|
<th>{% trans "URL de acesso" %}</th> |
||||
|
</tr> |
||||
|
{% endifchanged %} |
||||
|
<tr> |
||||
|
<td>{{ srv.tipo_servico.nome }}</td> |
||||
|
<td>{{ srv.data_ativacao|date:"SHORT_DATE_FORMAT" }}</td> |
||||
|
<td><a href="{{ srv.url}}" target="_blank">{{ srv.url}}</a></td> |
||||
|
</tr> |
||||
|
{% endfor %} |
||||
|
</table></div></div></div> |
||||
|
{% include "servicos/navigator_snippet.html" %} |
||||
|
</div> |
||||
|
</div> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,14 @@ |
|||||
|
{% load i18n %} |
||||
|
{% if paginator.num_pages > 1 %} |
||||
|
<div class="table-responsive"> |
||||
|
<nav aria-label="Page navigation"> |
||||
|
<ul class="pagination pagination-sm mt-3"> |
||||
|
<li class="page-item{% if not page_obj.has_previous %} disabled{% endif %}"><a class="page-link" href="?page={% if page_obj.has_previous %}{{ page_obj.previous_page_number }}{% else %}1{% endif %}" aria-label="{% trans "Página anterior" %}"><i class="bi bi-chevron-double-left"></i></a></li> |
||||
|
{% for page in paginator.page_range %} |
||||
|
<li class="page-item{% if page == page_obj.number %} active{% endif %} "><a class="page-link" href="?page={{ page }}">{{ page }}</a></li> |
||||
|
{% endfor %} |
||||
|
<li class="page-item{% if not page_obj.has_next %} disabled{% endif %}"><a class="page-link" href="?page={% if page_obj.has_next %}{{ page_obj.next_page_number }}{% else %}1{% endif %}" aria-label="{% trans "Próxima página" %}"><i class="bi bi-chevron-double-right"></i></a></li> |
||||
|
</ul> |
||||
|
</nav> |
||||
|
</div> |
||||
|
{% endif %} |
@ -1,34 +1,16 @@ |
|||||
# coding: utf-8 |
from django.urls import path |
||||
from django.conf.urls import patterns, url |
from sigi.apps.servicos import views |
||||
from django.views.generic.base import TemplateView |
|
||||
|
|
||||
from .views import MapaView |
urlpatterns = [ |
||||
|
path( |
||||
|
"casasatendidas/", |
||||
urlpatterns = patterns( |
views.CasasAtendidasListView.as_view(), |
||||
"sigi.apps.servicos.views", |
name="servicos_casas_atendidas", |
||||
url(r"^manifesta/$", "casa_manifesta_view", name="casa-manifesta-view"), |
kwargs={"sigla_uf": "_all_"}, |
||||
url( |
|
||||
r"^servico/carrinho/$", |
|
||||
"visualizar_carrinho", |
|
||||
name="visualizar-carrinho", |
|
||||
), |
), |
||||
url( |
path( |
||||
r"^servico/carrinho/excluir_carrinho/$", |
"casasatendidas/<str:sigla_uf>/", |
||||
"excluir_carrinho", |
views.CasasAtendidasListView.as_view(), |
||||
name="excluir-carrinho", |
name="servicos_casas_atendidas", |
||||
), # tagerror |
|
||||
url( |
|
||||
r"^servico/carrinho/deleta_itens_carrinho$", |
|
||||
"deleta_itens_carrinho", |
|
||||
name="deleta-itens-carrinho", |
|
||||
), # tagerror |
|
||||
url(r"^servico/csv/$", "export_csv", name="servicos-csv"), |
|
||||
url( |
|
||||
r"^munatenjson/(?P<servico>\w+)/$", |
|
||||
"municipios_atendidos", |
|
||||
name="municipios-atendidos", |
|
||||
), |
), |
||||
url(r"^mapa/(?P<servico>\w+)/$", MapaView.as_view(), name="servicos-mapa"), |
] |
||||
# url(r'^listacasas/(?P<sigla>\w+)', 'casas_usam_servico', name="casas-usam-servico"), |
|
||||
) |
|
||||
|
@ -1,422 +1,113 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
import csv |
import csv |
||||
import json as simplejson # XXX trocar isso por simplesmente import json e refatorar o codigo |
|
||||
|
|
||||
from django import forms |
|
||||
from django.contrib import messages |
|
||||
from django.contrib.auth.decorators import login_required |
|
||||
from django.core.paginator import EmptyPage, InvalidPage, Paginator |
|
||||
from django.db.models import Q |
from django.db.models import Q |
||||
from django.forms.forms import BoundField |
|
||||
from django.http import HttpResponse |
from django.http import HttpResponse |
||||
from django.http.response import HttpResponseRedirect |
from django.shortcuts import render |
||||
from django.shortcuts import render, render_to_response, get_object_or_404 |
|
||||
from django.template.context import RequestContext |
|
||||
from django.utils.translation import gettext as _ |
from django.utils.translation import gettext as _ |
||||
from django.views.generic.base import TemplateView |
from django.views.generic import ListView |
||||
|
from import_export import resources |
||||
|
from import_export.fields import Field |
||||
from sigi.apps.casas.models import Orgao |
from sigi.apps.casas.models import Orgao |
||||
from sigi.apps.contatos.models import UnidadeFederativa |
from sigi.apps.contatos.models import UnidadeFederativa |
||||
from sigi.apps.convenios.views import normaliza_data, query_ordena |
from sigi.apps.servicos.models import Servico |
||||
from sigi.apps.servicos.models import ( |
from sigi.apps.utils import to_ascii |
||||
Servico, |
|
||||
TipoServico, |
|
||||
CasaManifesta, |
class ServicoResource(resources.ModelResource): |
||||
CasaAtendida, |
telefone = Field(column_name="casa_legislativa__telefone") |
||||
ServicoManifesto, |
|
||||
) |
class Meta: |
||||
|
model = Servico |
||||
|
fields = [ |
||||
class MapaView(TemplateView): |
"casa_legislativa__cnpj", |
||||
|
"casa_legislativa__nome", |
||||
template_name = "servicos/mapa.html" |
"casa_legislativa__tipo__nome", |
||||
|
"casa_legislativa__logradouro", |
||||
def get_context_data(self, **kwargs): |
"casa_legislativa__bairro", |
||||
context = super(MapaView, self).get_context_data(**kwargs) |
"casa_legislativa__cep", |
||||
context["servicos"] = TipoServico.objects.all() |
"casa_legislativa__municipio__nome", |
||||
return context |
"casa_legislativa__municipio__uf__sigla", |
||||
|
"casa_legislativa__email", |
||||
|
"telefone", |
||||
def municipios_atendidos(self, servico): |
"tipo_servico__nome", |
||||
municipios = [] |
"data_ativacao", |
||||
servico = servico.upper() |
"url", |
||||
|
|
||||
query = Q() |
|
||||
|
|
||||
if servico != "ALL": |
|
||||
for sigla in servico.split("_"): |
|
||||
query = query | Q(tipo_servico__sigla=sigla) |
|
||||
|
|
||||
query = Q(data_desativacao=None) & query |
|
||||
|
|
||||
for casa in CasaAtendida.objects.all(): |
|
||||
if casa.servico_set.filter(query).exists(): |
|
||||
m = casa.municipio |
|
||||
municipio = { |
|
||||
"nome": casa.nome + ", " + m.uf.sigla, |
|
||||
"lat": str(m.latitude), |
|
||||
"lng": str(m.longitude), |
|
||||
"servicos": "<ul><li>" |
|
||||
+ "</li><li>".join( |
|
||||
[ |
|
||||
s.tipo_servico.nome |
|
||||
for s in casa.servico_set.filter(query) |
|
||||
] |
] |
||||
|
export_order = fields |
||||
|
|
||||
|
def dehydrate_telefone(self, servico): |
||||
|
return servico.casa_legislativa.telefone |
||||
|
|
||||
|
|
||||
|
class CasasAtendidasListView(ListView): |
||||
|
model = Servico |
||||
|
template_name = "servicos/casas_atendidas.html" |
||||
|
paginate_by = 100 |
||||
|
|
||||
|
def get_queryset(self): |
||||
|
sigla = self.kwargs["sigla_uf"] |
||||
|
search_param = self.request.GET.get("search", None) |
||||
|
queryset = super().get_queryset() |
||||
|
queryset = ( |
||||
|
queryset.filter( |
||||
|
data_desativacao=None, casa_legislativa__tipo__legislativo=True |
||||
|
) |
||||
|
.select_related( |
||||
|
"tipo_servico", |
||||
|
"casa_legislativa", |
||||
|
"casa_legislativa__municipio", |
||||
|
"casa_legislativa__municipio__uf", |
||||
|
"casa_legislativa__tipo", |
||||
|
) |
||||
|
.order_by( |
||||
|
"casa_legislativa__municipio__uf__nome", |
||||
|
"casa_legislativa__tipo__nome", |
||||
|
"casa_legislativa__nome", |
||||
|
"tipo_servico__nome", |
||||
|
) |
||||
|
) |
||||
|
if search_param: |
||||
|
filter = [ |
||||
|
Q(casa_legislativa__search_text__icontains=to_ascii(t.lower())) |
||||
|
for t in search_param.split() |
||||
|
] |
||||
|
queryset = queryset.filter(*filter) |
||||
|
if sigla != "_all_": |
||||
|
queryset = queryset.filter( |
||||
|
casa_legislativa__municipio__uf__sigla=sigla |
||||
) |
) |
||||
+ "</li></ul>", |
return queryset |
||||
} |
|
||||
municipios.append(municipio) |
|
||||
|
|
||||
return HttpResponse( |
|
||||
simplejson.dumps(municipios), content_type="application/json" |
|
||||
) |
|
||||
|
|
||||
|
|
||||
class CasaManifestaProtoForm(forms.Form): |
|
||||
fieldsets = None |
|
||||
informante = forms.CharField(max_length=100, required=False) |
|
||||
cargo = forms.CharField(max_length=100, required=False) |
|
||||
email = forms.EmailField(required=False) |
|
||||
|
|
||||
def set_fieldsets(self, fieldsets): |
|
||||
result = [] |
|
||||
for name, lines in fieldsets: |
|
||||
field_lines = [] |
|
||||
for line in lines: |
|
||||
if isinstance(line, str): |
|
||||
line = (line,) |
|
||||
field_line = [] |
|
||||
for field_name in line: |
|
||||
field = self.fields[field_name] |
|
||||
bf = BoundField(self, field, field_name) |
|
||||
field_line.append(bf) |
|
||||
field_lines.append(field_line) |
|
||||
result.append( |
|
||||
{"name": name, "lines": field_lines}, |
|
||||
) |
|
||||
self.fieldsets = result |
|
||||
|
|
||||
|
|
||||
def casa_manifesta_view(request): |
|
||||
if "casa_id" in request.GET: |
|
||||
casa_id = request.GET.get("casa_id") |
|
||||
casa = get_object_or_404(Orgao, pk=casa_id) |
|
||||
|
|
||||
# Criar um formulário dinâmico |
|
||||
|
|
||||
campos = {} |
|
||||
fieldsets = ( |
|
||||
( |
|
||||
None, |
|
||||
("informante", "cargo", "email"), |
|
||||
), |
|
||||
) |
|
||||
|
|
||||
for ts in TipoServico.objects.all(): |
def get_context_data(self, **kwargs): |
||||
campos["possui_%s" % ts.pk] = forms.BooleanField( |
context = super().get_context_data(**kwargs) |
||||
label=_("Possui o serviço de %s") % ts.nome, required=False |
sigla = self.kwargs["sigla_uf"] |
||||
) |
context["tot_orgaos"] = ( |
||||
campos["url_%s" % ts.pk] = forms.URLField( |
self.get_queryset() |
||||
label=_("Informe a URL"), required=False |
.order_by() |
||||
) |
.distinct("casa_legislativa__id") |
||||
campos["hospedagem_interlegis_%s" % ts.pk] = forms.BooleanField( |
.count() |
||||
label=_("Serviço está hospedado no Interlegis"), required=False |
) |
||||
) |
context["regioes"] = [ |
||||
fieldsets += ( |
|
||||
( |
|
||||
ts.nome, |
|
||||
( |
( |
||||
"possui_%s" % ts.pk, |
regiao, |
||||
"url_%s" % ts.pk, |
UnidadeFederativa.objects.filter(regiao=r).exclude(sigla="ZZ"), |
||||
"hospedagem_interlegis_%s" % ts.pk, |
|
||||
), |
|
||||
), |
|
||||
) |
|
||||
|
|
||||
CasaManifestaForm = type("", (CasaManifestaProtoForm,), campos) |
|
||||
|
|
||||
if request.method == "POST": |
|
||||
cmf = CasaManifestaForm(request.POST) |
|
||||
if cmf.is_valid(): |
|
||||
thanks = [] |
|
||||
cm, created = CasaManifesta.objects.get_or_create( |
|
||||
casa_legislativa=casa |
|
||||
) |
|
||||
cm.informante = cmf.cleaned_data["informante"] |
|
||||
cm.cargo = cmf.cleaned_data["cargo"] |
|
||||
cm.email = cmf.cleaned_data["email"] |
|
||||
cm.save() |
|
||||
thanks.append((_("Informante"), cmf.cleaned_data["informante"])) |
|
||||
thanks.append((_("Cargo"), cmf.cleaned_data["cargo"])) |
|
||||
thanks.append((_("E-mail"), cmf.cleaned_data["email"])) |
|
||||
for ts in TipoServico.objects.all(): |
|
||||
if cmf.cleaned_data["possui_%s" % ts.pk]: |
|
||||
sm, created = ServicoManifesto.objects.get_or_create( |
|
||||
casa_manifesta=cm, servico=ts |
|
||||
) |
) |
||||
sm.url = cmf.cleaned_data["url_%s" % ts.pk] |
for r, regiao in UnidadeFederativa.REGIAO_CHOICES |
||||
sm.hospedagem_interlegis = cmf.cleaned_data[ |
|
||||
"hospedagem_interlegis_%s" % ts.pk |
|
||||
] |
] |
||||
sm.save() |
context["search_param"] = self.request.GET.get("search", None) |
||||
thanks.append( |
if sigla != "_all_": |
||||
( |
context["uf"] = UnidadeFederativa.objects.get(sigla=sigla) |
||||
ts.nome, |
return context |
||||
_( |
|
||||
"Possui o serviço acessível em %(url)s %(obs)s" |
|
||||
) |
|
||||
% dict( |
|
||||
url=sm.url, |
|
||||
obs=_("hospedado no Interlegis") |
|
||||
if sm.hospedagem_interlegis |
|
||||
else "", |
|
||||
), |
|
||||
) |
|
||||
) |
|
||||
else: |
|
||||
ServicoManifesto.objects.filter( |
|
||||
casa_manifesta=cm, servico=ts |
|
||||
).delete() |
|
||||
thanks.append((ts.nome, _("Não possui"))) |
|
||||
extra_context = {"casa": casa, "thanks": thanks} |
|
||||
else: |
|
||||
extra_context = {"casa": casa, "cmf": cmf} |
|
||||
else: |
|
||||
try: |
|
||||
cm = casa.casamanifesta |
|
||||
values = { |
|
||||
"informante": cm.informante, |
|
||||
"cargo": cm.cargo, |
|
||||
"email": cm.email, |
|
||||
} |
|
||||
for sm in cm.servicomanifesto_set.all(): |
|
||||
values["possui_%s" % sm.servico.pk] = True |
|
||||
values["url_%s" % sm.servico.pk] = sm.url |
|
||||
values[ |
|
||||
"hospedagem_interlegis_%s" % sm.servico.pk |
|
||||
] = sm.hospedagem_interlegis |
|
||||
cmf = CasaManifestaForm(values) |
|
||||
except: |
|
||||
cmf = CasaManifestaForm() |
|
||||
|
|
||||
cmf.set_fieldsets(fieldsets) |
|
||||
|
|
||||
extra_context = {"casa": casa, "cmf": cmf} |
|
||||
elif "uf" in request.GET: |
|
||||
uf = request.GET.get("uf") |
|
||||
extra_context = { |
|
||||
"casa_list": Orgao.objects.filter(municipio__uf__sigla=uf) |
|
||||
} |
|
||||
else: |
|
||||
extra_context = {"uf_list": UnidadeFederativa.objects.all()} |
|
||||
|
|
||||
return render_to_response( |
|
||||
"servicos/casa_manifesta.html", |
|
||||
extra_context, |
|
||||
context_instance=RequestContext(request), |
|
||||
) |
|
||||
|
|
||||
|
|
||||
def adicionar_servicos_carrinho(request, queryset=None, id=None): |
|
||||
if request.method == "POST": |
|
||||
ids_selecionados = request.POST.getlist("_selected_action") |
|
||||
if "carrinho_servicos" not in request.session: |
|
||||
request.session["carrinho_servicos"] = ids_selecionados |
|
||||
else: |
|
||||
lista = request.session["carrinho_servicos"] |
|
||||
# Verifica se id já não está adicionado |
|
||||
for id in ids_selecionados: |
|
||||
if id not in lista: |
|
||||
lista.append(id) |
|
||||
request.session["carrinho_servicos"] = lista |
|
||||
|
|
||||
|
|
||||
def carrinhoOrGet_for_qs(request): |
|
||||
""" |
|
||||
Verifica se existe convênios na sessão se não verifica get e retorna qs correspondente. |
|
||||
""" |
|
||||
if "carrinho_servicos" in request.session: |
|
||||
ids = request.session["carrinho_servicos"] |
|
||||
qs = Servico.objects.filter(pk__in=ids) |
|
||||
qs = qs.order_by( |
|
||||
"casa_legislativa__municipio__uf", "casa_legislativa__municipio" |
|
||||
) |
|
||||
qs = get_for_qs(request.GET, qs) |
|
||||
else: |
|
||||
qs = Servico.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 adicionar_servicos_carrinho(request, queryset=None, id=None): |
|
||||
if request.method == "POST": |
|
||||
ids_selecionados = request.POST.getlist("_selected_action") |
|
||||
if "carrinho_servicos" not in request.session: |
|
||||
request.session["carrinho_servicos"] = ids_selecionados |
|
||||
else: |
|
||||
lista = request.session["carrinho_servicos"] |
|
||||
# Verifica se id já não está adicionado |
|
||||
for id in ids_selecionados: |
|
||||
if id not in lista: |
|
||||
lista.append(id) |
|
||||
request.session["carrinho_servicos"] = lista |
|
||||
|
|
||||
|
|
||||
@login_required |
|
||||
def excluir_carrinho(request): |
|
||||
if "carrinho_servicos" in request.session: |
|
||||
del request.session["carrinho_servicos"] |
|
||||
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_servicos" in request.session: |
|
||||
lista = request.session["carrinho_servicos"] |
|
||||
for item in ids_selecionados: |
|
||||
lista.remove(item) |
|
||||
if lista: |
|
||||
request.session["carrinho_servicos"] = lista |
|
||||
else: |
|
||||
del lista |
|
||||
del request.session["carrinho_servicos"] |
|
||||
|
|
||||
return HttpResponseRedirect(".") |
|
||||
|
|
||||
|
|
||||
@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_servicos" in request.session) |
|
||||
|
|
||||
return render( |
def render_to_response(self, context, **response_kwargs): |
||||
request, |
format = self.request.GET.get("format", "html") |
||||
"servicos/carrinho.html", |
if format == "csv": |
||||
{ |
servicos = self.get_queryset() |
||||
"carIsEmpty": carrinhoIsEmpty, |
data = ServicoResource().export(servicos) |
||||
"paginas": paginas, |
return HttpResponse( |
||||
"query_str": "?" + request.META["QUERY_STRING"], |
data.csv, |
||||
|
content_type="text/csv", |
||||
|
headers={ |
||||
|
"Content-Disposition": 'attachment;filename="orgaos_interlegis.csv"' |
||||
}, |
}, |
||||
) |
) |
||||
|
return super().render_to_response(context, **response_kwargs) |
||||
|
|
||||
def get_for_qs(get, qs): |
|
||||
kwargs = {} |
|
||||
ids = 0 |
|
||||
get._mutable = True |
|
||||
normaliza_data(get, "data_ativacao__gte") |
|
||||
normaliza_data(get, "data_ativacao__lte") |
|
||||
get._mutable = False |
|
||||
for k, v in get.iteritems(): |
|
||||
if k not in ["page", "pop", "q", "_popup"]: |
|
||||
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 = Servico.objects.extra(where=[query]) |
|
||||
return qs |
|
||||
|
|
||||
|
|
||||
@login_required |
|
||||
def export_csv(request): |
|
||||
response = HttpResponse(content_type="text/csv") |
|
||||
response["Content-Disposition"] = "attachment; filename=servicos.csv" |
|
||||
|
|
||||
csv_writer = csv.writer(response) |
|
||||
servicos = carrinhoOrGet_for_qs(request) |
|
||||
if not servicos: |
|
||||
return HttpResponseRedirect("../") |
|
||||
|
|
||||
atributos = [ |
|
||||
_("Casa Legislativa"), |
|
||||
_("Contato Interlegis"), |
|
||||
_("Produto"), |
|
||||
_("Data de Ativação"), |
|
||||
] |
|
||||
|
|
||||
if request.POST: |
|
||||
atributos = request.POST.getlist("itens_csv_selected") |
|
||||
|
|
||||
col_titles = atributos |
|
||||
if _("Casa Legislativa") in col_titles: |
|
||||
pos = col_titles.index(_("Casa Legislativa")) + 1 |
|
||||
col_titles.insert(pos, _("uf")) |
|
||||
pos += 1 |
|
||||
col_titles.insert(pos, _("email")) |
|
||||
pos += 1 |
|
||||
col_titles.insert(pos, _("telefone")) |
|
||||
|
|
||||
if _("Contato Interlegis") in col_titles: |
|
||||
pos = col_titles.index(_("Contato Interlegis")) + 1 |
|
||||
col_titles.insert(pos, _("Email do contato")) |
|
||||
|
|
||||
csv_writer.writerow([s.encode("utf-8") for s in col_titles]) |
|
||||
|
|
||||
for servico in servicos: |
|
||||
lista = [] |
|
||||
for atributo in atributos: |
|
||||
if _("Casa Legislativa") == atributo: |
|
||||
lista.append(servico.casa_legislativa.nome.encode("utf-8")) |
|
||||
lista.append( |
|
||||
servico.casa_legislativa.municipio.uf.sigla.encode("utf-8") |
|
||||
) |
|
||||
lista.append(servico.casa_legislativa.email.encode("utf-8")) |
|
||||
if servico.casa_legislativa.telefone is not None: |
|
||||
lista.append(servico.casa_legislativa.telefone) |
|
||||
else: |
|
||||
lista.append("") |
|
||||
elif _("Contato Interlegis") == atributo: |
|
||||
if servico.casa_legislativa.contato_interlegis is not None: |
|
||||
lista.append(servico.casa_legislativa.contato_interlegis) |
|
||||
lista.append( |
|
||||
servico.casa_legislativa.contato_interlegis.email.encode( |
|
||||
"utf-8" |
|
||||
) |
|
||||
) |
|
||||
else: |
|
||||
lista.append("") |
|
||||
lista.append("") |
|
||||
elif _("Produto") == atributo: |
|
||||
lista.append(servico.tipo_servico.nome.encode("utf-8")) |
|
||||
elif _("Data de Ativação") == atributo: |
|
||||
data = "" |
|
||||
if servico.data_ativacao: |
|
||||
data = servico.data_ativacao.strftime("%d/%m/%Y") |
|
||||
lista.append(data.encode("utf-8")) |
|
||||
else: |
|
||||
pass |
|
||||
|
|
||||
csv_writer.writerow(lista) |
|
||||
|
|
||||
return response |
|
||||
|
Loading…
Reference in new issue