We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN 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. 


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `sapl/comissoes/forms.py`
Content:
```
1 from django import forms
2 from django.contrib.contenttypes.models import ContentType
3 from django.core.exceptions import ValidationError
4 from django.db import transaction
5 from django.db.models import Q
6 from django.forms import ModelForm
7 from django.utils.translation import ugettext_lazy as _
8 
9 from sapl.base.models import Autor, TipoAutor
10 from sapl.comissoes.models import (Comissao, Composicao, DocumentoAcessorio,
11                                    Participacao, Reuniao, Periodo)
12 from sapl.parlamentares.models import Legislatura, Mandato, Parlamentar
13 
14 class ComposicaoForm(forms.ModelForm):
15 
16     comissao = forms.CharField(required=False, label='Comissao', widget=forms.HiddenInput())
17 
18     class Meta:
19         model = Composicao
20         exclude = []
21 
22     def __init__(self, user=None, **kwargs):
23         super(ComposicaoForm, self).__init__(**kwargs)
24         self.fields['comissao'].widget.attrs['disabled'] = 'disabled'
25 
26     def clean(self):
27         cleaned_data = super(ComposicaoForm, self).clean()
28 
29         if not self.is_valid():
30             return cleaned_data
31 
32         periodo = cleaned_data['periodo']
33         comissao_pk = self.initial['comissao'].id
34         intersecao_periodo = Composicao.objects.filter(
35             Q(periodo__data_inicio__lte=periodo.data_fim,
36                 periodo__data_fim__gte=periodo.data_fim) |
37             Q(periodo__data_inicio__gte=periodo.data_inicio,
38                 periodo__data_fim__lte=periodo.data_inicio),
39             comissao_id=comissao_pk)
40 
41         if intersecao_periodo:
42             raise ValidationError('O período informado '
43                                   'choca com períodos já '
44                                   'cadastrados para esta comissão')
45 
46         return cleaned_data
47 
48 class PeriodoForm(forms.ModelForm):
49 
50     class Meta:
51         model = Periodo
52         exclude = []
53 
54     def clean(self):
55         cleaned_data = super(PeriodoForm, self).clean()
56 
57         if not self.is_valid():
58             return cleaned_data
59 
60         data_inicio = cleaned_data['data_inicio']
61         data_fim = cleaned_data['data_fim']
62 
63         if data_fim and data_fim < data_inicio:
64             raise ValidationError('A Data Final não pode ser menor que '
65                                         'a Data Inicial')
66         return cleaned_data
67 
68 
69 class ParticipacaoCreateForm(forms.ModelForm):
70 
71     parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())
72 
73     class Meta:
74         model = Participacao
75         fields = '__all__'
76         exclude = ['composicao']
77 
78     def __init__(self, user=None, **kwargs):
79         super(ParticipacaoCreateForm, self).__init__(**kwargs)
80 
81         if self.instance:
82             comissao = kwargs['initial']
83             comissao_pk = int(comissao['parent_pk'])
84             composicao = Composicao.objects.get(id=comissao_pk)
85             participantes = composicao.participacao_set.all()
86             id_part = [p.parlamentar.id for p in participantes]
87         else:
88             id_part = []
89 
90         qs = self.create_participacao()
91 
92         parlamentares = Mandato.objects.filter(qs,
93                                                parlamentar__ativo=True
94                                                ).prefetch_related('parlamentar').\
95                                                 values_list('parlamentar',
96                                                             flat=True
97                                                             ).distinct()
98 
99         qs = Parlamentar.objects.filter(id__in=parlamentares).distinct().\
100             exclude(id__in=id_part)
101         eligible = self.verifica()
102         result = list(set(qs) & set(eligible))
103         if not cmp(result, eligible):  # se igual a 0 significa que o qs e o eli são iguais!
104             self.fields['parlamentar'].queryset = qs
105         else:
106             ids = [e.id for e in eligible]
107             qs = Parlamentar.objects.filter(id__in=ids)
108             self.fields['parlamentar'].queryset = qs
109 
110 
111     def clean(self):
112         cleaned_data = super(ParticipacaoCreateForm, self).clean()
113 
114         if not self.is_valid():
115             return cleaned_data
116 
117         data_designacao = cleaned_data['data_designacao']
118         data_desligamento = cleaned_data['data_desligamento']
119 
120         if data_desligamento and \
121            data_designacao > data_desligamento:
122             raise ValidationError(_('Data de designação não pode ser superior '
123                                   'à data de desligamento'))
124 
125         composicao = Composicao.objects.get(id=self.initial['parent_pk'])
126         cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]
127 
128         if cleaned_data['cargo'].nome in cargos_unicos:
129             msg = _('Este cargo é único para esta Comissão.')
130             raise ValidationError(msg)
131         return cleaned_data
132 
133 
134     def create_participacao(self):
135         composicao = Composicao.objects.get(id=self.initial['parent_pk'])
136         data_inicio_comissao = composicao.periodo.data_inicio
137         data_fim_comissao = composicao.periodo.data_fim
138         q1 = Q(data_fim_mandato__isnull=False,
139                data_fim_mandato__gte=data_inicio_comissao)
140         q2 = Q(data_inicio_mandato__gte=data_inicio_comissao) \
141             & Q(data_inicio_mandato__lte=data_fim_comissao)
142         q3 = Q(data_fim_mandato__isnull=True,
143                data_inicio_mandato__lte=data_inicio_comissao)
144         qs = q1 | q2 | q3
145         return qs
146 
147     def verifica(self):
148         composicao = Composicao.objects.get(id=self.initial['parent_pk'])
149         participantes = composicao.participacao_set.all()
150         participantes_id = [p.parlamentar.id for p in participantes]
151         parlamentares = Parlamentar.objects.all().exclude(
152             id__in=participantes_id).order_by('nome_completo')
153         parlamentares = [p for p in parlamentares if p.ativo]
154 
155         lista = []
156 
157         for p in parlamentares:
158             mandatos = p.mandato_set.all()
159             for m in mandatos:
160                 data_inicio = m.data_inicio_mandato
161                 data_fim = m.data_fim_mandato
162                 comp_data_inicio = composicao.periodo.data_inicio
163                 comp_data_fim = composicao.periodo.data_fim
164                 if (data_fim and data_fim >= comp_data_inicio)\
165                         or (data_inicio >= comp_data_inicio and data_inicio <= comp_data_fim)\
166                         or (data_fim is None and data_inicio <= comp_data_inicio):
167                     lista.append(p)
168 
169         lista = list(set(lista))
170 
171         return lista
172 
173 
174 class ParticipacaoEditForm(forms.ModelForm):
175 
176     parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())
177     nome_parlamentar = forms.CharField(required=False, label='Parlamentar')
178 
179     class Meta:
180         model = Participacao
181         fields = ['nome_parlamentar', 'parlamentar', 'cargo', 'titular',
182                   'data_designacao', 'data_desligamento',
183                   'motivo_desligamento', 'observacao']
184         widgets = {
185             'parlamentar': forms.HiddenInput(),
186         }
187 
188     def __init__(self, user=None, **kwargs):
189         super(ParticipacaoEditForm, self).__init__(**kwargs)
190         self.initial['nome_parlamentar'] = Parlamentar.objects.get(
191             id=self.initial['parlamentar']).nome_parlamentar
192         self.fields['nome_parlamentar'].widget.attrs['disabled'] = 'disabled'
193 
194     def clean(self):
195         cleaned_data = super(ParticipacaoEditForm, self).clean()
196 
197         if not self.is_valid():
198             return cleaned_data
199 
200         data_designacao = cleaned_data['data_designacao']
201         data_desligamento = cleaned_data['data_desligamento']
202 
203         if data_desligamento and \
204            data_designacao > data_desligamento:
205             raise ValidationError(_('Data de designação não pode ser superior '
206                                   'à data de desligamento'))
207 
208         composicao_id = self.instance.composicao_id
209 
210         composicao = Composicao.objects.get(id=composicao_id)
211         cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]
212 
213         if cleaned_data['cargo'].nome in cargos_unicos:
214             msg = _('Este cargo é único para esta Comissão.')
215             raise ValidationError(msg)
216 
217         return cleaned_data
218 
219 
220 class ComissaoForm(forms.ModelForm):
221 
222     class Meta:
223         model = Comissao
224         fields = '__all__'
225 
226     def __init__(self, user=None, **kwargs):
227         super(ComissaoForm, self).__init__(**kwargs)
228         inst = self.instance
229         if inst.pk:
230             if inst.tipo.natureza == 'P':
231                 self.fields['apelido_temp'].widget.attrs['disabled'] = 'disabled'
232                 self.fields['data_instalacao_temp'].widget.attrs['disabled'] = 'disabled'
233                 self.fields['data_final_prevista_temp'].widget.attrs['disabled'] = 'disabled'
234                 self.fields['data_prorrogada_temp'].widget.attrs['disabled'] = 'disabled'
235                 self.fields['data_fim_comissao'].widget.attrs['disabled'] = 'disabled'
236 
237 
238 
239     def clean(self):
240         super(ComissaoForm, self).clean()
241 
242         if not self.is_valid():
243             return self.cleaned_data
244 
245         if len(self.cleaned_data['nome']) > 50:
246             msg = _('Nome da Comissão deve ter no máximo 50 caracteres.')
247             raise ValidationError(msg)
248         if self.cleaned_data['data_extincao']:
249             if (self.cleaned_data['data_extincao'] <
250                     self.cleaned_data['data_criacao']):
251                 msg = _('Data de extinção não pode ser menor que a de criação')
252                 raise ValidationError(msg)
253         return self.cleaned_data
254 
255     @transaction.atomic
256     def save(self, commit=True):
257         inst = self.instance
258         if not inst.pk:
259             comissao = super(ComissaoForm, self).save(commit)
260             content_type = ContentType.objects.get_for_model(Comissao)
261             object_id = comissao.pk
262             tipo = TipoAutor.objects.get(descricao__icontains='Comiss')
263             nome = comissao.sigla + ' - ' + comissao.nome
264             Autor.objects.create(
265                 content_type=content_type,
266                 object_id=object_id,
267                 tipo=tipo,
268                 nome=nome
269             )
270             return comissao
271         else:
272             comissao = super(ComissaoForm, self).save(commit)
273             return comissao
274 
275 
276 class ReuniaoForm(ModelForm):
277 
278     comissao = forms.ModelChoiceField(queryset=Comissao.objects.all(),
279                                       widget=forms.HiddenInput())
280 
281     class Meta:
282         model = Reuniao
283         exclude = ['cod_andamento_reuniao']
284 
285     def clean(self):
286         super(ReuniaoForm, self).clean()
287 
288         if not self.is_valid():
289             return self.cleaned_data
290 
291         if self.cleaned_data['hora_fim']:
292             if (self.cleaned_data['hora_fim'] <
293                     self.cleaned_data['hora_inicio']):
294                 msg = _('A hora de término da reunião não pode ser menor que a de início')
295                 raise ValidationError(msg)
296         return self.cleaned_data
297 
298 class DocumentoAcessorioCreateForm(forms.ModelForm):
299 
300     parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())
301 
302     class Meta:
303         model = DocumentoAcessorio
304         exclude = ['reuniao']
305 
306     def __init__(self, user=None, **kwargs):
307         super(DocumentoAcessorioCreateForm, self).__init__(**kwargs)
308 
309         if self.instance:
310             reuniao = Reuniao.objects.get(id=self.initial['parent_pk'])
311             comissao = reuniao.comissao
312             comissao_pk = comissao.id
313             documentos = reuniao.documentoacessorio_set.all()
314             return self.create_documentoacessorio()
315 
316 
317     def create_documentoacessorio(self):
318         reuniao = Reuniao.objects.get(id=self.initial['parent_pk'])
319 
320 
321 class DocumentoAcessorioEditForm(forms.ModelForm):
322 
323     parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())
324 
325     class Meta:
326         model = DocumentoAcessorio
327         fields = ['nome', 'data', 'autor', 'ementa',
328                   'indexacao', 'arquivo']
329 
330     def __init__(self, user=None, **kwargs):
331         super(DocumentoAcessorioEditForm, self).__init__(**kwargs)
332
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

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 @@
             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]

{"golden_diff": "diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py\n--- a/sapl/comissoes/forms.py\n+++ b/sapl/comissoes/forms.py\n@@ -100,7 +100,7 @@\n             exclude(id__in=id_part)\n         eligible = self.verifica()\n         result = list(set(qs) & set(eligible))\n-        if not cmp(result, eligible):  # se igual a 0 significa que o qs e o eli s\u00e3o iguais!\n+        if result == eligible:\n             self.fields['parlamentar'].queryset = qs\n         else:\n             ids = [e.id for e in eligible]\n", "issue": "Pesquisa de normas jur\u00eddicas\nOl\u00e1, estou testando o SAPL 3.1 e percebi que a pesquisa de normas jur\u00eddicas n\u00e3o retorna resultado caso seja acrescentado o n\u00famero \"0\" antes da numera\u00e7\u00e3o da norma. \r\n\n", "before_files": [{"content": "from django import forms\nfrom django.contrib.contenttypes.models import ContentType\nfrom django.core.exceptions import ValidationError\nfrom django.db import transaction\nfrom django.db.models import Q\nfrom django.forms import ModelForm\nfrom django.utils.translation import ugettext_lazy as _\n\nfrom sapl.base.models import Autor, TipoAutor\nfrom sapl.comissoes.models import (Comissao, Composicao, DocumentoAcessorio,\n                                   Participacao, Reuniao, Periodo)\nfrom sapl.parlamentares.models import Legislatura, Mandato, Parlamentar\n\nclass ComposicaoForm(forms.ModelForm):\n\n    comissao = forms.CharField(required=False, label='Comissao', widget=forms.HiddenInput())\n\n    class Meta:\n        model = Composicao\n        exclude = []\n\n    def __init__(self, user=None, **kwargs):\n        super(ComposicaoForm, self).__init__(**kwargs)\n        self.fields['comissao'].widget.attrs['disabled'] = 'disabled'\n\n    def clean(self):\n        cleaned_data = super(ComposicaoForm, self).clean()\n\n        if not self.is_valid():\n            return cleaned_data\n\n        periodo = cleaned_data['periodo']\n        comissao_pk = self.initial['comissao'].id\n        intersecao_periodo = Composicao.objects.filter(\n            Q(periodo__data_inicio__lte=periodo.data_fim,\n                periodo__data_fim__gte=periodo.data_fim) |\n            Q(periodo__data_inicio__gte=periodo.data_inicio,\n                periodo__data_fim__lte=periodo.data_inicio),\n            comissao_id=comissao_pk)\n\n        if intersecao_periodo:\n            raise ValidationError('O per\u00edodo informado '\n                                  'choca com per\u00edodos j\u00e1 '\n                                  'cadastrados para esta comiss\u00e3o')\n\n        return cleaned_data\n\nclass PeriodoForm(forms.ModelForm):\n\n    class Meta:\n        model = Periodo\n        exclude = []\n\n    def clean(self):\n        cleaned_data = super(PeriodoForm, self).clean()\n\n        if not self.is_valid():\n            return cleaned_data\n\n        data_inicio = cleaned_data['data_inicio']\n        data_fim = cleaned_data['data_fim']\n\n        if data_fim and data_fim < data_inicio:\n            raise ValidationError('A Data Final n\u00e3o pode ser menor que '\n                                        'a Data Inicial')\n        return cleaned_data\n\n\nclass ParticipacaoCreateForm(forms.ModelForm):\n\n    parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())\n\n    class Meta:\n        model = Participacao\n        fields = '__all__'\n        exclude = ['composicao']\n\n    def __init__(self, user=None, **kwargs):\n        super(ParticipacaoCreateForm, self).__init__(**kwargs)\n\n        if self.instance:\n            comissao = kwargs['initial']\n            comissao_pk = int(comissao['parent_pk'])\n            composicao = Composicao.objects.get(id=comissao_pk)\n            participantes = composicao.participacao_set.all()\n            id_part = [p.parlamentar.id for p in participantes]\n        else:\n            id_part = []\n\n        qs = self.create_participacao()\n\n        parlamentares = Mandato.objects.filter(qs,\n                                               parlamentar__ativo=True\n                                               ).prefetch_related('parlamentar').\\\n                                                values_list('parlamentar',\n                                                            flat=True\n                                                            ).distinct()\n\n        qs = Parlamentar.objects.filter(id__in=parlamentares).distinct().\\\n            exclude(id__in=id_part)\n        eligible = self.verifica()\n        result = list(set(qs) & set(eligible))\n        if not cmp(result, eligible):  # se igual a 0 significa que o qs e o eli s\u00e3o iguais!\n            self.fields['parlamentar'].queryset = qs\n        else:\n            ids = [e.id for e in eligible]\n            qs = Parlamentar.objects.filter(id__in=ids)\n            self.fields['parlamentar'].queryset = qs\n\n\n    def clean(self):\n        cleaned_data = super(ParticipacaoCreateForm, self).clean()\n\n        if not self.is_valid():\n            return cleaned_data\n\n        data_designacao = cleaned_data['data_designacao']\n        data_desligamento = cleaned_data['data_desligamento']\n\n        if data_desligamento and \\\n           data_designacao > data_desligamento:\n            raise ValidationError(_('Data de designa\u00e7\u00e3o n\u00e3o pode ser superior '\n                                  '\u00e0 data de desligamento'))\n\n        composicao = Composicao.objects.get(id=self.initial['parent_pk'])\n        cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]\n\n        if cleaned_data['cargo'].nome in cargos_unicos:\n            msg = _('Este cargo \u00e9 \u00fanico para esta Comiss\u00e3o.')\n            raise ValidationError(msg)\n        return cleaned_data\n\n\n    def create_participacao(self):\n        composicao = Composicao.objects.get(id=self.initial['parent_pk'])\n        data_inicio_comissao = composicao.periodo.data_inicio\n        data_fim_comissao = composicao.periodo.data_fim\n        q1 = Q(data_fim_mandato__isnull=False,\n               data_fim_mandato__gte=data_inicio_comissao)\n        q2 = Q(data_inicio_mandato__gte=data_inicio_comissao) \\\n            & Q(data_inicio_mandato__lte=data_fim_comissao)\n        q3 = Q(data_fim_mandato__isnull=True,\n               data_inicio_mandato__lte=data_inicio_comissao)\n        qs = q1 | q2 | q3\n        return qs\n\n    def verifica(self):\n        composicao = Composicao.objects.get(id=self.initial['parent_pk'])\n        participantes = composicao.participacao_set.all()\n        participantes_id = [p.parlamentar.id for p in participantes]\n        parlamentares = Parlamentar.objects.all().exclude(\n            id__in=participantes_id).order_by('nome_completo')\n        parlamentares = [p for p in parlamentares if p.ativo]\n\n        lista = []\n\n        for p in parlamentares:\n            mandatos = p.mandato_set.all()\n            for m in mandatos:\n                data_inicio = m.data_inicio_mandato\n                data_fim = m.data_fim_mandato\n                comp_data_inicio = composicao.periodo.data_inicio\n                comp_data_fim = composicao.periodo.data_fim\n                if (data_fim and data_fim >= comp_data_inicio)\\\n                        or (data_inicio >= comp_data_inicio and data_inicio <= comp_data_fim)\\\n                        or (data_fim is None and data_inicio <= comp_data_inicio):\n                    lista.append(p)\n\n        lista = list(set(lista))\n\n        return lista\n\n\nclass ParticipacaoEditForm(forms.ModelForm):\n\n    parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())\n    nome_parlamentar = forms.CharField(required=False, label='Parlamentar')\n\n    class Meta:\n        model = Participacao\n        fields = ['nome_parlamentar', 'parlamentar', 'cargo', 'titular',\n                  'data_designacao', 'data_desligamento',\n                  'motivo_desligamento', 'observacao']\n        widgets = {\n            'parlamentar': forms.HiddenInput(),\n        }\n\n    def __init__(self, user=None, **kwargs):\n        super(ParticipacaoEditForm, self).__init__(**kwargs)\n        self.initial['nome_parlamentar'] = Parlamentar.objects.get(\n            id=self.initial['parlamentar']).nome_parlamentar\n        self.fields['nome_parlamentar'].widget.attrs['disabled'] = 'disabled'\n\n    def clean(self):\n        cleaned_data = super(ParticipacaoEditForm, self).clean()\n\n        if not self.is_valid():\n            return cleaned_data\n\n        data_designacao = cleaned_data['data_designacao']\n        data_desligamento = cleaned_data['data_desligamento']\n\n        if data_desligamento and \\\n           data_designacao > data_desligamento:\n            raise ValidationError(_('Data de designa\u00e7\u00e3o n\u00e3o pode ser superior '\n                                  '\u00e0 data de desligamento'))\n\n        composicao_id = self.instance.composicao_id\n\n        composicao = Composicao.objects.get(id=composicao_id)\n        cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]\n\n        if cleaned_data['cargo'].nome in cargos_unicos:\n            msg = _('Este cargo \u00e9 \u00fanico para esta Comiss\u00e3o.')\n            raise ValidationError(msg)\n\n        return cleaned_data\n\n\nclass ComissaoForm(forms.ModelForm):\n\n    class Meta:\n        model = Comissao\n        fields = '__all__'\n\n    def __init__(self, user=None, **kwargs):\n        super(ComissaoForm, self).__init__(**kwargs)\n        inst = self.instance\n        if inst.pk:\n            if inst.tipo.natureza == 'P':\n                self.fields['apelido_temp'].widget.attrs['disabled'] = 'disabled'\n                self.fields['data_instalacao_temp'].widget.attrs['disabled'] = 'disabled'\n                self.fields['data_final_prevista_temp'].widget.attrs['disabled'] = 'disabled'\n                self.fields['data_prorrogada_temp'].widget.attrs['disabled'] = 'disabled'\n                self.fields['data_fim_comissao'].widget.attrs['disabled'] = 'disabled'\n\n\n\n    def clean(self):\n        super(ComissaoForm, self).clean()\n\n        if not self.is_valid():\n            return self.cleaned_data\n\n        if len(self.cleaned_data['nome']) > 50:\n            msg = _('Nome da Comiss\u00e3o deve ter no m\u00e1ximo 50 caracteres.')\n            raise ValidationError(msg)\n        if self.cleaned_data['data_extincao']:\n            if (self.cleaned_data['data_extincao'] <\n                    self.cleaned_data['data_criacao']):\n                msg = _('Data de extin\u00e7\u00e3o n\u00e3o pode ser menor que a de cria\u00e7\u00e3o')\n                raise ValidationError(msg)\n        return self.cleaned_data\n\n    @transaction.atomic\n    def save(self, commit=True):\n        inst = self.instance\n        if not inst.pk:\n            comissao = super(ComissaoForm, self).save(commit)\n            content_type = ContentType.objects.get_for_model(Comissao)\n            object_id = comissao.pk\n            tipo = TipoAutor.objects.get(descricao__icontains='Comiss')\n            nome = comissao.sigla + ' - ' + comissao.nome\n            Autor.objects.create(\n                content_type=content_type,\n                object_id=object_id,\n                tipo=tipo,\n                nome=nome\n            )\n            return comissao\n        else:\n            comissao = super(ComissaoForm, self).save(commit)\n            return comissao\n\n\nclass ReuniaoForm(ModelForm):\n\n    comissao = forms.ModelChoiceField(queryset=Comissao.objects.all(),\n                                      widget=forms.HiddenInput())\n\n    class Meta:\n        model = Reuniao\n        exclude = ['cod_andamento_reuniao']\n\n    def clean(self):\n        super(ReuniaoForm, self).clean()\n\n        if not self.is_valid():\n            return self.cleaned_data\n\n        if self.cleaned_data['hora_fim']:\n            if (self.cleaned_data['hora_fim'] <\n                    self.cleaned_data['hora_inicio']):\n                msg = _('A hora de t\u00e9rmino da reuni\u00e3o n\u00e3o pode ser menor que a de in\u00edcio')\n                raise ValidationError(msg)\n        return self.cleaned_data\n\nclass DocumentoAcessorioCreateForm(forms.ModelForm):\n\n    parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())\n\n    class Meta:\n        model = DocumentoAcessorio\n        exclude = ['reuniao']\n\n    def __init__(self, user=None, **kwargs):\n        super(DocumentoAcessorioCreateForm, self).__init__(**kwargs)\n\n        if self.instance:\n            reuniao = Reuniao.objects.get(id=self.initial['parent_pk'])\n            comissao = reuniao.comissao\n            comissao_pk = comissao.id\n            documentos = reuniao.documentoacessorio_set.all()\n            return self.create_documentoacessorio()\n\n\n    def create_documentoacessorio(self):\n        reuniao = Reuniao.objects.get(id=self.initial['parent_pk'])\n\n\nclass DocumentoAcessorioEditForm(forms.ModelForm):\n\n    parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())\n\n    class Meta:\n        model = DocumentoAcessorio\n        fields = ['nome', 'data', 'autor', 'ementa',\n                  'indexacao', 'arquivo']\n\n    def __init__(self, user=None, **kwargs):\n        super(DocumentoAcessorioEditForm, self).__init__(**kwargs)\n", "path": "sapl/comissoes/forms.py"}], "after_files": [{"content": "from django import forms\nfrom django.contrib.contenttypes.models import ContentType\nfrom django.core.exceptions import ValidationError\nfrom django.db import transaction\nfrom django.db.models import Q\nfrom django.forms import ModelForm\nfrom django.utils.translation import ugettext_lazy as _\n\nfrom sapl.base.models import Autor, TipoAutor\nfrom sapl.comissoes.models import (Comissao, Composicao, DocumentoAcessorio,\n                                   Participacao, Reuniao, Periodo)\nfrom sapl.parlamentares.models import Legislatura, Mandato, Parlamentar\n\nclass ComposicaoForm(forms.ModelForm):\n\n    comissao = forms.CharField(required=False, label='Comissao', widget=forms.HiddenInput())\n\n    class Meta:\n        model = Composicao\n        exclude = []\n\n    def __init__(self, user=None, **kwargs):\n        super(ComposicaoForm, self).__init__(**kwargs)\n        self.fields['comissao'].widget.attrs['disabled'] = 'disabled'\n\n    def clean(self):\n        cleaned_data = super(ComposicaoForm, self).clean()\n\n        if not self.is_valid():\n            return cleaned_data\n\n        periodo = cleaned_data['periodo']\n        comissao_pk = self.initial['comissao'].id\n        intersecao_periodo = Composicao.objects.filter(\n            Q(periodo__data_inicio__lte=periodo.data_fim,\n                periodo__data_fim__gte=periodo.data_fim) |\n            Q(periodo__data_inicio__gte=periodo.data_inicio,\n                periodo__data_fim__lte=periodo.data_inicio),\n            comissao_id=comissao_pk)\n\n        if intersecao_periodo:\n            raise ValidationError('O per\u00edodo informado '\n                                  'choca com per\u00edodos j\u00e1 '\n                                  'cadastrados para esta comiss\u00e3o')\n\n        return cleaned_data\n\nclass PeriodoForm(forms.ModelForm):\n\n    class Meta:\n        model = Periodo\n        exclude = []\n\n    def clean(self):\n        cleaned_data = super(PeriodoForm, self).clean()\n\n        if not self.is_valid():\n            return cleaned_data\n\n        data_inicio = cleaned_data['data_inicio']\n        data_fim = cleaned_data['data_fim']\n\n        if data_fim and data_fim < data_inicio:\n            raise ValidationError('A Data Final n\u00e3o pode ser menor que '\n                                        'a Data Inicial')\n        return cleaned_data\n\n\nclass ParticipacaoCreateForm(forms.ModelForm):\n\n    parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())\n\n    class Meta:\n        model = Participacao\n        fields = '__all__'\n        exclude = ['composicao']\n\n    def __init__(self, user=None, **kwargs):\n        super(ParticipacaoCreateForm, self).__init__(**kwargs)\n\n        if self.instance:\n            comissao = kwargs['initial']\n            comissao_pk = int(comissao['parent_pk'])\n            composicao = Composicao.objects.get(id=comissao_pk)\n            participantes = composicao.participacao_set.all()\n            id_part = [p.parlamentar.id for p in participantes]\n        else:\n            id_part = []\n\n        qs = self.create_participacao()\n\n        parlamentares = Mandato.objects.filter(qs,\n                                               parlamentar__ativo=True\n                                               ).prefetch_related('parlamentar').\\\n                                                values_list('parlamentar',\n                                                            flat=True\n                                                            ).distinct()\n\n        qs = Parlamentar.objects.filter(id__in=parlamentares).distinct().\\\n            exclude(id__in=id_part)\n        eligible = self.verifica()\n        result = list(set(qs) & set(eligible))\n        if result == eligible:\n            self.fields['parlamentar'].queryset = qs\n        else:\n            ids = [e.id for e in eligible]\n            qs = Parlamentar.objects.filter(id__in=ids)\n            self.fields['parlamentar'].queryset = qs\n\n\n    def clean(self):\n        cleaned_data = super(ParticipacaoCreateForm, self).clean()\n\n        if not self.is_valid():\n            return cleaned_data\n\n        data_designacao = cleaned_data['data_designacao']\n        data_desligamento = cleaned_data['data_desligamento']\n\n        if data_desligamento and \\\n           data_designacao > data_desligamento:\n            raise ValidationError(_('Data de designa\u00e7\u00e3o n\u00e3o pode ser superior '\n                                  '\u00e0 data de desligamento'))\n\n        composicao = Composicao.objects.get(id=self.initial['parent_pk'])\n        cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]\n\n        if cleaned_data['cargo'].nome in cargos_unicos:\n            msg = _('Este cargo \u00e9 \u00fanico para esta Comiss\u00e3o.')\n            raise ValidationError(msg)\n        return cleaned_data\n\n\n    def create_participacao(self):\n        composicao = Composicao.objects.get(id=self.initial['parent_pk'])\n        data_inicio_comissao = composicao.periodo.data_inicio\n        data_fim_comissao = composicao.periodo.data_fim\n        q1 = Q(data_fim_mandato__isnull=False,\n               data_fim_mandato__gte=data_inicio_comissao)\n        q2 = Q(data_inicio_mandato__gte=data_inicio_comissao) \\\n            & Q(data_inicio_mandato__lte=data_fim_comissao)\n        q3 = Q(data_fim_mandato__isnull=True,\n               data_inicio_mandato__lte=data_inicio_comissao)\n        qs = q1 | q2 | q3\n        return qs\n\n    def verifica(self):\n        composicao = Composicao.objects.get(id=self.initial['parent_pk'])\n        participantes = composicao.participacao_set.all()\n        participantes_id = [p.parlamentar.id for p in participantes]\n        parlamentares = Parlamentar.objects.all().exclude(\n            id__in=participantes_id).order_by('nome_completo')\n        parlamentares = [p for p in parlamentares if p.ativo]\n\n        lista = []\n\n        for p in parlamentares:\n            mandatos = p.mandato_set.all()\n            for m in mandatos:\n                data_inicio = m.data_inicio_mandato\n                data_fim = m.data_fim_mandato\n                comp_data_inicio = composicao.periodo.data_inicio\n                comp_data_fim = composicao.periodo.data_fim\n                if (data_fim and data_fim >= comp_data_inicio)\\\n                        or (data_inicio >= comp_data_inicio and data_inicio <= comp_data_fim)\\\n                        or (data_fim is None and data_inicio <= comp_data_inicio):\n                    lista.append(p)\n\n        lista = list(set(lista))\n\n        return lista\n\n\nclass ParticipacaoEditForm(forms.ModelForm):\n\n    parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())\n    nome_parlamentar = forms.CharField(required=False, label='Parlamentar')\n\n    class Meta:\n        model = Participacao\n        fields = ['nome_parlamentar', 'parlamentar', 'cargo', 'titular',\n                  'data_designacao', 'data_desligamento',\n                  'motivo_desligamento', 'observacao']\n        widgets = {\n            'parlamentar': forms.HiddenInput(),\n        }\n\n    def __init__(self, user=None, **kwargs):\n        super(ParticipacaoEditForm, self).__init__(**kwargs)\n        self.initial['nome_parlamentar'] = Parlamentar.objects.get(\n            id=self.initial['parlamentar']).nome_parlamentar\n        self.fields['nome_parlamentar'].widget.attrs['disabled'] = 'disabled'\n\n    def clean(self):\n        cleaned_data = super(ParticipacaoEditForm, self).clean()\n\n        if not self.is_valid():\n            return cleaned_data\n\n        data_designacao = cleaned_data['data_designacao']\n        data_desligamento = cleaned_data['data_desligamento']\n\n        if data_desligamento and \\\n           data_designacao > data_desligamento:\n            raise ValidationError(_('Data de designa\u00e7\u00e3o n\u00e3o pode ser superior '\n                                  '\u00e0 data de desligamento'))\n\n        composicao_id = self.instance.composicao_id\n\n        composicao = Composicao.objects.get(id=composicao_id)\n        cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]\n\n        if cleaned_data['cargo'].nome in cargos_unicos:\n            msg = _('Este cargo \u00e9 \u00fanico para esta Comiss\u00e3o.')\n            raise ValidationError(msg)\n\n        return cleaned_data\n\n\nclass ComissaoForm(forms.ModelForm):\n\n    class Meta:\n        model = Comissao\n        fields = '__all__'\n\n    def __init__(self, user=None, **kwargs):\n        super(ComissaoForm, self).__init__(**kwargs)\n        inst = self.instance\n        if inst.pk:\n            if inst.tipo.natureza == 'P':\n                self.fields['apelido_temp'].widget.attrs['disabled'] = 'disabled'\n                self.fields['data_instalacao_temp'].widget.attrs['disabled'] = 'disabled'\n                self.fields['data_final_prevista_temp'].widget.attrs['disabled'] = 'disabled'\n                self.fields['data_prorrogada_temp'].widget.attrs['disabled'] = 'disabled'\n                self.fields['data_fim_comissao'].widget.attrs['disabled'] = 'disabled'\n\n\n\n    def clean(self):\n        super(ComissaoForm, self).clean()\n\n        if not self.is_valid():\n            return self.cleaned_data\n\n        if len(self.cleaned_data['nome']) > 50:\n            msg = _('Nome da Comiss\u00e3o deve ter no m\u00e1ximo 50 caracteres.')\n            raise ValidationError(msg)\n        if self.cleaned_data['data_extincao']:\n            if (self.cleaned_data['data_extincao'] <\n                    self.cleaned_data['data_criacao']):\n                msg = _('Data de extin\u00e7\u00e3o n\u00e3o pode ser menor que a de cria\u00e7\u00e3o')\n                raise ValidationError(msg)\n        return self.cleaned_data\n\n    @transaction.atomic\n    def save(self, commit=True):\n        inst = self.instance\n        if not inst.pk:\n            comissao = super(ComissaoForm, self).save(commit)\n            content_type = ContentType.objects.get_for_model(Comissao)\n            object_id = comissao.pk\n            tipo = TipoAutor.objects.get(descricao__icontains='Comiss')\n            nome = comissao.sigla + ' - ' + comissao.nome\n            Autor.objects.create(\n                content_type=content_type,\n                object_id=object_id,\n                tipo=tipo,\n                nome=nome\n            )\n            return comissao\n        else:\n            comissao = super(ComissaoForm, self).save(commit)\n            return comissao\n\n\nclass ReuniaoForm(ModelForm):\n\n    comissao = forms.ModelChoiceField(queryset=Comissao.objects.all(),\n                                      widget=forms.HiddenInput())\n\n    class Meta:\n        model = Reuniao\n        exclude = ['cod_andamento_reuniao']\n\n    def clean(self):\n        super(ReuniaoForm, self).clean()\n\n        if not self.is_valid():\n            return self.cleaned_data\n\n        if self.cleaned_data['hora_fim']:\n            if (self.cleaned_data['hora_fim'] <\n                    self.cleaned_data['hora_inicio']):\n                msg = _('A hora de t\u00e9rmino da reuni\u00e3o n\u00e3o pode ser menor que a de in\u00edcio')\n                raise ValidationError(msg)\n        return self.cleaned_data\n\nclass DocumentoAcessorioCreateForm(forms.ModelForm):\n\n    parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())\n\n    class Meta:\n        model = DocumentoAcessorio\n        exclude = ['reuniao']\n\n    def __init__(self, user=None, **kwargs):\n        super(DocumentoAcessorioCreateForm, self).__init__(**kwargs)\n\n        if self.instance:\n            reuniao = Reuniao.objects.get(id=self.initial['parent_pk'])\n            comissao = reuniao.comissao\n            comissao_pk = comissao.id\n            documentos = reuniao.documentoacessorio_set.all()\n            return self.create_documentoacessorio()\n\n\n    def create_documentoacessorio(self):\n        reuniao = Reuniao.objects.get(id=self.initial['parent_pk'])\n\n\nclass DocumentoAcessorioEditForm(forms.ModelForm):\n\n    parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())\n\n    class Meta:\n        model = DocumentoAcessorio\n        fields = ['nome', 'data', 'autor', 'ementa',\n                  'indexacao', 'arquivo']\n\n    def __init__(self, user=None, **kwargs):\n        super(DocumentoAcessorioEditForm, self).__init__(**kwargs)\n", "path": "sapl/comissoes/forms.py"}]}