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:
automationkriz
2026-04-07 14:28:47 +00:00
parent 006bb24215
commit 09f51b1227
19 changed files with 828 additions and 12 deletions

View File

@@ -11,14 +11,28 @@ def validate_file_size(value):
raise ValidationError('Il file non può superare i 10 MB.')
class Tag(models.Model):
nome = models.CharField(max_length=50, unique=True)
colore = models.CharField(max_length=7, default='#4361ee') # colore hex
class Meta:
ordering = ['nome']
verbose_name = 'Tag'
verbose_name_plural = 'Tag'
def __str__(self):
return self.nome
class Conversazione(models.Model):
titolo = models.CharField(max_length=200)
data = models.DateTimeField()
data = models.DateTimeField(default=timezone.now)
partecipanti = models.ManyToManyField(User, related_name='conversazioni_partecipate', blank=True)
contenuto = models.TextField()
registrato_da = models.ForeignKey(
User, on_delete=models.SET_NULL, null=True, related_name='conversazioni_registrate'
)
tags = models.ManyToManyField(Tag, blank=True, related_name='conversazioni')
class Meta:
ordering = ['-data']
@@ -137,3 +151,30 @@ class Documento(models.Model):
import os
return os.path.basename(self.file.name)
class Appuntamento(models.Model):
titolo = models.CharField(max_length=200)
data_ora = models.DateTimeField()
luogo = models.CharField(max_length=200, blank=True)
note = models.TextField(blank=True)
conversazione = models.ForeignKey(
Conversazione, on_delete=models.SET_NULL, null=True, blank=True, related_name='appuntamenti'
)
partecipanti = models.ManyToManyField(User, blank=True, related_name='appuntamenti')
creato_da = models.ForeignKey(
User, on_delete=models.SET_NULL, null=True, related_name='appuntamenti_creati'
)
data_creazione = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['data_ora']
verbose_name = 'Appuntamento'
verbose_name_plural = 'Appuntamenti'
def __str__(self):
return f"{self.titolo} ({self.data_ora.strftime('%d/%m/%Y %H:%M')})"
@property
def is_passato(self):
return self.data_ora < timezone.now()