Browse Source

add forms com regras de negócio

3828_refatorar_mesa_diretora
LeandroJatai 3 days ago
parent
commit
2e894ca9c1
  1. 75
      sapl/parlamentares/forms.py
  2. 7
      sapl/parlamentares/models.py
  3. 24
      sapl/parlamentares/views.py
  4. 4
      sapl/templates/parlamentares/mesadiretora_filter.html

75
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

7
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')

24
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'

4
sapl/templates/parlamentares/mesadiretora_filter.html

@ -14,6 +14,10 @@
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tab-mesa-{{ md.id }}-tab" data-toggle="tab" data-target="#tab-mesa-{{ md.id }}" type="button" role="tab" aria-controls="tab-mesa-{{ md.id }}" aria-selected="true">{{ md }}</button>
</li>
{% elif forloop.first%}
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tab-mesa-{{ md.id }}-tab" data-toggle="tab" data-target="#tab-mesa-{{ md.id }}" type="button" role="tab" aria-controls="tab-mesa-{{ md.id }}" aria-selected="true">{{ md }}</button>
</li>
{% else %}
<li class="nav-item" role="presentation">
<button class="nav-link" id="tab-mesa-{{ md.id }}-tab" data-toggle="tab" data-target="#tab-mesa-{{ md.id }}" type="button" role="tab" aria-controls="tab-mesa-{{ md.id }}" aria-selected="false">{{ md }}</button>

Loading…
Cancel
Save