Feat(Project Hub): Apply for Founding Partner Program page created with database structure and methods.

This commit is contained in:
2025-08-02 17:39:22 +01:00
parent 09af0a7a93
commit 438909b102
343 changed files with 8047 additions and 4253 deletions

View File

@@ -3,7 +3,16 @@
var flagAddress = "{{ model.FLAG_ADDRESS }}";
var flagAddressLine1 = "{{ model.FLAG_ADDRESS_LINE_1 }}";
var flagAddressLine2 = "{{ model.FLAG_ADDRESS_LINE_2 }}";
var flagApplyFoundingPartnerForm = "{{ model.FLAG_APPLY_FOUNDING_PARTNER_FORM }}";
var flagCity = "{{ model.FLAG_CITY }}";
var flagCommitmentFrequency = "{{ model.FLAG_COMMITMENT_FREQUENCY }}";
var flagCounty = "{{ model.FLAG_COUNTY }}";
var flagDogCount = "{{ model.FLAG_DOG_COUNT }}";
var flagExistingChallenges = "{{ model.FLAG_EXISTING_CHALLENGES }}";
var flagExistingSystem = "{{ model.FLAG_EXISTING_SYSTEM }}";
var flagExistingTimeSinkWeekly = "{{ model.FLAG_EXISTING_TIME_SINK_WEEKLY }}";
var flagMostValuableFeature = "{{ model.FLAG_MOST_VALUABLE_FEATURE }}";
var flagPostcode = "{{ model.FLAG_POSTCODE }}";
var flagSpeciality = "{{ model.FLAG_SPECIALITY }}";
var flagYearsOfExperience = "{{ model.FLAG_YEARS_OF_EXPERIENCE }}";
</script>

View File

@@ -74,6 +74,7 @@
var flagNameAttrOptionValue = "{{ model.FLAG_NAME_ATTR_OPTION_VALUE }}";
var flagNamePlural = "{{ model.FLAG_NAME_PLURAL }}";
var flagNavAdminHome = "{{ model.FLAG_NAV_ADMIN_HOME }}";
var flagNavApplyFoundingPartner = "{{ model.FLAG_NAV_APPLY_FOUNDING_PARTNER }}";
var flagNavContact = "{{ model.FLAG_NAV_CONTACT }}";
var flagNavHome = "{{ model.FLAG_NAV_HOME }}";
var flagNavDogAssessments = "{{ model.FLAG_NAV_DOG_ASSESSMENTS }}";
@@ -118,6 +119,8 @@
var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}";
var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}";
var hashPageAdminHome = "{{ model.HASH_PAGE_ADMIN_HOME }}";
var hashPageApplyFoundingPartner = "{{ model.HASH_PAGE_APPLY_FOUNDING_PARTNER }}";
var hashPageApplyFoundingPartnerSuccess = "{{ model.HASH_PAGE_APPLY_FOUNDING_PARTNER_SUCCCESS }}";
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";

View File

