diff --git a/accessibility_monitoring_platform/apps/audits/forms.py b/accessibility_monitoring_platform/apps/audits/forms.py
index bbdac1790..e4fc20031 100644
--- a/accessibility_monitoring_platform/apps/audits/forms.py
+++ b/accessibility_monitoring_platform/apps/audits/forms.py
@@ -548,6 +548,25 @@ class Meta:
]
+class AuditRetestPageUpdateForm(forms.ModelForm):
+ """Form for updating a page at 12-week retest"""
+
+ updated_url = AMPURLField(label="New URL (if applicable)")
+ updated_location = AMPCharFieldWide(label="New page location (if applicable)")
+
+ class Meta:
+ model = Page
+ fields = [
+ "updated_url",
+ "updated_location",
+ ]
+
+
+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..c4d870d83
--- /dev/null
+++ b/accessibility_monitoring_platform/apps/audits/migrations/0012_page_updated_url.py
@@ -0,0 +1,23 @@
+# 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=""),
+ ),
+ migrations.AddField(
+ model_name="page",
+ name="updated_location",
+ 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..f675b2c93 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,7 +550,9 @@ 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)
+ updated_location = models.TextField(default="", blank=True)
complete_date = models.DateField(null=True, blank=True)
no_errors_date = models.DateField(null=True, blank=True)
not_found = models.CharField(
diff --git a/accessibility_monitoring_platform/apps/audits/templates/audits/forms/page_checks.html b/accessibility_monitoring_platform/apps/audits/templates/audits/forms/page_checks.html
index 90a148137..d3a51ab04 100644
--- a/accessibility_monitoring_platform/apps/audits/templates/audits/forms/page_checks.html
+++ b/accessibility_monitoring_platform/apps/audits/templates/audits/forms/page_checks.html
@@ -3,6 +3,11 @@
{% load static %}
{% block preform %}
+
+
+ {% include 'audits/helpers/psb_page_links.html' %}
+
+
{% include 'audits/helpers/page_check_filters.html' with page='test' %}
{% endblock %}
@@ -33,14 +38,6 @@
class="govuk-button govuk-button--secondary"
data-module="govuk-button"
/>
- {% if page %}
-
- Link to {% if page.page_type == 'pdf' %}{{ page }}{% else %}{{ page|lower }}{% endif %}
-
- {% endif %}
- {% if page.location %}
- {{ page.location }}
- {% endif %}
{% include 'common/next_platform_page.html' %}
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..49d0c2d87 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 }}
-
-
+{% 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/templates/audits/forms/twelve_week_retest_page_checks.html b/accessibility_monitoring_platform/apps/audits/templates/audits/forms/twelve_week_retest_page_checks.html
index 4e9f26c96..ade071594 100644
--- a/accessibility_monitoring_platform/apps/audits/templates/audits/forms/twelve_week_retest_page_checks.html
+++ b/accessibility_monitoring_platform/apps/audits/templates/audits/forms/twelve_week_retest_page_checks.html
@@ -3,6 +3,11 @@
{% load static %}
{% block preform %}
+
+
+ {% include 'audits/helpers/psb_page_links.html' %}
+
+
{% include 'audits/helpers/page_check_filters.html' with page='retest' %}
{% endblock %}
@@ -70,14 +75,6 @@
class="govuk-button govuk-button--secondary"
data-module="govuk-button"
/>
- {% if page %}
-
- Link to {% if page.page_type == 'pdf' %}{{ page }}{% else %}{{ page|lower }}{% endif %}
-
- {% endif %}
- {% if page.location %}
-
{{ page.location }}
- {% endif %}
{% include 'common/next_platform_page.html' %}
diff --git a/accessibility_monitoring_platform/apps/audits/templates/audits/helpers/psb_page_links.html b/accessibility_monitoring_platform/apps/audits/templates/audits/helpers/psb_page_links.html
new file mode 100644
index 000000000..1f62d5251
--- /dev/null
+++ b/accessibility_monitoring_platform/apps/audits/templates/audits/helpers/psb_page_links.html
@@ -0,0 +1,29 @@
+
+
+
+ Website links
+
+
+
+ {% if page %}
+ {% if page.url %}
+
+
+ Link to {{ page }} (initial test)
+
+ {% endif %}
+ {% if page.updated_url %}
+
+
+ Link to {{ page }} (12-week test)
+
+ {% endif %}
+
Page location description if single page app
+
{% if page.location %}{{ page.location }}{% else %}N/A{% endif %}
+
New page location
+
{% if page.updated_location %}{{ page.updated_location }}{% else %}N/A{% endif %}
+ {% else %}
+
No page added.
+ {% endif %}
+
+
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`)