Files
goodtimes/manage_events/forms.py
2025-01-08 12:37:07 +05:30

175 lines
5.5 KiB
Python

from django import forms
from accounts.models import IAmPrincipal, IAmPrincipalExtendedData
from manage_events.models import AgeGroups, EventImage, EventMaster, Event, EventCategory, Venue
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
class EventCategoryForm(forms.ModelForm):
# image = forms.ImageField()
class Meta:
model = EventCategory
fields = ["title", "image", "description", "video_url"]
widgets = {
"image": forms.FileInput(attrs={"class": "form-control-file"}),
}
class EventForm(forms.ModelForm):
principal = forms.ModelChoiceField(
queryset=IAmPrincipal.objects.select_related("extended_data").filter(
extended_data__is_onboarded=True,
extended_data__is_transferred=False
),
label="Non-transfer user list",
required=True
)
venue = forms.ModelChoiceField(
queryset=Venue.objects.none(),
label="venue",
required=True
)
image = forms.ImageField(label="Thumbnail")
event_images = forms.ImageField(label="Event Images")
age_group = forms.ChoiceField(
choices=[],
label="Age Group",
required=True
)
class Meta:
model = Event
fields = [
"principal",
"venue",
"title",
# "event_master",
"description",
"link",
"image",
"event_images",
# "status",
"start_date",
"end_date",
"from_time",
"to_time",
"category",
"venue_capacity",
# "video_url",
"entry_type",
"entry_fee",
"key_guest",
"age_group",
"coupon_code",
"coupon_description",
"tags",
"draft",
"active",
"deleted",
]
widgets = {
"description": forms.Textarea(attrs={"rows": 4}),
"start_date": forms.DateInput(
attrs={"type": "date"}
),
"end_date": forms.DateInput(
attrs={"type": "date"}
),
"from_time": forms.TimeInput(
attrs={"type": "time"}
),
"to_time": forms.TimeInput(attrs={"type": "time"}),
"key_guest": forms.Textarea(attrs={"rows": 3}),
"coupon_description": forms.Textarea(attrs={"rows": 3}),
}
def __init__(self, *args, **kwargs):
instance = kwargs.get('instance')
principal_id = kwargs.pop('principal_id', None)
super().__init__(*args, **kwargs)
if instance:
event_images = EventImage.objects.filter(event=instance)
if event_images.exists():
self.fields['event_images'].initial = [image.image.url for image in event_images]
# Set the initial value for age_group if instance is provided
print(f"age group is {self.instance.age_group}")
age_groups = [(age_group.name, age_group.name) for age_group in AgeGroups.objects.filter(active=True)]
self.fields['age_group'].choices = age_groups
if self.instance:
self.fields['age_group'].initial = self.instance.age_group
if principal_id:
self.fields['venue'].queryset = Venue.objects.filter(principal_id=principal_id, active=True)
else:
self.fields['venue'].queryset = Venue.objects.none()
def clean(self):
cleaned_data = super().clean()
# Get the start and end dates from cleaned_data
start_date = cleaned_data.get("start_date")
end_date = cleaned_data.get("end_date")
# Get the from and to times from cleaned_data
from_time = cleaned_data.get("from_time")
to_time = cleaned_data.get("to_time")
# Validation 1: end_date should not be less than start_date
if start_date and end_date and end_date < start_date:
self.add_error("end_date", _("End date cannot be before the start date."))
if end_date == start_date:
if to_time and from_time and to_time <= from_time:
self.add_error("to_time", _("End time must be after the start time."))
return cleaned_data
class EventImageForm(forms.ModelForm):
class Meta:
model = EventImage
fields = ['image']
class EventMasterForm(forms.ModelForm):
class Meta:
model = EventMaster
fields = "__all__" # Includes all fields from the model
class VenueForm(forms.ModelForm):
principal = forms.ModelChoiceField(
queryset=IAmPrincipal.objects.select_related("extended_data").filter(
extended_data__is_onboarded=True,
extended_data__is_transferred=False
),
label="Non-transfer user list",
required=True
)
image = forms.ImageField(required=True)
postcode = forms.CharField(required=True, max_length=10)
latitude = forms.DecimalField(
widget=forms.NumberInput()
)
longitude = forms.DecimalField(
widget=forms.NumberInput()
)
class Meta:
model = Venue
fields = [
"principal",
"title",
"address",
"postcode",
"image",
"latitude",
"longitude",
]
widgets = {
"description": forms.Textarea(attrs={"rows": 4}),
"address": forms.Textarea(attrs={"rows": 3}),
}