Initial commit: Diario Conversazioni Olimpic Nastri

- Django 5.2 + PostgreSQL + Gunicorn
- Conversazioni, Obiettivi, Documenti PDF, Persone
- Commenti e aggiornamenti con modifica/eliminazione
- Agenda, ricerca live, giorni rimanenti scadenze
- Bootstrap 5 + HTMX + toast notifications
- Deploy: Nginx + Gunicorn + SSL
This commit is contained in:
automationkriz
2026-04-05 14:48:22 +00:00
commit d296353dcb
48 changed files with 3538 additions and 0 deletions

View File

@@ -0,0 +1,104 @@
{% extends "diario/base.html" %}
{% block title %}{{ persona.get_full_name|default:persona.username }}{% endblock %}
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-10">
<div class="d-flex align-items-center mb-4 gap-3 fade-in">
<a href="{% url 'persone_lista' %}" class="btn btn-icon btn-outline-secondary">
<i class="bi bi-arrow-left" style="font-size:.85rem;"></i>
</a>
<span class="avatar avatar-lg">{{ persona.username|slice:":2"|upper }}</span>
<div>
<h5 class="mb-0 fw-bold">{{ persona.get_full_name|default:persona.username }}</h5>
<small class="text-muted">@{{ persona.username }}</small>
</div>
</div>
<!-- Tabs -->
<ul class="nav nav-pills mb-4 gap-1 fade-in" role="tablist">
<li class="nav-item">
<button class="nav-link active btn-sm" data-bs-toggle="pill" data-bs-target="#tab-conv">
<i class="bi bi-chat-quote me-1"></i>Conversazioni <span class="badge bg-secondary bg-opacity-25 text-dark ms-1">{{ conversazioni|length }}</span>
</button>
</li>
<li class="nav-item">
<button class="nav-link btn-sm" data-bs-toggle="pill" data-bs-target="#tab-obj">
<i class="bi bi-bullseye me-1"></i>Obiettivi <span class="badge bg-secondary bg-opacity-25 text-dark ms-1">{{ obiettivi|length }}</span>
</button>
</li>
<li class="nav-item">
<button class="nav-link btn-sm" data-bs-toggle="pill" data-bs-target="#tab-doc">
<i class="bi bi-file-pdf me-1"></i>Documenti <span class="badge bg-secondary bg-opacity-25 text-dark ms-1">{{ documenti|length }}</span>
</button>
</li>
</ul>
<div class="tab-content">
<!-- Conversazioni -->
<div class="tab-pane fade show active" id="tab-conv">
{% for conv in conversazioni %}
<div class="card mb-2 p-3 fade-in">
<div class="d-flex justify-content-between align-items-start">
<div>
<a href="{% url 'conversazione_dettaglio' conv.pk %}" class="text-decoration-none text-dark fw-semibold">{{ conv.titolo }}</a>
<div class="text-muted small mt-1">{{ conv.data|date:"d/m/Y H:i" }}</div>
</div>
{% if conv.registrato_da == persona %}
<span class="doc-badge">Autore</span>
{% else %}
<span class="badge-stato stato-aperto">Partecipante</span>
{% endif %}
</div>
</div>
{% empty %}
<div class="empty-state"><i class="bi bi-chat-square-dots"></i><p>Nessuna conversazione.</p></div>
{% endfor %}
</div>
<!-- Obiettivi -->
<div class="tab-pane fade" id="tab-obj">
{% for obj in obiettivi %}
<div class="card mb-2 p-3 fade-in">
<div class="d-flex justify-content-between align-items-start">
<div>
<a href="{% url 'obiettivo_dettaglio' obj.pk %}" class="text-decoration-none text-dark fw-semibold">{{ obj.titolo }}</a>
<div class="d-flex gap-2 mt-1">
<span class="badge-stato stato-{{ obj.stato }}">{{ obj.get_stato_display }}</span>
<span class="pill-tipo pill-{{ obj.tipo }}">{{ obj.get_tipo_display }}</span>
</div>
</div>
{% if obj.creato_da == persona %}
<span class="doc-badge">Creato</span>
{% else %}
<span class="badge-stato stato-in_corso">Assegnato</span>
{% endif %}
</div>
</div>
{% empty %}
<div class="empty-state"><i class="bi bi-bullseye"></i><p>Nessun obiettivo.</p></div>
{% endfor %}
</div>
<!-- Documenti -->
<div class="tab-pane fade" id="tab-doc">
{% for doc in documenti %}
<div class="card mb-2 p-3 fade-in">
<div class="d-flex align-items-center gap-3">
<i class="bi bi-file-earmark-pdf" style="font-size:1.2rem;color:#ef4444;"></i>
<div>
<a href="{% url 'documento_dettaglio' doc.pk %}" class="text-decoration-none text-dark fw-semibold">{{ doc.titolo }}</a>
<div class="text-muted small">{{ doc.data_caricamento|date:"d/m/Y" }}</div>
</div>
</div>
</div>
{% empty %}
<div class="empty-state"><i class="bi bi-file-earmark-pdf"></i><p>Nessun documento.</p></div>
{% endfor %}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,33 @@
{% extends "diario/base.html" %}
{% block title %}Persone{% endblock %}
{% block content %}
<p class="section-title fade-in">Team</p>
<div class="row g-3">
{% for persona in persone %}
<div class="col-6 col-md-4 col-lg-3 fade-in">
<a href="{% url 'persona_dettaglio' persona.pk %}" class="card-link">
<div class="card person-card h-100">
<span class="avatar avatar-lg mx-auto">{{ persona.username|slice:":2"|upper }}</span>
<div class="fw-semibold small">{{ persona.get_full_name|default:persona.username }}</div>
<div class="mt-2 d-flex justify-content-center gap-3">
<div class="stat">
<div class="stat-num">{{ persona.num_conversazioni }}</div>
<i class="bi bi-chat-quote"></i>
</div>
<div class="stat">
<div class="stat-num">{{ persona.num_obiettivi }}</div>
<i class="bi bi-bullseye"></i>
</div>
<div class="stat">
<div class="stat-num">{{ persona.num_documenti }}</div>
<i class="bi bi-file-pdf"></i>
</div>
</div>
</div>
</a>
</div>
{% endfor %}
</div>
{% endblock %}