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

Issue:
POP UP (Video, Audio)
Sugestão de melhoria

Na sessão plenária tem a opção de inserir o áudio e o vídeo "Conteúdo Multimídia", um link para os arquivos (URL Arquivo Áudio (Formatos MP3 / AAC), URL Arquivo Vídeo (Formatos MP4 / FLV / WebM)).  Na versão 2.5 ao inserir estes dados o usuário acessa o conteúdo através de uma pop-up onde tem um player para os exibir o conteúdo multimídia, já na nova versão o usuário e direcionado para o URL informado.

Gostaria que esta pop-up fosse adicionada na versão 3.1.


Discussion:

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
@@ -198,6 +198,19 @@ def url(value):
         return True
     return False
 
+@register.filter
+def audio_url(value):
+    return True if url(value) and value.endswith("mp3") else False
+
+
+@register.filter
+def video_url(value):
+    return True if url(value) and value.endswith("mp4") else False
+
+@register.filter
+def file_extension(value):
+    import pathlib
+    return pathlib.Path(value).suffix.replace('.', '')
 
 @register.filter
 def cronometro_to_seconds(value):


Test patch:
Repository: interlegis/sapl

Issue:
Otimização de recebimento de proposição
<!--- Forneça um resumo geral da _issue_ no título acima -->

## Comportamento Esperado
Permitir o rápido recebimento de proposição para bases de dados com grande número de proposições (~ 24208)

## Comportamento Atual
O sistema faz uma varredura de todas as proposições, gerando um hash baseado no conteúdo para o PDF/DOC, o que faz com que para grandes quantidades de proposições isso gere um tempo que inviabiliza a execução da rotina.

## Possível Solução
Como o código da proposição contém a PK, então recupera ela diretamente, se válida.




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
@@ -481,10 +481,13 @@ def post(self, request, *args, **kwargs):
         form = ReceberProposicaoForm(request.POST)
 
         if form.is_valid():
-            proposicoes = Proposicao.objects.filter(
-                data_envio__isnull=False, data_recebimento__isnull=True)
+            try:
+                # A ultima parte do código deve ser a pk da Proposicao
+                id = form.cleaned_data["cod_hash"].split("/")[1]
+                proposicao = Proposicao.objects.get(id=id,
+                                                    data_envio__isnull=False,
+                                                    data_recebimento__isnull=True)
 
-            for proposicao in proposicoes:
                 if proposicao.texto_articulado.exists():
                     ta = proposicao.texto_articulado.first()
                     # FIXME hash para textos articulados
@@ -492,7 +495,7 @@ def post(self, request, *args, **kwargs):
                 else:
                     hasher = gerar_hash_arquivo(
                         proposicao.texto_original.path,
-                        str(proposicao.pk)) \
+                        str(proposicao.id)) \
                         if proposicao.texto_original else None
                 if hasher == form.cleaned_data['cod_hash']:
                     return HttpResponseRedirect(
@@ -500,8 +503,12 @@ def post(self, request, *args, **kwargs):
                                 kwargs={
                                     'hash': hasher.split('/')[0][1:],
                                     'pk': proposicao.pk}))
-
-            messages.error(request, _('Proposição não encontrada!'))
+            except ObjectDoesNotExist:
+                messages.error(request, _('Proposição não encontrada!'))
+            except IndexError:
+                messages.error(request, _('Código de recibo mal formado!'))
+            except IOError:
+                messages.error(request, _('Erro abrindo texto original de proposição'))
         return self.form_invalid(form)
 
     def get_success_url(self):


Test patch:
Repository: interlegis/sapl

Issue:
Sugestões de melhorias em Audiências Públicas
<!--- Forneça um resumo geral da _issue_ no título acima -->

## Comportamento Esperado
1. Permitir anexar arquivos à uma audiência pública
2. Ao listar as audiências, colocar o hyperlink da matéria em discussão, se houver.

## Comportamento Atual
1. Não permite adicionar arquivos a uma audiência pública.
2. Na coluna de matéria tem texto simples.


Discussion:

Resolving patch:
diff --git a/sapl/audiencia/views.py b/sapl/audiencia/views.py
--- a/sapl/audiencia/views.py
+++ b/sapl/audiencia/views.py
@@ -1,4 +1,5 @@
 from django.http import HttpResponse
+from django.core.urlresolvers import reverse
 from django.views.decorators.clickjacking import xframe_options_exempt
 from django.views.generic import UpdateView
 from sapl.crud.base import RP_DETAIL, RP_LIST, Crud
@@ -23,6 +24,22 @@ class BaseMixin(Crud.BaseMixin):
     class ListView(Crud.ListView):
         paginate_by = 10
 
