We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Todos os autores disponíveis para seleção
Estão sendo mostrados para seleção em protocolo e matérias, todos os autores, inclusive os inativos no sistema

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `sapl/api/views.py`
Content:
```
1 from django.contrib.contenttypes.models import ContentType
2 from django.db.models import Q
3 from django.http import Http404
4 from django.utils.translation import ugettext_lazy as _
5 from rest_framework.filters import DjangoFilterBackend
6 from rest_framework.generics import ListAPIView
7 from rest_framework.mixins import ListModelMixin, RetrieveModelMixin
8 from rest_framework.permissions import (AllowAny, IsAuthenticated,
9                                         IsAuthenticatedOrReadOnly)
10 from rest_framework.viewsets import GenericViewSet, ModelViewSet
11 
12 from sapl.api.forms import AutorChoiceFilterSet, AutorSearchForFieldFilterSet
13 from sapl.api.serializers import (AutorChoiceSerializer, AutorSerializer,
14                                   ChoiceSerializer,
15                                   MateriaLegislativaSerializer,
16                                   ModelChoiceSerializer,
17                                   SessaoPlenariaSerializer)
18 from sapl.base.models import Autor, TipoAutor
19 from sapl.materia.models import MateriaLegislativa
20 from sapl.sessao.models import SessaoPlenaria
21 from sapl.utils import SaplGenericRelation, sapl_logger
22 
23 
24 class ModelChoiceView(ListAPIView):
25 
26     # FIXME aplicar permissão correta de usuário
27     permission_classes = (IsAuthenticated,)
28     serializer_class = ModelChoiceSerializer
29 
30     def get(self, request, *args, **kwargs):
31         self.model = ContentType.objects.get_for_id(
32             self.kwargs['content_type']).model_class()
33 
34         pagination = request.GET.get('pagination', '')
35 
36         if pagination == 'False':
37             self.pagination_class = None
38 
39         return ListAPIView.get(self, request, *args, **kwargs)
40 
41     def get_queryset(self):
42         return self.model.objects.all()
43 
44 
45 class AutorListView(ListAPIView):
46     """
47     Listagem de Autores com filtro para autores já cadastrados
48     e/ou possíveis autores.
49 
50     - tr          - tipo do resultado
51                     Prepera Lista de Autores para 3 cenários distintos
52 
53                     - default = 1
54 
55                   = 1 -> para (value, text) usados geralmente
56                       em combobox, radiobox, checkbox, etc com pesquisa básica
57                       de Autores feita pelo django-filter
58                       -> processo usado nas pesquisas, o mais usado.
59 
60                   = 2 -> para (value, text) usados geralmente
61                       em combobox, radiobox, checkbox, etc com pesquisa básica
62                       de Autores mas feito para Possíveis Autores armazenados
63                       segundo o ContentType associado ao Tipo de Autor via
64                       relacionamento genérico.
65                       Busca feita sem django-filter processada no get_queryset
66                       -> processo no cadastro de autores para seleção e busca
67                           dos possíveis autores
68 
69                   = 3 -> Devolve instancias da classe Autor filtradas pelo
70                          django-filter
71 
72     - tipo      - chave primária do Tipo de Autor a ser filtrado
73 
74     - q         - busca textual no nome do Autor ou em  fields_search
75                   declarados no field SaplGenericRelation das GenericFks
76                       A busca textual acontece via django-filter com a
77                       variável `tr` igual 1 ou 3. Em caso contrário,
78                       o django-filter é desativado e a busca é feita
79                       no model do ContentType associado ao tipo.
80 
81     - q_0 / q_1 - q_0 faz o código ignorar "q"...
82 
83                   q_0 -> campos lookup a serem filtrados em qualquer Model
84                   que implemente SaplGenericRelation
85                   q_1 -> o valor que será pesquisado no lookup de q_0
86 
87                   q_0 e q_1 podem ser separados por ","... isso dará a
88                   possibilidade de filtrar mais de um campo. 
89 
90 
91                   http://localhost:8000
92                       /api/autor?tr=1&q_0=parlamentar_set__ativo&q_1=False
93                       /api/autor?tr=1&q_0=parlamentar_set__ativo&q_1=True
94                       /api/autor?tr=3&q_0=parlamentar_set__ativo&q_1=False
95                       /api/autor?tr=3&q_0=parlamentar_set__ativo&q_1=True
96 
97                   http://localhost:8000
98                       /api/autor?tr=1
99                           &q_0=parlamentar_set__nome_completo__icontains,
100                                parlamentar_set__ativo
101                           &q_1=Carvalho,False
102                       /api/autor?tr=1
103                           &q_0=parlamentar_set__nome_completo__icontains,
104                                parlamentar_set__ativo
105                           &q_1=Carvalho,True
106                       /api/autor?tr=3
107                           &q_0=parlamentar_set__nome_completo__icontains,
108                                parlamentar_set__ativo
109                           &q_1=Carvalho,False
110                       /api/autor?tr=3
111                           &q_0=parlamentar_set__nome_completo__icontains,
112                                parlamentar_set__ativo
113                           &q_1=Carvalho,True
114 
115 
116                   não importa o campo que vc passe de qualquer dos Models
117                   ligados... é possível ver que models são esses, 
118                       na ocasião do commit deste texto, executando:
119                         In [6]: from sapl.utils import models_with_gr_for_model
120 
121                         In [7]: models_with_gr_for_model(Autor)
122                         Out[7]:
123                         [sapl.parlamentares.models.Parlamentar,
124                          sapl.parlamentares.models.Frente,
125                          sapl.comissoes.models.Comissao,
126                          sapl.materia.models.Orgao,
127                          sapl.sessao.models.Bancada,
128                          sapl.sessao.models.Bloco]
129 
130                       qualquer atributo destes models podem ser passados 
131                       para busca
132     """
133 
134     TR_AUTOR_CHOICE_SERIALIZER = 1
135     TR_CHOICE_SERIALIZER = 2
136     TR_AUTOR_SERIALIZER = 3
137 
138     # FIXME aplicar permissão correta de usuário
139     permission_classes = (IsAuthenticatedOrReadOnly,)
140     queryset = Autor.objects.all()
141     model = Autor
142 
143     filter_class = AutorChoiceFilterSet
144     filter_backends = (DjangoFilterBackend, )
145     serializer_class = AutorChoiceSerializer
146 
147     @property
148     def tr(self):
149         try:
150             tr = int(self.request.GET.get
151                      ('tr', AutorListView.TR_AUTOR_CHOICE_SERIALIZER))
152 
153             assert tr in (
154                 AutorListView.TR_AUTOR_CHOICE_SERIALIZER,
155                 AutorListView.TR_CHOICE_SERIALIZER,
156                 AutorListView.TR_AUTOR_SERIALIZER), sapl_logger.info(
157                 _("Tipo do Resultado a ser fornecido não existe!"))
158         except:
159             return AutorListView.TR_AUTOR_CHOICE_SERIALIZER
160         else:
161             return tr
162 
163     def get(self, request, *args, **kwargs):
164         """
165             desativa o django-filter se a busca for por possiveis autores
166             parametro tr = TR_CHOICE_SERIALIZER
167         """
168         if self.tr == AutorListView.TR_CHOICE_SERIALIZER:
169             self.filter_class = None
170             self.filter_backends = []
171             self.serializer_class = ChoiceSerializer
172 
173         elif self.tr == AutorListView.TR_AUTOR_SERIALIZER:
174             self.serializer_class = AutorSerializer
175             self.permission_classes = (IsAuthenticated,)
176 
177         if self.filter_class and 'q_0' in request.GET:
178             self.filter_class = AutorSearchForFieldFilterSet
179 
180         return ListAPIView.get(self, request, *args, **kwargs)
181 
182     def get_queryset(self):
183         queryset = ListAPIView.get_queryset(self)
184 
185         if self.filter_backends:
186             return queryset
187 
188         params = {'content_type__isnull': False}
189 
190         tipo = ''
191         try:
192             tipo = int(self.request.GET.get('tipo', ''))
193             if tipo:
194                 params['id'] = tipo
195         except:
196             pass
197 
198         tipos = TipoAutor.objects.filter(**params)
199 
200         if not tipos.exists() and tipo:
201             raise Http404()
202 
203         r = []
204         for tipo in tipos:
205             q = self.request.GET.get('q', '').strip()
206 
207             model_class = tipo.content_type.model_class()
208 
209             fields = list(filter(
210                 lambda field: isinstance(field, SaplGenericRelation) and
211                 field.related_model == Autor,
212                 model_class._meta.get_fields(include_hidden=True)))
213 
214             """
215             fields - é um array de SaplGenericRelation que deve possuir o
216                  atributo fields_search. Verifique na documentação da classe
217                  a estrutura de fields_search.
218             """
219 
220             assert len(fields) >= 1, (_(
221                 'Não foi encontrado em %(model)s um atributo do tipo '
222                 'SaplGenericRelation que use o model %(model_autor)s') % {
223                 'model': model_class._meta.verbose_name,
224                 'model_autor': Autor._meta.verbose_name})
225 
226             qs = model_class.objects.all()
227 
228             q_filter = Q()
229             if q:
230                 for item in fields:
231                     if item.related_model != Autor:
232                         continue
233                     q_fs = Q()
234                     for field in item.fields_search:
235                         q_fs = q_fs | Q(**{'%s%s' % (
236                             field[0],
237                             field[1]): q})
238                     q_filter = q_filter & q_fs
239 
240                 qs = qs.filter(q_filter).distinct(
241                     fields[0].fields_search[0][0]).order_by(
242                         fields[0].fields_search[0][0])
243             else:
244                 qs = qs.order_by(fields[0].fields_search[0][0])
245 
246             qs = qs.values_list(
247                 'id', fields[0].fields_search[0][0])
248             r += list(qs)
249 
250         if tipos.count() > 1:
251             r.sort(key=lambda x: x[1].upper())
252         return r
253 
254 
255 class MateriaLegislativaViewSet(ListModelMixin,
256                                 RetrieveModelMixin,
257                                 GenericViewSet):
258 
259     permission_classes = (IsAuthenticated,)
260     serializer_class = MateriaLegislativaSerializer
261     queryset = MateriaLegislativa.objects.all()
262     filter_backends = (DjangoFilterBackend,)
263     filter_fields = ('numero', 'ano', 'tipo', )
264 
265 
266 class SessaoPlenariaViewSet(ListModelMixin,
267                             RetrieveModelMixin,
268                             GenericViewSet):
269 
270     permission_classes = (AllowAny,)
271     serializer_class = SessaoPlenariaSerializer
272     queryset = SessaoPlenaria.objects.all()
273     filter_backends = (DjangoFilterBackend,)
274     filter_fields = ('data_inicio', 'data_fim', 'interativa')
275
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/sapl/api/views.py b/sapl/api/views.py
--- a/sapl/api/views.py
+++ b/sapl/api/views.py
@@ -96,19 +96,19 @@
 
                   http://localhost:8000
                       /api/autor?tr=1
-                          &q_0=parlamentar_set__nome_completo__icontains,
+                          &q_0=parlamentar_set__nome_parlamentar__icontains,
                                parlamentar_set__ativo
                           &q_1=Carvalho,False
                       /api/autor?tr=1
-                          &q_0=parlamentar_set__nome_completo__icontains,
+                          &q_0=parlamentar_set__nome_parlamentar__icontains,
                                parlamentar_set__ativo
                           &q_1=Carvalho,True
                       /api/autor?tr=3
-                          &q_0=parlamentar_set__nome_completo__icontains,
+                          &q_0=parlamentar_set__nome_parlamentar__icontains,
                                parlamentar_set__ativo
                           &q_1=Carvalho,False
                       /api/autor?tr=3
-                          &q_0=parlamentar_set__nome_completo__icontains,
+                          &q_0=parlamentar_set__nome_parlamentar__icontains,
                                parlamentar_set__ativo
                           &q_1=Carvalho,True

{"golden_diff": "diff --git a/sapl/api/views.py b/sapl/api/views.py\n--- a/sapl/api/views.py\n+++ b/sapl/api/views.py\n@@ -96,19 +96,19 @@\n \n                   http://localhost:8000\n                       /api/autor?tr=1\n-                          &q_0=parlamentar_set__nome_completo__icontains,\n+                          &q_0=parlamentar_set__nome_parlamentar__icontains,\n                                parlamentar_set__ativo\n                           &q_1=Carvalho,False\n                       /api/autor?tr=1\n-                          &q_0=parlamentar_set__nome_completo__icontains,\n+                          &q_0=parlamentar_set__nome_parlamentar__icontains,\n                                parlamentar_set__ativo\n                           &q_1=Carvalho,True\n                       /api/autor?tr=3\n-                          &q_0=parlamentar_set__nome_completo__icontains,\n+                          &q_0=parlamentar_set__nome_parlamentar__icontains,\n                                parlamentar_set__ativo\n                           &q_1=Carvalho,False\n                       /api/autor?tr=3\n-                          &q_0=parlamentar_set__nome_completo__icontains,\n+                          &q_0=parlamentar_set__nome_parlamentar__icontains,\n                                parlamentar_set__ativo\n                           &q_1=Carvalho,True\n", "issue": "Todos os autores dispon\u00edveis para sele\u00e7\u00e3o\nEst\u00e3o sendo mostrados para sele\u00e7\u00e3o em protocolo e mat\u00e9rias, todos os autores, inclusive os inativos no sistema\n", "before_files": [{"content": "from django.contrib.contenttypes.models import ContentType\nfrom django.db.models import Q\nfrom django.http import Http404\nfrom django.utils.translation import ugettext_lazy as _\nfrom rest_framework.filters import DjangoFilterBackend\nfrom rest_framework.generics import ListAPIView\nfrom rest_framework.mixins import ListModelMixin, RetrieveModelMixin\nfrom rest_framework.permissions import (AllowAny, IsAuthenticated,\n                                        IsAuthenticatedOrReadOnly)\nfrom rest_framework.viewsets import GenericViewSet, ModelViewSet\n\nfrom sapl.api.forms import AutorChoiceFilterSet, AutorSearchForFieldFilterSet\nfrom sapl.api.serializers import (AutorChoiceSerializer, AutorSerializer,\n                                  ChoiceSerializer,\n                                  MateriaLegislativaSerializer,\n                                  ModelChoiceSerializer,\n                                  SessaoPlenariaSerializer)\nfrom sapl.base.models import Autor, TipoAutor\nfrom sapl.materia.models import MateriaLegislativa\nfrom sapl.sessao.models import SessaoPlenaria\nfrom sapl.utils import SaplGenericRelation, sapl_logger\n\n\nclass ModelChoiceView(ListAPIView):\n\n    # FIXME aplicar permiss\u00e3o correta de usu\u00e1rio\n    permission_classes = (IsAuthenticated,)\n    serializer_class = ModelChoiceSerializer\n\n    def get(self, request, *args, **kwargs):\n        self.model = ContentType.objects.get_for_id(\n            self.kwargs['content_type']).model_class()\n\n        pagination = request.GET.get('pagination', '')\n\n        if pagination == 'False':\n            self.pagination_class = None\n\n        return ListAPIView.get(self, request, *args, **kwargs)\n\n    def get_queryset(self):\n        return self.model.objects.all()\n\n\nclass AutorListView(ListAPIView):\n    \"\"\"\n    Listagem de Autores com filtro para autores j\u00e1 cadastrados\n    e/ou poss\u00edveis autores.\n\n    - tr          - tipo do resultado\n                    Prepera Lista de Autores para 3 cen\u00e1rios distintos\n\n                    - default = 1\n\n                  = 1 -> para (value, text) usados geralmente\n                      em combobox, radiobox, checkbox, etc com pesquisa b\u00e1sica\n                      de Autores feita pelo django-filter\n                      -> processo usado nas pesquisas, o mais usado.\n\n                  = 2 -> para (value, text) usados geralmente\n                      em combobox, radiobox, checkbox, etc com pesquisa b\u00e1sica\n                      de Autores mas feito para Poss\u00edveis Autores armazenados\n                      segundo o ContentType associado ao Tipo de Autor via\n                      relacionamento gen\u00e9rico.\n                      Busca feita sem django-filter processada no get_queryset\n                      -> processo no cadastro de autores para sele\u00e7\u00e3o e busca\n                          dos poss\u00edveis autores\n\n                  = 3 -> Devolve instancias da classe Autor filtradas pelo\n                         django-filter\n\n    - tipo      - chave prim\u00e1ria do Tipo de Autor a ser filtrado\n\n    - q         - busca textual no nome do Autor ou em  fields_search\n                  declarados no field SaplGenericRelation das GenericFks\n                      A busca textual acontece via django-filter com a\n                      vari\u00e1vel `tr` igual 1 ou 3. Em caso contr\u00e1rio,\n                      o django-filter \u00e9 desativado e a busca \u00e9 feita\n                      no model do ContentType associado ao tipo.\n\n    - q_0 / q_1 - q_0 faz o c\u00f3digo ignorar \"q\"...\n\n                  q_0 -> campos lookup a serem filtrados em qualquer Model\n                  que implemente SaplGenericRelation\n                  q_1 -> o valor que ser\u00e1 pesquisado no lookup de q_0\n\n                  q_0 e q_1 podem ser separados por \",\"... isso dar\u00e1 a\n                  possibilidade de filtrar mais de um campo. \n\n\n                  http://localhost:8000\n                      /api/autor?tr=1&q_0=parlamentar_set__ativo&q_1=False\n                      /api/autor?tr=1&q_0=parlamentar_set__ativo&q_1=True\n                      /api/autor?tr=3&q_0=parlamentar_set__ativo&q_1=False\n                      /api/autor?tr=3&q_0=parlamentar_set__ativo&q_1=True\n\n                  http://localhost:8000\n                      /api/autor?tr=1\n                          &q_0=parlamentar_set__nome_completo__icontains,\n                               parlamentar_set__ativo\n                          &q_1=Carvalho,False\n                      /api/autor?tr=1\n                          &q_0=parlamentar_set__nome_completo__icontains,\n                               parlamentar_set__ativo\n                          &q_1=Carvalho,True\n                      /api/autor?tr=3\n                          &q_0=parlamentar_set__nome_completo__icontains,\n                               parlamentar_set__ativo\n                          &q_1=Carvalho,False\n                      /api/autor?tr=3\n                          &q_0=parlamentar_set__nome_completo__icontains,\n                               parlamentar_set__ativo\n                          &q_1=Carvalho,True\n\n\n                  n\u00e3o importa o campo que vc passe de qualquer dos Models\n                  ligados... \u00e9 poss\u00edvel ver que models s\u00e3o esses, \n                      na ocasi\u00e3o do commit deste texto, executando:\n                        In [6]: from sapl.utils import models_with_gr_for_model\n\n                        In [7]: models_with_gr_for_model(Autor)\n                        Out[7]:\n                        [sapl.parlamentares.models.Parlamentar,\n                         sapl.parlamentares.models.Frente,\n                         sapl.comissoes.models.Comissao,\n                         sapl.materia.models.Orgao,\n                         sapl.sessao.models.Bancada,\n                         sapl.sessao.models.Bloco]\n\n                      qualquer atributo destes models podem ser passados \n                      para busca\n    \"\"\"\n\n    TR_AUTOR_CHOICE_SERIALIZER = 1\n    TR_CHOICE_SERIALIZER = 2\n    TR_AUTOR_SERIALIZER = 3\n\n    # FIXME aplicar permiss\u00e3o correta de usu\u00e1rio\n    permission_classes = (IsAuthenticatedOrReadOnly,)\n    queryset = Autor.objects.all()\n    model = Autor\n\n    filter_class = AutorChoiceFilterSet\n    filter_backends = (DjangoFilterBackend, )\n    serializer_class = AutorChoiceSerializer\n\n    @property\n    def tr(self):\n        try:\n            tr = int(self.request.GET.get\n                     ('tr', AutorListView.TR_AUTOR_CHOICE_SERIALIZER))\n\n            assert tr in (\n                AutorListView.TR_AUTOR_CHOICE_SERIALIZER,\n                AutorListView.TR_CHOICE_SERIALIZER,\n                AutorListView.TR_AUTOR_SERIALIZER), sapl_logger.info(\n                _(\"Tipo do Resultado a ser fornecido n\u00e3o existe!\"))\n        except:\n            return AutorListView.TR_AUTOR_CHOICE_SERIALIZER\n        else:\n            return tr\n\n    def get(self, request, *args, **kwargs):\n        \"\"\"\n            desativa o django-filter se a busca for por possiveis autores\n            parametro tr = TR_CHOICE_SERIALIZER\n        \"\"\"\n        if self.tr == AutorListView.TR_CHOICE_SERIALIZER:\n            self.filter_class = None\n            self.filter_backends = []\n            self.serializer_class = ChoiceSerializer\n\n        elif self.tr == AutorListView.TR_AUTOR_SERIALIZER:\n            self.serializer_class = AutorSerializer\n            self.permission_classes = (IsAuthenticated,)\n\n        if self.filter_class and 'q_0' in request.GET:\n            self.filter_class = AutorSearchForFieldFilterSet\n\n        return ListAPIView.get(self, request, *args, **kwargs)\n\n    def get_queryset(self):\n        queryset = ListAPIView.get_queryset(self)\n\n        if self.filter_backends:\n            return queryset\n\n        params = {'content_type__isnull': False}\n\n        tipo = ''\n        try:\n            tipo = int(self.request.GET.get('tipo', ''))\n            if tipo:\n                params['id'] = tipo\n        except:\n            pass\n\n        tipos = TipoAutor.objects.filter(**params)\n\n        if not tipos.exists() and tipo:\n            raise Http404()\n\n        r = []\n        for tipo in tipos:\n            q = self.request.GET.get('q', '').strip()\n\n            model_class = tipo.content_type.model_class()\n\n            fields = list(filter(\n                lambda field: isinstance(field, SaplGenericRelation) and\n                field.related_model == Autor,\n                model_class._meta.get_fields(include_hidden=True)))\n\n            \"\"\"\n            fields - \u00e9 um array de SaplGenericRelation que deve possuir o\n                 atributo fields_search. Verifique na documenta\u00e7\u00e3o da classe\n                 a estrutura de fields_search.\n            \"\"\"\n\n            assert len(fields) >= 1, (_(\n                'N\u00e3o foi encontrado em %(model)s um atributo do tipo '\n                'SaplGenericRelation que use o model %(model_autor)s') % {\n                'model': model_class._meta.verbose_name,\n                'model_autor': Autor._meta.verbose_name})\n\n            qs = model_class.objects.all()\n\n            q_filter = Q()\n            if q:\n                for item in fields:\n                    if item.related_model != Autor:\n                        continue\n                    q_fs = Q()\n                    for field in item.fields_search:\n                        q_fs = q_fs | Q(**{'%s%s' % (\n                            field[0],\n                            field[1]): q})\n                    q_filter = q_filter & q_fs\n\n                qs = qs.filter(q_filter).distinct(\n                    fields[0].fields_search[0][0]).order_by(\n                        fields[0].fields_search[0][0])\n            else:\n                qs = qs.order_by(fields[0].fields_search[0][0])\n\n            qs = qs.values_list(\n                'id', fields[0].fields_search[0][0])\n            r += list(qs)\n\n        if tipos.count() > 1:\n            r.sort(key=lambda x: x[1].upper())\n        return r\n\n\nclass MateriaLegislativaViewSet(ListModelMixin,\n                                RetrieveModelMixin,\n                                GenericViewSet):\n\n    permission_classes = (IsAuthenticated,)\n    serializer_class = MateriaLegislativaSerializer\n    queryset = MateriaLegislativa.objects.all()\n    filter_backends = (DjangoFilterBackend,)\n    filter_fields = ('numero', 'ano', 'tipo', )\n\n\nclass SessaoPlenariaViewSet(ListModelMixin,\n                            RetrieveModelMixin,\n                            GenericViewSet):\n\n    permission_classes = (AllowAny,)\n    serializer_class = SessaoPlenariaSerializer\n    queryset = SessaoPlenaria.objects.all()\n    filter_backends = (DjangoFilterBackend,)\n    filter_fields = ('data_inicio', 'data_fim', 'interativa')\n", "path": "sapl/api/views.py"}], "after_files": [{"content": "from django.contrib.contenttypes.models import ContentType\nfrom django.db.models import Q\nfrom django.http import Http404\nfrom django.utils.translation import ugettext_lazy as _\nfrom rest_framework.filters import DjangoFilterBackend\nfrom rest_framework.generics import ListAPIView\nfrom rest_framework.mixins import ListModelMixin, RetrieveModelMixin\nfrom rest_framework.permissions import (AllowAny, IsAuthenticated,\n                                        IsAuthenticatedOrReadOnly)\nfrom rest_framework.viewsets import GenericViewSet, ModelViewSet\n\nfrom sapl.api.forms import AutorChoiceFilterSet, AutorSearchForFieldFilterSet\nfrom sapl.api.serializers import (AutorChoiceSerializer, AutorSerializer,\n                                  ChoiceSerializer,\n                                  MateriaLegislativaSerializer,\n                                  ModelChoiceSerializer,\n                                  SessaoPlenariaSerializer)\nfrom sapl.base.models import Autor, TipoAutor\nfrom sapl.materia.models import MateriaLegislativa\nfrom sapl.sessao.models import SessaoPlenaria\nfrom sapl.utils import SaplGenericRelation, sapl_logger\n\n\nclass ModelChoiceView(ListAPIView):\n\n    # FIXME aplicar permiss\u00e3o correta de usu\u00e1rio\n    permission_classes = (IsAuthenticated,)\n    serializer_class = ModelChoiceSerializer\n\n    def get(self, request, *args, **kwargs):\n        self.model = ContentType.objects.get_for_id(\n            self.kwargs['content_type']).model_class()\n\n        pagination = request.GET.get('pagination', '')\n\n        if pagination == 'False':\n            self.pagination_class = None\n\n        return ListAPIView.get(self, request, *args, **kwargs)\n\n    def get_queryset(self):\n        return self.model.objects.all()\n\n\nclass AutorListView(ListAPIView):\n    \"\"\"\n    Listagem de Autores com filtro para autores j\u00e1 cadastrados\n    e/ou poss\u00edveis autores.\n\n    - tr          - tipo do resultado\n                    Prepera Lista de Autores para 3 cen\u00e1rios distintos\n\n                    - default = 1\n\n                  = 1 -> para (value, text) usados geralmente\n                      em combobox, radiobox, checkbox, etc com pesquisa b\u00e1sica\n                      de Autores feita pelo django-filter\n                      -> processo usado nas pesquisas, o mais usado.\n\n                  = 2 -> para (value, text) usados geralmente\n                      em combobox, radiobox, checkbox, etc com pesquisa b\u00e1sica\n                      de Autores mas feito para Poss\u00edveis Autores armazenados\n                      segundo o ContentType associado ao Tipo de Autor via\n                      relacionamento gen\u00e9rico.\n                      Busca feita sem django-filter processada no get_queryset\n                      -> processo no cadastro de autores para sele\u00e7\u00e3o e busca\n                          dos poss\u00edveis autores\n\n                  = 3 -> Devolve instancias da classe Autor filtradas pelo\n                         django-filter\n\n    - tipo      - chave prim\u00e1ria do Tipo de Autor a ser filtrado\n\n    - q         - busca textual no nome do Autor ou em  fields_search\n                  declarados no field SaplGenericRelation das GenericFks\n                      A busca textual acontece via django-filter com a\n                      vari\u00e1vel `tr` igual 1 ou 3. Em caso contr\u00e1rio,\n                      o django-filter \u00e9 desativado e a busca \u00e9 feita\n                      no model do ContentType associado ao tipo.\n\n    - q_0 / q_1 - q_0 faz o c\u00f3digo ignorar \"q\"...\n\n                  q_0 -> campos lookup a serem filtrados em qualquer Model\n                  que implemente SaplGenericRelation\n                  q_1 -> o valor que ser\u00e1 pesquisado no lookup de q_0\n\n                  q_0 e q_1 podem ser separados por \",\"... isso dar\u00e1 a\n                  possibilidade de filtrar mais de um campo. \n\n\n                  http://localhost:8000\n                      /api/autor?tr=1&q_0=parlamentar_set__ativo&q_1=False\n                      /api/autor?tr=1&q_0=parlamentar_set__ativo&q_1=True\n                      /api/autor?tr=3&q_0=parlamentar_set__ativo&q_1=False\n                      /api/autor?tr=3&q_0=parlamentar_set__ativo&q_1=True\n\n                  http://localhost:8000\n                      /api/autor?tr=1\n                          &q_0=parlamentar_set__nome_parlamentar__icontains,\n                               parlamentar_set__ativo\n                          &q_1=Carvalho,False\n                      /api/autor?tr=1\n                          &q_0=parlamentar_set__nome_parlamentar__icontains,\n                               parlamentar_set__ativo\n                          &q_1=Carvalho,True\n                      /api/autor?tr=3\n                          &q_0=parlamentar_set__nome_parlamentar__icontains,\n                               parlamentar_set__ativo\n                          &q_1=Carvalho,False\n                      /api/autor?tr=3\n                          &q_0=parlamentar_set__nome_parlamentar__icontains,\n                               parlamentar_set__ativo\n                          &q_1=Carvalho,True\n\n\n                  n\u00e3o importa o campo que vc passe de qualquer dos Models\n                  ligados... \u00e9 poss\u00edvel ver que models s\u00e3o esses, \n                      na ocasi\u00e3o do commit deste texto, executando:\n                        In [6]: from sapl.utils import models_with_gr_for_model\n\n                        In [7]: models_with_gr_for_model(Autor)\n                        Out[7]:\n                        [sapl.parlamentares.models.Parlamentar,\n                         sapl.parlamentares.models.Frente,\n                         sapl.comissoes.models.Comissao,\n                         sapl.materia.models.Orgao,\n                         sapl.sessao.models.Bancada,\n                         sapl.sessao.models.Bloco]\n\n                      qualquer atributo destes models podem ser passados \n                      para busca\n    \"\"\"\n\n    TR_AUTOR_CHOICE_SERIALIZER = 1\n    TR_CHOICE_SERIALIZER = 2\n    TR_AUTOR_SERIALIZER = 3\n\n    # FIXME aplicar permiss\u00e3o correta de usu\u00e1rio\n    permission_classes = (IsAuthenticatedOrReadOnly,)\n    queryset = Autor.objects.all()\n    model = Autor\n\n    filter_class = AutorChoiceFilterSet\n    filter_backends = (DjangoFilterBackend, )\n    serializer_class = AutorChoiceSerializer\n\n    @property\n    def tr(self):\n        try:\n            tr = int(self.request.GET.get\n                     ('tr', AutorListView.TR_AUTOR_CHOICE_SERIALIZER))\n\n            assert tr in (\n                AutorListView.TR_AUTOR_CHOICE_SERIALIZER,\n                AutorListView.TR_CHOICE_SERIALIZER,\n                AutorListView.TR_AUTOR_SERIALIZER), sapl_logger.info(\n                _(\"Tipo do Resultado a ser fornecido n\u00e3o existe!\"))\n        except:\n            return AutorListView.TR_AUTOR_CHOICE_SERIALIZER\n        else:\n            return tr\n\n    def get(self, request, *args, **kwargs):\n        \"\"\"\n            desativa o django-filter se a busca for por possiveis autores\n            parametro tr = TR_CHOICE_SERIALIZER\n        \"\"\"\n        if self.tr == AutorListView.TR_CHOICE_SERIALIZER:\n            self.filter_class = None\n            self.filter_backends = []\n            self.serializer_class = ChoiceSerializer\n\n        elif self.tr == AutorListView.TR_AUTOR_SERIALIZER:\n            self.serializer_class = AutorSerializer\n            self.permission_classes = (IsAuthenticated,)\n\n        if self.filter_class and 'q_0' in request.GET:\n            self.filter_class = AutorSearchForFieldFilterSet\n\n        return ListAPIView.get(self, request, *args, **kwargs)\n\n    def get_queryset(self):\n        queryset = ListAPIView.get_queryset(self)\n\n        if self.filter_backends:\n            return queryset\n\n        params = {'content_type__isnull': False}\n\n        tipo = ''\n        try:\n            tipo = int(self.request.GET.get('tipo', ''))\n            if tipo:\n                params['id'] = tipo\n        except:\n            pass\n\n        tipos = TipoAutor.objects.filter(**params)\n\n        if not tipos.exists() and tipo:\n            raise Http404()\n\n        r = []\n        for tipo in tipos:\n            q = self.request.GET.get('q', '').strip()\n\n            model_class = tipo.content_type.model_class()\n\n            fields = list(filter(\n                lambda field: isinstance(field, SaplGenericRelation) and\n                field.related_model == Autor,\n                model_class._meta.get_fields(include_hidden=True)))\n\n            \"\"\"\n            fields - \u00e9 um array de SaplGenericRelation que deve possuir o\n                 atributo fields_search. Verifique na documenta\u00e7\u00e3o da classe\n                 a estrutura de fields_search.\n            \"\"\"\n\n            assert len(fields) >= 1, (_(\n                'N\u00e3o foi encontrado em %(model)s um atributo do tipo '\n                'SaplGenericRelation que use o model %(model_autor)s') % {\n                'model': model_class._meta.verbose_name,\n                'model_autor': Autor._meta.verbose_name})\n\n            qs = model_class.objects.all()\n\n            q_filter = Q()\n            if q:\n                for item in fields:\n                    if item.related_model != Autor:\n                        continue\n                    q_fs = Q()\n                    for field in item.fields_search:\n                        q_fs = q_fs | Q(**{'%s%s' % (\n                            field[0],\n                            field[1]): q})\n                    q_filter = q_filter & q_fs\n\n                qs = qs.filter(q_filter).distinct(\n                    fields[0].fields_search[0][0]).order_by(\n                        fields[0].fields_search[0][0])\n            else:\n                qs = qs.order_by(fields[0].fields_search[0][0])\n\n            qs = qs.values_list(\n                'id', fields[0].fields_search[0][0])\n            r += list(qs)\n\n        if tipos.count() > 1:\n            r.sort(key=lambda x: x[1].upper())\n        return r\n\n\nclass MateriaLegislativaViewSet(ListModelMixin,\n                                RetrieveModelMixin,\n                                GenericViewSet):\n\n    permission_classes = (IsAuthenticated,)\n    serializer_class = MateriaLegislativaSerializer\n    queryset = MateriaLegislativa.objects.all()\n    filter_backends = (DjangoFilterBackend,)\n    filter_fields = ('numero', 'ano', 'tipo', )\n\n\nclass SessaoPlenariaViewSet(ListModelMixin,\n                            RetrieveModelMixin,\n                            GenericViewSet):\n\n    permission_classes = (AllowAny,)\n    serializer_class = SessaoPlenariaSerializer\n    queryset = SessaoPlenaria.objects.all()\n    filter_backends = (DjangoFilterBackend,)\n    filter_fields = ('data_inicio', 'data_fim', 'interativa')\n", "path": "sapl/api/views.py"}]}