push
This commit is contained in:
215
app/templates/admin/system_data.html
Normal file
215
app/templates/admin/system_data.html
Normal file
@@ -0,0 +1,215 @@
|
||||
{% extends 'admin/admin_base.html' %}
|
||||
{% block title %}<i class="fa-solid fa-microchip me-2 text-primary"></i>Dane systemowe{% endblock %}
|
||||
{% block admin_content %}
|
||||
<div class="d-flex justify-content-between align-items-start flex-wrap gap-3 mb-3">
|
||||
<div>
|
||||
<h4 class="mb-1">Dane systemowe</h4>
|
||||
<div class="text-secondary">Skrócony widok techniczny: proces, health, baza, integracje i katalogi.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-{{ 'warning' if data.health.redis in ['fallback', 'error'] else 'secondary' }} py-2 mb-3">
|
||||
<div class="d-flex flex-wrap justify-content-between gap-2 align-items-center">
|
||||
<strong>Redis: {{ data.health.redis|upper }}</strong>
|
||||
<span class="small text-break">{{ data.health.redis_details or 'brak szczegółów' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-3 mb-3">
|
||||
{% for card in data.overview %}
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card shadow-sm border-0 h-100">
|
||||
<div class="card-body p-3">
|
||||
<div class="d-flex justify-content-between align-items-start gap-3">
|
||||
<div>
|
||||
<div class="small text-secondary text-uppercase mb-1">{{ card.label }}</div>
|
||||
<div class="fs-4 fw-semibold mb-1">{{ card.value }}</div>
|
||||
<div class="small text-secondary">{{ card.subvalue }}</div>
|
||||
</div>
|
||||
<span class="badge text-bg-{{ card.tone }} rounded-pill"><i class="fa-solid {{ card.icon }}"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="row g-3 mb-3">
|
||||
<div class="col-xl-7">
|
||||
<div class="card shadow-sm border-0 h-100">
|
||||
<div class="card-header bg-body-tertiary py-2"><strong>Proces i health</strong></div>
|
||||
<div class="card-body p-3">
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6">
|
||||
<div class="row g-2 small">
|
||||
<div class="col-6"><div class="text-secondary">CPU</div><div class="fw-semibold">{{ data.process.cpu_percent }}%</div></div>
|
||||
<div class="col-6"><div class="text-secondary">RAM</div><div class="fw-semibold">{{ data.process.rss_human }}</div></div>
|
||||
<div class="col-6"><div class="text-secondary">PID</div><div>{{ data.process.pid }}</div></div>
|
||||
<div class="col-6"><div class="text-secondary">Wątki</div><div>{{ data.process.threads }}</div></div>
|
||||
<div class="col-6"><div class="text-secondary">Otwarte pliki</div><div>{{ data.process.open_files }}</div></div>
|
||||
<div class="col-6"><div class="text-secondary">Pamięć hosta</div><div>{{ data.process.system_memory_percent }}%</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="row g-2">
|
||||
{% set ok_values = ['ok', 'mock', 'configured', 'fallback'] %}
|
||||
{% set health_items = [('Baza', data.health.db), ('SMTP', data.health.smtp), ('Redis', data.health.redis), ('KSeF', data.health.ksef), ('CEIDG', data.health.ceidg)] %}
|
||||
{% for label, value in health_items %}
|
||||
<div class="col-6">
|
||||
<div class="border rounded p-2 h-100 small">
|
||||
<div class="text-secondary">{{ label }}</div>
|
||||
<div class="fw-semibold">
|
||||
<span class="badge text-bg-{{ 'success' if value in ok_values else 'danger' if value == 'error' else 'secondary' }} rounded-pill">{{ value }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<div class="col-12">
|
||||
<div class="border rounded p-2 small d-flex justify-content-between align-items-center">
|
||||
<span>Podsumowanie health</span><strong>{{ data.overview[5].value }}</strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="row g-2 small text-secondary">
|
||||
<div class="col-md-6"><strong>Python:</strong> {{ data.process.python }}</div>
|
||||
<div class="col-md-6 text-break"><strong>Platforma:</strong> {{ data.process.platform }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-xl-5">
|
||||
<div class="card shadow-sm border-0 h-100">
|
||||
<div class="card-header bg-body-tertiary py-2"><strong>Aplikacja</strong></div>
|
||||
<div class="card-body p-3">
|
||||
<div class="row g-2 mb-3 text-center">
|
||||
<div class="col-6"><div class="border rounded p-2"><div class="small text-secondary">Użytkownicy</div><div class="fs-4 fw-semibold">{{ data.app.users_count }}</div></div></div>
|
||||
<div class="col-6"><div class="border rounded p-2"><div class="small text-secondary">Firmy</div><div class="fs-4 fw-semibold">{{ data.app.companies_count }}</div></div></div>
|
||||
<div class="col-12"><div class="border rounded p-2 d-flex justify-content-between align-items-center"><span>Tryb tylko do odczytu</span><span class="badge text-bg-{{ 'warning' if data.app.read_only_global else 'success' }} rounded-pill">{{ 'ON' if data.app.read_only_global else 'OFF' }}</span></div></div>
|
||||
</div>
|
||||
<div class="small text-secondary mb-1">Aktywna firma</div>
|
||||
<div class="mb-2">{{ data.app.current_company }}</div>
|
||||
<div class="small text-secondary mb-1">Strefa czasowa</div>
|
||||
<div class="mb-3">{{ data.app.app_timezone }}</div>
|
||||
<div class="small text-secondary mb-2">Największe zbiory danych</div>
|
||||
{% for item in data.app.counts_top[:5] %}
|
||||
<div class="d-flex justify-content-between small border-bottom py-1"><span>{{ item.label }}</span><strong>{{ item.count }}</strong></div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-3 mb-3">
|
||||
<div class="col-xl-5">
|
||||
<div class="card shadow-sm border-0 h-100">
|
||||
<div class="card-header bg-body-tertiary py-2"><strong>Baza danych</strong></div>
|
||||
<div class="card-body p-3 small">
|
||||
<div class="mb-1"><span class="text-secondary">Silnik:</span> {{ data.database.engine }}</div>
|
||||
<div class="mb-2 text-break"><span class="text-secondary">Połączenie:</span> {{ data.database.uri }}</div>
|
||||
{% if data.database.sqlite_path %}
|
||||
<div class="mb-2 text-break"><span class="text-secondary">SQLite:</span> {{ data.database.sqlite_path }} <span class="text-secondary">({{ data.database.sqlite_size }})</span></div>
|
||||
{% endif %}
|
||||
<div class="small text-secondary mb-2">Największe tabele</div>
|
||||
{% for item in data.database.largest_tables %}
|
||||
<div class="d-flex justify-content-between border-bottom py-1"><span>{{ item.table }}</span><strong>{{ item.rows }}</strong></div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-xl-7">
|
||||
<div class="card shadow-sm border-0 h-100">
|
||||
<div class="card-header bg-body-tertiary py-2"><strong>Katalogi robocze</strong></div>
|
||||
<div class="card-body p-0">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm align-middle mb-0">
|
||||
<thead><tr><th>Katalog</th><th>Rozmiar</th><th>Wolne</th><th class="text-end">Zajęcie</th></tr></thead>
|
||||
<tbody>
|
||||
{% for item in data.storage %}
|
||||
<tr>
|
||||
<td><div>{{ item.label }}</div><div class="small text-secondary text-break">{{ item.path }}</div></td>
|
||||
<td>{{ item.size_human }}</td>
|
||||
<td>{{ item.disk_free }}</td>
|
||||
<td class="text-end">{{ item.disk_percent }}%</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="integrations" class="row g-3 mb-3">
|
||||
<div class="col-xl-6">
|
||||
<div class="card shadow-sm border-0 h-100">
|
||||
<div class="card-header d-flex justify-content-between align-items-center bg-body-tertiary py-2">
|
||||
<strong>Połączenie KSeF</strong>
|
||||
<span class="badge text-bg-{{ 'success' if data.integrations.ksef.status in ['ok', 'mock'] else 'danger' }} rounded-pill">{{ data.integrations.ksef.status }}</span>
|
||||
</div>
|
||||
<div class="card-body p-3 small">
|
||||
<div class="mb-2"><span class="text-secondary">Komunikat:</span> {{ data.integrations.ksef.message }}</div>
|
||||
<div class="mb-2 text-break"><span class="text-secondary">Endpoint:</span> {{ data.integrations.ksef.base_url or '—' }}</div>
|
||||
{% if data.integrations.ksef.auth_mode %}<div class="mb-2"><span class="text-secondary">Tryb autoryzacji:</span> {{ data.integrations.ksef.auth_mode }}</div>{% endif %}
|
||||
<details>
|
||||
<summary class="text-secondary">Przykładowa odpowiedź API</summary>
|
||||
<pre class="small bg-body-tertiary p-3 rounded overflow-auto mt-2" style="max-height:18rem;">{{ json_preview(data.integrations.ksef.sample) }}</pre>
|
||||
</details>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-xl-6">
|
||||
<div class="card shadow-sm border-0 h-100">
|
||||
<div class="card-header d-flex justify-content-between align-items-center bg-body-tertiary py-2">
|
||||
<strong>Połączenie CEIDG</strong>
|
||||
<span class="badge text-bg-{{ 'success' if data.integrations.ceidg.status == 'ok' else 'danger' }} rounded-pill">{{ data.integrations.ceidg.status }}</span>
|
||||
</div>
|
||||
<div class="card-body p-3 small">
|
||||
<div class="mb-2"><span class="text-secondary">Komunikat:</span> {{ data.integrations.ceidg.message }}</div>
|
||||
<div class="mb-2"><span class="text-secondary">Tryb:</span> {{ data.integrations.ceidg.environment }}</div>
|
||||
<div class="mb-2 text-break"><span class="text-secondary">Endpoint:</span> {{ data.integrations.ceidg.url }}</div>
|
||||
{% if data.integrations.ceidg.technical_details %}<div class="mb-2 text-break"><span class="text-secondary">Szczegóły:</span> {{ data.integrations.ceidg.technical_details }}</div>{% endif %}
|
||||
<details>
|
||||
<summary class="text-secondary">Przykładowa odpowiedź API</summary>
|
||||
<pre class="small bg-body-tertiary p-3 rounded overflow-auto mt-2" style="max-height:18rem;">{{ json_preview(data.integrations.ceidg.sample) }}</pre>
|
||||
</details>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-3">
|
||||
<div class="col-xl-6">
|
||||
<div class="card shadow-sm border-0">
|
||||
<div class="card-header bg-body-tertiary py-2"><strong>Modele aplikacji</strong></div>
|
||||
<div class="card-body p-0">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm align-middle mb-0">
|
||||
<thead><tr><th>Obiekt</th><th class="text-end">Liczba</th></tr></thead>
|
||||
<tbody>{% for item in data.app.counts %}<tr><td>{{ item.label }}</td><td class="text-end">{{ item.count }}</td></tr>{% endfor %}</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xl-6">
|
||||
<div class="card shadow-sm border-0">
|
||||
<div class="card-header bg-body-tertiary py-2"><strong>Tabele bazy</strong></div>
|
||||
<div class="card-body p-0">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm align-middle mb-0">
|
||||
<thead><tr><th>Tabela</th><th class="text-end">Rekordy</th></tr></thead>
|
||||
<tbody>{% for item in data.database.table_rows %}<tr><td>{{ item.table }}</td><td class="text-end">{{ item.rows }}</td></tr>{% endfor %}</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user