def schedule2calendar(schedule, name='课表', using_todo=True): """ 将上课时间表转换为 icalendar :param schedule: 上课时间表 :param name: 日历名称 :param using_todo: 使用 ``icalendar.Todo`` 而不是 ``icalendar.Event`` 作为活动类 :return: icalendar.Calendar() """ # https://zh.wikipedia.org/wiki/ICalendar # http://icalendar.readthedocs.io/en/latest # https://tools.ietf.org/html/rfc5545 cal = icalendar.Calendar() cal.add('X-WR-TIMEZONE', 'Asia/Shanghai') cal.add('X-WR-CALNAME', name) cls = icalendar.Todo if using_todo else icalendar.Event for week, start, end, data in schedule: # "事件"组件更具通用性, Google 日历不支持"待办"组件 item = cls(SUMMARY='第{:02d}周-{}'.format(week, data), DTSTART=icalendar.vDatetime(start), DTEND=icalendar.vDatetime(end), DESCRIPTION='起始于 {}, 结束于 {}'.format(start.strftime('%H:%M'), end.strftime('%H:%M'))) now = datetime.now() # 这个状态"事件"组件是没有的, 对于待办列表类应用有作用 # https://tools.ietf.org/html/rfc5545#section-3.2.12 if using_todo: if start < now < end: item.add('STATUS', 'IN-PROCESS') elif now > end: item.add('STATUS', 'COMPLETED') cal.add_component(item) return cal
def get_ics_event(self): ievent = icalendar.Event() ievent['summary'] = self.event.title ievent['dtstart'] = icalendar.vDatetime(self.when.lower).to_ical() ievent['dtend'] = icalendar.vDatetime(self.when.upper).to_ical() ievent['location'] = icalendar.vText(self.location.name) return ievent
def generate_ical(self): """Generate an ical file.""" logging.debug("Printing ics file") cal = icalendar.Calendar() ical_file = open(self.rota_ical, 'w') counter = 1 if not ical_file: logging.error("Error creating ical file.") sys.exit(-1) for data in self.all_events: logging.debug("{}".format(data)) name, talk_title, title_blog, rota_date, start_time, end_time,\ location, publish = data rota_date = datetime.combine(rota_date, datetime.min.time()) rota_date = rota_date.replace(tzinfo=self.tz) session = icalendar.Event() session['uid'] = rota_date.isoformat() session['dtstart'] = icalendar.vDatetime(rota_date + start_time) session['dtend'] = icalendar.vDatetime(rota_date + end_time) session['location'] = icalendar.vText(location) session['summary'] = icalendar.vText("{} - {}".format( name, talk_title)) cal.add_component(session) counter += 1 new_cal = cal.to_ical().decode('utf-8').replace('\r\n', '\n').strip() # print(new_cal) print(new_cal, file=ical_file) ical_file.close() logging.info("ICS file written: {}".format(self.rota_ical))
def shift_dates(cal, change): for event in cal.walk('vevent'): #loops through calendar events start_date = event.get('dtstart').dt start_new_date = start_date + timedelta(days=change) #gets initial date and applies shift if hasattr(start_new_date, 'tzinfo'): #converts to correct format for calendar file start_shifted_date = vDatetime(start_new_date) else: start_shifted_date = vDate(start_new_date) event['dtstart'] = start_shifted_date #applies new date to event end_date = event.get('dtend').dt end_new_date = end_date + timedelta(days=change) if hasattr(end_new_date, 'tzinfo'): end_shifted_date = vDatetime(end_new_date) else: end_shifted_date = vDate(end_new_date) event['dtend'] = end_shifted_date output_calendar = cal.to_ical() #converts calendar file to text return output_calendar
def events_to_ics(events): cal = Calendar() cal.add('prodid', '-//We Build Org//calendar//EN') cal.add('version', '2.0') cal.add('name', 'We Build SG') cal.add('X-WR-CALNAME', 'We Build SG') cal.add('description', 'Free tech events in Singapore') for event in events: description = event['description'] description += '\n\nRSVP count: {}'.format(event['rsvp_count']) start_time = datetime.datetime.strptime(event['start_time'], ISO8601_format) start_time = start_time.replace(tzinfo=datetime.timezone.utc) cal_event = Event() cal_event['uid'] = event['id'] cal_event['summary'] = event['name'] cal_event['dtstamp'] = vDatetime( datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)) cal_event['dtstart'] = vDatetime(start_time) cal_event['dtend'] = vDatetime(start_time + datetime.timedelta( seconds=event['duration'])) cal_event['url'] = event['url'] cal_event['location'] = event['location'] cal_event['description'] = description cal.add_component(cal_event) return cal.to_ical()
def generate_ical(self): """Generate an ical file.""" cal = icalendar.Calendar() ical_file = open(self.rota_ical, 'w') counter = 1 if not ical_file: print("Error creating ical file.", file=sys.stderr) sys.exit(-1) for data in self.rota: name, talk_title, title_blog, rota_date = data rota_date = datetime.combine(rota_date, datetime.min.time()) rota_date = rota_date.replace(tzinfo=self.tz) session = icalendar.Event() session['uid'] = rota_date.isoformat() session['dtstart'] = icalendar.vDatetime(rota_date + self.the_time_start) session['dtend'] = icalendar.vDatetime(rota_date + self.the_time_end) session['location'] = icalendar.vText(self.rota_location) session['summary'] = icalendar.vText("{} - {}".format(name, talk_title)) cal.add_component(session) counter += 1 new_cal = cal.to_ical().decode('utf-8').replace('\r\n', '\n').strip() # print(new_cal) print(new_cal, file=ical_file) ical_file.close() print("[Output] ics file written: {}".format(self.rota_ical))
def ics_datetime(idate, allday=False): if idate: if allday: return str(vDatetime(datetime.fromtimestamp(mktime(strptime(idate, DEFAULT_SERVER_DATETIME_FORMAT)))).to_ical())[:8] else: return vDatetime(datetime.fromtimestamp(mktime(strptime(idate, DEFAULT_SERVER_DATETIME_FORMAT)))).to_ical() + 'Z' return False
def events_to_private_ical_feed(user): """ Generate an ICAL feed for all events associated with the given user. :param user: The user to generate an ICAL feed for. :return: An ICAL string of all the user's events. """ timezone.activate(pytz.timezone(user.settings.time_zone)) calendar = _create_calendar(user) for event in user.events.iterator(): calendar_event = icalendar.Event() calendar_event["UID"] = "he-{}-{}".format(user.pk, event.pk) calendar_event["SUMMARY"] = event.title calendar_event["DTSTAMP"] = icalendar.vDatetime(timezone.localtime(event.created_at)) if not event.all_day: calendar_event["DTSTART"] = icalendar.vDatetime(timezone.localtime(event.start)) calendar_event["DTEND"] = icalendar.vDatetime(timezone.localtime(event.end)) else: calendar_event["DTSTART"] = icalendar.vDate(event.start) calendar_event["DTEND"] = icalendar.vDate((event.end + datetime.timedelta(days=1))) calendar_event["DESCRIPTION"] = _create_event_description(event) calendar.add_component(calendar_event) timezone.deactivate() return calendar.to_ical()
def schedule2calendar(schedule, name='课表', using_todo=True): """ 将上课时间表转换为 icalendar :param schedule: 上课时间表 :param name: 日历名称 :param using_todo: 使用 ``icalendar.Todo`` 而不是 ``icalendar.Event`` 作为活动类 :return: icalendar.Calendar() """ # https://zh.wikipedia.org/wiki/ICalendar # http://icalendar.readthedocs.io/en/latest # https://tools.ietf.org/html/rfc5545 cal = icalendar.Calendar() cal.add('X-WR-TIMEZONE', 'Asia/Shanghai') cal.add('X-WR-CALNAME', name) cls = icalendar.Todo if using_todo else icalendar.Event for week, start, end, data in schedule: # "事件"组件更具通用性, Google 日历不支持"待办"组件 item = cls( SUMMARY='第{:02d}周-{}'.format(week, data), DTSTART=icalendar.vDatetime(start), DTEND=icalendar.vDatetime(end), DESCRIPTION='起始于 {}, 结束于 {}'.format(start.strftime('%H:%M'), end.strftime('%H:%M')) ) now = datetime.now() # 这个状态"事件"组件是没有的, 对于待办列表类应用有作用 # https://tools.ietf.org/html/rfc5545#section-3.2.12 if using_todo: if start < now < end: item.add('STATUS', 'IN-PROCESS') elif now > end: item.add('STATUS', 'COMPLETED') cal.add_component(item) return cal
def test_can_download_valid_ical(self): """ 正しい形式のiCalファイルをダウンロードできる """ from icalendar import Calendar from icalendar import vDatetime, vText e = EventFactory() user = PersonaFactory() e.attend(user) e.save() r = self.client.get('/events/{}/calendar/'.format(e.pk)) for content in r.streaming_content: cal = Calendar.from_ical(content) self.assertEqual(cal['version'], '2.0') self.assertEqual(cal['PRODID'], 'Kawaz') for component in cal.walk(): if component.name == 'VEVENT': self.assertEqual(component['summary'], e.title) self.assertEqual(component['description'], e.body) self.assertEqual(component['location'], e.place) self.assertEqual(component['dtstamp'].to_ical(), vDatetime(e.created_at).to_ical()) self.assertEqual(component['dtstart'].to_ical(), vDatetime(e.period_start).to_ical()) self.assertEqual(component['dtend'].to_ical(), vDatetime(e.period_end).to_ical()) self.assertEqual(component['class'].to_ical(), vText('PUBLIC').to_ical()) self.assertEqual(component['organizer'].params['cn'], e.organizer.nickname) self.assertEqual(component['organizer'].params['role'], e.organizer.role) # ATENDEEがセットされている for attendee, cal_attendee in zip(e.attendees.all(), component['attendee']): self.assertEqual(cal_attendee.params['cn'], attendee.nickname) self.assertEqual(cal_attendee.params['role'], attendee.role)
def generate_ical(object): cal = Calendar() cal['PRODID'] = 'Kawaz' cal['VERSION'] = '2.0' site = Site.objects.get(pk=settings.SITE_ID) event = CalEvent() event['summary'] = object.title event['description'] = object.body event['class'] = 'PUBLIC' if object.pub_state == 'public' else 'PRIVATE' if object.category: event['categories'] = object.category.label event['dtstamp'] = vDatetime(object.created_at) if object.place: event['location'] = object.place event['dtstart'] = vDatetime(object.period_start).to_ical() if object.period_end: event['dtend'] = vDatetime(object.period_end).to_ical() def create_vaddress(user): va = vCalAddress('MAILTO:{}'.format(user.email)) va.params['cn'] = vText(user.nickname) va.params['ROLE'] = vText(user.role) return va organizer = create_vaddress(object.organizer) event['organizer'] = organizer event['URL'] = 'http://{}{}'.format(site.domain, object.get_absolute_url()) for attendee in object.attendees.all(): event.add('attendee', create_vaddress(attendee), encode=0) cal.add_component(event) return cal
def sts2ics(sts_string, year=None): if not year: now = datetime.now() year = now.year m = re.search("^Time: ([^,]+), Visible: (\d+) min, (.*)$", sts_string) if not m: sys.exit("Failed to parse input '%s'" % sts_string) starttime = m.group(1) + " " + str(year) minutes = int(m.group(2)) description = m.group(3) start = datetime.strptime(starttime, "%a %b %d %I:%M %p %Y") end = start + timedelta(minutes=minutes) vStart = vDatetime(start) vEnd = vDatetime(end) event = Event() event.add('summary', "ISS viewing") event.add('description', description) event.add('dtstart', vStart) event.add('dtend', vEnd) cal = Calendar() cal.add('prodid', '-//aaronferrucci//sts2ics//') cal.add('version', '1.0') cal.add_component(event) return cal
def homework_to_private_ical_feed(user): """ Generate an ICAL feed for all homework associated with the given user. :param user: The user to generate an ICAL feed for. :return: An ICAL string of all the user's homework. """ timezone.activate(pytz.timezone(user.settings.time_zone)) calendar = _create_calendar(user) for homework in Homework.objects.for_user(user.pk).iterator(): calendar_event = icalendar.Event() calendar_event["UID"] = "he-{}-{}".format(user.pk, homework.pk) calendar_event["SUMMARY"] = homework.title calendar_event["DTSTAMP"] = icalendar.vDatetime(timezone.localtime(homework.created_at)) if not homework.all_day: calendar_event["DTSTART"] = icalendar.vDatetime(timezone.localtime(homework.start)) calendar_event["DTEND"] = icalendar.vDatetime(timezone.localtime(homework.end)) else: calendar_event["DTSTART"] = icalendar.vDate(homework.start) calendar_event["DTEND"] = icalendar.vDate((homework.end + datetime.timedelta(days=1))) calendar_event["DESCRIPTION"] = _create_homework_description(homework) calendar.add_component(calendar_event) timezone.deactivate() return calendar.to_ical()
def build_icalendar_event(self, event_data): event = Event() start_date = False due_date = False event["summary"] = event_data["title"] # Check if a start date exists. If not make the start_date # the due_date if "start_date" in event_data: # event["dtstart"] = vDate(event_data["start_date"]).to_ical() event.add('dtstart', event_data["start_date"]) start_date = True if "due_date" in event_data: # event["dtend"] = vDate(event_data["due_date"]).to_ical() event.add('dtend', event_data["due_date"]) due_date = True if due_date and not start_date: # event["dtstart"] = vDate(event_data["due_date"]).to_ical() event.add('dtstart', event_data["due_date"]) event["description"] = event_data["description"] event["location"] = event_data["web_url"] event['created'] = vDatetime(event_data["created_date"]).to_ical() event['last-modified'] = vDatetime( event_data["updated_date"]).to_ical() event['dtstamp'] = vDatetime(datetime.now(tz=self.tz)).to_ical() event['uid'] = str(uuid.uuid1()) # print(event.to_ical().splitlines()) return event
def add_holiday_notice(calendar, d, note): d = localize(d) event = icalendar.Event() event.add('summary', note + ' -- Meeting Postponed due to holiday') event.add('dtstart', icalendar.vDatetime(d)) event.add('dtend', icalendar.vDatetime(d + meeting_duration)) event.add('dtstamp', now) calendar.add_component(event)
def get_ics_event(self): ievent = icalendar.Event() ievent["summary"] = self.event.title ievent["description"] = self.event.abstract ievent["dtstart"] = icalendar.vDatetime(self.when.lower).to_ical() ievent["dtend"] = icalendar.vDatetime(self.when.upper).to_ical() ievent["location"] = icalendar.vText(self.location.name) return ievent
def createEvent(cal, eventData): from datetime import datetime from icalendar import Event, vCalAddress, vText, Calendar, vDatetime import pytz correct = "n" while correct != 's': event = Event() tempCal = Calendar() if eventData["summary"] == '': eventData["summary"] = "Dummy event" print("\tGenerando evento <<%s>>...\n" % (eventData["summary"])) bdate = [int(i) for i in eventData["BDate"].split('-')] bhour = [int(i) for i in eventData["BHour"].split(':')] edate = [int(i) for i in eventData["EDate"].split('-')] ehour = [int(i) for i in eventData["EHour"].split(':')] btz = pytz.timezone(eventData["Btz"]) etz = pytz.timezone(eventData["Etz"]) event["summary"] = eventData["summary"] event["organizer"] = vCalAddress('MAILTO:' + eventData["organizer"]) event["dtstart"] = vDatetime( datetime(bdate[2], bdate[1], bdate[0], bhour[0], bhour[1], 0, tzinfo=btz)) event["dtend"] = vDatetime( datetime(edate[2], edate[1], edate[0], ehour[0], ehour[1], 0, tzinfo=etz)) event["dtstamp"] = vDatetime( datetime(bdate[2], bdate[1], bdate[0], bhour[0], bhour[1], 0, tzinfo=btz)) event["location"] = vText(eventData["location"]) if eventData["description"] == '': event["description"] = vText("XoXo.") else: event["description"] = vText(eventData["description"]) event['uid'] = "xOxO-" + str(datetime.timestamp( datetime.now())) + "-XoXo" event['priority'] = 5 print("La información es correcta?:\n") tempCal.add_component(event) displayCal(tempCal) correct = input("\n Correcto? s/n: ") if correct == "s": cal.add_component(event) return cal
def ics_datetime(idate, allday=False): if idate: if allday: return str(vDatetime(datetime.fromtimestamp(mktime(strptime(idate, DEFAULT_SERVER_DATETIME_FORMAT)))).to_ical())[:8] else: return vDatetime(datetime.fromtimestamp(mktime(strptime(idate, DEFAULT_SERVER_DATETIME_FORMAT)))).to_ical() + 'Z' return False raise osv.except_osv(_('Warning!'), _("First you have to specify the date of the invitation."))
def examples_for_term(course_year, term): examples = list(course_year.examples(term)) events = [] for example in examples: events.append(icalendar.Event( summary='P{0.paper_no}: {0.name} - Example paper {0.sheet_no}'.format(example), dtstart=icalendar.vDatetime(timezone.localize(example.class_start).astimezone(pytz.utc)), dtend=icalendar.vDatetime(timezone.localize(example.class_end).astimezone(pytz.utc)), dtstamp=icalendar.vDatetime(last_updated), location=icalendar.vText( "{} - {}".format(example.class_location, cued_address) if example.class_location else cued_address ), uid='{0.paper_no}-{0.sheet_no}.{term}.{part}@efw27.user.srcf.net'.format( example, term=term, part=course_year.part ), description=icalendar.vText('Lecturer: {.class_lecturer}'.format(example)) )) # group and order by issue date, ignoring those issued the previous term issue_key = lambda e: e.issue_date examples = filter(issue_key, examples) examples = sorted(examples, key=issue_key) examples = itertools.groupby(examples, issue_key) for i, (issue_date, papers) in enumerate(examples): # consume the iterable so that we can len() it papers = list(papers) events.append(icalendar.Event( summary='Collect {} example paper{}'.format(len(papers), '' if len(papers) == 1 else 's'), dtstart=icalendar.vDate(timezone.localize(issue_date).astimezone(pytz.utc)), dtend=icalendar.vDate(timezone.localize(issue_date).astimezone(pytz.utc)), dtstamp=icalendar.vDatetime(last_updated), location=icalendar.vText(cued_address), uid='collection-{i}.{term}.{part}@efw27.user.srcf.net'.format( i=i, term=term, part=course_year.part ), description=icalendar.vText('\n'.join( 'P{0.paper_no}: {0.name} - Example paper {0.sheet_no}'.format(p) for p in papers )) )) return events
def export_event(self): """Exports the event to ics""" cal = Eve() cal.add('summary', str(self.categories)) cal.add('description', self.label) cal.add('dtstart', vDatetime(self.start)) cal.add('dtend', vDatetime(self.end)) return cal.to_ical()
def fromPage(cls, page): vevent = cls() firstRevision = page.revisions.order_by("created_at").first() vevent.set('URL', page.full_url) vevent.set('SUMMARY', page.title) vevent.set('SEQUENCE', page.revisions.count()) vevent.set('DTSTAMP', vDatetime(timezone.now())) vevent.set('CREATED', vDatetime(firstRevision.created_at)) vevent.set('LAST-MODIFIED', vDatetime(page.latest_revision_created_at)) return vevent
def fromPage(cls, page): vevent = super().fromPage(page) dtstart = getAwareDatetime(page.date, page.time_from, page.tz, dt.time.min) dtend = getAwareDatetime(page.date, page.time_to, page.tz, dt.time.max) vevent.set('UID', page.uid) vevent.set('DTSTART', vDatetime(dtstart)) vevent.set('DTEND', vDatetime(dtend)) vevent._setDesc(page.details) vevent.set('LOCATION', page.location) return vevent
def fromPage(cls, page): vevent = super().fromPage(page) # FIXME support Anniversary date type events? dtstart = getAwareDatetime(page.date_from, page.time_from, page.tz, dt.time.min) dtend = getAwareDatetime(page.date_to, page.time_to, page.tz, dt.time.max) vevent.set('UID', page.uid) vevent.set('DTSTART', vDatetime(dtstart)) vevent.set('DTEND', vDatetime(dtend)) vevent.set('DESCRIPTION', page.details) vevent.set('LOCATION', page.location) return vevent
def get_calendar (self, obj, request): cal = Calendar () site = Site.objects.get_current () if obj is None: cal.add ('prodid', '-//Rocksoc Events Calendar//%s//' % site.domain) else: cal.add ('prodid', '-//Rocksoc Events Calendar//%s//%s' % (site.domain, obj.name or '')) cal.add ('version', '2.0') # FIXME: Currently, time zones aren't taken into account at all. This # might cause problems for people using the calendar from different # time zones. This hasn't been fixed yet because none of the site is # time-zone-aware (since capability for it was only added in Django # 1.4). for item in self.items (obj): ical_event = ICalendarEvent () ical_event.set ('summary', item.ename) if item.edescription: ical_event.set ('description', item.edescription) if item.venue: ical_event.add ('location', item.venue) # FIXME: Can't get this to work with CN #if item.organised_by != '': # address = vCalAddress ('') # address.params['cn'] = item.organised_by # ical_event.add ('organizer', address) if item.elink: if item.elink.startswith ('http:') or item.elink.startswith ('https:'): ical_event.add ('url', item.elink) else: ical_event.add ('url', 'http://%s/%s' % ( Site.objects.get_current ().domain, item.elink, )) if item.category: ical_event.add ('categories', item.category.name) if item.eoutlink: ical_event.add ('attach', item.eoutlink) ical_event.set ('dtstart', vDatetime (item.edatetime), encode = False) end_time = item.get_finish_datetime () and item.get_finish_datetime () or item.edatetime ical_event.set ('dtend', vDatetime (end_time), encode = False) ical_event.set ('dtstamp', vDatetime (end_time), encode = False) if item.last_modified: ical_event.set ('last-modified', vDatetime (item.last_modified), encode = False) ical_event.set ('uid', '%d@%s' % (item.id, site.domain)) cal.add_component (ical_event) return cal
def add_meeting_notice(calendar, d, note): d = localize(d) event = icalendar.Event() event.add('summary', 'CircuitPython Discord Meeting' + note) event.add('dtstart', icalendar.vDatetime(d)) event.add('dtend', icalendar.vDatetime(d + meeting_duration)) event.add('dtstamp', icalendar.vDatetime(now)) if 0: # This doesn't work, makes google not show the calendar at all event.add('conference', 'https://adafru.it/discord', parameters={'VALUE': 'URI'}) calendar.add_component(event)
def fromPage(cls, page): vevent = super().fromPage(page) dtstart = getAwareDatetime(page.date, page.time_from, page.tz, dt.time.min) dtend = getAwareDatetime(page.date, page.time_to, page.tz, dt.time.max) vevent.set('UID', page.uid) vevent.set('SUMMARY', page.postponement_title) vevent.set('DTSTART', vDatetime(dtstart)) vevent.set('DTEND', vDatetime(dtend)) vevent.set('DESCRIPTION', page.details) vevent.set('LOCATION', page.location) return vevent
def exportToICal(self, event_id): from pyamf.remoting.client import RemotingService # @UnresolvedImport from icalendar import Calendar, Event, vDatetime # @UnresolvedImport import uuid, os client = RemotingService(self.application.app_settings["url"]+"/"+self.application.app_config["connection"]["npi_service"]) service = client.getService("default") events = service.loadTable_amf(self.getCredentials(), "models.event", "id="+str(event_id), None) if events.__class__.__name__!="ArrayCollection": wx.MessageBox(str(events), "saveDataSet", wx.OK | wx.ICON_ERROR) return elif len(events)>0: event = events[0] cal = Calendar() cal.add('prodid', '-//nervatura.com/NONSGML Nervatura Calendar//EN') cal.add('version', '2.0') clevent = Event() if event["uid"]!=None: clevent['uid'] = event["uid"] else: clevent['uid'] = uuid.uuid4() if event["fromdate"]!=None: clevent['dtstart'] = vDatetime(event["fromdate"]).ical() if event["todate"]!=None: clevent['dtend'] = vDatetime(event["todate"]).ical() if event["subject"]!=None: clevent['summary'] = event["subject"] if event["place"]!=None: clevent['location'] = event["place"] if event["eventgroup"]!=None: groups = service.loadTable_amf(self.getCredentials(), "models.groups", "id="+str(event["eventgroup"]), None) if groups.__class__.__name__=="ArrayCollection": if len(groups)>0: clevent['category'] = groups[0].groupvalue if event["description"]!=None: clevent['description'] = event["description"] cal.add_component(clevent) wildcard = "iCal files (*.ical)|" \ "All files (*.*)|*.*" dlg = wx.FileDialog( self, message="Event export", defaultDir=(os.getenv('USERPROFILE') or os.getenv('HOME')), defaultFile=str(event["calnumber"]).replace("/", "_"), wildcard=wildcard, style=wx.SAVE) dlg.SetFilterIndex(0) if dlg.ShowModal() == wx.ID_OK: icalfile = open(dlg.GetPath()+".ical", 'w') icalfile.write(cal.as_string()) icalfile.close() dlg.Destroy()
def add_appointment(self,uid,dtstart,dtend,dtstamp,summary,description): event=Event() event.add('summary',summary) event.add('description',description) event['uid']=uid # event.add('dtstart',dtstart) event['dtstart']=vDatetime(dtstart).ical() # event.add('dtend',dtend) event['dtend']=vDatetime(dtend).ical() # event.add('dtstamp',dtstamp) event['dtstamp']=vDatetime(dtstamp).ical() self._cal.add_component(event)
def fromPage(cls, page): vevent = super().fromPage(page) daysDelta = dt.timedelta(days=page.num_days - 1) dtstart = getAwareDatetime(page.date, page.time_from, page.tz, dt.time.min) dtend = getAwareDatetime(page.date + daysDelta, page.time_to, page.tz, dt.time.max) vevent.set('SUMMARY', page.postponement_title) vevent.set('DTSTART', vDatetime(dtstart)) vevent.set('DTEND', vDatetime(dtend)) vevent._setDesc(page.details) vevent.set('LOCATION', page.location) return vevent
def fromPage(cls, page): vevent = super().fromPage(page) # FIXME support Anniversary date type events? dtstart = getAwareDatetime(page.date, page.time_from, page.tz, dt.time.min) dtend = getAwareDatetime(page.date, page.time_to, page.tz, dt.time.max) vevent.set('UID', page.uid) vevent.set('DTSTART', vDatetime(dtstart)) vevent.set('DTEND', vDatetime(dtend)) vevent.set('DESCRIPTION', page.details) vevent.set('LOCATION', page.location) # TODO: Add CATEGORIES page.category # TODO: Add CLASS pages.get_view_restrictions() ? "RESTRICTED" : "PUBLIC" return vevent
def get_event(resume: Resume) -> Event: event = Event() event.add('summary', f'Read {resume.basics.name}\' resume') event.add('dtstart', vDatetime(get_event_start())) event.add('dtend', vDatetime(get_event_end())) event.add('dtstamp', vDatetime(get_event_timestamp())) event['locations'] = vText('Somewhere comfortable') event['uid'] = str(uuid.uuid4()) event['organizer'] = get_organizer(resume) event.add('attendee', get_attendee(), encode=0) event.add('priority', 5) event.add('description', get_description(resume)) return event
def generate_ical_file(generator): """Generate an iCalendar file """ global events ics_fname = generator.settings['PLUGIN_EVENTS']['ics_fname'] if not ics_fname: return ics_fname = os.path.join(generator.settings['OUTPUT_PATH'], ics_fname) log.debug("Generating calendar at %s with %d events" % (ics_fname, len(events))) local_tz = pytz.timezone(generator.settings["TIMEZONE"]) ical = icalendar.Calendar() ical.add('prodid', '-//pelican/events//mxm.dk//EN') ical.add('version', '2.0') ical.add("METHOD", "PUBLISH") SITEURL = generator.settings['SITEURL'] DEFAULT_LANG = generator.settings['DEFAULT_LANG'] curr_events = events if not localized_events else localized_events[ DEFAULT_LANG] for e in curr_events: dtstart_utc = local_tz.localize(e.dtstart).astimezone(pytz.utc) dtend_utc = local_tz.localize(e.dtend).astimezone(pytz.utc) dtstamp_utc = local_tz.localize(e.metadata['date']).astimezone( pytz.utc) ie = icalendar.Event( summary=Markup(e.metadata['title']).striptags(), dtstart=icalendar.vDatetime(dtstart_utc).to_ical(), dtend=icalendar.vDatetime(dtend_utc).to_ical(), dtstamp=icalendar.vDatetime(dtstamp_utc).to_ical(), uid=e.metadata['slug'] + "@" + generator.settings["SITENAME"], ) ie.add("CLASS", "PUBLIC") summary = Markup(e.article.get_summary(SITEURL)).striptags() ie.add("DESCRIPTION", summary) if 'event-location' in e.metadata: ie.add('location', e.metadata['event-location']) elif 'location' in e.metadata: ie.add('location', e.metadata['location']) ical.add_component(ie) with open(ics_fname, 'wb') as f: f.write(ical.to_ical())
def action_to_ical_event(action): from icalendar import Event, vText, vCalAddress, vDatetime from pytz import timezone evt = Event() evt["uid"] = f"{action.id}@{base_url()}" evt.add("summary", action.html_title) evt["url"] = action.full_url outreach_circle = get_circle("outreach") if outreach_circle: organizer = vCalAddress(f"MAILTO:{outreach_circle.public_email}") organizer.params["cn"] = "Extinction Rebellion Boston" evt["organizer"] = organizer start = action.when # TODO: event listings don't have a duration so making one up. end = action.when + timedelta(hours=2) evt.add("dtstart", vDatetime(start)) evt.add("dtend", vDatetime(end)) evt.add("dtstamp", vDatetime(now())) # Attempt to put video conferencing information into the ics. # TODO: this doesn't work entirely but it doesn't hurt. Revisit # when we have more time and patience to work on it. if action.virtual: dlines = [ f"Join online: <a href=\"{action.location}\">{action.location}</a>\n", f"Event details: <a href=\"{action.full_url}\">{action.full_url}</a>\n", f"{action.description}\n", ICS_VIDEO_CONFERENCE_SEP, "Do not edit this section of the description.\n", "This event has a video call.", f"Join: {action.location}\n", f"View your event at {action.full_url}", ICS_VIDEO_CONFERENCE_SEP, ] evt["location"] = "Online event" else: dlines = [ f"Event details: {action.full_url}\n", f"{action.description}", ] evt["location"] = action.location description = "\n".join(dlines) evt.add("description", description) evt["last-modified"] = vDatetime(action.modified) evt["created"] = vDatetime(now()) return evt
def fromPage(cls, page): vevent = super().fromPage(page) exceptDt = getAwareDatetime(page.except_date, page.overrides.time_from, page.tz, dt.time.min) dtstart = getAwareDatetime(page.except_date, page.time_from, page.tz, dt.time.min) dtend = getAwareDatetime(page.except_date, page.time_to, page.tz, dt.time.max) vevent.set('UID', page.overrides.uid) vevent.set('RECURRENCE-ID', vDatetime(exceptDt)) vevent.set('DTSTART', vDatetime(dtstart)) vevent.set('DTEND', vDatetime(dtend)) vevent.set('LOCATION', page.overrides.location) return vevent
def __init__(self, summary, description, duration_days): self.calendar = Calendar() self.event = icalendar.Event() self.calendar.add('prodid', '-//UNT Schedule Exporter//undercase//') self.calendar.add('version', '2.0') self.event['dtstart'] = icalendar.vDatetime(datetime.now()) self.event['dtend'] = icalendar.vDatetime(datetime.now() + timedelta( days=duration_days)) self.event['summary'] = summary self.event['description'] = description self.calendar.add_component(self.event)
def examples_for_term(course_year, term): examples = list(course_year.examples(term)) events = [] for example in examples: events.append( icalendar.Event( summary='P{0.paper_no}: {0.name} - Example paper {0.sheet_no}'. format(example), dtstart=icalendar.vDatetime( timezone.localize(example.class_start).astimezone( pytz.utc)), dtend=icalendar.vDatetime( timezone.localize(example.class_end).astimezone(pytz.utc)), dtstamp=icalendar.vDatetime(last_updated), location=icalendar.vText( "{} - {}".format(example.class_location, cued_address) if example.class_location else cued_address), uid='{0.paper_no}-{0.sheet_no}.{term}.{part}@efw27.user.srcf.net' .format(example, term=term, part=course_year.part), description=icalendar.vText( 'Lecturer: {.class_lecturer}'.format(example)))) # group and order by issue date, ignoring those issued the previous term issue_key = lambda e: e.issue_date examples = filter(issue_key, examples) examples = sorted(examples, key=issue_key) examples = itertools.groupby(examples, issue_key) for i, (issue_date, papers) in enumerate(examples): # consume the iterable so that we can len() it papers = list(papers) events.append( icalendar.Event( summary='Collect {} example paper{}'.format( len(papers), '' if len(papers) == 1 else 's'), dtstart=icalendar.vDate( timezone.localize(issue_date).astimezone(pytz.utc)), dtend=icalendar.vDate( timezone.localize(issue_date).astimezone(pytz.utc)), dtstamp=icalendar.vDatetime(last_updated), location=icalendar.vText(cued_address), uid='collection-{i}.{term}.{part}@efw27.user.srcf.net'.format( i=i, term=term, part=course_year.part), description=icalendar.vText('\n'.join( 'P{0.paper_no}: {0.name} - Example paper {0.sheet_no}'. format(p) for p in papers)))) return events
def generate_ical_file(generator): """Generate an iCalendar file """ global events ics_fname = generator.settings['PLUGIN_EVENTS']['ics_fname'] if not ics_fname: return ics_fname = os.path.join(generator.settings['OUTPUT_PATH'], ics_fname) log.debug("Generating calendar at %s with %d events" % (ics_fname, len(events))) local_tz = pytz.timezone(generator.settings["TIMEZONE"]) ical = icalendar.Calendar() ical.add('prodid', '-//pelican/events//mxm.dk//EN') ical.add('version', '2.0') ical.add("METHOD", "PUBLISH") SITEURL = generator.settings['SITEURL'] DEFAULT_LANG = generator.settings['DEFAULT_LANG'] curr_events = events if not localized_events else localized_events[DEFAULT_LANG] for e in curr_events: dtstart_utc = local_tz.localize(e.dtstart).astimezone(pytz.utc) dtend_utc = local_tz.localize(e.dtend).astimezone(pytz.utc) dtstamp_utc = local_tz.localize(e.metadata['date']).astimezone(pytz.utc) ie = icalendar.Event( summary=Markup(e.metadata['title']).striptags(), dtstart=icalendar.vDatetime(dtstart_utc).to_ical(), dtend=icalendar.vDatetime(dtend_utc).to_ical(), dtstamp=icalendar.vDatetime(dtstamp_utc).to_ical(), uid=e.metadata['slug'] + "@" + generator.settings["SITENAME"], ) ie.add("CLASS", "PUBLIC") summary = Markup(e.article.get_summary(SITEURL)).striptags() ie.add("DESCRIPTION", summary) if 'event-location' in e.metadata: ie.add('location', e.metadata['event-location']) elif 'location' in e.metadata: ie.add('location', e.metadata['location']) ical.add_component(ie) with open(ics_fname, 'wb') as f: f.write(ical.to_ical())
def build_calendar(issues, ics_path): cal = Calendar() for i in issues: event = Event() if "Full" in str(i.status): summary = "[COMPLET] " + i.subject else: summary = i.subject event.add('summary', summary) event.add('description', i.description) event['uid'] = i.id for c in i.custom_fields: if c.id == 20: # 20 is 'debut' start_time = str(c.value).replace(':', '')+"00" if c.id == 21: # 21 is 'fin' end_time = str(c.value).replace(':', '')+"00" event['dtstart'] = i.due_date.replace('/','')+"T"+start_time event['dtend'] = i.due_date.replace('/','')+"T"+end_time event['dtstamp'] = vDatetime(now).to_ical() organizer = vCalAddress('MAILTO:[email protected]') organizer.params['cn'] = vText('Les fruits défendus') event['organizer'] = organizer event['location'] = vText('Montréal, QC') cal.add_component(event) f = open(ics_path, 'wb') f.write(cal.to_ical()) f.close()
def __init__(self, start_datetime=_marker, end_datetime=_marker, display_time=_marker, location=_marker, all_day=_marker, timezone_name=_marker, recurrence=_marker, end_recurrence_datetime=_marker): if timezone_name is not _marker: self.set_timezone_name(timezone_name) timezone = get_timezone(timezone_name) else: timezone = get_timezone(None) if start_datetime is not _marker: start_datetime = start_datetime.replace(tzinfo=timezone) self.set_start_datetime(start_datetime) if end_datetime is not _marker: end_datetime = end_datetime.replace(tzinfo=timezone) self.set_end_datetime(end_datetime) if display_time is not _marker: self.set_display_time(display_time) if location is not _marker: self.set_location(location) if recurrence is not _marker and recurrence: recurrence = RRuleData(recurrence) if end_recurrence_datetime is not _marker: recurrence['UNTIL'] = vDatetime( end_recurrence_datetime.replace( tzinfo=timezone).astimezone(UTC)) self.set_recurrence(str(recurrence)) if all_day is not _marker: self.set_all_day(all_day)
def update_event(self, username, uid, event_name, start_timestamp, quantity): """ Update the info about a specific event on the user calendar. :param username: username of the calendar to insert the event. :param uid: UID tha identifies the event in the calendar. :param event_name: Event name. :param start_timestamp: The date where the event are scheduled. :param quantity: The quantity reserved. :return: Keyword 'OK' """ cal = Calendar() cal['version'] = "2.0" cal['prodid'] = "//Radicale//NONSGML Radicale Server//EN" event = Event() event['uid'] = uid event['dtstart'] = vDatetime(datetime.fromtimestamp(start_timestamp)).to_ical() event['summary'] = event_name event['description'] = 'Quantity: ' + str(quantity) event['x-radicale-name'] = str(uid) + '.ics' cal.add_component(event) headers = {'Content-Type': 'text/calendar', 'charset': 'utf-8'} self.client.put(self.url + username + '/calendar.ics/' + str(uid) + '.ics', cal.to_ical(), headers) return 'OK'
def set_ics_event(self, ics_file, partner): for event in Calendar.from_ical(ics_file).walk('vevent'): #~ if not event.get('uid'): #~ event.add('uid',reduce(lambda x,y: x ^ y, map(ord, str(event.get('dtstart') and event.get('dtstart').dt or '' + event.get('summary') + event.get('dtend') and event.get('dtend').dt or ''))) % 1024) summary = '' description = unicode(event.get('description', '')) if unicode(event.get('summary')) and len(unicode(event.get('summary'))) < 35: summary = unicode(event.get('summary')) elif len(unicode(event.get('summary'))) >= 35: summary = unicode(event.get('summary'))[:35] if not event.get('description'): description = unicode(event.get('summary')) record = {r[1]:r[2] for r in [ ('dtstart','start_date',event.get('dtstart') and event.get('dtstart').dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)), ('dtend','stop_date',event.get('dtend') and event.get('dtend').dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)), #~ ('dtstamp','start_datetime',event.get('dtstamp') and event.get('dtstamp').dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)), #~ ('description','description',description), ('duration','duration',event.get('duration')), ('location','location',event.get('location') and unicode(event.get('location')) or partner.ics_location), ('class','class',event.get('class') and str(event.get('class')) or partner.ics_class), ('summary','name',summary), ('rrule', 'rrule',event.get('rrule') and event.get('rrule').to_ical() or None), ] if event.get(r[0])} partner_ids = self.env['res.partner'].get_attendee_ids(event) #~ raise Warning(partner_ids) if partner_ids: partner_ids.append(partner.id) else: partner_ids = [partner.id] record['partner_ids'] = [(6,0,[partner_ids])] #~ record['partner_ids'] = [(6,0,self.env['res.partner'].get_attendee_ids(event)[0] and self.env['res.partner'].get_attendee_ids(event)[0].append(partner.id) or [partner.id])] #~ raise Warning(record['partner_ids']) #~ record['attendee_ids'] = [(6,0,[attendee])] record['ics_subscription'] = True record['start'] = record.get('start_date') record['stop'] = record.get('stop_date') or record.get('start') record['description'] = description record['show_as'] = partner.ics_show_as record['allday'] = partner.ics_allday #~ record['rrule'] = event.get('rrule').to_ical() #~ raise Warning(record['rrule_type'].to_ical) tmpStart = datetime.time(datetime.fromtimestamp(mktime(strptime(record['start'], DEFAULT_SERVER_DATETIME_FORMAT)))) tmpStop = datetime.fromtimestamp(mktime(strptime(record['stop'], DEFAULT_SERVER_DATETIME_FORMAT))) if tmpStart == time(0,0,0) and tmpStart == datetime.time(tmpStop): record['allday'] = True if not record.get('stop_date'): record['allday'] = True record['stop_date'] = record['start_date'] elif record.get('stop_date') and record['allday']: record['stop_date'] = vDatetime(tmpStop - timedelta(hours=24)).dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT) record['stop'] = record['stop_date'] _logger.error('ICS %s' % record) self.env['calendar.event'].create(record)
def mk_time(value): try: return vDate(datetime.strptime(value, "%a %b %d %Y")) except ValueError: try: return vDatetime(datetime.strptime(value, "%a %b %d %H:%M %Y")) except ValueError: raise DateParseError(value)
def main(*, args): params = docopt.docopt( doc=__doc__.format( prog=__prog__, ), argv=args, help=True, version=__version__, options_first=False, ) assert params.pop("--help") == False assert params.pop("--version") == False dtstart = parse_dt(params.pop("START_DT_WITH_TIMEZONE")) dtend = parse_dt(params.pop("END_DT_WITH_TIMEZONE")) summary = params.pop("--summary") or "Event" description = params.pop("--description") or f"Generated By: {__product__}" url = params.pop("--url") attachments = params.pop("--attachment") output_path = params.pop("--output") assert not params, params print("Summary: {}" .format(summary)) print("Start: {:%c %z}".format(dtstart)) print("End: {:%c %z}".format(dtend)) print("Duration: {}" .format(dtend - dtstart)) print("Description: {}" .format(description)) print(file=sys.stderr) event = icalendar.Event() event.add("SUMMARY", icalendar.vText(summary)) event.add("DESCRIPTION", icalendar.vText(description)) event.add("DTSTART", icalendar.vDatetime(dtstart)) event.add("DTEND", icalendar.vDatetime(dtend)) if url is not None: event.add("URL", icalendar.vUri(url)) for path in attachments: add_attachment_to_calendar_event(event, path) calendar = icalendar.Calendar() #TODO:vruyr:bugs Verify with the standard. calendar.add("PRODID", f"-//{__product__}//vruyr.com//EN") calendar.add("VERSION", "2.0") calendar.add_component(event) with open(output_path, "wb") as fo: fo.write(calendar.to_ical())
def generate_ical_file(generator): """Generate an iCalendar file """ global events ics_fname = generator.settings['PLUGIN_EVENTS']['ics_fname'] if not ics_fname: return ics_fname = os.path.join(generator.settings['OUTPUT_PATH'], ics_fname) log.debug("Generating calendar at %s with %d events" % (ics_fname, len(events))) tz = generator.settings.get('TIMEZONE', 'UTC') tz = pytz.timezone(tz) ical = icalendar.Calendar() ical.add('prodid', '-//My calendar product//mxm.dk//') ical.add('version', '2.0') for e in events: dtstart, dtend, article = e title = re.sub(" ", " ", article.metadata['title']) ie = icalendar.Event( summary=title, dtstart=vDatetime(dtstart).to_ical(), dtend=vDatetime(dtend).to_ical(), dtstamp=vDatetime(article.metadata['date']).to_ical(), uid=title, ) if 'event-location' in article.metadata: ie.add('location', article.metadata['event-location']) if 'event-origanizer' in article.metadata: ie.add('organizer', article.metadata['event-organizer']) if 'event-url' in article.metadata: ie.add('description', article.metadata['event-url']) ical.add_component(ie) with open(ics_fname, 'wb') as f: f.write(ical.to_ical())
def handle_event(i): """Creates icalendar Event from a GCalEvent""" event = Event() id = (datetime.utcnow().strftime('%Y%m%d%H%M%f') + '-' + str(os.getpid()) + '-' + person) event.add('uid', id) event['dtstamp'] = vDatetime(datetime.utcnow()).to_ical() + 'Z' #util.Event basic needs subject and startdate event.add('summary', i.subject) if i.alldayevent: event.add('dtstart', i.startdate) event.add('dtend', i.startdate+timedelta(days=1)) else: dtstart = USRTZ.localize(datetime.combine(i.startdate, i.starttime)) dtend = USRTZ.localize(datetime.combine(i.enddate, i.endtime)) event['dtstart'] = (vDatetime(dtstart.astimezone(GMT)).to_ical() ) event['dtend'] = ( vDatetime(dtend.astimezone(GMT)).to_ical() ) return event
def course_to_event(course): """Convert a Course into a icalendar event. :param course: a :class:`tradeschool.models.Course` to export as an Event :returns: :class:`icalendar.Event` """ return Event(**{ 'uid': vText(_build_uid_for_course(course)), 'created': vDatetime(course.created), 'description': vText(course.description), 'dtstart': vDatetime(course.start_time), 'dtend': vDatetime(course.end_time), 'last-mod': vDatetime(course.updated), 'dtstamp': vDatetime(datetime.datetime.now()), 'location': vText(_build_location_for_venue(course.venue)), 'summary': vText(course.title), 'url': vUri(course.course_view_url), })
def build_reservations_ical_file(reservations): """ Return iCalendar file containing given reservations """ cal = Calendar() cal['X-WR-CALNAME'] = vText('RESPA') cal['name'] = vText('RESPA') for reservation in reservations: event = Event() event['uid'] = 'respa_reservation_{}'.format(reservation.id) event['dtstart'] = vDatetime(reservation.begin) event['dtend'] = vDatetime(reservation.end) unit = reservation.resource.unit event['location'] = vText('{} {} {}'.format(unit.name, unit.street_address, unit.address_zip)) event['geo'] = vGeo(unit.location) event['summary'] = vText('{} {}'.format(unit.name, reservation.resource.name)) cal.add_component(event) return cal.to_ical()
def labs_for_term(course_year, term, lab_group): timetable = course_year.term(term) events = [] # add the labs for day, labs in timetable.labs_for(lab_group).items(): for lab in labs: if not lab.slots: continue for i, (startt, endt) in enumerate(lab.times_on(day)): events.append(icalendar.Event( summary=icalendar.vText( '{}: {}'.format(lab.code, lab.name) if any(c.isdigit() for c in lab.code) else lab.name ), location=icalendar.vText( "{} - {}".format(lab.location, cued_address) if lab.location else cued_address ), dtstart=icalendar.vDatetime(timezone.localize(startt).astimezone(pytz.utc)), dtend= icalendar.vDatetime(timezone.localize(endt).astimezone(pytz.utc)), dtstamp=icalendar.vDatetime(last_updated), uid='{code}-{i}.d{day}.{term}.{part}@efw27.user.srcf.net'.format( i=i, code=lab.code, day=(day - timetable.dates[0]).days, term=term, part=course_year.part ), description=icalendar.vText( '{}Feedback: http://www-g.eng.cam.ac.uk/ssjc/labs.html'.format( "Information: {}\n\n".format(lab.link) if lab.link else "" ) ) )) return events
def to_icalendar(events): """ Converts events to .ics format :param events = Iterable(cal.schema.Event) :return bytes """ summary = "Calendar for Columbia University made by ADI (adicu.com)" cal = iCalendar(dtstart=vDatetime(datetime.now()), summary=summary) for e in events: # for every event, create an event object organizer = vCalAddress("MAILTO:''") organizer.params['cn'] = e.user.name vevent = iEvent(summary=e.name, organizer=organizer, location=vText(e.location), dtstart=vDatetime(e.start), description=e.url) cal.add_component(vevent) return cal.to_ical()
def get_ics_event(self): event = self[0] ics = Event() calendar = Calendar() date_format = DEFAULT_SERVER_DATETIME_FORMAT ics["uid"] = event.id ics["allday"] = event.allday if ics["allday"]: date_format = DEFAULT_SERVER_DATE_FORMAT ics["dtstart"] = vDatetime(datetime.fromtimestamp(mktime(strptime(event.start_date, date_format)))) ics["dtend"] = vDatetime(datetime.fromtimestamp(mktime(strptime(event.stop_date, date_format)))) ics["summary"] = event.name ics["description"] = event.description # ~ ics['class'] = event.class # ~ calendar.add_component(ics) # ~ raise Warning(calendar.to_ical()) return ics
def ical_from_specs(self, dates): return self.ical_template % {'dtstart1': vDatetime(dates[0]).ical(), 'dtend1': vDatetime(dates[1]).ical(), 'dtstart2': vDatetime(dates[2]).ical(), 'dtend2': vDatetime(dates[3]).ical(), 'dtstart3': vDatetime(dates[4]).ical(), 'dtend3': vDatetime(dates[5]).ical(), }
def __init__(self, info, occurrence, viewer=None): super(AgendaEvent, self).__init__() if viewer is not None: timezone = viewer.get_timezone() else: timezone = occurrence.get_timezone() cdate = occurrence.get_calendar_datetime() start_dt = cdate.get_start_datetime(timezone) end_dt = cdate.get_end_datetime(timezone) if occurrence.is_all_day(): start_date = date(start_dt.year, start_dt.month, start_dt.day) # end date is exclusive end_date = date(end_dt.year, end_dt.month, end_dt.day) + \ relativedelta(days=+1) self['DTSTART'] = vDate(start_date) if end_date != start_date: self['DTEND'] = vDate(end_date) else: self['DTSTART'] = vDatetime(start_dt.astimezone(UTC)) self['DTEND'] = vDatetime(end_dt.astimezone(UTC)) rrule_string = occurrence.get_recurrence() if rrule_string is not None: self['RRULE'] = rrule_string location = occurrence.get_location() if location: self['LOCATION'] = vText(location) # Generic properties self['URL'] = info.url self['UID'] = info.uid() self['SUMMARY'] = vText(info.summary) if info.created: self['CREATED'] = vDatetime(info.created) if info.last_modified: self['LAST-MODIFIED'] = vDatetime(info.last_modified) if info.description: self['DESCRIPTION'] = vText(info.description)
def lesson_as_ical_event(lesson, lesson_date, timetable): event = Event() event.add('uuid', lesson_uuid(lesson)) event.add('summary', lesson.subject) addr = vCalAddress('MAILTO:[email protected]') addr.params['CN'] = lesson.tutor.encode('utf-8') event['organizer'] = addr event.add('location', lesson.auditory) event.add('rrule', vRecur({'freq': 'WEEKLY', 'interval': 2})) start_time = timetable.start(lesson.number) end_time = timetable.end(lesson.number) event['dtstart'] = vDatetime( datetime(lesson_date.year, lesson_date.month, lesson_date.day, start_time.hour, start_time.minute, tzinfo=start_time.tzinfo)) event['dtend'] = vDatetime( datetime(lesson_date.year, lesson_date.month, lesson_date.day, end_time.hour, end_time.minute, tzinfo=end_time.tzinfo)) return event
def set_caldav_event(self, ics_file, partner): for event in Calendar.from_ical(ics_file).walk('vevent'): summary = '' description = unicode(event.get('description', '')) if unicode(event.get('summary')) and len(unicode(event.get('summary'))) < 35: summary = unicode(event.get('summary')) elif len(unicode(event.get('summary'))) >= 35: summary = unicode(event.get('summary'))[:35] if not event.get('description'): description = unicode(event.get('summary')) record = {r[1]:r[2] for r in [ ('dtstart','start_date',event.get('dtstart') and event.get('dtstart').dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)), ('dtend','stop_date',event.get('dtend') and event.get('dtend').dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)), ('duration','duration',event.get('duration')), ('location','location',event.get('location') and unicode(event.get('location')) or None), #~ ('class','class',event.get('class') and str(event.get('class')) or 'private'), ('summary','name',summary), ('rrule', 'rrule',event.get('rrule') and event.get('rrule').to_ical() or None), ] if event.get(r[0])} partner_ids = self.env['res.partner'].get_caldav_attendee_ids(event) if partner_ids: partner_ids.append(partner.id) else: partner_ids = [partner.id] record['partner_ids'] = [(6,0,[partner_ids])] #~ record['ics_subscription'] = True record['start'] = record.get('start_date') record['stop'] = record.get('stop_date') or record.get('start') record['description'] = description record['show_as'] = 'busy' record['allday'] = False tmpStart = datetime.time(datetime.fromtimestamp(mktime(strptime(record['start'], DEFAULT_SERVER_DATETIME_FORMAT)))) tmpStop = datetime.fromtimestamp(mktime(strptime(record['stop'], DEFAULT_SERVER_DATETIME_FORMAT))) if tmpStart == time(0,0,0) and tmpStart == datetime.time(tmpStop): record['allday'] = True if not record.get('stop_date'): record['allday'] = True record['stop_date'] = record['start_date'] elif record.get('stop_date') and record['allday']: record['stop_date'] = vDatetime(tmpStop - timedelta(hours=24)).dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT) record['stop'] = record['stop_date'] self.env['calendar.event'].create(record)
def add_event(self, username, uid, event_name, start_timestamp, quantity): """ Adds a new event with the given parameters in a given username calendar. :param username: username of the calendar to insert the event. :param uid: UID tha identifies the event in the calendar. :param event_name: Event name. :param start_timestamp: The date where the event are scheduled. :param quantity: The quantity reserved. :return: Keyword 'OK' """ cal = Calendar() cal['version'] = "2.0" cal['prodid'] = "//Radicale//NONSGML Radicale Server//EN" event = Event() event['uid'] = uid event['dtstart'] = vDatetime(datetime.fromtimestamp(start_timestamp)).to_ical() event['summary'] = event_name event['description'] = 'Quantity: ' + str(quantity) event['x-radicale-name'] = str(uid) + '.ics' cal.add_component(event) # vcal = """BEGIN:VCALENDAR # VERSION:2.0 # PRODID:-//Example Corp.//CalDAV Client//EN # BEGIN:VEVENT # UID:0123456 # DTSTAMP:20151101T182145Z # DTSTART:20151101T170000Z # DTEND:20151101T180000Z # SUMMARY:This is an event. # END:VEVENT # END:VCALENDAR # """ print cal.to_ical() headers = {'Content-Type': 'text/calendar', 'charset': 'utf-8', 'if-none-match': '*'} self.client.put(self.url + username + '/calendar.ics/' + str(uid) + '.ics', cal.to_ical(), headers) return 'OK'