[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">&nbsp;</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