from calendar import HTMLCalendar from datetime import date from itertools import groupby from django.utils.html import conditional_escape as esc from django.utils.translation import gettext_lazy as _ class EventCalendar(HTMLCalendar): def __init__(self, pEvents): super(EventCalendar, self).__init__() self.events = self.group_by_day(pEvents.order_by("date")) def formatday(self, day, weekday): if day != 0: cssclass = self.cssclasses[weekday] if date.today() == date(self.year, self.month, day): cssclass += " today" if day in self.events: cssclass += " filled" body = [] for ev in self.events[day]: body.append(_(''+esc(ev.nom)) elif ev.calendrier == "D": body.append('style="color:#a9008a">'+esc(ev.nom)) else: body.append('>'+esc(ev.nom)) body.append("
") return self.day_cell( cssclass, '
%d
%s' % (day, "".join(body)), ) return self.day_cell(cssclass, '
%d
' % day) return self.day_cell("noday", " ") def formatmonth(self, year, month): self.year, self.month = year, month return super(EventCalendar, self).formatmonth(year, month) def group_by_day(self, pEvents): def field(ev): return ev.date.day return dict([(dat, list(items)) for dat, items in groupby(pEvents, field)]) def day_cell(self, cssclass, body): return '%s' % (cssclass, body)