|
|
@ -1,15 +1,16 @@ |
|
|
|
|
|
|
|
from django.db.models import Q |
|
|
|
from django.http import Http404 |
|
|
|
from django.utils.translation import ugettext_lazy as _ |
|
|
|
from rest_framework.filters import DjangoFilterBackend |
|
|
|
from rest_framework.generics import ListAPIView |
|
|
|
from rest_framework.permissions import IsAuthenticated |
|
|
|
from rest_framework.permissions import IsAuthenticated, AllowAny |
|
|
|
|
|
|
|
from sapl.api.forms import AutorChoiceFilterSet |
|
|
|
from sapl.api.serializers import ChoiceSerializer, AutorSerializer,\ |
|
|
|
AutorChoiceSerializer |
|
|
|
from sapl.base.models import Autor, TipoAutor |
|
|
|
from sapl.utils import SaplGenericRelation |
|
|
|
from sapl.utils import SaplGenericRelation, sapl_logger |
|
|
|
|
|
|
|
|
|
|
|
class AutorListView(ListAPIView): |
|
|
@ -17,12 +18,28 @@ class AutorListView(ListAPIView): |
|
|
|
Listagem de Autores com filtro para autores já cadastrados |
|
|
|
e/ou possíveis autores. |
|
|
|
|
|
|
|
- tr - tipo do resultado |
|
|
|
Prepera Lista de Autores para 3 cenários distintos |
|
|
|
-default = 0 |
|
|
|
|
|
|
|
= 1 -> para (value, text) usados geralmente |
|
|
|
em combobox, radiobox, checkbox, etc com pesquisa básica |
|
|
|
de Autores feita pelo django-filter |
|
|
|
-> processo usado nas pesquisas, o mais usado. |
|
|
|
|
|
|
|
= 2 -> para (value, text) usados geralmente |
|
|
|
em combobox, radiobox, checkbox, etc com pesquisa básica |
|
|
|
de Autores mas feito para Possíveis Autores armazenados |
|
|
|
segundo o ContentType associado ao Tipo de Autor via |
|
|
|
relacionamento genérico. |
|
|
|
Busca feita sem django-filter processada no get_queryset |
|
|
|
-> processo no cadastro de autores para seleção e busca |
|
|
|
dos possíveis autores |
|
|
|
|
|
|
|
= 3 -> Devolve instancias da classe Autor filtradas pelo |
|
|
|
django-filter |
|
|
|
|
|
|
|
- tipo - chave primária do Tipo de Autor a ser filtrado |
|
|
|
- provaveis - variável sem relevância de valor, porém, sua presença |
|
|
|
faz com que a AutorListView |
|
|
|
mostre a lista de provaveis Autores armazenados segundo o |
|
|
|
ContentType associado ao Tipo de Autor via relacionamento |
|
|
|
genérico. |
|
|
|
- q - busca textual no nome do Autor ou em fields_search |
|
|
|
declarados no field SaplGenericRelation das GenericFks |
|
|
|
|
|
|
@ -30,22 +47,54 @@ class AutorListView(ListAPIView): |
|
|
|
estiver presente a variável `provaveis`. Em caso |
|
|
|
contrário, o django-filter é desativado e a busca é feita |
|
|
|
no model do ContentType associado ao tipo. |
|
|
|
|
|
|
|
Outros campos |
|
|
|
""" |
|
|
|
|
|
|
|
TR_AUTOR_CHOICE_SERIALIZER = 1 |
|
|
|
TR_CHOICE_SERIALIZER = 2 |
|
|
|
TR_AUTOR_SERIALIZER = 3 |
|
|
|
|
|
|
|
# FIXME aplicar permissão correta de usuário |
|
|
|
permission_classes = (IsAuthenticated,) |
|
|
|
permission_classes = (AllowAny,) |
|
|
|
serializer_class = AutorSerializer |
|
|
|
queryset = Autor.objects.all() |
|
|
|
model = Autor |
|
|
|
|
|
|
|
filter_class = AutorChoiceFilterSet |
|
|
|
filter_backends = (DjangoFilterBackend, ) |
|
|
|
serializer_class = AutorChoiceSerializer |
|
|
|
|
|
|
|
@property |
|
|
|
def tr(self): |
|
|
|
try: |
|
|
|
tr = int(self.request.GET.get |
|
|
|
('tr', AutorListView.TR_AUTOR_CHOICE_SERIALIZER)) |
|
|
|
|
|
|
|
assert tr in ( |
|
|
|
AutorListView.TR_AUTOR_CHOICE_SERIALIZER, |
|
|
|
AutorListView.TR_CHOICE_SERIALIZER, |
|
|
|
AutorListView.TR_AUTOR_SERIALIZER), sapl_logger.info( |
|
|
|
_("Tipo do Resultado a ser fornecido não existe!")) |
|
|
|
except: |
|
|
|
return AutorListView.TR_AUTOR_CHOICE_SERIALIZER |
|
|
|
else: |
|
|
|
return tr |
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs): |
|
|
|
""" |
|
|
|
desativa o django-filter se a busca for por provaveis autores |
|
|
|
desativa o django-filter se a busca for por possiveis autores |
|
|
|
parametro tr = TR_CHOICE_SERIALIZER |
|
|
|
""" |
|
|
|
provaveis = 'provaveis' in request.GET |
|
|
|
self.filter_class = None if provaveis else AutorChoiceFilterSet |
|
|
|
self.filter_backends = [] if provaveis else [DjangoFilterBackend] |
|
|
|
self.serializer_class = ChoiceSerializer\ |
|
|
|
if provaveis else AutorChoiceSerializer |
|
|
|
|
|
|
|
if self.tr == AutorListView.TR_CHOICE_SERIALIZER: |
|
|
|
self.filter_class = None |
|
|
|
self.filter_backends = [] |
|
|
|
self.serializer_class = ChoiceSerializer |
|
|
|
|
|
|
|
elif self.tr == AutorListView.TR_AUTOR_SERIALIZER: |
|
|
|
self.serializer_class = AutorSerializer |
|
|
|
self.permission_classes = (IsAuthenticated,) |
|
|
|
|
|
|
|
return ListAPIView.get(self, request, *args, **kwargs) |
|
|
|
|
|
|
@ -81,11 +130,19 @@ class AutorListView(ListAPIView): |
|
|
|
field.related_model == Autor, |
|
|
|
model_class._meta.get_fields(include_hidden=True))) |
|
|
|
|
|
|
|
# retirar assert |
|
|
|
assert len(fields) == 1 |
|
|
|
""" |
|
|
|
fields - é um array de SaplGenericRelation que deve possuir o |
|
|
|
atributo fields_search. Verifique na documentação da classe |
|
|
|
a estrutura de fields_search. |
|
|
|
""" |
|
|
|
|
|
|
|
assert len(fields) >= 1, (_( |
|
|
|
'Não foi encontrado em %(model)s um atributo do tipo ' |
|
|
|
'SaplGenericRelation que use o model %(model_autor)s') % { |
|
|
|
'model': model_class._meta.verbose_name, |
|
|
|
'model_autor': Autor._meta.verbose_name}) |
|
|
|
|
|
|
|
qs = model_class.objects.all().order_by( |
|
|
|
fields[0].fields_search[0][0]) |
|
|
|
qs = model_class.objects.all() |
|
|
|
|
|
|
|
q_filter = Q() |
|
|
|
if q: |
|
|
@ -102,8 +159,10 @@ class AutorListView(ListAPIView): |
|
|
|
qs = qs.filter(q_filter).distinct( |
|
|
|
fields[0].fields_search[0][0]) |
|
|
|
|
|
|
|
qs = qs.values_list('id', fields[0].fields_search[0][0]) |
|
|
|
|
|
|
|
qs = qs.order_by(fields[0].fields_search[0][0]).values_list( |
|
|
|
'id', fields[0].fields_search[0][0]) |
|
|
|
r += list(qs) |
|
|
|
r.sort(key=lambda x: x[1]) |
|
|
|
|
|
|
|
if tipos.count() > 1: |
|
|
|
r.sort(key=lambda x: x[1].upper()) |
|
|
|
return r |
|
|
|