diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 6ad0fa11c..8b33a7f55 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -1168,7 +1168,7 @@ class DespachoInicialForm(ModelForm): class AutoriaForm(ModelForm): tipo_autor = ModelChoiceField(label=_('Tipo Autor'), - required=False, + required=True, queryset=TipoAutor.objects.all(), empty_label=_('Selecione'),) @@ -1180,6 +1180,12 @@ class AutoriaForm(ModelForm): def __init__(self, *args, **kwargs): super(AutoriaForm, self).__init__(*args, **kwargs) + self.fields['primeiro_autor'].required = True + + if 'initial' in kwargs and 'materia' in kwargs['initial']: + materia = kwargs['initial']['materia'] + self.fields['primeiro_autor'].initial = Autoria.objects.filter(materia=materia).count() == 0 + row1 = to_row([('tipo_autor', 4), ('autor', 4), ('primeiro_autor', 4)]) @@ -1220,7 +1226,7 @@ class AutoriaMultiCreateForm(Form): logger = logging.getLogger(__name__) tipo_autor = ModelChoiceField(label=_('Tipo Autor'), - required=False, + required=True, queryset=TipoAutor.objects.all(), empty_label=_('Selecione'),) @@ -1230,7 +1236,7 @@ class AutoriaMultiCreateForm(Form): autor = ModelMultipleChoiceField( queryset=Autor.objects.all(), label=_('Possiveis Autores'), - required=False, + required=True, widget=CheckboxSelectMultiple) autores = ModelMultipleChoiceField( @@ -1238,10 +1244,19 @@ class AutoriaMultiCreateForm(Form): required=False, widget=HiddenInput) + primeiro_autor = forms.ChoiceField( + required=True, + choices=YES_NO_CHOICES, + label="Primeiro Autor?" + ) + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - row1 = to_row([('tipo_autor', 12), ]) + if 'initial' in kwargs and 'autores' in kwargs['initial']: + self.fields['primeiro_autor'].initial = kwargs['initial']['autores'].count() == 0 + + row1 = to_row([('tipo_autor', 10), ('primeiro_autor', 2)]) row2 = to_row([('autor', 12), ]) diff --git a/sapl/materia/tests/test_materia.py b/sapl/materia/tests/test_materia.py index e12b03dff..dabf29bed 100644 --- a/sapl/materia/tests/test_materia.py +++ b/sapl/materia/tests/test_materia.py @@ -243,6 +243,7 @@ def test_autoria_submit(admin_client): reverse('sapl.materia:autoria_create', kwargs={'pk': materia_principal.pk}), {'autor': autor.pk, + 'tipo_autor': tipo_autor.pk, 'primeiro_autor': True, 'materia_id': materia_principal.pk, }, follow=True) diff --git a/sapl/materia/tests/test_materia_form.py b/sapl/materia/tests/test_materia_form.py index e29d89815..215f114a2 100644 --- a/sapl/materia/tests/test_materia_form.py +++ b/sapl/materia/tests/test_materia_form.py @@ -129,9 +129,11 @@ def test_valida_campos_obrigatorios_autoria_form(): errors = form.errors - assert errors['autor'] == [_('Este campo é obrigatório.')] + assert len(errors) == 3 - assert len(errors) == 1 + assert errors['tipo_autor'] == [_('Este campo é obrigatório.')] + assert errors['autor'] == [_('Este campo é obrigatório.')] + assert errors['primeiro_autor'] == [_('Este campo é obrigatório.')] @pytest.mark.django_db(transaction=False) @@ -142,9 +144,12 @@ def test_valida_campos_obrigatorios_autoria_multicreate_form(): errors = form.errors - assert errors['__all__'] == [_('Ao menos um autor deve ser selecionado para inclusão')] + assert len(errors) == 4 - assert len(errors) == 1 + assert errors['__all__'] == [_('Ao menos um autor deve ser selecionado para inclusão')] + assert errors['tipo_autor'] == [_('Este campo é obrigatório.')] + assert errors['autor'] == [_('Este campo é obrigatório.')] + assert errors['primeiro_autor'] == [_('Este campo é obrigatório.')] @pytest.mark.django_db(transaction=False) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index f5d80ce11..4d31993dd 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1432,6 +1432,7 @@ class AutoriaCrud(MasterDetailCrud): materia = MateriaLegislativa.objects.get(id=self.kwargs['pk']) initial['data_relativa'] = materia.data_apresentacao initial['autor'] = [] + initial['materia'] = materia return initial class UpdateView(LocalBaseMixin, MasterDetailCrud.UpdateView): @@ -1441,6 +1442,7 @@ class AutoriaCrud(MasterDetailCrud): initial.update({ 'data_relativa': self.object.materia.data_apresentacao, 'tipo_autor': self.object.autor.tipo.id, + 'materia': self.object.materia }) return initial @@ -1480,8 +1482,9 @@ class AutoriaMultiCreateView(PermissionRequiredForAppCrudMixin, FormView): def form_valid(self, form): autores_selecionados = form.cleaned_data['autor'] + primeiro_autor = form.cleaned_data['primeiro_autor'] for autor in autores_selecionados: - Autoria.objects.create(materia=self.materia, autor=autor) + Autoria.objects.create(materia=self.materia, autor=autor, primeiro_autor=primeiro_autor) return FormView.form_valid(self, form)