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

Issue:
Criar codigo de barras para número do documento (proposição)
Sugestão (Câmara de Joinville SC)
Criar código de barras do número do Documento (proposição) aos moldes do número do protocolo, para facilitar a recepção/incorporação do documento pelo Operador de Protocolo.

Justificativa:
O código é muito grande/complexo para ser digitado pelo operador no campo Código do documento, caso o mesmo não possa copiar/colar, por exemplo.
Fazendo a recepção com um leitor ótico, além de aumentar a velocidade da recepção, inibiria o erro de digitação.


Discussion:
Curiosidade: existe algum motivo para ser código de barras ao invés de qr code?

Resolving patch:
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -826,8 +826,14 @@ def get_context_data(self, **kwargs):
             # FIXME hash para textos articulados
             _hash = 'P' + ta.hash() + '/' + str(proposicao.id)
 
+        from sapl.utils import create_barcode
+        base64_data = create_barcode(_hash, 100, 2000)
+        barcode = 'data:image/png;base64,{0}'.format(base64_data)
+
+
         context.update({'proposicao': proposicao,
-                        'hash': _hash})
+                        'hash': _hash,
+                        'barcode': barcode})
         return context
 
     def get(self, request, *args, **kwargs):
diff --git a/sapl/utils.py b/sapl/utils.py
--- a/sapl/utils.py
+++ b/sapl/utils.py
@@ -230,17 +230,17 @@ def get_base_url(request):
     return "{0}://{1}".format(protocol, current_domain)
 
 
-def create_barcode(value):
+def create_barcode(value, width=170, height=50):
     '''
         creates a base64 encoded barcode PNG image
     '''
     from base64 import b64encode
     from reportlab.graphics.barcode import createBarcodeDrawing
-
+    value_bytes = bytes(value, "ascii")
     barcode = createBarcodeDrawing('Code128',
-                                   value=value,
-                                   barWidth=170,
-                                   height=50,
+                                   value=value_bytes,
+                                   barWidth=width,
+                                   height=height,
                                    fontSize=2,
                                    humanReadable=True)
     data = b64encode(barcode.asString('png'))


Test patch:
Repository: interlegis/sapl

Issue:
Painel de Votação - não mostrar campo oradores caso não exista nenhum
Quando não houver nenhum orador registrado, no painel de votação não mostrar o título "ORADORES".


Discussion:

Resolving patch:
diff --git a/sapl/painel/views.py b/sapl/painel/views.py
--- a/sapl/painel/views.py
+++ b/sapl/painel/views.py
@@ -346,8 +346,7 @@ def get_presentes(pk, response, materia):
             'tipo_resultado': materia.resultado,
             'observacao_materia': materia.observacao,
             'tipo_votacao': tipo_votacao,
-            'materia_legislativa_texto': str(materia.materia),
-            'oradores': oradores_list
+            'materia_legislativa_texto': str(materia.materia)
         })
 
     presentes_list = sort_lista_chave(presentes_list, 'nome')
@@ -355,6 +354,7 @@ def get_presentes(pk, response, materia):
     response.update({
         'presentes': presentes_list,
         'num_presentes': num_presentes,
+        'oradores': oradores_list,
         'msg_painel': str(_('Votação aberta!')),
     })
 


Test patch:
Repository: interlegis/sapl

