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

Issue:
NÚMERO DA PROPOSIÇÃO
Sugiro indicar o número da proposição a ser criada quando for enviar a proposição pelo SAPL. Exemplo: Tipo de Matéria Legislativa: Requerimento (aparecer o número da matéria a ser incorporada). 


Discussion:
Sua sugestão é para indicar o futuro número que a matéria legislativa a ser criada a partir daquela proposição terá (ex: a proposição 30/2018 vai gerar a indicação 5 de 2018) ou para indicar o número da proposição (ex: foto a seguir)?
![image](https://user-images.githubusercontent.com/19825887/37529268-7957bd1c-2915-11e8-800c-6695746a1b8e.png)


Resolving patch:
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -699,6 +699,12 @@ 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)))
 
                 elif action == 'return':
                     if not p.data_envio:


Test patch:
Repository: interlegis/sapl

Issue:
Protocolo Geral
Acrescentar em tipo de protocolo, o protocolo INTERNO, além dos existentes: Recebido, Enviado ...


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
@@ -22,8 +22,8 @@
                      Protocolo, TipoDocumentoAdministrativo,
                      TramitacaoAdministrativo)
 
-TIPOS_PROTOCOLO = [('0', 'Recebido'), ('1', 'Enviado'), ('', 'Ambos')]
-TIPOS_PROTOCOLO_CREATE = [('0', 'Recebido'), ('1', 'Enviado')]
+TIPOS_PROTOCOLO = [('0', 'Recebido'), ('1', 'Enviado'), ('2', 'Interno'), ('', 'Todos')]
+TIPOS_PROTOCOLO_CREATE = [('0', 'Recebido'), ('1', 'Enviado'), ('2', 'Interno')]
 
 NATUREZA_PROCESSO = [('', 'Ambos'),
                      ('0', 'Administrativo'),


Test patch:
Repository: interlegis/sapl

Issue:
Cargo de Comissão - permite atribuir cargo indicado como único para mais de um membro
Não deve permitir atribuir o mesmo cargo assinalado como único para mais de um membro da comissão. O cargo deve estar vago.


Discussion:

Resolving patch:
diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py
--- a/sapl/comissoes/forms.py
+++ b/sapl/comissoes/forms.py
@@ -18,6 +18,7 @@ class ParticipacaoCreateForm(forms.ModelForm):
 
     class Meta:
         model = Participacao
+        fields = '__all__'
         exclude = ['composicao']
 
     def __init__(self, user=None, **kwargs):
@@ -51,6 +52,21 @@ def __init__(self, user=None, **kwargs):
             qs = Parlamentar.objects.filter(id__in=ids)
             self.fields['parlamentar'].queryset = qs
 
+
+    def clean(self):
+        cleaned_data = super(ParticipacaoCreateForm, self).clean()
+
+        if not self.is_valid():
+            return cleaned_data
+
+        composicao = Composicao.objects.get(id=self.initial['parent_pk'])
+        cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]
+
+        if cleaned_data['cargo'].nome in cargos_unicos:
+            msg = _('Este cargo é único para esta Comissão.')
+            raise ValidationError(msg)
+
+
     def create_participacao(self):
         composicao = Composicao.objects.get(id=self.initial['parent_pk'])
         data_inicio_comissao = composicao.periodo.data_inicio


Test patch:
Repository: interlegis/sapl

Issue:
Atualização do Expediente Diversos não retorna mensagem
A função de atualização dessa função não está retornando mensagem de conclusão da operação. Causa interrupção da página. No entanto, após reiniciar o sapl e consultar o Expediente Diversos, verifica-se que os dados foram atualizados.


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
@@ -1444,22 +1444,24 @@ def post(self, request, *args, **kwargs):
             list_conteudo = request.POST.getlist('conteudo')
 
             for tipo, conteudo in zip(list_tipo, list_conteudo):
-                try:
-                    ExpedienteSessao.objects.get(
-                        sessao_plenaria_id=self.object.id,
-                        tipo_id=tipo
-                    ).delete()
-                except:
-                    pass
+
+                ExpedienteSessao.objects.filter(
+                      sessao_plenaria_id=self.object.id,
+                      tipo_id=tipo).delete()
 
                 expediente = ExpedienteSessao()
                 expediente.sessao_plenaria_id = self.object.id
                 expediente.tipo_id = tipo
                 expediente.conteudo = conteudo
                 expediente.save()
