From 6d7660106c0776595dc05cbbf109450a8f871c70 Mon Sep 17 00:00:00 2001 From: Leandro Roberto Date: Tue, 12 Feb 2019 01:29:49 -0200 Subject: [PATCH] trata comportamento dos docs adms --- sapl/api/serializers.py | 3 +++ sapl/api/views.py | 40 +++++++++++++++++++++++++++++++++++++--- sapl/base/models.py | 19 +++++++++++-------- 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/sapl/api/serializers.py b/sapl/api/serializers.py index 9d057e265..f416517c5 100644 --- a/sapl/api/serializers.py +++ b/sapl/api/serializers.py @@ -30,6 +30,9 @@ class ModelChoiceObjectRelatedField(serializers.RelatedField): class AutorSerializer(serializers.ModelSerializer): + # AutorSerializer sendo utilizado pelo gerador automático da api devidos aos + # critérios anotados em views.py + autor_related = ModelChoiceObjectRelatedField(read_only=True) class Meta: diff --git a/sapl/api/views.py b/sapl/api/views.py index eadbbb0eb..152bf79a1 100644 --- a/sapl/api/views.py +++ b/sapl/api/views.py @@ -13,13 +13,12 @@ from django_filters.rest_framework.backends import DjangoFilterBackend 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 list_route, detail_route, action +from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet from sapl.api.permissions import SaplModelPermissions -from sapl.base.models import Autor -from sapl.comissoes.models import Comissao +from sapl.base.models import Autor, AppConfig, DOC_ADM_OSTENSIVO from sapl.materia.models import Proposicao from sapl.parlamentares.models import Parlamentar from sapl.utils import models_with_gr_for_model @@ -361,6 +360,41 @@ class _ProposicaoViewSet(SaplSetViews['materia']['proposicao']): return qs +class _DocumentoAdministrativoViewSet(SaplSetViews['protocoloadm']['documentoadministrativo']): + + class DocumentoAdministrativoPermission(SaplModelPermissions): + def has_permission(self, request, view): + if request.method == 'GET': + comportamento = AppConfig.attr('documentos_administrativos') + if comportamento == DOC_ADM_OSTENSIVO: + return True + """ + Diante da lógica implementada na manutenção de documentos + administrativos: + - Se o comportamento é doc adm ostensivo, deve passar pelo + teste de permissões sem avaliá-las + - se o comportamento é doc adm restritivo, deve passar pelo + teste de permissões avaliando-as + """ + return super().has_permission(request, view) + + permission_classes = (DocumentoAdministrativoPermission, ) + + def get_queryset(self): + """ + mesmo tendo passado pelo teste de permissões, deve ser filtrado, + pelo campo restrito. Sendo este igual a True, disponibilizar apenas + a um usuário conectado. Apenas isso, sem critérios outros de permissão, + conforme implementado em DocumentoAdministrativoCrud + """ + qs = super().get_queryset() + + if self.request.user.is_anonymous(): + qs = qs.exclude(restrito=True) + return qs + + SaplSetViews['base']['autor'] = _AutorViewSet.build_class_with_actions() SaplSetViews['materia']['proposicao'] = _ProposicaoViewSet SaplSetViews['parlamentares']['parlamentar'] = _ParlamentarViewSet +SaplSetViews['protocoloadm']['documentoadministrativo'] = _DocumentoAdministrativoViewSet diff --git a/sapl/base/models.py b/sapl/base/models.py index 343a8db9b..55792b147 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -1,16 +1,19 @@ -import reversion from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models.signals import post_migrate from django.db.utils import DEFAULT_DB_ALIAS from django.utils.translation import ugettext_lazy as _ -#from model_utils import Choices +import reversion + from sapl.utils import (LISTA_DE_UFS, YES_NO_CHOICES, get_settings_auth_user_model, models_with_gr_for_model) -TIPO_DOCUMENTO_ADMINISTRATIVO = (('O', _('Ostensiva')), - ('R', _('Restritiva'))) +DOC_ADM_OSTENSIVO = 'O' +DOC_ADM_RESTRITIVO = 'R' + +TIPO_DOCUMENTO_ADMINISTRATIVO = ((DOC_ADM_OSTENSIVO, _('Ostensiva')), + (DOC_ADM_RESTRITIVO, _('Restritiva'))) RELATORIO_ATOS_ACESSADOS = (('S', _('Sim')), ('N', _('Não'))) @@ -20,9 +23,9 @@ SEQUENCIA_NUMERACAO = (('A', _('Sequencial por ano')), ('U', _('Sequencial único'))) ESFERA_FEDERACAO_CHOICES = (('M', _('Municipal')), - ('E', _('Estadual')), - ('F', _('Federal')), -) + ('E', _('Estadual')), + ('F', _('Federal')), + ) ASSINATURA_ATA_CHOICES = ( ('M', _('Mesa Diretora da Sessão')), @@ -100,7 +103,7 @@ class AppConfig(models.Model): esfera_federacao = models.CharField( max_length=1, blank=True, - default = "", + default="", verbose_name=_('Esfera Federação'), choices=ESFERA_FEDERACAO_CHOICES)