web/views/old_calendar.py
changeset 1808 aa09e20dd8c0
parent 431 18b4dd650ef8
parent 1707 71b55db64269
child 1977 606923dff11b
--- a/web/views/old_calendar.py	Tue May 05 17:18:49 2009 +0200
+++ b/web/views/old_calendar.py	Thu May 14 12:48:11 2009 +0200
@@ -1,30 +1,22 @@
 """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 mx.DateTime import DateTime, RelativeDateTime, Date, Time, today, Sunday
+from datetime import date, time, timedelta
 
 from logilab.mtconverter import html_escape
 
 from cubicweb.interfaces import ICalendarViews
-from cubicweb.common.utils import date_range
-from cubicweb.common.selectors import implement_interface
-from cubicweb.common.registerers import priority_registerer
-from cubicweb.common.view import EntityView
+from cubicweb.utils import ONEDAY, ONEWEEK, date_range, first_day, last_day, previous_month, next_month, days_in_month
+from cubicweb.selectors import implements
+from cubicweb.view import EntityView
 
-# Define some useful constants
-ONE_MONTH = RelativeDateTime(months=1)
-TODAY = today()
-THIS_MONTH = TODAY.month
-THIS_YEAR = TODAY.year
-# mx.DateTime and ustrftime could be used to build WEEKDAYS
+# 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')
@@ -32,9 +24,7 @@
 
 class _CalendarView(EntityView):
     """base calendar view containing helpful methods to build calendar views"""
-    __registerer__ = priority_registerer
-    __selectors__ = (implement_interface,)
-    accepts_interfaces = (ICalendarViews,)
+    __select__ = implements(ICalendarViews,)
     need_navigation = False
 
     # Navigation building methods / views ####################################
@@ -45,40 +35,45 @@
 <tr><td class="prev">%s</td><td class="next">%s</td></tr>
 </table>
 """ % (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)]
-    
+                for date in date_range(begin, end, incmonth=1)]
+
     def build_calendar(self, schedule, first_day):
         """method responsible for building *one* HTML calendar"""
         # FIXME  iterates between [first_day-first_day.day_of_week ;
         #                          last_day+6-last_day.day_of_week]
         umonth = self.format_date(first_day, '%B %Y') # localized month name
         rows = []
-        current_row = [NO_CELL] * first_day.day_of_week
-        for daynum in xrange(0, first_day.days_in_month):
+        current_row = [NO_CELL] * first_day.weekday()
+        for daynum in xrange(0, days_in_month(first_day)):
             # build cell day
-            day = first_day + daynum
+            day = first_day + timedelta(daynum)
             events = schedule.get(day)
             if events:
                 events = [u'\n'.join(event) for event in events.values()]
@@ -86,13 +81,13 @@
             else:
                 current_row.append(EMPTY_CELL % (daynum+1))
             # store & reset current row on Sundays
-            if day.day_of_week == Sunday:
-                rows.append(u'<tr>%s%s</tr>' % (WEEKNUM_CELL % day.iso_week[1], ''.join(current_row)))
+            if day.weekday() == 6:
+                rows.append(u'<tr>%s%s</tr>' % (WEEKNUM_CELL % day.isocalendar()[1], ''.join(current_row)))
                 current_row = []
-        current_row.extend([NO_CELL] * (Sunday-day.day_of_week))
+        current_row.extend([NO_CELL] * (6-day.weekday()))
         rql = self.rset.printable_rql()
-        if day.day_of_week != Sunday:
-            rows.append(u'<tr>%s%s</tr>' % (WEEKNUM_CELL % day.iso_week[1], ''.join(current_row)))
+        if day.weekday() != 6:
+            rows.append(u'<tr>%s%s</tr>' % (WEEKNUM_CELL % day.isocalendar()[1], ''.join(current_row)))
         url = self.build_url(rql=rql, vid='calendarmonth',
                              year=first_day.year, month=first_day.month)
         monthlink = u'<a href="%s">%s</a>' % (html_escape(url), umonth)
@@ -109,35 +104,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'<div class="event">'
             infos += self.view(itemvid, self.rset, row=row)
             infos += u'</div>'
-            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)
 
         <begin> is the first day of current_month - shift
         <end> 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.
 
@@ -167,11 +164,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))
@@ -186,22 +183,22 @@
     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'<table class="semesterCalendar">')
         self.build_calendars(schedule, begin, end)
         self.w(u'</table>')
-        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'<tr>')
         rql = self.rset.printable_rql()
-        for cur_month in date_range(begin, end, incr=ONE_MONTH):
+        for cur_month in date_range(begin, end, incmonth=1):
             umonth = u'%s&nbsp;%s' % (self.format_date(cur_month, '%B'), cur_month.year)
             url = self.build_url(rql=rql, vid=self.id,
                                  year=cur_month.year, month=cur_month.month)
@@ -211,33 +208,33 @@
         _ = self.req._
         for day_num in xrange(31):
             self.w(u'<tr>')
