I want to restrict overlapping of events occurring on same date and same time. I want to show the overlapping error to the user when he registered an event on same date having same time. I am unable to query the time range between start_time and end_time. What is the best way to restrict overlapping?
models.py
class Event(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
description = models.TextField()
date = models.DateField()
start_time = models.TimeField()
end_time = models.TimeField()
created_date = models.DateTimeField(auto_now_add=True)
group = models.ForeignKey(Group , on_delete= models.CASCADE , null= True , blank=True)
priority = models.ForeignKey('Priority' , on_delete= models.CASCADE , null= True , blank=True)
@property
def get_html_url(self):
url = reverse('event-detail', args=(self.id,))
return f' <a href="{url}"> {self.title} </a>'
def create_event(slef):
return f"http://localhost:800/event/create/"
# def get_event_in_current_date(self):
# print(Event.objects.filter(date= self.date))
# return Event.objects.filter(date= self.date)
@property
def get_all_events(self):
if Event.objects.filter(date= self.date).count() >1:
url = reverse('event-all', args=(self.date, ))
return f' <a href="{url}"> ... </a>'
return ""
@property
def get_all_events_by_group(self):
print(self.group)
if Event.objects.filter(date= self.date , group= self.group ).count() >1:
url = reverse('event-all-group', args=(self.date, self.group.name ))
return f' <a href="{url}"> ... </a>'
return ""
def __str__(self):
# print(self.date)
return str(self.date)
views.py
class CreateEvent(LoginRequiredMixin , View):
def post(self , request , *args , **kwargs):
start_time = request.POST.get('start_time')
end_time = request.POST.get('end_time')
title = request.POST.get('title')
description = request.POST.get('description')
date = request.POST.get('date')
priority = request.POST.get('priority')
GROUP_REQUEST_SLUG = str(request.META.get('HTTP_REFERER'))
group_slug = GROUP_REQUEST_SLUG.split('/')[-2]
group = Group.objects.filter(slug = group_slug).first()
priority = Priority.objects.create(scale =priority )
if group is None:
Event.objects.create(date= date , title = title , start_time= start_time , end_time=end_time ,description= description , user= request.user , priority = priority)
messages.success(request, "Event has been createds .")
else:
Event.objects.create(date= date , title = title , start_time= start_time , end_time=end_time ,description= description , user= request.user , group= group , priority = priority)
messages.success(request, f"Event has been created in {group}")
return redirect('switch-group' ,group_slug )
return redirect('calendar')