Files
diario_coversazioni/diario/forms.py
automationkriz d296353dcb 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
2026-04-05 14:48:22 +00:00

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)',
}