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

Issue:
Adicionar Tramitação
Quando a última tramitação de uma matéria legislativa não possui unidade de destino, não é possível se adicionar novas tramitações e ocorre um ERRO 500. 


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
@@ -1037,10 +1037,16 @@ def get_context_data(self, **kwargs):
                 '-id').first()
 
             if ultima_tramitacao:
-                context['form'].fields[
-                    'unidade_tramitacao_local'].choices = [
-                    (ultima_tramitacao.unidade_tramitacao_destino.pk,
-                     ultima_tramitacao.unidade_tramitacao_destino)]
+                if ultima_tramitacao.unidade_tramitacao_destino:
+                    context['form'].fields[
+                        'unidade_tramitacao_local'].choices = [
+                        (ultima_tramitacao.unidade_tramitacao_destino.pk,
+                         ultima_tramitacao.unidade_tramitacao_destino)]
+                else:
+                    msg = _('Unidade de tramitação destino '
+                            ' da última tramitação não pode ser vazia!')
+                    messages.add_message(self.request, messages.ERROR, msg)
+
             return context
 
         def form_valid(self, form):


Test patch:
Repository: interlegis/sapl

Issue:
Ordenar proposições não recebidas por qualquer campo do cabeçalho
Na tela do operador de consulta às proposições não recebidas,

