|
@ -22,8 +22,12 @@ from sapl.api.forms import SaplFilterSetMixin |
|
|
from sapl.api.permissions import SaplModelPermissions |
|
|
from sapl.api.permissions import SaplModelPermissions |
|
|
from sapl.api.serializers import ChoiceSerializer |
|
|
from sapl.api.serializers import ChoiceSerializer |
|
|
from sapl.base.models import Autor, AppConfig, DOC_ADM_OSTENSIVO |
|
|
from sapl.base.models import Autor, AppConfig, DOC_ADM_OSTENSIVO |
|
|
from sapl.materia.models import Proposicao, TipoMateriaLegislativa |
|
|
from sapl.materia.models import Proposicao, TipoMateriaLegislativa,\ |
|
|
|
|
|
MateriaLegislativa, Tramitacao |
|
|
from sapl.parlamentares.models import Parlamentar |
|
|
from sapl.parlamentares.models import Parlamentar |
|
|
|
|
|
from sapl.protocoloadm.models import DocumentoAdministrativo,\ |
|
|
|
|
|
DocumentoAcessorioAdministrativo, TramitacaoAdministrativo |
|
|
|
|
|
from sapl.sessao.models import SessaoPlenaria |
|
|
from sapl.utils import models_with_gr_for_model, choice_anos_com_sessaoplenaria |
|
|
from sapl.utils import models_with_gr_for_model, choice_anos_com_sessaoplenaria |
|
|
|
|
|
|
|
|
class BusinessRulesNotImplementedMixin: |
|
|
class BusinessRulesNotImplementedMixin: |
|
@ -37,10 +41,18 @@ class BusinessRulesNotImplementedMixin: |
|
|
raise Exception(_("DELETE Delete não implementado")) |
|
|
raise Exception(_("DELETE Delete não implementado")) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SaplApiViewSetConstrutor(ModelViewSet): |
|
|
class SaplApiViewSet(ModelViewSet): |
|
|
|
|
|
|
|
|
filter_backends = (DjangoFilterBackend,) |
|
|
filter_backends = (DjangoFilterBackend,) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SaplApiViewSetConstrutor(): |
|
|
|
|
|
|
|
|
|
|
|
_built_sets = {} |
|
|
|
|
|
|
|
|
|
|
|
@classonlymethod |
|
|
|
|
|
def get_class_for_model(cls, model): |
|
|
|
|
|
return cls._built_sets[model._meta.app_config][model] |
|
|
|
|
|
|
|
|
@classonlymethod |
|
|
@classonlymethod |
|
|
def build_class(cls): |
|
|
def build_class(cls): |
|
|
import inspect |
|
|
import inspect |
|
@ -91,7 +103,7 @@ class SaplApiViewSetConstrutor(ModelViewSet): |
|
|
model = _model |
|
|
model = _model |
|
|
|
|
|
|
|
|
# Define uma classe padrão ModelViewSet de DRF |
|
|
# Define uma classe padrão ModelViewSet de DRF |
|
|
class ModelSaplViewSet(cls): |
|
|
class ModelSaplViewSet(SaplApiViewSet): |
|
|
queryset = _model.objects.all() |
|
|
queryset = _model.objects.all() |
|
|
|
|
|
|
|
|
# Utiliza o filtro customizado pela classe |
|
|
# Utiliza o filtro customizado pela classe |
|
@ -115,12 +127,12 @@ class SaplApiViewSetConstrutor(ModelViewSet): |
|
|
apps_sapl = [apps.apps.get_app_config( |
|
|
apps_sapl = [apps.apps.get_app_config( |
|
|
n[5:]) for n in settings.SAPL_APPS] |
|
|
n[5:]) for n in settings.SAPL_APPS] |
|
|
for app in apps_sapl: |
|
|
for app in apps_sapl: |
|
|
built_sets[app.label] = {} |
|
|
cls._built_sets[app] = {} |
|
|
for model in app.get_models(): |
|
|
for model in app.get_models(): |
|
|
built_sets[app.label][model._meta.model_name] = build(model) |
|
|
cls._built_sets[app][model] = build(model) |
|
|
|
|
|
|
|
|
return built_sets |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SaplApiViewSetConstrutor.build_class() |
|
|
|
|
|
|
|
|
""" |
|
|
""" |
|
|
1. Constroi uma rest_framework.viewsets.ModelViewSet para |
|
|
1. Constroi uma rest_framework.viewsets.ModelViewSet para |
|
@ -183,15 +195,39 @@ class SaplApiViewSetConstrutor(ModelViewSet): |
|
|
} |
|
|
} |
|
|
""" |
|
|
""" |
|
|
|
|
|
|
|
|
SaplSetViews = SaplApiViewSetConstrutor.build_class() |
|
|
|
|
|
|
|
|
|
|
|
# Toda Classe construida acima, pode ser redefinida e aplicado quaisquer |
|
|
# Toda Classe construida acima, pode ser redefinida e aplicado quaisquer |
|
|
# das possibilidades para uma classe normal criada a partir de |
|
|
# das possibilidades para uma classe normal criada a partir de |
|
|
# rest_framework.viewsets.ModelViewSet conforme exemplo para a classe autor |
|
|
# rest_framework.viewsets.ModelViewSet conforme exemplo para a classe autor |
|
|
|
|
|
|
|
|
|
|
|
# decorator para recuperar e transformar o default |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class customize(object): |
|
|
|
|
|
def __init__(self, model): |
|
|
|
|
|
self.model = model |
|
|
|
|
|
|
|
|
|
|
|
def __call__(self, cls): |
|
|
|
|
|
|
|
|
|
|
|
class _SaplApiViewSet( |
|
|
|
|
|
cls, |
|
|
|
|
|
SaplApiViewSetConstrutor._built_sets[ |
|
|
|
|
|
self.model._meta.app_config][self.model] |
|
|
|
|
|
): |
|
|
|
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
if hasattr(_SaplApiViewSet, 'build'): |
|
|
|
|
|
_SaplApiViewSet = _SaplApiViewSet.build() |
|
|
|
|
|
|
|
|
|
|
|
SaplApiViewSetConstrutor._built_sets[ |
|
|
|
|
|
self.model._meta.app_config][self.model] = _SaplApiViewSet |
|
|
|
|
|
return _SaplApiViewSet |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Customização para AutorViewSet com implementação de actions específicas |
|
|
# Customização para AutorViewSet com implementação de actions específicas |
|
|
class _AutorViewSet(SaplSetViews['base']['autor']): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@customize(Autor) |
|
|
|
|
|
class _AutorViewSet: |
|
|
""" |
|
|
""" |
|
|
Neste exemplo de customização do que foi criado em |
|
|
Neste exemplo de customização do que foi criado em |
|
|
SaplApiViewSetConstrutor além do ofertado por |
|
|
SaplApiViewSetConstrutor além do ofertado por |
|
@ -236,7 +272,7 @@ class _AutorViewSet(SaplSetViews['base']['autor']): |
|
|
return Response(serializer.data) |
|
|
return Response(serializer.data) |
|
|
|
|
|
|
|
|
@classonlymethod |
|
|
@classonlymethod |
|
|
def build_class_with_actions(cls): |
|
|
def build(cls): |
|
|
|
|
|
|
|
|
models_with_gr_for_autor = models_with_gr_for_model(Autor) |
|
|
models_with_gr_for_autor = models_with_gr_for_model(Autor) |
|
|
|
|
|
|
|
@ -259,7 +295,8 @@ class _AutorViewSet(SaplSetViews['base']['autor']): |
|
|
return cls |
|
|
return cls |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _ParlamentarViewSet(SaplSetViews['parlamentares']['parlamentar']): |
|
|
@customize(Parlamentar) |
|
|
|
|
|
class _ParlamentarViewSet: |
|
|
@action(detail=True) |
|
|
@action(detail=True) |
|
|
def proposicoes(self, request, *args, **kwargs): |
|
|
def proposicoes(self, request, *args, **kwargs): |
|
|
""" |
|
|
""" |
|
@ -284,15 +321,16 @@ class _ParlamentarViewSet(SaplSetViews['parlamentares']['parlamentar']): |
|
|
|
|
|
|
|
|
page = self.paginate_queryset(qs) |
|
|
page = self.paginate_queryset(qs) |
|
|
if page is not None: |
|
|
if page is not None: |
|
|
serializer = SaplSetViews[ |
|
|
serializer = SaplApiViewSetConstrutor.get_class_for_model( |
|
|
'materia']['proposicao'].serializer_class(page, many=True) |
|
|
Proposicao).serializer_class(page, many=True) |
|
|
return self.get_paginated_response(serializer.data) |
|
|
return self.get_paginated_response(serializer.data) |
|
|
|
|
|
|
|
|
serializer = self.get_serializer(page, many=True) |
|
|
serializer = self.get_serializer(page, many=True) |
|
|
return Response(serializer.data) |
|
|
return Response(serializer.data) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _ProposicaoViewSet(SaplSetViews['materia']['proposicao']): |
|
|
@customize(Proposicao) |
|
|
|
|
|
class _ProposicaoViewSet(): |
|
|
""" |
|
|
""" |
|
|
list: |
|
|
list: |
|
|
Retorna lista de Proposições |
|
|
Retorna lista de Proposições |
|
@ -345,7 +383,8 @@ class _ProposicaoViewSet(SaplSetViews['materia']['proposicao']): |
|
|
return qs |
|
|
return qs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _MateriaLegislativaViewSet(SaplSetViews['materia']['materialegislativa']): |
|
|
@customize(MateriaLegislativa) |
|
|
|
|
|
class _MateriaLegislativaViewSet: |
|
|
|
|
|
|
|
|
@action(detail=True, methods=['GET']) |
|
|
@action(detail=True, methods=['GET']) |
|
|
def ultima_tramitacao(self, request, *args, **kwargs): |
|
|
def ultima_tramitacao(self, request, *args, **kwargs): |
|
@ -356,13 +395,14 @@ class _MateriaLegislativaViewSet(SaplSetViews['materia']['materialegislativa']): |
|
|
|
|
|
|
|
|
ultima_tramitacao = materia.tramitacao_set.last() |
|
|
ultima_tramitacao = materia.tramitacao_set.last() |
|
|
|
|
|
|
|
|
serializer_class = SaplSetViews[ |
|
|
serializer_class = SaplApiViewSetConstrutor.get_class_for_model( |
|
|
'materia']['tramitacao'].serializer_class(ultima_tramitacao) |
|
|
Tramitacao).serializer_class(ultima_tramitacao) |
|
|
|
|
|
|
|
|
return Response(serializer_class.data) |
|
|
return Response(serializer_class.data) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _TipoMateriaLegislativaViewSet(SaplSetViews['materia']['tipomaterialegislativa']): |
|
|
@customize(TipoMateriaLegislativa) |
|
|
|
|
|
class _TipoMateriaLegislativaViewSet: |
|
|
|
|
|
|
|
|
@action(detail=True, methods=['POST']) |
|
|
@action(detail=True, methods=['POST']) |
|
|
def change_position(self, request, *args, **kwargs): |
|
|
def change_position(self, request, *args, **kwargs): |
|
@ -379,7 +419,8 @@ class _TipoMateriaLegislativaViewSet(SaplSetViews['materia']['tipomaterialegisla |
|
|
return Response(result) |
|
|
return Response(result) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _DocumentoAdministrativoViewSet(SaplSetViews['protocoloadm']['documentoadministrativo']): |
|
|
@customize(DocumentoAdministrativo) |
|
|
|
|
|
class _DocumentoAdministrativoViewSet: |
|
|
|
|
|
|
|
|
class DocumentoAdministrativoPermission(SaplModelPermissions): |
|
|
class DocumentoAdministrativoPermission(SaplModelPermissions): |
|
|
def has_permission(self, request, view): |
|
|
def has_permission(self, request, view): |
|
@ -413,8 +454,8 @@ class _DocumentoAdministrativoViewSet(SaplSetViews['protocoloadm']['documentoadm |
|
|
return qs |
|
|
return qs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _DocumentoAcessorioAdministrativoViewSet( |
|
|
@customize(DocumentoAcessorioAdministrativo) |
|
|
SaplSetViews['protocoloadm']['documentoacessorioadministrativo']): |
|
|
class _DocumentoAcessorioAdministrativoViewSet: |
|
|
|
|
|
|
|
|
permission_classes = ( |
|
|
permission_classes = ( |
|
|
_DocumentoAdministrativoViewSet.DocumentoAdministrativoPermission, ) |
|
|
_DocumentoAdministrativoViewSet.DocumentoAdministrativoPermission, ) |
|
@ -427,9 +468,8 @@ class _DocumentoAcessorioAdministrativoViewSet( |
|
|
return qs |
|
|
return qs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _TramitacaoAdministrativoViewSet( |
|
|
@customize(TramitacaoAdministrativo) |
|
|
SaplSetViews['protocoloadm']['tramitacaoadministrativo'], |
|
|
class _TramitacaoAdministrativoViewSet(BusinessRulesNotImplementedMixin): |
|
|
BusinessRulesNotImplementedMixin): |
|
|
|
|
|
# TODO: Implementar regras de manutenção das tramitações de docs adms |
|
|
# TODO: Implementar regras de manutenção das tramitações de docs adms |
|
|
|
|
|
|
|
|
permission_classes = ( |
|
|
permission_classes = ( |
|
@ -443,8 +483,8 @@ class _TramitacaoAdministrativoViewSet( |
|
|
return qs |
|
|
return qs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _SessaoPlenariaViewSet( |
|
|
@customize(SessaoPlenaria) |
|
|
SaplSetViews['sessao']['sessaoplenaria']): |
|
|
class _SessaoPlenariaViewSet: |
|
|
|
|
|
|
|
|
@action(detail=False) |
|
|
@action(detail=False) |
|
|
def years(self, request, *args, **kwargs): |
|
|
def years(self, request, *args, **kwargs): |
|
@ -452,19 +492,3 @@ class _SessaoPlenariaViewSet( |
|
|
|
|
|
|
|
|
serializer = ChoiceSerializer(years, many=True) |
|
|
serializer = ChoiceSerializer(years, many=True) |
|
|
return Response(serializer.data) |
|
|
return Response(serializer.data) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SaplSetViews['base']['autor'] = _AutorViewSet.build_class_with_actions() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SaplSetViews['materia']['materialegislativa'] = _MateriaLegislativaViewSet |
|
|
|
|
|
SaplSetViews['materia']['proposicao'] = _ProposicaoViewSet |
|
|
|
|
|
SaplSetViews['materia']['tipomaterialegislativa'] = _TipoMateriaLegislativaViewSet |
|
|
|
|
|
|
|
|
|
|
|
SaplSetViews['parlamentares']['parlamentar'] = _ParlamentarViewSet |
|
|
|
|
|
|
|
|
|
|
|
SaplSetViews['protocoloadm']['documentoadministrativo'] = _DocumentoAdministrativoViewSet |
|
|
|
|
|
SaplSetViews['protocoloadm']['documentoacessorioadministrativo'] = _DocumentoAcessorioAdministrativoViewSet |
|
|
|
|
|
SaplSetViews['protocoloadm']['tramitacaoadministrativo'] = _TramitacaoAdministrativoViewSet |
|
|
|
|
|
|
|
|
|
|
|
SaplSetViews['sessao']['sessaoplenaria'] = _SessaoPlenariaViewSet |
|
|
|
|
|