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

Issue:
Sessão Plenária: mudar a ordem dos cargos na caixa de seleção de cargos da Mesa
Mudar a ordem de cargos da caixa de seleção dos membros da Mesa da Sessão Plenária para Presidente, Vice e Secretário.



Discussion:
Verei isso agora.

@LucianoAlmeida ... issue ligada a #667 que está funcionando, testei em http://sapl31agudo.interlegis.leg.br/sessao/346/mesa
falta fazer essa... ficar na ordem e fechar as duas


Resolving patch:
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -782,7 +782,6 @@ def get_cargos_mesa(self):
             lista_cargos_ocupados.append(cargo)
 
         lista = list(set(lista_cargos) - set(lista_cargos_ocupados))
-        lista.sort(key=lambda x: x.descricao)
         return lista
 
     def get_success_url(self):


Test patch:
Repository: interlegis/sapl

Issue:
Sessão Plenária: retornar à lista de Matérias do Expediente depois de Adicionar Várias Matérias
Depois de Adicionar Matérias Selecionadas fica o sistema na tela de seleção, embora as matérias recentemente adicionadas estejam salvas entre as Matérias do Expediente.



Discussion:
Verificarei essa issue.


Resolving patch:
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -2154,7 +2154,10 @@ def post(self, request, *args, **kwargs):
                 expediente.tipo_votacao = request.POST['tipo_votacao_%s' % m]
                 expediente.save()
 
-        return self.get(request, self.kwargs)
+        pk = self.kwargs['pk']
+
+        return HttpResponseRedirect(
+            reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': pk}))
 
 
 class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente):


Test patch:
Repository: interlegis/sapl

Issue:
Sessão Plenária: mudar a ordem dos cargos na caixa de seleção de cargos da Mesa
Mudar a ordem de cargos da caixa de seleção dos membros da Mesa da Sessão Plenária para Presidente, Vice e Secretário.



Discussion:
Verei isso agora.

@LucianoAlmeida ... issue ligada a #667 que está funcionando, testei em http://sapl31agudo.interlegis.leg.br/sessao/346/mesa
falta fazer essa... ficar na ordem e fechar as duas

Pull request criado para corrigir essa issue.

Alterar a ordem do resultado da inclusão, pois está invertida.


Resolving patch:
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -750,7 +750,9 @@ def get(self, request, *args, **kwargs):
             integrante = {'parlamentar': parlamentar, 'cargo': cargo}
             integrantes.append(integrante)
 
-        context.update({'integrantes': integrantes})
+        integrantes_ordenados = sorted(
+            integrantes, key=lambda k: k['cargo'].id)
+        context.update({'integrantes': integrantes_ordenados})
 
         return self.render_to_response(context)
 


Test patch:
Repository: interlegis/sapl

Issue:
Ordem de integrantes da mesa pelo cargo que ocupa no resumo da Sessão Plenária
Colocar na ordem: Presidente, Vice-Presidente, Secretário. (Ordenar de acordo com id do cargo)
Vide issue #684 



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
@@ -728,6 +728,10 @@ def post(self, request, *args, **kwargs):
         return self.get(self, request, args, kwargs)
 
 
+def ordenar_integrantes_por_cargo(integrantes):
+    return sorted(integrantes, key=lambda k: k['cargo'].id)
+
+
 class MesaView(FormMixin, DetailView):
     template_name = 'sessao/mesa.html'
     form_class = MesaForm
@@ -750,9 +754,8 @@ def get(self, request, *args, **kwargs):
             integrante = {'parlamentar': parlamentar, 'cargo': cargo}
             integrantes.append(integrante)
 
-        integrantes_ordenados = sorted(
-            integrantes, key=lambda k: k['cargo'].id)
-        context.update({'integrantes': integrantes_ordenados})
+        context.update(
+            {'integrantes': ordenar_integrantes_por_cargo(integrantes)})
 
         return self.render_to_response(context)
 
@@ -853,7 +856,7 @@ def get(self, request, *args, **kwargs):
             _('Abertura: %(abertura)s - %(hora_inicio)s') % {
                 'abertura': abertura, 'hora_inicio': self.object.hora_inicio},
             _('Encerramento: %(encerramento)s - %(hora_fim)s') % {
-                'encerramento': encerramento, 'hora_fim': self.object.hora_fim},
+                'encerramento': encerramento, 'hora_fim': self.object.hora_fim}
         ]})
         # =====================================================================
         # Conteúdo Multimídia
