Second updates

This commit is contained in:
Vivek P Prakash
2025-11-28 03:11:38 +05:30
parent aa40080012
commit d3cc7eb47e
18 changed files with 758 additions and 149 deletions

View File

@@ -1,11 +1,53 @@
from django import forms
from .models import Event
from .models import EventImages
class EventForm(forms.ModelForm):
class Meta:
model = Event
exclude = ['created_date']
fields = "__all__"
widgets = {
'start_date': forms.DateInput(attrs={'type':'date'}),
'end_date': forms.DateInput(attrs={'type':'date'}),
'name': forms.TextInput(attrs={'class': 'form-control'}),
'description': forms.Textarea(attrs={'class': 'form-control'}),
'start_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
'end_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
'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'}),
}
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)',
}

View File

@@ -1,6 +1,7 @@
from django.db import models
from master_data.models import EventType
class Event(models.Model):
created_date = models.DateField(auto_now_add=True)
name = models.CharField(max_length=200)
@@ -33,6 +34,7 @@ class Event(models.Model):
def __str__(self):
return f"{self.name} ({self.start_date})"
class EventImages(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE)
is_primary = models.BooleanField(default=False)

View File

@@ -8,4 +8,9 @@ urlpatterns = [
path('add/', views.EventCreateView.as_view(), name='event_add'),
path('<int:pk>/edit/', views.EventUpdateView.as_view(), name='event_edit'),
path('<int:pk>/delete/', views.EventDeleteView.as_view(), name='event_delete'),
path('<int:pk>/images/', views.event_images, name='event_images'),
path('<int:pk>/images/add/', views.add_event_images, name='add_event_images'),
path('<int:pk>/images/<int:img_id>/delete/', views.delete_event_image, name='delete_event_image'),
path('<int:pk>/images/<int:img_id>/primary/', views.set_primary_image, name='set_primary_image'),
]

View File

@@ -1,8 +1,14 @@
from django.views import generic
from django.urls import reverse_lazy
from .models import Event
from .models import EventImages
from .forms import EventForm
from .forms import EventImagesForm
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect, render
from django.contrib.auth.decorators import login_required
class EventListView(LoginRequiredMixin, generic.ListView):
model = Event
@@ -10,19 +16,76 @@ class EventListView(LoginRequiredMixin, generic.ListView):
template_name = 'events/event_list.html'
paginate_by = 10
class EventCreateView(LoginRequiredMixin, generic.CreateView):
model = Event
form_class = EventForm
template_name = 'events/event_form.html'
success_url = reverse_lazy('events:event_list')
class EventUpdateView(LoginRequiredMixin, generic.UpdateView):
model = Event
form_class = EventForm
template_name = 'events/event_form.html'
success_url = reverse_lazy('events:event_list')
class EventDeleteView(LoginRequiredMixin, generic.DeleteView):
model = Event
template_name = 'events/event_confirm_delete.html'
success_url = reverse_lazy('events:event_list')
@login_required
def add_event_images(request, pk):
event = get_object_or_404(Event, pk=pk)
if request.method == "POST":
form = EventImagesForm(request.POST, request.FILES)
images = request.FILES.getlist('event_image')
if images:
for img in images:
EventImages.objects.create(event=event, event_image=img)
messages.success(request, "Images uploaded successfully!")
return redirect("events:event_images", pk=event.pk)
else:
form = EventImagesForm()
return render(request, "events/event_images_form.html", {
"form": form,
"event": event,
})
@login_required
def event_images(request, pk):
event = get_object_or_404(Event, pk=pk)
images = EventImages.objects.filter(event=event)
return render(request, "events/event_images_list.html", {
"event": event,
"images": images,
})
@login_required
def set_primary_image(request, pk, img_id):
event = get_object_or_404(Event, pk=pk)
EventImages.objects.filter(event=event, is_primary=True).update(is_primary=False)
EventImages.objects.filter(pk=img_id).update(is_primary=True)
messages.success(request, "Primary image updated!")
return redirect("events:event_images", pk=pk)
@login_required
def delete_event_image(request, pk, img_id):
image = get_object_or_404(EventImages, pk=img_id)
image.delete()
messages.success(request, "Image deleted!")
return redirect("events:event_images", pk=pk)