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