- 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
97 lines
3.7 KiB
Python
97 lines
3.7 KiB
Python
from django import forms
|
|
from django.contrib.auth.models import User
|
|
from django.utils import timezone
|
|
from .models import Conversazione, Obiettivo, AggiornamentoObiettivo, CommentoConversazione, Documento
|
|
|
|
|
|
class ConversazioneForm(forms.ModelForm):
|
|
data = forms.DateTimeField(
|
|
label='Data e ora',
|
|
initial=timezone.now,
|
|
widget=forms.DateTimeInput(
|
|
attrs={'class': 'form-control', 'type': 'datetime-local'},
|
|
format='%Y-%m-%dT%H:%M',
|
|
),
|
|
input_formats=['%Y-%m-%dT%H:%M'],
|
|
)
|
|
partecipanti = forms.ModelMultipleChoiceField(
|
|
queryset=User.objects.filter(is_active=True).order_by('first_name', 'username'),
|
|
widget=forms.CheckboxSelectMultiple,
|
|
required=False,
|
|
label='Partecipanti',
|
|
)
|
|
|
|
class Meta:
|
|
model = Conversazione
|
|
fields = ['titolo', 'data', 'contenuto', 'partecipanti']
|
|
widgets = {
|
|
'titolo': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Titolo della conversazione'}),
|
|
'contenuto': forms.Textarea(attrs={'class': 'form-control', 'rows': 6, 'placeholder': 'Descrivi cosa è stato discusso...'}),
|
|
}
|
|
labels = {
|
|
'titolo': 'Titolo',
|
|
'contenuto': 'Contenuto',
|
|
}
|
|
|
|
|
|
class ObiettivoForm(forms.ModelForm):
|
|
assegnato_a = forms.ModelMultipleChoiceField(
|
|
queryset=User.objects.filter(is_active=True).order_by('first_name', 'username'),
|
|
widget=forms.CheckboxSelectMultiple,
|
|
required=False,
|
|
label='Assegnato a',
|
|
)
|
|
|
|
class Meta:
|
|
model = Obiettivo
|
|
fields = ['titolo', 'descrizione', 'tipo', 'assegnato_a', 'stato', 'data_scadenza']
|
|
widgets = {
|
|
'titolo': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Titolo obiettivo'}),
|
|
'descrizione': forms.Textarea(attrs={'class': 'form-control', 'rows': 4, 'placeholder': 'Descrizione (opzionale)'}),
|
|
'tipo': forms.Select(attrs={'class': 'form-select'}),
|
|
'stato': forms.Select(attrs={'class': 'form-select'}),
|
|
'data_scadenza': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
|
|
}
|
|
|
|
|
|
class AggiornamentoObiettivoForm(forms.ModelForm):
|
|
class Meta:
|
|
model = AggiornamentoObiettivo
|
|
fields = ['testo']
|
|
widgets = {
|
|
'testo': forms.Textarea(attrs={'class': 'form-control', 'rows': 3, 'placeholder': 'Scrivi un aggiornamento...'}),
|
|
}
|
|
labels = {
|
|
'testo': 'Aggiornamento',
|
|
}
|
|
|
|
|
|
class CommentoConversazioneForm(forms.ModelForm):
|
|
class Meta:
|
|
model = CommentoConversazione
|
|
fields = ['testo']
|
|
widgets = {
|
|
'testo': forms.Textarea(attrs={'class': 'form-control', 'rows': 3, 'placeholder': 'Scrivi un commento...'}),
|
|
}
|
|
labels = {
|
|
'testo': 'Commento',
|
|
}
|
|
|
|
|
|
class DocumentoForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Documento
|
|
fields = ['titolo', 'descrizione', 'file', 'conversazione', 'obiettivo']
|
|
widgets = {
|
|
'titolo': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Titolo del documento'}),
|
|
'descrizione': forms.Textarea(attrs={'class': 'form-control', 'rows': 3, 'placeholder': 'Descrizione (opzionale)'}),
|
|
'file': forms.ClearableFileInput(attrs={'class': 'form-control', 'accept': '.pdf'}),
|
|
'conversazione': forms.Select(attrs={'class': 'form-select'}),
|
|
'obiettivo': forms.Select(attrs={'class': 'form-select'}),
|
|
}
|
|
labels = {
|
|
'file': 'File PDF',
|
|
'conversazione': 'Collegato a conversazione (opzionale)',
|
|
'obiettivo': 'Collegato a obiettivo (opzionale)',
|
|
}
|