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

Issue:
Migração: SQL não é executada por conter dados inválidos
A SQL que ajusta campos inexistentes nas tabelas legadas não é executada caso haja algum valor que o Django não aceita.

O seguinte erro apareceu na tela:
```Args: '(1292, "Incorrect datetime value: '0000-00-00 00:00:00' for column 'dat_envio' at row 1")'```

Isso foi verificado em uma base de dados cujo o campo `dat_envio` da tabela `proposicao` era igual a `0000-00-00 00:00:00`.

Após a resolução manual desses valores para um diferente, a execução da SQL foi realizada.



Discussion:
Esse erro de incorrect datetime não é do Django. O próprio MySQL não consegue alterar a estrutura da tabela caso o valor da data esteja inválido.

Resolving patch:
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -750,8 +750,8 @@ def adjust_proposicao_antes_salvar(new, old):
 
 def adjust_proposicao_depois_salvar(new, old):
     if not hasattr(old.dat_envio, 'year') or old.dat_envio.year == 1800:
-        msg = "O valor do campo data_envio (DateField) da model Proposicao"
-        "era inválido"
+        msg = "O valor do campo data_envio (DateField) da model Proposicao"\
+                " era inválido"
         descricao = 'A data 1111-11-11 foi colocada no lugar'
         problema = 'O valor da data era nulo ou inválido'
         warn(msg + ' => ' + descricao)


Test patch:
Repository: interlegis/sapl

Issue:
Anular protocolo com Documentos Vinculados.
Não sei se faz sentido, mas está sendo possível anular protocolo com documentos vinculados

