diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 38f3b0182..431934870 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -5,6 +5,7 @@ import os from crispy_forms.bootstrap import Alert, InlineRadios from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset, Layout, Row) +from crispy_forms.helper import FormHelper from django import forms from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist, ValidationError @@ -1114,27 +1115,56 @@ def filtra_tramitacao_destino_and_status(status, destino): 'materia_id', flat=True) -class DespachoInicialForm(ModelForm): - comissao = forms.ModelChoiceField( - queryset=Comissao.objects.filter(ativa=True)) +class DespachoInicialForm(forms.Form): + comissao = forms.ModelMultipleChoiceField( + queryset=Comissao.objects.filter(ativa=True), + widget=forms.CheckboxSelectMultiple()) class Meta: model = DespachoInicial fields = ['comissao'] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + from crispy_forms.layout import Submit, Layout, Field + from crispy_forms.bootstrap import FormActions + self.fields['comissao'].label = 'Comissões' + self.helper = FormHelper(self) + self.helper.form_method = 'POST' + + self.helper.layout = Layout( + Div( + Div('comissao', css_class="col-md-12"), + Div(FormActions( + Submit('salvar', 'Salvar', css_class='btn btn-primary ml-5 mt-3 float-left'), + ) + ), + css_class='row', + )) + def clean(self): super(DespachoInicialForm, self).clean() + comissoes = self.cleaned_data.get('comissao') + if not comissoes: + msg = _('Você deve escolher pelo menos uma comissão.') + raise ValidationError(msg) + if not self.is_valid(): return self.cleaned_data - - if DespachoInicial.objects.filter( - materia=self.instance.materia, - comissao=self.cleaned_data['comissao'], - ).exclude(pk=self.instance.pk).exists(): - msg = _('Já existe um Despacho cadastrado para %s' % - self.cleaned_data['comissao']) - raise ValidationError(msg) + + errors = [] + for comissao in comissoes: + if DespachoInicial.objects.filter( + materia=self.initial['materia'], + comissao=comissao, + ).exists(): + msg = _('Já existe um Despacho cadastrado para %s' % + comissao) + errors.append(msg) + if errors: + raise ValidationError(errors) return self.cleaned_data diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index 962dc2cff..0dc32eae3 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -26,7 +26,8 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, TramitacaoEmLoteView, UnidadeTramitacaoCrud, proposicao_texto, recuperar_materia, ExcluirTramitacaoEmLoteView, RetornarProposicao, - MateriaPesquisaSimplesView) + MateriaPesquisaSimplesView, + DespachoInicialMultiCreateView) from sapl.norma.views import NormaPesquisaSimplesView from sapl.protocoloadm.views import (FichaPesquisaAdmView, FichaSelecionaAdmView) @@ -136,6 +137,9 @@ urlpatterns_proposicao = [ name='proposicao_texto'), url(r'^proposicao/(?P\d+)/retornar', RetornarProposicao.as_view(), name='retornar-proposicao'), + + url(r'^materia/(?P\d+)/despachoinicialmulti/create', DespachoInicialMultiCreateView.as_view(), + name='despacho-inicial-multi'), ] urlpatterns_sistema = [ diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 0736de351..8d9ddffa5 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1490,14 +1490,56 @@ class AutoriaMultiCreateView(PermissionRequiredForAppCrudMixin, FormView): return FormView.form_valid(self, form) +class DespachoInicialMultiCreateView(PermissionRequiredForAppCrudMixin, FormView): + app_label = sapl.materia.apps.AppConfig.label + form_class = DespachoInicialForm + template_name = 'materia/despachoinicial_multicreate_form.html' + + # @classmethod + # def get_url_regex(cls): + # return r'^(?P\d+)/%s/multicreate' % cls.model._meta.model_name + + @property + def layout_key(self): + return None + + def get_initial(self): + initial = super().get_initial() + self.materia = MateriaLegislativa.objects.get(id=self.kwargs['pk']) + initial['materia'] = self.materia + return initial + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['title'] = '%s (%s)' % ( + _('Adicionar Vários Despachos'), self.materia) + context['root_pk']= self.kwargs['pk'] + context['subnav_template_name'] = 'materia/subnav.yaml' + return context + + def get_success_url(self): + messages.add_message( + self.request, messages.SUCCESS, + _('Despachos adicionados com sucesso.')) + return reverse( + 'sapl.materia:despachoinicial_list', kwargs={'pk': self.materia.pk}) + + def form_valid(self, form): + comissoes_selecionadas = form.cleaned_data['comissao'] + for comissao in comissoes_selecionadas: + DespachoInicial.objects.create(materia=self.materia, comissao=comissao) + + return FormView.form_valid(self, form) + + class DespachoInicialCrud(MasterDetailCrud): model = DespachoInicial parent_field = 'materia' help_topic = 'despacho_autoria' public = [RP_LIST, RP_DETAIL] - class CreateView(MasterDetailCrud.CreateView): - form_class = DespachoInicialForm + # class CreateView(MasterDetailCrud.CreateView): + # form_class = DespachoInicialForm class UpdateView(MasterDetailCrud.UpdateView): form_class = DespachoInicialForm diff --git a/sapl/templates/materia/despachoinicial_list.html b/sapl/templates/materia/despachoinicial_list.html new file mode 100644 index 000000000..97fba619f --- /dev/null +++ b/sapl/templates/materia/despachoinicial_list.html @@ -0,0 +1,18 @@ +{% extends "crud/list.html" %} +{% load i18n common_tags crispy_forms_tags%} + +{% block extra_js %} + +{% endblock %} \ No newline at end of file diff --git a/sapl/templates/materia/despachoinicial_multicreate_form.html b/sapl/templates/materia/despachoinicial_multicreate_form.html new file mode 100644 index 000000000..087388b48 --- /dev/null +++ b/sapl/templates/materia/despachoinicial_multicreate_form.html @@ -0,0 +1,12 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% load common_tags %} + +{% block extra_js %} + +{% endblock %}