Issue:
Painel de Votação
1  -Quando aberto o painel, sem abrir nenhuma matéria para votação, palavras são cortadas na esquerda
![image](https://user-images.githubusercontent.com/13314947/35215830-ad887ca4-ff4c-11e7-912d-84afa94749b3.png)

2 - É criada uma barra de rolagem horizontal que fica sempre, independente dos dados exibidos em tela

3 - Quando "Não votou" é quebrada linha e a visualização fica confusa
![image](https://user-images.githubusercontent.com/13314947/35216014-4e4dca04-ff4d-11e7-985b-55cab354b4fa.png)

 4 -  Oradores. A ideia seria exibir os oradores do expediente ? , mas e quando a matéria a ser votada é da ordem do dia que não existe a possibilidade de cadastrar oradores para a ordem do dia ? . Penso que talvez seria o caso de tirar oradores do painel.

5 - Barra de rolagem vertical. Ocorre que quando a ementa tem 3 linhas ou mais. O problema disso é ter que ficar escolhendo o que do painel vai ficar em tela. Penso que o painel deveria ter tamanho fixo e os textos serem truncados ao atingir o tamanho máximo.



Discussion:
Boa tarde,
Eu não consegui replicar na minha máquina os problemas descritos nos itens 1, 2, 3 e 5. Qual a versão do SAPL que você está usando (se possível indicar o commit)? Qual  browser e sistema operacional utilizados?
Para tratar o item 4, eu criei a issue #1676.
Olá. 
Windows 64
Firefox 58.0
sapl - 73a3b1a Troca integração do py.test com ipdb pelo pdb++

Obrigado
Chrome Versão 63.0.3239.132 (Versão oficial) 64 bits ocorre o mesmo

Resolving patch:
diff --git a/sapl/painel/views.py b/sapl/painel/views.py
--- a/sapl/painel/views.py
+++ b/sapl/painel/views.py
@@ -1,3 +1,4 @@
+import html
 import json
 
 from django.contrib import messages
@@ -344,7 +345,7 @@ def get_presentes(pk, response, materia):
 
         response.update({
             'tipo_resultado': materia.resultado,
-            'observacao_materia': materia.observacao,
+            'observacao_materia': html.unescape(materia.observacao),
             'tipo_votacao': tipo_votacao,
             'materia_legislativa_texto': str(materia.materia)
         })


Test patch:
Repository: interlegis/sapl

Issue:
Expedição do Diploma obrigatoria
No cadastro de mandato, a data de expedição de diploma é uma informação obrigatória. Para cadastro de legislatura passada obriga os operadores a cadastrar uma data qualquer para poder adicionar o mandato, já que em muitos casos, não é possível localizar a data correta.
Data de Expedição do Diploma tem mesmo a necessidade de ser obrigatória?


Discussion:
Particularmente, sou contra tirar a obrigatoriedade de campos, a não ser que tenha uma razão técnica suficientemente forte como uma mudança na modelagem de dados que afete esse campo. Mas vamos ver o que o restante do pessoal acha, ok?


Claro !
@andreagudo @LeandroRoberto 
em caso de registros históricos é bem complicado... veja... identificar datas de expedição de diploma de vereadores de todas as minhas 19 legislaturas... vai ser colocado qualquer data messssmo.
Tentei imaginar casos em que ter data de diplomação seria interessante, mas não encontrei nenhum. Como agora data inicio de mandato é obrigatório, podemos remover a obrigatóriedade de campo. Vamos fazer isso.

Resolving patch:
diff --git a/sapl/parlamentares/migrations/0018_auto_20180215_1015.py b/sapl/parlamentares/migrations/0018_auto_20180215_1015.py
new file mode 100644
--- /dev/null
+++ b/sapl/parlamentares/migrations/0018_auto_20180215_1015.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2018-02-15 12:15
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('parlamentares', '0017_auto_20180202_1528'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='mandato',
+            name='data_expedicao_diploma',
+            field=models.DateField(blank=True, null=True, verbose_name='Expedição do Diploma'),
+        ),
+    ]
diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py
--- a/sapl/parlamentares/models.py
+++ b/sapl/parlamentares/models.py
@@ -435,8 +435,9 @@ class Mandato(models.Model):
                                         null=True)
     votos_recebidos = models.PositiveIntegerField(
         blank=True, null=True, verbose_name=_('Votos Recebidos (Mandato)'))