+        def get_context_data(self, **kwargs):
+            context = super().get_context_data(**kwargs)
+
+            audiencia_materia = {}
+            for o in context['object_list']:
+                audiencia_materia[str(o.id)] = o.materia
+
+            for row in context['rows']:
+                coluna_materia = row[3] # se mudar a ordem de listagem mudar aqui
+                if coluna_materia[0]:
+                    materia = audiencia_materia[row[0][0]]
+                    url_materia = reverse('sapl.materia:materialegislativa_detail',
+                                          kwargs={'pk': materia.id})
+                    row[3] = (coluna_materia[0], url_materia)
+            return context
+
     class CreateView(Crud.CreateView):
         form_class = AudienciaForm
 


Test patch:
Repository: interlegis/sapl

Issue:
Restrição nomes tipo de autor externo
Um problema que já foi visto várias vezes é quando os usuários criam um tipo de autor externo que possui um equivalente já criado pelo sistema. Isso desencadeia vários problemas no sistema travando diversas telas. A solução encontrada foi restringir os nomes possíveis de serem escritos na descrição.


Discussion:

Resolving patch:
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -262,6 +262,32 @@ def __init__(self, *args, **kwargs):
 
         super(TipoAutorForm, self).__init__(*args, **kwargs)
 
+    def clean(self):
+        super(TipoAutorForm, self).clean()
+
+        if not self.is_valid():
+            return self.cleaned_data
+
+        cd = self.cleaned_data
+        lista = ['comissão',
+                 'comis',
+                 'parlamentar',
+                 'bancada',
+                 'bloco',
+                 'comissao',
+                 'vereador',
+                 'órgão',
+                 'orgao',
+                 'deputado',
+                 'senador',
+                 'vereadora',
+                 'frente']
+
+        for l in lista:
+            if l in cd['descricao'].lower():
+                raise ValidationError(_('A descrição colocada não pode ser usada '
+                                        'por ser equivalente a um tipo já existente'))
+
 
 class AutorForm(ModelForm):
     senha = forms.CharField(


Test patch:
Repository: interlegis/sapl

Issue:
Tornar a exclusão de autor protegida
<!--- Forneça um resumo geral da _issue_ no título acima -->
Após abertura da issue #1589 foi feita uma mudança para que uma matéria pudesse ser excluída sem ser necessário excluir suas autorias. Também foi feita a mudança para que um autor fosse excluído sem excluir suas autorias. Foi visto que é melhor deixar esse comportamento apenas para matéria. Tornando assim a exclusão de autor protegida novamente.



Discussion:

Resolving patch:
diff --git a/sapl/materia/migrations/0032_auto_20181022_1743.py b/sapl/materia/migrations/0032_auto_20181022_1743.py
new file mode 100644
--- /dev/null
+++ b/sapl/materia/migrations/0032_auto_20181022_1743.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.13 on 2018-10-22 20:43
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('materia', '0031_auto_20180924_1724'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='autoria',
+            name='autor',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='base.Autor', verbose_name='Autor'),
+        ),
+    ]
diff --git a/sapl/materia/models.py b/sapl/materia/models.py
--- a/sapl/materia/models.py
+++ b/sapl/materia/models.py
@@ -307,7 +307,7 @@ def save(self, force_insert=False, force_update=False, using=None,
 class Autoria(models.Model):
     autor = models.ForeignKey(Autor,
                               verbose_name=_('Autor'),
-                              on_delete=models.CASCADE)
+                              on_delete=models.PROTECT)
     materia = models.ForeignKey(
         MateriaLegislativa, on_delete=models.CASCADE,
         verbose_name=_('Matéria Legislativa'))


Test patch:
Repository: interlegis/sapl

Issue:
Documento administrativo restrito
## Comportamento Esperado
Durante a pesquisa de documentos administrativos, os restritos não deveriam ser contabilizados na contagem. Isso poderá suscitar dúvidas por parte do cidadão quanto ao totalização de documentos na contagem e a quantidade efetiva de documentos que aparecem para o mesmo. 

## Comportamento Atual
Na pesquisa de documentos administrativos, os restritos são considerados na contagem geral.