+
+                msg = _('Registro salvo com sucesso')
+                messages.add_message(self.request, messages.SUCCESS, msg)
             return self.form_valid(form)
         else:
-            return self.form_valid(form)
+            msg = _('Erro ao salvar registro')
+            messages.add_message(self.request, messages.SUCCESS, msg)
+            return self.form_invalid(form)
 
     def get(self, request, *args, **kwargs):
         self.object = self.get_object()


Test patch:
Repository: interlegis/sapl

Issue:
Protocolo de Documento ou Matéria em duplicidade
Informar ao usuário que está sendo feito o protocolo de matéria ou documento mais de uma vez; e, solicitar confirmação se é isso de fato que deseja efetivar.


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
@@ -638,6 +638,14 @@ def clean(self):
 
         numero_protocolo = self.data['numero_protocolo']
         ano_protocolo = self.data['ano_protocolo']
+        numero_documento = self.cleaned_data['numero']
+        tipo_documento = self.data['tipo']
+
+        documento = DocumentoAdministrativo.objects.filter(numero=numero_documento,
+                                               tipo=tipo_documento)
+
+        if documento:
+            raise ValidationError('Documento já existente')
 
         # campos opcionais, mas que se informados devem ser válidos
         if numero_protocolo and ano_protocolo:


Test patch:
Repository: interlegis/sapl

Issue:
ESCOLHER AUTOR NA PRIMEIRA TELA
Sugiro que o cadastro da Matéria Legislativa tenha ao mesmo tempo (que foi um grande avanço no Sapl 3.0) a escolha do autor. Essa medida vai economizar muito trabalho dos operadores!


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
@@ -30,7 +30,7 @@
                                     STATUS_TA_PRIVATE)
 from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column,
                                       to_row)
-from sapl.materia.models import (AssuntoMateria, MateriaAssunto,
+from sapl.materia.models import (AssuntoMateria, Autoria, MateriaAssunto,
                                  MateriaLegislativa, Orgao, RegimeTramitacao,
                                  TipoDocumento, TipoProposicao)
 from sapl.norma.models import (LegislacaoCitada, NormaJuridica,
@@ -162,6 +162,11 @@ def clean(self):
 
 class MateriaLegislativaForm(ModelForm):
 
+    autor = forms.ModelChoiceField(required=False,
+                                   empty_label='------',
+                                   queryset=Autor.objects.all()
+                                   )
+
     class Meta:
         model = MateriaLegislativa
         exclude = ['texto_articulado', 'autores', 'proposicao',
@@ -193,6 +198,18 @@ def clean(self):
 
         return cleaned_data
 
+    def save(self, commit=False):
+        materia = super(MateriaLegislativaForm, self).save(commit)
+        materia.save()
+
+        if self.cleaned_data['autor']:
+            autoria = Autoria()
+            autoria.primeiro_autor = True
+            autoria.materia = materia
+            autoria.autor = self.cleaned_data['autor']
+            autoria.save()
+
+        return materia
 
 class UnidadeTramitacaoForm(ModelForm):
 


Test patch:
Repository: interlegis/sapl

Issue:
Participante de Comissão - data de desligamento
a data de desligamento deve ser posterior à data da designação.


Discussion:

Resolving patch:
diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py
--- a/sapl/comissoes/forms.py
+++ b/sapl/comissoes/forms.py
@@ -65,8 +65,9 @@ def __init__(self, user=None, **kwargs):
         parlamentares = Mandato.objects.filter(qs,
                                                parlamentar__ativo=True
                                                ).prefetch_related('parlamentar').\
-            values_list('parlamentar',
-                        flat=True).distinct()
+                                                values_list('parlamentar',
+                                                            flat=True
+                                                            ).distinct()
 
         qs = Parlamentar.objects.filter(id__in=parlamentares).distinct().\
             exclude(id__in=id_part)
@@ -86,12 +87,21 @@ def clean(self):
         if not self.is_valid():
             return cleaned_data
 
+        data_designacao = cleaned_data['data_designacao']
+        data_desligamento = cleaned_data['data_desligamento']
+
+        if data_desligamento and \
+           data_designacao > data_desligamento:
+            raise ValidationError(_('Data de designação não pode ser superior '
+                                  'à data de desligamento'))
+
         composicao = Composicao.objects.get(id=self.initial['parent_pk'])
         cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]
 
         if cleaned_data['cargo'].nome in cargos_unicos:
             msg = _('Este cargo é único para esta Comissão.')
             raise ValidationError(msg)
+        return cleaned_data
 
 
     def create_participacao(self):
@@ -154,6 +164,31 @@ def __init__(self, user=None, **kwargs):
             id=self.initial['parlamentar']).nome_parlamentar
         self.fields['nome_parlamentar'].widget.attrs['disabled'] = 'disabled'
 
+    def clean(self):
+        cleaned_data = super(ParticipacaoEditForm, self).clean()
+
+        if not self.is_valid():
+            return cleaned_data
+
+        data_designacao = cleaned_data['data_designacao']
+        data_desligamento = cleaned_data['data_desligamento']
+
+        if data_desligamento and \
+           data_designacao > data_desligamento:
+            raise ValidationError(_('Data de designação não pode ser superior '
+                                  'à data de desligamento'))
+
+        composicao_id = self.instance.composicao_id
+
+        composicao = Composicao.objects.get(id=composicao_id)
+        cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]
+
+        if cleaned_data['cargo'].nome in cargos_unicos:
+            msg = _('Este cargo é único para esta Comissão.')
+            raise ValidationError(msg)
+
+        return cleaned_data
+
 
 class ComissaoForm(forms.ModelForm):
 


