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:
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user