![image](https://user-images.githubusercontent.com/13314947/28933875-2d194d56-7855-11e7-8757-7f73c5c7b6d6.png)

Me parece que o correto seria o usuário se obrigado a excluir o documento vinculado e depois poder cancelar o protocolo


Discussion:
A checagem é tranquila de fazer, mas não posso opinar sobre isso pq não conheço a realidade de uso diário do sapl. /cc @LeandroRoberto @andreagudo ?
Parece não fazer sentido. Há muito poucas situações em que um protocolo é anulado. Há poucos dias geramos dois protocolos, um deles por engano, para um mesmo documento que entrou na Casa. Um deles foi anulado. Mas, se chegou a gerar um documento administrativo, poderia o protocolo ser anulado? Penso que não.
Pois é, gerando documento administrativo ou matéria legislativa, depois de vinculado ele não poderia mais ser anulado.

Resolving patch:
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -12,7 +12,7 @@
 
 from sapl.base.models import Autor
 from sapl.crispy_layout_mixin import form_actions, to_row
-from sapl.materia.models import TipoMateriaLegislativa, UnidadeTramitacao
+from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa, UnidadeTramitacao
 from sapl.utils import (RANGE_ANOS, AnoNumeroOrderingFilter,
                         RangeWidgetOverride, autor_label, autor_modal)
 
@@ -233,7 +233,18 @@ def clean(self):
         except ObjectDoesNotExist:
             raise forms.ValidationError(
                 _("Protocolo %s/%s não existe" % (numero, ano)))
-
+        exists = False
+        if protocolo.tipo_materia:
+            exists = MateriaLegislativa.objects.filter(
+                numero_protocolo=protocolo.numero, ano=protocolo.ano).exists()
+        elif protocolo.tipo_documento:
+            exists = protocolo.documentoadministrativo_set.all(
+                ).order_by('-ano', '-numero').exists()
+
+        if exists:
+            raise forms.ValidationError(
+                _("Protocolo %s/%s não pode ser removido pois existem"
+                    "documentos vinculados a ele." % (numero, ano)))
     class Meta:
         model = Protocolo
         fields = ['numero',


Test patch:
Repository: interlegis/sapl

Issue:
Pauta da Sessão - Expedientes
Para as pautas importadas do sapl 2.5 a exibição de caracteres especiais está ok, porém para as cadastradas no sapl 3.1 não. Na geração do pdf está ok tanto para as importadas quanto para as cadastradas

![image](https://user-images.githubusercontent.com/13314947/28584370-de28021e-7142-11e7-915f-48fefd570bfa.png)


Seria interessante também que fosse mantido as quebras de linhas, conforme exibido nos expedientes da sessão e no pdf da pauta

![image](https://user-images.githubusercontent.com/13314947/28584585-a4e2cdc6-7143-11e7-9ed5-154e1fa37a4b.png)



Discussion:
Na base do 3.1 a diferença de como estão armazenados os dados importados e cadastrados
![image](https://user-images.githubusercontent.com/13314947/28584742-35ced50a-7144-11e7-9287-087fb3be39cf.png)

Acredito que a renderização vai estar correta depois do commit 5f49e3b . Poderia testar por favor?

Caso contrário, só reabrir esta issue.
Problema com os caracteres especiais resolvidos, o detalhe seria inserir as quebras de linha
http://sapl3beta.camarabento.rs.gov.br/sessao/pauta-sessao/372

Resolving patch:
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -2268,7 +2268,7 @@ def get(self, request, *args, **kwargs):
             tipo = TipoExpediente.objects.get(
                 id=e.tipo_id)
             conteudo = sub(
-                '&nbsp;', ' ', strip_tags(e.conteudo))
+                '&nbsp;', ' ', strip_tags(e.conteudo.replace('<br/>', '\n')))
 
             ex = {'tipo': tipo, 'conteudo': conteudo}
             expedientes.append(ex)


Test patch:
Repository: interlegis/sapl

Issue:
Migração - Comissões
Teria que ser levado em conta também a data de término, além da data de extinção para migrar com o status de inativo para a comissão.


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
@@ -898,13 +898,13 @@ def adjust_autor(new, old):
 
 
 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:
+    if not old.dat_extincao and not old.dat_fim_comissao:
+        new.ativa = True
+    elif old.dat_extincao and date.today() < new.data_extincao or \
+            old.dat_fim_comissao and date.today() < new.data_fim_comissao:
         new.ativa = True
+    else:
+        new.ativa = False
 
 
 AJUSTE_ANTES_SALVAR = {


Test patch:
Repository: interlegis/sapl

Issue:
Erro de valor máximo de CharField
```
django.db.utils.DataError: value too long for type character varying(X)
```

O erro acima apareceu duas vezes durante a migração. Uma onde valor de **X** no 'varying(X)' era 60 (na model Comissao, campo 'nome') e outra com valor 50 (na model AssuntoMateria, campo 'dispositivo').
Verificar se o tamanho máximo para esses campos não deveria ser maior.


Discussion:
@marciomazza
Qual seria a melhor abordagem pra resolver esse problema? Aumenta o valor do max_length desses campos?
Aumentar o valor no Model, sim!

Resolving patch:
diff --git a/sapl/comissoes/migrations/0002_auto_20170809_1236.py b/sapl/comissoes/migrations/0002_auto_20170809_1236.py
new file mode 100644
--- /dev/null
+++ b/sapl/comissoes/migrations/0002_auto_20170809_1236.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.12 on 2017-08-09 12:36
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('comissoes', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='comissao',
+            name='nome',
+            field=models.CharField(max_length=100, verbose_name='Nome'),
+        ),
+    ]
diff --git a/sapl/comissoes/models.py b/sapl/comissoes/models.py
--- a/sapl/comissoes/models.py
+++ b/sapl/comissoes/models.py
@@ -35,7 +35,7 @@ class Comissao(models.Model):
     tipo = models.ForeignKey(TipoComissao,
                              on_delete=models.PROTECT,
                              verbose_name=_('Tipo'))
-    nome = models.CharField(max_length=60, verbose_name=_('Nome'))
+    nome = models.CharField(max_length=100, verbose_name=_('Nome'))
     sigla = models.CharField(max_length=10, verbose_name=_('Sigla'))
     data_criacao = models.DateField(verbose_name=_('Data de Criação'))
     data_extincao = models.DateField(


Test patch:
Repository: interlegis/sapl

Issue:
Testar e validar notificação de email's no cadastro de autor
@edwardoliveira Gostaria que fosse testado o serviço de email do cadastro de Autor...
mudei pouca coisa em get_success_url mas como houve mudanças é necessário testar... tanto na criação autor, quanto na alteração.



Discussion:
:+1:
![screenshot from 2017-08-10 10-24-44](https://user-images.githubusercontent.com/5272409/29172414-3f63bea4-7db6-11e7-9687-74a4aa3c2701.png)
email de confirmação foi enviado pelo Django usando a configuração
```
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
```
para teste local. 

Substituir pela configuração
```
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
```
em produção e configure o servidor smtp do seu sistema.

Resolving patch:
diff --git a/sapl/settings.py b/sapl/settings.py
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -39,7 +39,10 @@
 LOGIN_REDIRECT_URL = '/'
 LOGIN_URL = '/login/?next='
 
-EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+if DEBUG:
+    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
+else:
+    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
 
 
 # SAPL business apps in dependency order


Test patch:
Repository: interlegis/sapl

Issue:
Implementar numeração de protocolo por legislatura
Enquanto desenvolvíamos o SAPL 3.1, foi adicionado ao 2.5 a opção de reiniciar a numeração protocolo por legislatura. Implementar.


Discussion:
Precisamos disso para a issue de migração #995.

Resolving patch:
diff --git a/sapl/base/models.py b/sapl/base/models.py
--- a/sapl/base/models.py
+++ b/sapl/base/models.py
@@ -11,6 +11,7 @@
                                  ('R', _('Restritivo')))
 
 SEQUENCIA_NUMERACAO = (('A', _('Sequencial por ano')),
+                       ('L', _('Sequencial por legislatura')),
                        ('U', _('Sequencial único')))
 
 
diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py
--- a/sapl/protocoloadm/views.py
+++ b/sapl/protocoloadm/views.py
@@ -287,6 +287,13 @@ def form_valid(self, form):
         if numeracao == 'A':
             numero = Protocolo.objects.filter(
                 ano=date.today().year).aggregate(Max('numero'))
+        elif numeracao == 'L':
+            legislatura = Legislatura.objects.last()
+            data_inicio = legislatura.data_inicio
+            data_fim = legislatura.data_fim
+            numero = Protocolo.objects.filter(
+                data__gte=data_inicio, data__lte=data_fim).aggregate(
+                    Max('numero'))
         elif numeracao == 'U':
             numero = Protocolo.objects.all().aggregate(Max('numero'))
 


Test patch:
Repository: interlegis/sapl

Issue:
Sessão Plenária - Resumo - Ordem oradores das expli pessoais
A ordem está inversa para os oradores das explicações pessoais no resumo da sessão plenária

![image](https://user-images.githubusercontent.com/13314947/29414393-e691e190-8335-11e7-9970-3d251417a136.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
@@ -1253,7 +1253,7 @@ def get(self, request, *args, **kwargs):
         # =====================================================================
         # Oradores nas Explicações Pessoais
         oradores_explicacoes = []
-        for orador in Orador.objects.filter(sessao_plenaria_id=self.object.id):
+        for orador in Orador.objects.filter(sessao_plenaria_id=self.object.id).order_by('numero_ordem'):
                 for parlamentar in Parlamentar.objects.filter(
                         id=orador.parlamentar.id):
                     partido_sigla = Filiacao.objects.filter(


Test patch:
Repository: interlegis/sapl

Issue:
Exibir todos sem paginar
Quando os registros das matérias da ordem do dia e do expediente são paginados, acaba inviabilizando a ordenação das matérias arrastando para reposicionar caso tenha que mudar de página

Seria interessante que nesse tipo de tabela tivesse a opção de mostrar todos

http://sapl3beta.camarabento.rs.gov.br/sessao/376/ordemdia


Discussion:
A solução que nós encontramos seria não paginarmos essas telas. A paginação é feita para que a renderização das mesmas não demore. Como geralmente tem poucas matérias a serem votadas em uma Sessão, a falta de paginação não teria um grande impacto.

O que acham @LeandroRoberto @andreagudo @DtiLegBG ?
Por mim tudo bem, acho que é uma solução!
+1.

Resolving patch:
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -199,6 +199,7 @@ def layout_key(self):
             return 'OrdemDiaDetail'
 
     class ListView(MasterDetailCrud.ListView):
+        paginated_by = None
         ordering = ['numero_ordem', 'materia', 'resultado']
 
         def get_context_data(self, **kwargs):
@@ -319,6 +320,7 @@ class BaseMixin(MasterDetailCrud.BaseMixin):
                             'materia__ementa', 'resultado']
 
     class ListView(MasterDetailCrud.ListView):
+        paginated_by = None
         ordering = ['numero_ordem', 'materia', 'resultado']
 
         def get_context_data(self, **kwargs):


Test patch:
Repository: interlegis/sapl

Issue:
Sugestão de Proximo número para normas por tipo.
A exemplo do que é feito em matérias, onde selecionando o tipo, o sistema sugere o número, seria interessante essa funcionalidade para normas, onde escolhendo o tipo, o sistema sugerisse o número a ser cadastrado


Discussion:

Resolving patch:
diff --git a/sapl/norma/urls.py b/sapl/norma/urls.py
--- a/sapl/norma/urls.py
+++ b/sapl/norma/urls.py
@@ -2,7 +2,8 @@
 
 from sapl.norma.views import (AssuntoNormaCrud, NormaCrud, NormaPesquisaView,
                               NormaRelacionadaCrud, NormaTaView, TipoNormaCrud,
-                              TipoVinculoNormaJuridicaCrud, recuperar_norma)
+                              TipoVinculoNormaJuridicaCrud, recuperar_norma,
+                              recuperar_numero_norma)
 
 from .apps import AppConfig
 
@@ -25,5 +26,7 @@
         NormaPesquisaView.as_view(), name='norma_pesquisa'),
 
     url(r'^norma/recuperar-norma$', recuperar_norma, name="recuperar_norma"),
+    url(r'^norma/recuperar-numero-norma$', recuperar_numero_norma,
+        name="recuperar_numero_norma"),
 
 ]
diff --git a/sapl/norma/views.py b/sapl/norma/views.py
--- a/sapl/norma/views.py
+++ b/sapl/norma/views.py
@@ -1,3 +1,4 @@
+from datetime import datetime
 from django.core.exceptions import ObjectDoesNotExist
 from django.core.urlresolvers import reverse
 from django.http import JsonResponse
@@ -145,6 +146,7 @@ def cancel_url(self):
         def layout_key(self):
             return 'NormaJuridicaCreate'
 
+
     class ListView(Crud.ListView, RedirectView):
 
         def get_redirect_url(self, *args, **kwargs):
@@ -185,3 +187,22 @@ def recuperar_norma(request):
         response = JsonResponse({'ementa': '', 'id': 0})
 
     return response
+
+
+def recuperar_numero_norma(request):
+    tipo = TipoNormaJuridica.objects.get(pk=request.GET['tipo'])
+    ano = request.GET.get('ano', '')
+
+    param = {'tipo': tipo}
+    param['ano'] = ano if ano else datetime.now().year
+
+    norma = NormaJuridica.objects.filter(**param).order_by(
+        'tipo', 'ano', 'numero').values_list('numero', 'ano').last()
+    if norma:
+        response = JsonResponse({'numero': int(norma[0]) + 1,
+                                 'ano': norma[1]})
+    else:
+        response = JsonResponse(
+            {'numero': 1, 'ano': ano})
+
+    return response


Test patch:
Repository: interlegis/sapl

Issue:
Sugestão de Proximo número para normas por tipo.
A exemplo do que é feito em matérias, onde selecionando o tipo, o sistema sugere o número, seria interessante essa funcionalidade para normas, onde escolhendo o tipo, o sistema sugerisse o número a ser cadastrado


Discussion:

Resolving patch:
diff --git a/sapl/parlamentares/migrations/0006_auto_20170831_1400.py b/sapl/parlamentares/migrations/0006_auto_20170831_1400.py
new file mode 100644
--- /dev/null
+++ b/sapl/parlamentares/migrations/0006_auto_20170831_1400.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.13 on 2017-08-31 14:00
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('parlamentares', '0005_auto_20170814_1615'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='votante',
+            options={'permissions': (('can_vote', 'Can Vote'),), 'verbose_name': 'Usuário Votante', 'verbose_name_plural': 'Usuários Votantes'},
+        ),
+    ]
diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py
--- a/sapl/parlamentares/models.py
+++ b/sapl/parlamentares/models.py
@@ -576,8 +576,8 @@ class Votante(models.Model):
         max_length=30, null=True, blank=True)
 
     class Meta:
-        verbose_name = _('Usuário')
-        verbose_name_plural = _('Usuários')
+        verbose_name = _('Usuário Votante')
+        verbose_name_plural = _('Usuários Votantes')
         permissions = (
             ('can_vote', _('Can Vote')),
         )


Test patch:
Repository: interlegis/sapl

Issue:
Inserção da tabela de Partidos políticos do TSE
Sugestão:

Inserir a tabela de partidos do TSE, afim de agilizar o preenchimento dos dados cadastrais do parlamentar.
grato


Discussion:
@LucianoAlmeida e @marciomazza, que influências isso pode ter na migração? Estou pensando na eventualidade disso duplicar registros nessas tabelas... :thinking: 
Relacionada a https://github.com/interlegis/sapl/issues/1389

Resolving patch:
diff --git a/sapl/parlamentares/migrations/0007_adiciona_partidos.py b/sapl/parlamentares/migrations/0007_adiciona_partidos.py
new file mode 100644
--- /dev/null
+++ b/sapl/parlamentares/migrations/0007_adiciona_partidos.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+from django.db import migrations
+import json
+import os
+
+
+from django.core.management import call_command
+
+
+
+def gera_partidos_tse(apps, schema_editor):
+    Partido = apps.get_model("parlamentares", "Partido")
+    db_alias = schema_editor.connection.alias
+    partidos = Partido.objects.all().exists()
+
+    if partidos:
+        # Caso haja algum partido cadastrado na base de dados,
+        # a migração não deve ser carregada para evitar duplicações de dados.
+        print("Carga de Partido não efetuada. Já Existem partidos cadastrados...")
+    else:
+        fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures'))
+        # pega partidos listados em fixtures/pre_popula_partidos.json
+        fixture_filename = 'pre_popula_partidos.json'
+        fixture_file = os.path.join(fixture_dir, fixture_filename)
+        call_command('loaddata', fixture_file)
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        # A dependencia real desse script é o arquivo 0001_initial.py, mas
+        # isso gera um erro (Conflicting migrations detected; multiple leaf
+         # nodes in the migration graph). para não  ocasionar problemas de migração,
+         # vamos manter a ordem padrão do django.
+        ('parlamentares', '0006_auto_20170831_1400'),
+    ]
+
+    operations = [
+        migrations.RunPython(gera_partidos_tse),
+    ]


