33from django .db import models
44from django .conf import settings
55from django .utils import timezone
6+ from django .db .models import Q
67from django .contrib .auth .models import User
78
89from PIL import Image
@@ -23,7 +24,7 @@ def room_img_upload_to(instance, filename):
2324
2425class RoomManager (models .Manager ):
2526
26- def available (self , start = None , end = None , has_av = None , has_phone = None , floor = None , seats = None ):
27+ def available (self , start , end , has_av = None , has_phone = None , floor = None , seats = None ):
2728 rooms = self .all ()
2829 if has_av != None :
2930 rooms = rooms .filter (has_av = has_av )
@@ -33,14 +34,10 @@ def available(self, start=None, end=None, has_av=None, has_phone=None, floor=Non
3334 rooms = rooms .filter (floor = floor )
3435 if seats != None :
3536 rooms = rooms .filter (seats__gte = seats )
36- if start != None :
37- rooms = rooms .exclude (event__start_ts__lt = start )
38- # The three ways to filter out overlapping times
39- # event__start_ts__lte=start and event__end_ts__gt=start
40- # event__start_ts__gte=start and event__start_ts__lte=end
41- # event__start_ts__lte=start and event__end_ts__gte=end)
42- if end != None :
43- rooms = rooms .exclude (event__end_ts__gt = end )
37+ straddling = Q (event__start_ts__lte = start , event__end_ts__gt = start )
38+ sandwich = Q (event__start_ts__gte = start , event__start_ts__lte = end )
39+ overlap = Q (event__start_ts__lte = start , event__end_ts__gte = end )
40+ rooms = rooms .exclude (straddling | sandwich | overlap )
4441 return rooms
4542
4643
0 commit comments