@@ -883,7 +886,7 @@ def get(self, request, *args, **kwargs):
             integrante = {'parlamentar': parlamentar, 'cargo': cargo}
             integrantes.append(integrante)
 
-        context.update({'mesa': integrantes})
+        context.update({'mesa': ordenar_integrantes_por_cargo(integrantes)})
 
         # =====================================================================
         # Presença Sessão


Test patch:
Repository: interlegis/sapl

Issue:
Inclusão repetida de membro de Mesa Diretora
Ao incluir com sucesso um integrante na Mesa Diretora, se pressionar F5 então ele insere repetidas vezes. Depois fica impossível retirar estas repetições porque o Excluir aceita como resultado somente um elemento.


Discussion:

Resolving patch:
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -343,6 +343,13 @@ def get(self, request, *args, **kwargs):
                 'cargos_vagos': cargos_vagos
             })
 
+    def existe_membro_mesa(self, sessao_plenaria, cargo):
+        return ComposicaoMesa.objects.filter(
+            sessao_legislativa_id=sessao_plenaria.id,
+            #parlamentar_id = integrante.parlamentar_id,
+            cargo_id = cargo.id
+            ).exists()
+
     def post(self, request, *args, **kwargs):
 
         if (not Legislatura.objects.exists() or
@@ -374,6 +381,11 @@ def post(self, request, *args, **kwargs):
             try:
                 composicao.cargo = CargoMesa.objects.get(
                     id=int(request.POST['cargo']))
+                if self.existe_membro_mesa(composicao.sessao_legislativa,
+                                           composicao.cargo):
+                    messages.error(request, _('Parlamentar já inserido!'))
+                    return self.get(request)
+
                 composicao.save()
             except MultiValueDictKeyError:
                 messages.error(request, _(
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -808,7 +808,6 @@ def post(self, request, *args, **kwargs):
                 integrante.parlamentar_id = request.POST['parlamentar']
                 integrante.cargo_id = request.POST['cargo']
                 integrante.save()
-
                 return self.form_valid(form)
 
             else:


Test patch:
Repository: interlegis/sapl

Issue:
Migração - Usuários
Nas telas de pesquisa de usuários a lista fica em branco para muitos.
Na tabela do 3.1 base_autor o no campo "nome" está para muitos registros como ' '
No meu caso, neste campo não foram importados os nomes dos autores do tipo parlamentar e comissão. 
Deixando o registro em branco e não retornando o nome nas pesquisas.


Discussion:
Sim, o nome de comissão e parlamentar ficam em outras tabelas. Vamos fazer um join @LucianoAlmeida.
o  campo nome em base_autor só não está sendo preenchido via migração, certo? via cadastro está normal?
Boa pergunta @LeandroRoberto, também gostaria de saber @DTILegBG 
Isso, exatamente


Em 13/12/2016 17:27, Edward escreveu:
>
> Boa pergunta @LeandroRoberto <https://github.com/LeandroRoberto>, 
> também gostaria de saber...
>
> —
> You are receiving this because you authored the thread.
> Reply to this email directly, view it on GitHub 
> <https://github.com/interlegis/sapl/issues/830#issuecomment-266836446>, 
> or mute the thread 
> <https://github.com/notifications/unsubscribe-auth/AMsrgywmuPlwFQ2jdhQRsVXFd6skXQ2Dks5rHvGVgaJpZM4K98fI>.
>


Aparentemente o campo nome não era preenchido no 2.5 quando o autor era um parlamentar.
Em todos os bancos que tenho disponíveis aqui pra teste, o campo nome de autor está nulo para parlamentares. Provavelmente, para exibir essa lista de nomes, pegava-se o numero em autor.cod_parlamentar e exibia o valor de parlamentar.nom_parlamentar.
Neste caso, devo preencher o que era nulo com esse valor de nome do parlamentar?


Resolving patch:
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -579,6 +579,7 @@ 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)
+        new.nome = new.autor_related.nome_parlamentar
     elif old.cod_comissao:
         new.autor_related = Comissao.objects.get(pk=old.cod_comissao)
 


Test patch:
Repository: interlegis/sapl

Issue:
Migração - Comissões
As comissões estão sendo importadas todas como inativas
Na tabela do 3.1 comissoes_comissao campo ativa=false


Discussion:
Oi @LucianoAlmeida, teria como dar uma olhada nisso? Obrigado! :)
Qual o indicativo de que ela está ativa ou desativa?
No Sapl 2.5 é a data na tabela comissao, coluna dat_extincao


Em 09/01/2017 18:40, Luciano Henrique Nunes de Almeida escreveu:
> Qual o indicativo de que ela está deve ativa ou desativa?



Resolving patch:
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -2,6 +2,7 @@
 
 import pkg_resources
 import yaml
+from datetime import date
 from django.apps import apps
 from django.apps.config import AppConfig
 from django.contrib.auth import get_user_model
@@ -595,8 +596,19 @@ def adjust_autor(new, old):
                 username=old.col_username)[0]
 
 
