# HG changeset patch # User sylvain.thenault@logilab.fr # Date 1241544955 -7200 # Node ID b5b323f8a05b47cbfd91507fe92022753c1ad098 # Parent f61402624f7b0eef094ada86e38670cb9716f892 update old_calendar, more needed diff -r f61402624f7b -r b5b323f8a05b web/views/old_calendar.py --- a/web/views/old_calendar.py Tue May 05 19:31:00 2009 +0200 +++ b/web/views/old_calendar.py Tue May 05 19:35:55 2009 +0200 @@ -1,31 +1,24 @@ """html calendar views :organization: Logilab -:copyright: 2001-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved. :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr """ -from datetime import datetime, date, time, timedelta -#from datetime import datetime, RelativeDateTime, date, time, Sunday +from datetime import date, time, timedelta from logilab.mtconverter import html_escape from cubicweb.interfaces import ICalendarViews -from cubicweb.utils import date_range +from cubicweb.utils import ONEDAY, ONEWEEK, date_range, previous_month, next_month from cubicweb.selectors import implements from cubicweb.view import EntityView # Define some useful constants -#ONE_MONTH = RelativeDateTime(months=1) -ONE_MONTH = timedelta(days=31) -TODAY = date.today() -THIS_MONTH = TODAY.month -THIS_YEAR = TODAY.year -# mx.DateTime and ustrftime could be used to build WEEKDAYS +ONE_MONTH = timedelta(days=31) # XXX +# used by i18n tools WEEKDAYS = [_("monday"), _("tuesday"), _("wednesday"), _("thursday"), _("friday"), _("saturday"), _("sunday")] - -# used by i18n tools MONTHNAMES = [ _('january'), _('february'), _('march'), _('april'), _('may'), _('june'), _('july'), _('august'), _('september'), _('october'), _('november'), _('december') @@ -44,30 +37,35 @@ %s%s """ % (PREV, NEXT) - + def nav_header(self, date, smallshift=3, bigshift=9): """prints shortcut links to go to previous/next steps (month|week)""" - prev1 = date - RelativeDateTime(months=smallshift) - prev2 = date - RelativeDateTime(months=bigshift) - next1 = date + RelativeDateTime(months=smallshift) - next2 = date + RelativeDateTime(months=bigshift) - rql, vid = self.rset.printable_rql(), self.id + prev1 = next1 = prev2 = nex2 = date + prev1 = previous_month(date, smallshift) + next1 = next_month(date, smallshift) + prev2 = previous_month(date, bigshift) + next2 = next_month(date, bigshift) + rql = self.rset.printable_rql() return self.NAV_HEADER % ( - html_escape(self.build_url(rql=rql, vid=vid, year=prev2.year, month=prev2.month)), - html_escape(self.build_url(rql=rql, vid=vid, year=prev1.year, month=prev1.month)), - html_escape(self.build_url(rql=rql, vid=vid, year=next1.year, month=next1.month)), - html_escape(self.build_url(rql=rql, vid=vid, year=next2.year, month=next2.month))) - - + html_escape(self.build_url(rql=rql, vid=self.id, year=prev2.year, + month=prev2.month)), + html_escape(self.build_url(rql=rql, vid=self.id, year=prev1.year, + month=prev1.month)), + html_escape(self.build_url(rql=rql, vid=self.id, year=next1.year, + month=next1.month)), + html_escape(self.build_url(rql=rql, vid=self.id, year=next2.year, + month=next2.month))) + + # Calendar building methods ############################################## - + def build_calendars(self, schedule, begin, end): """build several HTML calendars at once, one for each month between begin and end """ return [self.build_calendar(schedule, date) for date in date_range(begin, end, incr=ONE_MONTH)] - + def build_calendar(self, schedule, first_day): """method responsible for building *one* HTML calendar""" # FIXME iterates between [first_day-first_day.day_of_week ; @@ -108,35 +106,37 @@ returns { day1 : { hour : [views] }, day2 : { hour : [views] } ... } """ - # put this here since all sub views are calling this method - self.req.add_css('cubicweb.calendar.css') + # put this here since all sub views are calling this method + self.req.add_css('cubicweb.calendar.css') schedule = {} for row in xrange(len(self.rset.rows)): entity = self.entity(row) infos = u'
' infos += self.view(itemvid, self.rset, row=row) infos += u'
' - for date in entity.matching_dates(begin, end): - day = Date(date.year, date.month, date.day) - time = Time(date.hour, date.minute, date.second) + for date_ in entity.matching_dates(begin, end): + day = date(date_.year, date_.month, date_.day) + try: + dt = time(date_.hour, date_.minute, date_.second) + except AttributeError: + # date instance + dt = time(0, 0, 0) schedule.setdefault(day, {}) - schedule[day].setdefault(time, []).append(infos) + schedule[day].setdefault(dt, []).append(infos) return schedule - + @staticmethod - def get_date_range(day=TODAY, shift=4): + def get_date_range(day, shift=4): """returns a couple (begin, end) is the first day of current_month - shift is the last day of current_month + (shift+1) """ - first_day_in_month = DateTime(day.year, day.month, 1) - begin = first_day_in_month - RelativeDateTime(months=shift) - end = (first_day_in_month + RelativeDateTime(months=shift+1)) - 1 + begin = first_day(previous_month(day, shift)) + end = last_day(next_month(day, shift)) return begin, end - def _build_ampm_cells(self, daynum, events): """create a view without any hourly details. @@ -166,11 +166,11 @@ id = 'calendaryear' title = _('calendar (year)') - def call(self, year=THIS_YEAR, month=THIS_MONTH): + def call(self, year=None, month=None): """this view renders a 3x3 calendars' table""" - year = int(self.req.form.get('year', year)) - month = int(self.req.form.get('month', month)) - center_date = DateTime(year, month) + year = year or int(self.req.form.get('year', date.today().year)) + month = month or int(self.req.form.get('month', date.today().month)) + center_date = date(year, month, 1) begin, end = self.get_date_range(day=center_date) schedule = self._mk_schedule(begin, end) self.w(self.nav_header(center_date)) @@ -185,17 +185,17 @@ id = 'calendarsemester' title = _('calendar (semester)') - def call(self, year=THIS_YEAR, month=THIS_MONTH): - year = int(self.req.form.get('year', year)) - month = int(self.req.form.get('month', month)) - begin = DateTime(year, month) - RelativeDateTime(months=2) - end = DateTime(year, month) + RelativeDateTime(months=3) + def call(self, year=None, month=None): + year = year or int(self.req.form.get('year', date.today().year)) + month = month or int(self.req.form.get('month', date.today().month)) + begin = previous_month(date(year, month, 1), 2) + end = next_month(date(year, month, 1), 3) schedule = self._mk_schedule(begin, end) - self.w(self.nav_header(DateTime(year, month), 1, 6)) + self.w(self.nav_header(date(year, month, 1), 1, 6)) self.w(u'') self.build_calendars(schedule, begin, end) self.w(u'
') - self.w(self.nav_header(DateTime(year, month), 1, 6)) + self.w(self.nav_header(date(year, month, 1), 1, 6)) def build_calendars(self, schedule, begin, end): self.w(u'') @@ -214,29 +214,29 @@ if day_num >= cur_month.days_in_month: self.w(u'%s%s' % (NO_CELL, NO_CELL)) else: - day = DateTime(cur_month.year, cur_month.month, day_num+1) + day = date(cur_month.year, cur_month.month, day_num+1) events = schedule.get(day) self.w(u'%s %s\n' % (_(WEEKDAYS[day.day_of_week])[0].upper(), day_num+1)) self.format_day_events(day, events) self.w(u'') - + def format_day_events(self, day, events): if events: events = ['\n'.join(event) for event in events.values()] self.w(WEEK_CELL % '\n'.join(events)) else: self.w(WEEK_EMPTY_CELL) - + class MonthCalendarView(_CalendarView): """this view renders a 3x1 calendars' table""" id = 'calendarmonth' title = _('calendar (month)') - - def call(self, year=THIS_YEAR, month=THIS_MONTH): - year = int(self.req.form.get('year', year)) - month = int(self.req.form.get('month', month)) - center_date = DateTime(year, month) + + def call(self, year=None, month=None): + year = year or int(self.req.form.get('year', date.today().year)) + month = month or int(self.req.form.get('month', date.today().month)) + center_date = date(year, month, 1) begin, end = self.get_date_range(day=center_date, shift=1) schedule = self._mk_schedule(begin, end) calendars = self.build_calendars(schedule, begin, end) @@ -244,32 +244,33 @@ self.w(BIG_CALENDARS_PAGE % tuple(calendars)) self.w(self.nav_header(center_date, 1, 3)) - + class WeekCalendarView(_CalendarView): """this view renders a calendar for week events""" id = 'calendarweek' title = _('calendar (week)') - - def call(self, year=THIS_YEAR, week=TODAY.isocalendar()[1]): - year = int(self.req.form.get('year', year)) - week = int(self.req.form.get('week', week)) - day0 = DateTime(year) - first_day_of_week = (day0-day0.day_of_week) + 7*week - begin, end = first_day_of_week-7, first_day_of_week+14 + + def call(self, year=None, week=None): + year = year or int(self.req.form.get('year', date.today().year)) + week = week or int(self.req.form.get('week', week, + date.today().isocalendar()[1])) + day0 = date(year, 1, 1) + first_day_of_week = day0 - day0.day_of_week*ONEDAY + ONEWEEK + begin, end = first_day_of_week- ONEWEEK, first_day_of_week + 2*ONEWEEK schedule = self._mk_schedule(begin, end, itemvid='calendarlargeitem') self.w(self.nav_header(first_day_of_week)) self.w(u'') - _weeks = [(first_day_of_week-7, first_day_of_week-1), - (first_day_of_week, first_day_of_week+6), - (first_day_of_week+7, first_day_of_week+13)] + _weeks = [(first_day_of_week-ONEWEEK, first_day_of_week-ONEDAY), + (first_day_of_week, first_day_of_week+6*ONEDAY), + (first_day_of_week+ONEWEEK, first_day_of_week+13*ONEDAY)] self.build_calendar(schedule, _weeks) self.w(u'
') self.w(self.nav_header(first_day_of_week)) - + def build_calendar(self, schedule, weeks): rql = self.rset.printable_rql() _ = self.req._ - for monday, sunday in weeks: + for monday, sunday in weeks: umonth = self.format_date(monday, '%B %Y') url = self.build_url(rql=rql, vid='calendarmonth', year=monday.year, month=monday.month) @@ -287,26 +288,26 @@ else: self.w(WEEK_EMPTY_CELL) self.w(u'') - + def nav_header(self, date, smallshift=1, bigshift=3): """prints shortcut links to go to previous/next steps (month|week)""" - prev1 = date - RelativeDateTime(weeks=smallshift) - prev2 = date - RelativeDateTime(weeks=bigshift) - next1 = date + RelativeDateTime(weeks=smallshift) - next2 = date + RelativeDateTime(weeks=bigshift) - rql, vid = self.rset.printable_rql(), self.id + prev1 = date - ONEWEEK * smallshift + prev2 = date - ONEWEEK * bigshift + next1 = date + ONEWEEK * smallshift + next2 = date + ONEWEEK * bigshift + rql = self.rset.printable_rql() return self.NAV_HEADER % ( - html_escape(self.build_url(rql=rql, vid=vid, year=prev2.year, week=prev2.isocalendar()[1])), - html_escape(self.build_url(rql=rql, vid=vid, year=prev1.year, week=prev1.isocalendar()[1])), - html_escape(self.build_url(rql=rql, vid=vid, year=next1.year, week=next1.isocalendar()[1])), - html_escape(self.build_url(rql=rql, vid=vid, year=next2.year, week=next2.isocalendar()[1]))) + html_escape(self.build_url(rql=rql, vid=self.id, year=prev2.year, week=prev2.isocalendar()[1])), + html_escape(self.build_url(rql=rql, vid=self.id, year=prev1.year, week=prev1.isocalendar()[1])), + html_escape(self.build_url(rql=rql, vid=self.id, year=next1.year, week=next1.isocalendar()[1])), + html_escape(self.build_url(rql=rql, vid=self.id, year=next2.year, week=next2.isocalendar()[1]))) - + class AMPMYearCalendarView(YearCalendarView): id = 'ampmcalendaryear' title = _('am/pm calendar (year)') - + def build_calendar(self, schedule, first_day): """method responsible for building *one* HTML calendar""" umonth = self.format_date(first_day, '%B %Y') # localized month name @@ -353,7 +354,7 @@ year=first_day.year, month=first_day.month) monthlink = '%s' % (html_escape(url), umonth) return CALENDAR(self.req) % (monthlink, '\n'.join(formatted_rows)) - + class AMPMSemesterCalendarView(SemesterCalendarView): @@ -378,18 +379,18 @@ if day_num >= cur_month.days_in_month: self.w(u'%s%s%s' % (NO_CELL, NO_CELL, NO_CELL)) else: - day = DateTime(cur_month.year, cur_month.month, day_num+1) + day = date(cur_month.year, cur_month.month, day_num+1) events = schedule.get(day) self.w(u'%s %s\n' % (_(WEEKDAYS[day.day_of_week])[0].upper(), day_num+1)) self.format_day_events(day, events) self.w(u'') - + def format_day_events(self, day, events): if events: self.w(u'\n'.join(self._build_ampm_cells(day, events))) else: - self.w(u'%s %s'% (AMPM_EMPTY % ("amCell", "am"), + self.w(u'%s %s'% (AMPM_EMPTY % ("amCell", "am"), AMPM_EMPTY % ("pmCell", "pm"))) @@ -445,10 +446,10 @@ year=first_day.year, month=first_day.month) monthlink = '%s' % (html_escape(url), umonth) - return CALENDAR(self.req) % (monthlink, '\n'.join(formatted_rows)) - + return CALENDAR(self.req) % (monthlink, '\n'.join(formatted_rows)) - + + class AMPMWeekCalendarView(WeekCalendarView): """this view renders a 3x1 calendars' table""" id = 'ampmcalendarweek'