@@ -0,0 +1,147 @@
{% extends 'layouts/layout.html' %}
{% block page_head %}
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_apply_founding_partner.bundle.css') }}">
{% include 'layouts/_shared_project_hub_scripts.html' %}
{% endblock %}
{% block page_nav_links %}
{#
<a href="#contact-form">Contact Form</a>
<a href="#contact-details">Contact Details</a>
#}
{% endblock %}
{% block page_body %}
{% set form = model.form_apply_founding_partner %}
<section class="contact-section">
<div class="contact-form">
<h1>Apply to Founding Partner Program</h1>
<p>Please fill in the form below and we'll get back to you as soon as possible.</p>
<form id="{{ model.ID_APPLY_FOUNDING_PARTNER_FORM }}" method="POST" action="{{ model.HASH_POST_APPLY_FOUNDING_PARTNER_FORM }}">
{{ form.csrf_token }}
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.contact_name.id }}">{{ form.contact_name.label.text }} *</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.contact_name(class="form-input", required=True) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.email.id }}">{{ form.email.label.text }} *</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.email(class="form-input", required=True) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.phone_number.id }}">{{ form.phone_number.label.text }}</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.phone_number(class="form-input", required=False) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.company_name.id }}">{{ form.company_name.label.text }} *</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.company_name(class="form-input", required=True) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.website.id }}">{{ form.website.label.text }}</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.website(class="form-input", required=False) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.dog_count.id }}">{{ form.dog_count.label.text }} *</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.dog_count(class="form-input", required=True) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.id_years_of_experience.id }}">{{ form.id_years_of_experience.label.text }} *</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.id_years_of_experience(class="form-input", required=True) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.id_speciality.id }}">{{ form.id_speciality.label.text }} *</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.id_speciality(class="form-input", required=True) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.id_existing_system.id }}">{{ form.id_existing_system.label.text }} *</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.id_existing_system(class="form-input", required=True) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.existing_challenges.id }}">{{ form.existing_challenges.label.text }} *</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.existing_challenges(class="form-input", required=True) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.id_existing_time_sink_weekly.id }}">{{ form.id_existing_time_sink_weekly.label.text }} *</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.id_existing_time_sink_weekly(class="form-input", required=True) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.id_commitment_frequency.id }}">{{ form.id_commitment_frequency.label.text }} *</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.id_commitment_frequency(class="form-input", required=True) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<label class="{{ model.FLAG_LABEL_QUESTION }}" for="{{ form.notes.id }}">{{ form.notes.label.text }}</label>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.notes(class="form-input", required=False) }}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }} {{ model.FLAG_CAPTCHA }}">
<div>
{{ form.altcha.label }}
<altcha-widget
class="altcha-widget"
challengeurl="{{ model.HASH_GET_ALTCHA_CHALLENGE }}"
auto="onload"
id="{{ form.altcha.id }}"
name="{{ form.altcha.name }}"
></altcha-widget>
</div>
<p>This CAPTCHA mechanism is fully GDPR-compliant with no cookies, no fingerprinting, no tracking, and runs in the background so you don't need to do anything!</p>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ form.submit() }}
</div>
</div>
</div>
</form>
<div class="data-notice">
<h3>How we use your information</h3>
<p>If you opt in to marketing communications, we will also use your email address to send you updates about our services, Fetch Metrics features and development, and relevant industry news. You can unsubscribe from these communications at any time.</p>
<p>We retain contact form submissions for customer service purposes and retain marketing consent records as required by law. For details about how long we keep your information, please see our <a href="{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}">data retention schedule</a>.</p>
<p>For full details about how we handle your personal data, please read our <a href="{{ model.HASH_PAGE_PRIVACY_POLICY }}">Privacy Policy</a>.</p>
</div>
</div>
</section>
{% endblock %}

View File

@@ -46,8 +46,8 @@
</div>
<div class="{{ model.FLAG_CONTAINER_CHECKBOX }} {{ model.FLAG_RECEIVE_MARKETING }} marketing-consent">
{{ model.form_contact.receive_marketing() }}
{{ model.form_contact.receive_marketing.label }}
{{ form.receive_marketing() }}
{{ form.receive_marketing.label }}
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_CAPTCHA }}">
<div>
@@ -63,7 +63,7 @@
<p>This CAPTCHA mechanism is fully GDPR-compliant with no cookies, no fingerprinting, no tracking, and runs in the background so you don't need to do anything!</p>
</div>
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
{{ model.form_contact.submit() }}
{{ form.submit() }}
</div>
</form>

View File

@@ -40,7 +40,7 @@
</ul>
<h3>How long we keep information</h3>
<p>For information on how long we keep personal information, see our retention schedule at <a href="https://www.partsltd.co.uk/retention-schedule" alt="retention schedule" aria-label="retention schedule">https://www.partsltd.co.uk/retention-schedule</a></p>
<p>For information on how long we keep personal information, see our retention schedule at <a href="https://fetch-metrics.co.uk/retention-schedule" alt="retention schedule" aria-label="retention schedule">https://fetch-metrics.co.uk/retention-schedule</a></p>
<h3>Who we share information with</h3>
<p>Data processors</p>