-    data_expedicao_diploma = models.DateField(
-        verbose_name=_('Expedição do Diploma'))
+    data_expedicao_diploma = models.DateField(blank=True,
+                                              null=True,
+                                              verbose_name=_('Expedição do Diploma'))
     titular = models.BooleanField(
         db_index=True,
         default=True,


Test patch:
Repository: interlegis/sapl

Issue:
Erro em registrar votação
Via usuário Roseno Serra, CMCC - Capão da Canoa - RS

"Na Sessão Plenária quando vamos abrir a matéria para votação, muitas vezes ao clicar no botão ABRIR VOTAÇÃO ou REGISTRAR VOTAÇÃO a auto ordenação se movimenta e não abre a próxima etapa, muitas vezes temos que clicar várias vezes para cumprir a tarefa. E quando estivermos operando o painel, certamente pode causar um atraso para abrir a matéria."
Registro de votação duplicado
Via usuário Roseno Serra, CMCC - Capão da Canoa - RS

"Em alguns momentos quando vamos registrar a votação, é duplicado o registro na "tabela sessão.registrovotação", ocorrendo um erro. Só é resolvido acessando o banco de dados e deletando o registro duplicado."



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
@@ -432,9 +432,11 @@ def get_rows(self, object_list):
 
                         if self.request.user.has_module_perms(AppConfig.label):
                             btn_registrar = '''
-                                <a href="%s" class="btn btn-primary"
-                                   role="button">
-                                   Registrar Votação</a>''' % (url)
+                                <form action="%s">
+                                    <input type="submit" class="btn btn-primary"
+                                     value="Registrar Votação" />
+                                </form>
+                                ''' % (url)
                             obj.resultado = btn_registrar
                     else:
                         url = reverse('sapl.sessao:abrir_votacao', kwargs={


Test patch:
Repository: interlegis/sapl

Issue:
Hora proposição
Hora errada na listagem das proposições do autor
![image](https://user-images.githubusercontent.com/13314947/36436594-7b94c596-1643-11e8-827a-b3e0293a6337.png)


**Nos demais está correta**

![image](https://user-images.githubusercontent.com/13314947/36436617-8d939844-1643-11e8-9794-e6aa76018b2a.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
@@ -815,14 +815,14 @@ def get_rows(self, object_list):
                     obj.data_recebimento = 'Não recebida'\
                         if obj.data_envio else 'Não enviada'
                 else:
-                    obj.data_recebimento = formats.date_format(
-                        obj.data_recebimento, "DATETIME_FORMAT")
-
+                    obj.data_recebimento = timezone.localtime(obj.data_recebimento)
+                    obj.data_recebimento = obj.data_recebimento = formats.date_format(obj.data_recebimento, "DATETIME_FORMAT")
                 if obj.data_envio is None:
                     obj.data_envio = 'Em elaboração...'
                 else:
-                    obj.data_envio = formats.date_format(
-                        obj.data_envio, "DATETIME_FORMAT")
+
+                    obj.data_envio = timezone.localtime(obj.data_envio)
+                    obj.data_envio = formats.date_format(obj.data_envio, "DATETIME_FORMAT")
 
             return [self._as_row(obj) for obj in object_list]
 


Test patch:
Repository: interlegis/sapl

Issue:
Preencher datas de início de mandato vazias



Discussion:

Resolving patch:
diff --git a/sapl/parlamentares/migrations/0020_fix_inicio_mandato.py b/sapl/parlamentares/migrations/0020_fix_inicio_mandato.py
new file mode 100644
--- /dev/null
+++ b/sapl/parlamentares/migrations/0020_fix_inicio_mandato.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+
+from django.db import migrations
+
+def popula_campo_data_inicio(apps, schema_editor):
+    Mandato = apps.get_model("parlamentares", "Mandato")
+    mandatos = Mandato.objects.all()
+
+    for m in mandatos:
+        if m.data_inicio_mandato == None:
+            m.data_inicio_mandato = m.legislatura.data_inicio
+            m.save()
+
+
+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', '0019_auto_20180221_1155'),
+    ]
+
+    operations = [
+        migrations.RunPython(popula_campo_data_inicio),
+    ]
\ No newline at end of file


Test patch:
Repository: interlegis/sapl

Issue:
Remover acesso ao model TipoAutor da interface admin
O usuário admin (via https://endereco/admin ) tem acesso a todos os models. Ao menos um usuário usou isso para alterar o model de TipoAutor e daí várias telas do SAPL começaram a dar pau. Esta tela é fundamental para várias partes do sistema e não pode ser modificada assim. Nós já não permitimos fazer isso via interface do SAPL, mas devemos ver isso com a tela de admin.

Veja em materias/admin.py onde isso foi feito com o objetivo de de não deixar ninguem usar Proposicao.
Remover acesso ao model TipoAutor da interface admin
O usuário admin (via https://endereco/admin ) tem acesso a todos os models. Ao menos um usuário usou isso para alterar o model de TipoAutor e daí várias telas do SAPL começaram a dar pau. Esta tela é fundamental para várias partes do sistema e não pode ser modificada assim. Nós já não permitimos fazer isso via interface do SAPL, mas devemos ver isso com a tela de admin.

Veja em materias/admin.py onde isso foi feito com o objetivo de de não deixar ninguem usar Proposicao.


Discussion:

Resolving patch:
diff --git a/sapl/materia/admin.py b/sapl/materia/admin.py
--- a/sapl/materia/admin.py
+++ b/sapl/materia/admin.py
@@ -1,5 +1,11 @@
 from django.contrib import admin
-from sapl.materia.models import Proposicao
+from sapl.materia.models import Proposicao, TipoMateriaLegislativa
+from sapl.base.models import TipoAutor
+from sapl.comissoes.models import TipoComissao
+from sapl.parlamentares.models import TipoAfastamento, SituacaoMilitar, TipoDependente
+from sapl.norma.models import TipoNormaJuridica, TipoVinculoNormaJuridica
+from sapl.sessao.models import TipoSessaoPlenaria, TipoExpediente, TipoResultadoVotacao
+from sapl.protocoloadm.models import TipoDocumentoAdministrativo
 from sapl.settings import DEBUG
 from sapl.utils import register_all_models_in_admin
 
@@ -8,8 +14,14 @@
 if not DEBUG:
 
     admin.site.unregister(Proposicao)
+    admin.site.unregister(TipoAutor)
+    admin.site.unregister(TipoComissao)
+    admin.site.unregister(TipoAfastamento)
+    admin.site.unregister(SituacaoMilitar)
+    admin.site.unregister(TipoDependente)
 
-    class ProposicaoAdmin(admin.ModelAdmin):
+
+    class RestricaoAdmin(admin.ModelAdmin):
 
         def has_add_permission(self, request, obj=None):
             return False
@@ -20,4 +32,10 @@ def has_change_permission(self, request, obj=None):
         def has_delete_permission(self, request, obj=None):
             return False
 
-    admin.site.register(Proposicao, ProposicaoAdmin)
+
+    admin.site.register(Proposicao, RestricaoAdmin)
+    admin.site.register(TipoAutor, RestricaoAdmin)
+    admin.site.register(TipoComissao, RestricaoAdmin)
+    admin.site.register(TipoAfastamento, RestricaoAdmin)
+    admin.site.register(SituacaoMilitar, RestricaoAdmin)
+    admin.site.register(TipoDependente, RestricaoAdmin)


Test patch:
Repository: interlegis/sapl

Issue:
Formatar mudança de linha nos campos text do crud
As mudanças de linha `\n` dos campos TextField, ao que parece, estão sendo exibidas nas telas de leitura do crud.

Por exemplo no campo `observacao` de `DocumentoAdministrativo`.


Discussion:
Como assim? Pra aparecer na tela teria que ser um `<br/>`, não? Eu e a @tapumar testamos aqui e parece que renderiza sem a quebra como visto na figura. Vc quer que o \n seja retirado? Ou substituido por um <br>?

![image](https://user-images.githubusercontent.com/9326037/36745220-95f3a828-1bcd-11e8-89de-3b405c303f0e.png)

Eu acho que deveria trocar `\n` por algo como `<br/>`, ou usar algum estilo
tipo `<pre>` (se é que existe isso) ou usar o `<pre>`. Não sei realmente
qual a melhor solução.

2018-02-27 14:50 GMT-03:00 Edward <notifications@github.com>:

> Como assim? Pra aparecer na tela teria que ser um <br/>, não? Eu e a
> @tapumar <https://github.com/tapumar> testamos aqui e parece que
> renderiza sem a quebra como visto na figura. Vc quer que o \n seja
> retirado? Ou substituido por um
> ?
>
> [image: image]
> <https://user-images.githubusercontent.com/9326037/36745220-95f3a828-1bcd-11e8-89de-3b405c303f0e.png>
>
> —
> You are receiving this because you authored the thread.
> Reply to this email directly, view it on GitHub
> <https://github.com/interlegis/sapl/issues/1722#issuecomment-368966095>,
> or mute the thread
> <https://github.com/notifications/unsubscribe-auth/AAjYUWSugyZ2f8J0w1Ke-WqFPKHysErcks5tZEB4gaJpZM4SVEHc>
> .
>


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
@@ -132,6 +132,8 @@ def get_field_display(obj, fieldname):
                     value._meta.app_config.name, obj.content_type.model),
                 args=(value.id,)),
             value)
+    elif 'TextField' in str_type_from_field:
+        display = value.replace('\n', '<br/>')
     else:
         display = str(value)
     return verbose_name, display


Test patch:
Repository: interlegis/sapl

Issue:
Ao editar Parlamentar se arquivo de foto não presente causa erro
Ditto.


Discussion:

Resolving patch:
diff --git a/sapl/utils.py b/sapl/utils.py
--- a/sapl/utils.py
+++ b/sapl/utils.py
@@ -401,10 +401,12 @@ def restringe_tipos_de_arquivo(value):
         if not os.path.splitext(value.path)[1][:1]:
             raise ValidationError(_(
                 'Não é possível fazer upload de arquivos sem extensão.'))
-
-        mime = magic.from_buffer(value.read(), mime=True)
-        if mime not in lista:
-            raise ValidationError(_('Tipo de arquivo não suportado'))
+        try:
+            mime = magic.from_buffer(value.read(), mime=True)
+            if mime not in lista:
+                raise ValidationError(_('Tipo de arquivo não suportado'))
+        except FileNotFoundError:
+            raise ValidationError(_('Arquivo não encontrado'))
     # o nome é importante para as migrations
     restringe_tipos_de_arquivo.__name__ = nome
     return restringe_tipos_de_arquivo


Test patch:
Repository: interlegis/sapl

Issue:
Quantidade de matérias exibidas para adicionar em matérias expediente e ordem do dia
Gostaria de sugerir que fosse ampliada a quantidade de matérias exibidas ao realizar a busca para se adicionar várias matérias em expediente ou ordem do dia. 

Por exemplo, atualmente, ao se buscar "várias matérias" a serem incluídas na ordem do dia, o sistema exibe somente 10 (dez) matérias por página, separando as matérias totais em várias páginas. 

Assim, numa determinada pauta que conte com 63 indicações, por exemplo, se faz necessário realizar a busca, adicionar somente 10, voltar, realizar outra buscar, adicionar mais 10, e assim sucessivamente...

![captura de tela_2018-03-14_11-29-40](https://user-images.githubusercontent.com/37225107/37408643-46b2ce42-277b-11e8-86b1-bceb37730a06.png)
![captura de tela_2018-03-14_11-30-03](https://user-images.githubusercontent.com/37225107/37408645-474e9ef8-277b-11e8-9ba2-ba6d2d80b09d.png)


Obrigado.


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
@@ -1493,7 +1493,7 @@ def get(self, request, *args, **kwargs):
 class MateriaLegislativaPesquisaView(FilterView):
     model = MateriaLegislativa
     filterset_class = MateriaLegislativaFilterSet
-    paginate_by = 10
+    paginate_by = 50
 
     def get_filterset_kwargs(self, filterset_class):
         super(MateriaLegislativaPesquisaView,


Test patch:
Repository: interlegis/sapl

Issue:
Cadastrar arquivo com discurso do orador ou orador do expediente
Após cadastrar um orador para explicações pessoais / orador de expediente, não há um campo para upload do arquivo com o discurso na íntegra, somente o link para vídeo do discurso, se for o caso.
Embora seja um recurso que atualmente não vem sendo muito utilizado, temos na base do SAPL 2.5 um histórico de discursos antigos que entendo ser necessário disponibilizar também no 3.1.


Discussion:

Resolving patch:
diff --git a/sapl/sessao/migrations/0017_auto_20180316_0731.py b/sapl/sessao/migrations/0017_auto_20180316_0731.py
new file mode 100644
--- /dev/null
+++ b/sapl/sessao/migrations/0017_auto_20180316_0731.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.13 on 2018-03-16 10:31
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import sapl.sessao.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sessao', '0016_auto_20180131_1708'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='orador',
+            name='upload_anexo',
+            field=models.FileField(blank=True, null=True, upload_to=sapl.sessao.models.anexo_upload_path, verbose_name='Anexo do Orador'),
+        ),
+        migrations.AddField(
+            model_name='oradorexpediente',
+            name='upload_anexo',
+            field=models.FileField(blank=True, null=True, upload_to=sapl.sessao.models.anexo_upload_path, verbose_name='Anexo do Orador'),
+        ),
+    ]
diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py
--- a/sapl/sessao/models.py
+++ b/sapl/sessao/models.py
@@ -320,6 +320,11 @@ class AbstractOrador(models.Model):  # Oradores
         max_length=150, blank=True, verbose_name=_('URL Vídeo'))
     observacao = models.CharField(
         max_length=150, blank=True, verbose_name=_('Observação'))
+    upload_anexo = models.FileField(
+        blank=True,
+        null=True,
+        upload_to=anexo_upload_path,
+        verbose_name=_('Anexo do Orador'))
 
     class Meta:
         abstract = True


Test patch:
Repository: interlegis/sapl

Issue:
Muda Status de tramitação ao editar Matéria
Ao editar uma matéria que tem o status  "Tramitando - Não", o status é trazido como  "Tramitando - Sim"


Discussion:

Resolving patch:
diff --git a/sapl/materia/models.py b/sapl/materia/models.py
--- a/sapl/materia/models.py
+++ b/sapl/materia/models.py
@@ -187,7 +187,7 @@ class MateriaLegislativa(models.Model):
     em_tramitacao = models.BooleanField(
         verbose_name=_('Em Tramitação?'),
         default=False,
-        choices=EM_TRAMITACAO)
+        choices=YES_NO_CHOICES)
     polemica = models.NullBooleanField(
         blank=True, verbose_name=_('Matéria Polêmica?'))
     objeto = models.CharField(


Test patch: