def addToCal(url, date_from, date_end, summary): """ Add entry in calendar to period date_from, date_end """ vcal_entry = """BEGIN:VCALENDAR VERSION:2.0 PRODID:Pyvac Calendar BEGIN:VEVENT SUMMARY:%s DTSTART;VALUE=DATE:%s DTEND;VALUE=DATE:%s END:VEVENT END:VCALENDAR """ client = caldav.DAVClient(url) principal = client.principal() calendars = principal.calendars() if not len(calendars): return False vcal_entry = vcal_entry % (summary, date_from.strftime('%Y%m%d'), (date_end + relativedelta(days=1)).strftime('%Y%m%d')) calendar = calendars[0] log.info('Using calendar %r' % calendar) log.info('Using entry: %s' % vcal_entry) event = caldav.Event(client, data=vcal_entry, parent=calendar).save() log.info('Event %s created' % event) url_obj = event.url url_obj = str(url_obj) url_obj = urllib.quote(url_obj, safe='/:') return url_obj
def send(dbcal, calendar, client): n = 0 for obj in dbcal.event_set.filter(user_modified=True): dblogger.info("Gonna send %s", obj) n += 1 mycal = vobject.iCalendar() #~ mycal.add('vevent') #~ mycal = vobject.iCalendar() #~ vevent = vobject.newFromBehavior('vevent', '2.0') vevent = mycal.add('vevent') vevent.add('uid').value = obj.uid vevent.add('dtstamp').value = obj.modified if obj.start_time: vevent.add('dtstart').value = datetime.datetime.combine( obj.start_date, obj.start_time) else: vevent.add('dtstart').value = obj.start_date if obj.end_time: vevent.add('dtend').value = datetime.datetime.combine( obj.end_date, obj.end_time) else: vevent.add('dtend').value = obj.end_date vevent.add('transp').value = iif( obj.transparent, 'TRANSPARENT', 'OPAQUE') vevent.add('summary').value = obj.summary if obj.place: vevent.add('location').value = obj.place.name vevent.add('description').value = obj.description event = caldav.Event( client, data=mycal.serialize(), parent=calendar).save() dblogger.info("--> Sent %d events to calendar server.", n)
def test0050create_event_attendee(self): 'Create event with attendee' ical = vobject.iCalendar() vevent = ical.add('vevent') vevent.add('summary') vevent.summary.value = 'Test event with attendee' vevent.add('dtstart') vevent.dtstart.value = datetime.datetime.now() + relativedelta(days=10) vevent.add('dtend') vevent.dtend.value = datetime.datetime.now() + relativedelta(days=10, hours=4) vevent.add('organizer') vevent.organizer.value = '*****@*****.**' % user attendees = [] for name in ('foo', 'bar'): attendee = vobject.base.ContentLine('ATTENDEE', [], '') attendee.partstat_param = 'TENTATIVE' attendee.value = 'MAILTO:%[email protected]' % name attendees.append(attendee) vevent.attendee_list = attendees caldav.Event(self.client, data=ical.serialize(), parent=self.calendar).save() Event = Model.get('calendar.event') owner_event, = Event.find([ ('calendar.owner.email', '=', '*****@*****.**' % user), ('summary', '=', vevent.summary.value), ]) attendee_event, = Event.find([ ('calendar.owner.email', '=', '*****@*****.**'), ]) self.assertEqual(attendee_event.uuid, owner_event.uuid)
def test0020create_event(self): 'Create event' ical = vobject.iCalendar() vevent = ical.add('vevent') vevent.add('summary') vevent.summary.value = 'Test event' vevent.add('dtstart') vevent.dtstart.value = (datetime.datetime.now() + relativedelta(months=1)) vevent.add('dtend') vevent.dtend.value = datetime.datetime.now() + relativedelta(months=1, hours=1) caldav.Event(self.client, data=ical.serialize(), parent=self.calendar).save()
def createEvent(self, uid=None, dtstamp=None, dtstart=None, dtend=None, summary=None, calendar=None): tpl = """BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:%(prodid)s\r\nBEGIN:VEVENT\r\nUID:%(uid)s\r\nDTSTAMP:%(dtstamp)s\r\nDTSTART:%(dtstart)s\r\nDTEND:%(dtend)s\r\nSUMMARY:%(summary)s\r\nEND:VEVENT\r\nEND:VCALENDAR""" calendar = self.calendars.get(calendar) assert calendar, 'Missing calendar' data = tpl % dict(uid=uid or getUuid(), dtstamp=dt(dtstamp or datetime.now()), dtstart=dt(dtstart), dtend=dt(dtend), summary=summary, prodid='VCALENDAR genropy') event = caldav.Event(self.client, data=data, parent=calendar).save()
def test0010create_event_external(self): 'Create event with external attendee' ical = vobject.iCalendar() vevent = ical.add('vevent') vevent.add('summary') vevent.summary.value = 'Test event with external attendee' vevent.add('dtstart') vevent.dtstart.value = datetime.datetime.now() + relativedelta(days=10) vevent.add('dtend') vevent.dtend.value = datetime.datetime.now() + relativedelta(days=10, hours=4) vevent.add('organizer') vevent.organizer.value = '*****@*****.**' attendee = vobject.base.ContentLine('ATTENDEE', [], '') attendee.partstat_param = 'TENTATIVE' attendee.value = 'MAILTO:[email protected]' vevent.attendee_list = [attendee] caldav.Event(self.client, data=ical.serialize(), parent=self.calendar).save()
def test0020create_event_ext_int(self): 'Create event with external and internal attendees' ical = vobject.iCalendar() vevent = ical.add('vevent') vevent.add('summary') vevent.summary.value = 'Test event with ext/int attendees' vevent.add('dtstart') vevent.dtstart.value = datetime.datetime.now() + relativedelta(days=5) vevent.add('dtend') vevent.dtend.value = datetime.datetime.now() + relativedelta(days=5, hours=8) vevent.add('organizer') vevent.organizer.value = '*****@*****.**' attendees = [] for email in ('foo@example', '*****@*****.**'): attendee = vobject.base.ContentLine('ATTENDEE', [], '') attendee.partstat_param = 'TENTATIVE' attendee.value = 'MAILTO:%s' % email attendees.append(attendee) vevent.attendee_list = attendees caldav.Event(self.client, data=ical.serialize(), parent=self.calendar).save()
def create(self, cr, uid, vals, context=None): # Synchornize a meeting with a caldav calendar # NICETOHAVE: Should be possible to choose not to sync a meeting meeting_id = super(crm_meeting, self).create(cr, uid, vals, context=None) meeting = self.browse(cr, uid, meeting_id) # To change by meeting.responsible_id => What of meetings without responsible ? user = self.pool.get('res.users').browse(cr, uid, uid) print "MEETING CREATE CONTEXT:", context if user.caldav_state == 'validated' and 'from_caldav' not in context: # Could thread all this to speed up meeting creation try: client = caldav.DAVClient(user.caldav_url) principal = caldav.Principal(client, user.caldav_url) calendars = principal.calendars() if not calendars: raise osv.except_osv( _('CalDav Client Error'), _('No CalDav calendar found for user %s' % (user.name))) if len(calendars) > 0: # To improve for multi-calendars calendar = calendars[0] # cannot use meeting.class so use vals['class'] if vals['class'] in ['private', 'confidential']: accessrule = 'CONFIDENTIAL' cdclass = 'PRIVATE' else: accessrule = 'PUBLIC' cdclass = 'PUBLIC' uniqueid = 'OPENERP-' + str(time.time()) dtstamp = time.strftime('%Y%m%dT%H%M%SZ') # Convert from UTC to user timezone tzone = timezone( self.pool.get('res.users').read(cr, uid, uid, ['tz'])['tz']) dtstart_utc = pytz.utc.localize( datetime.strptime(meeting.date, '%Y-%m-%d %H:%M:%S')) dtstart_loc = dtstart_utc.astimezone(tzone) dtstart = dtstart_loc.strftime('%Y%m%dT%H%M%S') dtend_utc = pytz.utc.localize( datetime.strptime(meeting.date_deadline, '%Y-%m-%d %H:%M:%S')) dtend_loc = dtend_utc.astimezone(tzone) dtend = dtend_loc.strftime('%Y%m%dT%H%M%S') # To avoid 'False' in meeting description if not meeting.description: description = "" else: # TOFIX: bug with \n in description description = repr(meeting.description)[2:-1] if meeting.show_as == 'free': dispo = 'FREE' elif meeting.show_as == 'busy': dispo = 'BUSY' vcal = """ BEGIN:VCALENDAR VERSION:2.0 X-CALENDARSERVER-ACCESS:%s PRODID:-//SmartSolution//CalDAV Client//EN BEGIN:VEVENT UID:%s DTSTAMP:%s DTSTART:%s DTEND:%s SUMMARY:%s DESCRIPTION:%s CLASS:%s X-MICROSOFT-CDO-BUSYSTATUS:%s END:VEVENT END:VCALENDAR """ % (accessrule, uniqueid, dtstamp, dtstart, dtend, meeting.name, description, cdclass, dispo) # Create event in calendar event = caldav.Event(client, data=vcal, parent=calendar).save() print "CREATED EVENT:", event if event: self.write(cr, uid, [meeting_id], {'caldav_uid': uniqueid}, context=context) except Exception, exception: print exception log = '%s ERROR Unable to create event %s\n' % ( time.strftime('%Y-%m-%d %H:%M:%S'), meeting.name) + ( user.caldav_log or "") self.pool.get('res.users').write(cr, uid, [user.id], {'caldav_log': log})