def marshall_event_to_vevent(instance): wf = getToolByName(instance, 'portal_workflow') dtstamp = utc_strftime(datetime.utcnow(), "%Y%m%dT%H%M%SZ") uid_hash = abs(hash(instance)) state = wf.getInfoFor(instance, 'review_state') status = re_status_mapping.get(state, 'TENTATIVE') event = VEvent() event.add('uid', generateUID(instance)) event.add('summary', instance.Title(), encode=False) event.add('description', instance.Description(), encode=False) if hasattr(aq_base(instance), 'getLocation'): location = instance.getLocation() if location: event.add('location', location, encode=False) if hasattr(aq_base(instance), 'Subject'): subject = instance.Subject() if subject: for category in subject: event.add('categories', category, encode=False) if hasattr(aq_base(instance), 'event_url'): url = instance.event_url if callable(url): # Ugh, it's callable in ATContentTypes. url = url() if url: event.add('url', url) event['url'].params['value'] = 'URI' if hasattr(aq_base(instance), 'getAttendees'): for att in instance.getAttendees(): name, email = parseaddr(att) if not name: name = att email = '' if email: email = 'mailto:%s' % email else: email = 'invalid:nomail' address = vCalAddress(email) address.params['cn'] = name event.add('attendee', address, encode=False) if (hasattr(aq_base(instance), 'duration') and instance.duration == date.resolution): # All day event. dtstart = vDate.from_ical(utc_strftime(instance.start_date, '%Y%m%d')) event.add('dtstart', dtstart) dtend = vDate.from_ical(utc_strftime(instance.end_date, '%Y%m%d')) event.add('dtend', dtend) else: # Normal event dtstart = vDatetime.from_ical( utc_strftime(instance.start_date, '%Y%m%dT%H%M%SZ')) event.add('dtstart', dtstart) dtend = vDatetime.from_ical( utc_strftime(instance.end_date, '%Y%m%dT%H%M%SZ')) event.add('dtend', dtend) dtstamp = vDatetime.from_ical(dtstamp) event.add('dtstamp', dtstamp) #event.add('status', status) return event
def import_feed(self, feed): from molly.apps.feeds.models import Item, vCard calendar = Calendar.from_string(urllib2.urlopen(feed.rss_url).read()) items = set() for component in calendar.walk(): if component.name == 'VEVENT': item, created = Item.objects.get_or_create(feed=feed, guid=str(component.get('UID'))) # Do not create the event if one the property is not correct, # first tries to parse DT as datetime then as date, if it still # fails, then ignore try: try: item.dt_start = vDatetime.from_ical(str( component.get('DTSTART'))) except ValueError, ve: item.dt_start = vDate.from_ical(str( component.get('DTSTART'))) if component.get('DTEND'): try: item.dt_end = vDatetime.from_ical(str( component.get('DTEND'))) except ValueError, ve: item.dt_end = vDate.from_ical(str( component.get('DTEND'))) item.title = vText.from_ical(str( component.get('SUMMARY')).strip()) if component.get('URL'): item.link = str(component.get('URL')) if component.get('DESCRIPTION'): item.description = sanitise_html(vText.from_ical(str( component.get('DESCRIPTION')))) if str(component.get('LOCATION')) != '': location, created = vCard.objects.get_or_create( name=vText.from_ical(str( component.get('LOCATION')).strip())) # in the future, we could imagine to (try to) geocode # the location to get a point field... location.save() item.venue = location try: item.last_modified = vDatetime.from_ical(str( component.get('LAST-MODIFIED'))) except Exception, e: item.last_modified = datetime.now() item.save() items.add(item)
def marshall_event_to_vevent(instance): wf = getToolByName(instance, 'portal_workflow') dtstamp = utc_strftime(datetime.utcnow(), "%Y%m%dT%H%M%SZ") uid_hash = abs(hash(instance)) state = wf.getInfoFor(instance, 'review_state') status = re_status_mapping.get(state, 'TENTATIVE') event = VEvent() event.add('uid', generateUID(instance)) event.add('summary', instance.Title(), encode=False) event.add('description', instance.Description(), encode=False) if hasattr(aq_base(instance), 'getLocation'): location = instance.getLocation() if location: event.add('location', location, encode=False) if hasattr(aq_base(instance), 'Subject'): subject = instance.Subject() if subject: for category in subject: event.add('categories', category, encode=False) if hasattr(aq_base(instance), 'event_url'): url = instance.event_url if callable(url): # Ugh, it's callable in ATContentTypes. url = url() if url: event.add('url', url) event['url'].params['value'] = 'URI' if hasattr(aq_base(instance), 'getAttendees'): for att in instance.getAttendees(): name, email = parseaddr(att) if not name: name = att email = '' if email: email = 'mailto:%s' % email else: email = 'invalid:nomail' address = vCalAddress(email) address.params['cn'] = name event.add('attendee', address, encode=False) if (hasattr(aq_base(instance), 'duration') and instance.duration == date.resolution): # All day event. dtstart = vDate.from_ical( utc_strftime(instance.start_date, '%Y%m%d')) event.add('dtstart', dtstart) dtend = vDate.from_ical( utc_strftime(instance.end_date, '%Y%m%d')) event.add('dtend', dtend) else: # Normal event dtstart = vDatetime.from_ical( utc_strftime(instance.start_date, '%Y%m%dT%H%M%SZ')) event.add('dtstart', dtstart) dtend = vDatetime.from_ical( utc_strftime(instance.end_date, '%Y%m%dT%H%M%SZ')) event.add('dtend', dtend) dtstamp = vDatetime.from_ical(dtstamp) event.add('dtstamp', dtstamp) #event.add('status', status) return event