diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/TaskReportModule_exportTaskReportListAsiCalendar.xml b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/TaskReportModule_exportTaskReportListAsiCalendar.xml index 046432daae7e5cb5a4c94ab102a41d185d64154b..28cf979a19a1ac9be6148e54945645d197a53e0e 100644 --- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/TaskReportModule_exportTaskReportListAsiCalendar.xml +++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/TaskReportModule_exportTaskReportListAsiCalendar.xml @@ -70,7 +70,9 @@ <key> <string>_body</string> </key> <value> <string encoding="cdata"><![CDATA[ -# bypass CookieCrumbler\n +"""Export the current selection in task report module in iCalendar format.\n +"""\n +# XXX bypass CookieCrumbler\n if context.REQUEST.AUTHENTICATED_USER.getUserName() == \'Anonymous User\': \n if context.REQUEST.get(\'disable_cookie_login__\', 0) \\\n or context.REQUEST.get(\'no_infinite_loop\', 0) :\n @@ -79,13 +81,17 @@ if context.REQUEST.AUTHENTICATED_USER.getUserName() == \'Anonymous User\': \n \n def formatDate(date):\n d = "%04d%02d%02d" % (date.year(), date.month(), date.day())\n - if date.hour() is not None :\n - d += "T%02d%02d" % (date.hour(), date.minute())\n + if date.hour() and date.minute():\n + d += "T%02d%02d%02d" % (date.hour(), date.minute(), date.second())\n return d\n \n -def foldContent(s) : \n +def foldContent(s):\n """ fold a content line (cf RFC 2445) """\n - # TODO \n + s = s.replace(\',\', \'\\\\,\')\n + s = s.replace(\'/\', \'\\\\/\')\n + s = s.replace(\'"\', \'\\\\"\')\n + s = s.replace(\'\\n\', \'\\\\n\')\n + # FIXME: really fold, for now we return a big line, it works for most clients\n return s\n \n def printTask(task) :\n @@ -98,8 +104,8 @@ SUMMARY:%(title)s\n STATUS:%(status)s\n PRIORITY:%(priority)s""" % ( {\n \'creation_date\': formatDate(task.getCreationDate()),\n - \'uid\': task.getUid(),\n - \'title\': task.getTitle(),\n + \'uid\': task.getPath(),\n + \'title\': foldContent(task.getTitle()),\n \'modification_date\': formatDate(task.getModificationDate()),\n \'status\': task.getSimulationState() == \'delivered\' and \'COMPLETED\' or \'NEEDS_ACTION\',\n \'priority\': task.getProperty(\'int_index\', 3),\n @@ -107,28 +113,30 @@ PRIORITY:%(priority)s""" % ( {\n if task.hasComment():\n print "DESCRIPTION:" + foldContent(task.getComment())\n if task.hasStartDate():\n - print "DTSTART;VALUE=DATE::" + formatDate(task.getStartDate())\n + print "DTSTART;VALUE=DATE:" + formatDate(task.getStartDate())\n if task.hasStopDate():\n - print "DUE:" + formatDate(task.getStopDate())\n + print "DUE;VALUE=DATE:" + formatDate(task.getStopDate())\n organizer = task.getDestinationValue(portal_type=\'Person\')\n if organizer:\n print "ORGANIZER;CN=%s:MAILTO:%s" % (organizer.getTitle(), organizer.getDefaultEmailText())\n print "X-ORGANIZER:MAILTO:%s" % (organizer.getDefaultEmailText())\n for attendee in task.getSourceValueList( portal_type = \'Person\') :\n print "ATTENDEE;CN=%s:MAILTO:%s" % (attendee.getTitle(), attendee.getDefaultEmailText())\n - \n + print "ATTACH;FMTTYPE=text/html:%s/%s/view" % (context.ERP5Site_getAbsoluteUrl(), task.getRelativeUrl())\n +\n print "END:VTODO"\n return printed\n \n print """BEGIN:VCALENDAR\n -PRODID:-//ERP5//NONSGML Task Module Report//EN \n -VERSION:1.0"""\n +PRODID:-//ERP5//NONSGML Task Report Module//EN \n +VERSION:2.0"""\n obj_list = context.getPortalObject().portal_selections.callSelectionFor("task_report_selection")\n for obj in obj_list : \n print printTask(obj.getObject())\n print "END:VCALENDAR"\n \n context.REQUEST.RESPONSE.setHeader(\'Content-Type\', \'text/calendar\')\n +context.REQUEST.RESPONSE.setHeader(\'Content-disposition\', \'attachment;; filename=ERP5.ics\')\n return printed\n diff --git a/bt5/erp5_project/bt/revision b/bt5/erp5_project/bt/revision index a09fd8ad47268facfe50ea952d980dc5627594a2..afbe847262c0a530b87f33d06d3526a72dd1d9a4 100644 --- a/bt5/erp5_project/bt/revision +++ b/bt5/erp5_project/bt/revision @@ -1 +1 @@ -124 \ No newline at end of file +126 \ No newline at end of file