internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: interlegis/sapl

Issue:
Matérias da Ordem do Dia: oferecer número de ordem ao adicionar
Em Sessão Plenária, ao adicionar uma Matéria da Ordem do Dia, o campo Nº de Ordem aparece em branco, disponível para optar. Deveria oferecer o número de ordem seguinte, começando por 1.
![captura de tela de 2017-07-04 14 45 37](https://user-images.githubusercontent.com/19169882/27839571-a28fc1fe-60c8-11e7-90f4-6293fcaecf3a.png)



Discussion:

Resolving patch:
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -6,7 +6,7 @@
 from django.contrib.auth.mixins import PermissionRequiredMixin
 from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
 from django.core.urlresolvers import reverse
-from django.db.models import Q
+from django.db.models import Max, Q
 from django.forms.utils import ErrorList
 from django.http import JsonResponse
 from django.http.response import Http404, HttpResponseRedirect
@@ -162,6 +162,9 @@ class CreateView(MasterDetailCrud.CreateView):
         def get_initial(self):
             self.initial['data_ordem'] = SessaoPlenaria.objects.get(
                 pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y')
+            max_numero_ordem = OrdemDia.objects.filter(
+              sessao_plenaria=self.kwargs['pk']).aggregate(Max('numero_ordem'))['numero_ordem__max']
+            self.initial['numero_ordem'] = (max_numero_ordem if max_numero_ordem else 0) + 1
             return self.initial
 
         def get_success_url(self):


Test patch:
Repository: interlegis/sapl

Issue:
Ordem do Dia: incluir matéria já incluída nas Matérias do Expediente
Deve ser possível incluir na Ordem do Dia matérias constantes das Matérias do Expediente da mesma sessão. Atualmente a resposta é "Essa matéria já foi cadastrada". Porém, tal resposta deve ser mantida se a matéria estiver sendo incluída na mesma parte da sessão.


Discussion:

Resolving patch:
diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py
--- a/sapl/sessao/forms.py
+++ b/sapl/sessao/forms.py
@@ -72,6 +72,8 @@ def clean(self):
 
 class ExpedienteMateriaForm(ModelForm):
 
+    _model = ExpedienteMateria
+
     tipo_materia = forms.ModelChoiceField(
         label=_('Tipo Matéria'),
         required=True,
@@ -129,11 +131,11 @@ def clean(self):
         else:
             cleaned_data['materia'] = materia
 
-        ex = ExpedienteMateria.objects.filter(
+        exists = self._model.objects.filter(
             sessao_plenaria=sessao,
             materia=materia).exists()
 
-        if ex and not self.instance.pk:
+        if exists and not self.instance.pk:
             msg = _('Essa matéria já foi cadastrada.')
             raise ValidationError(msg)
 
@@ -148,6 +150,8 @@ def save(self, commit=False):
 
 class OrdemDiaForm(ExpedienteMateriaForm):
 
+    _model = OrdemDia
+
     class Meta:
         model = OrdemDia
         fields = ['data_ordem', 'numero_ordem', 'tipo_materia', 'observacao',
@@ -171,31 +175,7 @@ def clean_numero_ordem(self):
 
     def clean(self):
         super(OrdemDiaForm, self).clean()
-
-        cleaned_data = self.cleaned_data
-        sessao = self.instance.sessao_plenaria
-
-        try:
-            materia = MateriaLegislativa.objects.get(
-                numero=self.cleaned_data['numero_materia'],
-                ano=self.cleaned_data['ano_materia'],
-                tipo=self.cleaned_data['tipo_materia'])
-        except ObjectDoesNotExist:
-            msg = _('A matéria a ser inclusa não existe no cadastro'
-                    ' de matérias legislativas.')
-            raise ValidationError(msg)
-        else:
-            cleaned_data['materia'] = materia
-
-        ex = ExpedienteMateria.objects.filter(
-            sessao_plenaria=sessao,
-            materia=materia).exists()
-
-        if ex and not self.instance.pk:
-            msg = _('Essa matéria já foi cadastrada.')
-            raise ValidationError(msg)
-
-        return cleaned_data
+        return self.cleaned_data
 
     def save(self, commit=False):
         ordem = super(OrdemDiaForm, self).save(commit)


Test patch:
Repository: interlegis/sapl

Issue:
Adicionar relatoria: campo Parlamentar deve estar branco
Ao clicar em "Adicionar Relatoria", o campo Parlamentar já aparece preenchido com o primeiro da lista de membros da comissão. O ideal seria como está no 2.5, em branco.
![captura de tela de 2017-07-07 17 11 26](https://user-images.githubusercontent.com/19169882/27975147-64a03952-6337-11e7-895a-feacbc9c9d49.png)



Discussion:

Resolving patch:
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -856,6 +856,7 @@ def get_context_data(self, **kwargs):
                     composicao=composicao)
 
                 parlamentares = []
+                parlamentares.append(['', '---------'])
                 for p in participacao:
                     if p.titular:
                         parlamentares.append(


Test patch:
Repository: interlegis/sapl

Issue:
Falta label de processo nos detalhes da matéria
O número do processo está perdido em meio aos detalhes da matéria. Falta o label processo 

![image](https://user-images.githubusercontent.com/13314947/28427707-78e650de-6d4d-11e7-93e9-deabf93ba1d9.png)


![image](https://user-images.githubusercontent.com/13314947/28427759-a6041434-6d4d-11e7-82e2-08b7c0c80ddd.png)


![image](https://user-images.githubusercontent.com/13314947/28427786-ba25feb4-6d4d-11e7-8d8b-0f573996a8fc.png)



Discussion:

Resolving patch:
diff --git a/sapl/crispy_layout_mixin.py b/sapl/crispy_layout_mixin.py
--- a/sapl/crispy_layout_mixin.py
+++ b/sapl/crispy_layout_mixin.py
@@ -67,7 +67,7 @@ def get_field_display(obj, fieldname):
             ou mesmo uma método no model.
         """
         value = getattr(obj, fieldname)
-        verbose_name = ''
+        verbose_name = value.model._meta.verbose_name
 
     else:
         verbose_name = str(field.verbose_name)\


Test patch:
Repository: interlegis/sapl

Issue:
Tramitação de Matérias
Não está sendo levado em conta o indicador de tramitação do status da tramitação no momento que é incluso uma tramitação. Ou seja, ao incluir uma tramitação a uma matéria, que o status de tramitação selecionado tenha o indicador de tramitação fim, por exemplo Arquivo, o status da matéria "Em Tramitação" deveria ser alterado para não.


Discussion:

Resolving patch:
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -958,6 +958,12 @@ def get_context_data(self, **kwargs):
         def form_valid(self, form):
             self.object = form.save()
 
+            if form.instance.status.indicador == 'F':
+                form.instance.materia.em_tramitacao = False
+            else:
+                form.instance.materia.em_tramitacao = True
+            form.instance.materia.save()
+
             try:
                 tramitacao_signal.send(sender=Tramitacao,
                                        post=self.object,
@@ -981,6 +987,12 @@ def layout_key(self):
         def form_valid(self, form):
             self.object = form.save()
 
+            if form.instance.status.indicador == 'F':
+                form.instance.materia.em_tramitacao = False
+            else:
+                form.instance.materia.em_tramitacao = True
+            form.instance.materia.save()
+
             try:
                 tramitacao_signal.send(sender=Tramitacao,
                                        post=self.object,


Test patch:
Repository: interlegis/sapl

Issue:
Pesquisa Textual - Restringir ao tipo
Na pesquisa textual, mesmo marcando em quais os tipos de documentos que se deseja pesquisar, o resultado é retornado mostrando o resultado em todos os tipos , documentos acessórios, normas jurídicas, matérias legislativas.

 #1287


Discussion:

Resolving patch:
diff --git a/sapl/base/urls.py b/sapl/base/urls.py
--- a/sapl/base/urls.py
+++ b/sapl/base/urls.py
@@ -16,7 +16,8 @@
                     RelatorioMateriasPorAnoAutorTipoView,
                     RelatorioMateriasPorAutorView,
                     RelatorioMateriasTramitacaoView,
-                    RelatorioPresencaSessaoView)
+                    RelatorioPresencaSessaoView,
+                    SaplSearchView)
 
 app_name = AppConfig.name
 
@@ -100,6 +101,6 @@
         name='login'),
     url(r'^logout/$', views.logout, {'next_page': '/login'}, name='logout'),
 
-    url(r'^sistema/search/', include('haystack.urls')),
+    url(r'^sistema/search/', SaplSearchView(), name='search_view'),
 
 ] + recuperar_senha
diff --git a/sapl/base/views.py b/sapl/base/views.py
--- a/sapl/base/views.py
+++ b/sapl/base/views.py
@@ -14,6 +14,8 @@
 from django.views.generic.base import TemplateView
 from django_filters.views import FilterView
 
+from haystack.views import SearchView
+
 from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm
 from sapl.base.models import Autor, TipoAutor
 from sapl.crud.base import CrudAux
@@ -454,3 +456,22 @@ class DeleteView(CrudAux.DeleteView):
 
         def get(self, request, *args, **kwargs):
             return HttpResponseRedirect(reverse('sapl.base:appconfig_create'))
+
+
+class SaplSearchView(SearchView):
+    results_per_page = 10
+
+    def get_context(self):
+        context = super(SaplSearchView, self).get_context()
+
+        if 'models' in self.request.GET:
+            models = self.request.GET.getlist('models')
+        else:
+            models = []
+
+        context['models'] = ''
+
+        for m in models:
+            context['models'] = context['models'] + '&models=' + m
+
+        return context
\ No newline at end of file


Test patch:
Repository: interlegis/sapl

Issue:
Pesquisa Matéria Legislativa deve permitir filtrar por autor principal e co-autoria
Atualmente não é possível filtrar a lista de pesquisas por Autoria.primeiro_autor na pesquisa de matéria legislativa. 


Discussion:
Este "bug" foi detectado durante a resolução da issue #1200 
Isso se trata de um problema maior causado pela estrutura com a qual as queries da lib **django-filter** são executadas. Uma das soluções é fazermos um fork da lib e modificações nessa estrutura, caso contrário teremos que **eliminar** a lib do nosso código e fazermos a queries de filtragem por nós mesmos.

Resolving patch:
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -16,10 +16,14 @@
 from django.forms import ModelForm, widgets
 from django.forms.forms import Form
 from django.forms.widgets import Select
+from django.utils import six
 from django.utils.encoding import force_text
 from django.utils.html import format_html
 from django.utils.safestring import mark_safe
 from django.utils.translation import ugettext_lazy as _
+
+from django_filters.filterset import STRICTNESS
+
 import django_filters
 
 from sapl.base.models import Autor
@@ -586,6 +590,45 @@ def __init__(self, *args, **kwargs):
                      form_actions(save_label='Pesquisar'))
         )
 
+    @property
+    def qs(self):
+        if not hasattr(self, '_qs'):
+            valid = self.is_bound and self.form.is_valid()
+
+            if self.is_bound and not valid:
+                if self.strict == STRICTNESS.RAISE_VALIDATION_ERROR:
+                    raise forms.ValidationError(self.form.errors)
+                elif bool(self.strict) == STRICTNESS.RETURN_NO_RESULTS:
+                    self._qs = self.queryset.none()
+                    return self._qs
+                    # else STRICTNESS.IGNORE...  ignoring
+
+            # start with all the results and filter from there
+            qs = self.queryset.all()
+            for name, filter_ in six.iteritems(self.filters):
+                value = None
+                if valid:
+                    value = self.form.cleaned_data[name]
+                else:
+                    raw_value = self.form[name].value()
+                    try:
+                        value = self.form.fields[name].clean(raw_value)
+                    except forms.ValidationError:
+                        if self.strict == STRICTNESS.RAISE_VALIDATION_ERROR:
+                            raise
+                        elif bool(self.strict) == STRICTNESS.RETURN_NO_RESULTS:
+                            self._qs = self.queryset.none()
+                            return self._qs
+                            # else STRICTNESS.IGNORE...  ignoring
+
+                if value is not None:  # valid & clean data
+                    qs = qs._next_is_sticky()
+                    qs = filter_.filter(qs, value)
+
+            self._qs = qs
+
+        return self._qs
+
 
 def pega_ultima_tramitacao():
     ultimas_tramitacoes = Tramitacao.objects.values(


Test patch:
Repository: interlegis/sapl

Issue:
Migração - Mandato parlamentar
as informações  de data_fim_mandato e data_expedicao_diploma estão sendo migradas completamente erradas. Estão sendo pegas as datas de inicio e fim de mandato, sobrescrevendo dados caso existam.

https://github.com/interlegis/sapl/blob/master/sapl/legacy/migration.py#L663

Base 3.1
![image](https://user-images.githubusercontent.com/13314947/28522497-943305d6-704e-11e7-8f56-9ca027b84db1.png)

Base 2.5
![image](https://user-images.githubusercontent.com/13314947/28522652-3e1c6948-704f-11e7-827c-a22edc9a1f04.png)



Discussion:

Resolving patch:
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -661,6 +661,8 @@ def adjust_documentoadministrativo(new, old):
 
 
 def adjust_mandato(new, old):
+    if old.dat_fim_mandato:
+        new.data_fim_mandato = old.dat_fim_mandato
     if not new.data_fim_mandato:
         legislatura = Legislatura.objects.latest('data_fim')
         new.data_fim_mandato = legislatura.data_fim


Test patch:
Repository: interlegis/sapl

Issue:
Query de parlamentar não existe
Durante a migração de Autor de algumas bases, o seguinte erro está aparecendo:
```
DoesNotExist: Parlamentar matching query does not exist.
```
Esse erro acontece na função de ajuste de autor.


Discussion:

Resolving patch:
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -850,8 +850,21 @@ def adjust_protocolo_depois_salvar(new, old):
 
 def adjust_autor(new, old):
     if old.cod_parlamentar:
-        new.autor_related = Parlamentar.objects.get(pk=old.cod_parlamentar)
+        try:
+            new.autor_related = Parlamentar.objects.get(pk=old.cod_parlamentar)
+        except Exception:
+            with reversion.create_revision():
+                msg = 'Um parlamentar relacionado de PK [%s] não existia' \
+                        % old.cod_parlamentar
+                reversion.set_comment('Stub criado pela migração')
+                value = make_stub(Parlamentar, old.cod_parlamentar)
+                descricao = 'stub criado para entrada orfã!'
+                warn(msg + ' => ' + descricao)
+                save_relation(value, [], msg, descricao,
+                              eh_stub=True)
+                new.autor_related = value
         new.nome = new.autor_related.nome_parlamentar
+
     elif old.cod_comissao:
         new.autor_related = Comissao.objects.get(pk=old.cod_comissao)
         new.nome = new.autor_related.nome
@@ -859,22 +872,14 @@ def adjust_autor(new, old):
     if old.col_username:
         if not get_user_model().objects.filter(
                 username=old.col_username).exists():
-            user = get_user_model()(
-                username=old.col_username, password=12345)
+            user = get_user_model()(username=old.col_username)
+            user.set_password(12345)
             with reversion.create_revision():
                 user.save()
                 reversion.set_comment('Objeto criado pela migração')
 
             grupo_autor = Group.objects.get(name="Autor")
             user.groups.add(grupo_autor)
-            if old.cod_parlamentar:
-                grupo_parlamentar = Group.objects.get(name="Parlamentar")
-                user.groups.add(grupo_parlamentar)
-
-            new.user = user
-        else:
-            new.user = get_user_model().objects.filter(
-                username=old.col_username)[0]
 
 
 def adjust_comissao(new, old):


Test patch:
Repository: interlegis/sapl

Issue:
Migração de protocolo "unsupported operand"
Durante a migração de Protocolo de algumas bases de dados, o seguinte erro está aparecendo:
```
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
```
O erro está acontecendo na função de ajuste de Protocolo.


Discussion:

Resolving patch:
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -747,17 +747,22 @@ def adjust_normarelacionada(new, old):
     new.tipo_vinculo = tipo[0]
 
 
-def adjust_protocolo(new, old):
-    if new.numero is None and not primeira_vez:
-        p = ProtocoloLegado.objects.filter(
-            ano_protocolo=new.ano).aggregate(Max('num_protocolo'))
-        numero_maximo = p['num_protocolo__max']
-        new.numero = 1 if numero_maximo is None else numero_maximo + 1
-        primeira_vez.append(True)
-    if new.numero is None and primeira_vez:
-        p = Protocolo.objects.filter(
-            ano=new.ano).aggregate(Max('numero'))
-        new.numero = p['numero__max'] + 1
+def adjust_protocolo_antes_salvar(new, old):
+    data_ajuste = date(2014, 11, 13)
+
+    if old.num_protocolo is None and data_ajuste >= old.dat_protocolo:
+        new.numero = old.pk
+
+
+def adjust_protocolo_depois_salvar(new, old):
+    if old.num_protocolo is None:
+        with reversion.create_revision():
+            problema = 'Número do protocolo de PK %s é nulo' % new.pk
+            descricao = 'Número do protocolo alterado para %s!' % new.numero
+            warn(problema + ' => ' + descricao)
+            save_relation(obj=new, problema=problema,
+                          descricao=descricao, eh_stub=False)
+            reversion.set_comment('Número de protocolo teve que ser alterado')
 
 
 def adjust_registrovotacao_antes_salvar(new, old):
@@ -837,17 +842,6 @@ def adjust_normajuridica_depois_salvar(new, old):
         new.assuntos.add(AssuntoNorma.objects.get(pk=pk_assunto))
 
 
-def adjust_protocolo_depois_salvar(new, old):
-    if old.num_protocolo is None:
-        with reversion.create_revision():
-            problema = 'Número do protocolo de PK %s é nulo' % new.pk
-            descricao = 'Número do protocolo alterado para %s!' % new.numero
-            warn(problema + ' => ' + descricao)
-            save_relation(obj=new, problema=problema,
-                          descricao=descricao, eh_stub=False)
-            reversion.set_comment('Numero de protocolo teve que ser alterado')
-
-
 def adjust_autor(new, old):
     if old.cod_parlamentar:
         try:
@@ -904,7 +898,7 @@ def adjust_comissao(new, old):
     Parlamentar: adjust_parlamentar,
     Participacao: adjust_participacao,
     Proposicao: adjust_proposicao_antes_salvar,
-    Protocolo: adjust_protocolo,
+    Protocolo: adjust_protocolo_antes_salvar,
     RegistroVotacao: adjust_registrovotacao_antes_salvar,
     TipoAfastamento: adjust_tipoafastamento,
     TipoProposicao: adjust_tipoproposicao,


Test patch:
Repository: interlegis/sapl

Issue:
Query de protocolo em DocumentoAdministrativo não existe
Durante a migração de DocumentoAdministrativo de algumas bases, o seguinte erro está aparecendo:
```
DoesNotExist: Protocolo matching query does not exist.
```
Esse erro acontece na função de ajuste de documento administrativo.


Discussion:

Resolving patch:
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -655,9 +655,27 @@ def adjust_acompanhamentomateria(new, old):
 
 def adjust_documentoadministrativo(new, old):
     if new.numero_protocolo:
-        protocolo = Protocolo.objects.get(numero=new.numero_protocolo,
-                                          ano=new.ano)
-        new.protocolo = protocolo
+        try:
+            protocolo = Protocolo.objects.get(numero=new.numero_protocolo,
+                                              ano=new.ano)
+            new.protocolo = protocolo
+        except Exception:
+            try:
+                protocolo = Protocolo.objects.get(numero=new.numero_protocolo,
+                                                  ano=new.ano+1)
+                new.protocolo = protocolo
+            except Exception:
+                protocolo = mommy.make(Protocolo, numero=new.numero_protocolo,
+                                       ano=new.ano)
+                with reversion.create_revision():
+                    problema = 'Protocolo Vinculado [numero_protocolo=%s, '\
+                            'ano=%s] não existe' % (new.numero_protocolo,
+                                                    new.ano)
+                    descricao = 'O protocolo inexistente foi criado'
+                    warn(problema + ' => ' + descricao)
+                    save_relation(obj=protocolo, problema=problema,
+                                  descricao=descricao, eh_stub=True)
+                    reversion.set_comment('Protocolo não existia.')
 
 
 def adjust_mandato(new, old):


Test patch:
Repository: interlegis/sapl

Issue:
Migração: problema em Generic Relation em Autores
No momento que o script de migração exclui stubs de parlamentares, há exclusão em cascata, causando a exclusão também de autores.
A solução talvez seria verificar a relação entre eles, contudo a relação inversa não está funcionando, pois o campo parlamentar_set (https://github.com/interlegis/sapl/blob/master/sapl/parlamentares/models.py#L302) não pode ser acessado no objeto Parlamentar.


Discussion:
No final deste parágrafo do manual do Django (https://docs.djangoproject.com/en/1.11/ref/contrib/contenttypes/#reverse-generic-relations) é informado de que as Generic Relations não possuem o parâmetro on_delete, não sendo possível fazer a proteção contra exclusão em cascata.
As opções dadas são: não usar generic relation ou criar um sinal pre_delete.
@LeandroRoberto @marciomazza  @edwardoliveira
Não sei o que poderia fazer neste caso. Alguém tem alguma ideia?

Resolving patch:
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -327,6 +327,9 @@ def obj_desnecessario(obj):
         if (f.one_to_many or f.one_to_one) and f.auto_created]
     sem_referencia = not any(rr.related_model.objects.filter(
         **{rr.field.name: obj}).exists() for rr in relacoes)
+    if type(obj).__name__ == 'Parlamentar' and sem_referencia and \
+            obj.autor.all():
+        sem_referencia = False
     return sem_referencia
 
 


Test patch:
Repository: interlegis/sapl

Issue:
Falta label de processo nos detalhes da matéria
O número do processo está perdido em meio aos detalhes da matéria. Falta o label processo 

![image](https://user-images.githubusercontent.com/13314947/28427707-78e650de-6d4d-11e7-93e9-deabf93ba1d9.png)


![image](https://user-images.githubusercontent.com/13314947/28427759-a6041434-6d4d-11e7-82e2-08b7c0c80ddd.png)


![image](https://user-images.githubusercontent.com/13314947/28427786-ba25feb4-6d4d-11e7-8d8b-0f573996a8fc.png)



Discussion:

Resolving patch:
diff --git a/sapl/crispy_layout_mixin.py b/sapl/crispy_layout_mixin.py
--- a/sapl/crispy_layout_mixin.py
+++ b/sapl/crispy_layout_mixin.py
@@ -67,7 +67,10 @@ def get_field_display(obj, fieldname):
             ou mesmo uma método no model.
         """
         value = getattr(obj, fieldname)
-        verbose_name = ''
+        try:
+            verbose_name = value.model._meta.verbose_name
+        except AttributeError:
+            verbose_name = ''
 
     else:
         verbose_name = str(field.verbose_name)\


Test patch: