Mercurial > hg > MPIWGWeb
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" /> – <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')" /> + – <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" /> – <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" /> – <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')" /> – <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" /> + – <i tal:content="talk/title" /> + </a></td> + </tr> + </table> + </tal:block> + </tal:block> + </tal:block> </div> </body> </html> \ No newline at end of file