197 lines
8.3 KiB
HTML
197 lines
8.3 KiB
HTML
{% extends "base.html" %}
|
||
{% block title %}WMT Client Releases – {{ app_name }}{% endblock %}
|
||
{% block page_title %}WMT Client Release Management{% endblock %}
|
||
|
||
{% block content %}
|
||
<div class="row g-4">
|
||
|
||
<!-- Current release info -->
|
||
<div class="col-lg-5">
|
||
<div class="card h-100">
|
||
<div class="card-header">
|
||
<i class="fas fa-box-open me-2"></i>Current Release
|
||
</div>
|
||
<div class="card-body">
|
||
{% if meta %}
|
||
<table class="table table-sm mb-3">
|
||
<tr><th style="width:130px">Version</th>
|
||
<td><span class="badge bg-primary fs-6">v{{ meta.version }}</span></td></tr>
|
||
<tr><th>File</th>
|
||
<td><code>{{ meta.filename }}</code></td></tr>
|
||
<tr><th>Size</th>
|
||
<td>{% if zip_size %}{{ (zip_size / 1024 / 1024) | round(2) }} MB{% else %}<span class="text-danger">file missing!</span>{% endif %}</td></tr>
|
||
<tr><th>Uploaded</th>
|
||
<td>{{ meta.uploaded_at }}</td></tr>
|
||
<tr><th>Notes</th>
|
||
<td>{{ meta.notes or '—' }}</td></tr>
|
||
</table>
|
||
|
||
<div class="d-flex gap-2">
|
||
<a href="{{ url_for('wmt_api.download_client_release') }}"
|
||
class="btn btn-outline-primary btn-sm">
|
||
<i class="fas fa-download me-1"></i>Download zip
|
||
</a>
|
||
<form method="post" action="{{ url_for('wmt_web.releases_delete') }}"
|
||
onsubmit="return confirm('Delete release v{{ meta.version }}? Clients will not find an update until you upload a new one.')">
|
||
<button type="submit" class="btn btn-outline-danger btn-sm">
|
||
<i class="fas fa-trash me-1"></i>Delete release
|
||
</button>
|
||
</form>
|
||
</div>
|
||
|
||
{% else %}
|
||
<div class="text-center text-muted py-4">
|
||
<i class="fas fa-inbox fa-3x mb-3 d-block"></i>
|
||
No release uploaded yet.<br>
|
||
<small>Upload a zip below to enable client auto-update.</small>
|
||
</div>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Upload new release -->
|
||
<div class="col-lg-7">
|
||
<div class="card h-100">
|
||
<div class="card-header">
|
||
<i class="fas fa-upload me-2"></i>Upload New Release
|
||
</div>
|
||
<div class="card-body">
|
||
<form method="post" action="{{ url_for('wmt_web.releases_upload') }}"
|
||
enctype="multipart/form-data">
|
||
|
||
<div class="mb-3">
|
||
<label class="form-label fw-semibold">Version <span class="text-danger">*</span></label>
|
||
<input type="text" name="version" class="form-control" placeholder="e.g. 3.0"
|
||
pattern="\d+(\.\d+)*" required>
|
||
<div class="form-text">Numeric only, e.g. <code>3.0</code> or <code>3.1.2</code>.
|
||
Must be higher than the current version to trigger client updates.</div>
|
||
</div>
|
||
|
||
<div class="mb-3">
|
||
<label class="form-label fw-semibold">Release Notes</label>
|
||
<textarea name="notes" class="form-control" rows="3"
|
||
placeholder="What changed in this version?"></textarea>
|
||
</div>
|
||
|
||
<div class="mb-4">
|
||
<label class="form-label fw-semibold">Release Zip <span class="text-danger">*</span></label>
|
||
<input type="file" name="release_zip" class="form-control" accept=".zip" required>
|
||
<div class="form-text">
|
||
Must contain <code>app.py</code> at the zip root.<br>
|
||
Include <code>dependency_utils.py</code>, <code>config.py</code>,
|
||
<code>Files/reposytory/</code>, and <code>Files/Screen.html</code> for a full release.
|
||
</div>
|
||
</div>
|
||
|
||
<div class="alert alert-info py-2">
|
||
<i class="fas fa-info-circle me-1"></i>
|
||
Uploading will <strong>replace</strong> the current release immediately.
|
||
All WMT clients will download the new version on their next 5-minute sync cycle.
|
||
</div>
|
||
|
||
<button type="submit" class="btn btn-primary">
|
||
<i class="fas fa-upload me-2"></i>Upload & Set as Latest
|
||
</button>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Build from local folder -->
|
||
<div class="col-12">
|
||
<div class="card border-success">
|
||
<div class="card-header bg-success bg-opacity-10 text-success">
|
||
<i class="fas fa-folder-open me-2"></i>Build Release from Server Folder
|
||
</div>
|
||
<div class="card-body">
|
||
<p class="text-muted mb-3">
|
||
Package the WMT source folder that lives on <em>this</em> server into a clean release zip.
|
||
Hidden files (<code>.git</code>, <code>.gitignore</code>, <code>.lgd-nfy0</code>, …),
|
||
<code>__pycache__</code>, <code>data/</code>, <code>venv/</code> and compiled
|
||
<code>.pyc</code> / <code>.log</code> files are automatically excluded.
|
||
</p>
|
||
<form method="post" action="{{ url_for('wmt_web.releases_build') }}">
|
||
<div class="row g-3">
|
||
<div class="col-md-5">
|
||
<label class="form-label fw-semibold">Source Folder <span class="text-danger">*</span></label>
|
||
<input type="text" name="folder_path" class="form-control font-monospace"
|
||
value="/home/pi/Desktop/WMT" required>
|
||
<div class="form-text">Absolute path to the WMT folder on this server.</div>
|
||
</div>
|
||
<div class="col-md-2">
|
||
<label class="form-label fw-semibold">Version <span class="text-danger">*</span></label>
|
||
<input type="text" name="version" class="form-control" placeholder="e.g. 3.1"
|
||
pattern="\d+(\.\d+)*" required>
|
||
</div>
|
||
<div class="col-md-5">
|
||
<label class="form-label fw-semibold">Release Notes</label>
|
||
<input type="text" name="notes" class="form-control"
|
||
placeholder="Short description of changes">
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mt-3 p-2 bg-light rounded border small text-muted">
|
||
<strong>Excluded automatically:</strong>
|
||
<code>.git/</code>
|
||
<code>.gitignore</code>
|
||
<code>.lgd-*</code>
|
||
any hidden file/folder ·
|
||
<code>__pycache__/</code>
|
||
<code>*.pyc</code>
|
||
<code>*.log</code>
|
||
<code>*.bak</code> ·
|
||
<code>data/</code>
|
||
<code>venv/</code>
|
||
</div>
|
||
|
||
<button type="submit" class="btn btn-success mt-3"
|
||
onclick="return confirm('Build a new release from the specified folder?')">
|
||
<i class="fas fa-hammer me-2"></i>Build & Set as Latest
|
||
</button>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- How it works -->
|
||
<div class="col-12">
|
||
<div class="card">
|
||
<div class="card-header bg-light">
|
||
<i class="fas fa-info-circle me-2"></i>How Auto-Update Works
|
||
</div>
|
||
<div class="card-body">
|
||
<div class="row g-3">
|
||
<div class="col-md-3 text-center">
|
||
<div class="fs-1 text-primary mb-1">1</div>
|
||
<strong>Client checks version</strong><br>
|
||
<small class="text-muted">Every 5 min, client calls
|
||
<code>GET /api/wmt/client/version</code>
|
||
and compares server version with its own (from line 1 of app.py)</small>
|
||
</div>
|
||
<div class="col-md-3 text-center">
|
||
<div class="fs-1 text-primary mb-1">2</div>
|
||
<strong>Download if outdated</strong><br>
|
||
<small class="text-muted">If server version > local version,
|
||
client downloads <code>GET /api/wmt/client/download</code></small>
|
||
</div>
|
||
<div class="col-md-3 text-center">
|
||
<div class="fs-1 text-primary mb-1">3</div>
|
||
<strong>Apply & back up</strong><br>
|
||
<small class="text-muted">Zip is extracted over the WMT folder.
|
||
Old <code>app.py</code> is backed up as <code>app.py.bak.<version></code></small>
|
||
</div>
|
||
<div class="col-md-3 text-center">
|
||
<div class="fs-1 text-primary mb-1">4</div>
|
||
<strong>Service restart</strong><br>
|
||
<small class="text-muted">Client calls <code>sudo systemctl restart wmt</code>
|
||
(or reboots) to start the new code</small>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
{% endblock %}
|