Test patch:
Repository: interlegis/sapl

Issue:
Comissão - Período de Composição
A data fim do período deve ser posterior à data de início do período.


Discussion:

Resolving patch:
diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py
--- a/sapl/comissoes/forms.py
+++ b/sapl/comissoes/forms.py
@@ -8,7 +8,7 @@
 
 from sapl.base.models import Autor, TipoAutor
 from sapl.comissoes.models import (Comissao, Composicao, DocumentoAcessorio,
-                                   Participacao, Reuniao)
+                                   Participacao, Reuniao, Periodo)
 from sapl.parlamentares.models import Legislatura, Mandato, Parlamentar
 
 class ComposicaoForm(forms.ModelForm):
@@ -39,6 +39,22 @@ def clean(self):
 
         return cleaned_data
 
+class PeriodoForm(forms.ModelForm):
+
+    class Meta:
+        model = Periodo
+        exclude = []
+
+    def clean(self):
+        cleaned_data = super(PeriodoForm, self).clean()
+        data_inicio = cleaned_data['data_inicio']
+        data_fim = cleaned_data['data_fim']
+
+        if data_fim and data_fim < data_inicio:
+            raise ValidationError('Data início não pode ser superior a data de fim')
+        return cleaned_data
+
+
 class ParticipacaoCreateForm(forms.ModelForm):
 
     parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())
diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py
--- a/sapl/comissoes/views.py
+++ b/sapl/comissoes/views.py
@@ -13,9 +13,9 @@
 from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud,
                            CrudAux, MasterDetailCrud,
                            PermissionRequiredForAppCrudMixin)
-from sapl.comissoes.forms import (ComissaoForm,ComposicaoForm, DocumentoAcessorioCreateForm,
+from sapl.comissoes.forms import (ComissaoForm, ComposicaoForm, DocumentoAcessorioCreateForm,
                                   DocumentoAcessorioEditForm, ParticipacaoCreateForm,
-                                  ParticipacaoEditForm, ReuniaoForm)
+                                  ParticipacaoEditForm, ReuniaoForm, PeriodoForm)
 from sapl.materia.models import MateriaLegislativa, Tramitacao
 
 
@@ -37,12 +37,19 @@ def pegar_url_reuniao(pk):
     return url
 
 CargoCrud = CrudAux.build(CargoComissao, 'cargo_comissao')
-PeriodoComposicaoCrud = CrudAux.build(Periodo, 'periodo_composicao_comissao')
 
 TipoComissaoCrud = CrudAux.build(
     TipoComissao, 'tipo_comissao', list_field_names=[
         'sigla', 'nome', 'natureza', 'dispositivo_regimental'])
 