## Imagens do Ocorrido
![image](https://user-images.githubusercontent.com/30807716/47430905-08941980-d771-11e8-8c3c-264b266525e6.png)


## Seu Ambiente
* Nome e versão do navegador: Chrome
* Release: 3.1.128


Discussion:

Resolving patch:
diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py
--- a/sapl/protocoloadm/views.py
+++ b/sapl/protocoloadm/views.py
@@ -771,8 +771,14 @@ def get(self, request, *args, **kwargs):
             url = ''
 
         self.filterset.form.fields['o'].label = _('Ordenação')
-
-        length = self.object_list.count()
+        
+        # é usada essa verificação anônima para quando os documentos administrativos 
+        # estão no modo ostensivo, mas podem existir documentos administrativos restritos
+        if request.user.is_anonymous():
+            length = self.object_list.filter(restrito=False).count()
+        else:
+            length = self.object_list.count()
+        
         context = self.get_context_data(filter=self.filterset,
                                         filter_url=url,
                                         numero_res=length


Test patch:
Repository: interlegis/sapl

Issue:
Edição de orador das Explicações Pessoais
## Comportamento Esperado
Deveriam aparecer na combo apenas os parlamentares ativos da legislatura correspondente.

## Comportamento Atual
Estão sendo listados todos os parlamentares.

## Passos para Reproduzir
https://sapl.agudo.rs.leg.br/sessao/orador/4429/edit

## Contexto
Edição de um dos Oradores das Explicações Pessoais.

## Imagens do Ocorrido
![captura de tela de 2018-10-23 08-59-03](https://user-images.githubusercontent.com/19169882/47359235-96550380-d6a2-11e8-8606-e01d17a2c1b9.png)

## Seu Ambiente
* Versão usada (_Release_): 3.1.127
* Nome e versão do navegador: Chromium Versão 69.0.3497.81 (Versão oficial)
* Nome e versão do Sistema Operacional (desktop ou mobile): Ubuntu 16.04 64 bits


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
@@ -572,6 +572,16 @@ def get_success_url(self):
             return reverse('sapl.sessao:orador_list',
                            kwargs={'pk': self.kwargs['pk']})
 
+    class UpdateView(MasterDetailCrud.UpdateView):
+
+        form_class = OradorForm
+
+        def get_initial(self):
+            initial = super(UpdateView, self).get_initial()
+            initial.update({'id_sessao': self.object.sessao_plenaria.id})
+
+            return initial
+
 
 class BancadaCrud(Crud):
     model = Bancada


Test patch:
Repository: interlegis/sapl

Issue:
Campo "Ementa" estoura a capa do processo.
<!--- Forneça um resumo geral da _issue_ no título acima -->
Issue reportada pelo @morale em comentário na issue #2344 
## Comportamento Esperado
<!--- Se você está descrevendo um _bug_, conte-nos o que deveria acontecer. -->
<!--- Se você está sugerindo uma mudança/melhoria, conte-nos como deve funcionar. -->
É esperado que a na capa do processo todos os campos possam ser visualizados.
## Comportamento Atual
<!--- Se está descrevendo um bug, conte-nos o que acontece em vez do comportamento esperado. -->
<!--- Se está sugerindo uma mudança/melhoria, explique a diferença com o comportamento atual. -->
Caso a ementa da matéria seja muito grande, ela fica por cima dos campos que vem abaixo.
## Possível Solução
<!--- Não é obrigatório, mas sugira uma possível correção/razão para o bug -->
<!--- ou ideias de como implementar a adição/mudança. -->
Limitar a quantidade de caracteres da ementa que são mostrados na capa do processo e ao atingir esse limite não mostrar e acrescentar "..." ao final.
## Passos para Reproduzir (para bugs)
<!--- Forneça um link para um exemplo, ou um conjunto de passos inequívocos -->
<!--- para reproduzir esse bug. Inclua código para reproduzir, se relevante. -->
1. Criar uma matéria com uma ementa grande (mais de 20 linhas de texto)
2. Ir em impresso -> capa de processo
3. Ver que o campo sobrescreveu o local de assinatura e o despacho inicial
4.

## Imagens do Ocorrido
<!--- Representação visual em vídeo ou imagem do ocorrido -->
<!--- Se está descrevendo um bug poste imagens ou vídeos na repordução do bug citado, caso se aplique --:

![image](https://user-images.githubusercontent.com/19825887/48201791-56e91100-e34a-11e8-8c40-fb948fe55aa4.png)

## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_):Versão 3.1.131



Discussion:
![image](https://user-images.githubusercontent.com/19825887/48201791-56e91100-e34a-11e8-8c40-fb948fe55aa4.png)
Minha sugestão é limitar esse campo a uma quantidade "X" de caracteres. Se esta página vai ser impressa numa etiqueta ou algo assim, não faz sentido colocar uma ementa gigantesca, melhor estipular um tamanho máximo e colocar três pontos para indicar que o texto continua, caso necessário.

Resolving patch:
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -2267,7 +2267,8 @@ def form_valid(self, form):
             self.messages.add_message(self.request, messages.INFO, mensagem)
 
             return self.render_to_response(context)
-
+        if len(materia.ementa) > 301:
+            materia.ementa = materia.ementa[0:300] + '[...]'
         context['materia'] = materia
         context['despachos'] = materia.despachoinicial_set.all().values_list(
             'comissao__nome', flat=True)


Test patch:
Repository: interlegis/sapl

Issue:
Campo "Ementa" estoura etiqueta
Problema equivalente ao relatado em #2360, mas em etiqueta.
![image](https://user-images.githubusercontent.com/19825887/48345264-b9018900-e65e-11e8-9c2e-657f0ec4b726.png)

![image](https://user-images.githubusercontent.com/19825887/48345270-c0289700-e65e-11e8-82a2-7a1504898b26.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
@@ -2179,6 +2179,10 @@ def form_valid(self, form):
         if context['quantidade'] > 20:
             materias = materias[:20]
 
+        for m in materias:
+            if len(m.ementa) > 100:
+                m.ementa = m.ementa[0:99] + "[...]"
+
         context['materias'] = materias
 
         return gerar_pdf_impressos(self.request, context,


Test patch:
Repository: interlegis/sapl

Issue:
Comentários HTML geram erro na geração de PDF
<!--- Forneça um resumo geral da _issue_ no título acima -->

O gerador de PDF dá pau quando existem comentários HTML no texto que é colado em Expedientes.

## Comportamento Esperado
Ignorar os comentários e não imprimí-los em tela.

## Comportamento Atual
<!--- Se está descrevendo um bug, conte-nos o que acontece em vez do comportamento esperado. -->
<!--- Se está sugerindo uma mudança/melhoria, explique a diferença com o comportamento atual. -->

Erro 500 na geração do relatório se os campos de expediente contiverem algum comentário.

## Possível Solução
<!--- Não é obrigatório, mas sugira uma possível correção/razão para o bug -->
<!--- ou ideias de como implementar a adição/mudança. -->
Na hora de gerar o relatório ignorar esses comentários (eles já são ignorados na renderização do HTML mesmo).

## Contexto

Erro na geração de relatórios.
<!--- Como esse problema o afeta? O que você está tentando realizar? -->
<!--- Fornecer o contexto nos ajuda a encontrar uma solução que seja mais útil no mundo real -->

## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_): 3.1.134
* Nome e versão do navegador: Chrome 
* Nome e versão do Sistema Operacional (desktop ou mobile): Linux
* Link para o seu projeto (Caso de fork deste projeto): 3.1.x


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
@@ -466,6 +466,29 @@ def get_espelho(mats):
     return materias
 
 
+def remove_html_comments(text):
+    """
+        Assume comentários bem formados <!-- texto --> e
+        não aninhados como <!-- <!-- texto --> -->
+    :param text:
+    :return:
+    """
+    clean_text = text
+    start = clean_text.find('<!--')
+    while start > -1:
+        end = clean_text.find('-->') + 2
+        output_text = []
+        for idx, i in enumerate(clean_text):
+            if not start <= idx <= end:
+                output_text.append(i)
+        clean_text = ''.join(output_text)
+        start = clean_text.find('<!--')
+
+    # por algum motivo usar clean_text ao invés de len(clean_text)
+    #  não tava funcionando
+    return clean_text if len(clean_text) > 0 else text
+
+
 def get_sessao_plenaria(sessao, casa):
 
     inf_basicas_dic = {}
@@ -535,6 +558,9 @@ def get_sessao_plenaria(sessao, casa):
         #   https://github.com/interlegis/sapl/issues/1009
         conteudo = conteudo.replace('&', '&amp;')
 
+        # https://github.com/interlegis/sapl/issues/2386
+        conteudo = remove_html_comments(conteudo)
+
         dic_expedientes["txt_expediente"] = conteudo
 
         if dic_expedientes:


Test patch:
Repository: interlegis/sapl

Issue:
Sortable não funciona - ordenar matérias
<!--- Forneça um resumo geral da _issue_ no título acima -->

## Comportamento Esperado
O sortable deveria funcionar da seguinte forma: ao clicar e segurar, puxando para a posição de preferencia, atualizar toda a ordem.


## Comportamento Atual
Ao clicar e segurar, puxar e colocar na posição de preferencia, não atualiza a ordem.




## Contexto
Para colocar na ordem correta por número, é realizado manual e esta levando bastante tempo.
## Imagens do Ocorrido
![erro](https://user-images.githubusercontent.com/5943692/48435441-aa50ca00-e763-11e8-92f3-fd864dba4eb9.png)


## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
Versão usada (Release): 3.1.130
Nome e versão do navegador: Versão 70.0.3538.67 (Versão oficial)
Nome e versão do Sistema Operacional (desktop ou mobile): Ubuntu 16.04 64 bits


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
@@ -1335,7 +1335,7 @@ def get(self, request, *args, **kwargs):
         ).order_by('parlamentar__nome_parlamentar')
 
         parlamentares_sessao = [p.parlamentar for p in presencas]
-        
+
         context.update({'presenca_sessao': parlamentares_sessao})
 
 
@@ -3086,6 +3086,7 @@ def post(self, request, *args, **kwargs):
                      'sessao.change_ordemdia')
 def mudar_ordem_materia_sessao(request):
     # Pega os dados vindos da requisição
+    # import ipdb; ipdb.set_trace()
     posicao_inicial = int(request.POST['pos_ini']) + 1
     posicao_final = int(request.POST['pos_fim']) + 1
     pk_sessao = int(request.POST['pk_sessao'])
@@ -3099,7 +3100,7 @@ def mudar_ordem_materia_sessao(request):
     elif materia == 'ordem':
         materia = OrdemDia
     else:
-        return
+        return JsonResponse({}, safe=False)
 
     # Testa se existe alguma matéria na posição recebida
     try:
@@ -3138,7 +3139,7 @@ def mudar_ordem_materia_sessao(request):
     materia_1.numero_ordem = posicao_final
     materia_1.save()
 
-    return
+    return JsonResponse({}, safe=False)
 
 
 class JustificativaAusenciaCrud(MasterDetailCrud):


Test patch:
Repository: interlegis/sapl

Issue:
Parlamentar Suplente, Ausência de Histórico
Quando um parlamentar suplente assume ao mandato no lugar de um licenciado, temos como deixar consignado isso nas observações da aba "Mandatos", mas se esse parlamentar assumir por dois períodos distintos o primeiro período consignado será apagado do registro, ficando apenas nas observações. 

## Comportamento Esperado
Deveria ficar um registro de consignações dos períodos que esse parlamentar suplente assume.

## Comportamento Atual
Temos de apagar o registro anterior, quando de um novo período que ele irá assumir, nos campos de início e fim de mandato, ficando consignado apenas nas observações.

## Possível Solução
No Sapl 3.0 temos uma solução bem definida para isso, onde o titular quando se licencia já indica qual suplente assumirá em seu lugar, ficando o registro sequenciado de quantas vezes isso acontece.

## Passos para Reproduzir (para bugs)
<!--- Forneça um link para um exemplo, ou um conjunto de passos inequívocos -->
<!--- para reproduzir esse bug. Inclua código para reproduzir, se relevante. -->
1.
2.
3.
4.

## Contexto
A falta desse registro sequencial prejudica a memória da Câmara e também cerceia a informação clara ao cidadão


## Imagens do Ocorrido
<!--- Representação visual em vídeo ou imagem do ocorrido -->
<!--- Se está descrevendo um bug poste imagens ou vídeos na repordução do bug citado, caso se aplique --:

## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_): 3.1.134
* Nome e versão do navegador: Todos
* Nome e versão do Sistema Operacional (desktop ou mobile): Ubuntu 16.04
* Link para o seu projeto (Caso de fork deste projeto):


Discussion:
Essa solicitação partiu aqui da sala do SAPL Básico e Avançado com o Professor Adalberto e foi um pedido coletivo.

Resolving patch:
diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py
--- a/sapl/parlamentares/forms.py
+++ b/sapl/parlamentares/forms.py
@@ -136,7 +136,7 @@ def clean(self):
         existe_mandato = Mandato.objects.filter(
             parlamentar=data['parlamentar'],
             legislatura=data['legislatura']).exists()
-        if existe_mandato:
+        if existe_mandato and data['titular']:
             self.logger.error("Mandato nesta legislatura (parlamentar={}, legislatura={}) já existe."
                               .format(data['parlamentar'], data['legislatura']))
             raise ValidationError(_('Mandato nesta legislatura já existe.'))


Test patch:
diff --git a/sapl/parlamentares/tests/test_parlamentares.py b/sapl/parlamentares/tests/test_parlamentares.py
--- a/sapl/parlamentares/tests/test_parlamentares.py
+++ b/sapl/parlamentares/tests/test_parlamentares.py
@@ -178,6 +178,7 @@ def test_mandato_form_duplicado():
         'legislatura': str(legislatura.pk),
         'data_expedicao_diploma': '01/07/2015',
         'data_inicio_mandato': legislatura.data_inicio,
+        'titular':True,
     })
 
     assert not form.is_valid()