6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
7 """ |
7 """ |
8 |
8 |
9 from datetime import date, time, timedelta |
9 from datetime import date, time, timedelta |
10 |
10 |
11 from logilab.mtconverter import html_escape |
11 from logilab.mtconverter import xml_escape |
12 |
12 |
13 from cubicweb.interfaces import ICalendarViews |
13 from cubicweb.interfaces import ICalendarViews |
14 from cubicweb.utils import ONEDAY, ONEWEEK, date_range, first_day, last_day, previous_month, next_month, days_in_month |
14 from cubicweb.utils import ONEDAY, ONEWEEK, date_range, first_day, last_day, previous_month, next_month, days_in_month |
15 from cubicweb.selectors import implements |
15 from cubicweb.selectors import implements |
16 from cubicweb.view import EntityView |
16 from cubicweb.view import EntityView |
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.rset.printable_rql() |
48 return self.NAV_HEADER % ( |
48 return self.NAV_HEADER % ( |
49 html_escape(self.build_url(rql=rql, vid=self.id, year=prev2.year, |
49 xml_escape(self.build_url(rql=rql, vid=self.id, year=prev2.year, |
50 month=prev2.month)), |
50 month=prev2.month)), |
51 html_escape(self.build_url(rql=rql, vid=self.id, year=prev1.year, |
51 xml_escape(self.build_url(rql=rql, vid=self.id, year=prev1.year, |
52 month=prev1.month)), |
52 month=prev1.month)), |
53 html_escape(self.build_url(rql=rql, vid=self.id, year=next1.year, |
53 xml_escape(self.build_url(rql=rql, vid=self.id, year=next1.year, |
54 month=next1.month)), |
54 month=next1.month)), |
55 html_escape(self.build_url(rql=rql, vid=self.id, year=next2.year, |
55 xml_escape(self.build_url(rql=rql, vid=self.id, 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 |
89 rql = self.rset.printable_rql() |
89 rql = self.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>' % (html_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.req) % (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 |
201 rql = self.rset.printable_rql() |
201 rql = self.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.id, |
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>' % (html_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.req._ |
210 for day_num in xrange(31): |
210 for day_num in xrange(31): |
211 self.w(u'<tr>') |
211 self.w(u'<tr>') |
270 _ = self.req._ |
270 _ = self.req._ |
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>' % (html_escape(url), umonth) |
275 monthlink = '<a href="%s">%s</a>' % (xml_escape(url), umonth) |
276 self.w(u'<tr><th colspan="3">%s %s (%s)</th></tr>' \ |
276 self.w(u'<tr><th colspan="3">%s %s (%s)</th></tr>' \ |
277 % (_('week'), monday.isocalendar()[1], monthlink)) |
277 % (_('week'), monday.isocalendar()[1], monthlink)) |
278 for day in date_range(monday, sunday): |
278 for day in date_range(monday, sunday): |
279 self.w(u'<tr>') |
279 self.w(u'<tr>') |
280 self.w(u'<td>%s</td>' % _(WEEKDAYS[day.weekday()])) |
280 self.w(u'<td>%s</td>' % _(WEEKDAYS[day.weekday()])) |
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.rset.printable_rql() |
297 return self.NAV_HEADER % ( |
297 return self.NAV_HEADER % ( |
298 html_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.id, year=prev2.year, week=prev2.isocalendar()[1])), |
299 html_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.id, year=prev1.year, week=prev1.isocalendar()[1])), |
300 html_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.id, year=next1.year, week=next1.isocalendar()[1])), |
301 html_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.id, year=next2.year, week=next2.isocalendar()[1]))) |
302 |
302 |
303 |
303 |
304 |
304 |
305 class AMPMYearCalendarView(YearCalendarView): |
305 class AMPMYearCalendarView(YearCalendarView): |
306 id = 'ampmcalendaryear' |
306 id = 'ampmcalendaryear' |
324 AMPM_EMPTY % ("pmCell", "pm"))) |
324 AMPM_EMPTY % ("pmCell", "pm"))) |
325 # store & reset current row on Sundays |
325 # store & reset current row on Sundays |
326 if day.weekday() == 6: |
326 if day.weekday() == 6: |
327 url = self.build_url(rql=rql, vid='ampmcalendarweek', |
327 url = self.build_url(rql=rql, vid='ampmcalendarweek', |
328 year=day.year, week=day.isocalendar()[1]) |
328 year=day.year, week=day.isocalendar()[1]) |
329 weeklink = '<a href="%s">%s</a>' % (html_escape(url), |
329 weeklink = '<a href="%s">%s</a>' % (xml_escape(url), |
330 day.isocalendar()[1]) |
330 day.isocalendar()[1]) |
331 current_row.append(WEEKNUM_CELL % weeklink) |
331 current_row.append(WEEKNUM_CELL % weeklink) |
332 rows.append(current_row) |
332 rows.append(current_row) |
333 current_row = [] |
333 current_row = [] |
334 current_row.extend([(NO_CELL, NO_CELL, NO_CELL)] * (6-day.weekday())) |
334 current_row.extend([(NO_CELL, NO_CELL, NO_CELL)] * (6-day.weekday())) |
335 url = self.build_url(rql=rql, vid='ampmcalendarweek', |
335 url = self.build_url(rql=rql, vid='ampmcalendarweek', |
336 year=day.year, week=day.isocalendar()[1]) |
336 year=day.year, week=day.isocalendar()[1]) |
337 weeklink = '<a href="%s">%s</a>' % (html_escape(url), day.isocalendar()[1]) |
337 weeklink = '<a href="%s">%s</a>' % (xml_escape(url), day.isocalendar()[1]) |
338 current_row.append(WEEKNUM_CELL % weeklink) |
338 current_row.append(WEEKNUM_CELL % weeklink) |
339 rows.append(current_row) |
339 rows.append(current_row) |
340 # build two rows for each week: am & pm |
340 # build two rows for each week: am & pm |
341 formatted_rows = [] |
341 formatted_rows = [] |
342 for row in rows: |
342 for row in rows: |
348 formatted_rows.append('<tr class="amRow"><td> </td>%s</tr>'% '\n'.join(am_row)) |
348 formatted_rows.append('<tr class="amRow"><td> </td>%s</tr>'% '\n'.join(am_row)) |
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>' % (html_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.req) % (monthlink, '\n'.join(formatted_rows)) |
355 |
355 |
356 |
356 |
357 |
357 |
358 class AMPMSemesterCalendarView(SemesterCalendarView): |
358 class AMPMSemesterCalendarView(SemesterCalendarView): |
365 rql = self.rset.printable_rql() |
365 rql = self.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.id, |
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>' % (html_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.req._ |
374 for day_num in xrange(31): |
374 for day_num in xrange(31): |
375 self.w(u'<tr>') |
375 self.w(u'<tr>') |
415 AMPM_EMPTY % ("pmCell", "pm"))) |
415 AMPM_EMPTY % ("pmCell", "pm"))) |
416 # store & reset current row on Sundays |
416 # store & reset current row on Sundays |
417 if day.weekday() == 6: |
417 if day.weekday() == 6: |
418 url = self.build_url(rql=rql, vid='ampmcalendarweek', |
418 url = self.build_url(rql=rql, vid='ampmcalendarweek', |
419 year=day.year, week=day.isocalendar()[1]) |
419 year=day.year, week=day.isocalendar()[1]) |
420 weeklink = '<a href="%s">%s</a>' % (html_escape(url), |
420 weeklink = '<a href="%s">%s</a>' % (xml_escape(url), |
421 day.isocalendar()[1]) |
421 day.isocalendar()[1]) |
422 current_row.append(WEEKNUM_CELL % weeklink) |
422 current_row.append(WEEKNUM_CELL % weeklink) |
423 rows.append(current_row) |
423 rows.append(current_row) |
424 current_row = [] |
424 current_row = [] |
425 current_row.extend([(NO_CELL, NO_CELL, NO_CELL)] * (6-day.weekday())) |
425 current_row.extend([(NO_CELL, NO_CELL, NO_CELL)] * (6-day.weekday())) |
426 url = self.build_url(rql=rql, vid='ampmcalendarweek', |
426 url = self.build_url(rql=rql, vid='ampmcalendarweek', |
427 year=day.year, week=day.isocalendar()[1]) |
427 year=day.year, week=day.isocalendar()[1]) |
428 weeklink = '<a href="%s">%s</a>' % (html_escape(url), |
428 weeklink = '<a href="%s">%s</a>' % (xml_escape(url), |
429 day.isocalendar()[1]) |
429 day.isocalendar()[1]) |
430 current_row.append(WEEKNUM_CELL % weeklink) |
430 current_row.append(WEEKNUM_CELL % weeklink) |
431 rows.append(current_row) |
431 rows.append(current_row) |
432 # build two rows for each week: am & pm |
432 # build two rows for each week: am & pm |
433 formatted_rows = [] |
433 formatted_rows = [] |
440 formatted_rows.append('<tr class="amRow"><td> </td>%s</tr>'% '\n'.join(am_row)) |
440 formatted_rows.append('<tr class="amRow"><td> </td>%s</tr>'% '\n'.join(am_row)) |
441 formatted_rows.append('<tr class="pmRow"><td> </td>%s</tr>'% '\n'.join(pm_row)) |
441 formatted_rows.append('<tr class="pmRow"><td> </td>%s</tr>'% '\n'.join(pm_row)) |
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>' % (html_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.req) % (monthlink, '\n'.join(formatted_rows)) |
448 |
448 |
449 |
449 |
450 |
450 |
459 _ = self.req._ |
459 _ = self.req._ |
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>' % (html_escape(url), umonth) |
464 monthlink = '<a href="%s">%s</a>' % (xml_escape(url), umonth) |
465 w(u'<tr>%s</tr>' % ( |
465 w(u'<tr>%s</tr>' % ( |
466 WEEK_TITLE % (_('week'), monday.isocalendar()[1], monthlink))) |
466 WEEK_TITLE % (_('week'), monday.isocalendar()[1], monthlink))) |
467 w(u'<tr><th>%s</th><th> </th></tr>'% _(u'Date')) |
467 w(u'<tr><th>%s</th><th> </th></tr>'% _(u'Date')) |
468 for day in date_range(monday, sunday): |
468 for day in date_range(monday, sunday): |
469 events = schedule.get(day) |
469 events = schedule.get(day) |