diff --git a/core/forms/__init__.py b/core/forms/__init__.py index abff8ed9..3026ece1 100644 --- a/core/forms/__init__.py +++ b/core/forms/__init__.py @@ -1,20 +1,18 @@ from .cohort import CohortForm, CohortFormEdit from .contact import ContactForm, PickContactForm from .contract import ContractForm, ContractFormEdit, PartnerRoleForm +from .dataset import DatasetForm, SkipFieldValidationMixin +from .use_restriction import UseRestrictionForm from .data_declaration import DataDeclarationForm, DataDeclarationSubFormOther, DataDeclarationSubFormNew, \ DataDeclarationEditForm, DataDeclarationSubFormFromExisting -from .dataset import DatasetForm from .document import DocumentForm from .partner import PartnerForm from .permission import UserPermFormSet from .legal_basis import LegalBasisForm from .publication import PublicationForm, PickPublicationForm from .share import ShareForm -from .use_restriction import UseRestrictionForm from .access import AccessForm - - __all__ = [ "ContractForm", "ContractFormEdit", @@ -38,4 +36,5 @@ "PickPublicationForm", "UseRestrictionForm", "AccessForm", + "SkipFieldValidationMixin", ] diff --git a/core/forms/access.py b/core/forms/access.py index 5caed33e..48f2e8f8 100644 --- a/core/forms/access.py +++ b/core/forms/access.py @@ -1,6 +1,6 @@ from django.forms import ModelForm, DateInput, Textarea -from core.forms.dataset import SkipFieldValidationMixin +from core.forms import SkipFieldValidationMixin from core.models import Access diff --git a/core/forms/data_declaration.py b/core/forms/data_declaration.py index 52df957a..2d4f62e0 100644 --- a/core/forms/data_declaration.py +++ b/core/forms/data_declaration.py @@ -3,8 +3,8 @@ from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy -from core.forms.dataset import SkipFieldValidationMixin -from core.forms.use_restriction import UseRestrictionForm +from core.forms import SkipFieldValidationMixin +from core.forms import UseRestrictionForm from core.models import DataDeclaration, Partner, Contract, GDPRRole from core.models.contract import PartnerRole diff --git a/core/forms/dataset.py b/core/forms/dataset.py index 7e62ef73..4da7256b 100644 --- a/core/forms/dataset.py +++ b/core/forms/dataset.py @@ -1,5 +1,4 @@ from django import forms -from django.core.exceptions import ObjectDoesNotExist from django.shortcuts import get_object_or_404 from django.forms import ValidationError from core.models import Dataset, User, Project diff --git a/core/forms/legal_basis.py b/core/forms/legal_basis.py index e62e3ca3..f80f4e98 100644 --- a/core/forms/legal_basis.py +++ b/core/forms/legal_basis.py @@ -1,6 +1,6 @@ from django.forms import ModelForm -from core.forms.dataset import SkipFieldValidationMixin +from core.forms import SkipFieldValidationMixin from core.models import LegalBasis diff --git a/core/forms/storage_location.py b/core/forms/storage_location.py index 1ccfa986..8b2e4406 100644 --- a/core/forms/storage_location.py +++ b/core/forms/storage_location.py @@ -1,7 +1,7 @@ from django import forms -from core.forms.dataset import SkipFieldValidationMixin -from core.models.storage_location import DataLocation +from core.forms import SkipFieldValidationMixin +from core.models import DataLocation class StorageLocationForm(SkipFieldValidationMixin, forms.ModelForm): diff --git a/web/tests/test_dataset.py b/web/tests/test_dataset.py index d439b025..bf9dd008 100644 --- a/web/tests/test_dataset.py +++ b/web/tests/test_dataset.py @@ -1,3 +1,7 @@ +import random +import pytest +from core.models import Dataset, DataDeclaration, DataLocation, LegalBasisType, LegalBasis, Access +from test.factories import UserFactory, VIPGroup, StorageResourceFactory, LegalBasisFactory from django.urls import reverse @@ -9,3 +13,93 @@ def test_get_dataset_add(client_user_normal): # url = reverse('dataset_wizard') # response = client_user_normal.get(url, ) # assert response.status_code == 302, "should redirect to first wizard step" + + +@pytest.mark.django_db +def test_dataset_wizard_form(client_user_normal): + vip_user = UserFactory.create(groups=[VIPGroup()], first_name='Rebecca', last_name='Kafe') + storage_backend = StorageResourceFactory.create(name='test_backend', managed_by='test') + legal_basis_type = LegalBasisType(name='test_legal_basis', code='test') + legal_basis_type.save() + + skip_wizard = { + 'data_declaration': random.choice([True, False]), + 'storage_location': random.choice([True, False]), + 'access': random.choice([True, False]), + 'legal_basis': random.choice([True, False]), + } + wizard_test_data = { + 'dataset': [ + { + 'dataset-local_custodians': [vip_user.id], + 'dataset-title': ['Hello Dataset'], + 'dataset-project': [], + 'dataset-comments': ['A comment'], + 'dataset_wizard_view-current_step': ['dataset'] + }, + Dataset, + ], + 'data_declaration': [ + { + 'data_declaration-title': ['Data declaration title'], + 'data_declaration-type': ['2'], + 'comment': ['Other provenance'], + 'dataset_wizard_view-current_step': ['data_declaration'], + 'data_declaration-skip_wizard': [skip_wizard['data_declaration']], + }, + DataDeclaration, + ], + 'storage_location': [ + { + 'storage_location-category': ['master'], + 'storage_location-backend': [storage_backend.id], + 'storage_location-data_declarations': [] if skip_wizard['data_declaration'] else ['1'], + 'storage_location-datatypes': [], + 'storage_location-location_description': ['hello'], + 'dataset_wizard_view-current_step': ['storage_location'], + 'storage_location-skip_wizard': [skip_wizard['storage_location']], + }, + DataLocation, + ], + 'legal_basis': [ + { + 'legal_basis-data_declarations': [] if skip_wizard['data_declaration'] else ['1'], + 'legal_basis-legal_basis_types': [legal_basis_type.id], + 'legal_basis-personal_data_types': [], + 'legal_basis-remarks': ['Legal basis comment'], + 'dataset_wizard_view-current_step': ['legal_basis'], + 'legal_basis-skip_wizard': [skip_wizard['legal_basis']] + }, + LegalBasis, + ], + 'access': [ + { + 'access-contact': [], + 'access-user': [vip_user.id], + 'access-project': [''], + 'access-granted_on': [''], + 'access-grant_expires_on': [''], + 'access-access_notes': ['ssq'], + 'dataset_wizard_view-current_step': ['access'], + 'access-skip_wizard': [skip_wizard['access']] + }, + Access, + ], + } + + for step_name, step_data in wizard_test_data.items(): + form_data, Model = step_data + response = client_user_normal.post(reverse('wizard'), form_data) + + if step_name != 'dataset': + skip_wizard_value = form_data[f'{step_name}-skip_wizard'][0] + if skip_wizard_value: + assert Model.objects.all().count() == 0 + else: + assert Model.objects.all().count() == 1 + + if step_name == 'access': + dataset = Dataset.objects.get(title='Hello Dataset') + redirect_url = response.url + expected_url = reverse('dataset', kwargs={'pk': dataset.id}) + assert redirect_url == expected_url diff --git a/web/views/datasets.py b/web/views/datasets.py index fbc8fb25..bdd2e6e4 100644 --- a/web/views/datasets.py +++ b/web/views/datasets.py @@ -31,9 +31,6 @@ class DatasetWizardView(NamedUrlSessionWizardView): ] def render_done(self, form, **kwargs): - if kwargs.get('step', None) != self.done_step_name: - return redirect(self.get_step_url(self.done_step_name)) - dataset_id = self.storage.extra_data.get('dataset_id') self.storage.reset() if dataset_id: @@ -115,7 +112,8 @@ def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['is_admin'] = self.request.user.is_admin_of_dataset(self.object) context['can_edit'] = self.request.user.can_edit_dataset(self.object) - context['can_see_protected'] = self.request.user.has_permission_on_object(f'core.{Permissions.PROTECTED.value}_dataset', self.object) + context['can_see_protected'] = self.request.user.has_permission_on_object( + f'core.{Permissions.PROTECTED.value}_dataset', self.object) context['company_name'] = COMPANY context['exposure_list'] = Exposure.objects.filter(dataset=self.object) return context @@ -128,7 +126,6 @@ class DatasetEditView(CheckerMixin, UpdateView): permission_required = Permissions.EDIT permission_target = 'dataset' - def get_initial(self): initial = super().get_initial() project_id = self.object.project.id if self.object.project else None @@ -162,7 +159,7 @@ def dataset_list(request): 'facets': facet_view_utils.filter_empty_facets(datasets.facet_counts()), 'query': query or '', 'title': 'Datasets', - 'help_text' : Dataset.AppMeta.help_text, + 'help_text': Dataset.AppMeta.help_text, 'search_url': 'datasets', 'add_url': 'dataset_add', 'data': {'datasets': datasets},