snapshot: preserve handbook, bilingual phase 2, and logo updates
This commit is contained in:
223
backend/workflows/templates/workflows/developer_handbook.html
Normal file
223
backend/workflows/templates/workflows/developer_handbook.html
Normal file
@@ -0,0 +1,223 @@
|
||||
{% load static %}
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>Developer Handbook</title>
|
||||
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
|
||||
<style>
|
||||
body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #1b2b43; padding: 20px; }
|
||||
.shell { max-width: 1120px; margin: 0 auto; background: #fff; border: 1px solid #d7e0ea; border-radius: 14px; padding: 18px; }
|
||||
.brand-logo { width: 190px; max-width: 100%; height: auto; margin: 0 0 10px; display: block; }
|
||||
.top { display: flex; justify-content: space-between; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 8px; }
|
||||
h1 { margin: 0; color: #000078; font-size: 30px; }
|
||||
.sub { margin: 8px 0 16px; color: #5f6f85; }
|
||||
.toc { border: 1px solid #d7e0ea; border-radius: 10px; padding: 10px; background: #f7fbff; margin-bottom: 16px; }
|
||||
.toc a { color: #0b4da2; text-decoration: none; margin-right: 10px; white-space: nowrap; }
|
||||
h2 { margin: 20px 0 8px; color: #113a74; border-bottom: 1px solid #e1e8f2; padding-bottom: 4px; }
|
||||
h3 { margin: 14px 0 6px; color: #183f77; }
|
||||
ul { margin: 8px 0 12px 20px; }
|
||||
li { margin: 4px 0; }
|
||||
code { background: #f1f5fb; border: 1px solid #dce6f3; border-radius: 6px; padding: 2px 6px; }
|
||||
pre { background: #f7fbff; border: 1px solid #dce6f3; border-radius: 10px; padding: 10px; overflow-x: auto; }
|
||||
.box { border: 1px solid #d7e0ea; border-radius: 10px; padding: 10px; background: #fcfdff; margin: 8px 0 12px; }
|
||||
.note { border-left: 4px solid #000078; padding: 8px 10px; background: #f4f8ff; margin: 10px 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="shell">
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
<div class="top">
|
||||
<h1>Developer Handbook</h1>
|
||||
<div style="display:flex; gap:8px; flex-wrap:wrap;">
|
||||
<a class="btn btn-secondary" href="/admin-tools/wiki/">Project Wiki</a>
|
||||
<a class="btn btn-secondary" href="/">Back to Home</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="sub">Engineering runbook for development, deployment, maintenance, and extension of the TUBCO Onboarding & Offboarding Portal.</p>
|
||||
|
||||
<div class="toc">
|
||||
<a href="#overview">Overview</a>
|
||||
<a href="#structure">Structure</a>
|
||||
<a href="#local">Local Dev</a>
|
||||
<a href="#docker">Docker</a>
|
||||
<a href="#db">Database</a>
|
||||
<a href="#translations">Translations</a>
|
||||
<a href="#pdf">PDF Pipeline</a>
|
||||
<a href="#email">Email Pipeline</a>
|
||||
<a href="#nextcloud">Nextcloud</a>
|
||||
<a href="#builders">Builders</a>
|
||||
<a href="#testing">Testing</a>
|
||||
<a href="#deploy">Deployment</a>
|
||||
<a href="#troubleshooting">Troubleshooting</a>
|
||||
<a href="#security">Security</a>
|
||||
</div>
|
||||
|
||||
<h2 id="overview">1) Overview</h2>
|
||||
<div class="box">
|
||||
<p>This handbook is for developers and maintainers. It documents the actual engineering workflow of the standalone product repository.</p>
|
||||
<ul>
|
||||
<li>Repository: <code>tubco-onboarding-offboarding-portal</code></li>
|
||||
<li>Main stack: Django + Celery + PostgreSQL + Redis + MailHog</li>
|
||||
<li>Runtime mode: Docker Compose for local development and staging-style operation</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h2 id="structure">2) Repository Structure</h2>
|
||||
<ul>
|
||||
<li><code>/backend/config/</code>: Django settings, WSGI, URL config</li>
|
||||
<li><code>/backend/workflows/</code>: application logic, views, models, tasks, templates, static assets</li>
|
||||
<li><code>/backend/media/templates/</code>: PDF HTML templates and letterhead source files</li>
|
||||
<li><code>/backend/media/pdfs/</code>: generated PDF outputs on host volume</li>
|
||||
<li><code>/backend/locale/</code>: translation catalogs</li>
|
||||
<li><code>/docker-compose.yml</code>: local runtime orchestration</li>
|
||||
<li><code>/Makefile</code>: repeatable translation commands</li>
|
||||
<li><code>/.github/workflows/i18n.yml</code>: translation compile validation in CI</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="local">3) Local Development Workflow</h2>
|
||||
<h3>Start</h3>
|
||||
<pre><code>cd /Users/bostame/Documents/tubco-onboarding-offboarding-portal
|
||||
docker compose up -d --build</code></pre>
|
||||
<h3>Main URLs</h3>
|
||||
<ul>
|
||||
<li>App: <code>http://127.0.0.1:8088/</code></li>
|
||||
<li>MailHog: <code>http://127.0.0.1:8025/</code></li>
|
||||
<li>Health check: <code>http://127.0.0.1:8088/healthz/</code></li>
|
||||
</ul>
|
||||
<h3>Bootstrap users</h3>
|
||||
<ul>
|
||||
<li>Admin: <code>admin_test</code> / <code>admin12345</code></li>
|
||||
<li>User: <code>user_test</code> / <code>user12345</code></li>
|
||||
</ul>
|
||||
|
||||
<h2 id="docker">4) Docker Operations</h2>
|
||||
<pre><code>docker compose up -d --build
|
||||
docker compose restart web
|
||||
docker compose restart worker
|
||||
docker compose logs --no-color --tail=120 web
|
||||
docker compose logs --no-color --tail=120 worker
|
||||
docker compose down
|
||||
docker compose down -v</code></pre>
|
||||
<div class="note">
|
||||
The source code is bind-mounted into the container. Most template/view/static changes only require a web restart, not a full rebuild. Image changes such as system packages require <code>docker compose up -d --build</code>.
|
||||
</div>
|
||||
|
||||
<h2 id="db">5) Database and Migrations</h2>
|
||||
<pre><code>docker compose exec -T web python manage.py makemigrations
|
||||
docker compose exec -T web python manage.py migrate
|
||||
docker compose exec -T web python manage.py check</code></pre>
|
||||
<ul>
|
||||
<li>Never edit or remove historical migrations casually.</li>
|
||||
<li>When adding fields to builder-driven models, preserve fallback behavior for existing rows.</li>
|
||||
<li>Fresh boot sequence runs migrations automatically in <code>entrypoint-web.sh</code>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="translations">6) Translation Workflow</h2>
|
||||
<h3>Standard Django i18n path</h3>
|
||||
<pre><code>make i18n-update-en
|
||||
make i18n-compile</code></pre>
|
||||
<p>Equivalent raw commands:</p>
|
||||
<pre><code>docker compose exec -T web django-admin makemessages -l en
|
||||
docker compose exec -T web django-admin compilemessages</code></pre>
|
||||
<ul>
|
||||
<li><code>gettext</code> is installed in the Docker image.</li>
|
||||
<li>Do not use custom ad hoc <code>.mo</code> compilation anymore.</li>
|
||||
<li>Phase 1 bilingual support covers fixed UI.</li>
|
||||
<li>Phase 2 covers builder-driven labels and checklist items with explicit German and English fields.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="pdf">7) PDF Pipeline</h2>
|
||||
<ul>
|
||||
<li>PDF generation is HTML-to-PDF using <code>xhtml2pdf</code>.</li>
|
||||
<li>Letterhead overlay is applied from <code>templates.pdf</code>.</li>
|
||||
<li>Main logic lives in <code>backend/workflows/tasks.py</code>.</li>
|
||||
<li>Key templates:
|
||||
<ul>
|
||||
<li><code>onboarding_template.html</code></li>
|
||||
<li><code>offboarding_template.html</code></li>
|
||||
<li><code>onboarding_intro_template.html</code></li>
|
||||
<li><code>onboarding_intro_session_pdf.html</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="note">
|
||||
xhtml2pdf is sensitive to layout complexity. Keep print templates conservative and verify every structural change with a real generated PDF.
|
||||
</div>
|
||||
|
||||
<h2 id="email">8) Email Pipeline</h2>
|
||||
<ul>
|
||||
<li>Notification defaults are defined in <code>DEFAULT_NOTIFICATION_TEMPLATES</code> in <code>tasks.py</code>.</li>
|
||||
<li>Admin-configured overrides live in <code>NotificationTemplate</code> and <code>NotificationRule</code>.</li>
|
||||
<li>Mail sending uses Celery tasks and supports test mode redirection.</li>
|
||||
<li>MailHog is the local verification path when test mode is active.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="nextcloud">9) Nextcloud Integration</h2>
|
||||
<ul>
|
||||
<li>Configured from Admin Apps → Integrations.</li>
|
||||
<li>Upload logic lives in <code>backend/workflows/services.py</code>.</li>
|
||||
<li>Feature can be globally toggled without changing environment variables.</li>
|
||||
<li>Failures should degrade gracefully and not block request persistence.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="builders">10) Builder Architecture</h2>
|
||||
<h3>Form Builder</h3>
|
||||
<ul>
|
||||
<li>Model: <code>FormFieldConfig</code> + <code>FormOption</code></li>
|
||||
<li>Controls field order, visibility, required flags, option sets, and bilingual label/help-text overrides</li>
|
||||
</ul>
|
||||
<h3>Intro Builder</h3>
|
||||
<ul>
|
||||
<li>Model: <code>IntroChecklistItem</code></li>
|
||||
<li>Controls additional checklist items used by intro PDF and live intro checklist</li>
|
||||
<li>Now supports bilingual DE/EN labels</li>
|
||||
</ul>
|
||||
<div class="note">
|
||||
Dynamic content should use explicit DE/EN fields with German fallback, not machine translation at runtime.
|
||||
</div>
|
||||
|
||||
<h2 id="testing">11) Testing and Validation</h2>
|
||||
<pre><code>docker compose exec -T web python manage.py check
|
||||
docker compose exec -T web python manage.py test
|
||||
docker compose exec -T web python manage.py run_staging_e2e_check</code></pre>
|
||||
<ul>
|
||||
<li>Use <code>check</code> after model/view/template changes.</li>
|
||||
<li>Use targeted shell checks for render validation when changing templates or routes.</li>
|
||||
<li>Use real PDF generation tests when changing PDF templates or intro/offboarding document logic.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="deploy">12) Deployment and Release Checklist</h2>
|
||||
<ol>
|
||||
<li>Run <code>manage.py check</code></li>
|
||||
<li>Run tests or targeted verification</li>
|
||||
<li>Run translation compile step</li>
|
||||
<li>Generate at least one onboarding/offboarding PDF if PDF templates changed</li>
|
||||
<li>Verify MailHog or SMTP path if email behavior changed</li>
|
||||
<li>Verify Nextcloud upload if integration behavior changed</li>
|
||||
<li>Update Project Wiki and Developer Handbook if architecture/workflow changed</li>
|
||||
<li>Take a snapshot commit before major next-phase work</li>
|
||||
</ol>
|
||||
|
||||
<h2 id="troubleshooting">13) Troubleshooting</h2>
|
||||
<ul>
|
||||
<li><strong>Page looks stale:</strong> restart <code>web</code> and hard-refresh browser</li>
|
||||
<li><strong>Second request hangs:</strong> inspect web logs and verify health endpoint</li>
|
||||
<li><strong>PDF looks unchanged:</strong> regenerate the PDF; browser may cache old file names unless the path changes</li>
|
||||
<li><strong>Language switch not visible:</strong> verify translation catalog compiled and restart web</li>
|
||||
<li><strong>Mail not visible:</strong> check MailHog on port <code>8025</code> and test/production mode toggle</li>
|
||||
<li><strong>Nextcloud sync unclear:</strong> verify config in Integrations page and inspect service logs</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="security">14) Security and Maintenance Notes</h2>
|
||||
<ul>
|
||||
<li>Containers run as non-root <code>app</code> user.</li>
|
||||
<li>Keep secrets in <code>.env</code>, not in tracked files.</li>
|
||||
<li>Avoid destructive git operations in a dirty repo.</li>
|
||||
<li>Prefer standard framework workflows over custom one-off maintenance scripts.</li>
|
||||
<li>When adding new features, document them in both the Project Wiki and this handbook if they change engineering workflow.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -11,7 +11,7 @@
|
||||
<body>
|
||||
<div class="shell">
|
||||
<div class="topbar">
|
||||
<img class="brand-logo" src="https://tub.co/media/site/0856bfc615-1750234287/tubco-wortbildmarke.svg" alt="TUB/CO Logo" />
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
<a class="btn btn-secondary" href="/">Zur Startseite</a>
|
||||
</div>
|
||||
|
||||
@@ -81,7 +81,8 @@
|
||||
{% csrf_token %}
|
||||
<input type="hidden" name="builder_action" value="add_option" />
|
||||
<input type="hidden" name="category" value="{{ selected_option_category }}" />
|
||||
<input type="text" name="label" placeholder="Neuer Optionsname" required />
|
||||
<input type="text" name="label" placeholder="Label (DE)" required />
|
||||
<input type="text" name="label_en" placeholder="Label (EN, optional)" />
|
||||
<input type="text" name="value" placeholder="Technischer Wert (optional)" />
|
||||
<button class="btn btn-primary" type="submit">Option hinzufügen</button>
|
||||
</form>
|
||||
@@ -93,7 +94,8 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Sortierung</th>
|
||||
<th>Label</th>
|
||||
<th>Label (DE)</th>
|
||||
<th>Label (EN)</th>
|
||||
<th>Value</th>
|
||||
<th>Aktiv</th>
|
||||
<th>Löschen</th>
|
||||
@@ -107,6 +109,7 @@
|
||||
<span class="drag-handle" title="Ziehen zum Sortieren">⋮⋮</span>
|
||||
</td>
|
||||
<td><input type="text" name="label_{{ item.id }}" value="{{ item.label }}" required /></td>
|
||||
<td><input type="text" name="label_en_{{ item.id }}" value="{{ item.label_en }}" /></td>
|
||||
<td><input type="text" name="value_{{ item.id }}" value="{{ item.value }}" /></td>
|
||||
<td><input type="checkbox" name="active_{{ item.id }}" {% if item.is_active %}checked{% endif %} /></td>
|
||||
<td>
|
||||
@@ -114,7 +117,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr><td colspan="5">Keine Optionen in dieser Kategorie.</td></tr>
|
||||
<tr><td colspan="6">Keine Optionen in dieser Kategorie.</td></tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -124,6 +127,47 @@
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="options-panel">
|
||||
<div class="options-head">
|
||||
<h2>Feldtexte verwalten</h2>
|
||||
</div>
|
||||
<form method="post" action="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}">
|
||||
{% csrf_token %}
|
||||
<div class="option-table-wrap">
|
||||
<table class="option-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Feld</th>
|
||||
<th>Label (DE)</th>
|
||||
<th>Label (EN)</th>
|
||||
<th>Hilfetext (DE)</th>
|
||||
<th>Hilfetext (EN)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in field_text_items %}
|
||||
<tr>
|
||||
<td>
|
||||
<input type="hidden" name="field_ids" value="{{ item.id }}" />
|
||||
<strong>{{ item.field_name }}</strong>
|
||||
</td>
|
||||
<td><input type="text" name="label_override_{{ item.id }}" value="{{ item.label_override }}" placeholder="Fallback: Standardlabel" /></td>
|
||||
<td><input type="text" name="label_override_en_{{ item.id }}" value="{{ item.label_override_en }}" placeholder="English label" /></td>
|
||||
<td><input type="text" name="help_text_override_{{ item.id }}" value="{{ item.help_text_override }}" placeholder="Optionaler Hilfetext" /></td>
|
||||
<td><input type="text" name="help_text_override_en_{{ item.id }}" value="{{ item.help_text_override_en }}" placeholder="Optional English help text" /></td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr><td colspan="5">Keine Feldkonfigurationen verfügbar.</td></tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="options-actions">
|
||||
<button class="btn btn-primary" type="submit" name="builder_action" value="save_field_texts">Feldtexte speichern</button>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<script src="{% static 'workflows/js/form_builder.js' %}"></script>
|
||||
|
||||
69
backend/workflows/templates/workflows/handbook.html
Normal file
69
backend/workflows/templates/workflows/handbook.html
Normal file
@@ -0,0 +1,69 @@
|
||||
{% load static i18n %}
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>Handbook</title>
|
||||
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
|
||||
<style>
|
||||
body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #1b2b43; padding: 20px; }
|
||||
.shell { max-width: 1120px; margin: 0 auto; background: #fff; border: 1px solid #d7e0ea; border-radius: 14px; padding: 18px; }
|
||||
.brand-logo { width: 190px; max-width: 100%; height: auto; margin: 0 0 10px; display: block; }
|
||||
.top { display: flex; justify-content: space-between; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 8px; }
|
||||
h1 { margin: 0; color: #000078; font-size: 30px; }
|
||||
.sub { margin: 8px 0 18px; color: #5f6f85; max-width: 760px; }
|
||||
.grid { display: grid; grid-template-columns: repeat(2, minmax(280px, 1fr)); gap: 14px; }
|
||||
.card { border: 1px solid #d7e0ea; border-radius: 14px; background: #fcfdff; padding: 16px; }
|
||||
.eyebrow { display: inline-block; padding: 5px 10px; border-radius: 999px; background: #eef4ff; color: #244a8f; border: 1px solid #d5e2f9; font-size: 12px; font-weight: 700; margin-bottom: 10px; }
|
||||
h2 { margin: 0 0 8px; color: #113a74; }
|
||||
p { margin: 0 0 14px; color: #5f6f85; }
|
||||
ul { margin: 0 0 14px 18px; color: #334155; }
|
||||
li { margin: 4px 0; }
|
||||
.actions { display: flex; gap: 8px; flex-wrap: wrap; }
|
||||
@media (max-width: 760px) { .grid { grid-template-columns: 1fr; } }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="shell">
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
<div class="top">
|
||||
<h1>Handbook</h1>
|
||||
<a class="btn btn-secondary" href="/">Back to Home</a>
|
||||
</div>
|
||||
<p class="sub">Single documentation entry point for both operational knowledge and long-term engineering knowledge.</p>
|
||||
|
||||
<div class="grid">
|
||||
<section class="card">
|
||||
<div class="eyebrow">Operations</div>
|
||||
<h2>Project Wiki</h2>
|
||||
<p>Operational and product-level documentation for onboarding, offboarding, PDFs, integrations, admin tools, and system behavior.</p>
|
||||
<ul>
|
||||
<li>workflow overview</li>
|
||||
<li>admin tools and system behavior</li>
|
||||
<li>integrations and operations</li>
|
||||
<li>runbook and troubleshooting</li>
|
||||
</ul>
|
||||
<div class="actions">
|
||||
<a class="btn btn-secondary" href="/admin-tools/wiki/">Open Project Wiki</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="card">
|
||||
<div class="eyebrow">Engineering</div>
|
||||
<h2>Developer Handbook</h2>
|
||||
<p>Engineering documentation for architecture, local setup, Docker, migrations, translations, deployment, testing, and long-term maintenance.</p>
|
||||
<ul>
|
||||
<li>repository and service structure</li>
|
||||
<li>Docker and migration workflow</li>
|
||||
<li>translation and builder architecture</li>
|
||||
<li>deployment, security, and maintenance notes</li>
|
||||
</ul>
|
||||
<div class="actions">
|
||||
<a class="btn btn-secondary" href="/admin-tools/developer-handbook/">Open Developer Handbook</a>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -56,12 +56,21 @@
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.brand-wrap {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
flex: 0 0 auto;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.brand-logo {
|
||||
width: 210px;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
margin: 0;
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
.quick-actions {
|
||||
@@ -436,7 +445,9 @@
|
||||
<body>
|
||||
<div class="shell">
|
||||
<div class="topbar">
|
||||
<img class="brand-logo" src="https://tub.co/media/site/0856bfc615-1750234287/tubco-wortbildmarke.svg" alt="TUB/CO Logo" />
|
||||
<div class="brand-wrap">
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
</div>
|
||||
<div class="quick-actions">
|
||||
<form method="post" action="{% url 'set_language' %}" class="lang-switch">
|
||||
{% csrf_token %}
|
||||
@@ -549,9 +560,9 @@
|
||||
<a class="btn btn-secondary" href="/admin-tools/intro-builder/">{% trans "Öffnen" %}</a>
|
||||
</section>
|
||||
<section class="admin-card">
|
||||
<h3>{% trans "Projekt Wiki" %}</h3>
|
||||
<p>{% trans "Dokumentation, Architektur und Runbook." %}</p>
|
||||
<a class="btn btn-secondary" href="/admin-tools/wiki/">{% trans "Öffnen" %}</a>
|
||||
<h3>{% trans "Handbook" %}</h3>
|
||||
<p>{% trans "Project wiki and developer documentation in one place." %}</p>
|
||||
<a class="btn btn-secondary" href="/admin-tools/handbook/">{% trans "Öffnen" %}</a>
|
||||
</section>
|
||||
<section class="admin-card">
|
||||
<h3>{% trans "Integrationen" %}</h3>
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
<body>
|
||||
<div class="shell">
|
||||
<div class="topbar">
|
||||
<img class="brand-logo" src="https://tub.co/media/site/0856bfc615-1750234287/tubco-wortbildmarke.svg" alt="TUB/CO Logo" />
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
<a class="btn btn-secondary" href="/">Zur Startseite</a>
|
||||
</div>
|
||||
<h1>Integrationen Setup</h1>
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<body>
|
||||
<div class="shell">
|
||||
<div class="topbar">
|
||||
<img class="brand-logo" src="https://tub.co/media/site/0856bfc615-1750234287/tubco-wortbildmarke.svg" alt="TUB/CO Logo" />
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
<a class="btn btn-secondary" href="/">Zur Startseite</a>
|
||||
</div>
|
||||
|
||||
@@ -66,9 +66,13 @@
|
||||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="label">Checklistenpunkt</label>
|
||||
<label for="label">Checklistenpunkt (DE)</label>
|
||||
<input id="label" name="label" placeholder="z. B. Nextcloud Ordnerstruktur erklärt" required />
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="label_en">Checklist item (EN)</label>
|
||||
<input id="label_en" name="label_en" placeholder="e.g. Nextcloud folder structure explained" />
|
||||
</div>
|
||||
<div class="actions">
|
||||
<button class="btn btn-primary" type="submit">Punkt hinzufügen</button>
|
||||
</div>
|
||||
@@ -85,7 +89,8 @@
|
||||
<tr>
|
||||
<th>Sortierung</th>
|
||||
<th>Abschnitt</th>
|
||||
<th>Checklistenpunkt</th>
|
||||
<th>Checklistenpunkt (DE)</th>
|
||||
<th>Checklistenpunkt (EN)</th>
|
||||
<th>Feld-Bedingung</th>
|
||||
<th>Operator</th>
|
||||
<th>Wert</th>
|
||||
@@ -108,6 +113,7 @@
|
||||
</select>
|
||||
</td>
|
||||
<td><input type="text" name="label_{{ item.id }}" value="{{ item.label }}" required /></td>
|
||||
<td><input type="text" name="label_en_{{ item.id }}" value="{{ item.label_en }}" /></td>
|
||||
<td>
|
||||
<select name="field_{{ item.id }}">
|
||||
{% for value, label in condition_field_choices %}
|
||||
@@ -129,7 +135,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr><td colspan="8">Noch keine benutzerdefinierten Checklistenpunkte angelegt. Solange die Liste leer ist, nutzt das System die integrierten Standardpunkte.</td></tr>
|
||||
<tr><td colspan="9">Noch keine benutzerdefinierten Checklistenpunkte angelegt. Solange die Liste leer ist, nutzt das System die integrierten Standardpunkte.</td></tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
</div>
|
||||
|
||||
<div class="wrap">
|
||||
<img class="brand-logo" src="https://tub.co/media/site/0856bfc615-1750234287/tubco-wortbildmarke.svg" alt="TUB/CO Logo" />
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
<div class="top-link" style="display:flex; gap:8px; align-items:center;">
|
||||
<form method="post" action="{% url 'set_language' %}" class="lang-switch" style="display:flex; gap:6px;">
|
||||
{% csrf_token %}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
</div>
|
||||
|
||||
<div class="top-wrap">
|
||||
<img class="brand-logo" src="https://tub.co/media/site/0856bfc615-1750234287/tubco-wortbildmarke.svg" alt="TUB/CO Logo" />
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
<div class="top-link" style="display:flex; gap:8px; align-items:center;">
|
||||
<form method="post" action="{% url 'set_language' %}" class="lang-switch" style="display:flex; gap:6px;">
|
||||
{% csrf_token %}
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
<body>
|
||||
<div class="shell">
|
||||
<div class="topbar">
|
||||
<img class="brand-logo" src="https://tub.co/media/site/0856bfc615-1750234287/tubco-wortbildmarke.svg" alt="TUB/CO Logo" />
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
<div class="top-actions">
|
||||
<a class="btn btn-secondary" href="/requests/">Zum Dashboard</a>
|
||||
<a class="btn btn-secondary" href="/">Zur Startseite</a>
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<div class="shell">
|
||||
<img class="brand-logo" src="https://tub.co/media/site/0856bfc615-1750234287/tubco-wortbildmarke.svg" alt="TUB/CO Logo" />
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
<div class="top">
|
||||
<h1>Project Wiki</h1>
|
||||
<a class="btn btn-secondary" href="/">Back to Home</a>
|
||||
@@ -165,7 +165,9 @@
|
||||
<ul>
|
||||
<li><strong>Current scope:</strong> the core user interface supports German and English switching for the main fixed UI pages.</li>
|
||||
<li><strong>Covered now:</strong> login, home, requests dashboard, onboarding form shell, offboarding form shell, and common status/messages in views.</li>
|
||||
<li><strong>Not fully bilingual yet:</strong> dynamic Form Builder content, intro-builder item labels, admin-configured email templates, and most generated PDF/business text remain primarily single-language.</li>
|
||||
<li><strong>Phase 2 added:</strong> dynamic Form Builder option labels, field label/help-text overrides, and intro-builder checklist item labels now support German and English values.</li>
|
||||
<li><strong>Editing path:</strong> these DE/EN values are maintained directly in the frontend builder pages, not only in Django admin.</li>
|
||||
<li><strong>Not fully bilingual yet:</strong> admin-configured email templates and several generated PDF/business text blocks still remain primarily single-language.</li>
|
||||
<li><strong>Implementation:</strong> Django i18n with locale middleware, translation catalogs, and a DE/EN language switch in the main UI.</li>
|
||||
</ul>
|
||||
|
||||
@@ -174,6 +176,8 @@
|
||||
<li>The long-term translation path uses Django's standard <code>makemessages</code> and <code>compilemessages</code> workflow.</li>
|
||||
<li><code>gettext</code> is installed in the Docker image so translations can be compiled inside the running container.</li>
|
||||
<li>Translation catalogs live under <code>/backend/locale/</code>.</li>
|
||||
<li>A root <code>Makefile</code> provides repeatable local commands for updating and compiling translations.</li>
|
||||
<li>CI validates translation compilation on push and pull request via <code>.github/workflows/i18n.yml</code>.</li>
|
||||
<li>The earlier ad hoc Python-based <code>.mo</code> compilation path should no longer be used for ongoing maintenance.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
@@ -877,7 +877,7 @@
|
||||
<div class="shell">
|
||||
<div class="topbar">
|
||||
<div class="brand-wrap">
|
||||
<img class="brand-logo" src="https://tub.co/media/site/0856bfc615-1750234287/tubco-wortbildmarke.svg" alt="TUB/CO Logo" />
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
</div>
|
||||
<div class="quick-actions">
|
||||
<form method="post" action="{% url 'set_language' %}" class="lang-switch">
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<body>
|
||||
<div class="shell">
|
||||
<div class="topbar">
|
||||
<img class="brand-logo" src="https://tub.co/media/site/0856bfc615-1750234287/tubco-wortbildmarke.svg" alt="TUB/CO Logo" />
|
||||
<img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" />
|
||||
<a class="btn btn-secondary" href="/">Zur Startseite</a>
|
||||
</div>
|
||||
<h1>Geplante Welcome E-Mails</h1>
|
||||
|
||||
Reference in New Issue
Block a user