+class PeriodoComposicaoCrud(CrudAux):
+    model = Periodo
+
+    class CreateView(CrudAux.CreateView):
+        form_class = PeriodoForm
+
+    class UpdateView(CrudAux.UpdateView):
+        form_class = PeriodoForm
 
 class ParticipacaoCrud(MasterDetailCrud):
     model = Participacao


Test patch:
Repository: interlegis/sapl

Issue:
Sugestão para a tela de Adição de Proposições
Apenas para alertar o autor/operador quando for preencher a tela **Adicionar Proposição**, sugiro a criação de um boxe para chamar a atenção da opção  **Vincular à Matéria Legislativa Existente**, conforme ilustração a seguir. Percebemos que muitos inadivertidamente preenchem estes campos, ocasionando erros, caso a matéria não exista!
![image](https://user-images.githubusercontent.com/30807716/38200724-d0f9b832-366b-11e8-8236-0fe91009aedb.png)



Discussion:
@marimendes Eu não sei se dá pra colocar esse frame vermelho mesmo porque essa tela é criada automaticamente, ou se não seria melhor a gente fazer como em outras telas e separar esses campos em uma seção abaixo, colocando-os mais embaixo conforme outras telas do sistema, tipo assim: https://github.com/interlegis/sapl/blob/master/sapl/templates/materia/layouts.yaml#L28
Sem problemas.. Acho que resolve da mesma forma! O importante é destacá-la de alguma forma para não confundir o autor/operador na hora de preenchê-lo!!

Resolving patch:
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -1177,13 +1177,7 @@ def __init__(self, *args, **kwargs):
 
         fields = [
             to_column((Fieldset(
-                TipoProposicao._meta.verbose_name, Field('tipo')), 3)),
-            Fieldset(_('Vincular a Matéria Legislativa Existente'),
-                     to_column(('tipo_materia', 4)),
-                     to_column(('numero_materia', 4)),
-                     to_column(('ano_materia', 4))
-                     ),
-
+                TipoProposicao._meta.verbose_name, Field('tipo')), 12)),
             to_column(
                 (Alert('teste',
                        css_class="ementa_materia hidden alert-info",
@@ -1199,6 +1193,12 @@ def __init__(self, *args, **kwargs):
         fields.append(to_column((
             'texto_original', 7 if self.texto_articulado_proposicao else 12)))
 
+        fields.append(to_column((Fieldset(_('Outras informações - Vincular a Matéria Legislativa Existente'),
+                     to_column(('tipo_materia', 12)),
+                     to_column(('numero_materia', 6)),
+                     to_column(('ano_materia', 6))
+                     ), 12)),
+                     )
         self.helper = FormHelper()
         self.helper.layout = SaplFormLayout(*fields)
 


Test patch:
Repository: interlegis/sapl

Issue:
Ajustar data e hora no painel do votante e evitar constante recarregamento da página
"No painel do votante, do mesmo modo, constam a hora e a data que foram cadastradas na abertura. Sugiro alterar para a ordem (data e hora), como no painel principal, da abertura como sendo "previstas", e indicar também a data e hora correntes, as quais deverão prevalecer como sendo as de votação." (tirado da issue #1810 )

Refatorar a maneira como o painel do votante verifica se a votação ainda está aberta ou não.


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
@@ -84,6 +84,7 @@ def votacao_aberta(request):
 
 def votante_view(request):
     # Pega o votante relacionado ao usuário
+    template_name = 'painel/voto_nominal.html'
     try:
         votante = Votante.objects.get(user=request.user)
     except ObjectDoesNotExist:
@@ -220,7 +221,7 @@ def votante_view(request):
         return HttpResponseRedirect(
             reverse('sapl.painel:voto_individual'))
 
-    return render(request, 'painel/voto_nominal.html', context)
+    return render(request, template_name, context)
 
 
 @user_passes_test(check_permission)


Test patch:
Repository: interlegis/sapl

Issue:
Impedir que votação cancelada ou não aberta de matéria seja acessada por meio da URL
Atualmente é possível, ao ter a URL da página de registro de votação de uma matéria, acessar a página de registro de votos mesmo que a votação tenha sido cancelada ou ainda não tenha sido aberta.


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
@@ -1737,6 +1737,12 @@ def get(self, request, *args, **kwargs):
 
             materia_votacao = ordem
 
+            if not ordem.votacao_aberta:
+                msg = _('A votação para esta matéria encontra-se fechada!')
+                messages.add_message(request, messages.ERROR, msg)
+                return HttpResponseRedirect(reverse(
+                    'sapl.sessao:ordemdia_list', kwargs={'pk': kwargs['pk']}))
+
         elif self.expediente:
             expediente_id = kwargs['oid']
             if (RegistroVotacao.objects.filter(
@@ -1758,6 +1764,13 @@ def get(self, request, *args, **kwargs):
 
             materia_votacao = expediente
 
+            if not expediente.votacao_aberta:
+                msg = _('A votação para esta matéria encontra-se fechada!')
+                messages.add_message(request, messages.ERROR, msg)
+                return HttpResponseRedirect(reverse(
+                    'sapl.sessao:expedientemateria_list',
+                    kwargs={'pk': kwargs['pk']}))
+
         materia = {'materia': materia_votacao.materia,
                    'ementa': sub(
                        '&nbsp;', ' ', strip_tags(


Test patch:
Repository: interlegis/sapl

Issue:
Adicionar django-speedinfo ao SAPL



Discussion:

Resolving patch:
diff --git a/sapl/settings.py b/sapl/settings.py
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -88,6 +88,7 @@
     'rest_framework',
     'reversion',
     'whoosh',
+    'speedinfo',
 
 ) + SAPL_APPS
 
@@ -126,8 +127,16 @@
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'django.middleware.security.SecurityMiddleware',
+    'speedinfo.middleware.ProfilerMiddleware',
 )
 
+CACHES = {
+    'default': {
+        'BACKEND': 'speedinfo.backends.proxy_cache',
+        'CACHE_BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
+        'LOCATION': '/var/tmp/django_cache',
+    }
+}
 
 REST_FRAMEWORK = {
     "UNICODE_JSON": False,


Test patch:
Repository: interlegis/sapl

Issue:
Etiquetas
No SAPL 2.5 quando era feito um protocolo, a etiqueta com código de barras registrava além do numero do protocolo, também a ementa e o numero da matéria criada. Não temos como trazer essa facilidade para o nosso 3.1, isso viria a facilitar o controle das matérias enviadas pelo protocolo de proposições.

Aguardo boas notícias.


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
@@ -96,7 +96,11 @@ def protocolos(lst_protocolos, dic_cabecalho):
             tmp_data += '\t\t<para style="P2"><b>' + \
                 dic['data'] + '</b></para>\n'
         tmp_data += '\t\t<para style="P2"><b>' + \
-            dic['natureza'] + '</b></para>\n'
+            dic['natureza']
+        if dic['ident_processo']:
+            tmp_data +=  ' - ' + dic['ident_processo'] + '</b></para>\n'
+        else:
+            tmp_data += '</b></para>\n'
 
     tmp_data += '\t</story>\n'
     return tmp_data
diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -955,10 +955,7 @@ def get_etiqueta_protocolos(prots):
         if p.tipo_processo == 0:
             dic['natureza'] = 'Administrativo'
         if p.tipo_processo == 1:
-            if dic['num_materia']:
-                dic['natureza'] = dic['num_materia']
-            else:
-                dic['natureza'] = 'Legislativo'
+            dic['natureza'] = 'Legislativo'
 
         dic['num_documento'] = ''
         for documento in DocumentoAdministrativo.objects.filter(


Test patch:
Repository: interlegis/sapl

Issue:
Pdf do resumo da sessão: dados de encerramento
Separar os dados de encerramento por hífen.
![captura de tela de 2018-04-10 09-29-39](https://user-images.githubusercontent.com/19169882/38557029-166ad702-3ca2-11e8-9864-96a3412f8c15.png)



Discussion:

Resolving patch:
diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
--- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
+++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
@@ -120,7 +120,7 @@ def inf_basicas(inf_basicas_dic):
     data_fim_sessao = dat_fim_sessao + ' <b>- </b> ' if dat_fim_sessao else ''
 
     tmp += '\t\t<para style="P2" spaceAfter="5"><b>Encerramento: </b> ' + \
-        dat_fim_sessao + hr_fim_sessao + '</para>\n'
+        dat_fim_sessao +  ' <b>- </b> ' + hr_fim_sessao + '</para>\n'
 
     return tmp
 


Test patch: