show build on website footer
This commit is contained in:
@@ -20,6 +20,7 @@ Backend:
|
||||
- `/api/health` returns health/version information.
|
||||
- `/api/user` returns the authenticated user.
|
||||
- Access events are appended to `access_log.json`.
|
||||
- `build_info.json` is loaded at startup and exposed to all templates as `build_info`.
|
||||
|
||||
Frontend:
|
||||
|
||||
@@ -28,6 +29,26 @@ Frontend:
|
||||
- `window.ARTICLE_DATA` is loaded from `/static/article-data.json`.
|
||||
- `window.APP_CONFIG` is currently defined inline for forklift rules.
|
||||
- A disclaimer modal blocks use until the user checks the confirmation checkbox.
|
||||
- The footer displays build metadata: version, branch, commit, and timestamp.
|
||||
|
||||
## Build Info
|
||||
|
||||
Build/deployment metadata is read from:
|
||||
|
||||
```text
|
||||
build_info.json
|
||||
```
|
||||
|
||||
Expected fields:
|
||||
|
||||
- `version`
|
||||
- `branch`
|
||||
- `commit`
|
||||
- `timestamp`
|
||||
|
||||
If `build_info.json` is missing, malformed, or does not contain a usable value, RollCalc falls back to `unknown` for that value and continues serving the site.
|
||||
|
||||
The data is loaded centrally in `app.py` and made available to every template as `build_info`.
|
||||
|
||||
## Roll Geometry
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@ The app uses HTTP Basic Auth. Current credentials are defined in `BETA_USERS` in
|
||||
├── app.py
|
||||
├── requirements.txt
|
||||
├── README.md
|
||||
├── build_info.json
|
||||
├── access_log.json
|
||||
├── config.json
|
||||
├── article-data_.json
|
||||
@@ -101,6 +102,7 @@ The template contains:
|
||||
|
||||
- Page layout and all main CSS.
|
||||
- A disclaimer modal shown after Basic Auth login and before calculator use.
|
||||
- Footer build metadata from `build_info`.
|
||||
- Global state:
|
||||
- `window.ARTICLE_DATA`
|
||||
- `window.APP_CONFIG`
|
||||
@@ -261,6 +263,19 @@ JSON audit log written by `app.py`.
|
||||
|
||||
Important implementation detail: each logged access reads and rewrites the entire JSON file. This is simple but not concurrency-safe and can become inefficient as the file grows.
|
||||
|
||||
### `build_info.json`
|
||||
|
||||
Deployment/build metadata displayed in the site footer.
|
||||
|
||||
Expected fields:
|
||||
|
||||
- `version`
|
||||
- `branch`
|
||||
- `commit`
|
||||
- `timestamp`
|
||||
|
||||
`app.py` loads this file centrally at startup and exposes it to all templates as `build_info`. If the file is missing, invalid, or a field is empty, the affected values fall back to `unknown` and the website continues to work.
|
||||
|
||||
### `fix_article_data.py`
|
||||
|
||||
Utility script that updates relative frontend fetch/register paths to Flask-style `/static/...` paths and checks that key static files exist.
|
||||
|
||||
@@ -621,5 +621,12 @@
|
||||
"endpoint": "/",
|
||||
"method": "GET",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"timestamp": "2026-07-07T14:46:22.335316",
|
||||
"username": "mtazl",
|
||||
"endpoint": "/",
|
||||
"method": "GET",
|
||||
"status": 200
|
||||
}
|
||||
]
|
||||
@@ -29,6 +29,43 @@ BETA_USERS = {
|
||||
|
||||
# Logging für Auditing
|
||||
LOG_FILE = "access_log.json"
|
||||
BUILD_INFO_FILE = "build_info.json"
|
||||
UNKNOWN_BUILD_INFO = {
|
||||
"version": "unknown",
|
||||
"branch": "unknown",
|
||||
"commit": "unknown",
|
||||
"timestamp": "unknown"
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# BUILD INFO
|
||||
# ============================================================================
|
||||
|
||||
def load_build_info():
|
||||
"""Load deployment/build metadata for templates."""
|
||||
try:
|
||||
with open(BUILD_INFO_FILE, "r") as f:
|
||||
data = json.load(f)
|
||||
except Exception as e:
|
||||
print(f"[Build Info Error] {e}")
|
||||
return UNKNOWN_BUILD_INFO.copy()
|
||||
|
||||
if not isinstance(data, dict):
|
||||
return UNKNOWN_BUILD_INFO.copy()
|
||||
|
||||
build_info = UNKNOWN_BUILD_INFO.copy()
|
||||
for key in build_info:
|
||||
value = data.get(key)
|
||||
if isinstance(value, str) and value.strip():
|
||||
build_info[key] = value.strip()
|
||||
return build_info
|
||||
|
||||
BUILD_INFO = load_build_info()
|
||||
|
||||
@app.context_processor
|
||||
def inject_build_info():
|
||||
"""Make build metadata available in all templates."""
|
||||
return {"build_info": BUILD_INFO}
|
||||
|
||||
# ============================================================================
|
||||
# AUTHENTICATION
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": "0.4",
|
||||
"branch": "develop/v0.4",
|
||||
"commit": "ffa3481",
|
||||
"timestamp": "2026-07-07T10:26:13Z"
|
||||
}
|
||||
Executable
+16
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
cat > build_info.json <<EOF
|
||||
{
|
||||
"version": "v0.4-dev",
|
||||
"branch": "$(git branch --show-current)",
|
||||
"commit": "$(git rev-parse --short HEAD)",
|
||||
"timestamp": "$(date -Iseconds)"
|
||||
}
|
||||
EOF
|
||||
@@ -60,6 +60,7 @@
|
||||
.fc-req-nok { color: #dc3545; font-weight: 600; }
|
||||
.formula-box { background: #f8f9fa; border: 1px solid #e0e0e0; border-radius: 6px; padding: 10px 14px; font-size: 12px; color: #666; margin-top: 18px; font-family: 'Courier New', monospace; }
|
||||
.footer { text-align: center; font-size: 11px; color: #aaa; padding: 18px; margin-top: 30px; }
|
||||
.footer-build-info { margin-top: 6px; color: #bbb; }
|
||||
.disclaimer-overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
@@ -844,6 +845,9 @@
|
||||
|
||||
<div class="footer">
|
||||
Naue GmbH & Co. KG · Roll Diameter Calculator · Internal Application
|
||||
<div class="footer-build-info">
|
||||
Version {{ build_info.version }} · Branch {{ build_info.branch }} · Commit {{ build_info.commit }} · Built {{ build_info.timestamp }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
Reference in New Issue
Block a user