-            for cur_month in date_range(begin, end, incr=ONE_MONTH):
-                if day_num >= cur_month.days_in_month:
+            for cur_month in date_range(begin, end, incmonth=1):
+                if day_num >= days_in_month(cur_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'<td>%s&nbsp;%s</td>\n' % (_(WEEKDAYS[day.day_of_week])[0].upper(), day_num+1))
+                    self.w(u'<td>%s&nbsp;%s</td>\n' % (_(WEEKDAYS[day.weekday()])[0].upper(), day_num+1))
                     self.format_day_events(day, events)
             self.w(u'</tr>')
-            
+
     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)
@@ -245,41 +242,41 @@
         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.iso_week[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', date.today().isocalendar()[1]))
+        day0 = date(year, 1, 1)
+        first_day_of_week = day0 - day0.weekday()*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'<table class="weekCalendar">')
-        _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'</table>')
         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)
             monthlink = '<a href="%s">%s</a>' % (html_escape(url), umonth)
             self.w(u'<tr><th colspan="3">%s %s (%s)</th></tr>' \
-                  % (_('week'), monday.iso_week[1], monthlink))
+                  % (_('week'), monday.isocalendar()[1], monthlink))
             for day in date_range(monday, sunday):
                 self.w(u'<tr>')
-                self.w(u'<td>%s</td>' % _(WEEKDAYS[day.day_of_week]))
+                self.w(u'<td>%s</td>' % _(WEEKDAYS[day.weekday()]))
                 self.w(u'<td>%s</td>' % (day.strftime('%Y-%m-%d')))
                 events = schedule.get(day)
                 if events:
@@ -288,35 +285,35 @@
                 else:
                     self.w(WEEK_EMPTY_CELL)
                 self.w(u'</tr>')
-        
+
     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.iso_week[1])),
-            html_escape(self.build_url(rql=rql, vid=vid, year=prev1.year, week=prev1.iso_week[1])),
-            html_escape(self.build_url(rql=rql, vid=vid, year=next1.year, week=next1.iso_week[1])),
-            html_escape(self.build_url(rql=rql, vid=vid, year=next2.year, week=next2.iso_week[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
         rows = [] # each row is: (am,pm), (am,pm) ... week_title
-        current_row = [(NO_CELL, NO_CELL, NO_CELL)] * first_day.day_of_week
+        current_row = [(NO_CELL, NO_CELL, NO_CELL)] * first_day.weekday()
         rql = self.rset.printable_rql()
-        for daynum in xrange(0, first_day.days_in_month):
+        for daynum in xrange(0, days_in_month(first_day)):
             # build cells day
-            day = first_day + daynum
+            day = first_day + timedelta(daynum)
             events = schedule.get(day)
             if events:
                 current_row.append((AMPM_DAY % (daynum+1),) + self._build_ampm_cells(daynum, events))
@@ -325,18 +322,18 @@
                                     AMPM_EMPTY % ("amCell", "am"),
                                     AMPM_EMPTY % ("pmCell", "pm")))
             # store & reset current row on Sundays
-            if day.day_of_week == Sunday:
+            if day.weekday() == 6:
                 url = self.build_url(rql=rql, vid='ampmcalendarweek',
-                                     year=day.year, week=day.iso_week[1])
+                                     year=day.year, week=day.isocalendar()[1])
                 weeklink = '<a href="%s">%s</a>' % (html_escape(url),
-                                                    day.iso_week[1])
+                                                    day.isocalendar()[1])
                 current_row.append(WEEKNUM_CELL % weeklink)
                 rows.append(current_row)
                 current_row = []
-        current_row.extend([(NO_CELL, NO_CELL, NO_CELL)] * (Sunday-day.day_of_week))
+        current_row.extend([(NO_CELL, NO_CELL, NO_CELL)] * (6-day.weekday()))
         url = self.build_url(rql=rql, vid='ampmcalendarweek',
-                             year=day.year, week=day.iso_week[1])
-        weeklink = '<a href="%s">%s</a>' % (html_escape(url), day.iso_week[1])
+                             year=day.year, week=day.isocalendar()[1])
+        weeklink = '<a href="%s">%s</a>' % (html_escape(url), day.isocalendar()[1])
         current_row.append(WEEKNUM_CELL % weeklink)
         rows.append(current_row)
         # build two rows for each week: am & pm
@@ -354,7 +351,7 @@
                              year=first_day.year, month=first_day.month)
         monthlink = '<a href="%s">%s</a>' % (html_escape(url), umonth)
         return CALENDAR(self.req) % (monthlink, '\n'.join(formatted_rows))
-        
+
 
 
 class AMPMSemesterCalendarView(SemesterCalendarView):
@@ -365,7 +362,7 @@
     def build_calendars(self, schedule, begin, end):
         self.w(u'<tr>')
         rql = self.rset.printable_rql()