Test patch:
Repository: interlegis/sapl

Issue:
Tabela de cargos da Mesa Diretora
Sugestão:
Inserir a tabela dos cargos da mesa diretora no sistema (Presidente, Vice-Presidente, Primeiro-Secretário e Segundo-Secretário) deixando a opção de inserção de outros cargos.

Justificativa: Facilitar na formação da Mesa Diretora e evitar que o operador digite errado ou em CAIXA ALTA, mantendo assim um padrão no sistema.


Discussion:
@LucianoAlmeida e @marciomazza, que influências isso pode ter na migração? Estou pensando na eventualidade disso duplicar registros nessas tabelas... :thinking:

Resolving patch:
diff --git a/sapl/parlamentares/migrations/0008_adiciona_cargos_mesa.py b/sapl/parlamentares/migrations/0008_adiciona_cargos_mesa.py
new file mode 100644
--- /dev/null
+++ b/sapl/parlamentares/migrations/0008_adiciona_cargos_mesa.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+from django.db import migrations
+import json
+import os
+
+
+from django.core.management import call_command
+
+
+
+def gera_cargos_mesa(apps, schema_editor):
+    CargoMesa = apps.get_model("parlamentares", "CargoMesa")
+    db_alias = schema_editor.connection.alias
+    cargos_mesa = CargoMesa.objects.all().exists()
+
+    if cargos_mesa:
+        # Caso haja algum CargoMesa cadastrado na base de dados,
+        # a migração não deve ser carregada para evitar duplicações de dados.
+        print("Carga de {} não efetuada. Já Existem {} cadastrados...".format(
+            CargoMesa._meta.verbose_name, CargoMesa._meta.verbose_name_plural))
+    else:
+        fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures'))
+        # pega partidos listados em fixtures/pre_popula_partidos.json
+        fixture_filename = 'pre_popula_cargosmesa.json'
+        fixture_file = os.path.join(fixture_dir, fixture_filename)
+        call_command('loaddata', fixture_file)
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        # A dependencia real desse script é o arquivo 0001_initial.py, mas
+        # isso gera um erro (Conflicting migrations detected; multiple leaf
+         # nodes in the migration graph). para não ocasionar problemas de migração,
+         # vamos manter a ordem padrão do django.
+        ('parlamentares', '0007_adiciona_partidos'),
+    ]
+
+    operations = [
+        migrations.RunPython(gera_cargos_mesa),
+    ]


Test patch: