diff --git a/docker-compose.yml b/docker-compose.yml
index 3f4eb46b3..5eb35418d 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.160-RC0
+ image: interlegis/sapl:3.1.160-RC1
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/sapl/api/views.py b/sapl/api/views.py
index 6f4e9219a..9ddafb9ec 100644
--- a/sapl/api/views.py
+++ b/sapl/api/views.py
@@ -15,6 +15,7 @@ from django_filters.rest_framework.filterset import FilterSet
from django_filters.utils import resolve_field
from rest_framework import serializers as rest_serializers
from rest_framework.decorators import action
+from rest_framework.fields import SerializerMethodField
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
@@ -94,10 +95,15 @@ class SaplApiViewSetConstrutor():
# Define uma classe padrão para serializer caso não tenha sido
# criada a classe sapl.api.serializers.{model}Serializer
class SaplSerializer(rest_serializers.ModelSerializer):
+ __str__ = SerializerMethodField()
+
class Meta:
model = _model
fields = '__all__'
+ def get___str__(self, obj):
+ return str(obj)
+
# Define uma classe padrão para filtro caso não tenha sido
# criada a classe sapl.api.forms.{model}FilterSet
class SaplFilterSet(SaplFilterSetMixin):
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index 2e292b67d..1e53c78df 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -19,27 +19,25 @@ from django.utils.translation import string_concat
from django.utils.translation import ugettext_lazy as _
import django_filters
-from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica
-from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica
+from sapl.audiencia.models import AudienciaPublica
from sapl.base.models import Autor, TipoAutor
-from sapl.comissoes.models import Reuniao, Comissao
-from sapl.comissoes.models import Reuniao, Comissao
-from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column,
- to_row)
-from sapl.crispy_layout_mixin import SaplFormHelper
-from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao, StatusTramitacao,
- DocumentoAcessorio, TipoMateriaLegislativa)
-from sapl.norma.models import (NormaJuridica, NormaEstatisticas)
-from sapl.parlamentares.models import SessaoLegislativa, Partido
+from sapl.comissoes.models import Reuniao
+from sapl.crispy_layout_mixin import (form_actions, to_column, to_row,
+ SaplFormHelper, SaplFormLayout)
+from sapl.materia.models import (DocumentoAcessorio, MateriaEmTramitacao,
+ MateriaLegislativa, UnidadeTramitacao,
+ StatusTramitacao)
+from sapl.norma.models import NormaJuridica
+from sapl.parlamentares.models import Partido, SessaoLegislativa
from sapl.protocoloadm.models import DocumentoAdministrativo
from sapl.sessao.models import SessaoPlenaria
from sapl.settings import MAX_IMAGE_UPLOAD_SIZE
-from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES,
- ChoiceWithoutValidationField, ImageThumbnailFileInput,
- RangeWidgetOverride, autor_label, autor_modal,
- models_with_gr_for_model, qs_override_django_filter,
+from sapl.utils import (autor_label, autor_modal, ChoiceWithoutValidationField,
choice_anos_com_normas, choice_anos_com_materias,
- FilterOverridesMetaMixin, FileFieldCheckMixin, AnoNumeroOrderingFilter)
+ FilterOverridesMetaMixin, FileFieldCheckMixin,
+ AnoNumeroOrderingFilter, ImageThumbnailFileInput,
+ models_with_gr_for_model, qs_override_django_filter,
+ RangeWidgetOverride, RANGE_ANOS, YES_NO_CHOICES)
from .models import AppConfig, CasaLegislativa
@@ -619,6 +617,10 @@ class AutorForm(ModelForm):
tipo = cd['tipo']
+ if 'nome' in cd and \
+ Autor.objects.filter(nome=cd['nome']).exists():
+ raise ValidationError("Autor '%s' já existente!" % cd['nome'])
+
if not tipo.content_type:
if 'nome' not in cd or not cd['nome']:
self.logger.error('Nome do Autor não informado.')
@@ -1236,9 +1238,9 @@ class RelatorioAudienciaFilterSet(django_filters.FilterSet):
)
-class RelatorioMateriasTramitacaoilterSet(django_filters.FilterSet):
+class RelatorioMateriasTramitacaoFilterSet(django_filters.FilterSet):
- ano = django_filters.ChoiceFilter(required=True,
+ materia__ano = django_filters.ChoiceFilter(required=True,
label='Ano da Matéria',
choices=choice_anos_com_materias)
@@ -1252,22 +1254,25 @@ class RelatorioMateriasTramitacaoilterSet(django_filters.FilterSet):
@property
def qs(self):
- parent = super(RelatorioMateriasTramitacaoilterSet, self).qs
- return parent.distinct().order_by('-ano', 'tipo', '-numero')
+ parent = super(RelatorioMateriasTramitacaoFilterSet, self).qs
+ return parent.distinct().order_by(
+ '-materia__ano', 'materia__tipo', '-materia__numero'
+ )
class Meta:
- model = MateriaLegislativa
- fields = ['ano', 'tipo', 'tramitacao__unidade_tramitacao_destino',
+ model = MateriaEmTramitacao
+ fields = ['materia__ano', 'materia__tipo',
+ 'tramitacao__unidade_tramitacao_destino',
'tramitacao__status']
def __init__(self, *args, **kwargs):
- super(RelatorioMateriasTramitacaoilterSet, self).__init__(
+ super(RelatorioMateriasTramitacaoFilterSet, self).__init__(
*args, **kwargs)
- self.filters['tipo'].label = 'Tipo de Matéria'
+ self.filters['materia__tipo'].label = 'Tipo de Matéria'
- row1 = to_row([('ano', 12)])
- row2 = to_row([('tipo', 12)])
+ row1 = to_row([('materia__ano', 12)])
+ row2 = to_row([('materia__tipo', 12)])
row3 = to_row([('tramitacao__unidade_tramitacao_destino', 12)])
row4 = to_row([('tramitacao__status', 12)])
@@ -1797,5 +1802,5 @@ class RelatorioNormasPorAutorFilterSet(django_filters.FilterSet):
HTML(autor_label),
HTML(autor_modal),
row3,
- buttons)
+ form_actions(label='Pesquisar'))
)
diff --git a/sapl/base/receivers.py b/sapl/base/receivers.py
index b2176be14..f5f19f1f3 100644
--- a/sapl/base/receivers.py
+++ b/sapl/base/receivers.py
@@ -1,6 +1,5 @@
from django.db.models.signals import post_delete, post_save
from django.dispatch import receiver
-
from sapl.materia.models import Tramitacao
from sapl.protocoloadm.models import TramitacaoAdministrativo
from sapl.base.signals import tramitacao_signal
@@ -30,12 +29,12 @@ def handle_tramitacao_signal(sender, **kwargs):
@receiver(post_delete)
def status_tramitacao_materia(sender, instance, **kwargs):
- if isinstance(sender, TramitacaoAdministrativo):
+ if sender == Tramitacao:
if instance.status.indicador == 'F':
materia = instance.materia
materia.em_tramitacao = True
materia.save()
- elif isinstance(sender, TramitacaoAdministrativo):
+ elif sender == TramitacaoAdministrativo:
if instance.status.indicador == 'F':
documento = instance.documento
documento.tramitacao = True
diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py
index 12192ab6f..048778d8d 100644
--- a/sapl/base/templatetags/common_tags.py
+++ b/sapl/base/templatetags/common_tags.py
@@ -249,8 +249,10 @@ def facebook_url(value):
def youtube_id(value):
from urllib.parse import urlparse, parse_qs
u_pars = urlparse(value)
- quer_v = parse_qs(u_pars.query).get('v')[0]
- return quer_v
+ quer_v = parse_qs(u_pars.query).get('v')
+ if quer_v:
+ return quer_v[0]
+ return ''
@register.filter
diff --git a/sapl/base/tests/test_view_base.py b/sapl/base/tests/test_view_base.py
index 6655317b3..75748edd0 100644
--- a/sapl/base/tests/test_view_base.py
+++ b/sapl/base/tests/test_view_base.py
@@ -24,32 +24,6 @@ from sapl.base.views import (protocolos_duplicados, protocolos_com_materias,
bancada_comissao_autor_externo, anexados_ciclicos)
-@pytest.mark.django_db(transaction=False)
-def test_lista_protocolos_duplicados():
- mommy.make(
- Protocolo,
- numero=15,
- ano=2031
- )
- mommy.make(
- Protocolo,
- numero=15,
- ano=2031
- )
- mommy.make(
- Protocolo,
- numero=33,
- ano=2033
- )
-
- lista_protocolos_duplicados = protocolos_duplicados()
-
- assert len(lista_protocolos_duplicados) == 1
- assert lista_protocolos_duplicados[0][1] == 2
- assert lista_protocolos_duplicados[0][0].numero == 15
- assert lista_protocolos_duplicados[0][0].ano == 2031
-
-
@pytest.mark.django_db(transaction=False)
def test_lista_protocolos_com_materias():
mommy.make(
@@ -194,13 +168,13 @@ def test_lista_parlamentares_duplicados():
sexo='M'
)
- lista_dict_values_parlamentares_duplicados = parlamentares_duplicados()
+ lista_dict_parlamentares_duplicados = parlamentares_duplicados()
parlamentar_duplicado = list(
- lista_dict_values_parlamentares_duplicados[0]
+ lista_dict_parlamentares_duplicados[0].values()
)
parlamentar_duplicado.sort(key=str)
- assert len(lista_dict_values_parlamentares_duplicados) == 1
+ assert len(lista_dict_parlamentares_duplicados) == 1
assert parlamentar_duplicado == [2, "Nome_Parlamentar_Teste"]
diff --git a/sapl/base/views.py b/sapl/base/views.py
index 7f26808d2..df5a1c0f7 100644
--- a/sapl/base/views.py
+++ b/sapl/base/views.py
@@ -13,7 +13,8 @@ from django.core.exceptions import ObjectDoesNotExist, PermissionDenied, Validat
from django.core.mail import send_mail
from django.core.urlresolvers import reverse, reverse_lazy
from django.db import connection
-from django.db.models import Count, Q, ProtectedError
+from django.db.models import Count, Q, ProtectedError, Max
+from django.shortcuts import render
from django.http import Http404, HttpResponseRedirect, JsonResponse
from django.template import TemplateDoesNotExist
from django.template.loader import get_template
@@ -39,23 +40,26 @@ from sapl.relatorios.views import (relatorio_materia_em_tramitacao, relatorio_ma
from sapl import settings
from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica
-from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm
from sapl.base.models import Autor, TipoAutor
-from sapl.comissoes.models import Reuniao, Comissao
+from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm
+from sapl.comissoes.models import Comissao, Reuniao
from sapl.crud.base import CrudAux, make_pagination
-from sapl.materia.models import (Autoria, MateriaLegislativa, Proposicao, Anexada,
- TipoMateriaLegislativa, StatusTramitacao, UnidadeTramitacao,
- DocumentoAcessorio, TipoDocumento)
-from sapl.norma.models import (NormaJuridica, TipoNormaJuridica, NormaEstatisticas)
-from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato, Filiacao, SessaoLegislativa
-from sapl.protocoloadm.models import (Protocolo, TipoDocumentoAdministrativo,
- StatusTramitacaoAdministrativo,
- DocumentoAdministrativo, Anexado)
-from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria,
- SessaoPlenariaPresenca, Bancada, TipoSessaoPlenaria)
-from sapl.utils import (parlamentares_ativos, gerar_hash_arquivo, SEPARADOR_HASH_PROPOSICAO,
- show_results_filter_set, mail_service_configured,
- intervalos_tem_intersecao, remover_acentos)
+from sapl.materia.models import (Anexada, Autoria, DocumentoAcessorio,
+ MateriaEmTramitacao, MateriaLegislativa, Proposicao,
+ StatusTramitacao, TipoDocumento,
+ TipoMateriaLegislativa, UnidadeTramitacao, Tramitacao)
+from sapl.norma.models import NormaJuridica, TipoNormaJuridica
+from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato, Parlamentar,
+ SessaoLegislativa)
+from sapl.protocoloadm.models import (Anexado, DocumentoAdministrativo, Protocolo,
+ StatusTramitacaoAdministrativo,
+ TipoDocumentoAdministrativo)
+from sapl.sessao.models import (Bancada, PresencaOrdemDia, SessaoPlenaria,
+ SessaoPlenariaPresenca, TipoSessaoPlenaria)
+from sapl.utils import (gerar_hash_arquivo, intervalos_tem_intersecao,
+ mail_service_configured, parlamentares_ativos,
+ SEPARADOR_HASH_PROPOSICAO, show_results_filter_set)
+
from .forms import (AlterarSenhaForm, CasaLegislativaForm,
ConfiguracoesAppForm, RelatorioAtasFilterSet,
RelatorioAudienciaFilterSet,
@@ -63,7 +67,7 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm,
RelatorioHistoricoTramitacaoFilterSet,
RelatorioMateriasPorAnoAutorTipoFilterSet,
RelatorioMateriasPorAutorFilterSet,
- RelatorioMateriasTramitacaoilterSet,
+ RelatorioMateriasTramitacaoFilterSet,
RelatorioPresencaSessaoFilterSet,
RelatorioReuniaoFilterSet, UsuarioCreateForm,
UsuarioEditForm, RelatorioNormasMesFilterSet,
@@ -75,19 +79,6 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm,
from .models import AppConfig, CasaLegislativa
-def filtra_url_materias_em_tramitacao(qr, qs, campo_url, local_ou_status):
- id_materias = []
- filtro_url = qr[campo_url]
- if local_ou_status == 'local':
- id_materias = [item.id for item in qs if item.tramitacao_set.order_by(
- '-id').first().unidade_tramitacao_destino_id == int(filtro_url)]
- elif local_ou_status == 'status':
- id_materias = [item.id for item in qs if item.tramitacao_set.order_by(
- '-id').first().status_id == int(filtro_url)]
-
- return qs.filter(em_tramitacao=True, id__in=id_materias)
-
-
def get_casalegislativa():
return CasaLegislativa.objects.first()
@@ -731,62 +722,109 @@ class RelatorioAudienciaView(RelatorioMixin, FilterView):
class RelatorioMateriasTramitacaoView(RelatorioMixin, FilterView):
- model = MateriaLegislativa
- filterset_class = RelatorioMateriasTramitacaoilterSet
+ model = MateriaEmTramitacao
+ filterset_class = RelatorioMateriasTramitacaoFilterSet
template_name = 'base/RelatorioMateriasPorTramitacao_filter.html'
relatorio = relatorio_materia_em_tramitacao
+ paginate_by = 100
+
+ total_resultados_tipos = {}
+
+ def get_filterset_kwargs(self, filterset_class):
+ data = super().get_filterset_kwargs(filterset_class)
+
+ if data['data']:
+ qs = data['queryset']
+
+ ano_materia = data['data']['materia__ano']
+ tipo_materia = data['data']['materia__tipo']
+ unidade_tramitacao_destino = data['data']['tramitacao__unidade_tramitacao_destino']
+ status_tramitacao = data['data']['tramitacao__status']
+
+ kwargs = {}
+ if ano_materia:
+ kwargs['materia__ano'] = ano_materia
+ if tipo_materia:
+ kwargs['materia__tipo'] = tipo_materia
+ if unidade_tramitacao_destino:
+ kwargs['tramitacao__unidade_tramitacao_destino'] = unidade_tramitacao_destino
+ if status_tramitacao:
+ kwargs['tramitacao__status'] = status_tramitacao
+ qs = qs.filter(**kwargs)
+
+ data['queryset'] = qs
+
+ qtdes = { tipo:0 for tipo in TipoMateriaLegislativa.objects.all() }
+ for i in qs:
+ qtdes[i.materia.tipo] += 1
+
+ # remove as entradas de valor igual a zero
+ qtdes = {k:v for k,v in qtdes.items() if v > 0}
+ self.total_resultados_tipos = qtdes
+
+ return data
+
+ def get_queryset(self):
+ qs = super().get_queryset()
+ qs = qs.select_related('materia__tipo').filter(
+ materia__em_tramitacao=True
+ ).exclude(
+ tramitacao__status__indicador='F'
+ ).order_by('-materia__ano', '-materia__numero')
+ return qs
+
def get_context_data(self, **kwargs):
- context = super(RelatorioMateriasTramitacaoView,
- self).get_context_data(**kwargs)
+ context = super(
+ RelatorioMateriasTramitacaoView, self
+ ).get_context_data(**kwargs)
context['title'] = _('Matérias em Tramitação')
+
if not self.filterset.form.is_valid():
return context
qr = self.request.GET.copy()
- qs = context['object_list']
- qs = qs.filter(em_tramitacao=True)
-
- if qr.get('tramitacao__unidade_tramitacao_destino'):
- qs = filtra_url_materias_em_tramitacao(
- qr, qs, 'tramitacao__unidade_tramitacao_destino', 'local')
- if qr.get('tramitacao__status'):
- qs = filtra_url_materias_em_tramitacao(
- qr, qs, 'tramitacao__status', 'status')
- li = [li1 for li1 in qs if li1.tramitacao_set.last() and li1.tramitacao_set.last().status.indicador != 'F']
- context['object_list'] = li
+ context['qtdes'] = self.total_resultados_tipos
+ context['ano'] = (self.request.GET['materia__ano'])
- qtdes = {}
- for tipo in TipoMateriaLegislativa.objects.all():
- li = context['object_list']
- qtde = sum(1 for i in li if i.tipo_id==tipo.id)
- if qtde > 0:
- qtdes[tipo] = qtde
- context['qtdes'] = qtdes
- context['ano'] = (self.request.GET['ano'])
- if self.request.GET['tipo']:
- tipo = self.request.GET['tipo']
+ if self.request.GET['materia__tipo']:
+ tipo = self.request.GET['materia__tipo']
context['tipo'] = (
- str(TipoMateriaLegislativa.objects.get(id=tipo)))
+ str(TipoMateriaLegislativa.objects.get(id=tipo))
+ )
else:
context['tipo'] = ''
+
if self.request.GET['tramitacao__status']:
tramitacao_status = self.request.GET['tramitacao__status']
context['tramitacao__status'] = (
- str(StatusTramitacao.objects.get(id=tramitacao_status)))
+ str(StatusTramitacao.objects.get(id=tramitacao_status))
+ )
else:
context['tramitacao__status'] = ''
+
if self.request.GET['tramitacao__unidade_tramitacao_destino']:
- context['tramitacao__unidade_tramitacao_destino'] = (str(UnidadeTramitacao.objects.get(
- id=self.request.GET['tramitacao__unidade_tramitacao_destino'])))
+ context['tramitacao__unidade_tramitacao_destino'] = (
+ str(UnidadeTramitacao.objects.get(
+ id=self.request.GET['tramitacao__unidade_tramitacao_destino']
+ ))
+ )
else:
context['tramitacao__unidade_tramitacao_destino'] = ''
+
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
-
context['show_results'] = show_results_filter_set(qr)
+ paginator = context['paginator']
+ page_obj = context['page_obj']
+
+ context['page_range'] = make_pagination(
+ page_obj.number, paginator.num_pages
+ )
+ context['NO_ENTRIES_MSG'] = 'Nenhum encontrado.'
+
return context
@@ -1471,7 +1509,7 @@ class ListarParlMandatosIntersecaoView(PermissionRequiredMixin, ListView):
def parlamentares_duplicados():
- return [parlamentar.values() for parlamentar in Parlamentar.objects.values(
+ return [parlamentar for parlamentar in Parlamentar.objects.values(
'nome_parlamentar').order_by('nome_parlamentar').annotate(count=Count(
'nome_parlamentar')).filter(count__gt=1)]
@@ -1656,14 +1694,10 @@ class ListarProtocolosComMateriasView(PermissionRequiredMixin, ListView):
def protocolos_duplicados():
- protocolos = {}
- for p in Protocolo.objects.order_by('-ano', 'numero'):
- key = "{}/{}".format(p.numero, p.ano)
- val = protocolos.get(key, list())
- val.append(p)
- protocolos[key] = val
-
- return [(v[0], len(v)) for (k, v) in protocolos.items() if len(v) > 1]
+ return [
+ protocolo for protocolo in Protocolo.objects.values(
+ 'numero', 'ano').order_by('-ano', 'numero').annotate(total=Count('numero')).filter(total__gt=1)
+ ]
class ListarProtocolosDuplicadosView(PermissionRequiredMixin, ListView):
diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py
index 5fa132eab..0b5ca756d 100644
--- a/sapl/comissoes/views.py
+++ b/sapl/comissoes/views.py
@@ -167,7 +167,7 @@ class ComissaoCrud(Crud):
def lista_materias_comissao(comissao_pk):
ts = Tramitacao.objects.order_by(
- 'materia', '-data_tramitacao', '-id').annotate(
+ 'materia_id', '-data_tramitacao', '-id').annotate(
comissao=F('unidade_tramitacao_destino__comissao')).distinct(
'materia').values_list('materia', 'comissao')
diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py
index 671e5bcf1..d27d85f1a 100644
--- a/sapl/compilacao/views.py
+++ b/sapl/compilacao/views.py
@@ -195,8 +195,13 @@ class IntegracaoTaView(TemplateView):
return redirect(to=reverse_lazy('sapl.compilacao:ta_text_edit',
kwargs={'ta_id': ta.pk}))
else:
- return redirect(to=reverse_lazy('sapl.compilacao:ta_text',
- kwargs={'ta_id': ta.pk}))
+ return redirect(
+ to='%s?%s' % (
+ reverse_lazy('sapl.compilacao:ta_text',
+ kwargs={'ta_id': ta.pk}),
+ request.META['QUERY_STRING']
+ )
+ )
class Meta:
abstract = True
diff --git a/sapl/crud/base.py b/sapl/crud/base.py
index 98af2a3bb..18f3d5c29 100644
--- a/sapl/crud/base.py
+++ b/sapl/crud/base.py
@@ -4,13 +4,14 @@ from braces.views import FormMessagesMixin
from crispy_forms.bootstrap import FieldWithButtons, StrictButton
from crispy_forms.layout import Field, Layout
from django import forms
+from django.conf import settings
from django.conf.urls import url
from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse
from django.db import models
-from django.db.models.fields.related import ForeignKey
+from django.db.models.fields.related import ForeignKey, ManyToManyField
from django.http.response import Http404
from django.shortcuts import redirect
from django.utils.decorators import classonlymethod
@@ -27,10 +28,12 @@ from sapl.crispy_layout_mixin import CrispyLayoutFormMixin, get_field_display
from sapl.crispy_layout_mixin import SaplFormHelper
from sapl.rules.map_rules import (RP_ADD, RP_CHANGE, RP_DELETE, RP_DETAIL,
RP_LIST)
-from sapl.settings import BASE_DIR
from sapl.utils import normalize
+logger = logging.getLogger(settings.BASE_DIR.name)
+
+
ACTION_LIST, ACTION_CREATE, ACTION_DETAIL, ACTION_UPDATE, ACTION_DELETE = \
'list', 'create', 'detail', 'update', 'delete'
@@ -122,7 +125,6 @@ class SearchMixin(models.Model):
except Exception as e:
username = self.request.user.username
self.logger.error("user=" + username + ". " + str(e))
- pass
else:
_self = self
for field in fields:
@@ -206,6 +208,7 @@ class PermissionRequiredContainerCrudMixin(PermissionRequiredMixin):
if not self.model.objects.filter(**params).exists():
raise Http404()
+
elif self.container_field:
container = self.container_field.split('__')
@@ -230,14 +233,14 @@ class PermissionRequiredContainerCrudMixin(PermissionRequiredMixin):
return super(PermissionRequiredMixin, self).dispatch(
request, *args, **kwargs)
- @cached_property
+ @property
def container_field(self):
if hasattr(self, 'crud') and not hasattr(self.crud, 'container_field'):
self.crud.container_field = ''
if hasattr(self, 'crud'):
return self.crud.container_field
- @cached_property
+ @property
def container_field_set(self):
if hasattr(self, 'crud') and\
not hasattr(self.crud, 'container_field_set'):
@@ -245,7 +248,7 @@ class PermissionRequiredContainerCrudMixin(PermissionRequiredMixin):
if hasattr(self, 'crud'):
return self.crud.container_field_set
- @cached_property
+ @property
def is_contained(self):
return self.container_field_set or self.container_field
@@ -600,7 +603,7 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView):
# print(ordering)
except Exception as e:
- print(string_concat(_(
+ logger.error(string_concat(_(
'ERRO: construção da tupla de ordenação.'), str(e)))
# print(queryset.query)
@@ -1108,12 +1111,14 @@ class MasterDetailCrud(Crud):
permission_required = RP_LIST,
logger = logging.getLogger(__name__)
+ def get(self, request, *args, **kwargs):
+ return Crud.ListView.get(self, request, *args, **kwargs)
+
@classmethod
def get_url_regex(cls):
return r'^(?P
{%field_verbose_name object 'tipo'%}
-{%field_verbose_name object 'tipo'%}
+{%field_verbose_name object 'data_envio' %}
-{%field_verbose_name object 'data_envio' %}
+{%field_verbose_name object 'data_recebimento'%}
-{%field_verbose_name object 'data_recebimento'%}
+{%field_verbose_name object 'descricao'%}
-{%field_verbose_name object 'observacao'%}
+{%field_verbose_name object 'descricao'%}