39 MONTHNAMES = ( _('january'), _('february'), _('march'), _('april'), _('may'), |
39 MONTHNAMES = ( _('january'), _('february'), _('march'), _('april'), _('may'), |
40 _('june'), _('july'), _('august'), _('september'), _('october'), |
40 _('june'), _('july'), _('august'), _('september'), _('october'), |
41 _('november'), _('december') |
41 _('november'), _('december') |
42 ) |
42 ) |
43 |
43 |
|
44 ICAL_EVENT = "event" |
|
45 ICAL_TODO = "todo" |
44 |
46 |
45 class ICalendarableAdapter(EntityAdapter): |
47 class ICalendarableAdapter(EntityAdapter): |
46 __needs_bw_compat__ = True |
48 __needs_bw_compat__ = True |
47 __regid__ = 'ICalendarable' |
49 __regid__ = 'ICalendarable' |
48 __abstract__ = True |
50 __abstract__ = True |
49 |
51 |
|
52 # component type |
|
53 component = ICAL_EVENT |
|
54 |
50 @property |
55 @property |
51 def start(self): |
56 def start(self): |
52 """return start date""" |
57 """return start date""" |
53 raise NotImplementedError |
58 raise NotImplementedError |
54 |
59 |
62 |
67 |
63 try: |
68 try: |
64 from vobject import iCalendar |
69 from vobject import iCalendar |
65 |
70 |
66 class iCalView(EntityView): |
71 class iCalView(EntityView): |
67 """A calendar view that generates a iCalendar file (RFC 2445) |
72 """A calendar view that generates a iCalendar file (RFC 5545) |
68 |
73 |
69 Does apply to ICalendarable compatible entities |
74 Does apply to ICalendarable compatible entities |
70 """ |
75 """ |
71 __select__ = adaptable('ICalendarable') |
76 __select__ = adaptable('ICalendarable') |
72 paginable = False |
77 paginable = False |
77 |
82 |
78 def call(self): |
83 def call(self): |
79 ical = iCalendar() |
84 ical = iCalendar() |
80 for i in range(len(self.cw_rset.rows)): |
85 for i in range(len(self.cw_rset.rows)): |
81 task = self.cw_rset.complete_entity(i, 0) |
86 task = self.cw_rset.complete_entity(i, 0) |
82 event = ical.add('vevent') |
87 ical_task = task.cw_adapt_to('ICalendarable') |
83 event.add('summary').value = task.dc_title() |
88 if ical_task.component == ICAL_TODO: |
84 event.add('description').value = task.dc_description() |
89 elt = ical.add('vtodo') |
85 icalendarable = task.cw_adapt_to('ICalendarable') |
90 stop_kw = "due" |
86 if icalendarable.start: |
91 else: |
87 event.add('dtstart').value = icalendarable.start |
92 elt = ical.add('vevent') |
88 if icalendarable.stop: |
93 stop_kw = "dtend" |
89 event.add('dtend').value = icalendarable.stop |
94 elt.add('uid').value = task.absolute_url() # unique stable id |
|
95 elt.add('url').value = task.absolute_url() |
|
96 elt.add('summary').value = task.dc_title() |
|
97 elt.add('description').value = task.dc_description() |
|
98 if ical_task.start: |
|
99 elt.add('dtstart').value = ical_task.start |
|
100 if ical_task.stop: |
|
101 elt.add(stop_kw).value = ical_task.stop |
90 |
102 |
91 buff = ical.serialize() |
103 buff = ical.serialize() |
92 if not isinstance(buff, unicode): |
104 if not isinstance(buff, unicode): |
93 buff = unicode(buff, self._cw.encoding) |
105 buff = unicode(buff, self._cw.encoding) |
94 self.w(buff) |
106 self.w(buff) |