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 %}
-
-
+{% 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 %}
+
{% 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`)