From 98dfb2e3b06d04248a39b18019a46c2bb63efb8c Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Fri, 30 Jun 2017 16:38:15 +0200 Subject: Sources wizard: fix author deletion (refs #3634) --- archaeological_operations/tests.py | 50 +++++++++++++++++++++++- archaeological_operations/views.py | 8 +++- ishtar_common/forms_common.py | 1 + ishtar_common/templates/blocks/form_snippet.html | 5 ++- ishtar_common/tests.py | 19 ++++++--- 5 files changed, 73 insertions(+), 10 deletions(-) diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index 924727065..b2f38801a 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -32,7 +32,7 @@ from archaeological_operations import views from ishtar_common.models import OrganizationType, Organization, ItemKey, \ ImporterType, IshtarUser, TargetKey, ImporterModel, IshtarSiteProfile, \ - Town, ImporterColumn, Person + Town, ImporterColumn, Person, Author, SourceType, AuthorType from archaeological_context_records.models import Unit from ishtar_common import forms_common @@ -1357,3 +1357,51 @@ class OperationAdminActWizardCreationTest(WizardTest, OperationInitTest, def post_wizard(self): self.assertEqual(models.AdministrativeAct.objects.count(), self.number + 1) + + +class OperationSourceWizardModificationTest(WizardTest, OperationInitTest, + TestCase): + fixtures = OperationWizardCreationTest.fixtures + url_name = 'operation_source_modification' + wizard_name = 'operation_source_wizard' + steps = views.operation_source_modification_steps + form_datas = [ + FormData( + "Test remove all authors", + form_datas={ + 'selec-operation_source_modification': {}, + 'source-operation_source_modification': { + 'title': "New title", + 'source_type': None, + 'index': 42 + }, + 'authors-operation_source_modification': [] + }, + ) + ] + + def pre_wizard(self): + ope = self.get_default_operation() + self.source = models.OperationSource.objects.create( + title="Old title", source_type=SourceType.objects.all()[0], + operation=ope + ) + author = Author.objects.create( + author_type=AuthorType.objects.all()[0], + person=Person.objects.all()[0] + ) + + self.source.authors.add(author) + + data = self.form_datas[0].form_datas + data['selec-operation_source_modification']['pk'] = self.source.pk + + data['source-operation_source_modification']['hidden_operation_id'] = \ + self.source.pk + data['source-operation_source_modification'][ + 'source_type'] = SourceType.objects.all()[1].pk + super(OperationSourceWizardModificationTest, self).pre_wizard() + + def post_wizard(self): + source = models.OperationSource.objects.get(pk=self.source.pk) + self.assertEqual(source.authors.count(), 0) \ No newline at end of file diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index 24271bb8f..6a1340e70 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -321,11 +321,15 @@ operation_source_creation_wizard = OperationSourceWizard.as_view([ label=_(u"Operation: source creation"), url_name='operation_source_creation',) -operation_source_modification_wizard = OperationSourceWizard.as_view([ +operation_source_modification_steps = [ ('selec-operation_source_modification', OperationSourceFormSelection), ('source-operation_source_modification', OperationSourceForm), ('authors-operation_source_modification', AuthorFormset), - ('final-operation_source_modification', FinalForm)], + ('final-operation_source_modification', FinalForm) +] + +operation_source_modification_wizard = OperationSourceWizard.as_view( + operation_source_modification_steps, label=_(u"Operation: source modification"), url_name='operation_source_modification',) diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index b317f77e3..61e9f1a88 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -884,6 +884,7 @@ class AuthorFormSelection(forms.Form): base_model = 'author' associated_models = {'author': models.Author} author = forms.IntegerField( + required=False, widget=widgets.JQueryAutoComplete( "/" + settings.URL_PATH + 'autocomplete-author', associated_model=models.Author, new=True), diff --git a/ishtar_common/templates/blocks/form_snippet.html b/ishtar_common/templates/blocks/form_snippet.html index 2f841e078..5ee88e25f 100644 --- a/ishtar_common/templates/blocks/form_snippet.html +++ b/ishtar_common/templates/blocks/form_snippet.html @@ -10,4 +10,7 @@
{{field.help_text}}
- {%endif%}{% else %}{{field}}{% endif %}{% endfor %} + {%endif%}{% else %}{{field}}{% if field.errors %} + + {{field.name}} - {{ field.errors }} + {% endif %}{{field|safe}}{% endif %}{% endfor %} diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py index a91a0ba58..174918dd4 100644 --- a/ishtar_common/tests.py +++ b/ishtar_common/tests.py @@ -222,9 +222,11 @@ class WizardTest(object): self.wizard_name): [current_step], } + + # reconstruct a POST request if current_step in form_data: d = form_data[current_step] - if type(d) in (list, tuple): # formset + if type(d) in (list, tuple): # is a formset for d_idx, item in enumerate(d): for k in item: data['{}-{}-{}'.format( @@ -239,16 +241,21 @@ class WizardTest(object): response = self.client.post(url, data, follow=not next_form_is_checked) except ValidationError as e: - # on ManagementForm data is missing or has been tampered - # error verify the wizard_name or step name - raise ValidationError(u"Errors: {} on {}.".format( - u" - ".join(e.messages), current_step)) + msg = u"Errors: {} on {}. On \"ManagementForm data is " \ + u"missing or...\" error verify the wizard_name or " \ + u"step name".format(u" - ".join(e.messages), + current_step) + raise ValidationError(msg) self.check_response(response, current_step) if next_form_is_checked: next_form = self.steps[idx + 1][0] self.assertRedirects( response, - '/{}/{}'.format(self.url_name, next_form)) + '/{}/{}'.format(self.url_name, next_form), + msg_prefix="Redirection to {} has failed - " + "Error on previous form ({})?".format( + next_form, current_step) + ) if idx == len(self.steps) - 1: # last form self.assertRedirects( -- cgit v1.2.3