[Checkins] SVN: Products.CMFCalendar/trunk/Products/CMFCalendar/ - Event: Added basic iCal and vCal views
Jens Vagelpohl
jens at dataflake.org
Sat Sep 13 12:50:11 EDT 2008
Log message for revision 91119:
- Event: Added basic iCal and vCal views
(https://bugs.launchpad.net/zope-cmf/+bug/161714)
Changed:
U Products.CMFCalendar/trunk/Products/CMFCalendar/CHANGES.txt
U Products.CMFCalendar/trunk/Products/CMFCalendar/browser/configure.zcml
U Products.CMFCalendar/trunk/Products/CMFCalendar/browser/event.py
U Products.CMFCalendar/trunk/Products/CMFCalendar/browser/event.txt
A Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_ical.pt
A Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_vcal.pt
A Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_view.pt
U Products.CMFCalendar/trunk/Products/CMFCalendar/skins/zpt_calendar/event_view_template.pt
-=-
Modified: Products.CMFCalendar/trunk/Products/CMFCalendar/CHANGES.txt
===================================================================
--- Products.CMFCalendar/trunk/Products/CMFCalendar/CHANGES.txt 2008-09-13 16:12:38 UTC (rev 91118)
+++ Products.CMFCalendar/trunk/Products/CMFCalendar/CHANGES.txt 2008-09-13 16:50:11 UTC (rev 91119)
@@ -4,6 +4,9 @@
2.2.0 (unreleased)
------------------
+- Event: Added basic iCal and vCal views
+ (https://bugs.launchpad.net/zope-cmf/+bug/161714)
+
- ZMI: Prevent users from creating content through the ZMI by hiding the
entry for "CMFCalendar Content".
Modified: Products.CMFCalendar/trunk/Products/CMFCalendar/browser/configure.zcml
===================================================================
--- Products.CMFCalendar/trunk/Products/CMFCalendar/browser/configure.zcml 2008-09-13 16:12:38 UTC (rev 91118)
+++ Products.CMFCalendar/trunk/Products/CMFCalendar/browser/configure.zcml 2008-09-13 16:50:11 UTC (rev 91119)
@@ -51,6 +51,22 @@
permission="zope2.View"
/>
+ <browser:page
+ for="Products.CMFCalendar.interfaces.IEvent"
+ layer="Products.CMFDefault.interfaces.ICMFDefaultSkin"
+ name="view.ics"
+ class=".event.EventiCalView"
+ permission="zope2.View"
+ />
+
+ <browser:page
+ for="Products.CMFCalendar.interfaces.IEvent"
+ layer="Products.CMFDefault.interfaces.ICMFDefaultSkin"
+ name="view.vcs"
+ class=".event.EventvCalView"
+ permission="zope2.View"
+ />
+
<browser:resource
name="event_icon.gif"
image="../skins/zpt_calendar/event_icon.gif"
Modified: Products.CMFCalendar/trunk/Products/CMFCalendar/browser/event.py
===================================================================
--- Products.CMFCalendar/trunk/Products/CMFCalendar/browser/event.py 2008-09-13 16:12:38 UTC (rev 91118)
+++ Products.CMFCalendar/trunk/Products/CMFCalendar/browser/event.py 2008-09-13 16:50:11 UTC (rev 91119)
@@ -40,6 +40,9 @@
from Products.CMFCalendar.interfaces import IMutableEvent
from Products.CMFCalendar.utils import Message as _
+from zope.app.pagetemplate import ViewPageTemplateFile
+from Products.CMFDefault.browser.utils import decode, ViewBase
+import time
class EventTypeVocabulary(object):
@@ -161,6 +164,8 @@
"""View for IEvent.
"""
+ template = ViewPageTemplateFile('templates/event_view.pt')
+
form_fields = form.FormFields(IEventSchema)
@@ -172,3 +177,52 @@
form_fields = form.FormFields(IEventSchema)
form_fields['start_date'].custom_widget = DatetimeI18nWidget
form_fields['stop_date'].custom_widget = DatetimeI18nWidget
+
+class EventiCalView(ViewBase):
+
+ """iCal view"""
+
+ form_fields = form.FormFields(IEventSchema)
+ icalformat = "%Y%m%dT%H%M%SZ" # Zulu time enforces UTC
+
+ def mk_iCal(self, dt):
+ """Convert a datetime type to its iCal using it's representation
+ Unfortunately not available directly. Depends upon the underlying OS timezone"""
+ dt = time.gmtime(dt.timeTime())
+ return time.strftime(self.icalformat, dt)
+
+ @decode
+ def location(self):
+ return self.context.location
+
+ @decode
+ def contact_name(self):
+ return self.context.contact_name
+
+ def __call__(self):
+ self.creation_date = self.mk_iCal(self.context.creation_date)
+ self.timestamp = time.strftime(self.icalformat, time.gmtime())
+ self.tz = self.context.start().timezone()
+ self.start = self.mk_iCal(self.context.start())
+ self.end = self.mk_iCal(self.context.end())
+ self.UID = "%s-%s" %(self.context.Title(), self.creation_date)
+ return self._write_body()
+
+ def _write_body(self):
+ response = self.request.response
+ body = ViewPageTemplateFile('templates/event_ical.pt')(self)
+ response.setHeader('Content-Type', 'text/iCal')
+ response.setHeader('Content-Disposition', 'filename=cmf.ics')
+ response.write(body.encode("UTF-8"))
+
+class EventvCalView(EventiCalView):
+
+ """vCal view"""
+
+ def _write_body(self):
+ response = self.request.response
+ body = ViewPageTemplateFile('templates/event_vcal.pt')(self)
+ response.setHeader('Content-Type', 'text/vCal')
+ response.setHeader('Content-Disposition', 'filename=cmf.vcs')
+ response.write(body.encode("UTF-8"))
+
Modified: Products.CMFCalendar/trunk/Products/CMFCalendar/browser/event.txt
===================================================================
--- Products.CMFCalendar/trunk/Products/CMFCalendar/browser/event.txt 2008-09-13 16:12:38 UTC (rev 91118)
+++ Products.CMFCalendar/trunk/Products/CMFCalendar/browser/event.txt 2008-09-13 16:50:11 UTC (rev 91119)
@@ -40,3 +40,19 @@
>>> browser.open('http://localhost/site/myEvent/@@view.html')
>>> '2006 11 6 12:00:00 ' in browser.contents
True
+
+Validate iCal
+ >>> browser.open('http://localhost/site/myEvent/@@view.ics')
+ >>> print browser.headers
+ Status: 200 OK
+ Content-Disposition: filename=cmf.ics
+ Content-Length: 0
+ Content-Type: text/iCal
+
+Validate vCal
+ >>> browser.open('http://localhost/site/myEvent/@@view.vcs')
+ >>> print browser.headers
+ Status: 200 OK
+ Content-Disposition: filename=cmf.vcs
+ Content-Length: 0
+ Content-Type: text/vCal
Added: Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_ical.pt
===================================================================
--- Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_ical.pt (rev 0)
+++ Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_ical.pt 2008-09-13 16:50:11 UTC (rev 91119)
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+X-WR-CALNAME:<tal:content tal:content="context/absolute_url" />
+PRODID:-//Zope CMF 2.1//iCal 2.0//EN
+X-WR-TIMEZONE:UTC
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+BEGIN:VEVENT
+CREATED:<tal:content tal:content="view/creation_date | nothing" />
+DTSTAMP:<tal:content tal:content="view/timestamp" />
+UID:<tal:content tal:content="view/UID" />
+DTSTART:<tal:content tal:content="view/start" />
+DTEND:<tal:content tal:content="view/end" />
+SUMMARY:<tal:content tal:content="view/title" />
+LOCATION:<tal:content tal:content="view/location" />
+DESCRIPTION:<tal:content tal:content="view/description" />
+<tal:condition tal:condition="exists: view/contact_name">
+ATTENDEE;CN="<tal:content tal:content='view/contact_name' />":MAILTO:<tal:content tal:content="context/contact_email | nothing" />
+</tal:condition>
+URL:<tal:content tal:content="context/absolute_url | nothing" />
+<tal:condition tal:condition="exists: view/alarm">
+BEGIN:VALARM
+DESCRIPTION:<tal:content tal:content="view/title" />
+ACTION:DISPLAY
+TRIGGER;RELATED=START:<tal:content tal:content="context/alarm" />
+END:VALARM
+</tal:condition>
+END:VEVENT
+END:VCALENDAR
Added: Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_vcal.pt
===================================================================
--- Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_vcal.pt (rev 0)
+++ Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_vcal.pt 2008-09-13 16:50:11 UTC (rev 91119)
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+VERSION:1.0
+X-WR-CALNAME:<tal:content tal:content="context/absolute_url" />
+PRODID:-//Zope CMF 2.1//vCal 1.0//EN
+TZ:<tal:content tal:content="view/tz | nothing" />
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+BEGIN:VEVENT
+CREATED:<tal:content tal:content="view/creation_date" />
+DTSTAMP:<tal:content tal:content="view/timestamp" />
+UID:<tal:content tal:content="view/UID" />
+DTSTART:<tal:content tal:content="view/start" />
+DTEND:<tal:content tal:content="view/end" />
+SUMMARY:<tal:content tal:content="view/title" />
+DESCRIPTION:<tal:content tal:content="view/description" />
+LOCATION:<tal:content tal:content="view/location" />
+<tal:condition tal:condition="exists: view/alarm">
+DALARM:<tal:content tal:content="view/dalarm" />
+</tal:condition>
+END:VEVENT
+END:VCALENDAR
Added: Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_view.pt
===================================================================
--- Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_view.pt (rev 0)
+++ Products.CMFCalendar/trunk/Products/CMFCalendar/browser/templates/event_view.pt 2008-09-13 16:50:11 UTC (rev 91119)
@@ -0,0 +1,29 @@
+<html metal:use-macro="context/@@standard_macros/page">
+<body>
+
+<metal:slot metal:fill-slot="body" i18n:domain="cmf_default">
+<h1 tal:content="view/label">TYPE</h1>
+
+<div class="form">
+<div class="widgets">
+ <tal:loop tal:repeat="widget view/widgets"
+><div class="widget" tal:define="split widget/split|nothing"
+ tal:attributes="class python: split and 'widget split' or 'widget'">
+ <label tal:content="widget/label">FIELD TITLE</label>
+ <div class="field">
+ <div class="data"><tal:span tal:replace="structure widget" /></div></div>
+ </div></tal:loop>
+</div>
+<div>
+Add to calendar:
+<a href="absolute_url"
+tal:attributes="href string:${context/absolute_url}/@@view.ics">iCal</a>
+<a href="absolute_url"
+tal:attributes="href string:${context/absolute_url}/@@view.vcs">vCal</a>
+</div>
+<div class="clear" />
+</div>
+</metal:slot>
+
+</body>
+</html>
Modified: Products.CMFCalendar/trunk/Products/CMFCalendar/skins/zpt_calendar/event_view_template.pt
===================================================================
--- Products.CMFCalendar/trunk/Products/CMFCalendar/skins/zpt_calendar/event_view_template.pt 2008-09-13 16:12:38 UTC (rev 91118)
+++ Products.CMFCalendar/trunk/Products/CMFCalendar/skins/zpt_calendar/event_view_template.pt 2008-09-13 16:50:11 UTC (rev 91119)
@@ -66,6 +66,11 @@
<td colspan="4"> </td>
</tr>
</table>
+Add to calendar
+<a href="absolute_url"
+tal:attributes="href string:${context/absolute_url}/event_ics_view">iCal</a>
+<a href="absolute_url"
+tal:attributes="href string:${context/absolute_url}/event_ics_view?format=vcal">vCal</a>
</metal:slot>
</body>
More information about the Checkins
mailing list