Feat: Home page content updated with new marketing images. DOG section styles updated for marketing materials.

This commit is contained in:
2025-08-01 12:37:08 +01:00
parent 5c4128deca
commit 36133d8859
55 changed files with 4704 additions and 456 deletions

View File

@@ -61,10 +61,10 @@ class Assessment_Response(SQLAlchemy_ABC, Base):
assessment_response.id_response = query_row[0]
assessment_response.id_assessment_command_modality_link = query_row[1]
assessment_response.id_response_quality_metric = query_row[2]
assessment_response.id_obedience_level = query_row[4]
assessment_response.value_measured = query_row[6]
assessment_response.notes = query_row[7]
assessment_response.active = av.input_bool(query_row[8], 'active', _m)
assessment_response.id_obedience_level = query_row[5]
assessment_response.value_measured = query_row[7]
assessment_response.notes = query_row[8]
assessment_response.active = av.input_bool(query_row[9], 'active', _m)
assessment_response.assessment_command_modality_link = Assessment_Command_Modality_Link.from_db_assessment_response(query_row)
assessment_response.response_quality_metric = Response_Quality_Metric.from_db_assessment_response(query_row)

View File

@@ -51,8 +51,8 @@ class Obedience_Level(SQLAlchemy_ABC, Base):
def from_db_assessment_response(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_response'
level = cls()
level.id_obedience_level = query_row[4]
level.name = query_row[5]
level.id_obedience_level = query_row[5]
level.name = query_row[6]
level.active = True
return level

View File

@@ -85,7 +85,7 @@ class Unit_Measurement(SQLAlchemy_ABC, Base):
unit.id_unit_measurement = None
unit.name_singular = ''
unit.name_plural = ''
unit.symbol = ''
unit.symbol = '%' if query_row[4] == '/' else query_row[4]
return unit
@classmethod

View File

@@ -14,7 +14,7 @@ Home Page Controller.
from business_objects.api import API
from models.model_view_home import Model_View_Home
# external
from flask import render_template, jsonify, Blueprint
from flask import render_template, jsonify, Blueprint, send_from_directory
routes_core_home = Blueprint('routes_core_home', __name__)
@@ -28,4 +28,4 @@ def home():
except Exception as e:
return jsonify(error=str(e)), 403
return html_body

View File

@@ -70,3 +70,9 @@ def privacy_policy():
@routes_legal.route('/robots.txt', methods=['GET'])
def robots_txt():
return send_from_directory('static', 'docs/robots.txt')
@routes_legal.route('/favicon.ico', methods=['GET'])
def favicon_ico():
return send_from_directory('static', 'images/fetch-metrics-logo.ico', mimetype='image/vnd.microsoft.icon') # -and-company-name-curved-0.5
@routes_legal.route('/sitemap.xml', methods=['GET'])
def sitemap_xml():
return send_from_directory('static', 'docs/sitemap.xml')

File diff suppressed because it is too large Load Diff

View File

@@ -420,6 +420,7 @@ BEGIN
LEFT JOIN parts.DOG_User USER ON t_ASSESSMENT.id_user_handler = USER.id_user
-- LEFT JOIN tmp_User t_USER_HANDLER ON t_ASSESSMENT.id_user_handler = t_USER_HANDLER.id_user
ORDER BY ASSESSMENT.created_on DESC
LIMIT 1000
;
-- Errors

View File

@@ -553,6 +553,7 @@ BEGIN
LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_SOUND ON t_DISTRACTION.id_intensity_level_sound = INTENSITY_LEVEL_SOUND.id_intensity_level
LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_TOUCH ON t_DISTRACTION.id_intensity_level_touch = INTENSITY_LEVEL_TOUCH.id_intensity_level
ORDER BY DISTRACTION_TYPE.name
LIMIT 1000
;
-- Errors

View File

@@ -555,6 +555,7 @@ BEGIN
LEFT JOIN parts.DOG_Command_Category COMMAND_CATEGORY ON COMMAND.id_command_category = COMMAND_CATEGORY.id_command_category
LEFT JOIN parts.DOG_Command_Modality COMMAND_MODALITY ON t_ASSESSMENT_COMMAND_MODALITY_LINK.id_command_modality = COMMAND_MODALITY.id_command_modality
LEFT JOIN parts.DOG_Bribe BRIBE ON t_ASSESSMENT_COMMAND_MODALITY_LINK.id_bribe = BRIBE.id_bribe
LIMIT 1000
;
-- Errors

View File

@@ -574,6 +574,7 @@ BEGIN
, t_ASSESSMENT_RESPONSE.id_assessment_command_modality_link
, t_ASSESSMENT_RESPONSE.id_response_quality_metric
, RESPONSE_QUALITY_METRIC.name AS name_response_quality_metric
, UNIT_MEASUREMENT.symbol AS symbol_unit_measurement_response_quality_metric
, t_ASSESSMENT_RESPONSE.id_obedience_level
, OBEDIENCE_LEVEL.name AS name_obedience_level
, t_ASSESSMENT_RESPONSE.value_measured
@@ -586,7 +587,9 @@ BEGIN
LEFT JOIN parts.DOG_Assessment_Response ASSESSMENT_RESPONSE ON t_ASSESSMENT_RESPONSE.id_response = ASSESSMENT_RESPONSE.id_response
LEFT JOIN parts.DOG_Obedience_Level OBEDIENCE_LEVEL ON t_ASSESSMENT_RESPONSE.id_obedience_level = OBEDIENCE_LEVEL.id_obedience_level
LEFT JOIN parts.DOG_Response_Quality_Metric RESPONSE_QUALITY_METRIC ON t_ASSESSMENT_RESPONSE.id_response_quality_metric = RESPONSE_QUALITY_METRIC.id_metric
LEFT JOIN parts.DOG_Unit_Measurement UNIT_MEASUREMENT ON RESPONSE_QUALITY_METRIC.id_unit_measurement = UNIT_MEASUREMENT.id_unit_measurement
ORDER BY ASSESSMENT_RESPONSE.created_on DESC
LIMIT 1000
;
-- Errors

View File

@@ -88,6 +88,7 @@ script, link {
width: 100%;
align-self: center;
font-size: 1rem;
color: var(--colour-text);
}
#pageBody > * > * {
align-self: center;

View File

@@ -1,8 +1,15 @@
h2 {
color: var(--colour-primary);
width: 100%;
}
#formFilters {
display: none;
}
.company-name {
font-size: 2.5rem;
}
.container.save.button-cancel {
position: fixed;
@@ -10,6 +17,12 @@
right: 10vh;
}
table.table-main tbody {
max-height: 28vh;
}
table.table-main tbody tr td {
height: 4vh;
}
table.table-main.assessment thead tr th.active,
table.table-main.assessment tbody tr td.active,
@@ -42,8 +55,12 @@ table.table-main.assessment_command_modality_link tbody tr td {
}
table.table-main.assessment_command_modality_link tbody tr td.ddl-preview div,
table.table-main.assessment_command_modality_link tbody tr td.ddl-preview select {
padding-left: 0;
padding-right: 0;
padding: 0.5vh 0.5vw;
}
table.table-main.assessment_command_modality_link thead tr th.command-category,
table.table-main.assessment_command_modality_link tbody tr td.command-category {
min-width: 12vh;
max-width: 12vh;
}
table.table-main.assessment_command_modality_link thead tr th.is-in-hearing-range-of-handler,
table.table-main.assessment_command_modality_link tbody tr td.is-in-hearing-range-of-handler,
@@ -67,8 +84,12 @@ table.table-main.assessment_command_modality_link thead tr th.assessment_respons
table.table-main.assessment_command_modality_link tbody tr td.assessment_response {
max-width: 60vh;
min-width: 60vh;
height: fit-content;
}
table.table-main.assessment_command_modality_link tbody tr td.assessment_response div.ddl-preview div.row {
border: none;
}
table.table-main.assessment_command_modality_link tbody tr td.assessment_response thead tr th.response-quality-metric,
table.table-main.assessment_command_modality_link tbody tr td.assessment_response tbody tr td.response-quality-metric {
max-width: 15vh;

View File

@@ -65,10 +65,17 @@
margin: 0;
}
h2 {
color: var(--colour-primary);
width: 100%;
}
#formFilters {
display: none;
}
.company-name {
font-size: 2.5rem;
}
.container.save.button-cancel {
position: fixed;
@@ -76,6 +83,12 @@
right: 10vh;
}
table.table-main tbody {
max-height: 28vh;
}
table.table-main tbody tr td {
height: 4vh;
}
table.table-main.assessment thead tr th.active,
table.table-main.assessment tbody tr td.active,
@@ -108,8 +121,12 @@ table.table-main.assessment_command_modality_link tbody tr td {
}
table.table-main.assessment_command_modality_link tbody tr td.ddl-preview div,
table.table-main.assessment_command_modality_link tbody tr td.ddl-preview select {
padding-left: 0;
padding-right: 0;
padding: 0.5vh 0.5vw;
}
table.table-main.assessment_command_modality_link thead tr th.command-category,
table.table-main.assessment_command_modality_link tbody tr td.command-category {
min-width: 12vh;
max-width: 12vh;
}
table.table-main.assessment_command_modality_link thead tr th.is-in-hearing-range-of-handler,
table.table-main.assessment_command_modality_link tbody tr td.is-in-hearing-range-of-handler,
@@ -133,8 +150,12 @@ table.table-main.assessment_command_modality_link thead tr th.assessment_respons
table.table-main.assessment_command_modality_link tbody tr td.assessment_response {
max-width: 60vh;
min-width: 60vh;
height: fit-content;
}
table.table-main.assessment_command_modality_link tbody tr td.assessment_response div.ddl-preview div.row {
border: none;
}
table.table-main.assessment_command_modality_link tbody tr td.assessment_response thead tr th.response-quality-metric,
table.table-main.assessment_command_modality_link tbody tr td.assessment_response tbody tr td.response-quality-metric {
max-width: 15vh;

File diff suppressed because one or more lines are too long

View File

@@ -88,6 +88,7 @@ script, link {
width: 100%;
align-self: center;
font-size: 1rem;
color: var(--colour-text);
}
#pageBody > * > * {
align-self: center;

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" ?><!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" height="1080" id="svg2383" inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" sodipodi:docname="Camera_Border.svg" sodipodi:version="0.32" version="1.0" width="1920">
<defs id="defs2385">
<linearGradient id="linearGradient3950" inkscape:collect="always">
<stop id="stop3952" offset="0" style="stop-color:#ffffff;stop-opacity:0"/>
<stop id="stop3954" offset="1" style="stop-color:#ffffff;stop-opacity:1"/>
</linearGradient>
<linearGradient id="linearGradient3944" inkscape:collect="always">
<stop id="stop3946" offset="0" style="stop-color:#ffffff;stop-opacity:0"/>
<stop id="stop3948" offset="1" style="stop-color:#ffffff;stop-opacity:1"/>
</linearGradient>
<linearGradient id="linearGradient3932" inkscape:collect="always">
<stop id="stop3934" offset="0" style="stop-color:#ffffff;stop-opacity:0"/>
<stop id="stop3936" offset="1" style="stop-color:#ffffff;stop-opacity:1"/>
</linearGradient>
<linearGradient id="linearGradient3926" inkscape:collect="always">
<stop id="stop3928" offset="0" style="stop-color:#ffffff;stop-opacity:0"/>
<stop id="stop3930" offset="1" style="stop-color:#ffffff;stop-opacity:1"/>
</linearGradient>
<linearGradient inkscape:collect="always" id="linearGradient3787">
<stop style="stop-color:#000000;stop-opacity:0" offset="0" id="stop3789"/>
<stop style="stop-color:#000000;stop-opacity:1" offset="1" id="stop3791"/>
</linearGradient>
<linearGradient id="linearGradient3190" inkscape:collect="always">
<stop id="stop3192" offset="0" style="stop-color:#324da7;stop-opacity:1"/>
<stop id="stop3194" offset="1" style="stop-color:#324da7;stop-opacity:0;"/>
</linearGradient>
<linearGradient id="linearGradient3267" inkscape:collect="always">
<stop id="stop3269" offset="0" style="stop-color:#0000ff;stop-opacity:0"/>
<stop id="stop3275" offset="0.48768985" style="stop-color:#ffffff;stop-opacity:1"/>
<stop id="stop3271" offset="1" style="stop-color:#0000ff;stop-opacity:0;"/>
</linearGradient>
<inkscape:perspective id="perspective2391" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" inkscape:vp_x="0 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="744.09448 : 526.18109 : 1" sodipodi:type="inkscape:persp3d"/>
<linearGradient gradientTransform="matrix(0.4475832,0,0,1.1594093,-317.72844,-354.23847)" gradientUnits="userSpaceOnUse" id="linearGradient3273" inkscape:collect="always" x1="333.26617" x2="1668.8561" xlink:href="#linearGradient3267" y1="671.26709" y2="671.26709"/>
<linearGradient gradientTransform="matrix(0.4475832,0,0,1.1594093,-317.72845,-255.93349)" gradientUnits="userSpaceOnUse" id="linearGradient3463" inkscape:collect="always" x1="333.26617" x2="1668.8561" xlink:href="#linearGradient3267" y1="671.26709" y2="671.26709"/>
<linearGradient gradientTransform="translate(-480.00173,0)" gradientUnits="userSpaceOnUse" id="linearGradient3196" inkscape:collect="always" x1="1917.6716" x2="1622.8263" xlink:href="#linearGradient3190" y1="542.59882" y2="542.59882"/>
<linearGradient gradientTransform="matrix(-1,0,0,1,1920.0025,7.77e-2)" gradientUnits="userSpaceOnUse" id="linearGradient3200" inkscape:collect="always" x1="1917.6716" x2="1622.8263" xlink:href="#linearGradient3190" y1="542.59882" y2="542.59882"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3787" id="linearGradient3795" x1="146.66714" y1="471.47937" x2="93.029869" y2="417.8421" gradientUnits="userSpaceOnUse" gradientTransform="translate(-1.0019302,-25)"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3787-0" id="linearGradient3795-5" x1="146.66714" y1="471.47937" x2="93.029869" y2="417.8421" gradientUnits="userSpaceOnUse"/>
<linearGradient inkscape:collect="always" id="linearGradient3787-0">
<stop style="stop-color:#000000;stop-opacity:0" offset="0" id="stop3789-9"/>
<stop style="stop-color:#000000;stop-opacity:1" offset="1" id="stop3791-6"/>
</linearGradient>
<linearGradient gradientTransform="translate(-764,-325.00193)" y2="417.8421" x2="93.029869" y1="471.47937" x1="146.66714" gradientUnits="userSpaceOnUse" id="linearGradient3812" xlink:href="#linearGradient3787-0" inkscape:collect="always"/>
<linearGradient gradientTransform="translate(-768,-2215.498)" y2="417.8421" x2="93.029869" y1="471.47937" x1="146.66714" gradientUnits="userSpaceOnUse" id="linearGradient3812-5" xlink:href="#linearGradient3787-0-6" inkscape:collect="always"/>
<linearGradient inkscape:collect="always" id="linearGradient3787-0-6">
<stop style="stop-color:#000000;stop-opacity:0" offset="0" id="stop3789-9-0"/>
<stop style="stop-color:#000000;stop-opacity:1" offset="1" id="stop3791-6-6"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3787-9" id="linearGradient3795-3" x1="146.66714" y1="471.47937" x2="93.029869" y2="417.8421" gradientUnits="userSpaceOnUse"/>
<linearGradient inkscape:collect="always" id="linearGradient3787-9">
<stop style="stop-color:#000000;stop-opacity:0" offset="0" id="stop3789-5"/>
<stop style="stop-color:#000000;stop-opacity:1" offset="1" id="stop3791-8"/>
</linearGradient>
<linearGradient gradientTransform="translate(-1891.498,-21)" y2="417.8421" x2="93.029869" y1="471.47937" x1="146.66714" gradientUnits="userSpaceOnUse" id="linearGradient3851" xlink:href="#linearGradient3787-9" inkscape:collect="always"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3932" id="linearGradient3892" gradientUnits="userSpaceOnUse" gradientTransform="translate(-1891.498,-21)" x1="146.66714" y1="471.47937" x2="93.029869" y2="417.8421"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3926" id="linearGradient3894" gradientUnits="userSpaceOnUse" gradientTransform="translate(-768,-2215.498)" x1="146.66714" y1="471.47937" x2="93.029869" y2="417.8421"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3787" id="linearGradient3896" gradientUnits="userSpaceOnUse" gradientTransform="translate(-1.0019302,-25)" x1="146.66714" y1="471.47937" x2="93.029869" y2="417.8421"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3787-0" id="linearGradient3898" gradientUnits="userSpaceOnUse" gradientTransform="translate(-764,-325.00193)" x1="146.66714" y1="471.47937" x2="93.029869" y2="417.8421"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3950" id="linearGradient3939" gradientUnits="userSpaceOnUse" gradientTransform="translate(-786,-325.00193)" x1="146.66714" y1="471.47937" x2="93.029869" y2="417.8421"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3944" id="linearGradient3942" gradientUnits="userSpaceOnUse" gradientTransform="translate(-1.0019302,-3)" x1="146.66714" y1="471.47937" x2="93.029869" y2="417.8421"/>
</defs>
<sodipodi:namedview bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" id="base" inkscape:current-layer="layer1" inkscape:cx="98.3708" inkscape:cy="764.37791" inkscape:document-units="px" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="1056" inkscape:window-width="1855" inkscape:window-x="65" inkscape:window-y="24" inkscape:zoom="0.25" objecttolerance="10" pagecolor="#ffffff" showgrid="false" inkscape:window-maximized="1"/>
<metadata id="metadata2388">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(1.9328e-3,0)">
<rect height="1080.0051" id="rect3160" rx="0" ry="0" style="opacity:0;fill:#e0e7ff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" width="1920" x="-0.0019328" y="-0.0051269531"/>
<rect style="fill:none;stroke:url(#linearGradient3942);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="rect3009" width="304" height="250" x="92.99807" y="415"/>
<rect style="fill:none;stroke:url(#linearGradient3939);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="rect3009-0" width="304" height="250" x="-692" y="92.99807" transform="matrix(0,-1,1,0,0,0)"/>
<g id="g3887" transform="translate(0,18)">
<rect transform="scale(-1,1)" y="397" x="-1797.498" height="250" width="304" id="rect3009-5" style="fill:none;stroke:url(#linearGradient3892);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
<g id="g3880">
<rect style="fill:none;stroke:url(#linearGradient3894);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="rect3009-0-0" width="304" height="250" x="-674" y="-1797.498" transform="matrix(0,-1,-1,0,0,0)"/>
</g>
</g>
<text xml:space="preserve" style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none" x="959.99811" y="575.09833" id="text3005"><tspan sodipodi:role="line" id="tspan3007" x="959.99811" y="575.09833" style="font-weight:bold;font-size:96.42027283px;line-height:1.25;font-family:'Bitstream Vera Sans';text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1">Tired of lost training notes?</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

47
static/docs/sitemap.xml Normal file
View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<!-- Core-->
<url>
<loc>https://fetch-metrics.co.uk/</loc>
<lastmod>2025-01-01</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://fetch-metrics.co.uk/contact</loc>
<lastmod>2025-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<!-- Legal -->
<url>
<loc>https://fetch-metrics.co.uk/license</loc>
<lastmod>2025-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://fetch-metrics.co.uk/accessibility-statement</loc>
<lastmod>2025-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://fetch-metrics.co.uk/accessibility-report</loc>
<lastmod>2025-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://fetch-metrics.co.uk/retention-schedule</loc>
<lastmod>2025-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://fetch-metrics.co.uk/privacy-policy</loc>
<lastmod>2025-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 MiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -5,7 +5,7 @@
Add response
{% else %}
{% for assessment_response_preview in assessment_response_previews %}
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">{{ assessment_response_preview.response_quality_metric.name }} - {{ assessment_response_preview.obedience_level.name }}</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">{{ assessment_response_preview.response_quality_metric.name }} - {{ assessment_response_preview.obedience_level.name }} - {{ assessment_response_preview.value_measured }} {{ assessment_response_preview.response_quality_metric.unit_measurement.symbol }}</div>
{% endfor %}
{% endif %}
</div>

View File

@@ -4,6 +4,13 @@
<meta name="description" content="Professional dog training management software for UK trainers. Manage clients, track training sessions, monitor progress, and engage dog owners with our comprehensive SaaS platform. Starting from £15/month." />
<meta name="keywords" content="fetch metrics, fetchmetrics, dog training software, dog trainer management, pet training app, canine training system, dog training business software, professional dog training, UK dog trainers, training session management, dog training records, client management for dog trainers, dog training progress tracking, pet training business tools, dog training scheduling, canine behavior tracking, dog trainer CRM, training appointment booking, dog training client portal, canine training documentation, dog obedience training, puppy training programs, behavioral modification, training milestones, dog training certificates, trainer scheduling, client communication, training homework assignments, progress reports, dog training analytics, British dog training, dog training software UK, professional dog training tools" />
<link rel="canonical" href="{{ model.get_url_host() }}" />
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='images/fetch-metrics-logo.ico') }}">
<!-- Cross-browser compatibility not yet implemented
-and-company-name-curved-0.5
<link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon-32x32.png') }}">
<link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicon-16x16.png') }}">
<link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('static', filename='apple-touch-icon.png') }}">
-->
<script type="application/ld+json">
{
"@context": "https://schema.org",

View File

@@ -97,28 +97,28 @@
<h3>📝 Command Management</h3>
<p>Customise commands, categories, and signals for your training style</p>
<div class="project-thumbnail">
<img src="{{ url_for('static', filename='images/fetch-metrics-page-commands.webp') }}" alt="Command Management" aria-label="Command Management">
<img src="{{ url_for('static', filename='images/fetch-metrics-page-commands_v2a.webp') }}" alt="Command Management" aria-label="Command Management">
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h3>📊 Assessment Tracking</h3>
<p>Record distractions, environments, response times, and success rates</p>
<div class="project-thumbnail">
<img src="{{ url_for('static', filename='images/fetch-metrics-page-assessment.webp') }}" alt="Assessment Tracking" aria-label="Assessment Tracking">
<img src="{{ url_for('static', filename='images/fetch-metrics-page-assessment_v2a.webp') }}" alt="Assessment Tracking" aria-label="Assessment Tracking">
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h3>🎯 Progress Visualisation</h3>
<p>Radar charts showing command mastery and improvement over time</p>
<div class="project-thumbnail">
<img src="{{ url_for('static', filename='images/fetch-metrics-report-radar-command-mastery.webp') }}" alt="Progress Visualisation" aria-label="Progress Visualisation">
<img src="{{ url_for('static', filename='images/fetch-metrics-report-radar-command-category-progress-v2a.webp') }}" alt="Progress Visualisation" aria-label="Progress Visualisation">
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h3>📈 Performance Analytics</h3>
<p>Line charts tracking response latency and compliance duration</p>
<div class="project-thumbnail">
<img src="{{ url_for('static', filename='images/fetch-metrics-report-line-command-progress.webp') }}" alt="Performance Analytics" aria-label="Performance Analytics">
<img src="{{ url_for('static', filename='images/fetch-metrics-report-line-command-progress-v2a.webp') }}" alt="Performance Analytics" aria-label="Performance Analytics">
</div>
</div>
</div>
@@ -150,14 +150,16 @@
</div>
</section>
<!--
<section id="{{ model.FLAG_TESTIMONIAL }}" class="{{ model.FLAG_TESTIMONIAL }}">
<div class="{{ model.FLAG_CONTAINER }}">
<p class="text-center">"I've been tracking commands in spreadsheets for years. This is exactly what I needed - finally, someone who understands what trainers actually do day-to-day."</p>
<h2 class="section-subtitle text-center">- Sarah M., Certified Dog Behaviourist, Manchester</h2>
<!-- <p class="text-center">"I've been tracking progress with binders of loose paper for years. This is exactly what I needed - simple, intuitive, and really powerful. Works perfectly on your phone in outdoor sessions I can input data while training and the progress reports would be impossible with my previous system."</p> -->
<p class="text-center">"I've been tracking progress with binders of loose paper for years. This is exactly what I needed - simple, intuitive, and really powerful. Works perfectly on your phone in outdoor sessions
- just capture essential data and the progress reports are immediately available to the client."</p>
<h2 class="section-subtitle text-center">- Wendy M., Certified Animal Behaviourist, Rugby</h2>
</div>
</section>
<!--
<section id="{{ model.FLAG_EARLY_ACCESS }}" class="{{ model.FLAG_EARLY_ACCESS }}">
<div class="{{ model.FLAG_CONTAINER }}">
<h2 class="section-title text-center">Be Among the First</h2>

View File

@@ -128,6 +128,7 @@
</form>
<form id="{{ model.ID_FORM_DISTRACTIONS }}" class="{{ model.FLAG_ROW }} {{ model.FLAG_CARD }}">
<h2>Distractions</h2>
<table id="{{ model.ID_TABLE_DISTRACTIONS}}" class="{{ model.FLAG_TABLE_MAIN }} {{ model.FLAG_ROW }} {{ model.FLAG_CARD }} {{ model.FLAG_DISTRACTION }}">
<thead>
<tr class="{{ model.FLAG_DISTRACTION }}">
@@ -160,6 +161,7 @@
</form>
<form id="{{ model.ID_FORM_ASSESSMENT_COMMAND_MODALITY_LINKS }}" class="{{ model.FLAG_ROW }} {{ model.FLAG_CARD }}">
<h2>Commands and Responses</h2>
<table id="{{ model.ID_TABLE_ASSESSMENT_COMMAND_MODALITY_LINKS }}" class="{{ model.FLAG_TABLE_MAIN }} {{ model.FLAG_ROW }} {{ model.FLAG_CARD }} {{ model.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK }}">
<thead>
<tr class="{{ model.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK }}">

View File

@@ -26,6 +26,7 @@ Features:
- Response Quality Metric - add field bigger value measured is better?
- Permissions
- Assessment completed/started on date for when used as homework
- Dynamic sitemap.xml + robots.txt generation
Fix: