-1

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')
James Z
  • 12,209
  • 10
  • 24
  • 44
Asad Ali
  • 81
  • 1
  • 7

1 Answers1

0

Django provides a range lookup

Event.objects.filter(date__range=["2011-01-01", "2011-01-31"])

or

Event.objects.filter(pub_date__time__range=(datetime.time(8), datetime.time(17)))

or you also can use gt , gte, lt, lte lookups

I think you have to use unique_together for your Event model (more info).

unique_together = ['date', 'start_time']
NKSM
  • 5,422
  • 4
  • 25
  • 38
  • thanks for response. Thats not working in my case can u please elaborate precisely? that would be very kind of uh. – Asad Ali Nov 30 '20 at 20:47
  • What not working? Can you specify your question? – NKSM Nov 30 '20 at 21:03
  • i have used unique_together in Models.py as Meta class but still thtats not working. – Asad Ali Nov 30 '20 at 21:08
  • although that's not giving any errors! I really want to get time(user input) and want to compare it with the time present in my DB.So no event could be overlapped by time. – Asad Ali Nov 30 '20 at 21:10