Browse Source

refatoração de actions trivais tipo de Autores do sapl

pull/2465/head
Leandro Roberto 6 years ago
parent
commit
c568792121
  1. 104
      sapl/api/views.py

104
sapl/api/views.py

@ -18,9 +18,11 @@ from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet from rest_framework.viewsets import ModelViewSet
from sapl.api.permissions import SaplModelPermissions from sapl.api.permissions import SaplModelPermissions
from sapl.base.models import Autor
from sapl.comissoes.models import Comissao from sapl.comissoes.models import Comissao
from sapl.materia.models import Proposicao from sapl.materia.models import Proposicao
from sapl.parlamentares.models import Parlamentar from sapl.parlamentares.models import Parlamentar
from sapl.utils import models_with_gr_for_model
class SaplApiViewSetConstrutor(ModelViewSet): class SaplApiViewSetConstrutor(ModelViewSet):
@ -203,45 +205,37 @@ SaplSetViews = SaplApiViewSetConstrutor.build_class()
# 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
# ALGUNS EXEMPLOS
# Customização para AutorViewSet com implementação de actions específicas
class _AutorViewSet(SaplSetViews['base']['autor']): class _AutorViewSet(SaplSetViews['base']['autor']):
# OBS: esta classe é um exemplo e não contempla uma customização completa.
""" """
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
rest_framework.viewsets.ModelViewSet, dentre outras customizações rest_framework.viewsets.ModelViewSet, dentre outras customizações
possíveis, foi adicionado mais duas rotas, que neste exemplo seria: possíveis, foi adicionado as rotas referentes aos relacionamentos genéricos
padrão de ModelViewSet * padrão de ModelViewSet
http://localhost:9000/api/base/autor/ POST - create /api/base/autor/ POST - create
http://localhost:9000/api/base/autor/ GET - list /api/base/autor/ GET - list
http://localhost:9000/api/base/autor/{pk}/ GET - detail /api/base/autor/{pk}/ GET - detail
http://localhost:9000/api/base/autor/{pk}/ PUT - update /api/base/autor/{pk}/ PUT - update
http://localhost:9000/api/base/autor/{pk}/ DELETE - destroy /api/base/autor/{pk}/ PATCH - partial_update
/api/base/autor/{pk}/ DELETE - destroy
rotas desta classe local:
http://localhost:9000/api/base/autor/parlamentares * rotas desta classe local:
devolve apenas autores que são parlamentares /api/base/autor/parlamentar
http://localhost:9000/api/base/autor/comissoes devolve apenas autores que são parlamentares
devolve apenas autores que são comissões /api/base/autor/comissao
devolve apenas autores que são comissões
estas mesmas listas oferecidas conforme acima, poderiam ser pesquisadas /api/base/autor/bloco
sabendo a informação que propicia seu filtro através, pois do django_filter devolve apenas autores que são blocos parlamentares
/api/base/autor/bancada
no caso o ambiente de desenvolvimento no momento da escrita desse how-to: devolve apenas autores que são bancadas parlamentares
http://localhost:9000/api/base/autor/?content_type=26 para parlamentares /api/base/autor/frente
http://localhost:9000/api/base/autor/?content_type=37 para comissoes devolve apenas autores que são Frene parlamentares
/api/base/autor/orgao
diferenças como estas podem ser crusciais para uso da api devolve apenas autores que são Órgãos
neste caso em específico, content_types não são públicos e não possuem
clareza
isso:
http://localhost:9000/api/base/autor/parlamentares
faz o mesmo que isso:
http://localhost:9000/api/base/autor/?content_type=26
mas o primeiro é indiscutivelmente de melhor compreensão.
""" """
@ -257,26 +251,40 @@ class _AutorViewSet(SaplSetViews['base']['autor']):
serializer = self.get_serializer(page, many=True) serializer = self.get_serializer(page, many=True)
return Response(serializer.data) return Response(serializer.data)
@action(detail=False) @classonlymethod
def parlamentares(self, request, *args, **kwargs): def build_class_with_actions(cls):
# list /api/base/autor/parlamentares
content_type = ContentType.objects.get_for_model(Parlamentar)
return self.list_for_content_type(content_type)
@action(detail=False) models_with_gr_for_autor = models_with_gr_for_model(Autor)
def comissoes(self, request, *args, **kwargs):
# list /api/base/autor/comissoes
content_type = ContentType.objects.get_for_model(Comissao)
return self.list_for_content_type(content_type)
# Com isso redefinimos AutorViewSet com mais duas rotas
# além das rotas padrão
for _model in models_with_gr_for_autor:
class _ParlamentarViewSet(SaplSetViews['parlamentares']['parlamentar']): @action(detail=False, name=_model._meta.model_name)
def actionclass(self, request, *args, **kwargs):
model = getattr(self, self.action)._AutorViewSet__model
content_type = ContentType.objects.get_for_model(model)
return self.list_for_content_type(content_type)
func = actionclass
func.mapping['get'] = func.kwargs['name']
func.url_name = func.kwargs['name']
func.url_path = func.kwargs['name']
func.__model = _model
setattr(cls, _model._meta.model_name, func)
return cls
class _ParlamentarViewSet(SaplSetViews['parlamentares']['parlamentar']):
@action(detail=True) @action(detail=True)
def proposicoes(self, request, *args, **kwargs): def proposicoes(self, request, *args, **kwargs):
# /api/parlamentares/parlamentar/{pk}/proposicoes/ """
Lista de proposições públicas de parlamentar específico
:param int id: - Identificador do parlamentar que se quer recuperar as proposições
:return: uma lista de proposições
"""
# /api/parlamentares/parlamentar/{id}/proposicoes/
# recupera proposições enviadas e incorporadas do parlamentar # recupera proposições enviadas e incorporadas do parlamentar
# deve coincidir com # deve coincidir com
# /parlamentar/{pk}/proposicao # /parlamentar/{pk}/proposicao
@ -353,6 +361,6 @@ class _ProposicaoViewSet(SaplSetViews['materia']['proposicao']):
return qs return qs
SaplSetViews['base']['autor'] = _AutorViewSet SaplSetViews['base']['autor'] = _AutorViewSet.build_class_with_actions()
SaplSetViews['materia']['proposicao'] = _ProposicaoViewSet SaplSetViews['materia']['proposicao'] = _ProposicaoViewSet
SaplSetViews['parlamentares']['parlamentar'] = _ParlamentarViewSet SaplSetViews['parlamentares']['parlamentar'] = _ParlamentarViewSet

Loading…
Cancel
Save