I have to show Calendar Events information for current week only.
This is calculated from models CalendarEvent
and CalendarEventException
.
CalendarEvent
is defined with WEEKDAY and TIME. WEEKDAY is defined from DayChoice
TextChoices.
CalendarEventException
is defined with STARTTIME and ENDTIME of exception which means that between that datetimes CalerndarEvent
should not be scheduled.
To calculate the CalendarEvent
events for this week first I have to calculate the exact datetime for this week from WEEKDAY and TIME and then I have to check if there are no CalendarEventException
exceptions which interfere with the event datetime.
I’m using properties (@property
) this_week_event_datetime
and this_week_event_datetime_end
to calculate real datetime for each event for this week.
And now I have trouble to built the DB query because it seems I cannot use @property
in the filter()
.
What would you suggest how to solve this ?
from datetime import datetime
from datetime import timedelta
from django.utils import dateparse
from django.utils import timezone
# ...other imports and models...
class DayChoice(models.TextChoices):
D0 = 0, 'MONDAY'
D1 = 1, 'TUESDAY'
D2 = 2, 'WEDNESDAY'
D3 = 3, 'THURSDAY'
D4 = 4, 'FRIDAY'
D5 = 5, 'SATURDAY'
D6 = 6, 'SUNDAY'
class CalendarEvent(models.Model):
day = models.CharField(max_length=2, choices=DayChoice.choices, default=DayChoice.D1)
time = models.TimeField(default=timezone.now())
duration_minutes = models.IntegerField(default=60)
is_active = models.BooleanField(default=True, verbose_name='Event is Active')
@property
def this_week_event_datetime(self):
monday0000 = (dt - timedelta(days=dt.weekday())).replace(hour=0, minute=0, second=0, microsecond=0)
this_week_day = monday0000 + timedelta(days=int(DayChoice(self.day).value))
return this_week_day.replace(hour=self.time.hour, minute=self.time.minute, second=self.time.second, microsecond=self.time.microsecond)
@property
def this_week_event_datetime_end(self):
return self.this_week_event_datetime + timedelta(minutes=duration_minutes)
# THIS DOES NOT WORK because properties are used in filter()
def get_this_week_events():
# IDEA WAS: Get CalendarEvents which 1) are ACTIVE and 2) don't have Exceptions which are ACTIVE and which interefere with Event time
return CalendarEvent.objects.filter(
Q(is_active=True) &
~Q(is_active=True,ue_exceptions__start_at__lte=this_week_event_datetime,ue_exceptions__end_at__gte=this_week_event_datetime_end)
)
class CalendarEventException(models.Model):
calendar_vent = models.ForeignKey(CalendarEvent, related_name='event_exceptions', on_delete=models.CASCADE)
start_at = models.DateTimeField(default=timezone.now())
end_at = models.DateTimeField(default=timezone.now()+timedelta(days=30))
is_active = models.BooleanField(default=True, verbose_name='Exception is Active')