Tag progetto, @menzioni, appuntamenti da conversazioni
- Modello Tag con nome e colore, M2M su Conversazione - Modello Appuntamento con luogo, note, partecipanti, link a Conversazione - @menzioni nei commenti e aggiornamenti: @username → link al profilo - Autocomplete JS per @menzioni nelle textarea - Auto-data conversazioni (default=now) - CRUD completo appuntamenti con permessi autore - Appuntamenti in agenda, dashboard, dettaglio conversazione - Crea riunione direttamente da una conversazione (pre-compila titolo e partecipanti) - Admin: Tag, Appuntamento registrati
This commit is contained in:
@@ -12,6 +12,9 @@
|
||||
<small class="text-muted">Panoramica di scadenze e appuntamenti</small>
|
||||
</div>
|
||||
<div class="d-flex gap-2">
|
||||
<a href="{% url 'appuntamento_nuovo' %}" class="btn btn-sm btn-outline-warning">
|
||||
<i class="bi bi-plus-lg me-1"></i>Appuntamento
|
||||
</a>
|
||||
<a href="{% url 'obiettivo_nuovo' %}" class="btn btn-sm btn-outline-primary">
|
||||
<i class="bi bi-plus-lg me-1"></i>Obiettivo
|
||||
</a>
|
||||
@@ -42,6 +45,10 @@
|
||||
<div class="agenda-icon agenda-icon-scadenza">
|
||||
<i class="bi bi-bullseye"></i>
|
||||
</div>
|
||||
{% elif ev.tipo == 'appuntamento' %}
|
||||
<div class="agenda-icon agenda-icon-appuntamento">
|
||||
<i class="bi bi-calendar-check"></i>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="agenda-icon agenda-icon-conv">
|
||||
<i class="bi bi-chat-quote"></i>
|
||||
@@ -69,6 +76,14 @@
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
</div>
|
||||
{% elif ev.tipo == 'appuntamento' %}
|
||||
<a href="{% url 'appuntamento_dettaglio' ev.obj.pk %}" class="text-decoration-none text-dark fw-semibold d-block">
|
||||
<i class="bi bi-calendar-check me-1 text-warning"></i>{{ ev.obj.titolo }}
|
||||
</a>
|
||||
<div class="d-flex align-items-center gap-2 mt-1">
|
||||
<small class="text-muted"><i class="bi bi-clock me-1"></i>{{ ev.obj.data_ora|date:"H:i" }}</small>
|
||||
{% if ev.obj.luogo %}<small class="text-muted"><i class="bi bi-geo-alt me-1"></i>{{ ev.obj.luogo }}</small>{% endif %}
|
||||
</div>
|
||||
{% else %}
|
||||
<a href="{% url 'conversazione_dettaglio' ev.obj.pk %}" class="text-decoration-none text-dark fw-semibold d-block">
|
||||
{{ ev.obj.titolo }}
|
||||
@@ -126,6 +141,10 @@
|
||||
<div class="agenda-icon {% if ev.scaduto %}agenda-icon-danger{% else %}agenda-icon-scadenza{% endif %}">
|
||||
<i class="bi {% if ev.scaduto %}bi-exclamation-triangle{% else %}bi-bullseye{% endif %}"></i>
|
||||
</div>
|
||||
{% elif ev.tipo == 'appuntamento' %}
|
||||
<div class="agenda-icon agenda-icon-appuntamento" style="opacity:.6;">
|
||||
<i class="bi bi-calendar-check"></i>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="agenda-icon agenda-icon-conv" style="opacity:.6;">
|
||||
<i class="bi bi-chat-quote"></i>
|
||||
@@ -142,6 +161,11 @@
|
||||
<div class="d-flex align-items-center gap-2 mt-1">
|
||||
<span class="badge-stato stato-{{ ev.obj.stato }}">{{ ev.obj.get_stato_display }}</span>
|
||||
</div>
|
||||
{% elif ev.tipo == 'appuntamento' %}
|
||||
<a href="{% url 'appuntamento_dettaglio' ev.obj.pk %}" class="text-decoration-none text-muted fw-semibold d-block">
|
||||
<i class="bi bi-calendar-check me-1"></i>{{ ev.obj.titolo }}
|
||||
</a>
|
||||
<small class="text-muted">{{ ev.obj.data_ora|date:"H:i" }}{% if ev.obj.luogo %} · {{ ev.obj.luogo }}{% endif %}</small>
|
||||
{% else %}
|
||||
<a href="{% url 'conversazione_dettaglio' ev.obj.pk %}" class="text-decoration-none text-muted fw-semibold d-block">
|
||||
{{ ev.obj.titolo }}
|
||||
|
||||
80
templates/diario/appuntamenti/dettaglio.html
Normal file
80
templates/diario/appuntamenti/dettaglio.html
Normal file
@@ -0,0 +1,80 @@
|
||||
{% extends "diario/base.html" %}
|
||||
{% block title %}{{ app.titolo }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
|
||||
<div class="d-flex align-items-center mb-4 gap-3 fade-in">
|
||||
<a href="{% url 'appuntamenti_lista' %}" class="btn btn-icon btn-outline-secondary">
|
||||
<i class="bi bi-arrow-left" style="font-size:.85rem;"></i>
|
||||
</a>
|
||||
<h5 class="mb-0 fw-bold flex-grow-1">
|
||||
<i class="bi bi-calendar-check me-2 text-warning"></i>{{ app.titolo }}
|
||||
</h5>
|
||||
{% if can_edit %}
|
||||
<a href="{% url 'appuntamento_modifica' app.pk %}" class="btn btn-sm btn-outline-secondary">
|
||||
<i class="bi bi-pencil me-1"></i>Modifica
|
||||
</a>
|
||||
<a href="{% url 'appuntamento_elimina' app.pk %}" class="btn btn-sm btn-outline-danger">
|
||||
<i class="bi bi-trash me-1"></i>Elimina
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="card p-4 mb-4 fade-in appuntamento-card">
|
||||
<div class="row g-3 mb-3">
|
||||
<div class="col-sm-6">
|
||||
<small class="text-muted fw-semibold d-block mb-1">Data e ora</small>
|
||||
<div class="fw-semibold">
|
||||
<i class="bi bi-clock me-1 text-warning"></i>
|
||||
{{ app.data_ora|date:"d/m/Y \a\l\l\e H:i" }}
|
||||
</div>
|
||||
{% if app.is_passato %}
|
||||
<span class="countdown countdown-urgent mt-1">Passato</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if app.luogo %}
|
||||
<div class="col-sm-6">
|
||||
<small class="text-muted fw-semibold d-block mb-1">Luogo</small>
|
||||
<div><i class="bi bi-geo-alt me-1 text-muted"></i>{{ app.luogo }}</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{% if app.note %}
|
||||
<hr class="soft">
|
||||
<small class="text-muted fw-semibold d-block mb-2">Note</small>
|
||||
<div style="white-space:pre-wrap;line-height:1.8;font-size:.93rem;">{{ app.note }}</div>
|
||||
{% endif %}
|
||||
|
||||
{% if app.conversazione %}
|
||||
<hr class="soft">
|
||||
<small class="text-muted fw-semibold d-block mb-2">Conversazione collegata</small>
|
||||
<a href="{% url 'conversazione_dettaglio' app.conversazione.pk %}" class="text-decoration-none">
|
||||
<i class="bi bi-chat-quote me-1"></i>{{ app.conversazione.titolo }}
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
{% if app.partecipanti.all %}
|
||||
<hr class="soft mt-3 mb-3">
|
||||
<small class="text-muted fw-semibold d-block mb-2">Partecipanti</small>
|
||||
<div class="d-flex flex-wrap gap-2">
|
||||
{% for p in app.partecipanti.all %}
|
||||
<div class="d-flex align-items-center gap-1 px-2 py-1 rounded-pill" style="background:#f0f2f5; font-size:.8rem;">
|
||||
<span class="avatar" style="width:20px;height:20px;font-size:.55rem;">{{ p.username|slice:":2"|upper }}</span>
|
||||
{{ p.get_full_name|default:p.username }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<hr class="soft mt-3 mb-2">
|
||||
<small class="text-muted">
|
||||
Creato da {{ app.creato_da.get_full_name|default:app.creato_da.username }} il {{ app.data_creazione|date:"d/m/Y H:i" }}
|
||||
</small>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
63
templates/diario/appuntamenti/form.html
Normal file
63
templates/diario/appuntamenti/form.html
Normal file
@@ -0,0 +1,63 @@
|
||||
{% extends "diario/base.html" %}
|
||||
{% block title %}{{ titolo_pagina }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<a href="{% url 'appuntamenti_lista' %}" class="btn btn-sm btn-outline-secondary me-3">
|
||||
<i class="bi bi-arrow-left"></i>
|
||||
</a>
|
||||
<h4 class="mb-0">{{ titolo_pagina }}</h4>
|
||||
</div>
|
||||
|
||||
<div class="card p-4">
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label class="form-label fw-semibold">{{ form.titolo.label }}</label>
|
||||
{{ form.titolo }}
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label fw-semibold">{{ form.data_ora.label }}</label>
|
||||
{{ form.data_ora }}
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label fw-semibold">{{ form.luogo.label }}</label>
|
||||
{{ form.luogo }}
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label fw-semibold">{{ form.note.label }}</label>
|
||||
{{ form.note }}
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label class="form-label fw-semibold">{{ form.partecipanti.label }}</label>
|
||||
<div class="row row-cols-2 row-cols-sm-3 g-2 mt-1">
|
||||
{% for checkbox in form.partecipanti %}
|
||||
<div class="col">
|
||||
<div class="form-check">
|
||||
{{ checkbox.tag }}
|
||||
<label class="form-check-label" for="{{ checkbox.id_for_label }}">
|
||||
{{ checkbox.choice_label }}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% if conversazione_pk %}
|
||||
<input type="hidden" name="conversazione" value="{{ conversazione_pk }}">
|
||||
{% endif %}
|
||||
<div class="d-flex gap-2">
|
||||
<button type="submit" class="btn btn-primary">Salva</button>
|
||||
{% if app %}
|
||||
<a href="{% url 'appuntamento_dettaglio' app.pk %}" class="btn btn-outline-secondary">Annulla</a>
|
||||
{% else %}
|
||||
<a href="{% url 'appuntamenti_lista' %}" class="btn btn-outline-secondary">Annulla</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
69
templates/diario/appuntamenti/lista.html
Normal file
69
templates/diario/appuntamenti/lista.html
Normal file
@@ -0,0 +1,69 @@
|
||||
{% extends "diario/base.html" %}
|
||||
{% block title %}Appuntamenti{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="d-flex justify-content-between align-items-center mb-4 fade-in">
|
||||
<p class="section-title mb-0">Appuntamenti e Riunioni</p>
|
||||
<a href="{% url 'appuntamento_nuovo' %}" class="btn btn-primary btn-sm px-3">
|
||||
<i class="bi bi-plus-lg me-1"></i>Nuovo appuntamento
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{% if futuri %}
|
||||
<p class="section-title fade-in"><i class="bi bi-calendar-event me-1"></i>Prossimi</p>
|
||||
{% for app in futuri %}
|
||||
<div class="card mb-2 p-3 fade-in appuntamento-card">
|
||||
<div class="d-flex justify-content-between align-items-start gap-3">
|
||||
<div class="flex-grow-1">
|
||||
<a href="{% url 'appuntamento_dettaglio' app.pk %}" class="text-decoration-none text-dark fw-semibold d-block mb-1">
|
||||
<i class="bi bi-calendar-check me-1 text-warning"></i>{{ app.titolo }}
|
||||
</a>
|
||||
<div class="d-flex align-items-center gap-3 flex-wrap">
|
||||
<small class="text-muted"><i class="bi bi-clock me-1"></i>{{ app.data_ora|date:"d/m/Y H:i" }}</small>
|
||||
{% if app.luogo %}
|
||||
<small class="text-muted"><i class="bi bi-geo-alt me-1"></i>{{ app.luogo }}</small>
|
||||
{% endif %}
|
||||
{% if app.conversazione %}
|
||||
<small class="text-muted">
|
||||
<i class="bi bi-link-45deg me-1"></i>
|
||||
<a href="{% url 'conversazione_dettaglio' app.conversazione.pk %}" class="text-muted">{{ app.conversazione.titolo|truncatewords:5 }}</a>
|
||||
</small>
|
||||
{% endif %}
|
||||
{% if app.partecipanti.count > 0 %}
|
||||
<small class="text-muted"><i class="bi bi-people me-1"></i>{{ app.partecipanti.count }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% if passati %}
|
||||
<p class="section-title mt-4 fade-in"><i class="bi bi-clock-history me-1"></i>Passati</p>
|
||||
{% for app in passati %}
|
||||
<div class="card mb-2 p-3 fade-in" style="opacity:.7;">
|
||||
<div class="d-flex justify-content-between align-items-start gap-3">
|
||||
<div class="flex-grow-1">
|
||||
<a href="{% url 'appuntamento_dettaglio' app.pk %}" class="text-decoration-none text-muted fw-semibold d-block mb-1">
|
||||
<i class="bi bi-calendar-x me-1"></i>{{ app.titolo }}
|
||||
</a>
|
||||
<div class="d-flex align-items-center gap-3 flex-wrap">
|
||||
<small class="text-muted"><i class="bi bi-clock me-1"></i>{{ app.data_ora|date:"d/m/Y H:i" }}</small>
|
||||
{% if app.luogo %}
|
||||
<small class="text-muted"><i class="bi bi-geo-alt me-1"></i>{{ app.luogo }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% if not futuri and not passati %}
|
||||
<div class="empty-state">
|
||||
<i class="bi bi-calendar-plus"></i>
|
||||
<p>Nessun appuntamento registrato.</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -41,6 +41,11 @@
|
||||
<i class="bi bi-calendar-week me-1"></i>Agenda
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 py-1 rounded-pill" href="{% url 'appuntamenti_lista' %}">
|
||||
<i class="bi bi-calendar-check me-1"></i>Appuntamenti
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 py-1 rounded-pill" href="{% url 'documenti_lista' %}">
|
||||
<i class="bi bi-file-earmark-pdf me-1"></i>Documenti
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{% extends "diario/base.html" %}
|
||||
{% load custom_filters %}
|
||||
{% block title %}{{ conv.titolo }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
@@ -31,6 +32,17 @@
|
||||
|
||||
<div style="white-space:pre-wrap;line-height:1.8;font-size:.93rem;">{{ conv.contenuto }}</div>
|
||||
|
||||
{% if conv.tags.all %}
|
||||
<div class="d-flex flex-wrap gap-2 mt-3">
|
||||
{% for tag in conv.tags.all %}
|
||||
<span class="tag-pill" style="border-color:{{ tag.colore }};color:{{ tag.colore }};">
|
||||
<span class="tag-dot" style="background:{{ tag.colore }};"></span>
|
||||
{{ tag.nome }}
|
||||
</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if conv.partecipanti.all %}
|
||||
<hr class="soft mt-4 mb-3">
|
||||
<div>
|
||||
@@ -47,8 +59,35 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Documenti allegati -->
|
||||
<!-- Appuntamenti collegati -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-3 fade-in">
|
||||
<p class="section-title mb-0"><i class="bi bi-calendar-check me-1"></i>Appuntamenti ({{ appuntamenti|length }})</p>
|
||||
<a href="{% url 'appuntamento_nuovo' %}?conversazione={{ conv.pk }}" class="btn btn-sm btn-outline-warning">
|
||||
<i class="bi bi-plus-lg me-1"></i>Crea riunione
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{% for app in appuntamenti %}
|
||||
<div class="card mb-2 p-3 fade-in appuntamento-card">
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
<i class="bi bi-calendar-check" style="font-size:1.3rem;color:#d97706;"></i>
|
||||
<div class="flex-grow-1">
|
||||
<a href="{% url 'appuntamento_dettaglio' app.pk %}" class="text-decoration-none text-dark fw-semibold small d-block">
|
||||
{{ app.titolo }}
|
||||
</a>
|
||||
<small class="text-muted">
|
||||
{{ app.data_ora|date:"d/m/Y H:i" }}
|
||||
{% if app.luogo %} · {{ app.luogo }}{% endif %}
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% empty %}
|
||||
<p class="text-muted small text-center py-2 fade-in">Nessun appuntamento collegato.</p>
|
||||
{% endfor %}
|
||||
|
||||
<!-- Documenti allegati -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-3 mt-4 fade-in">
|
||||
<p class="section-title mb-0"><i class="bi bi-paperclip me-1"></i>Allegati ({{ documenti|length }})</p>
|
||||
<a href="{% url 'documento_nuovo' %}?conversazione={{ conv.pk }}" class="btn btn-sm btn-outline-primary">
|
||||
<i class="bi bi-upload me-1"></i>Allega PDF
|
||||
@@ -111,7 +150,7 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<p class="mb-0 mt-2 small" style="white-space:pre-wrap;line-height:1.65;padding-left:40px;">{{ c.testo }}</p>
|
||||
<p class="mb-0 mt-2 small" style="white-space:pre-wrap;line-height:1.65;padding-left:40px;">{{ c.testo|render_mentions }}</p>
|
||||
</div>
|
||||
{% empty %}
|
||||
<p class="text-muted small text-center py-3">Nessun commento ancora. Sii il primo!</p>
|
||||
|
||||
@@ -42,6 +42,22 @@
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% if form.tags.field.queryset.count > 0 %}
|
||||
<div class="mb-4">
|
||||
<label class="form-label fw-semibold">{{ form.tags.label }}</label>
|
||||
<div class="d-flex flex-wrap gap-2 mt-1">
|
||||
{% for checkbox in form.tags %}
|
||||
<div class="form-check">
|
||||
{{ checkbox.tag }}
|
||||
<label class="form-check-label" for="{{ checkbox.id_for_label }}">
|
||||
{{ checkbox.choice_label }}
|
||||
</label>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="form-text">Seleziona i tag progetto da associare.</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="d-flex gap-2">
|
||||
<button type="submit" class="btn btn-primary">Salva</button>
|
||||
{% if conv %}
|
||||
|
||||
@@ -27,6 +27,16 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
<p class="mb-0 text-muted small mt-2">{{ conv.contenuto|truncatewords:30 }}</p>
|
||||
{% if conv.tags.all %}
|
||||
<div class="d-flex flex-wrap gap-1 mt-2">
|
||||
{% for tag in conv.tags.all %}
|
||||
<span class="tag-pill" style="border-color:{{ tag.colore }};color:{{ tag.colore }};font-size:.62rem;">
|
||||
<span class="tag-dot" style="background:{{ tag.colore }};"></span>
|
||||
{{ tag.nome }}
|
||||
</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if user == conv.registrato_da or user.is_superuser %}
|
||||
<a href="{% url 'conversazione_modifica' conv.pk %}" class="btn btn-icon btn-outline-secondary flex-shrink-0">
|
||||
|
||||
@@ -230,6 +230,32 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Prossimi appuntamenti -->
|
||||
{% if prossimi_appuntamenti %}
|
||||
<div class="card mt-4 fade-in">
|
||||
<div class="card-header-accent d-flex justify-content-between align-items-center" style="background:#fef3c7; color:#d97706; border-bottom-color:#fde68a;">
|
||||
<span><i class="bi bi-calendar-check me-2"></i>Prossimi appuntamenti</span>
|
||||
<a href="{% url 'appuntamenti_lista' %}" class="small fw-normal" style="color:#d97706;">Tutti →</a>
|
||||
</div>
|
||||
<div class="p-0">
|
||||
{% for app in prossimi_appuntamenti %}
|
||||
<div class="d-flex align-items-center gap-3 px-3 py-2 {% if not forloop.last %}border-bottom{% endif %}">
|
||||
<div class="text-center flex-shrink-0" style="width:36px;">
|
||||
<div style="font-size:.85rem; font-weight:700; color:#d97706;">{{ app.data_ora|date:"d" }}</div>
|
||||
<div style="font-size:.6rem; text-transform:uppercase; color:#94a3b8;">{{ app.data_ora|date:"M" }}</div>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<a href="{% url 'appuntamento_dettaglio' app.pk %}" class="text-decoration-none text-dark fw-semibold small d-block">
|
||||
{{ app.titolo|truncatewords:6 }}
|
||||
</a>
|
||||
<small class="text-muted">{{ app.data_ora|date:"H:i" }}{% if app.luogo %} · {{ app.luogo }}{% endif %}</small>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<p class="mb-0 mt-2 small" style="white-space:pre-wrap;line-height:1.65;padding-left:40px;">{{ agg.testo }}</p>
|
||||
<p class="mb-0 mt-2 small" style="white-space:pre-wrap;line-height:1.65;padding-left:40px;">{{ agg.testo|render_mentions }}</p>
|
||||
</div>
|
||||
{% empty %}
|
||||
<p class="text-muted small text-center py-3">Nessun aggiornamento ancora.</p>
|
||||
|
||||
Reference in New Issue
Block a user