We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Participante de Comissão - data de desligamento
a data de desligamento deve ser posterior à data da designação.

--- 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)
12 from sapl.parlamentares.models import Legislatura, Mandato, Parlamentar
13 
14 class ComposicaoForm(forms.ModelForm):
15 
16     class Meta:
17         model = Composicao
18         exclude = []
19 
20     def clean(self):
21         cleaned_data = super(ComposicaoForm, self).clean()
22 
23         if not self.is_valid():
24             return cleaned_data
25 
26         periodo = cleaned_data['periodo']
27         comissao_pk = cleaned_data['comissao'].id
28         intersecao_periodo = Composicao.objects.filter(
29             Q(periodo__data_inicio__lte=periodo.data_fim,
30                 periodo__data_fim__gte=periodo.data_fim) |
31             Q(periodo__data_inicio__gte=periodo.data_inicio,
32                 periodo__data_fim__lte=periodo.data_inicio),
33             comissao_id=comissao_pk)
34 
35         if intersecao_periodo:
36             raise ValidationError('O período informado '
37                                   'choca com períodos já '
38                                   'cadastrados para esta comissão')
39 
40         return cleaned_data
41 
42 class ParticipacaoCreateForm(forms.ModelForm):
43 
44     parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())
45 
46     class Meta:
47         model = Participacao
48         fields = '__all__'
49         exclude = ['composicao']
50 
51     def __init__(self, user=None, **kwargs):
52         super(ParticipacaoCreateForm, self).__init__(**kwargs)
53 
54         if self.instance:
55             comissao = kwargs['initial']
56             comissao_pk = int(comissao['parent_pk'])
57             composicao = Composicao.objects.get(id=comissao_pk)
58             participantes = composicao.participacao_set.all()
59             id_part = [p.parlamentar.id for p in participantes]
60         else:
61             id_part = []
62 
63         qs = self.create_participacao()
64 
65         parlamentares = Mandato.objects.filter(qs,
66                                                parlamentar__ativo=True
67                                                ).prefetch_related('parlamentar').\
68             values_list('parlamentar',
69                         flat=True).distinct()
70 
71         qs = Parlamentar.objects.filter(id__in=parlamentares).distinct().\
72             exclude(id__in=id_part)
73         eligible = self.verifica()
74         result = list(set(qs) & set(eligible))
75         if not cmp(result, eligible):  # se igual a 0 significa que o qs e o eli são iguais!
76             self.fields['parlamentar'].queryset = qs
77         else:
78             ids = [e.id for e in eligible]
79             qs = Parlamentar.objects.filter(id__in=ids)
80             self.fields['parlamentar'].queryset = qs
81 
82 
83     def clean(self):
84         cleaned_data = super(ParticipacaoCreateForm, self).clean()
85 
86         if not self.is_valid():
87             return cleaned_data
88 
89         composicao = Composicao.objects.get(id=self.initial['parent_pk'])
90         cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]
91 
92         if cleaned_data['cargo'].nome in cargos_unicos:
93             msg = _('Este cargo é único para esta Comissão.')
94             raise ValidationError(msg)
95 
96 
97     def create_participacao(self):
98         composicao = Composicao.objects.get(id=self.initial['parent_pk'])
99         data_inicio_comissao = composicao.periodo.data_inicio
100         data_fim_comissao = composicao.periodo.data_fim
101         q1 = Q(data_fim_mandato__isnull=False,
102                data_fim_mandato__gte=data_inicio_comissao)
103         q2 = Q(data_inicio_mandato__gte=data_inicio_comissao) \
104             & Q(data_inicio_mandato__lte=data_fim_comissao)
105         q3 = Q(data_fim_mandato__isnull=True,
106                data_inicio_mandato__lte=data_inicio_comissao)
107         qs = q1 | q2 | q3
108         return qs
109 
110     def verifica(self):
111         composicao = Composicao.objects.get(id=self.initial['parent_pk'])
112         participantes = composicao.participacao_set.all()
113         participantes_id = [p.parlamentar.id for p in participantes]
114         parlamentares = Parlamentar.objects.all().exclude(
115             id__in=participantes_id).order_by('nome_completo')
116         parlamentares = [p for p in parlamentares if p.ativo]
117 
118         lista = []
119 
120         for p in parlamentares:
121             mandatos = p.mandato_set.all()
122             for m in mandatos:
123                 data_inicio = m.data_inicio_mandato
124                 data_fim = m.data_fim_mandato
125                 comp_data_inicio = composicao.periodo.data_inicio
126                 comp_data_fim = composicao.periodo.data_fim
127                 if (data_fim and data_fim >= comp_data_inicio)\
128                         or (data_inicio >= comp_data_inicio and data_inicio <= comp_data_fim)\
129                         or (data_fim is None and data_inicio <= comp_data_inicio):
130                     lista.append(p)
131 
132         lista = list(set(lista))
133 
134         return lista
135 
136 
137 class ParticipacaoEditForm(forms.ModelForm):
138 
139     parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())
140     nome_parlamentar = forms.CharField(required=False, label='Parlamentar')
141 
142     class Meta:
143         model = Participacao
144         fields = ['nome_parlamentar', 'parlamentar', 'cargo', 'titular',
145                   'data_designacao', 'data_desligamento',
146                   'motivo_desligamento', 'observacao']
147         widgets = {
148             'parlamentar': forms.HiddenInput(),
149         }
150 
151     def __init__(self, user=None, **kwargs):
152         super(ParticipacaoEditForm, self).__init__(**kwargs)
153         self.initial['nome_parlamentar'] = Parlamentar.objects.get(
154             id=self.initial['parlamentar']).nome_parlamentar
155         self.fields['nome_parlamentar'].widget.attrs['disabled'] = 'disabled'
156 
157 
158 class ComissaoForm(forms.ModelForm):
159 
160     class Meta:
161         model = Comissao
162         fields = '__all__'
163 
164     def __init__(self, user=None, **kwargs):
165         super(ComissaoForm, self).__init__(**kwargs)
166         inst = self.instance
167         if inst.pk:
168             if inst.tipo.natureza == 'P':
169                 self.fields['apelido_temp'].widget.attrs['disabled'] = 'disabled'
170                 self.fields['data_instalacao_temp'].widget.attrs['disabled'] = 'disabled'
171                 self.fields['data_final_prevista_temp'].widget.attrs['disabled'] = 'disabled'
172                 self.fields['data_prorrogada_temp'].widget.attrs['disabled'] = 'disabled'
173                 self.fields['data_fim_comissao'].widget.attrs['disabled'] = 'disabled'
174 
175 
176 
177     def clean(self):
178         super(ComissaoForm, self).clean()
179 
180         if not self.is_valid():
181             return self.cleaned_data
182 
183         if self.cleaned_data['data_extincao']:
184             if (self.cleaned_data['data_extincao'] <
185                     self.cleaned_data['data_criacao']):
186                 msg = _('Data de extinção não pode ser menor que a de criação')
187                 raise ValidationError(msg)
188         return self.cleaned_data
189 
190     @transaction.atomic
191     def save(self, commit=True):
192         inst = self.instance
193         if not inst.pk:
194             comissao = super(ComissaoForm, self).save(commit)
195             content_type = ContentType.objects.get_for_model(Comissao)
196             object_id = comissao.pk
197             tipo = TipoAutor.objects.get(descricao__icontains='Comiss')
198             nome = comissao.sigla + ' - ' + comissao.nome
199             Autor.objects.create(
200                 content_type=content_type,
201                 object_id=object_id,
202                 tipo=tipo,
203                 nome=nome
204             )
205             return comissao
206         else:
207             comissao = super(ComissaoForm, self).save(commit)
208             return comissao
209 
210 
211 class ReuniaoForm(ModelForm):
212 
213     comissao = forms.ModelChoiceField(queryset=Comissao.objects.all(),
214                                       widget=forms.HiddenInput())
215 
216     class Meta:
217         model = Reuniao
218         exclude = ['cod_andamento_reuniao']
219 
220     def clean(self):
221         super(ReuniaoForm, self).clean()
222 
223         if not self.is_valid():
224             return self.cleaned_data
225 
226         if self.cleaned_data['hora_fim']:
227             if (self.cleaned_data['hora_fim'] <
228                     self.cleaned_data['hora_inicio']):
229                 msg = _('A hora de término da reunião não pode ser menor que a de início')
230                 raise ValidationError(msg)
231         return self.cleaned_data
232 
233 class DocumentoAcessorioCreateForm(forms.ModelForm):
234 
235     parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())
236 
237     class Meta:
238         model = DocumentoAcessorio
239         exclude = ['reuniao']
240 
241     def __init__(self, user=None, **kwargs):
242         super(DocumentoAcessorioCreateForm, self).__init__(**kwargs)
243 
244         if self.instance:
245             reuniao = Reuniao.objects.get(id=self.initial['parent_pk'])
246             comissao = reuniao.comissao
247             comissao_pk = comissao.id
248             documentos = reuniao.documentoacessorio_set.all()
249             return self.create_documentoacessorio()
250 
251 
252     def create_documentoacessorio(self):
253         reuniao = Reuniao.objects.get(id=self.initial['parent_pk'])
254 
255 
256 class DocumentoAcessorioEditForm(forms.ModelForm):
257 
258     parent_pk = forms.CharField(required=False)  # widget=forms.HiddenInput())
259 
260     class Meta:
261         model = DocumentoAcessorio
262         fields = ['nome', 'data', 'autor', 'ementa',
263                   'indexacao', 'arquivo']
264 
265     def __init__(self, user=None, **kwargs):
266         super(DocumentoAcessorioEditForm, self).__init__(**kwargs)
267
```
--- 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
@@ -65,8 +65,9 @@
         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 @@
         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 @@
             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):

{"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@@ -65,8 +65,9 @@\n         parlamentares = Mandato.objects.filter(qs,\n                                                parlamentar__ativo=True\n                                                ).prefetch_related('parlamentar').\\\n-            values_list('parlamentar',\n-                        flat=True).distinct()\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@@ -86,12 +87,21 @@\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@@ -154,6 +164,31 @@\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 \n class ComissaoForm(forms.ModelForm):\n", "issue": "Participante de Comiss\u00e3o - data de desligamento\na data de desligamento deve ser posterior \u00e0 data da designa\u00e7\u00e3o.\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)\nfrom sapl.parlamentares.models import Legislatura, Mandato, Parlamentar\n\nclass ComposicaoForm(forms.ModelForm):\n\n    class Meta:\n        model = Composicao\n        exclude = []\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 = cleaned_data['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 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).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        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\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\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 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)\nfrom sapl.parlamentares.models import Legislatura, Mandato, Parlamentar\n\nclass ComposicaoForm(forms.ModelForm):\n\n    class Meta:\n        model = Composicao\n        exclude = []\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 = cleaned_data['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 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 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"}]}