changeset 217:2598210ada7a

ICS calendar for talks.
author casties
date Mon, 07 Oct 2013 19:45:23 +0200
parents 3b517b412f77
children 0babf6e0a454
files MPIWGStaff.py zpt/staff/edit_downloads.zpt zpt/staff/edit_talks.zpt zpt/staff/member_index_html.zpt zpt/staff/talks_full_html.zpt
diffstat 5 files changed, 188 insertions(+), 101 deletions(-) [+]
line wrap: on
line diff
--- a/MPIWGStaff.py	Wed Oct 02 14:40:50 2013 +0200
+++ b/MPIWGStaff.py	Mon Oct 07 19:45:23 2013 +0200
@@ -16,8 +16,10 @@
 import logging
 import email
 import re
+import datetime
 
 from Products.ZDBInterface.ZDBInterfaceFolder import ZDBInterfaceFolder
+from Products.MPIWGManager.MPIWGIcsManager import MPIWGIcsManager
 
 from SrvTxtUtils import getInt, unicodify, utf8ify, sqlName
 import MPIWGHelper
@@ -36,6 +38,12 @@
 manage_addMPIWGStaffForm = MPIWGStaff_old.manage_addMPIWGStaffForm
 manage_addMPIWGStaff = MPIWGStaff_old.manage_addMPIWGStaff
 
+# MPIWGManager properties for ICS-calendars
+# (ID_EN, ID_DE, VALUE_EN, VALUE_DE, WEIGHT, ID)
+calendar_props = [('Description', 'Beschreibung', None, None, 0, 'description'), 
+             ('Location', 'Ort', None, None, 0, 'location'),
+             ('URL', 'URL', None, None, 0, 'url'),
+             ('Time', 'Zeit', None, None, 0, 'time')]
 
     
 class MPIWGStaffFolder(ZDBInterfaceFolder):
@@ -353,7 +361,7 @@
     def getUsername(self):
         """returns the username"""
         id = re.sub('@mpiwg-berlin\.mpg\.de', '', self.content.e_mail)
-        return id
+        return str(id)
     
     getId = getUsername
     
@@ -414,7 +422,17 @@
         if sortBy == 'priority':
             query += " order by priority"
             
-        return self.folder.executeZSQL(query, [self.content.key])     
+        return self.folder.executeZSQL(query, [self.getKey()])
+    
+    
+    def getTalksCal(self):
+        """Return the talks calendar object (MPIWGIcsManager)"""
+        try:
+            cal = self.folder.get('calendars').get("%s_talks"%self.getUsername())
+            return cal
+        except:
+            return None
+    
     
     def getTeaching(self, published=True, sortBy='priority'):
         """Return the list of teaching activities"""
@@ -425,16 +443,14 @@
         if sortBy == 'priority':
             query += " ORDER BY priority"
             
-        return self.folder.executeZSQL(query,[self.content.key]) 
+        return self.folder.executeZSQL(query,[self.getKey()]) 
     
     
     def getLastUpdateCV(self):
         """getDate of Last Update"""
         try:
-            fname="%s_cv.pdf"%self.getUsername().encode('utf-8')
-            logging.debug(fname)
-            ob=self.folder._getOb("downloadableFiles")._getOb(fname)
-            return ob.bobobase_modification_time()
+            ob=self.folder.get("downloadableFiles").get("%s_cv.pdf"%self.getUsername())
+            return datetime.datetime.fromtimestamp(ob._p_mtime)
         except:
             return "No file yet!"
 
@@ -442,24 +458,21 @@
     def getLastUpdatePublications(self):
         """getDate of Last Update"""
         try:
-            ob=self.folder._getOb("downloadableFiles")._getOb("%s_publications.pdf"%self.getUsername().encode('utf-8'))
-            return ob.bobobase_modification_time()
+            ob=self.folder.get("downloadableFiles").get("%s_publications.pdf"%self.getUsername())
+            return datetime.datetime.fromtimestamp(ob._p_mtime)
         except:
             return "No file yet!"
     
     
     def downloadCV(self,REQUEST):
         """download the cv"""
-        fname="%s_cv.pdf"%self.getUsername().encode('utf-8')
-        logging.debug(fname)
-        ob=self.folder._getOb("downloadableFiles")._getOb(fname)
-      
+        ob=self.folder.get("downloadableFiles").get("%s_cv.pdf" % self.getUsername())
         REQUEST.RESPONSE.redirect(ob.absolute_url())
 
+
     def downloadPublications(self,REQUEST):
         """donwload the publication list"""
