Repository: interlegis/sapl

Issue:
Menu de acesso a Matérias das quais o Parlamentar é autor
No sapl 2.5, acessando o menu Parlamentar, existe um menu chamado proposições, para acesso direto as proposições daquele parlamentar.
http://sapl.camarabento.rs.gov.br/consultas/parlamentar/proposicao/proposicao_index_html?cod_parlamentar=8

![image](https://user-images.githubusercontent.com/13314947/27296742-75c35860-54f8-11e7-95b6-9492bf4357c5.png)


No sapl 3.1 não existe esse menu
http://sapl3beta.camarabento.rs.gov.br/parlamentar/8


Discussion:
Essas proposições são aquelas incorporadas, certo? E estão disponíveis para usuário anônimo e outros?
Pois é, não, essas são as matéria das quais o parlamentar é autor, inclusive deveriam ser tratadas por exemplo como Matérias e não como proposições. No 3.1 tem menu específico para as proposições.
E sim, devem ficar disponíveis para o usuário anônimo

Resolving patch:
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -490,6 +490,10 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
 
     autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput())
 
+    autoria__primeiro_autor = django_filters.BooleanFilter(required=False,
+                                                           label=u'Primeiro Autor',
+                                                           widget=forms.HiddenInput())
+
     ementa = django_filters.CharFilter(lookup_expr='icontains')
 
     em_tramitacao = django_filters.ChoiceFilter(required=False,
@@ -516,6 +520,7 @@ class Meta:
                   'data_apresentacao',
                   'data_publicacao',
                   'autoria__autor__tipo',
+                  'autoria__primeiro_autor',
                   # FIXME 'autoria__autor__partido',
                   'relatoria__parlamentar_id',
                   'local_origem_externa',
@@ -545,6 +550,7 @@ def __init__(self, *args, **kwargs):
              ('data_publicacao', 6)])
         row4 = to_row(
             [('autoria__autor', 0),
+             ('autoria__primeiro_autor', 0),
              (Button('pesquisar',
                      'Pesquisar Autor',
                      css_class='btn btn-primary btn-sm'), 2),
diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py
--- a/sapl/parlamentares/urls.py
+++ b/sapl/parlamentares/urls.py
@@ -6,6 +6,7 @@
                                       LegislaturaCrud, MandatoCrud,
                                       MesaDiretoraView, NivelInstrucaoCrud,
                                       ParlamentarCrud,
+                                      ParlamentarMateriasView,
                                       ParticipacaoParlamentarCrud, PartidoCrud,
                                       ProposicaoParlamentarCrud,
                                       RelatoriaParlamentarCrud,
@@ -31,6 +32,9 @@
         VotanteView.get_urls()
     )),
 
+    url(r'^parlamentar/(?P<pk>\d+)/materias$',
+        ParlamentarMateriasView.as_view(), name='parlamentar_materias'),
+
     url(r'^sistema/coligacao/',
         include(ColigacaoCrud.get_urls() +
                 ComposicaoColigacaoCrud.get_urls())),
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -25,6 +25,11 @@
                      NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
                      SituacaoMilitar, TipoAfastamento, TipoDependente, Votante)
 
+from sapl.base.models import Autor
+from sapl.materia.models import Autoria
+from django.contrib.contenttypes.models import ContentType
+from django.db.models.aggregates import Count
+
 CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa')
 PartidoCrud = CrudAux.build(Partido, 'partidos')
 SessaoLegislativaCrud = CrudAux.build(SessaoLegislativa, 'sessao_legislativa')
@@ -459,6 +464,63 @@ def get_context_data(self, **kwargs):
             return context
 
 
+class ParlamentarMateriasView(FormView):
+    template_name = "parlamentares/materias.html"
+    success_url = reverse_lazy('sapl.parlamentares:parlamentar_materia')
+
+    def get_autoria(self, resultset):
+        autoria = {}
+        total_autoria = 0
+
+        for i in resultset:
+            row = autoria.get(i['materia__ano'], [])
+            columns = (i['materia__tipo__pk'],
+                       i['materia__tipo__sigla'],
+                       i['materia__tipo__descricao'],
+                       int(i['total']))
+            row.append(columns)
+            autoria[i['materia__ano']] = row
+            total_autoria += columns[3]
+        autoria = sorted(autoria.items(), reverse=True)
+        return autoria, total_autoria
+
+    @xframe_options_exempt
+    def get(self, request, *args, **kwargs):
+        parlamentar_pk = kwargs['pk']
+        autor = Autor.objects.get(
+            content_type=ContentType.objects.get_for_model(Parlamentar),
+            object_id=parlamentar_pk)
+
+        autoria = Autoria.objects.filter(
+            autor=autor, primeiro_autor=True).values(
+                'materia__ano',
+                'materia__tipo__pk',
+                'materia__tipo__sigla',
+                'materia__tipo__descricao').annotate(
+                    total=Count('materia__tipo__pk')).order_by(
+                        '-materia__ano', 'materia__tipo')
+
+        coautoria = Autoria.objects.filter(
+            autor=autor, primeiro_autor=False).values(
+                'materia__ano',
+                'materia__tipo__pk',
+                'materia__tipo__sigla',
+                'materia__tipo__descricao').annotate(
+                    total=Count('materia__tipo__pk')).order_by(
+                                '-materia__ano', 'materia__tipo')
+
+        autor_list = self.get_autoria(autoria)
+        coautor_list = self.get_autoria(coautoria)
+
+        nome_parlamentar = autor.autor_related.nome_parlamentar
+
+        return self.render_to_response({'autor_pk': autor.pk,
+                                        'autoria': autor_list,
+                                        'coautoria': coautor_list,
+                                        'nome_parlamentar': nome_parlamentar
+                                        })
+
+
 class MesaDiretoraView(FormView):
     template_name = 'parlamentares/composicaomesa_form.html'
     success_url = reverse_lazy('sapl.parlamentares:mesa_diretora')


Test patch: