diff --git a/accessibility_monitoring_platform/apps/audits/forms.py b/accessibility_monitoring_platform/apps/audits/forms.py index bbdac1790..5e7b3d0f1 100644 --- a/accessibility_monitoring_platform/apps/audits/forms.py +++ b/accessibility_monitoring_platform/apps/audits/forms.py @@ -548,6 +548,23 @@ class Meta: ] +class AuditRetestPageUpdateForm(forms.ModelForm): + """Form for updating a page at 12-week retest""" + + updated_url = AMPURLField(label="New URL of page if changed") + + class Meta: + model = Page + fields = [ + "updated_url", + ] + + +AuditRetestPageFormset: forms.formsets.BaseFormSet = forms.modelformset_factory( + Page, AuditRetestPageUpdateForm, extra=0 +) + + class AuditRetestPageChecksForm(forms.Form): """ Form for retesting checks for a page diff --git a/accessibility_monitoring_platform/apps/audits/migrations/0012_page_updated_url.py b/accessibility_monitoring_platform/apps/audits/migrations/0012_page_updated_url.py new file mode 100644 index 000000000..5dd44bafa --- /dev/null +++ b/accessibility_monitoring_platform/apps/audits/migrations/0012_page_updated_url.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.4 on 2024-12-31 08:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("audits", "0011_remove_audit_accessibility_statement_backup_url_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="page", + name="updated_url", + field=models.TextField(blank=True, default=""), + ), + ] diff --git a/accessibility_monitoring_platform/apps/audits/models.py b/accessibility_monitoring_platform/apps/audits/models.py index 05eb7e459..18457e457 100644 --- a/accessibility_monitoring_platform/apps/audits/models.py +++ b/accessibility_monitoring_platform/apps/audits/models.py @@ -121,7 +121,7 @@ class DisproportionateBurden(models.TextChoices): audit_retest_metadata_notes = models.TextField(default="", blank=True) audit_retest_metadata_complete_date = models.DateField(null=True, blank=True) - # Retest pages + # Update page links audit_retest_pages_complete_date = models.DateField(null=True, blank=True) # Retest website compliance @@ -550,6 +550,7 @@ class Type(models.TextChoices): ) name = models.TextField(default="", blank=True) url = models.TextField(default="", blank=True) + updated_url = models.TextField(default="", blank=True) location = models.TextField(default="", blank=True) complete_date = models.DateField(null=True, blank=True) no_errors_date = models.DateField(null=True, blank=True) diff --git a/accessibility_monitoring_platform/apps/audits/templates/audits/forms/twelve_week_pages.html b/accessibility_monitoring_platform/apps/audits/templates/audits/forms/twelve_week_pages.html index b62cb7967..2470ddc63 100644 --- a/accessibility_monitoring_platform/apps/audits/templates/audits/forms/twelve_week_pages.html +++ b/accessibility_monitoring_platform/apps/audits/templates/audits/forms/twelve_week_pages.html @@ -1,21 +1,55 @@ {% extends 'common/case_form.html' %} {% block preform %} -{% for page in case.audit.testable_pages %} - {% if page.failed_check_results.count > 0 %} -

{{ page }}

-
-
-
- -
{{ page.url }}
-
-
- -
{% if page.location %}{{ page.location }}{% else %}None{% endif %}
-
-
+{% if audit_retest_pages_formset.errors %} + {% for form in audit_retest_pages_formset.forms %} + {% if form.errors %} + {% include 'common/error_summary.html' %} + {% endif %} + {% endfor %} +{% endif %} +{% endblock %} + +{% block form %} +
+ {% csrf_token %} + {{ audit_retest_pages_formset.management_form }} + + + + {% for page_form in audit_retest_pages_formset %} + + + + {% endfor %} + +
+
+
+

{{ page_form.instance }}

+
+ +
{{ page_form.instance.url }}
+
+
+ +
{% if page_form.instance.location %}{{ page_form.instance.location }}{% else %}None{% endif %}
+
+ {% include 'common/form_errors.html' with errors=page_form.non_field_errors %} + {% include 'common/form_hidden_fields.html' with hidden_fields=page_form.hidden_fields %} + {% for field in page_form.visible_fields %} + {% include 'common/amp_field.html' %} + {% endfor %} +
+
+
+
+
+ {% include 'common/amp_form_snippet.html' %} +
+
+ {% include 'cases/helpers/save_continue_cancel.html' %}
- {% endif %} -{% endfor %} +
+
{% endblock %} diff --git a/accessibility_monitoring_platform/apps/audits/tests/test_views.py b/accessibility_monitoring_platform/apps/audits/tests/test_views.py index bc0fbe8c6..fd018656b 100644 --- a/accessibility_monitoring_platform/apps/audits/tests/test_views.py +++ b/accessibility_monitoring_platform/apps/audits/tests/test_views.py @@ -402,6 +402,10 @@ def test_audit_edit_redirects_based_on_button_pressed( "version": audit.version, button_name: "Button value", "case-compliance-version": audit.case.compliance.version, + "form-TOTAL_FORMS": "0", + "form-INITIAL_FORMS": "0", + "form-MIN_NUM_FORMS": "0", + "form-MAX_NUM_FORMS": "1000", }, ) @@ -3386,7 +3390,7 @@ def test_tall_results_page_has_back_to_top_link(path_name, admin_client): ("edit-audit-pages", "Initial WCAG test | Compliance decision"), ("edit-statement-overview", "Initial statement | Statement information"), ("edit-statement-overview", "Initial statement | Disproportionate burden"), - ("edit-audit-retest-metadata", "12-week WCAG test | Retest pages"), + ("edit-audit-retest-metadata", "12-week WCAG test | Update page links"), ("edit-audit-retest-pages", "12-week WCAG test | Compliance decision"), ("edit-retest-statement-overview", "12-week statement | Statement information"), ( diff --git a/accessibility_monitoring_platform/apps/audits/views/twelve_week.py b/accessibility_monitoring_platform/apps/audits/views/twelve_week.py index 959c3c3a5..0bd6ecd91 100644 --- a/accessibility_monitoring_platform/apps/audits/views/twelve_week.py +++ b/accessibility_monitoring_platform/apps/audits/views/twelve_week.py @@ -19,6 +19,7 @@ AuditRetestCheckResultFormset, AuditRetestMetadataUpdateForm, AuditRetestPageChecksForm, + AuditRetestPageFormset, AuditRetestPagesUpdateForm, AuditRetestStatementCheckResultFormset, AuditRetestStatementComplianceUpdateForm, @@ -87,6 +88,38 @@ def get_next_platform_page(self): audit: Audit = self.object return get_next_platform_page_twelve_week(audit=audit) + def get_context_data(self, **kwargs: dict[str, Any]) -> dict[str, Any]: + """Get context data for template rendering""" + context: dict[str, Any] = super().get_context_data(**kwargs) + audit: Audit = self.object + if self.request.POST: + audit_retest_pages_formset: AuditRetestPageFormset = AuditRetestPageFormset( + self.request.POST + ) + else: + audit_retest_pages_formset: AuditRetestPageFormset = AuditRetestPageFormset( + queryset=audit.testable_pages + ) + context["audit_retest_pages_formset"] = audit_retest_pages_formset + return context + + def form_valid(self, form: ModelForm): + """Process contents of valid form""" + context: dict[str, Any] = self.get_context_data() + audit_retest_pages_formset: AuditRetestPageFormset = context[ + "audit_retest_pages_formset" + ] + + if audit_retest_pages_formset.is_valid(): + pages: list[Page] = audit_retest_pages_formset.save(commit=False) + for page in pages: + record_model_update_event(user=self.request.user, model_object=page) + page.save() + else: + return super().form_invalid(form) + + return super().form_valid(form) + class AuditRetestPageChecksFormView(AuditPageChecksFormView): """ diff --git a/accessibility_monitoring_platform/apps/common/sitemap.py b/accessibility_monitoring_platform/apps/common/sitemap.py index 74b858d8d..6bc341fd5 100644 --- a/accessibility_monitoring_platform/apps/common/sitemap.py +++ b/accessibility_monitoring_platform/apps/common/sitemap.py @@ -892,7 +892,7 @@ def populate_from_case(self, case: Case): case_details_template_name="cases/details/details.html", ), AuditRetestPagesPlatformPage( - name="Retest pages", + name="Update page links", url_name="audits:edit-audit-retest-pages", complete_flag_name="audit_retest_pages_complete_date", subpages=[ diff --git a/stack_tests/integration_tests/cypress/e2e/new_case_test_report.cy.js b/stack_tests/integration_tests/cypress/e2e/new_case_test_report.cy.js index a7338663b..824c607d4 100644 --- a/stack_tests/integration_tests/cypress/e2e/new_case_test_report.cy.js +++ b/stack_tests/integration_tests/cypress/e2e/new_case_test_report.cy.js @@ -164,7 +164,7 @@ describe('Create case, tests and report', () => { cy.title().should('eq', `${newOrganisationName} | 12-week retest metadata`) cy.contains('Save and continue').click() - cy.title().should('eq', `${newOrganisationName} | Retest pages`) + cy.title().should('eq', `${newOrganisationName} | Update page links`) cy.contains('Save and continue').click() cy.title().should('eq', `${newOrganisationName} | Home page retest`)