-        ob=self.folder._getOb("downloadableFiles")._getOb("%s_publications.pdf"%self.getUsername().encode('utf-8'))
-        
+        ob=self.folder.get("downloadableFiles").get("%s_publications.pdf"%self.getUsername())
         REQUEST.RESPONSE.redirect(ob.absolute_url())
 
 
@@ -526,20 +539,40 @@
           
         pt = PageTemplateFile('zpt/staff/edit_profile.zpt', globals()).__of__(self)
         return pt()
-        
     
 
     security.declareProtected('View management screens','editTalks')    
     def editTalks(self,REQUEST):
         """edit talks"""
+        pt=PageTemplateFile('zpt/staff/edit_talks.zpt', globals()).__of__(self)
+
         if REQUEST:
             argv=REQUEST.form
             
-            if argv.has_key('main_fields'): #got data to change
+            # ICS URL driven talks
+            url = argv.get('ics_url', None)
+            if url:
+                cal_id = "%s_talks"%self.getUsername()
+                # use ICS calendar
+                cal = self.getTalksCal()
+                if cal is not None:
+                    # calendar exists
+                    if cal.url == url:
+                        # same url
+                        return pt()
+                    else:
+                        # remove
+                        del self.folder.get('calendars')[cal_id]
+
+                # create new calendar
+                cal = MPIWGIcsManager(cal_id, '', url, defaultProps=calendar_props)
+                self.folder.get('calendars')[cal_id] = cal
+                
+            # manually edited talks
+            elif argv.has_key('main_fields'): #got data to change
                 self.invalidate_cache()
                 self.changeAdditionalData(argv);
                        
-        pt=PageTemplateFile('zpt/staff/edit_talks.zpt', globals()).__of__(self)
         return pt()
      
    
@@ -617,7 +650,7 @@
         
         data=REQUEST.form
        
-        ob = self.folder._getOb("downloadableFiles")
+        ob = self.folder.get("downloadableFiles")
         
         if data.get('cv_publish',None):
            
--- a/zpt/staff/edit_downloads.zpt	Wed Oct 02 14:40:50 2013 +0200
+++ b/zpt/staff/edit_downloads.zpt	Mon Oct 07 19:45:23 2013 +0200
@@ -28,7 +28,7 @@
           tal:content="here/getLastUpdateCV" />)
       </p>
       <p>
-        publish:
+        Show CV download:
         <span tal:define="name string:cv_publish; value here/content/cv_p | nothing;">
           <tal:block metal:use-macro="here/common_template/macros/yesno_input_radio"/>
         </span>
@@ -47,7 +47,7 @@
           tal:content="here/getLastUpdatePublications" />)
       </p>
       <p>
-        publish:
+        Show publication list download:
         <span tal:define="name string:publications_publish; value here/content/publications_p | nothing;">
           <tal:block metal:use-macro="here/common_template/macros/yesno_input_radio"/>
         </span>
--- a/zpt/staff/edit_talks.zpt	Wed Oct 02 14:40:50 2013 +0200
+++ b/zpt/staff/edit_talks.zpt	Mon Oct 07 19:45:23 2013 +0200
@@ -4,54 +4,70 @@
 <body>
 <tal:block metal:fill-slot="navsel" tal:define="global menusel string:talks" />
 
