diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index 9ab426bed..f5bef2123 100755 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -21,7 +21,7 @@ from sapl.crispy_layout_mixin import form_actions, to_row from sapl.rules import SAPL_GROUP_VOTANTE from sapl.utils import FileFieldCheckMixin, SelectSubmitChangeWidget -from .models import (Coligacao, ComposicaoColigacao, Filiacao, Frente, Legislatura, +from .models import (Coligacao, ComposicaoColigacao, ComposicaoMesa, Filiacao, Frente, Legislatura, Mandato, MesaDiretora, Parlamentar, Partido, Votante, Bloco, FrenteParlamentar, BlocoMembro) @@ -775,3 +775,76 @@ class MesaDiretoraFilterSet(django_filters.FilterSet): Fieldset(_('Escolha da Legislatura'), row0,) ) + + +class MesaDiretoraForm(ModelForm): + + class Meta: + model = MesaDiretora + fields = '__all__' + + def clean(self): + super(MesaDiretoraForm, self).clean() + if not self.is_valid(): + return self.cleaned_data + + data = self.cleaned_data + legislatura = data['legislatura'] + data_inicio = data['data_inicio'] + data_fim = data['data_fim'] + + if data_inicio >= data_fim: + raise ValidationError(_('A data de início deve ser anterior à data de fim.')) + + # Verifica se há intersecção de datas com outra mesa diretora da mesma legislatura + intersecao_mesadiretora = MesaDiretora.objects.filter( + legislatura=legislatura, + data_inicio__lte=data_fim, + data_fim__gte=data_inicio + ).exclude(pk=self.instance.pk).exists() + if intersecao_mesadiretora: + raise ValidationError(_('As datas da mesa diretora se sobrepõem com outra mesa diretora existente.')) + + # Verifica se as datas da mesa diretora estão dentro do intervalo da legislatura + if data_inicio < legislatura.data_inicio or data_fim > legislatura.data_fim: + raise ValidationError(_('As datas da mesa diretora devem estar dentro do período da legislatura.')) + return data + +class ComposicaoMesaForm(ModelForm): + + class Meta: + model = ComposicaoMesa + fields = '__all__' + widgets = { + 'mesa_diretora': forms.HiddenInput() + } + + def __init__(self, *args, **kwargs): + super(ComposicaoMesaForm, self).__init__(*args, **kwargs) + self.fields['parlamentar'].queryset = self.fields['parlamentar'].queryset.filter( + mandato__legislatura=self.initial['mesa_diretora'].legislatura) + + def clean(self): + super(ComposicaoMesaForm, self).clean() + if not self.is_valid(): + return self.cleaned_data + + data = self.cleaned_data + mesa_diretora = data['mesa_diretora'] + cargo = data['cargo'] + + # Verifica se Parlamentar já ocupa algum cargo + parlamentar = data['parlamentar'] + if ComposicaoMesa.objects.filter( + parlamentar=parlamentar, mesa_diretora=mesa_diretora + ).exclude(pk=self.instance.pk).exists(): + raise ValidationError(_('Parlamentar já ocupa um cargo nesta mesa diretora.')) + + if cargo.unico: + composicao_mesa = ComposicaoMesa.objects.filter( + mesa_diretora=mesa_diretora, + cargo=cargo + ).exclude(pk=self.instance.pk) + if composicao_mesa.exists(): + raise ValidationError(_('Cargo único já ocupado por outro parlamentar.')) + return data diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index b8544c8fe..a8cf1221f 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -513,12 +513,11 @@ class MesaDiretora(models.Model): class ComposicaoMesa(models.Model): - # TODO M2M ???? Ternary????? - parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) - cargo = models.ForeignKey(CargoMesa, on_delete=models.PROTECT) + parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT, verbose_name=_('Parlamentar')) + cargo = models.ForeignKey(CargoMesa, on_delete=models.PROTECT, verbose_name=_('Cargo')) mesa_diretora = models.ForeignKey( MesaDiretora, on_delete=models.PROTECT, null=True, - related_name='composicaomesa_set') + related_name='composicaomesa_set', verbose_name=_('Mesa Diretora')) class Meta: verbose_name = _('Ocupação de cargo na Mesa') diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 2b11dd9bf..6c6fb0760 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -35,7 +35,7 @@ from sapl.parlamentares.apps import AppConfig from sapl.rules import SAPL_GROUP_VOTANTE from sapl.utils import (parlamentares_ativos, show_results_filter_set, ratelimit_ip) -from .forms import (ColigacaoFilterSet, FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm, MesaDiretoraFilterSet, +from .forms import (ColigacaoFilterSet, ComposicaoMesaForm, FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm, MesaDiretoraFilterSet, MesaDiretoraForm, ParlamentarCreateForm, ParlamentarForm, VotanteForm, ParlamentarFilterSet, PartidoFilterSet, VincularParlamentarForm, BlocoForm, FrenteParlamentarForm, BlocoMembroForm) @@ -1041,7 +1041,12 @@ class MesaDiretoraCrud(Crud): def get(self, request, *args, **kwargs): return FilterView.get(self, request, *args, **kwargs) + class UpdateView(Crud.UpdateView): + form_class = MesaDiretoraForm + class CreateView(Crud.CreateView): + form_class = MesaDiretoraForm + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['subnav_template_name'] = '' @@ -1066,6 +1071,23 @@ class ComposicaoMesaCrud(MasterDetailCrud): context['subnav_template_name'] = 'parlamentares/subnav_mesa.yaml' return context + class UpdateView(MasterDetailCrud.UpdateView): + form_class = ComposicaoMesaForm + + def get_initial(self): + initial = super().get_initial() + initial['mesa_diretora'] = self.object.mesa_diretora + return initial + + class CreateView(MasterDetailCrud.CreateView): + form_class = ComposicaoMesaForm + + def get_initial(self): + initial = super().get_initial() + initial['mesa_diretora'] = MesaDiretora.objects.get(pk=self.kwargs['pk']) + return initial + + class MesaDiretoraView(FormView): template_name = 'parlamentares/composicaomesa_form_old.html' diff --git a/sapl/templates/parlamentares/mesadiretora_filter.html b/sapl/templates/parlamentares/mesadiretora_filter.html index 90929be4c..1ab1b94ef 100644 --- a/sapl/templates/parlamentares/mesadiretora_filter.html +++ b/sapl/templates/parlamentares/mesadiretora_filter.html @@ -14,6 +14,10 @@