+def adjust_comissao(new, old):
+    if old.dat_extincao:
+        if date.today() < new.data_extincao:
+            new.ativa = True
+        else:
+            new.ativa = False
+    if not old.dat_extincao:
+        new.ativa = True
+
+
 AJUSTE_ANTES_SALVAR = {
     Autor: adjust_autor,
+    Comissao: adjust_comissao,
     NormaJuridica: adjust_normajuridica_antes_salvar,
     OrdemDia: adjust_ordemdia,
     Parlamentar: adjust_parlamentar,


Test patch:
Repository: interlegis/sapl

Issue:
Listar relacionamentos ativos e passivos entre normas nos resultados de pesquisa também
Os relacionamentos entre normas jurídicas estão nod detalhes, em Normas Relacionadas, Deveriam estar também na primeira tela do resultado da pesquisa por normas, seguindo o padrão do SAPL 2.5.


Discussion:

Resolving patch:
diff --git a/sapl/norma/models.py b/sapl/norma/models.py
--- a/sapl/norma/models.py
+++ b/sapl/norma/models.py
@@ -114,6 +114,13 @@ class Meta:
         verbose_name_plural = _('Normas Jurídicas')
         ordering = ['-data', '-numero']
 
+    def get_normas_relacionadas(self):
+        principais = NormaRelacionada.objects.filter(
+                norma_principal=self.id)
+        relacionadas = NormaRelacionada.objects.filter(
+                norma_relacionada=self.id)
+        return (principais, relacionadas)
+
     def __str__(self):
         return _('%(tipo)s nº %(numero)s de %(data)s') % {
             'tipo': self.tipo,
diff --git a/sapl/norma/views.py b/sapl/norma/views.py
--- a/sapl/norma/views.py
+++ b/sapl/norma/views.py
@@ -130,16 +130,7 @@ def search_url(self):
             return reverse('%s:%s' % (namespace, 'norma_pesquisa'))
 
     class DetailView(Crud.DetailView):
-
-        def get_context_data(self, **kwargs):
-            context = super().get_context_data(**kwargs)
-            principais = NormaRelacionada.objects.filter(
-                norma_principal=self.object.pk)
-            relacionadas = NormaRelacionada.objects.filter(
-                norma_relacionada=self.object.pk)
-            context['principais'] = principais
-            context['relacionadas'] = relacionadas
-            return context
+        pass
 
     class DeleteView(Crud.DeleteView):
 


Test patch:
Repository: interlegis/sapl

Issue:
Coluna cod_presenca_sessao inexistente.
```
django.db.utils.OperationalError: (1054, "Unknown column 'sessao_plenaria_presenca.cod_presenca_sessao' in 'field list'")
```

A coluna cod_presenca_sessao não existe na tabela sessao_plenaria_presenca do banco legado. Uma solução semelhante foi feita para a coluna num_proposicao e o script de criação dessa coluna está na pasta de scripts do app legacy.


Discussion:
Essa issue é semelhante à #961.

Resolving patch:
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -580,7 +580,8 @@ 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'))
-        new.numero = p['num_protocolo__max'] + 1
+        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(


Test patch:
Repository: interlegis/sapl

Issue:
Erro na função adjust_normajuridica_depois_salvar()
```
File "[...]/sapl/sapl/legacy/migration.py", line 636, in adjust_normajuridica_depois_salvar
    new.assuntos.add(AssuntoNorma.objects.get(pk=pk_assunto))
ValueError: invalid literal for int() with base 10: ''
```

É preciso verificar porque esse erro está acontecendo. Aparentemente o script não está conseguindo retornar o valor da query `AssuntoNorma.objects.get(pk=pk_assunto)` porque pk_assunto é uma string vazia quando deveria ser um número. Pode ser por conta de alguma inconsistência na antiga relação de many to many do SAPL2.5, que era feito por uma string separada por vírgulas.


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
@@ -633,7 +633,9 @@ def adjust_normajuridica_antes_salvar(new, old):
 def adjust_normajuridica_depois_salvar(new, old):
     # Ajusta relação M2M
     lista_pks_assunto = old.cod_assunto.split(',')
-    for pk_assunto in lista_pks_assunto:
+
+    # list(filter(..)) usado para retirar strings vazias da lista
+    for pk_assunto in list(filter(None, lista_pks_assunto)):
         new.assuntos.add(AssuntoNorma.objects.get(pk=pk_assunto))
 
 


Test patch:
Repository: interlegis/sapl

Issue:
Substituir Whoosh por ElasticSearch ou Solr



Discussion:

Resolving patch:
diff --git a/sapl/settings.py b/sapl/settings.py
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -84,11 +84,22 @@
 
 ) + SAPL_APPS
 
+# FTS = Full Text Search
+SEARCH_BACKEND = 'haystack.backends.whoosh_backend.WhooshEngine'
+SEARCH_URL = ('PATH', PROJECT_DIR.child('whoosh'))
+
+SOLR_URL = config('SOLR_URL', cast=str, default='')
+if SOLR_URL:
+    SEARCH_BACKEND = 'haystack.backends.solr_backend.SolrEngine'
+    SEARCH_URL = ('URL', config('SOLR_URL', cast=str))
+    # ...or for multicore...
+    # 'URL': 'http://127.0.0.1:8983/solr/mysite',
+
 
 HAYSTACK_CONNECTIONS = {
     'default': {
-        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
-        'PATH': PROJECT_DIR.child('whoosh'),
+        'ENGINE': SEARCH_BACKEND,
+        SEARCH_URL[0] : SEARCH_URL[1]
     },
 }
 


Test patch:
Repository: interlegis/sapl

Issue:
Migração: status de matéria
O status de matéria legislativa Autógrafo foi migrado como "??????????" e sigla "??????????".


Discussion:
Problema semelhante a esse: https://github.com/interlegis/sapl/issues/1047#issuecomment-298039679
Não creio que seja semelhante #1047 , pois usamos direto esse status Autógrafo. 
As interrogações indicam que alguma entrada importante não existia e teve que ser criada pela migração.
Como não temos o conteúdo da entrada que foi necessária ser criada, colocamos a string "??????????" justamente pra indicar que isso foi criado durante a migração e que não sabemos o seu conteúdo. 
Como é criado algo que não existia durante a migração, ambos os casos (este e o de #1047) são semelhantes. Estes casos devem ser verificados com calma **após a migração** pois são entradas necessárias que não existiam.
Abaixo os status existentes no 2.5, lá está "Autógrafo".
![captura de tela de 2017-05-05 08 03 12](https://cloud.githubusercontent.com/assets/19169882/25743239/c13a5030-3169-11e7-9d8e-873ee333a79e.png)

Essa issue me ajudou a encontrar um problema no script de migração. Durante a migração, estava fazendo a busca pela última entrada de `StatusTramitacao`, porém este método estava me retornando um valor errado, por isso a entrada "Autógrafo" estava sendo substituido pelas interrogações. 
Contudo, essa entrada que possui várias interrogação continuará existindo, pois existe uma `Tramitacao` que não possui referência para nenhum `StatusTramitacao`, logo, por não haver referência e ser um campo obrigatório, tenho que criar um stub.

Resolving patch:
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -130,9 +130,7 @@ def get_fk_related(field, value, label=None):
                 if not field.null:
                     fields_dict = get_fields_dict(field.related_model)
                     # Cria stub ao final da tabela para evitar erros
-                    pk = 1
-                    if hasattr(field.related_model.objects.last(), 'pk'):
-                        pk = field.related_model.objects.last().pk
+                    pk = get_last_value(field.related_model)
                     with reversion.create_revision():
                         reversion.set_comment('Stub criado pela migração')
                         value = mommy.make(


Test patch:
Repository: interlegis/sapl

Issue:
Migração Textos - Normas Jurídicas
Os textos das normas jurídicas são copiados para a estrutura exemplo:
 media/sapl/normajuridica/6935/6935_texto_integral.pdf

Porém o caminho não é gravado no banco para a norma.

em tempo, comentei o script de migração de documentos na função
```def migrar_docs_logo():
    print('#### Migrando logotipo da casa ####')
    [(_, origem, destino)] = DOCS[CasaLegislativa]
    props_sapl = os.path.dirname(origem)
#    a pasta props_sapl deve conter apenas o origem e metadatas!
#    assert set(os.listdir(em_media(props_sapl))) < {
#        'logo_casa.gif', '.metadata', 'logo_casa.gif.metadata'}
#    mover_documento(origem, destino)
#    casa = get_casa_legislativa()
#    casa.logotipo = destino
#    casa.save()
```
pois na minha dava erro nesta parte



Discussion:

Resolving patch:
diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py
--- a/sapl/legacy/migracao_documentos.py
+++ b/sapl/legacy/migracao_documentos.py
@@ -11,6 +11,7 @@
 from sapl.norma.models import NormaJuridica
 from sapl.parlamentares.models import Parlamentar
 from sapl.protocoloadm.models import DocumentoAdministrativo
+from sapl.protocoloadm.models import DocumentoAcessorioAdministrativo
 from sapl.sessao.models import SessaoPlenaria
 from sapl.settings import MEDIA_ROOT
 from sapl.utils import delete_texto, save_texto
@@ -64,7 +65,7 @@
         'materia/{}',
         'documentoacessorio/{0}/{0}{1}')],
     NormaJuridica: [(
-        'texto_original',
+        'texto_integral',
         'norma_juridica/{}_texto_integral',
         'normajuridica/{0}/{0}_texto_integral{1}')],
     SessaoPlenaria: [
@@ -82,7 +83,13 @@
     DocumentoAdministrativo: [(
         'texto_integral',
         'administrativo/{}_texto_integral',
-        'documentoadministrativo/{0}/{0}_texto_integral{1}')],
+        'documentoadministrativo/{0}/{0}_texto_integral{1}')       
+    ],
+    DocumentoAcessorioAdministrativo: [(
+    	  'arquivo',
+        'administrativo/{}',
+        'documentoacessorioadministrativo/{0}/{0}_acessorio_administrativo{1}')
+    ],
 }
 
 DOCS = {tipo: [(campo,
@@ -215,6 +222,7 @@ def migrar_documentos():
         SessaoPlenaria,
         Proposicao,
         DocumentoAdministrativo,
+      	DocumentoAcessorioAdministrativo,
     ]:
         migrar_docs_por_ids(tipo)
 


Test patch:
Repository: interlegis/sapl

Issue:
Migração: Nome da comissão não foi migrada para autor
No caso do autor ser uma comissão, o campo do nome do autor não está sendo preenchido com o nome da comissão.


Discussion:

Resolving patch:
diff --git a/sapl/base/migrations/0003_auto_20170519_1106.py b/sapl/base/migrations/0003_auto_20170519_1106.py
new file mode 100644
--- /dev/null
+++ b/sapl/base/migrations/0003_auto_20170519_1106.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.12 on 2017-05-19 11:06
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('base', '0002_auto_20170331_1900'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='autor',
+            name='nome',
+            field=models.CharField(blank=True, max_length=60, verbose_name='Nome do Autor'),
+        ),
+    ]
diff --git a/sapl/base/models.py b/sapl/base/models.py
--- a/sapl/base/models.py
+++ b/sapl/base/models.py
@@ -211,7 +211,7 @@ class Autor(models.Model):
     autor_related = GenericForeignKey('content_type', 'object_id')
 
     nome = models.CharField(
-        max_length=50, blank=True, verbose_name=_('Nome do Autor'))
+        max_length=60, blank=True, verbose_name=_('Nome do Autor'))
 
     cargo = models.CharField(max_length=50, blank=True)
 
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -723,6 +723,7 @@ def adjust_autor(new, old):
         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
 
     if old.col_username:
         if not get_user_model().objects.filter(


Test patch: