mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-10-07 04:55:29 +00:00
* Port to Django 5.2 * Pin pluggy to 1.2.0 Any newer and the mystery importlib metadata error appears. Weird! >_> * Update for premailer changed default * Update view logic for is_ajax being changed to a template context processor * Port a few more tests to pytest proper Having two distinct test flavours is giving me a headache * Version 1 dockerfile Makes a VERY big image, I suspect we can optimise this a lot... * Optimise dockerfile a little lot a bit * fix(users): change logout link to POST request * fix(tests): fix some syntax errors in test code still got lots of failed tests :( * fix: replace deprecated Django APIs * ci: update Dockerfile * ci: update Dockerfile * fix(dependencies+tests): update EoL/vulnerable dependencies and improve test stability * Upgrade Python from 3.10 to 3.12 * Update frontend dependencies, replace node-sass with sass * chore(logging): ignore dangling obj reference warning from pypdf * ci: update compose.yml for prod deployment - Add Nginx as a reverse proxy - Add cert-selfsign.sh for generating self-signed certificates - Add certbot-issue.sh for Let's Encrypt certificate issuance and renewal - Add cron-install.sh and cron-uninstall.sh for system cron management - Add .env.example as an environment variable template * style: reformat code * ci: add more sleep trying to pass tests * ci: ignore browser-based tests during ci testing * fix: create home for the new user during Dockerfile building * chore: remove heroku conf file * fix: RIGS not franken anymore * fix: restore is_ajax as a boolean and split out the context processor * test: remove Selenium interaction tests and their CI workarounds * fix: harden production settings (CSRF origins, env casts, ADMINS) and drop dead debug toolbar code * deploy: serve static files from nginx, pin PGDATA, and make cert scripts loud on failure * build: switch .dockerignore to an allowlist * build: drop unused dependencies, soft-pin the rest and target Python 3.14 * build: move image to Python 3.14 / Node 24 and force DEBUG off * ci: add dependabot config for uv, npm, docker and actions * build: narrow Sass deprecation silencing to @import and require Node 24 * build: provide placeholder env for collectstatic now that DEBUG is off in the image * deploy: add plain-HTTP nginx config for local development and use it in compose * deploy: remove self-signed cert script * build: make the image multi-arch with official node and python base images * ci: lint and test on PRs, build the image on PRs and push it to GHCR on master * docs: add local running and sample data instructions * fix: report a form error instead of crashing when big power has no Power MIC * fix: upgrade pypdf and urllib3 to patched releases * fix: apply non-breaking npm audit fixes * fix: strip whitespace in ALLOWED_HOSTS and drop misleading HSTS preload * deploy: add a pyrigs healthcheck and make nginx wait for it * build: pin the uv image version * fix: correct the check-in person picker condition and use BeautifulSoup's string argument * refactor: replace unique_together with UniqueConstraint * build: replace pycodestyle with ruff and fix what it found Removes unused imports and variables, and fixes a few real problems it surfaced: - EventCheckIn.active() referenced an undefined name and raised NameError; it now returns whether the check-in has no end time - RIGS.admin defined EventChecklistAdmin twice; the second is now PowerTestRecordAdmin - RIGS/tests/conftest.py used date/timedelta without importing them - the signal-registering imports in apps.py are kept with noqa pycodestyle config in setup.cfg is dropped. * style: format the codebase with ruff * style: normalise line endings, trailing whitespace and end-of-file newlines * ci: run ruff and file hygiene through prek, and document it --------- Co-authored-by: Hang <me@hangxu.me> Co-authored-by: Joe Banks <joe@jb3.dev>
236 lines
8.8 KiB
XML
236 lines
8.8 KiB
XML
{% extends 'base_print.xml' %}
|
|
{% load filters %}
|
|
|
|
{% block extrastyles %}
|
|
<paraStyle name="style.powerReviewed" borderPadding="3" alignment="center" backColor="green" textColor="white"/>
|
|
<paraStyle name="style.powerUnreviewed" borderPadding="3" alignment="center" backColor="red" textColor="white"/>
|
|
<paraStyle name="style.smallText" fontSize="8"/>
|
|
|
|
<paraStyle leftIndent="2in" rightIndent="2in" name="style.smallEvent" fontSize="10" alignment="center" backColor="green" textColor="white" borderPadding="4" borderColor="black"/>
|
|
<paraStyle leftIndent="2in" rightIndent="2in" name="style.mediumEvent" fontSize="10" alignment="center" backColor="orange" textColor="white" borderPadding="4" borderColor="black"/>
|
|
<paraStyle leftIndent="2in" rightIndent="2in" name="style.largeEvent" fontSize="10" alignment="center" backColor="red" textColor="white" borderPadding="4" borderColor="black"/>
|
|
|
|
<blockTableStyle id="powerTable">
|
|
<blockValign value="middle"/>
|
|
<lineStyle kind="LINEABOVE" colorName="black" thickness="1"/>
|
|
<lineStyle kind="LINEBELOW" colorName="black" thickness="1"/>
|
|
<lineStyle kind="LINEAFTER" colorName="black" thickness="1"/>
|
|
<lineStyle kind="LINEBEFORE" colorName="black" thickness="1"/>
|
|
</blockTableStyle>
|
|
|
|
<blockTableStyle id="voltageTable">
|
|
<blockValign value="middle"/>
|
|
</blockTableStyle>
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
<spacer length="15"/>
|
|
<h1>Power Test Record for <strong>{{ object.event }}</strong></h1>
|
|
<spacer length="15"/>
|
|
<h2>Client: {{ object.event.person|default:object.event.organisation }} | Venue: {{ object.event.venue }} | MIC: {{ object.event.mic }}</h2>
|
|
<spacer length="15"/>
|
|
<hr/>
|
|
<spacer length="15"/>
|
|
{% if object.reviewed_by %}
|
|
<para style="style.powerReviewed"><strong>Reviewed by: {{ object.reviewed_by }} at {{ object.reviewed_at|date:"D d/m/Y" }}</strong></para>
|
|
{% else %}
|
|
<para style="style.powerUnreviewed"><strong>Power test results not yet reviewed</strong></para>
|
|
{% endif %}
|
|
<spacer length="15"/>
|
|
<hr/>
|
|
<spacer length="15"/>
|
|
|
|
<h2 fontSize="16">Power Plan Information</h2>
|
|
<spacer length="15"/>
|
|
|
|
{% if object.event.riskassessment.event_size == 0 %}
|
|
<para style="style.smallEvent"><strong>Small Event</strong></para>
|
|
{% elif object.event.riskassessment.event_size == 1 %}
|
|
<para style="style.mediumEvent"><strong>Medium Event</strong></para>
|
|
{% elif object.event.riskassessment.event_size == 2 %}
|
|
<para style="style.largeEvent"><strong>Large Event</strong></para>
|
|
{% endif %}
|
|
|
|
<spacer length="15"/>
|
|
|
|
<blockTable colWidths="250,250">
|
|
<tr>
|
|
<td><para><strong>Power MIC:</strong> {{ object.power_mic }}</para></td>
|
|
<td><para><strong>Venue:</strong> {{ object.event.venue }}</para></td>
|
|
|
|
</tr>
|
|
<tr>
|
|
<td><para><strong>Event Date:</strong> {{ object.event.start_date |date:"D d/m/Y" }}</para></td>
|
|
<td><para><strong>Generators:</strong> {{ object.event.riskassessment.generators|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
<tr>
|
|
<td><para><strong>Power Test taken at:</strong> {{ object.date_created|date:"D d/m/Y H:i" }}</para></td>
|
|
<td><para><strong>Other Companies Power:</strong> {{ object.event.riskassessment.other_companies_power|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
</blockTable>
|
|
|
|
<spacer length="15"/>
|
|
|
|
{% if object.notes %}
|
|
<hr/>
|
|
<spacer length="15"/>
|
|
<para><strong>Additional Notes:</strong></para>
|
|
<spacer length="15"/>
|
|
<para>{{ object.notes }}</para>
|
|
<spacer length="15"/>
|
|
{% endif %}
|
|
|
|
<hr/>
|
|
<spacer length="15"/>
|
|
|
|
{% comment %}
|
|
0 - Small event
|
|
1 - Medium event (extra power records)
|
|
2 - Large event (extra power records)
|
|
{% endcomment %}
|
|
|
|
{% if object.event.riskassessment.event_size >= 1 %}
|
|
|
|
<para alignment="center"><strong>Power Test results enclosed on next page</strong></para>
|
|
|
|
<condPageBreak height="10in"/>
|
|
|
|
<h2 fontSize="16">Event Power Checklist</h2>
|
|
<spacer length="15"/>
|
|
|
|
<blockTable colWidths="250,270" style="powerTable">
|
|
<tr>
|
|
<td><para><strong>All circuit RCDs tested?</strong></para><para style="style.smallText">(using test button)</para></td>
|
|
<td><para>{{ object.all_rcds_tested|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
<tr>
|
|
<td><para><strong>Public/performer accessible circuits tested?</strong></para><para style="style.smallText">(using socket tester)</para></td>
|
|
<td><para>{{ object.public_sockets_tested|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
<tr>
|
|
<td><para><strong>Source RCD protected?</strong></para><para style="style.smallText">(if cable is more than 3m long)</para></td>
|
|
<td><para>{{ object.source_rcd|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
<tr>
|
|
<td><para><strong>Appropriate and clear labelling on distribution and cabling?</strong></para></td>
|
|
<td><para>{{ object.labelling|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
<tr>
|
|
<td><para><strong>Equipment appropriately earthed?</strong></para><para style="style.smallText">(truss, stage, generators, etc.)</para></td>
|
|
<td><para>{{ object.earthing|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
<tr>
|
|
<td><para><strong>All equipment in PAT period?</strong><br/><br/></para></td>
|
|
<td><para>{{ object.pat|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
</blockTable>
|
|
|
|
<spacer length="15"/>
|
|
|
|
<h2 fontSize="14">Power tests (First Distro)</h2>
|
|
<spacer length="5"/>
|
|
|
|
<blockTable colWidths="100,410" style="voltageTable">
|
|
<tr>
|
|
<td><para><strong>Voltage</strong></para><para style="style.smallText">(cube meter) / V</para></td>
|
|
<td>
|
|
<blockTable colWidths="100,100,100" style="powerTable">
|
|
<tr>
|
|
<td><para><strong>L1 - N</strong></para></td>
|
|
<td><para><strong>L2 - N</strong></para></td>
|
|
<td><para><strong>L3 - N</strong></para></td>
|
|
</tr>
|
|
<tr>
|
|
<td>{{ object.fd_voltage_l1}}</td>
|
|
<td>{{ object.fd_voltage_l2}}</td>
|
|
<td>{{ object.fd_voltage_l3}}</td>
|
|
</tr>
|
|
</blockTable>
|
|
</td>
|
|
</tr>
|
|
</blockTable>
|
|
|
|
<spacer length="10"/>
|
|
|
|
<blockTable colWidths="100,100,190,120" style="voltageTable">
|
|
<tr>
|
|
<td><para><strong>Phase Rotation</strong></para><para style="style.smallText">(if required)</para></td>
|
|
<td><para>{{ object.fd_phase_rotation|yesno|capfirst }}</para></td>
|
|
<td><para><strong>Earth Fault Loop Impedance (Z<sub>s</sub>) / Ω</strong></para></td>
|
|
<td><para>{{ object.fd_earth_fault }}</para></td>
|
|
</tr>
|
|
</blockTable>
|
|
|
|
<spacer length="15"/>
|
|
|
|
<para><strong>Prospective Short Circuit Current (PSCC)</strong> {{ object.fd_pssc }} A</para>
|
|
|
|
<spacer length="15"/>
|
|
|
|
<h2 fontSize="14">Power Tests (Worst Case Points)</h2>
|
|
<spacer length="15"/>
|
|
|
|
<blockTable colWidths="100,100,190,120" style="powerTable">
|
|
<tr>
|
|
<td><para><strong>Description</strong></para></td>
|
|
<td><para><strong>Polarity checked?</strong></para></td>
|
|
<td><para><strong>Voltage / V</strong></para></td>
|
|
<td><para><strong>Earth Fault Loop Impedance (Z<sub>s</sub>) / Ω</strong></para></td>
|
|
</tr>
|
|
{% if object.w1_description %}
|
|
<tr>
|
|
<td><para><strong>{{ object.w1_description }}</strong></para></td>
|
|
<td><para>{{ object.w1_polarity|yesno|capfirst }}</para></td>
|
|
<td><para>{{ object.w1_voltage }} V</para></td>
|
|
<td><para>{{ object.w1_earth_fault }}</para></td>
|
|
</tr>
|
|
{% endif %}
|
|
{% if object.w2_description %}
|
|
<tr>
|
|
<td><para><strong>{{ object.w2_description }}</strong></para></td>
|
|
<td><para>{{ object.w2_polarity|yesno|capfirst }}</para></td>
|
|
<td><para>{{ object.w2_voltage }} V</para></td>
|
|
<td><para>{{ object.w2_earth_fault }}</para></td>
|
|
</tr>
|
|
{% endif %}
|
|
{% if object.w3_description %}
|
|
<tr>
|
|
<td><para><strong>{{ object.w3_description }}</strong></para></td>
|
|
<td><para>{{ object.w3_polarity|yesno|capfirst }}</para></td>
|
|
<td><para>{{ object.w3_voltage }} V</para></td>
|
|
<td><para>{{ object.w3_earth_fault }}</para></td>
|
|
</tr>
|
|
{% endif %}
|
|
</blockTable>
|
|
|
|
{% else %}
|
|
|
|
{% comment %}
|
|
Small power test
|
|
{% endcomment %}
|
|
|
|
<h2 fontSize="16">Power Checklist</h2>
|
|
<spacer length="15"/>
|
|
|
|
<blockTable colWidths="250,270" style="powerTable">
|
|
<tr>
|
|
<td><para><strong>RCDs installed where needed and tested?</strong><br/><br/></para></td>
|
|
<td><para>{{ object.rcds|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
<tr>
|
|
<td><para><strong>Electrical supplies tested?</strong><br/><br/></para></td>
|
|
<td><para>{{ object.supply_test|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
<tr>
|
|
<td><para><strong>Equipment appropriately earthed?</strong></para><para style="style.smallText">(truss, stage, generators, etc.)</para></td>
|
|
<td><para>{{ object.earthing|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
<tr>
|
|
<td><para><strong>All equipment in PAT period?</strong><br/><br/></para></td>
|
|
<td><para>{{ object.pat|yesno|capfirst }}</para></td>
|
|
</tr>
|
|
</blockTable>
|
|
{% endif %}
|
|
|
|
{% endblock %}
|