Possibles améliorations de performances

This commit is contained in:
Jean-Marie Favreau 2024-12-11 18:40:38 +01:00
parent c34fb666b2
commit 08e66918ab

View File

@ -192,12 +192,13 @@ class IntervalInDay(DayInCalendar):
self.id = self.id + '-' + str(id) self.id = self.id + '-' + str(id)
class CalendarList: class CalendarList:
def __init__(self, firstdate, lastdate, filter=None, exact=False, ignore_dup=None): def __init__(self, firstdate, lastdate, filter=None, exact=False, ignore_dup=None, qs=None):
self.firstdate = firstdate self.firstdate = firstdate
self.lastdate = lastdate self.lastdate = lastdate
self.now = date.today() self.now = date.today()
self.filter = filter self.filter = filter
self.ignore_dup = ignore_dup self.ignore_dup = ignore_dup
self.qs = qs
if exact: if exact:
self.c_firstdate = self.firstdate self.c_firstdate = self.firstdate
@ -236,9 +237,12 @@ class CalendarList:
def fill_calendar_days(self): def fill_calendar_days(self):
if self.filter is None: if self.filter is None:
if self.qs is None:
from .models import Event from .models import Event
qs = Event.objects.all() qs = Event.objects.all()
else:
qs = self.qs
else: else:
qs = self.filter.qs qs = self.filter.qs
@ -246,7 +250,7 @@ class CalendarList:
qs = qs.exclude(other_versions=self.ignore_dup) qs = qs.exclude(other_versions=self.ignore_dup)
startdatetime = timezone.make_aware(datetime.combine(self.c_firstdate, time.min), timezone.get_default_timezone()) startdatetime = timezone.make_aware(datetime.combine(self.c_firstdate, time.min), timezone.get_default_timezone())
lastdatetime = timezone.make_aware(datetime.combine(self.c_lastdate, time.max), timezone.get_default_timezone()) lastdatetime = timezone.make_aware(datetime.combine(self.c_lastdate, time.max), timezone.get_default_timezone())
self.events = qs.filter( qs = qs.filter(
(Q(recurrence_dtend__isnull=True) & Q(recurrence_dtstart__lte=lastdatetime)) (Q(recurrence_dtend__isnull=True) & Q(recurrence_dtstart__lte=lastdatetime))
| ( | (
Q(recurrence_dtend__isnull=False) Q(recurrence_dtend__isnull=False)
@ -260,7 +264,11 @@ class CalendarList:
Q(other_versions__isnull=True) | Q(other_versions__isnull=True) |
Q(other_versions__representative=F('pk')) | Q(other_versions__representative=F('pk')) |
Q(other_versions__representative__isnull=True) Q(other_versions__representative__isnull=True)
).order_by("start_time", "title__unaccent__lower").select_related("exact_location").select_related("category").select_related("other_versions").select_related("other_versions__representative") ).order_by("start_time", "title__unaccent__lower")
if self.qs is None:
qs = qs.select_related("exact_location").select_related("category").select_related("other_versions").select_related("other_versions__representative")
self.events = qs
firstdate = datetime.fromordinal(self.c_firstdate.toordinal()) firstdate = datetime.fromordinal(self.c_firstdate.toordinal())
if firstdate.tzinfo is None or firstdate.tzinfo.utcoffset(firstdate) is None: if firstdate.tzinfo is None or firstdate.tzinfo.utcoffset(firstdate) is None:
@ -315,7 +323,7 @@ class CalendarList:
class CalendarMonth(CalendarList): class CalendarMonth(CalendarList):
def __init__(self, year, month, filter): def __init__(self, year, month, filter, qs=None):
self.year = year self.year = year
self.month = month self.month = month
r = calendar.monthrange(year, month) r = calendar.monthrange(year, month)
@ -323,7 +331,7 @@ class CalendarMonth(CalendarList):
first = date(year, month, 1) first = date(year, month, 1)
last = date(year, month, r[1]) last = date(year, month, r[1])
super().__init__(first, last, filter) super().__init__(first, last, filter, qs)
def get_month_name(self): def get_month_name(self):
return self.firstdate.strftime("%B") return self.firstdate.strftime("%B")
@ -336,14 +344,14 @@ class CalendarMonth(CalendarList):
class CalendarWeek(CalendarList): class CalendarWeek(CalendarList):
def __init__(self, year, week, filter): def __init__(self, year, week, filter, qs=None):
self.year = year self.year = year
self.week = week self.week = week
first = date.fromisocalendar(self.year, self.week, 1) first = date.fromisocalendar(self.year, self.week, 1)
last = date.fromisocalendar(self.year, self.week, 7) last = date.fromisocalendar(self.year, self.week, 7)
super().__init__(first, last, filter) super().__init__(first, last, filter, qs)
def next_week(self): def next_week(self):
return self.firstdate + timedelta(days=7) return self.firstdate + timedelta(days=7)
@ -353,8 +361,8 @@ class CalendarWeek(CalendarList):
class CalendarDay(CalendarList): class CalendarDay(CalendarList):
def __init__(self, date, filter=None): def __init__(self, date, filter=None, qs=None):
super().__init__(date, date, filter, exact=True) super().__init__(date, date, filter=filter, qs=qs, exact=True)
def get_events(self): def get_events(self):
return self.calendar_days_list()[0].events return self.calendar_days_list()[0].events