42 prev1 = next1 = prev2 = nex2 = date |
42 prev1 = next1 = prev2 = nex2 = date |
43 prev1 = previous_month(date, smallshift) |
43 prev1 = previous_month(date, smallshift) |
44 next1 = next_month(date, smallshift) |
44 next1 = next_month(date, smallshift) |
45 prev2 = previous_month(date, bigshift) |
45 prev2 = previous_month(date, bigshift) |
46 next2 = next_month(date, bigshift) |
46 next2 = next_month(date, bigshift) |
47 rql = self.rset.printable_rql() |
47 rql = self.cw_rset.printable_rql() |
48 return self.NAV_HEADER % ( |
48 return self.NAV_HEADER % ( |
49 xml_escape(self.build_url(rql=rql, vid=self.id, year=prev2.year, |
49 xml_escape(self.build_url(rql=rql, vid=self.__regid__, year=prev2.year, |
50 month=prev2.month)), |
50 month=prev2.month)), |
51 xml_escape(self.build_url(rql=rql, vid=self.id, year=prev1.year, |
51 xml_escape(self.build_url(rql=rql, vid=self.__regid__, year=prev1.year, |
52 month=prev1.month)), |
52 month=prev1.month)), |
53 xml_escape(self.build_url(rql=rql, vid=self.id, year=next1.year, |
53 xml_escape(self.build_url(rql=rql, vid=self.__regid__, year=next1.year, |
54 month=next1.month)), |
54 month=next1.month)), |
55 xml_escape(self.build_url(rql=rql, vid=self.id, year=next2.year, |
55 xml_escape(self.build_url(rql=rql, vid=self.__regid__, year=next2.year, |
56 month=next2.month))) |
56 month=next2.month))) |
57 |
57 |
58 |
58 |
59 # Calendar building methods ############################################## |
59 # Calendar building methods ############################################## |
60 |
60 |
84 # store & reset current row on Sundays |
84 # store & reset current row on Sundays |
85 if day.weekday() == 6: |
85 if day.weekday() == 6: |
86 rows.append(u'<tr>%s%s</tr>' % (WEEKNUM_CELL % day.isocalendar()[1], ''.join(current_row))) |
86 rows.append(u'<tr>%s%s</tr>' % (WEEKNUM_CELL % day.isocalendar()[1], ''.join(current_row))) |
87 current_row = [] |
87 current_row = [] |
88 current_row.extend([NO_CELL] * (6-day.weekday())) |
88 current_row.extend([NO_CELL] * (6-day.weekday())) |
89 rql = self.rset.printable_rql() |
89 rql = self.cw_rset.printable_rql() |
90 if day.weekday() != 6: |
90 if day.weekday() != 6: |
91 rows.append(u'<tr>%s%s</tr>' % (WEEKNUM_CELL % day.isocalendar()[1], ''.join(current_row))) |
91 rows.append(u'<tr>%s%s</tr>' % (WEEKNUM_CELL % day.isocalendar()[1], ''.join(current_row))) |
92 url = self.build_url(rql=rql, vid='calendarmonth', |
92 url = self.build_url(rql=rql, vid='calendarmonth', |
93 year=first_day.year, month=first_day.month) |
93 year=first_day.year, month=first_day.month) |
94 monthlink = u'<a href="%s">%s</a>' % (xml_escape(url), umonth) |
94 monthlink = u'<a href="%s">%s</a>' % (xml_escape(url), umonth) |
95 return CALENDAR(self.req) % (monthlink, '\n'.join(rows)) |
95 return CALENDAR(self._cw) % (monthlink, '\n'.join(rows)) |
96 |
96 |
97 def _mk_schedule(self, begin, end, itemvid='calendaritem'): |
97 def _mk_schedule(self, begin, end, itemvid='calendaritem'): |
98 """private method that gathers information from resultset |
98 """private method that gathers information from resultset |
99 and builds calendars according to it |
99 and builds calendars according to it |
100 |
100 |
104 |
104 |
105 returns { day1 : { hour : [views] }, |
105 returns { day1 : { hour : [views] }, |
106 day2 : { hour : [views] } ... } |
106 day2 : { hour : [views] } ... } |
107 """ |
107 """ |
108 # put this here since all sub views are calling this method |
108 # put this here since all sub views are calling this method |
109 self.req.add_css('cubicweb.calendar.css') |
109 self._cw.add_css('cubicweb.calendar.css') |
110 schedule = {} |
110 schedule = {} |
111 for row in xrange(len(self.rset.rows)): |
111 for row in xrange(len(self.cw_rset.rows)): |
112 entity = self.rset.get_entity(row,0) |
112 entity = self.cw_rset.get_entity(row,0) |
113 infos = u'<div class="event">' |
113 infos = u'<div class="event">' |
114 infos += self.view(itemvid, self.rset, row=row) |
114 infos += self.view(itemvid, self.cw_rset, row=row) |
115 infos += u'</div>' |
115 infos += u'</div>' |
116 for date_ in entity.matching_dates(begin, end): |
116 for date_ in entity.matching_dates(begin, end): |
117 day = date(date_.year, date_.month, date_.day) |
117 day = date(date_.year, date_.month, date_.day) |
118 try: |
118 try: |
119 dt = time(date_.hour, date_.minute, date_.second) |
119 dt = time(date_.hour, date_.minute, date_.second) |
165 __regid__ = 'calendaryear' |
165 __regid__ = 'calendaryear' |
166 title = _('calendar (year)') |
166 title = _('calendar (year)') |
167 |
167 |
168 def call(self, year=None, month=None): |
168 def call(self, year=None, month=None): |
169 """this view renders a 3x3 calendars' table""" |
169 """this view renders a 3x3 calendars' table""" |
170 year = year or int(self.req.form.get('year', date.today().year)) |
170 year = year or int(self._cw.form.get('year', date.today().year)) |
171 month = month or int(self.req.form.get('month', date.today().month)) |
171 month = month or int(self._cw.form.get('month', date.today().month)) |
172 center_date = date(year, month, 1) |
172 center_date = date(year, month, 1) |
173 begin, end = self.get_date_range(day=center_date) |
173 begin, end = self.get_date_range(day=center_date) |
174 schedule = self._mk_schedule(begin, end) |
174 schedule = self._mk_schedule(begin, end) |
175 self.w(self.nav_header(center_date)) |
175 self.w(self.nav_header(center_date)) |
176 calendars = tuple(self.build_calendars(schedule, begin, end)) |
176 calendars = tuple(self.build_calendars(schedule, begin, end)) |
183 """ |
183 """ |
184 __regid__ = 'calendarsemester' |
184 __regid__ = 'calendarsemester' |
185 title = _('calendar (semester)') |
185 title = _('calendar (semester)') |
186 |
186 |
187 def call(self, year=None, month=None): |
187 def call(self, year=None, month=None): |
188 year = year or int(self.req.form.get('year', date.today().year)) |
188 year = year or int(self._cw.form.get('year', date.today().year)) |
189 month = month or int(self.req.form.get('month', date.today().month)) |
189 month = month or int(self._cw.form.get('month', date.today().month)) |
190 begin = previous_month(date(year, month, 1), 2) |
190 begin = previous_month(date(year, month, 1), 2) |
191 end = next_month(date(year, month, 1), 3) |
191 end = next_month(date(year, month, 1), 3) |
192 schedule = self._mk_schedule(begin, end) |
192 schedule = self._mk_schedule(begin, end) |
193 self.w(self.nav_header(date(year, month, 1), 1, 6)) |
193 self.w(self.nav_header(date(year, month, 1), 1, 6)) |
194 self.w(u'<table class="semesterCalendar">') |
194 self.w(u'<table class="semesterCalendar">') |
196 self.w(u'</table>') |
196 self.w(u'</table>') |
197 self.w(self.nav_header(date(year, month, 1), 1, 6)) |
197 self.w(self.nav_header(date(year, month, 1), 1, 6)) |
198 |
198 |
199 def build_calendars(self, schedule, begin, end): |
199 def build_calendars(self, schedule, begin, end): |
200 self.w(u'<tr>') |
200 self.w(u'<tr>') |
201 rql = self.rset.printable_rql() |
201 rql = self.cw_rset.printable_rql() |
202 for cur_month in date_range(begin, end, incmonth=1): |
202 for cur_month in date_range(begin, end, incmonth=1): |
203 umonth = u'%s %s' % (self.format_date(cur_month, '%B'), cur_month.year) |
203 umonth = u'%s %s' % (self.format_date(cur_month, '%B'), cur_month.year) |
204 url = self.build_url(rql=rql, vid=self.id, |
204 url = self.build_url(rql=rql, vid=self.__regid__, |
205 year=cur_month.year, month=cur_month.month) |
205 year=cur_month.year, month=cur_month.month) |
206 self.w(u'<th colspan="2"><a href="%s">%s</a></th>' % (xml_escape(url), |
206 self.w(u'<th colspan="2"><a href="%s">%s</a></th>' % (xml_escape(url), |
207 umonth)) |
207 umonth)) |
208 self.w(u'</tr>') |
208 self.w(u'</tr>') |
209 _ = self.req._ |
209 _ = self._cw._ |
210 for day_num in xrange(31): |
210 for day_num in xrange(31): |
211 self.w(u'<tr>') |
211 self.w(u'<tr>') |
212 for cur_month in date_range(begin, end, incmonth=1): |
212 for cur_month in date_range(begin, end, incmonth=1): |
213 if day_num >= days_in_month(cur_month): |
213 if day_num >= days_in_month(cur_month): |
214 self.w(u'%s%s' % (NO_CELL, NO_CELL)) |
214 self.w(u'%s%s' % (NO_CELL, NO_CELL)) |
231 """this view renders a 3x1 calendars' table""" |
231 """this view renders a 3x1 calendars' table""" |
232 __regid__ = 'calendarmonth' |
232 __regid__ = 'calendarmonth' |
233 title = _('calendar (month)') |
233 title = _('calendar (month)') |
234 |
234 |
235 def call(self, year=None, month=None): |
235 def call(self, year=None, month=None): |
236 year = year or int(self.req.form.get('year', date.today().year)) |
236 year = year or int(self._cw.form.get('year', date.today().year)) |
237 month = month or int(self.req.form.get('month', date.today().month)) |
237 month = month or int(self._cw.form.get('month', date.today().month)) |
238 center_date = date(year, month, 1) |
238 center_date = date(year, month, 1) |
239 begin, end = self.get_date_range(day=center_date, shift=1) |
239 begin, end = self.get_date_range(day=center_date, shift=1) |
240 schedule = self._mk_schedule(begin, end) |
240 schedule = self._mk_schedule(begin, end) |
241 calendars = self.build_calendars(schedule, begin, end) |
241 calendars = self.build_calendars(schedule, begin, end) |
242 self.w(self.nav_header(center_date, 1, 3)) |
242 self.w(self.nav_header(center_date, 1, 3)) |
248 """this view renders a calendar for week events""" |
248 """this view renders a calendar for week events""" |
249 __regid__ = 'calendarweek' |
249 __regid__ = 'calendarweek' |
250 title = _('calendar (week)') |
250 title = _('calendar (week)') |
251 |
251 |
252 def call(self, year=None, week=None): |
252 def call(self, year=None, week=None): |
253 year = year or int(self.req.form.get('year', date.today().year)) |
253 year = year or int(self._cw.form.get('year', date.today().year)) |
254 week = week or int(self.req.form.get('week', date.today().isocalendar()[1])) |
254 week = week or int(self._cw.form.get('week', date.today().isocalendar()[1])) |
255 day0 = date(year, 1, 1) |
255 day0 = date(year, 1, 1) |
256 first_day_of_week = day0 - day0.weekday()*ONEDAY + ONEWEEK |
256 first_day_of_week = day0 - day0.weekday()*ONEDAY + ONEWEEK |
257 begin, end = first_day_of_week- ONEWEEK, first_day_of_week + 2*ONEWEEK |
257 begin, end = first_day_of_week- ONEWEEK, first_day_of_week + 2*ONEWEEK |
258 schedule = self._mk_schedule(begin, end, itemvid='calendarlargeitem') |
258 schedule = self._mk_schedule(begin, end, itemvid='calendarlargeitem') |
259 self.w(self.nav_header(first_day_of_week)) |
259 self.w(self.nav_header(first_day_of_week)) |
264 self.build_calendar(schedule, _weeks) |
264 self.build_calendar(schedule, _weeks) |
265 self.w(u'</table>') |
265 self.w(u'</table>') |
266 self.w(self.nav_header(first_day_of_week)) |
266 self.w(self.nav_header(first_day_of_week)) |
267 |
267 |
268 def build_calendar(self, schedule, weeks): |
268 def build_calendar(self, schedule, weeks): |
269 rql = self.rset.printable_rql() |
269 rql = self.cw_rset.printable_rql() |
270 _ = self.req._ |
270 _ = self._cw._ |
271 for monday, sunday in weeks: |
271 for monday, sunday in weeks: |
272 umonth = self.format_date(monday, '%B %Y') |
272 umonth = self.format_date(monday, '%B %Y') |
273 url = self.build_url(rql=rql, vid='calendarmonth', |
273 url = self.build_url(rql=rql, vid='calendarmonth', |
274 year=monday.year, month=monday.month) |
274 year=monday.year, month=monday.month) |
275 monthlink = '<a href="%s">%s</a>' % (xml_escape(url), umonth) |
275 monthlink = '<a href="%s">%s</a>' % (xml_escape(url), umonth) |
291 """prints shortcut links to go to previous/next steps (month|week)""" |
291 """prints shortcut links to go to previous/next steps (month|week)""" |
292 prev1 = date - ONEWEEK * smallshift |
292 prev1 = date - ONEWEEK * smallshift |
293 prev2 = date - ONEWEEK * bigshift |
293 prev2 = date - ONEWEEK * bigshift |
294 next1 = date + ONEWEEK * smallshift |
294 next1 = date + ONEWEEK * smallshift |
295 next2 = date + ONEWEEK * bigshift |
295 next2 = date + ONEWEEK * bigshift |
296 rql = self.rset.printable_rql() |
296 rql = self.cw_rset.printable_rql() |
297 return self.NAV_HEADER % ( |
297 return self.NAV_HEADER % ( |
298 xml_escape(self.build_url(rql=rql, vid=self.id, year=prev2.year, week=prev2.isocalendar()[1])), |
298 xml_escape(self.build_url(rql=rql, vid=self.__regid__, year=prev2.year, week=prev2.isocalendar()[1])), |
299 xml_escape(self.build_url(rql=rql, vid=self.id, year=prev1.year, week=prev1.isocalendar()[1])), |
299 xml_escape(self.build_url(rql=rql, vid=self.__regid__, year=prev1.year, week=prev1.isocalendar()[1])), |
300 xml_escape(self.build_url(rql=rql, vid=self.id, year=next1.year, week=next1.isocalendar()[1])), |
300 xml_escape(self.build_url(rql=rql, vid=self.__regid__, year=next1.year, week=next1.isocalendar()[1])), |
301 xml_escape(self.build_url(rql=rql, vid=self.id, year=next2.year, week=next2.isocalendar()[1]))) |
301 xml_escape(self.build_url(rql=rql, vid=self.__regid__, year=next2.year, week=next2.isocalendar()[1]))) |
302 |
302 |
303 |
303 |
304 |
304 |
305 class AMPMYearCalendarView(YearCalendarView): |
305 class AMPMYearCalendarView(YearCalendarView): |
306 __regid__ = 'ampmcalendaryear' |
306 __regid__ = 'ampmcalendaryear' |
309 def build_calendar(self, schedule, first_day): |
309 def build_calendar(self, schedule, first_day): |
310 """method responsible for building *one* HTML calendar""" |
310 """method responsible for building *one* HTML calendar""" |
311 umonth = self.format_date(first_day, '%B %Y') # localized month name |
311 umonth = self.format_date(first_day, '%B %Y') # localized month name |
312 rows = [] # each row is: (am,pm), (am,pm) ... week_title |
312 rows = [] # each row is: (am,pm), (am,pm) ... week_title |
313 current_row = [(NO_CELL, NO_CELL, NO_CELL)] * first_day.weekday() |
313 current_row = [(NO_CELL, NO_CELL, NO_CELL)] * first_day.weekday() |
314 rql = self.rset.printable_rql() |
314 rql = self.cw_rset.printable_rql() |
315 for daynum in xrange(0, days_in_month(first_day)): |
315 for daynum in xrange(0, days_in_month(first_day)): |
316 # build cells day |
316 # build cells day |
317 day = first_day + timedelta(daynum) |
317 day = first_day + timedelta(daynum) |
318 events = schedule.get(day) |
318 events = schedule.get(day) |
319 if events: |
319 if events: |
349 formatted_rows.append('<tr class="pmRow"><td> </td>%s</tr>'% '\n'.join(pm_row)) |
349 formatted_rows.append('<tr class="pmRow"><td> </td>%s</tr>'% '\n'.join(pm_row)) |
350 # tigh everything together |
350 # tigh everything together |
351 url = self.build_url(rql=rql, vid='ampmcalendarmonth', |
351 url = self.build_url(rql=rql, vid='ampmcalendarmonth', |
352 year=first_day.year, month=first_day.month) |
352 year=first_day.year, month=first_day.month) |
353 monthlink = '<a href="%s">%s</a>' % (xml_escape(url), umonth) |
353 monthlink = '<a href="%s">%s</a>' % (xml_escape(url), umonth) |
354 return CALENDAR(self.req) % (monthlink, '\n'.join(formatted_rows)) |
354 return CALENDAR(self._cw) % (monthlink, '\n'.join(formatted_rows)) |
355 |
355 |
356 |
356 |
357 |
357 |
358 class AMPMSemesterCalendarView(SemesterCalendarView): |
358 class AMPMSemesterCalendarView(SemesterCalendarView): |
359 """this view renders a 3x1 calendars' table""" |
359 """this view renders a 3x1 calendars' table""" |
360 __regid__ = 'ampmcalendarsemester' |
360 __regid__ = 'ampmcalendarsemester' |
361 title = _('am/pm calendar (semester)') |
361 title = _('am/pm calendar (semester)') |
362 |
362 |
363 def build_calendars(self, schedule, begin, end): |
363 def build_calendars(self, schedule, begin, end): |
364 self.w(u'<tr>') |
364 self.w(u'<tr>') |
365 rql = self.rset.printable_rql() |
365 rql = self.cw_rset.printable_rql() |
366 for cur_month in date_range(begin, end, incmonth=1): |
366 for cur_month in date_range(begin, end, incmonth=1): |
367 umonth = u'%s %s' % (self.format_date(cur_month, '%B'), cur_month.year) |
367 umonth = u'%s %s' % (self.format_date(cur_month, '%B'), cur_month.year) |
368 url = self.build_url(rql=rql, vid=self.id, |
368 url = self.build_url(rql=rql, vid=self.__regid__, |
369 year=cur_month.year, month=cur_month.month) |
369 year=cur_month.year, month=cur_month.month) |
370 self.w(u'<th colspan="3"><a href="%s">%s</a></th>' % (xml_escape(url), |
370 self.w(u'<th colspan="3"><a href="%s">%s</a></th>' % (xml_escape(url), |
371 umonth)) |
371 umonth)) |
372 self.w(u'</tr>') |
372 self.w(u'</tr>') |
373 _ = self.req._ |
373 _ = self._cw._ |
374 for day_num in xrange(31): |
374 for day_num in xrange(31): |
375 self.w(u'<tr>') |
375 self.w(u'<tr>') |
376 for cur_month in date_range(begin, end, incmonth=1): |
376 for cur_month in date_range(begin, end, incmonth=1): |
377 if day_num >= days_in_month(cur_month): |
377 if day_num >= days_in_month(cur_month): |
378 self.w(u'%s%s%s' % (NO_CELL, NO_CELL, NO_CELL)) |
378 self.w(u'%s%s%s' % (NO_CELL, NO_CELL, NO_CELL)) |
400 def build_calendar(self, schedule, first_day): |
400 def build_calendar(self, schedule, first_day): |
401 """method responsible for building *one* HTML calendar""" |
401 """method responsible for building *one* HTML calendar""" |
402 umonth = self.format_date(first_day, '%B %Y') # localized month name |
402 umonth = self.format_date(first_day, '%B %Y') # localized month name |
403 rows = [] # each row is: (am,pm), (am,pm) ... week_title |
403 rows = [] # each row is: (am,pm), (am,pm) ... week_title |
404 current_row = [(NO_CELL, NO_CELL, NO_CELL)] * first_day.weekday() |
404 current_row = [(NO_CELL, NO_CELL, NO_CELL)] * first_day.weekday() |
405 rql = self.rset.printable_rql() |
405 rql = self.cw_rset.printable_rql() |
406 for daynum in xrange(0, days_in_month(first_day)): |
406 for daynum in xrange(0, days_in_month(first_day)): |
407 # build cells day |
407 # build cells day |
408 day = first_day + timedelta(daynum) |
408 day = first_day + timedelta(daynum) |
409 events = schedule.get(day) |
409 events = schedule.get(day) |
410 if events: |
410 if events: |
442 # tigh everything together |
442 # tigh everything together |
443 url = self.build_url(rql=rql, vid='ampmcalendarmonth', |
443 url = self.build_url(rql=rql, vid='ampmcalendarmonth', |
444 year=first_day.year, month=first_day.month) |
444 year=first_day.year, month=first_day.month) |
445 monthlink = '<a href="%s">%s</a>' % (xml_escape(url), |
445 monthlink = '<a href="%s">%s</a>' % (xml_escape(url), |
446 umonth) |
446 umonth) |
447 return CALENDAR(self.req) % (monthlink, '\n'.join(formatted_rows)) |
447 return CALENDAR(self._cw) % (monthlink, '\n'.join(formatted_rows)) |
448 |
448 |
449 |
449 |
450 |
450 |
451 class AMPMWeekCalendarView(WeekCalendarView): |
451 class AMPMWeekCalendarView(WeekCalendarView): |
452 """this view renders a 3x1 calendars' table""" |
452 """this view renders a 3x1 calendars' table""" |
453 __regid__ = 'ampmcalendarweek' |
453 __regid__ = 'ampmcalendarweek' |
454 title = _('am/pm calendar (week)') |
454 title = _('am/pm calendar (week)') |
455 |
455 |
456 def build_calendar(self, schedule, weeks): |
456 def build_calendar(self, schedule, weeks): |
457 rql = self.rset.printable_rql() |
457 rql = self.cw_rset.printable_rql() |
458 w = self.w |
458 w = self.w |
459 _ = self.req._ |
459 _ = self._cw._ |
460 for monday, sunday in weeks: |
460 for monday, sunday in weeks: |
461 umonth = self.format_date(monday, '%B %Y') |
461 umonth = self.format_date(monday, '%B %Y') |
462 url = self.build_url(rql=rql, vid='ampmcalendarmonth', |
462 url = self.build_url(rql=rql, vid='ampmcalendarmonth', |
463 year=monday.year, month=monday.month) |
463 year=monday.year, month=monday.month) |
464 monthlink = '<a href="%s">%s</a>' % (xml_escape(url), umonth) |
464 monthlink = '<a href="%s">%s</a>' % (xml_escape(url), umonth) |