|
|
@ -245,9 +245,48 @@ SaplApiViewSetConstrutor.build_class() |
|
|
|
# das possibilidades para uma classe normal criada a partir de |
|
|
|
# rest_framework.viewsets.ModelViewSet conforme exemplo para a classe autor |
|
|
|
|
|
|
|
# decorator para recuperar e transformar o default |
|
|
|
# decorator que processa um endpoint detail trivial com base no model passado, |
|
|
|
# Um endpoint detail geralmente é um conteúdo baseado numa FK com outros possíveis filtros |
|
|
|
# e os passados pelo proprio cliente, além de o serializer e o filterset |
|
|
|
# ser desse model passado |
|
|
|
|
|
|
|
|
|
|
|
class wrapper_queryset_response_for_drf_action(object): |
|
|
|
def __init__(self, model): |
|
|
|
self.model = model |
|
|
|
|
|
|
|
def __call__(self, cls): |
|
|
|
|
|
|
|
def wrapper(instance_view, *args, **kwargs): |
|
|
|
# recupera a viewset do model anotado |
|
|
|
iv = instance_view |
|
|
|
viewset_from_model = SaplApiViewSetConstrutor._built_sets[ |
|
|
|
self.model._meta.app_config][self.model] |
|
|
|
|
|
|
|
# apossa da instancia da viewset mae do action |
|
|
|
# em uma viewset que processa dados do model passado no decorator |
|
|
|
iv.queryset = viewset_from_model.queryset |
|
|
|
iv.serializer_class = viewset_from_model.serializer_class |
|
|
|
iv.filterset_class = viewset_from_model.filterset_class |
|
|
|
|
|
|
|
iv.queryset = instance_view.filter_queryset( |
|
|
|
iv.get_queryset()) |
|
|
|
|
|
|
|
# chama efetivamente o metodo anotado que deve devolver um queryset |
|
|
|
# com os filtros específicos definido pelo programador customizador |
|
|
|
qs = cls(instance_view, *args, **kwargs) |
|
|
|
|
|
|
|
page = iv.paginate_queryset(qs) |
|
|
|
data = iv.serializer_class( |
|
|
|
page if page is not None else qs, many=True).data |
|
|
|
|
|
|
|
return iv.get_paginated_response( |
|
|
|
data) if page is not None else Response(data) |
|
|
|
|
|
|
|
return wrapper |
|
|
|
|
|
|
|
|
|
|
|
# decorator para recuperar e transformar o default |
|
|
|
class customize(object): |
|
|
|
def __init__(self, model): |
|
|
|
self.model = model |
|
|
@ -368,16 +407,12 @@ class _ParlamentarViewSet: |
|
|
|
# deve coincidir com |
|
|
|
# /parlamentar/{pk}/proposicao |
|
|
|
|
|
|
|
# viewset proposicao |
|
|
|
api_proposicao = SaplApiViewSetConstrutor.get_class_for_model( |
|
|
|
Proposicao |
|
|
|
) |
|
|
|
return self.get_proposicoes(**kwargs) |
|
|
|
|
|
|
|
self.serializer_class = api_proposicao.serializer_class |
|
|
|
self.filterset_class = api_proposicao.filterset_class |
|
|
|
self.queryset = Proposicao.objects.all() |
|
|
|
@wrapper_queryset_response_for_drf_action(model=Proposicao) |
|
|
|
def get_proposicoes(self, **kwargs): |
|
|
|
|
|
|
|
qs = self.filter_queryset(self.get_queryset()) |
|
|
|
qs = self.get_queryset() |
|
|
|
|
|
|
|
qs = qs.filter( |
|
|
|
data_envio__isnull=False, |
|
|
@ -386,13 +421,7 @@ class _ParlamentarViewSet: |
|
|
|
autor__object_id=kwargs['pk'], |
|
|
|
autor__content_type=ContentType.objects.get_for_model(Parlamentar) |
|
|
|
) |
|
|
|
|
|
|
|
page = self.paginate_queryset(qs) |
|
|
|
data = self.serializer_class( |
|
|
|
page if page is not None else qs, many=True).data |
|
|
|
|
|
|
|
return self.get_paginated_response( |
|
|
|
data) if page is not None else Response(data) |
|
|
|
return qs |
|
|
|
|
|
|
|
@action(detail=True) |
|
|
|
def parlamentares_by_legislatura(self, request, *args, **kwargs): |
|
|
@ -618,25 +647,11 @@ class _SessaoPlenariaViewSet: |
|
|
|
|
|
|
|
@action(detail=True) |
|
|
|
def expedientes(self, request, *args, **kwargs): |
|
|
|
return self.get_expedientes(**kwargs) |
|
|
|
|
|
|
|
sessao = self.get_object() |
|
|
|
# viewset expediente |
|
|
|
api_expediente = SaplApiViewSetConstrutor.get_class_for_model( |
|
|
|
ExpedienteSessao |
|
|
|
) |
|
|
|
|
|
|
|
self.serializer_class = api_expediente.serializer_class |
|
|
|
self.filterset_class = api_expediente.filterset_class |
|
|
|
self.queryset = sessao.expedientesessao_set.all() |
|
|
|
|
|
|
|
qs = self.filter_queryset(self.get_queryset()) |
|
|
|
|
|
|
|
page = self.paginate_queryset(qs) |
|
|
|
data = self.serializer_class( |
|
|
|
page if page is not None else qs, many=True).data |
|
|
|
|
|
|
|
return self.get_paginated_response( |
|
|
|
data) if page is not None else Response(data) |
|
|
|
@wrapper_queryset_response_for_drf_action(model=ExpedienteSessao) |
|
|
|
def get_expedientes(self, **kwargs): |
|
|
|
return self.get_queryset().filter(sessao_plenaria_id=kwargs['pk']) |
|
|
|
|
|
|
|
|
|
|
|
@customize(NormaJuridica) |
|
|
|