-        for cur_month in date_range(begin, end, incr=ONE_MONTH):
+        for cur_month in date_range(begin, end, incmonth=1):
             umonth = u'%s&nbsp;%s' % (self.format_date(cur_month, '%B'), cur_month.year)
             url = self.build_url(rql=rql, vid=self.id,
                                  year=cur_month.year, month=cur_month.month)
@@ -375,22 +372,22 @@
         _ = self.req._
         for day_num in xrange(31):
             self.w(u'<tr>')
-            for cur_month in date_range(begin, end, incr=ONE_MONTH):
-                if day_num >= cur_month.days_in_month:
+            for cur_month in date_range(begin, end, incmonth=1):
+                if day_num >= days_in_month(cur_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'<td>%s&nbsp;%s</td>\n' % (_(WEEKDAYS[day.day_of_week])[0].upper(),
+                    self.w(u'<td>%s&nbsp;%s</td>\n' % (_(WEEKDAYS[day.weekday()])[0].upper(),
                                                        day_num+1))
                     self.format_day_events(day, events)
             self.w(u'</tr>')
-    
+
     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")))
 
 
@@ -403,11 +400,11 @@
         """method responsible for building *one* HTML calendar"""
         umonth = self.format_date(first_day, '%B %Y') # localized month name
         rows = [] # each row is: (am,pm), (am,pm) ... week_title
-        current_row = [(NO_CELL, NO_CELL, NO_CELL)] * first_day.day_of_week
+        current_row = [(NO_CELL, NO_CELL, NO_CELL)] * first_day.weekday()
         rql = self.rset.printable_rql()
-        for daynum in xrange(0, first_day.days_in_month):
+        for daynum in xrange(0, days_in_month(first_day)):
             # build cells day
-            day = first_day + daynum
+            day = first_day + timedelta(daynum)
             events = schedule.get(day)
             if events:
                 current_row.append((AMPM_DAY % (daynum+1),) + self._build_ampm_cells(daynum, events))
@@ -416,19 +413,19 @@
                                     AMPM_EMPTY % ("amCell", "am"),
                                     AMPM_EMPTY % ("pmCell", "pm")))
             # store & reset current row on Sundays
-            if day.day_of_week == Sunday:
+            if day.weekday() == 6:
                 url = self.build_url(rql=rql, vid='ampmcalendarweek',
-                                     year=day.year, week=day.iso_week[1])
+                                     year=day.year, week=day.isocalendar()[1])
                 weeklink = '<a href="%s">%s</a>' % (html_escape(url),
-                                                    day.iso_week[1])
+                                                    day.isocalendar()[1])
                 current_row.append(WEEKNUM_CELL % weeklink)
                 rows.append(current_row)
                 current_row = []
-        current_row.extend([(NO_CELL, NO_CELL, NO_CELL)] * (Sunday-day.day_of_week))
+        current_row.extend([(NO_CELL, NO_CELL, NO_CELL)] * (6-day.weekday()))
         url = self.build_url(rql=rql, vid='ampmcalendarweek',
-                             year=day.year, week=day.iso_week[1])
+                             year=day.year, week=day.isocalendar()[1])
         weeklink = '<a href="%s">%s</a>' % (html_escape(url),
-                                            day.iso_week[1])
+                                            day.isocalendar()[1])
         current_row.append(WEEKNUM_CELL % weeklink)
         rows.append(current_row)
         # build two rows for each week: am & pm
@@ -446,10 +443,10 @@
                              year=first_day.year, month=first_day.month)
         monthlink = '<a href="%s">%s</a>' % (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'
@@ -465,17 +462,17 @@
                                  year=monday.year, month=monday.month)
             monthlink = '<a href="%s">%s</a>' % (html_escape(url), umonth)
             w(u'<tr>%s</tr>' % (
-                WEEK_TITLE % (_('week'), monday.iso_week[1], monthlink)))
+                WEEK_TITLE % (_('week'), monday.isocalendar()[1], monthlink)))
             w(u'<tr><th>%s</th><th>&nbsp;</th></tr>'% _(u'Date'))
             for day in date_range(monday, sunday):
                 events = schedule.get(day)
-                style = day.day_of_week % 2 and "even" or "odd"
+                style = day.weekday() % 2 and "even" or "odd"
                 w(u'<tr class="%s">' % style)
                 if events:
                     hours = events.keys()
                     hours.sort()
                     w(AMPM_DAYWEEK % (
-                        len(hours), _(WEEKDAYS[day.day_of_week]),
+                        len(hours), _(WEEKDAYS[day.weekday()]),
                         self.format_date(day)))
                     w(AMPM_WEEK_CELL % (
                         hours[0].hour, hours[0].minute,
@@ -487,7 +484,7 @@
                                                      '\n'.join(events[hour]))))
                 else:
                     w(AMPM_DAYWEEK_EMPTY % (
-                        _(WEEKDAYS[day.day_of_week]),
+                        _(WEEKDAYS[day.weekday()]),
                         self.format_date(day)))
                     w(WEEK_EMPTY_CELL)
                     w(u'</tr>')