![visao operador](https://user-images.githubusercontent.com/22030378/40062199-3c035098-584a-11e8-9ea9-a472dce15bde.png)

 seria útil que o cabeçalho possibilitasse a ordenação ascendente/descendente por qualquer um dos campos, conforme escolha do usuário. É a mesma funcionalidade na visão das proposições pelo autor:

![visao autor](https://user-images.githubusercontent.com/22030378/40062085-e72132b6-5849-11e8-9a71-73690ea85fcd.png)

Tal recurso, aliado ao recebimento de proposições sem recibo, agilizará muito os processos internos, sobretudo nas Câmaras com grande volume de matérias legislativas a cada sessão.




Discussion:
Muito importante essa atualização, pois isso dificulta enormemente o manejo das proposições, pois as mesmas são carregadas na página de forma desordenada.

Resolving patch:
diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py
--- a/sapl/base/templatetags/common_tags.py
+++ b/sapl/base/templatetags/common_tags.py
@@ -3,7 +3,7 @@
 from django.template.defaultfilters import stringfilter
 
 from sapl.base.models import AppConfig
-from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa
+from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, Proposicao
 from sapl.norma.models import NormaJuridica
 from sapl.parlamentares.models import Filiacao
 from sapl.utils import filiacao_data
@@ -11,6 +11,11 @@
 register = template.Library()
 
 
+@register.simple_tag
+def define(arg):
+  return arg
+
+
 @register.simple_tag
 def field_verbose_name(instance, field_name):
     return instance._meta.get_field(field_name).verbose_name
@@ -34,6 +39,30 @@ def model_verbose_name_plural(class_name):
     return model._meta.verbose_name_plural
 
 
+@register.filter
+def split(value, arg):
+    return value.split(arg)
+
+
+@register.filter
+def sort_by_keys(value, key):
+    transformed = []
+    id_props = [x.id for x in value]
+    qs = Proposicao.objects.filter(pk__in=id_props)
+    key_descricao = {'1': 'data_envio',
+                        '-1': '-data_envio',
+                        '2': 'tipo',
+                        '-2': '-tipo',
+                        '3': 'descricao',
+                        '-3': '-descricao',
+                        '4': 'autor',
+                        '-4': '-autor'
+                        }
+
+    transformed = qs.order_by(key_descricao[key])
+    return transformed
+
+
 @register.filter
 def lookup(d, key):
     return d[key] if key in d else []


Test patch:
Repository: interlegis/sapl

Issue:
ERRO 404 ao tentar acessar texto original da proposição e não ser o autor



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
@@ -96,7 +96,9 @@ def proposicao_texto(request, pk):
     if proposicao.texto_original:
         if (not proposicao.data_recebimento and
                 proposicao.autor.user_id != request.user.id):
-            raise Http404
+            messages.error(request, _('Você não tem permissão para acessar o texto original.'))
+            return redirect(reverse('sapl.materia:proposicao_detail',
+                                    kwargs={'pk':pk}))
 
         arquivo = proposicao.texto_original
 


Test patch:
Repository: interlegis/sapl

Issue:
erro na incorporação de proposição após seu recebimento no protocolo
Na oficina de SAPL em Natal, utilizando o cursosapl01.interlegis.leg.br, ao tentar incorporar uma proposição após o seu recebimento no protocolo, ocorreu o seguinte erro:
![image](https://user-images.githubusercontent.com/30807716/41799483-18509cf2-7648-11e8-9858-6f012524d5d0.png)



Discussion:
Isso é um bug na incorporação onde a numeração é gerada por Legislatura.

Resolving patch:
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -1818,7 +1818,19 @@ def save(self, commit=False):
         if numeracao == 'A':
             nm = Protocolo.objects.filter(
                 ano=timezone.now().year).aggregate(Max('numero'))
-        elif numeracao == 'U':
+        elif numeracao == 'L':
+            legislatura = Legislatura.objects.filter(
+                data_inicio__year__lte=timezone.now().year,
+                data_fim__year__gte=timezone.now().year).first()
+            data_inicio = legislatura.data_inicio
+            data_fim = legislatura.data_fim
+            nm = MateriaLegislativa.objects.filter(
+                data_apresentacao__gte=data_inicio,
+                data_apresentacao__lte=data_fim,
+                tipo=tipo).aggregate(Max('numero'))
+
+        else:
+            # numeracao == 'U' ou não informada
             nm = Protocolo.objects.all().aggregate(Max('numero'))
 
         protocolo = Protocolo()


Test patch:
Repository: interlegis/sapl

Issue:
Norma jurídica: registro com número já usado
Foi possível registrar uma norma jurídica com um número já usado. Posteriormente, a edição do número funcionou.
![captura de tela de 2018-06-25 14-50-44](https://user-images.githubusercontent.com/19169882/41866715-5ea38688-7887-11e8-9822-e6aaac2861b4.png)



Discussion:

Resolving patch:
diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py
--- a/sapl/norma/forms.py
+++ b/sapl/norma/forms.py
@@ -125,7 +125,7 @@ def clean(self):
 
         if not self.is_valid():
             return cleaned_data
-        if not self.instance:
+        if self.instance.numero != cleaned_data['numero']:
             norma = NormaJuridica.objects.filter(ano=cleaned_data['ano'],
                                          numero=cleaned_data['numero'],
                                          tipo=cleaned_data['tipo']).exists()


Test patch:
Repository: interlegis/sapl

Issue:
Número seguinte de norma jurídica
Ao inserir uma uma norma jurídica do tipo Portaria, oferece sempre o número 10 como próximo, embora já tenhamos superado tal número.


Discussion:

Resolving patch:
diff --git a/sapl/norma/views.py b/sapl/norma/views.py
--- a/sapl/norma/views.py
+++ b/sapl/norma/views.py
@@ -204,9 +204,9 @@ def recuperar_numero_norma(request):
 
     param = {'tipo': tipo}
     param['ano'] = ano if ano else timezone.now().year
-
-    norma = NormaJuridica.objects.filter(**param).order_by(
-        'tipo', 'ano', 'numero').values_list('numero', 'ano').last()
+    norma = NormaJuridica.objects.filter(**param).extra(
+            {'numero_id': "CAST(numero as INTEGER)"}).order_by(
+            'tipo', 'ano','numero_id').values_list('numero', 'ano').last()
     if norma:
         response = JsonResponse({'numero': int(norma[0]) + 1,
                                  'ano': norma[1]})


Test patch:
Repository: interlegis/sapl

Issue:
Colocar django reversion compare



Discussion:

Resolving patch:
diff --git a/sapl/settings.py b/sapl/settings.py
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -87,6 +87,7 @@
     'sass_processor',
     'rest_framework',
     'reversion',
+    'reversion_compare',
     'whoosh',
     'speedinfo',
 
diff --git a/sapl/utils.py b/sapl/utils.py
--- a/sapl/utils.py
+++ b/sapl/utils.py
@@ -25,6 +25,7 @@
 from easy_thumbnails import source_generators
 from floppyforms import ClearableFileInput
 from reversion.admin import VersionAdmin
+from reversion_compare.admin import CompareVersionAdmin
 from unipath.path import Path
 
 from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row
@@ -228,7 +229,7 @@ def register_all_models_in_admin(module_name):
     appname = appname[1] if appname[0] == 'sapl' else appname[0]
     app = apps.get_app_config(appname)
     for model in app.get_models():
-        class CustomModelAdmin(VersionAdmin):
+        class CustomModelAdmin(CompareVersionAdmin):
             list_display = [f.name for f in model._meta.fields
                             if f.name != 'id']
 


Test patch:
Repository: interlegis/sapl

Issue:
Recria opção de filtrar matérias por primeiro autor ou co-autor
Esta opção foi escondida em 2017 por algum motivo desconhecido. Essa issue repõe essa opção na tela de Matéria Legislativa.


Discussion:

Resolving patch:
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -666,7 +666,7 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
     autoria__primeiro_autor = django_filters.BooleanFilter(
         required=False,
         label='Primeiro Autor',
-        widget=forms.HiddenInput())
+        )
 
     ementa = django_filters.CharFilter(lookup_expr='icontains')
 
@@ -724,7 +724,6 @@ 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),
@@ -732,7 +731,8 @@ def __init__(self, *args, **kwargs):
                      'limpar Autor',
                      css_class='btn btn-primary btn-sm'), 10)])
         row5 = to_row(
-            [('autoria__autor__tipo', 12),
+            [('autoria__autor__tipo', 6),
+             ('autoria__primeiro_autor', 6),
              # ('autoria__autor__partido', 6)
              ])
         row6 = to_row(


Test patch:
Repository: interlegis/sapl

Issue:
Estouro de linha na etiqueta de documento administrativo
Estouro causado pelo tamanho do texto do assunto. Talvez, a solução seria o texto do assunto da etiqueta.

![image](https://user-images.githubusercontent.com/30807716/42234049-930786fc-7ec9-11e8-94aa-9481891c2436.png)



Discussion:

Resolving patch:
diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -963,7 +963,8 @@ def get_etiqueta_protocolos(prots):
         dic['num_documento'] = ''
         for documento in DocumentoAdministrativo.objects.filter(
                 protocolo=p):
-            dic['num_documento'] = str(documento)
+            dic['num_documento'] = documento.tipo.sigla + ' ' + \
+                str(documento.numero) + '/' + str(documento.ano)
 
         dic['ident_processo'] = dic['num_materia'] or dic['num_documento']
 


Test patch:
Repository: interlegis/sapl

Issue:
Erro ao enviar proposição
"Bom Dia, Equipe do Interlegis!

Ao enviar os pareceres das comissões através do módulo proposições no 
SAPL, está apresentado um erro e ao voltar e enviar novamente, ele 
mostra uma mensagem "Proposição já foi enviada", então está sendo 
enviado, mas aparece o erro conforme Print da Tela em anexo.

Att,

-- 
Maristela Guareschi Kruger
Assistente Administrativa
Câmara Municipal de Erechim RS"


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
@@ -700,12 +700,15 @@ def get(self, request, *args, **kwargs):
 
                         messages.success(request, _(
                             'Proposição enviada com sucesso.'))
-                        Numero = MateriaLegislativa.objects.filter(tipo=p.tipo.tipo_conteudo_related,
-                                                                   ano=p.ano).last().numero + 1
-                        messages.success(request, _(
-                            '%s : nº %s de %s <br>Atenção! Este número é apenas um provável '
-                            'número que pode não corresponder com a realidade'
-                            % (p.tipo, Numero, p.ano)))
+                        try:
+                            Numero = MateriaLegislativa.objects.filter(tipo=p.tipo.tipo_conteudo_related,
+                                                                       ano=p.ano).last().numero + 1
+                            messages.success(request, _(
+                                '%s : nº %s de %s <br>Atenção! Este número é apenas um provável '
+                                'número que pode não corresponder com a realidade'
+                                % (p.tipo, Numero, p.ano)))
+                        except ValueError:
+                            pass
 
                 elif action == 'return':
                     if not p.data_envio:


Test patch:
Repository: interlegis/sapl

Issue:
Separar autoria e coautoria nos relatórios
"Olá bom dia.
Sei que quando olhamos o portal antes da migração não encontramos nada incomum, prestamos mais atenção ao conteúdo, se estavam todos cadastrados., contudo, fui fazer uma filtragem nos relatórios e quanto a quantidade de proposituras de cada parlamentar consta as autorias e também as de coautoria, o que prejudica nosso relatório no final do ano, pois temos que separar a quantidade por autoria, e essa nossa atualização não permite isso, pois ela soma autor e coautor.. tem como verificar isso, por exemplo, o Vereador Acácio Rocha, neste ano, tem 25 indicações de sua autoria e mais 5 de coautoria, .. o relatório mostra 30 e não  25, o portal anterior, antes da migração, mostraria 25. Analisa isso pra gente, fazendo favor.

Atenciosamente, 
Maria Cristina

-- 
Câmara Municipal de Adamantina
http://sapl.camaraadamantina.sp.gov.br/
Rua Osvaldo Cruz, 262 - 1º Andar - Centro
Adamantina - SP Cep.17800-000
Cx. Postal: 111
Fone/Fax: (18) 35211826"

Enviado pelo Ticket nº 234277 em https://suporte.interlegis.leg.br/scp/tickets.php?id=24040


Discussion:

Resolving patch:
diff --git a/sapl/base/views.py b/sapl/base/views.py
--- a/sapl/base/views.py
+++ b/sapl/base/views.py
@@ -420,9 +420,9 @@ class RelatorioMateriasPorAnoAutorTipoView(FilterView):
     filterset_class = RelatorioMateriasPorAnoAutorTipoFilterSet
     template_name = 'base/RelatorioMateriasPorAnoAutorTipo_filter.html'
 
-    def get_materias_autor_ano(self, ano):
+    def get_materias_autor_ano(self, ano, primeiro_autor):
 
-        autorias = Autoria.objects.filter(materia__ano=ano).values(
+        autorias = Autoria.objects.filter(materia__ano=ano, primeiro_autor=primeiro_autor).values(
             'autor',
             'materia__tipo__sigla',
             'materia__tipo__descricao').annotate(
@@ -488,7 +488,8 @@ def get_context_data(self, **kwargs):
 
         if 'ano' in self.request.GET and self.request.GET['ano']:
             ano = int(self.request.GET['ano'])
-            context['relatorio'] = self.get_materias_autor_ano(ano)
+            context['relatorio'] = self.get_materias_autor_ano(ano, True)
+            context['corelatorio'] = self.get_materias_autor_ano(ano, False)
         else:
             context['relatorio'] = []
 


Test patch:
Repository: interlegis/sapl

Issue:
Erro ao cadastrar protocolo administrativo
O código comparava a PK com o número de protocolo para checar a existência de protocolo já vinculado.


Discussion:

Resolving patch:
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -708,10 +708,10 @@ def clean(self):
                                                     ano=ano_protocolo).exists()
 
                 exist_doc = DocumentoAdministrativo.objects.filter(
-                                                        protocolo_id=numero_protocolo,
-                                                        ano=ano_protocolo).exists()
+                                                        protocolo__numero=numero_protocolo,
+                                                        protocolo__ano=ano_protocolo).exists()
                 if exist_materia or exist_doc:
-                    raise ValidationError(_('Protocolo %s/%s ja possui'
+                    raise ValidationError(_('Protocolo %s/%s já possui'
                                             ' documento vinculado'
                                             % (numero_protocolo, ano_protocolo)))
 


Test patch:
Repository: interlegis/sapl

Issue:
Erro ao imprimir etiquetas (campo descrição estourando)
Nome da Cidade: | Birigui
Estado: | São Paulo
Casa Legislativa: | Câmara Municipal

Bom dia,
Começamos hoje a utilizar a versão 3.1 do SAPL que foi migrado ontem. Mas estamos com um problema na impressão das etiquetas do protocolo administrativo. O problema está na última linha da etiqueta, ela imprimi o Assunto ao invés do Tipo/Número do documento vinculado, gerando uma etiqueta enorme. 
No aguardo,
Evandro.


Discussion:

Resolving patch:
diff --git a/sapl/relatorios/templates/pdf_etiqueta_protocolo_gerar.py b/sapl/relatorios/templates/pdf_etiqueta_protocolo_gerar.py
--- a/sapl/relatorios/templates/pdf_etiqueta_protocolo_gerar.py
+++ b/sapl/relatorios/templates/pdf_etiqueta_protocolo_gerar.py
@@ -98,7 +98,11 @@ def protocolos(lst_protocolos, dic_cabecalho):
         tmp_data += '\t\t<para style="P2"><b>' + \
             dic['natureza']
         if dic['ident_processo']:
-            tmp_data +=  ' - ' + dic['ident_processo'] + '</b></para>\n'
+            # Limita o tamanho do texto para não "explodir" as etiquetas
+            descricao = dic['ident_processo'][:60]
+            if len(dic['ident_processo']) > 60:
+                descricao += '...'
+            tmp_data += ' - ' + descricao + '</b></para>\n'
         else:
             tmp_data += '</b></para>\n'
 


Test patch:
Repository: interlegis/sapl

Issue:
Pesquisa de normas jurídicas
Olá, estou testando o SAPL 3.1 e percebi que a pesquisa de normas jurídicas não retorna resultado caso seja acrescentado o número "0" antes da numeração da norma. 



Discussion:
Vamos estudar essa implementação. Até porque, é factível que em algum momento, o cidadão vai colocar um  0 antes do número, e não localizará a norma pretendida! Já na Matéria, essa constatação não ocorre!
obrigado
Este campo não é numérico porque precisamos compatibilizar os vários formato como, por exemplo, Lei 3449, Lei 3450, lei  3450-A, lei 3450-B, lei 3451. Sendo assim, recomenda-se utilizar a numeração sem zero à esquerda. 

Vide a issue #879 (@DtiLegBG, teria ideia de como resolver isso?)

Resolving patch:
diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py
--- a/sapl/comissoes/forms.py
+++ b/sapl/comissoes/forms.py
@@ -100,7 +100,7 @@ def __init__(self, user=None, **kwargs):
             exclude(id__in=id_part)
         eligible = self.verifica()
         result = list(set(qs) & set(eligible))
-        if not cmp(result, eligible):  # se igual a 0 significa que o qs e o eli são iguais!
+        if result == eligible:
             self.fields['parlamentar'].queryset = qs
         else:
             ids = [e.id for e in eligible]


Test patch:
Repository: interlegis/sapl

Issue:
Campo Observação da Reunião de Comissão limitado
Campo Observação da Reunião de Comissão limitado a 150 caracteres. Acho que poderia ser um pouco maior.

Campo Observação da Reunião de Comissão limitado
Campo Observação da Reunião de Comissão limitado a 150 caracteres. Acho que poderia ser um pouco maior.



Discussion:
Bom dia @54adal. Quantos caracteres seria o ideal? 
Acho que uns 500 caracteres. Qual tem sido o tamanho padrão dos outros campos OBS?
Bom dia @54adal. Quantos caracteres seria o ideal? 
Acho que uns 500 caracteres. Qual tem sido o tamanho padrão dos outros campos OBS?

Resolving patch:
diff --git a/sapl/comissoes/migrations/0017_auto_20180717_0827.py b/sapl/comissoes/migrations/0017_auto_20180717_0827.py
new file mode 100644
--- /dev/null
+++ b/sapl/comissoes/migrations/0017_auto_20180717_0827.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.13 on 2018-07-17 11:27
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('comissoes', '0016_auto_20180613_2121'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='reuniao',
+            name='observacao',
+            field=models.TextField(blank=True, verbose_name='Observação'),
+        ),
+    ]
diff --git a/sapl/comissoes/models.py b/sapl/comissoes/models.py
--- a/sapl/comissoes/models.py
+++ b/sapl/comissoes/models.py
@@ -223,7 +223,7 @@ class Reuniao(models.Model):
     local_reuniao = models.CharField(
         max_length=100, blank=True, verbose_name=_('Local da Reunião'))
     observacao = models.TextField(
-        max_length=150, blank=True, verbose_name=_('Observação'))
+        blank=True, verbose_name=_('Observação'))
     url_audio = models.URLField(
         max_length=150, blank=True,
         verbose_name=_('URL do Arquivo de Áudio (Formatos MP3 / AAC)'))


Test patch:
Repository: interlegis/sapl

Issue:
Bloquear edição do número de protocolo de matéria legislativa



Discussion:

Resolving patch:
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -186,6 +186,7 @@ def __init__(self, *args, **kwargs):
                                                         widget=forms.HiddenInput())
             self.fields['autor'] = forms.CharField(required=False,
                                                    widget=forms.HiddenInput())
+            self.fields['numero_protocolo'].widget.attrs['readonly'] = True
 
     def clean(self):
         super(MateriaLegislativaForm, self).clean()
@@ -213,11 +214,16 @@ def clean(self):
                 exist_doc = DocumentoAdministrativo.objects.filter(
                                                         protocolo_id=protocolo,
                                                         ano=ano).exists()
+
                 if exist_materia or exist_doc:
                     raise ValidationError(_('Protocolo %s/%s ja possui'
                                             ' documento vinculado'
                                              % (protocolo, ano)))
 
+                p = Protocolo.objects.get(numero=protocolo,ano=ano)
+                if p.tipo_materia != cleaned_data['tipo']:
+                    raise ValidationError(_('Tipo do Protocolo deve ser o mesmo do Tipo Matéria'))
+
         if data_apresentacao.year != ano:
             raise ValidationError(_("O ano da matéria não pode ser "
                                   "diferente do ano na data de apresentação"))


Test patch: