51 lines
2.1 KiB
Python
51 lines
2.1 KiB
Python
import datetime
|
|
import urllib2
|
|
import vobject
|
|
|
|
from Products.CMFCore.WorkflowCore import WorkflowException
|
|
from Products.CMFCore.utils import getToolByName
|
|
from Products.Five.browser import BrowserView
|
|
|
|
class IcalImport(BrowserView):
|
|
def __call__(self):
|
|
print 'ical import into', self.context
|
|
self.plone_utils = getToolByName(self.context, 'plone_utils')
|
|
self.portal_workflow = getToolByName(self.context, 'portal_workflow')
|
|
url = self.request.form.get('url')
|
|
content = urllib2.urlopen(url).read()
|
|
parsed_cal = vobject.readOne(content)
|
|
for vevent in parsed_cal.vevent_list:
|
|
title = vevent.summary.value
|
|
date_start = vevent.dtstart.value
|
|
if isinstance(date_start, datetime.date):
|
|
date_start = datetime.datetime.fromordinal(date_start.toordinal())
|
|
try:
|
|
date_end = vevent.dtend.value
|
|
if isinstance(date_end, datetime.date):
|
|
date_end = datetime.datetime.fromordinal(date_end.toordinal())
|
|
except AttributeError:
|
|
date_end = None
|
|
event_id = self.plone_utils.normalizeString(
|
|
'%04d-%02d-%02d-%s' % (date_start.year,
|
|
date_start.month,
|
|
date_start.day,
|
|
title))
|
|
if not hasattr(self.context, event_id):
|
|
self.context.invokeFactory('tabellio.agenda.event', event_id, title=title)
|
|
event = getattr(self.context, event_id)
|
|
event.title = title
|
|
event.start = date_start
|
|
event.end = date_end
|
|
try:
|
|
event.description = vevent.description.value
|
|
except AttributeError:
|
|
pass
|
|
try:
|
|
event.location = vevent.location.value
|
|
except AttributeError:
|
|
pass
|
|
try:
|
|
self.portal_workflow.doActionFor(getattr(self.context, event_id), 'publish')
|
|
except WorkflowException:
|
|
pass
|