コード例 #1
0
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
コード例 #2
0
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)
コード例 #3
0
    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)
コード例 #4
0
 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()
コード例 #5
0
 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()
コード例 #6
0
 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()
コード例 #7
0
 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()
コード例 #8
0
    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})