-<tal:block metal:fill-slot="body" tal:define="yes_no_list python:'yes\nno'">
-  <form tal:attributes="action string:$root/editTalks" method="post">
-  <input type="hidden" name="key_main" tal:attributes="value python:here.content.key">
-  <input type="hidden" name="main_fields" value="talks__title">
-  <table tal:define="talks python:here.getTalks(published=False)">
-    <tr>
-      <th>Date</th>
-      <th>Title/Place/Link</th>
-      <th>Priority</th>
-      <th>Show</th>
-    </tr>
-    <tr tal:repeat="talk talks">
-      <td valign="top">
-        <input tal:attributes="name python:'talks__date__'+str(talk.oid); value talk/date" size="10" />
-      </td>
-      <td>
-        <input tal:attributes="name python:'talks__title__'+str(talk.oid); value python:talk.title" size="80" /><br>
-        <input tal:attributes="name python:'talks__place__'+str(talk.oid); value python:talk.place" size="80" /><br>
-        <input tal:attributes="name python:'talks__link__'+str(talk.oid); value python:talk.link" size="80" />
-      </td>
-      <td valign="top">
-        <input tal:attributes="name python:'talks__priority__'+str(talk.oid); value talk/priority" size="3" />
-      </td>
-      <td valign="top" tal:define="name string:talks__published__${talk/oid}; value talk/published;">
+<tal:block metal:fill-slot="body">
+  <form tal:attributes="action string:$root/editTalks" method="post"
+    tal:define="cal here/getTalksCal">
+  
+  <tal:block tal:condition="not:cal">
+    <h3>Enter talk events manually</h3>
+    
+    <input type="hidden" name="key_main" tal:attributes="value here/content/key"/>
+    <input type="hidden" name="main_fields" value="talks__title"/>
+    <table tal:define="talks python:here.getTalks(published=False)">
+      <tr>
+        <th>Date</th>
+        <th>Title/Place/Link</th>
+        <th>Priority</th>
+        <th>Show</th>
+      </tr>
+      <tr tal:repeat="talk talks">
+        <td valign="top">
+          <input tal:attributes="name python:'talks__date__'+str(talk.oid); value talk/date" size="10" />
+        </td>
+        <td>
+          <input tal:attributes="name python:'talks__title__'+str(talk.oid); value python:talk.title" size="80" /><br>
+          <input tal:attributes="name python:'talks__place__'+str(talk.oid); value python:talk.place" size="80" /><br>
+          <input tal:attributes="name python:'talks__link__'+str(talk.oid); value python:talk.link" size="80" />
+        </td>
+        <td valign="top">
+          <input tal:attributes="name python:'talks__priority__'+str(talk.oid); value talk/priority" size="3" />
+        </td>
+        <td valign="top" tal:define="name string:talks__published__${talk/oid}; value talk/published;">
+            <span metal:use-macro="here/common_template/macros/yesno_input_radio"/>
+        </td>
+        <td>
+          <a tal:attributes="href string:$root/deleteField?table=talks&key=${talk/oid}">delete</a>
+        </td>
+      </tr>
+      <tr colspan="4">
+        <th>Add new</th>
+      </tr>
+      <tr>
+        <td valign="top"><input tal:attributes="name python:'talks__date__new'" size="10" /></td>
+        <td>
+          <input tal:attributes="name python:'talks__title__new'" size="80"/> <br/>
+          <input tal:attributes="name python:'talks__place__new'" size="80" /> <br/>
+          <input tal:attributes="name python:'talks__link__new'" size="80" />
+        </td>
+        <td>
+          <input tal:attributes="name python:'talks__priority__new'" size="3"/>
+        </td>
+        <td valign="top" tal:define="name string:talks__published__new; value string:yes;">
           <span metal:use-macro="here/common_template/macros/yesno_input_radio"/>
-      </td>
-      <td>
-        <a tal:attributes="href string:$root/deleteField?table=talks&key=${talk/oid}">delete</a>
-      </td>
-    </tr>
-    <tr colspan="4">
-      <th>Add new</th>
-    </tr>
-    <tr>
-      <td valign="top"><input tal:attributes="name python:'talks__date__new'" size="10" /></td>
-      <td>
-        <input tal:attributes="name python:'talks__title__new'" size="80"/> <br/>
-        <input tal:attributes="name python:'talks__place__new'" size="80" /> <br/>
-        <input tal:attributes="name python:'talks__link__new'" size="80" />
-      </td>
-      <td>
-        <input tal:attributes="name python:'talks__priority__new'" size="3">
-      </td>
-      <td valign="top" tal:define="name string:talks__published__new; value string:yes;">
-        <span metal:use-macro="here/common_template/macros/yesno_input_radio"/>
-      </td>
-    </tr>
-  </table>
+        </td>
+      </tr>
+    </table>
+  </tal:block>
+
+  <h3>Automatic talk events from calendar server</h3>
+  <p>
+  Calendar URL: <input name="ics_url" tal:attributes="value cal/url | nothing" size="80"/> <br/>
+  (public iCalendar ICS calendar format). 
+  </p>
+  <p>
+  Remove URL to enter talks manually.
+  </p>
+  
   <p>
     <input type="submit" value="submit"/>
   </p>
--- a/zpt/staff/member_index_html.zpt	Wed Oct 02 14:40:50 2013 +0200
+++ b/zpt/staff/member_index_html.zpt	Mon Oct 07 19:45:23 2013 +0200
@@ -71,29 +71,49 @@
         <a class="internal" tal:attributes="href string:$baseUrl/publications_full_html">More publications</a>
       </p>
     </tal:block>
-    
+
     <!-- Talks -->
-    <tal:block tal:define="talks member/getTalks" tal:condition="talks">
-
-      <h2 class="line">Talks and presentations</h2>
+    <tal:block tal:define="calendar member/getTalksCal">
+      <tal:block tal:condition="calendar">
+        <tal:block tal:define="talks python:calendar.getNext(6)">
+        
+          <h2 class="line">Talks and presentations</h2>
 
