Files
eventify_backend/events/forms.py
Eventify Deploy 43123d0ff1 feat: add source field with 3 options, fix EventListAPI fallback, add is_eventify_event to API response
- Event.source field updated: eventify, community, partner (radio select in form)
- EventListAPI: fallback to all events when pincode returns < 6
- EventListAPI: include is_eventify_event and source in serializer
- Admin API: add source to list serializer
- Django admin: source in list_display, list_filter, list_editable
- Event form template: proper radio button rendering for source field

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 11:23:03 +00:00

103 lines
4.7 KiB
Python

from django import forms
from .models import Event
from .models import EventImages
from django_summernote.widgets import SummernoteWidget
class EventForm(forms.ModelForm):
class Meta:
model = Event
fields = "__all__"
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control'}),
'description': forms.Textarea(attrs={'class': 'form-control'}),
'title': forms.TextInput(attrs={'class': 'form-control'}),
'important_information': SummernoteWidget(attrs={'summernote': {'width': '100%', 'height': '400px'}}),
'venue_name': forms.TextInput(attrs={'class': 'form-control'}),
'start_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date', 'id': 'id_start_date'}),
'end_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date', 'id': 'id_end_date'}),
'start_time': forms.TimeInput(attrs={'class': 'form-control', 'type': 'time', 'id': 'id_start_time'}),
'end_time': forms.TimeInput(attrs={'class': 'form-control', 'type': 'time', 'id': 'id_end_time'}),
'all_year_event': forms.CheckboxInput(attrs={'class': 'form-check-input', 'id': 'id_all_year_event'}),
'latitude': forms.NumberInput(attrs={'class': 'form-control'}),
'longitude': forms.NumberInput(attrs={'class': 'form-control'}),
'pincode': forms.TextInput(attrs={'class': 'form-control'}),
'district': forms.TextInput(attrs={'class': 'form-control'}),
'state': forms.TextInput(attrs={'class': 'form-control'}),
'place': forms.TextInput(attrs={'class': 'form-control'}),
'outside_event_url': forms.URLInput(attrs={'class': 'form-control'}),
'event_status': forms.Select(attrs={'class': 'form-select'}),
'event_type': forms.Select(attrs={'class': 'form-select'}),
'cancelled_reason': forms.Textarea(attrs={'class': 'form-control'}),
'is_bookable': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
'is_eventify_event': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
'is_featured': forms.CheckboxInput(attrs={'class': 'form-check-input', 'id': 'id_is_featured'}),
'is_top_event': forms.CheckboxInput(attrs={'class': 'form-check-input', 'id': 'id_is_top_event'}),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Show source as visible radio buttons with Bootstrap styling
self.fields['source'].widget = forms.RadioSelect(
choices=self.fields['source'].choices,
attrs={'class': 'form-check-input'}
)
if not self.instance.pk:
self.fields['source'].initial = 'eventify'
# Check if all_year_event is True (from instance or initial data)
all_year_event = False
if self.instance and self.instance.pk:
all_year_event = self.instance.all_year_event
elif 'all_year_event' in self.initial:
all_year_event = self.initial['all_year_event']
elif self.data and 'all_year_event' in self.data:
all_year_event = self.data.get('all_year_event') == 'on' or self.data.get('all_year_event') == 'True'
# If all_year_event is True, disable date/time fields
if all_year_event:
self.fields['start_date'].widget.attrs['disabled'] = True
self.fields['end_date'].widget.attrs['disabled'] = True
self.fields['start_time'].widget.attrs['disabled'] = True
self.fields['end_time'].widget.attrs['disabled'] = True
def clean(self):
cleaned_data = super().clean()
all_year_event = cleaned_data.get('all_year_event', False)
# Source is now user-selectable (eventify/community/partner)
# If all_year_event is True, clear date/time fields
if all_year_event:
cleaned_data['start_date'] = None
cleaned_data['end_date'] = None
cleaned_data['start_time'] = None
cleaned_data['end_time'] = None
return cleaned_data
class MultipleFileInput(forms.ClearableFileInput):
allow_multiple_selected = True
class EventImagesForm(forms.ModelForm):
event_image = forms.ImageField(
widget=MultipleFileInput(
attrs={
'multiple': True,
'class': 'form-control',
}
),
label="Upload Images"
)
class Meta:
model = EventImages
fields = ['event_image', 'is_primary']
widgets = {
'is_primary': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
}
labels = {
'is_primary': 'Set as Primary Image (If only one uploaded)',
}