View File

@@ -17,7 +17,7 @@
td:not([class]):last-child {
padding: 0 1em;
}
</style></head><body><div><main> <h1>Report</h1> <div><h2>About the Evaluation</h2> <dl><dt>Report Creator </dt><dd>Lord Edward Middleton-Smith </dd><dt>Evaluation Commissioner </dt><dd>Lord Edward Middleton-Smith </dd><dt>Evaluation date </dt><dd>Tue Apr 30 2024</dd></dl> </div> <div><h2>Executive Summary</h2> <div><span>Not provided</span></div> </div> <div><h2>Scope of the Evaluation</h2> <dl><dt>Website name </dt><dd>Public Website of Precision And Research Technology Systems Limited </dd><dt>Scope of the website </dt><dd>'All web content of the public mobile and desktop website of Precision And Research Technology Systems Limited located at https://www.partsltd.co.uk/ </dd><dt>WCAG Version </dt><dd>2.2 </dd><dt>Conformance target </dt><dd>AA </dd><dt>Accessibility support baseline </dt><dd>Google Chrome with NVDA, FireFox with NVDA, Ecosia mobile browser with TalkBack. </dd><dt>Additional evaluation requirements </dt><dd><span>Not provided</span></dd></dl> </div> <h2>Detailed Audit Results</h2> <h3>Summary</h3> <p>Reported on 55 of 55 WCAG 2.2 AA
</style></head><body><div><main> <h1>Report</h1> <div><h2>About the Evaluation</h2> <dl><dt>Report Creator </dt><dd>Lord Edward Middleton-Smith </dd><dt>Evaluation Commissioner </dt><dd>Lord Edward Middleton-Smith </dd><dt>Evaluation date </dt><dd>Tue Apr 30 2024</dd></dl> </div> <div><h2>Executive Summary</h2> <div><span>Not provided</span></div> </div> <div><h2>Scope of the Evaluation</h2> <dl><dt>Website name </dt><dd>Public Website of Precision And Research Technology Systems Limited </dd><dt>Scope of the website </dt><dd>'All web content of the public mobile and desktop website of Precision And Research Technology Systems Limited located at https://fetch-metrics.co.uk/ </dd><dt>WCAG Version </dt><dd>2.2 </dd><dt>Conformance target </dt><dd>AA </dd><dt>Accessibility support baseline </dt><dd>Google Chrome with NVDA, FireFox with NVDA, Ecosia mobile browser with TalkBack. </dd><dt>Additional evaluation requirements </dt><dd><span>Not provided</span></dd></dl> </div> <h2>Detailed Audit Results</h2> <h3>Summary</h3> <p>Reported on 55 of 55 WCAG 2.2 AA
Success Criteria.</p> <ul><li><span>41</span> <span>Passed</span></li><li><span>0</span> <span>Failed</span></li><li><span>0</span> <span>Cannot tell</span></li><li><span>14</span> <span>Not present</span></li><li><span>0</span> <span>Not checked</span></li></ul> <h3>All Results</h3> <h4>1 Perceivable</h4> <h5 id="guideline-11">1.1 Text Alternatives</h5> <table aria-labelledby="guideline-11"><tbody><tr><th scope="col">Success Criterion</th> <th scope="col">Result</th> <th scope="col">Observations</th> </tr> <tr><th scope="row" id="criterion-111">1.1.1: Non-text Content</th> <td> <p><span>Result:</span> Passed</p> </td> <td> <p>Observations:</p> <p>All user input controls have descriptive names and v2 Google reCaptcha used with text label to identify to user that they must check the box to prove they are not a bot.</p>
</td> </tr></tbody> </table><h5 id="guideline-12">1.2 Time-based Media</h5> <table aria-labelledby="guideline-12"><tbody><tr><th scope="col">Success Criterion</th> <th scope="col">Result</th> <th scope="col">Observations</th> </tr> <tr><th scope="row" id="criterion-121">1.2.1: Audio-only and Video-only (Prerecorded)</th> <td> <p><span>Result:</span> Not present</p> </td> <td> </td> </tr><tr><th scope="row" id="criterion-122">1.2.2: Captions (Prerecorded)</th> <td> <p><span>Result:</span> Not present</p> </td> <td> </td> </tr><tr><th scope="row" id="criterion-123">1.2.3: Audio Description or Media Alternative (Prerecorded)</th> <td> <p><span>Result:</span> Not present</p> </td> <td> </td> </tr><tr><th scope="row" id="criterion-124">1.2.4: Captions (Live)</th> <td> <p><span>Result:</span> Not present</p> </td> <td> </td> </tr><tr><th scope="row" id="criterion-125">1.2.5: Audio Description (Prerecorded)</th> <td> <p><span>Result:</span> Not present</p> </td> <td> </td> </tr></tbody> </table><h5 id="guideline-13">1.3 Adaptable</h5> <table aria-labelledby="guideline-13"><tbody><tr><th scope="col">Success Criterion</th> <th scope="col">Result</th> <th scope="col">Observations</th> </tr> <tr><th scope="row" id="criterion-131">1.3.1: Info and Relationships</th> <td> <p><span>Result:</span> Passed</p> </td> <td> <p>Observations:</p> <p>Elements change in response to zoom and viewport dimensions properly. Aria-label provided for all images.</p>
</td> </tr><tr><th scope="row" id="criterion-132">1.3.2: Meaningful Sequence</th> <td> <p><span>Result:</span> Passed</p> </td> <td> <p>Observations:</p> <p>Flow layout keeps associated sections together but allows dynamic structure depending on size of elements relative to screen.</p>
@@ -57,4 +57,4 @@ Aria-label attributes used for text hyperlinks.</p>
</td> </tr><tr><th scope="row" id="criterion-338">3.3.8: Accessible Authentication (Minimum)</th> <td> <p><span>Result:</span> Passed</p> </td> <td> <p>Observations:</p> <p>Alternative sign in methods provided, including recovery by code by phone and email.</p>
</td> </tr></tbody> </table><h4>4 Robust</h4> <h5 id="guideline-41">4.1 Compatible</h5> <table aria-labelledby="guideline-41"><tbody><tr><th scope="col">Success Criterion</th> <th scope="col">Result</th> <th scope="col">Observations</th> </tr> <tr><th scope="row" id="criterion-412">4.1.2: Name, Role, Value</th> <td> <p><span>Result:</span> Passed</p> </td> <td> <p>Observations:</p> <p>Aria-label attribute maintained for all images and text hyperlinks. Label for attribute used to associate input elements with descriptive labels.</p>
</td> </tr><tr><th scope="row" id="criterion-413">4.1.3: Status Messages</th> <td> <p><span>Result:</span> Passed</p> </td> <td> <p>Observations:</p> <p>Success feedback provided on form submission, with descriptive errors on failure.</p>
</td> </tr></tbody> </table> <h2>Sample of Audited Web Pages</h2> <ol><li><span>Home</span> - <span>https://www.partsltd.co.uk/</span> </li><li><span>Contact us</span> - <span>https://www.partsltd.co.uk/contact</span> </li><li><span>Services</span> - <span>https://www.partsltd.co.uk/services</span> </li><li><span></span> - <span></span> </li></ol> <h2>Web Technology</h2> <p>HTML,CSS,JavaScript,python Flask</p> <h2>Recording of Evaluation Specifics</h2> <p>Not provided</p> </main></div></body></html>
</td> </tr></tbody> </table> <h2>Sample of Audited Web Pages</h2> <ol><li><span>Home</span> - <span>https://fetch-metrics.co.uk/</span> </li><li><span>Contact us</span> - <span>https://fetch-metrics.co.uk/contact</span> </li><li><span>Services</span> - <span>https://fetch-metrics.co.uk/services</span> </li><li><span></span> - <span></span> </li></ol> <h2>Web Technology</h2> <p>HTML,CSS,JavaScript,python Flask</p> <h2>Recording of Evaluation Specifics</h2> <p>Not provided</p> </main></div></body></html>