-      <table class="items shorter">
-        <tr tal:repeat="talk python:here.ZDBSlice(talks,size=5)">
-          <td width="25%">
-            <a tal:omit-tag="not:talk/link" tal:attributes="href talk/link" tal:content="talk/date" />
-          </td>
-          <td>
-            <a tal:omit-tag="not:talk/link" tal:attributes="href talk/link"> <span tal:replace="talk/place" /> &#150; <i><span
-                tal:replace="talk/title" /></i>
-            </a>
-          </td>
-        </tr>
-      </table>
-      <p tal:condition="python:len(talks)>5">
-        <a class="internal" tal:attributes="href string:$baseUrl/talks_full_html">More</a>
-      </p>
+          <table class="items shorter">
+            <tr tal:repeat="talk talks">
+              <tal:block tal:define="url python:talk.getValue('url')">
+                <td width="25%" tal:content="python:talk.getDate()" />
+                <td><a tal:omit-tag="not:url" tal:attributes="href url"> <span tal:replace="python:talk.getValue('location')" />
+                    &#150; <i><span tal:replace="python:talk.getValue('title')" /></i>
+                </a></td>
+              </tal:block>
+            </tr>
+          </table>
+          <p tal:condition="python:len(talks)>5">
+            <a class="internal" tal:attributes="href string:$baseUrl/talks_full_html">More</a>
+          </p>
+        </tal:block>
+      </tal:block>
+      <tal:block tal:condition="not:calendar">
+        <tal:block tal:define="talks member/getTalks" tal:condition="talks">
+
+          <h2 class="line">Talks and presentations</h2>
+
+          <table class="items shorter">
+            <tr tal:repeat="talk python:here.ZDBSlice(talks,size=5)">
+              <td width="25%" tal:content="talk/date" />
+              <td><a tal:omit-tag="not:talk/link" tal:attributes="href talk/link"> <span tal:replace="talk/place" /> &#150; <i><span
+                    tal:replace="talk/title" /></i>
+              </a></td>
+            </tr>
+          </table>
+          <p tal:condition="python:len(talks)>5">
+            <a class="internal" tal:attributes="href string:$baseUrl/talks_full_html">More</a>
+          </p>
+        </tal:block>
+      </tal:block>
     </tal:block>
-    
+
     <!-- Teaching activities -->
     <tal:block tal:define="teachings member/getTeaching" tal:condition="teachings">
 
--- a/zpt/staff/talks_full_html.zpt	Wed Oct 02 14:40:50 2013 +0200
+++ b/zpt/staff/talks_full_html.zpt	Mon Oct 07 19:45:23 2013 +0200
@@ -18,19 +18,37 @@
     </p>
 
     <h2>Talks and presentations</h2>
-    
-    <table class="items shorter" tal:define="talks here/getTalks">
-      <tr tal:repeat="talk talks">
-        <td>
-          <span tal:content="talk/date" />
-        </td>
-        <td>
-          <a tal:attributes="href talk/link" tal:omit-tag="not:talk/link">
-            <span tal:content="talk/place" /> &#150; <i tal:content="talk/title" />
-          </a>
-        </td>
-      </tr>
-    </table>
+
+    <tal:block tal:define="calendar here/getTalksCal">
+      <tal:block tal:condition="calendar">
+        <tal:block tal:define="talks python:calendar.getSortedItems()">
+          <table class="items shorter">
+            <tr tal:repeat="talk talks">
+              <tal:block tal:define="url python:talk.getValue('url')">
+                <td width="25%" tal:content="python:talk.getDate()" />
+                <td><a tal:omit-tag="not:url" tal:attributes="href url"> <span
+                    tal:replace="python:talk.getValue('location')" /> &#150; <i><span
+                      tal:replace="python:talk.getValue('title')" /></i>
+                </a></td>
+              </tal:block>
+            </tr>
+          </table>
+        </tal:block>
+      </tal:block>
+      
+      <tal:block tal:condition="not:calendar">
+        <tal:block tal:define="talks here/getTalks" tal:condition="talks">
+          <table class="items shorter">
+            <tr tal:repeat="talk talks">
+              <td><span tal:content="talk/date" /></td>
+              <td><a tal:attributes="href talk/link" tal:omit-tag="not:talk/link"> <span tal:content="talk/place" />
+                  &#150; <i tal:content="talk/title" />
+              </a></td>
+            </tr>
+          </table>
+        </tal:block>
+      </tal:block>
+    </tal:block>
   </div>
 </body>
 </html>
\ No newline at end of file