diff --git a/.travis.yml b/.travis.yml index 0312a328..a76e5a55 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,6 @@ script: - docker-compose exec $CONTAINER pre-commit run --all-files --show-diff-on-failure - docker-compose exec $CONTAINER coverage run --omit=aurora/bag_transfer/migrations manage.py test after_script: - - docker-compose exec $CONTAINER coverage report -m + - docker-compose exec $CONTAINER coverage report --omit=bag_transfer/migrations/* -m notifications: email: false diff --git a/aurora/bag_transfer/accession/views.py b/aurora/bag_transfer/accession/views.py index 618763d5..31044882 100644 --- a/aurora/bag_transfer/accession/views.py +++ b/aurora/bag_transfer/accession/views.py @@ -18,8 +18,8 @@ from django.contrib import messages from django.db.models import CharField, F from django.db.models.functions import Concat -from django.shortcuts import redirect, render, reverse -from django.views.generic import DetailView, ListView +from django.shortcuts import reverse +from django.views.generic import CreateView, DetailView, ListView from django_datatables_view.base_datatable_view import BaseDatatableView @@ -85,40 +85,38 @@ def get_page_title(self, context): return context["object"].title -class AccessionCreateView(PageTitleMixin, AccessioningArchivistMixin, JSONResponseMixin, ListView): +class AccessionCreateView(PageTitleMixin, AccessioningArchivistMixin, JSONResponseMixin, CreateView): template_name = "accession/create.html" page_title = "Create Accession Record" model = Accession form_class = AccessionForm - def post(self, request, *args, **kwargs): - """Saves accessions, and delivers data to DELIVERY_URL if configured.""" - form = self.form_class(request.POST) - creators_formset = CreatorsFormSet(request.POST) - id_list = list(map(int, request.GET.get("transfers").split(","))) + def get_success_url(self): + return reverse("accession:detail", kwargs={"pk": self.object.pk}) + + def form_valid(self, form): + """Saves associated formsets and delivers accession data.""" + creators_formset = CreatorsFormSet(self.request.POST) + id_list = list(map(int, self.request.GET.get("transfers").split(","))) transfers_list = Transfer.objects.filter(pk__in=id_list) rights_statements = ( RightsStatement.objects.filter(transfer__in=id_list) .annotate(rights_group=F("rights_basis")) - .order_by("rights_group") - ) - if form.is_valid() and creators_formset.is_valid(): + .order_by("rights_group")) + if creators_formset.is_valid(): form.process_status = Accession.CREATED accession = form.save() creators_formset.save() self.update_accession_rights(RightsStatement.merge_rights(rights_statements), accession) self.update_accession_transfers(transfers_list, accession) - messages.success(request, "
Accession created successfully!") + messages.success(self.request, "
Accession created successfully!") if settings.DELIVERY_URL: try: accession_data = AccessionSerializer( - accession, context={"request": request} - ) + accession, context={"request": self.request}) resp = requests.post( settings.DELIVERY_URL, - data=json.dumps( - accession_data.data, indent=4, sort_keys=True, default=str - ), + data=json.dumps(accession_data.data, default=str), headers={ "Content-Type": "application/json", "apikey": settings.API_KEY, @@ -127,27 +125,14 @@ def post(self, request, *args, **kwargs): resp.raise_for_status() accession.process_status = Accession.DELIVERED accession.save() - messages.success(request, "Accession data delivered.") + messages.success(self.request, "Accession data delivered.") except Exception as e: - messages.error( - request, "Error delivering accession data: {}".format(e) - ) - return redirect("accession:detail", accession.pk) + messages.error(self.request, "Error delivering accession data: {}".format(e)) + return super().form_valid(form) messages.error( - request, - "There was a problem with your submission. Please correct the error(s) below and try again.", - ) - return render( - request, - self.template_name, - { - "page_title": "Create Accession Record", - "form": form, - "creators_formset": creators_formset, - "rights_statements": rights_statements, - "transfers": transfers_list, - }, - ) + self.request, + "There was a problem with your submission. Please correct the error(s) below and try again.") + return super().form_invalid() def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) diff --git a/aurora/bag_transfer/migrations/0035_auto_20210719_1528.py b/aurora/bag_transfer/migrations/0035_auto_20210719_1528.py index 2e9cf2ac..3cb5b7a3 100644 --- a/aurora/bag_transfer/migrations/0035_auto_20210719_1528.py +++ b/aurora/bag_transfer/migrations/0035_auto_20210719_1528.py @@ -7,7 +7,7 @@ class Migration(migrations.Migration): dependencies = [ - ('bag_transfer', '0034_auto_20210706_1512'), + ('bag_transfer', '0035_auto_20210719_1454'), ] operations = [ diff --git a/aurora/bag_transfer/orgs/urls.py b/aurora/bag_transfer/orgs/urls.py index 96a5bfc9..2a30aa9e 100644 --- a/aurora/bag_transfer/orgs/urls.py +++ b/aurora/bag_transfer/orgs/urls.py @@ -1,6 +1,7 @@ from bag_transfer.orgs.views import (BagItProfileAPIAdminView, + BagItProfileCreateView, BagItProfileDetailView, - BagItProfileManageView, + BagItProfileUpdateView, OrganizationCreateView, OrganizationDetailView, OrganizationEditView, @@ -16,7 +17,7 @@ url(r"^(?P\d+)/edit/$", OrganizationEditView.as_view(), name="edit"), url( r"^(?P\d+)/bagit_profiles/add/$", - BagItProfileManageView.as_view(), + BagItProfileCreateView.as_view(), name="bagit-profiles-add", ), url( @@ -26,7 +27,7 @@ ), url( r"^(?P\d+)/bagit_profile/edit$", - BagItProfileManageView.as_view(), + BagItProfileUpdateView.as_view(), name="bagit-profiles-edit", ), url( diff --git a/aurora/bag_transfer/orgs/views.py b/aurora/bag_transfer/orgs/views.py index c902d079..80f9e180 100644 --- a/aurora/bag_transfer/orgs/views.py +++ b/aurora/bag_transfer/orgs/views.py @@ -16,7 +16,7 @@ from django.contrib import messages from django.contrib.messages.views import SuccessMessageMixin from django.http import Http404 -from django.shortcuts import get_object_or_404, redirect, render +from django.shortcuts import get_object_or_404 from django.urls import reverse from django.views.generic import (CreateView, DetailView, ListView, TemplateView, UpdateView) @@ -74,9 +74,10 @@ class OrganizationListView(PageTitleMixin, ArchivistMixin, ListView): model = Organization -class BagItProfileManageView(PageTitleMixin, TemplateView): +class BagItProfileManageView(PageTitleMixin): template_name = "bagit_profiles/manage.html" model = BagItProfile + form_class = BagItProfileForm def get_page_title(self, context): organization = get_object_or_404(Organization, pk=self.kwargs.get("pk")) @@ -106,97 +107,70 @@ def get_context_data(self, **kwargs): context["organization"] = organization return context - def post(self, request, *args, **kwargs): + def get_success_url(self): + return reverse("orgs:detail", kwargs={"pk": self.kwargs.get("pk")}) + + def form_valid(self, form): + """Saves associated formsets.""" organization = get_object_or_404(Organization, pk=self.kwargs.get("pk")) - instance = organization.bagit_profile - form = BagItProfileForm(request.POST, instance=instance) - if form.is_valid(): - bagit_profile = instance if instance else form.save() - bag_info_formset = BagItProfileBagInfoFormset( - request.POST, instance=bagit_profile, prefix="bag_info") - manifests_allowed_formset = ManifestsAllowedFormset( - request.POST, instance=bagit_profile, prefix="manifests_allowed") - manifests_formset = ManifestsRequiredFormset( - request.POST, instance=bagit_profile, prefix="manifests") - serialization_formset = AcceptSerializationFormset( - request.POST, instance=bagit_profile, prefix="serialization") - version_formset = AcceptBagItVersionFormset( - request.POST, instance=bagit_profile, prefix="version") - tag_manifests_formset = TagManifestsRequiredFormset( - request.POST, instance=bagit_profile, prefix="tag_manifests") - tag_files_formset = TagFilesRequiredFormset( - request.POST, instance=bagit_profile, prefix="tag_files") - forms_to_save = [ - bag_info_formset, - manifests_allowed_formset, - manifests_formset, - serialization_formset, - version_formset, - tag_manifests_formset, - tag_files_formset, - ] - for formset in forms_to_save: - if not formset.is_valid(): - messages.error( - request, - "There was a problem with your submission. Please correct the error(s) below and try again.", - ) - return render( - request, - self.template_name, - { - "organization": organization, - "form": form, - "bag_info_formset": bag_info_formset, - "manifests_allowed_formset": manifests_allowed_formset, - "manifests_formset": manifests_formset, - "serialization_formset": serialization_formset, - "version_formset": version_formset, - "tag_manifests_formset": tag_manifests_formset, - "tag_files_formset": tag_files_formset, - }, - ) - for formset in forms_to_save: + bagit_profile = form.save() + bag_info_formset = BagItProfileBagInfoFormset( + self.request.POST, instance=bagit_profile, prefix="bag_info") + manifests_allowed_formset = ManifestsAllowedFormset( + self.request.POST, instance=bagit_profile, prefix="manifests_allowed") + manifests_formset = ManifestsRequiredFormset( + self.request.POST, instance=bagit_profile, prefix="manifests") + serialization_formset = AcceptSerializationFormset( + self.request.POST, instance=bagit_profile, prefix="serialization") + version_formset = AcceptBagItVersionFormset( + self.request.POST, instance=bagit_profile, prefix="version") + tag_manifests_formset = TagManifestsRequiredFormset( + self.request.POST, instance=bagit_profile, prefix="tag_manifests") + tag_files_formset = TagFilesRequiredFormset( + self.request.POST, instance=bagit_profile, prefix="tag_files") + forms_to_save = [ + bag_info_formset, + manifests_allowed_formset, + manifests_formset, + serialization_formset, + version_formset, + tag_manifests_formset, + tag_files_formset, + ] + for formset in forms_to_save: + if not formset.is_valid(): + messages.error( + self.request, + "There was a problem with your submission. Please correct the error(s) below and try again.") + return super().form_invalid(form) + else: formset.save() - bagit_profile.version = bagit_profile.version + Decimal(1) - bagit_profile.bagit_profile_identifier = request.build_absolute_uri( - reverse( - "bagitprofile-detail", - kwargs={"pk": bagit_profile.id, "format": "json"}, - ) - ) - bagit_profile.save_to_org(organization) - messages.success( - request, - "BagIt Profile for {} saved".format(organization.name), + bagit_profile.version = bagit_profile.version + Decimal(1) + bagit_profile.bagit_profile_identifier = self.request.build_absolute_uri( + reverse( + "bagitprofile-detail", + kwargs={"pk": bagit_profile.id, "format": "json"}, ) - return redirect("orgs:detail", organization.pk) - messages.error( - request, - "There was a problem with your submission. Please correct the error(s) below and try again.", - ) - return render( - request, - self.template_name, - { - "form": BagItProfileForm(request.POST, instance=instance), - "organization": Organization.objects.get(pk=self.kwargs.get("pk")), - "bag_info_formset": BagItProfileBagInfoFormset( - request.POST, prefix="bag_info"), - "manifests_allowed_formset": ManifestsAllowedFormset( - request.POST, prefix="manifests_allowed"), - "manifests_formset": ManifestsRequiredFormset( - request.POST, prefix="manifests"), - "serialization_formset": AcceptSerializationFormset( - request.POST, prefix="serialization"), - "version_formset": AcceptBagItVersionFormset( - request.POST, prefix="version"), - "tag_manifests_formset": TagManifestsRequiredFormset( - request.POST, prefix="tag_manifests"), - "tag_files_formset": TagFilesRequiredFormset( - request.POST, prefix="tag_files"), - }, ) + bagit_profile.save_to_org(organization) + messages.success( + self.request, + "BagIt Profile for {} saved".format(organization.name)) + return super().form_valid(form) + + def form_invalid(self, form): + messages.error( + self.request, + "There was a problem with your submission. Please correct the error(s) below and try again.") + return super().form_invalid(form) + + +class BagItProfileCreateView(BagItProfileManageView, CreateView): + pass + + +class BagItProfileUpdateView(BagItProfileManageView, UpdateView): + pass class BagItProfileDetailView(PageTitleMixin, OrgReadViewMixin, DetailView): diff --git a/aurora/bag_transfer/rights/urls.py b/aurora/bag_transfer/rights/urls.py index aa860b31..41639406 100644 --- a/aurora/bag_transfer/rights/urls.py +++ b/aurora/bag_transfer/rights/urls.py @@ -1,13 +1,13 @@ -from bag_transfer.rights.views import (RightsAPIAdminView, RightsDetailView, - RightsManageView) +from bag_transfer.rights.views import (RightsAPIAdminView, RightsCreateView, + RightsDetailView, RightsUpdateView) from django.conf.urls import url app_name = 'rights' urlpatterns = [ - url(r"^add/$", RightsManageView.as_view(), name="add"), + url(r"^add/$", RightsCreateView.as_view(), name="add"), url(r"^(?P\d+)/$", RightsDetailView.as_view(), name="detail"), - url(r"^(?P\d+)/edit$", RightsManageView.as_view(), name="edit"), + url(r"^(?P\d+)/edit$", RightsUpdateView.as_view(), name="edit"), url( r"^(?P\d+)/(?P(delete))/$", RightsAPIAdminView.as_view(), name="api" ), diff --git a/aurora/bag_transfer/rights/views.py b/aurora/bag_transfer/rights/views.py index d973aa67..e86d3f7e 100644 --- a/aurora/bag_transfer/rights/views.py +++ b/aurora/bag_transfer/rights/views.py @@ -12,11 +12,14 @@ from bag_transfer.rights.models import RecordType, RightsStatement from django.contrib import messages from django.http import Http404 -from django.shortcuts import get_object_or_404, redirect, render -from django.views.generic import CreateView, DetailView, TemplateView +from django.shortcuts import get_object_or_404 +from django.urls import reverse +from django.views.generic import (CreateView, DetailView, TemplateView, + UpdateView) -class RightsManageView(PageTitleMixin, ManagingArchivistMixin, CreateView): +class RightsManageView(PageTitleMixin, ManagingArchivistMixin): + """Base class for creating or updating Rights Statements.""" template_name = "rights/manage.html" model = RightsStatement form_class = RightsForm @@ -24,7 +27,11 @@ class RightsManageView(PageTitleMixin, ManagingArchivistMixin, CreateView): def get_page_title(self, context): return "Edit Rights Statement" if self.kwargs.get("pk") else "Create New Rights Statement" + def get_success_url(self): + return reverse("orgs:detail", kwargs={"pk": self.object.organization.pk}) + def get_formset(self, rights_basis): + """Get the correct formset for a rights basis.""" if rights_basis == "Copyright": return {"key": "copyright_form", "class": CopyrightFormSet} elif rights_basis == "License": @@ -35,6 +42,7 @@ def get_formset(self, rights_basis): return {"key": "other_form", "class": OtherFormSet} def get_applies_to_type_choices(self, organization): + """Return applies_to_type_choices for an organization.""" values = BagItProfileBagInfoValues.objects.filter( bagit_profile_baginfo__in=BagItProfileBagInfo.objects.filter( bagit_profile=organization.bagit_profile, @@ -45,103 +53,86 @@ def get_applies_to_type_choices(self, organization): applies_to_type_choices.append((record_type.pk, record_type.name)) return sorted(applies_to_type_choices, key=itemgetter(1)) - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - if self.kwargs.get("pk"): - rights_statement = RightsStatement.objects.get(pk=self.kwargs.get("pk")) - organization = rights_statement.organization - applies_to_type_choices = self.get_applies_to_type_choices(organization) - formset_data = self.get_formset(rights_statement.rights_basis) - formset = formset_data["class"](instance=rights_statement) - basis_form = RightsForm( - applies_to_type_choices=applies_to_type_choices, - instance=rights_statement, - organization=organization) - context[formset_data["key"]] = formset - context["granted_formset"] = RightsGrantedFormSet(instance=rights_statement) - else: - organization = Organization.objects.get(pk=self.request.GET.get("org")) - applies_to_type_choices = self.get_applies_to_type_choices(organization) - basis_form = RightsForm( - applies_to_type_choices=applies_to_type_choices, - organization=organization) - context["copyright_form"] = CopyrightFormSet() - context["license_form"] = LicenseFormSet() - context["statute_form"] = StatuteFormSet() - context["other_form"] = OtherFormSet() - context["granted_formset"]: RightsGrantedFormSet() - context["basis_form"] = basis_form - context["organization"] = organization - return context - - def post(self, request, *args, **kwargs): - applies_to_type = request.POST.getlist("applies_to_type") - - if not self.kwargs.get("pk"): - organization = Organization.objects.get(pk=self.request.GET.get("org")) - applies_to_type_choices = self.get_applies_to_type_choices(organization) - form = RightsForm( - request.POST, - applies_to_type_choices=applies_to_type_choices, - organization=organization) - if not form.is_valid(): - messages.error( - request, - "There was a problem with your submission. Please correct the error(s) below and try again.") - return render( - request, - self.template_name, - { - "copyright_form": CopyrightFormSet(), - "license_form": LicenseFormSet(), - "statute_form": StatuteFormSet(), - "other_form": OtherFormSet(), - "organization": organization, - "basis_form": form, - }, - ) - rights_statement = form.save(commit=False) - else: - rights_statement = RightsStatement.objects.get(pk=self.kwargs.get("pk")) - organization = rights_statement.organization - applies_to_type_choices = self.get_applies_to_type_choices(organization) - + def save_formsets(self, form, rights_statement, organization): + """Saves formsets associated with a rights statement.""" formset_data = self.get_formset(rights_statement.rights_basis) - basis_formset = formset_data["class"](request.POST, instance=rights_statement) + basis_formset = formset_data["class"](self.request.POST, instance=rights_statement) rights_granted_formset = RightsGrantedFormSet( - request.POST, instance=rights_statement) + self.request.POST, instance=rights_statement) for formset in [rights_granted_formset, basis_formset]: if not formset.is_valid(): messages.error( - request, + self.request, "There was a problem with your submission. Please correct the error(s) below and try again.") - form = RightsForm( - request.POST, - applies_to_type_choices=applies_to_type_choices, - organization=organization) - return render( - request, - self.template_name, - { - formset_data["key"]: formset_data["class"](request.POST), - "organization": organization, - "basis_form": form, - "granted_formset": rights_granted_formset, - }, - ) + return super().form_invalid(form) rights_statement.save() rights_statement.applies_to_type.clear() - for record_type in applies_to_type: + for record_type in self.request.POST.getlist("applies_to_type"): rights_statement.applies_to_type.add(record_type) rights_statement.save() for formset in [rights_granted_formset, basis_formset]: formset.save() - messages.success(request, "Rights statement saved!") - return redirect("orgs:detail", organization.pk) + messages.success(self.request, "Rights statement saved!") + return super().form_valid(form) + + +class RightsCreateView(RightsManageView, CreateView): + """Create Rights Statements.""" + + def get_context_data(self, **kwargs): + """Adds formsets to context data.""" + context = super().get_context_data(**kwargs) + organization = Organization.objects.get(pk=self.request.GET.get("org")) + applies_to_type_choices = self.get_applies_to_type_choices(organization) + basis_form = RightsForm( + applies_to_type_choices=applies_to_type_choices, + organization=organization) + context["copyright_form"] = CopyrightFormSet() + context["license_form"] = LicenseFormSet() + context["statute_form"] = StatuteFormSet() + context["other_form"] = OtherFormSet() + context["granted_formset"]: RightsGrantedFormSet() + context["basis_form"] = basis_form + context["organization"] = organization + return context + + def form_valid(self, form): + """Sets variables needed in formsets.""" + rights_statement = form.save(commit=False) + organization = Organization.objects.get(pk=self.request.GET.get("org")) + return self.save_formsets(form, rights_statement, organization) + + +class RightsUpdateView(RightsManageView, UpdateView): + """Update Rights Statements.""" + + def get_context_data(self, **kwargs): + """Adds formsets to context data.""" + context = super().get_context_data(**kwargs) + rights_statement = RightsStatement.objects.get(pk=self.kwargs.get("pk")) + organization = rights_statement.organization + applies_to_type_choices = self.get_applies_to_type_choices(organization) + formset_data = self.get_formset(rights_statement.rights_basis) + formset = formset_data["class"](instance=rights_statement) + basis_form = RightsForm( + applies_to_type_choices=applies_to_type_choices, + instance=rights_statement, + organization=organization) + context[formset_data["key"]] = formset + context["granted_formset"] = RightsGrantedFormSet(instance=rights_statement) + context["basis_form"] = basis_form + context["organization"] = organization + return context + + def form_valid(self, form): + """Sets variables needed in formsets.""" + rights_statement = RightsStatement.objects.get(pk=self.kwargs.get("pk")) + organization = rights_statement.organization + return self.save_formsets(form, rights_statement, organization) class RightsAPIAdminView(ManagingArchivistMixin, JSONResponseMixin, TemplateView): diff --git a/aurora/bag_transfer/test/helpers.py b/aurora/bag_transfer/test/helpers.py index fb2f18a9..586c73be 100644 --- a/aurora/bag_transfer/test/helpers.py +++ b/aurora/bag_transfer/test/helpers.py @@ -127,14 +127,13 @@ def create_test_record_types(record_types=None): """Creates a RecordType object for each value in list provided. If no list is given, RecordTypes are create for each item in a default list.""" objects = [] - if record_types is None: - record_types = [ - "administrative records", - "board materials", - "communications and publications", - "grant records", - "annual reports", - ] + record_types = record_types if record_types else [ + "administrative records", + "board materials", + "communications and publications", + "grant records", + "annual reports", + ] for record_type in record_types: object = RecordType.objects.create(name=record_type) objects.append(object) diff --git a/aurora/bag_transfer/test/test_api.py b/aurora/bag_transfer/test/test_api.py index e3aa36a8..24db3f96 100644 --- a/aurora/bag_transfer/test/test_api.py +++ b/aurora/bag_transfer/test/test_api.py @@ -76,7 +76,7 @@ def test_validation(self): for statement in rights_statements.json(): self.assertTrue(is_valid(statement, "rights_statement.json")) for queryset, view, schema in [ - (Archives.objects.filter(process_status__gte=Archives.ACCESSIONING_STARTED), "archives-detail", "aurora_bag"), + (Transfer.objects.filter(process_status__gte=Transfer.ACCESSIONING_STARTED), "transfer-detail", "aurora_bag"), (Accession.objects.all(), "accession-detail", "accession")]: for obj in queryset: data = self.client.get(reverse(view, kwargs={"pk": obj.pk})).json() diff --git a/aurora/bag_transfer/test/test_bagitprofiles.py b/aurora/bag_transfer/test/test_bagitprofiles.py index 074c9f20..0da4e9db 100644 --- a/aurora/bag_transfer/test/test_bagitprofiles.py +++ b/aurora/bag_transfer/test/test_bagitprofiles.py @@ -56,20 +56,27 @@ def test_views(self): "manifests_allowed-INITIAL_FORMS": 0, "manifests_allowed-0-name": random.choice(["sha256", "sha512"]), } + previous_len = len(BagItProfile.objects.all()) self.assert_status_code( "post", reverse("orgs:bagit-profiles-add", kwargs={"pk": org.pk}), 302, data=data) org.refresh_from_db() self.assertIsNot(None, org.bagit_profile, "BagIt profile was not assigned to organization") + self.assertEqual( + previous_len + 1, len(BagItProfile.objects.all()), + "Expected 1 new BagIt Profile to be created, found {}".format(len(BagItProfile.objects.all()) - previous_len)) external_description = helpers.random_string(150) data["external_description"] = external_description self.assert_status_code( - "post", reverse("orgs:bagit-profiles-add", kwargs={"pk": org.pk}), + "post", reverse("orgs:bagit-profiles-edit", kwargs={"pk": org.pk}), 302, data=data) self.assertIsNot(None, org.bagit_profile, "BagIt profile not assigned to organization") org.refresh_from_db() self.assertEqual(org.bagit_profile.external_description, external_description, "External Description was not updated") + self.assertEqual( + previous_len + 1, len(BagItProfile.objects.all()), + "A new BagIt Profile was unexpectedly created") delete_request = self.assert_status_code( "get", @@ -82,8 +89,8 @@ def test_views(self): self.assert_status_code( "get", reverse("orgs:bagit-profiles-api", kwargs={"pk": org.pk, "action": "delete"}), 404) - profile = random.choice(BagItProfile.objects.all()) - self.assert_status_code("get", reverse("orgs:bagit-profiles-detail", kwargs={"pk": profile.source_organization.pk}), 200) + org = random.choice(Organization.objects.filter(bagit_profile__isnull=False)) + self.assert_status_code("get", reverse("orgs:bagit-profiles-detail", kwargs={"pk": org.pk}), 200) def test_save_to_org(self): """Asserts that the `save_to_org` method works as intended""" diff --git a/aurora/bag_transfer/test/test_users.py b/aurora/bag_transfer/test/test_users.py index ac027599..e044b6a4 100644 --- a/aurora/bag_transfer/test/test_users.py +++ b/aurora/bag_transfer/test/test_users.py @@ -96,10 +96,11 @@ def test_user_views(self): "is_active": True, "first_name": "John", "last_name": "Doe", + "username": "jdoe", "email": "test@example.org", "organization": random.choice(Organization.objects.all()).pk } - self.assert_status_code("post", reverse("users:add"), 200, data=user_data) + self.assert_status_code("post", reverse("users:add"), 302, data=user_data) user_data["active"] = False self.assert_status_code( "post", reverse("users:edit", kwargs={"pk": random.choice(User.objects.all()).pk}), 200, data=user_data) diff --git a/aurora/bag_transfer/users/views.py b/aurora/bag_transfer/users/views.py index 35506ea1..c3315164 100644 --- a/aurora/bag_transfer/users/views.py +++ b/aurora/bag_transfer/users/views.py @@ -1,5 +1,3 @@ -from socket import gaierror - from bag_transfer.lib.RAC_CMD import set_server_password from bag_transfer.mixins.authmixins import (ArchivistMixin, ManagingArchivistMixin, @@ -53,21 +51,19 @@ class UsersCreateView(PageTitleMixin, ManagingArchivistMixin, SuccessMessageMixi def get_success_url(self): return reverse("users:detail", kwargs={"pk": self.object.pk}) - def post(self, request, *args, **kwargs): - """Send password reset email so user changes automatically-generated - random password.""" - post = super(UsersCreateView, self).post(request, *args, **kwargs) - form = PasswordResetForm({"email": request.POST.get("email")}) - if form.is_valid(): + def form_valid(self, form): + """Set a random password to and send a password reset email.""" + password_form = PasswordResetForm({"email": self.request.POST.get("email")}) + if password_form.is_valid(): try: - form.save( + password_form.save( request=self.request, subject_template_name="users/password_initial_set_subject.txt", email_template_name="users/password_initial_set_email.html", ) - except gaierror: - messages.error(request, "Unable to send email to new user because SMTP settings are not properly configured.") - return post + except Exception: + messages.error(self.request, "Unable to send email to new user because SMTP settings are not properly configured.") + return super().form_valid(form) class UsersDetailView(PageTitleMixin, OrgReadViewMixin, DetailView): @@ -76,7 +72,7 @@ class UsersDetailView(PageTitleMixin, OrgReadViewMixin, DetailView): model = User def get_context_data(self, **kwargs): - context = super(UsersDetailView, self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) context["uploads"] = [] transfers = Transfer.objects.filter( process_status__gte=Transfer.TRANSFER_COMPLETED, @@ -118,9 +114,9 @@ def get_success_url(self): return reverse("users:detail", kwargs={"pk": self.request.user.pk}) def form_valid(self, form): - result = super(UserPasswordChangeView, self).form_valid(form) + """Set the user's server password.""" set_server_password(form.user.username, form.cleaned_data["new_password1"]) - return result + return super().form_valid(form) class UserPasswordResetView(PageTitleMixin, AnonymousRequiredMixin, PasswordResetView): @@ -140,9 +136,9 @@ class UserPasswordResetConfirmView(PageTitleMixin, AnonymousRequiredMixin, Passw form_class = UserSetPasswordForm def form_valid(self, form): - results = super(UserPasswordResetConfirmView, self).form_valid(form) + """Set the user's server password.""" set_server_password(form.user.username, form.cleaned_data["new_password1"]) - return results + return super().form_valid(form) class UserPasswordResetCompleteView(PageTitleMixin, AnonymousRequiredMixin, PasswordResetCompleteView):