from calendar import HTMLCalendar from datetime import date from itertools import groupby from django.utils.html import conditional_escape as esc from django.template.loader import get_template from django.template import Context class WorkoutCalendar(HTMLCalendar): def __init__(self, workouts): super(WorkoutCalendar, self).__init__() self.workouts = self.group_by_day(workouts) self.template = get_template("calendar_item.html") 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.workouts: cssclass += ' filled' body = ['<ul>'] for workout in self.workouts[day]: body.append('<li>') body.append(self.template.render(Context({'item': workout})) body.append('</li>') body.append('</ul>') return self.day_cell(cssclass, '%d %s' % (day, ''.join(body))) return self.day_cell(cssclass, day) return self.day_cell('noday', ' ') def formatmonth(self, year, month): self.year, self.month = year, month return super(WorkoutCalendar, self).formatmonth(year, month) def group_by_day(self, workouts): field = lambda workout: workout.performed_at.day return dict( [(day, list(items)) for day, items in groupby(workouts, field)] ) def day_cell(self, cssclass, body): return '<td class="%s">%s</td>' % (cssclass, body)