mirror of https://github.com/interlegis/sigi.git
Sesostris Vieira
3 years ago
7 changed files with 214 additions and 6 deletions
@ -1,11 +1,11 @@ |
|||||
ipython==7.30.1 |
ipython==7.30.1 |
||||
|
Pillow==9.0.0 |
||||
|
psycopg2==2.9.3 |
||||
|
requests==2.27.1 |
||||
weasyprint==54.0 |
weasyprint==54.0 |
||||
Django==4.0.1 |
Django==4.0.1 |
||||
django-localflavor==3.1 |
|
||||
django-extensions==3.1.5 |
|
||||
django-weasyprint==2.1.0 |
|
||||
psycopg2==2.9.3 |
|
||||
django-bootstrap5==21.3 |
django-bootstrap5==21.3 |
||||
Pillow==9.0.0 |
django-extensions==3.1.5 |
||||
|
django-import-export==2.7.1 |
||||
django-localflavor==3.1 |
django-localflavor==3.1 |
||||
requests==2.27.1 |
django-weasyprint==2.1.0 |
@ -0,0 +1,6 @@ |
|||||
|
from django.apps import AppConfig |
||||
|
from django.utils.translation import gettext_lazy as _ |
||||
|
|
||||
|
class UtilsConfig(AppConfig): |
||||
|
name = 'sigi.apps.utils' |
||||
|
verbose_name = _('utiliátios SIGI') |
@ -0,0 +1,137 @@ |
|||||
|
from collections import OrderedDict |
||||
|
from functools import update_wrapper |
||||
|
from django.contrib import admin |
||||
|
from django.contrib.admin import helpers |
||||
|
from django.contrib.admin.options import csrf_protect_m |
||||
|
from django.http.response import HttpResponseRedirect |
||||
|
from django.utils.translation import gettext as _, ngettext |
||||
|
from import_export.admin import ExportMixin |
||||
|
|
||||
|
class CartExportMixin(ExportMixin): |
||||
|
actions = ['add_to_cart'] |
||||
|
change_list_template = 'admin/cart/change_list_cart_export.html' |
||||
|
_cart_session_name = None |
||||
|
_cart_viewing_name = None |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
super(CartExportMixin, self).__init__(*args, **kwargs) |
||||
|
self._cart_session_name = 'cart_%s' % self.opts.model_name |
||||
|
self._cart_viewing_name = 'view_cart_%s' % self.opts.model_name |
||||
|
|
||||
|
def get_queryset(self, request): |
||||
|
qs = super(CartExportMixin, self).get_queryset(request) |
||||
|
if self._cart_viewing_name in request.session: |
||||
|
ids = request.session.get(self._cart_session_name, []) |
||||
|
qs = qs.filter(id__in=ids) |
||||
|
return qs |
||||
|
|
||||
|
def get_actions(self, request): |
||||
|
if self._cart_viewing_name in request.session: |
||||
|
action = self.get_action('remove_from_cart') |
||||
|
return OrderedDict([(action[1], action)]) |
||||
|
else: |
||||
|
return super(CartExportMixin, self).get_actions(request) |
||||
|
|
||||
|
@csrf_protect_m |
||||
|
def changelist_view(self, request, extra_context=None): |
||||
|
if 'cart' in request.GET: |
||||
|
request.GET._mutable = True |
||||
|
cart = request.GET.get('cart', '0') |
||||
|
request.GET.pop('cart', None) |
||||
|
request.GET._mutable = False |
||||
|
if cart == '1': |
||||
|
request.session[self._cart_viewing_name] = True |
||||
|
else: |
||||
|
request.session.pop(self._cart_viewing_name, None) |
||||
|
|
||||
|
cart_item_count = len(request.session.get(self._cart_session_name, [])) |
||||
|
|
||||
|
extra_context = extra_context or {} |
||||
|
extra_context['cart_item_count'] = ( |
||||
|
_('Vazio') if cart_item_count == 0 |
||||
|
else _(f'{cart_item_count} itens') |
||||
|
) |
||||
|
|
||||
|
if self._cart_viewing_name in request.session: |
||||
|
extra_context['viewing_cart'] = True |
||||
|
return super(CartExportMixin, self).changelist_view(request, extra_context) |
||||
|
|
||||
|
def get_urls(self): |
||||
|
from django.urls import path |
||||
|
def wrap(view): |
||||
|
def wrapper(*args, **kwargs): |
||||
|
return self.admin_site.admin_view(view)(*args, **kwargs) |
||||
|
wrapper.model_admin = self |
||||
|
return update_wrapper(wrapper, view) |
||||
|
|
||||
|
info = self.model._meta.app_label, self.model._meta.model_name |
||||
|
|
||||
|
paths = super(CartExportMixin, self).get_urls() |
||||
|
paths.insert(2, path( |
||||
|
'clearcart/', |
||||
|
wrap(self.clear_cart), |
||||
|
name='%s_%s_clearcart' % info |
||||
|
)) |
||||
|
return paths |
||||
|
|
||||
|
@csrf_protect_m |
||||
|
def add_to_cart(self, request, queryset): |
||||
|
if request.POST.get('select_across', '0') == '0': |
||||
|
selected_ids = set( |
||||
|
request.POST.getlist(helpers.ACTION_CHECKBOX_NAME, []) |
||||
|
) |
||||
|
else: |
||||
|
selected_ids = set( |
||||
|
map(str, queryset.values_list('id', flat=True)) |
||||
|
) |
||||
|
|
||||
|
if self._cart_session_name in request.session: |
||||
|
cart_ids = set(request.session[self._cart_session_name]) |
||||
|
else: |
||||
|
cart_ids = set() |
||||
|
|
||||
|
quant = len(selected_ids.difference(cart_ids)) |
||||
|
|
||||
|
if quant: |
||||
|
cart_ids.update(selected_ids) |
||||
|
request.session[self._cart_session_name] = list(cart_ids) |
||||
|
self.message_user( |
||||
|
request, |
||||
|
_(u"%s itens adicionados no carrinho") % quant) |
||||
|
else: |
||||
|
self.message_user( |
||||
|
request, |
||||
|
_(u"Os itens selecionados já estavam no carrinho")) |
||||
|
return HttpResponseRedirect('.') |
||||
|
add_to_cart.short_description = _( |
||||
|
"Armazenar itens no carrinho para exportar" |
||||
|
) |
||||
|
|
||||
|
@csrf_protect_m |
||||
|
def remove_from_cart(self, request, queryset): |
||||
|
if self._cart_session_name not in request.session: |
||||
|
self.message_user(request, _(u"O carrinho está vazio")) |
||||
|
return HttpResponseRedirect('.') |
||||
|
|
||||
|
if request.POST.get('select_across', '0') == '0': |
||||
|
remove_ids = set(request.POST.getlist(helpers.ACTION_CHECKBOX_NAME)) |
||||
|
else: |
||||
|
remove_ids = set(map(str, queryset.values_list('id', flat=True))) |
||||
|
cart_ids = set(request.session[self._cart_session_name]) |
||||
|
|
||||
|
request.session[self._cart_session_name] = list( |
||||
|
cart_ids.difference(remove_ids) |
||||
|
) |
||||
|
|
||||
|
self.message_user(request, _(u"%s itens removidos do carrinho.") % |
||||
|
len(cart_ids.intersection(remove_ids))) |
||||
|
|
||||
|
return HttpResponseRedirect('.') |
||||
|
remove_from_cart.short_description = _("Remove itens do carrinho") |
||||
|
|
||||
|
@csrf_protect_m |
||||
|
def clear_cart(self, request): |
||||
|
request.session.pop(self._cart_session_name, None) |
||||
|
request.session.pop(self._cart_viewing_name, None) |
||||
|
self.message_user(request, _(u"Carrinho vazio")) |
||||
|
return HttpResponseRedirect('..') |
@ -0,0 +1,24 @@ |
|||||
|
{% extends "admin/import_export/change_list_export.html" %} |
||||
|
{% load admin_list admin_urls i18n %} |
||||
|
|
||||
|
{% block content_title %} |
||||
|
{% if viewing_cart %} |
||||
|
{% blocktrans with s=opts.verbose_name_plural|lower c=cart_item_count %} |
||||
|
<h1>Visualizando carrinho de {{ s }} <span class="badge">{{ c }}</span></h1> |
||||
|
{% endblocktrans %} |
||||
|
{% else %} |
||||
|
{% if title %}<h1>{{ title }}</h1>{% endif %} |
||||
|
{% endif %} |
||||
|
{% endblock %} |
||||
|
|
||||
|
{{ block.super }} |
||||
|
|
||||
|
{% block object-tools-items %} |
||||
|
{% if viewing_cart %} |
||||
|
{% include "admin/import_export/change_list_export_item.html" %} |
||||
|
{% include "admin/cart/change_list_cart_item.html" %} |
||||
|
{% else %} |
||||
|
<li><a class="btn" href="?cart=1"><span class="glyphicon glyphicon-shopping-cart"></span>{% blocktrans with c=cart_item_count %}Ver Carrinho <span class="badge">{{ c }}</span>{% endblocktrans %}</a></li> |
||||
|
{{ block.super }} |
||||
|
{% endif %} |
||||
|
{% endblock %} |
@ -0,0 +1,5 @@ |
|||||
|
{% load i18n %} |
||||
|
{% load admin_urls %} |
||||
|
|
||||
|
<li><a role="button" class="btn" href="?cart=0"><span class="glyphicon glyphicon-chevron-left"></span>{% trans 'Voltar à lista completa' %}</a></li> |
||||
|
<li><a role="button" class="btn" href="{% url opts|admin_urlname:'clearcart' %}"><span class="glyphicon glyphicon-trash"></span>{% trans "Esvaziar carrinho" %}</a></li> |
@ -0,0 +1,33 @@ |
|||||
|
{% extends "admin/base_site.html" %} |
||||
|
{% load i18n admin_urls %} |
||||
|
|
||||
|
{% block coltype %}flex{% endblock %} |
||||
|
{% block content_title %}<h1>{% trans "Exportar para CSV" %}</h1>{% endblock %} |
||||
|
{% block content %} |
||||
|
<form class="form-horizontal" id="changelist-form" action="" method="post">{% csrf_token %} |
||||
|
<div class="panel panel-default"> |
||||
|
<div class="panel-heading"> |
||||
|
<h3 class="panel-title">{% trans "Selecione os campos para exportar" %}</h3> |
||||
|
</div> |
||||
|
<div class="panel-body"> |
||||
|
<div class="form-group"> |
||||
|
{% for field, label in export_fields %} |
||||
|
<div class="checkbox"> |
||||
|
<label> |
||||
|
<input type="checkbox" name="selected_fields" value="{{ field }}" checked/> |
||||
|
{{ label }} |
||||
|
</label> |
||||
|
</div> |
||||
|
{% endfor %} |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="panel-footer"> |
||||
|
<div class="form-group"> |
||||
|
<button type="submit" class="btn">{% trans "Exportar" %}</button> |
||||
|
<a role="button" class="btn" href="{% url opts|admin_urlname:'changelist' %}">{% trans "Voltar" %}</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</form> |
||||
|
{% endblock %} |
@ -0,0 +1,3 @@ |
|||||
|
from django.test import TestCase |
||||
|
|
||||
|
# Create your tests here. |
Loading…
Reference in new issue