def __add_event(name, times, location, teacher, student_id): event = Event() event.add('transp', 'TRANSPARENT') summary = name if location != 'None': summary = name + '@' + location event.add('location', location) description = times[4] + times[5] if teacher != 'None': description += '\n教师:' + teacher + '\n' description += '由 EveryClass (http://every.admirable.one) 导入' event.add('summary', summary) event.add('description', description) event.add('dtstart', times[0]) event.add('dtend', times[1]) event.add('last-modified', datetime.now()) event['uid'] = 'ec-CSU' + student_id + 't' + datetime.now().strftime( '%y%m%d%H%M%S%f') + '@admirable.one' event.add('rrule', { 'freq': 'weekly', 'interval': times[2], 'until': times[3] }) alarm = Alarm() alarm.add('action', 'none') alarm.add('trigger', datetime(1980, 1, 1, 3, 5, 0)) event.add_component(alarm) return event
def AddAlarm(event, desc, minutesBefore): alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('DESCRIPTION', desc) dur = icalendar.vDuration(datetime.timedelta(0, 0, 0, 0, -minutesBefore)) alarm.add('TRIGGER', dur) event.add_component(alarm)
def computeIcsCalendar(P, ics_file_name): P.ics_calendar = Calendar() for d in range(1, MAX_SZ - 1): [y, m, dt, t] = swe.revjul(P.jd_start + d - 1) if len(P.festivals[d]) > 0: # Eliminate repeat festivals on the same day, and keep the list arbitrarily sorted P.festivals[d] = sorted(list(set(P.festivals[d]))) summary_text = P.festivals[d] # this will work whether we have one or more events on the same day for stext in summary_text: if not stext.find('>>') == -1: # It's an event, with a start and end time event = Event() [stext, t1, arrow, t2] = stext.split('|') event.add('summary', stext.split('|')[-1].replace('-', ' ').strip()) h1, m1 = t1.split(':') h2, m2 = t2.split(':') event.add( 'dtstart', datetime(y, m, dt, int(h1), int(m1), tzinfo=tz(P.city.timezone))) event.add( 'dtend', datetime(y, m, dt, int(h2), int(m2), tzinfo=tz(P.city.timezone))) P.ics_calendar.add_component(event) else: event = Event() # summary = re.sub('{(.*)}','\\1', ) # strip braces around numbers event.add('summary', stext.replace('-', ' ')) event.add('dtstart', date(y, m, dt)) event.add('dtend', (datetime(y, m, dt) + timedelta(1)).date()) alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('trigger', timedelta(hours=-4)) event.add_component(alarm) event['X-MICROSOFT-CDO-ALLDAYEVENT'] = 'TRUE' event['TRANSP'] = 'TRANSPARENT' event['X-MICROSOFT-CDO-BUSYSTATUS'] = 'FREE' P.ics_calendar.add_component(event) if m == 12 and dt == 31: break with open(ics_file_name, 'wb') as ics_calendar_file: ics_calendar_file.write(P.ics_calendar.to_ical())
def generate_ical(): """generate ics file""" cal = Calendar() cal['version'] = '2.0' cal['prodid'] = '-//Simon Fraser University//Svenja Cao//EN' for class_item in classes: for lesson in class_item['lessons']: start_date = data.datelize(lesson['start_date']) start_time = data.timelize(lesson['start_time']) end_time = data.timelize(lesson['end_time']) start = data.time_zone(datetime.combine(start_date, start_time)) # class start datetime end = data.time_zone(datetime.combine(start_date, end_time)) # class end datetime end_date = data.datelize(lesson['end_date']) until = datetime.combine(end_date, end_time) # recurrence end datetime for day in lesson['days']: event = Event() if lesson['start_date'] == lesson['end_date']: # the lesson with same start and end date is the Exam event.add('summary', class_item['name'] + ' Exam') else: event.add('summary', class_item['name'] + ' ' + class_item['component']) event.add('dtstart', start) event.add('dtend', end) event.add('rrule', {'freq': 'weekly', 'byday': day, 'until': until, 'wkst': 'SU'}) # byday doesn't support list for now event.add('location', lesson['location']) description = 'Description: ' + class_item['description'] + '\nSection: ' + class_item['section'] if 'instructor' in lesson: # the Final has no instructor description = 'Instructor: ' + lesson['instructor'] + '\n' + description event.add('description', description) if start_date.weekday() == data.weekdays[day]: # if a course has class on first day, the first day won't be ignored # see weekdays{} exdates = [] else: exdates = [start] for holiday in data.holidays[year]: exdates.append(datetime.combine(holiday, start_time)) event.add('exdate', exdates) if alert and unicode(alert).isnumeric(): alarm = Alarm() alarm.add('action', 'DISPLAY') alert_time = timedelta(minutes=-int(alert)) alarm.add('trigger', alert_time) event.add_component(alarm) event['uid'] = str(uuid1()) + '@SFU' cal.add_component(event) return cal.to_ical()
def generate_event(subject: str, payment_date: datetime.date) -> Event: evt = Event() evt.add("summary", subject) notification_time = datetime.time(11, 0) payment_datetime = datetime.datetime.combine(payment_date, notification_time) evt.add("dtstart", payment_datetime) evt.add("dtend", payment_datetime + datetime.timedelta(hours=1)) evt.add("dtstamp", datetime.datetime.now()) alarm = Alarm() alarm.add("trigger", datetime.timedelta(minutes=0)) evt.add_component(alarm) return evt
def genCalendarFromEventsFile( events_file, cal_file ): try: events = SimpleEvents( events_file ) cal = Calendar() cal.add('prodid', '-//calgen.py//xmpp.org//') cal.add('version', '2.0') day = timedelta(days=1) for ev in events.getEventList(): event = Event() if "date" in ev: ev["date"] = ev["date"].rstrip("Z") if "all-day" in ev: start = datetime.strptime(ev["date"], "%Y-%m-%d") # T%H:%M:%S event.add('dtstart', start.date()) event.add('dtend', (start + day).date()) event.add("dtstamp", (start + day).date()) else: start = datetime.strptime(ev["date"], "%Y-%m-%dT%H:%M:%S") start = start.replace(tzinfo=UTC) duration = timedelta(minutes=int(ev["duration"])) event.add('dtstart', start) event.add('dtend', (start + duration)) event.add("dtstamp", (start + duration)) if "alarm" in ev: alarm = Alarm() alarm_time = datetime.strptime(ev["date"], "%Y-%m-%dT%H:%M:%S") alarm_time = alarm_time.replace(tzinfo=UTC) alarm_time = alarm_time - timedelta(minutes=15) alarm.add("trigger", alarm_time) alarm.add("action", "display") event.add_component(alarm) if "summary" in ev: event.add('summary', ev["summary"]) if "description" in ev: event.add('description', ev["description"]) if "url" in ev: event.add('url', ev["url"]) cal.add_component(event) allevents.append(event) f = open( cal_file , 'wb') f.write(cal.as_string()) f.close() except: print "File not found! - " + events_file print "Unexpected error:", sys.exc_info()[0] traceback.print_exc(file=sys.stdout)
def genCalendarFromEventsFile(events_file, cal_file): try: events = SimpleEvents(events_file) cal = Calendar() cal.add('prodid', '-//calgen.py//xmpp.org//') cal.add('version', '2.0') day = timedelta(days=1) for ev in events.getEventList(): event = Event() if "date" in ev: ev["date"] = ev["date"].rstrip("Z") if "all-day" in ev: start = datetime.strptime(ev["date"], "%Y-%m-%d") # T%H:%M:%S event.add('dtstart', start.date()) event.add('dtend', (start + day).date()) event.add("dtstamp", (start + day).date()) else: start = datetime.strptime(ev["date"], "%Y-%m-%dT%H:%M:%S") start = start.replace(tzinfo=UTC) duration = timedelta(minutes=int(ev["duration"])) event.add('dtstart', start) event.add('dtend', (start + duration)) event.add("dtstamp", (start + duration)) if "alarm" in ev: alarm = Alarm() alarm_time = datetime.strptime(ev["date"], "%Y-%m-%dT%H:%M:%S") alarm_time = alarm_time.replace(tzinfo=UTC) alarm_time = alarm_time - timedelta(minutes=15) alarm.add("trigger", alarm_time) alarm.add("action", "display") event.add_component(alarm) if "summary" in ev: event.add('summary', ev["summary"]) if "description" in ev: event.add('description', ev["description"]) if "url" in ev: event.add('url', ev["url"]) cal.add_component(event) allevents.append(event) f = open(cal_file, 'wb') f.write(cal.as_string()) f.close() except: print "File not found! - " + events_file print "Unexpected error:", sys.exc_info()[0] traceback.print_exc(file=sys.stdout)
def html_to_ical(html_string): """Convert an html string from the pointstreak website to ical format Args: html_string - String representing the entire pointstreak schedule page Returns: Calendar object representing schedule """ tree = html.fromstring(html_string) team = tree.xpath("//title")[0].text_content().split('-')[0].strip() schedule_tables = tree.xpath("//table/tr/td[contains(.,'Team Schedule')]") # First match is the table that contains all tables, second is the header in a td schedule_table = schedule_tables[1].getparent().getparent().getnext() # Get home v away, date, time, rink now = datetime.now() calendar = Calendar() calendar.add('x-wr-calname', 'Schedule for %s' % (team)) for row in schedule_table.iter('tr'): try: #print etree.tostring(row) rink = row[4].text_content() if rink.startswith('final'): # Game is already played continue rink = rink.strip() home = row[0].text_content() away = row[1].text_content() date_str = ' '.join( [row[2].text_content(), row[3].text_content(), str(now.year)]) tstamp = datetime.strptime(date_str, "%a, %b %d %I:%M %p %Y") # For whatever reason, the year is never printed if tstamp < now: tstamp.replace(year=tstamp.year + 1) uid = tstamp.strftime('%Y%m%d%H%M') + '@pugswald.com' event = Event() event.add('uid', uid) event.add('dtstart', tstamp) event.add('summary', 'Hockey game %s vs %s' % (home, away)) event.add('dtend', tstamp + timedelta(minutes=90)) event.add('location', rink) alarm = Alarm() alarm.add('action', 'AUDIO') alarm.add('trigger', timedelta(minutes=-60)) event.add_component(alarm) calendar.add_component(event) except: #print sys.exc_info() pass # This block is not good data return calendar
def create_event(self, summary, description, start): """Create a 30 minute calendar event without a reminder""" event = Event() no_alarm = Alarm() event.add('summary', summary) event.add('description', description) event.add('dtstart', start) event.add('dtend', start + relativedelta(minutes=30)) event.add('dtstamp', start) # event.add('location', location) no_alarm.add('action', 'NONE') no_alarm.add('trigger', start - relativedelta( years=1)) # Set an alarm date before the event to remove reminder event.add_component(no_alarm) self.cal.add_component(event)
def create_alarm(diff: timedelta, related: str) -> Alarm: """ Return a new alarm Args: diff (timedelta): The delta between the alarm and the start/end of the event related (str): Is the delta related to the START or the END of the event Returns: Alarm: The Alarm itself """ alarm = Alarm() alarm.add('ACTION', 'DISPLAY') alarm.add('TRIGGER', diff, parameters={'RELATED': related}) return alarm
def genIcal(event): from icalendar import Calendar, Event, Alarm #get details from event instance title = event.title desc = event.title duration = 3 start = datetime.combine(event.when, event.time) end = datetime.combine(event.when, event.time) + timedelta(hours=duration) location = event.location # Timezone to use for our dates - change as needed reminderHours = 3 cal = Calendar() cal.add('prodid', '-//APERTA calendar application//aperta.lu//') cal.add('version', '2.0') cal.add('method', "REQUEST") vevent = Event() # event.add('attendee', self.getEmail()) vevent.add('organizer', settings.EMAILS['sender']['default']) vevent.add('status', "confirmed") vevent.add('category', "Event") vevent.add('summary', title) vevent.add('description', desc) vevent.add('location', location) vevent.add('dtstart', start) vevent.add('dtend', end) from attendance.functions import gen_hash vevent['uid'] = gen_hash(event,settings.EMAILS['sender']['default'])[:10] # Generate some unique ID vevent.add('priority', 5) vevent.add('sequence', 1) vevent.add('created', timezone.now()) alarm = Alarm() alarm.add("action", "DISPLAY") alarm.add('description', "Reminder") alarm.add("trigger", timedelta(hours=-reminderHours)) # The only way to convince Outlook to do it correctly alarm.add("TRIGGER;RELATED=START", "-PT{0}H".format(reminderHours)) vevent.add_component(alarm) cal.add_component(vevent) #gen file to be attached to an email from email import MIMEBase, Encoders filename = "invite.ics" invite = MIMEBase.MIMEBase('text', "calendar", method="REQUEST", name=filename) invite.set_payload( cal.to_ical() ) Encoders.encode_base64(invite) invite.add_header('Content-Description', desc) invite.add_header("Content-class", "urn:content-classes:calendarmessage") invite.add_header("Filename", filename) invite.add_header("Path", filename) return invite
def getiCalFromEventlist(self, eventlist, alarm): cal = Calendar() cal.add('prodid', 'trashpyle') cal.add('version', '0.1') for event in eventlist: icalevent = Event() icalevent.add('dtstart', event[0]) icalevent.add('dtend', event[0] + timedelta(days=1)) icalevent.add('summary', self.getNameStringFromTrashType(event[1])) if alarm != '': alarmtime = timedelta(minutes=-int(alarm)) icalalarm = Alarm() icalalarm.add('action','DISPLAY') icalalarm.add('trigger',alarmtime) icalevent.add_component(icalalarm) cal.add_component(icalevent) return cal.to_ical()
def create_timetable_ical(semester: Semester, lectures: List[Lecture], language: str): is_english = language and ("en" in language) timezone = pytz.timezone("Asia/Seoul") calendar = Calendar() calendar.add("prodid", "-//SPARCS//OTL Plus//") calendar.add("version", "2.0") calendar.add("x-wr-timezone", timezone) title = f"[OTL] {semester.get_name(language='en').title()}" calendar.add("summary", title) calendar.add("x-wr-calname", title) for l in lectures: for ct in l.classtimes.all(): event = Event() event.add("summary", l.title if not is_english else l.title_en) event.add( "location", ct.get_classroom_strs()[2] if not is_english else ct.get_classroom_strs()[3]) days_ahead = ct.day - semester.beginning.weekday() if days_ahead < 0: days_ahead += 7 first_class_date = semester.beginning + datetime.timedelta( days=days_ahead) event.add( "dtstart", datetime.datetime.combine(first_class_date, ct.begin, timezone)) event.add( "dtend", datetime.datetime.combine(first_class_date, ct.end, timezone)) event.add("rrule", {"freq": "weekly", "until": semester.end}) alarm = Alarm() alarm.add("action", "DISPLAY") alarm.add("trigger", datetime.timedelta(minutes=-15)) event.add_component(alarm) calendar.add_component(event) return calendar
def __add_event(name, times, location, teacher, student_id, day, time): """ 把 `Event` 对象添加到 `calendar` 对象中 :param name: 课程名 :param times: 开始和结束时间 :param location: 课程地点 :param teacher: 任课教师 :param student_id: 学号 :return: `Event` 对象 """ event = Event() event.add('transp', 'TRANSPARENT') summary = name if location != 'None': summary = name + '@' + location event.add('location', location) description = times[4] + times[5] if teacher != 'None': description += '\n教师:' + teacher + '\n' description += '由 EveryClass 每课 (https://everyclass.xyz) 导入' event.add('summary', summary) event.add('description', description) event.add('dtstart', times[0]) event.add('dtend', times[1]) event.add('last-modified', datetime.now()) # day、time、课程名、老师、周次、地点所有元素才能组成一组超码,因此用它们字符串拼接得到的 MD5 作为唯一识别码 event_sk = str(day) + '-' + str( time ) + '-' + name + '-' + teacher + '-' + times[4] + times[5] + '-' + location event['uid'] = hashlib.md5( event_sk.encode('utf-8')).hexdigest() + '@everyclass.xyz' event.add('rrule', { 'freq': 'weekly', 'interval': times[2], 'until': times[3] }) alarm = Alarm() alarm.add('action', 'none') alarm.add('trigger', datetime(1980, 1, 1, 3, 5, 0)) event.add_component(alarm) return event
def __getiCalFromEventlist(self, eventlist, alarm): cal = Calendar() cal.add('prodid', 'libhbtrash') cal.add('version', '0.1') for event in eventlist: icalevent = Event() icalevent.add('dtstart', event[0]) icalevent.add('dtend', event[0] + timedelta(days=1)) icalevent.add('summary', str(event[1])) if alarm != '': alarmtime = timedelta(minutes=-int(alarm)) icalalarm = Alarm() icalalarm.add('action','DISPLAY') icalalarm.add('trigger',alarmtime) icalevent.add_component(icalalarm) cal.add_component(icalevent) cal = cal.to_ical() cal = cal.decode("utf-8") return cal
def __getiCalFromEventlist(self, eventlist, alarm): cal = Calendar() cal.add('prodid', 'libhbtrash') cal.add('version', '0.1') for event in eventlist: icalevent = Event() icalevent.add('dtstart', event[0]) icalevent.add('dtend', event[0] + timedelta(days=1)) icalevent.add('summary', str(event[1])) if alarm != '': alarmtime = timedelta(minutes=-int(alarm)) icalalarm = Alarm() icalalarm.add('action', 'DISPLAY') icalalarm.add('trigger', alarmtime) icalevent.add_component(icalalarm) cal.add_component(icalevent) cal = cal.to_ical() cal = cal.decode("utf-8") return cal
def process_xls(filename): wb = xlrd.open_workbook(filename) sheet = wb.sheet_by_index(0) calendar = Calendar() calendar.add('x-wr-calname', 'Schedule for U8 Adv Winter Hockey 2015') for irow in range(sheet.nrows): row = sheet.row(irow) evt_desc = None if row[0].value == "U8 Advanced": evt_desc = row[0].value if row[1].value == "Group 1" or row[1].value == "Group 2": evt_desc = row[1].value if evt_desc is None: continue basedate = xlrd.xldate_as_tuple(row[3].value, wb.datemode) basedt = list(basedate[:3]) + get_hhmm(row[4].value) tstamp = datetime(*basedt) basedt_end = list(basedate[:3]) + get_hhmm(row[5].value) tstamp_end = datetime(*basedt_end) uid = tstamp.strftime('%Y%m%d%H%M') + '@pugswald.com' event = Event() event.add('uid', uid) event.add('dtstart', tstamp) event.add('summary', 'AYHL Hockey - %s' % evt_desc) event.add('dtend', tstamp_end) event.add('location', row[6].value) alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('description', 'Reminder') alarm.add('trigger', timedelta(minutes=-45)) event.add_component(alarm) calendar.add_component(event) print calendar.to_ical()
def write_calendar(summary: str, start: datetime, end: datetime, description: str, location: str, oponent_info: str): calname = "ltc-herren1-" + datetime.strftime(start, "%Y%m%d") + ".ics" t_cal = Calendar() t_cal.add('prodid', '-//LTC Herren 1 Kalender//ltc-scraper.py by Bartosz Swiatek//') t_cal.add('version', '2.0') t_cal.add('method', 'request') event = Event() event.add('uid', uuid.uuid4().hex) event.add('summary', summary) event.add('dtstart', start) event.add('dtend', end) event.add('description', description) event.add('last-modified', datetime.now()) event.add('dtstamp', datetime.now()) event.add('location', location) event.add('comment', oponent_info) alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('TRIGGER;RELATED=START', '-P1D') alarm.add('description', 'Erinnerung zum Punktspiel') event.add_component(alarm) t_cal.add_component(event) cal.add_component(event) cwd = os.getcwd() f = open(os.path.join(cwd, calname), 'wb') f.write(t_cal.to_ical()) f.close() del alarm del event del t_cal
def _build_event(course_name: str, times: Tuple[datetime, datetime], classroom: str, teacher: str, current_week: int, week_string: str, cid: str) -> Event: """ 生成 `Event` 对象 :param course_name: 课程名 :param times: 开始和结束时间 :param classroom: 课程地点 :param teacher: 任课教师 :return: `Event` 对象 """ event = Event() event.add('transp', 'TRANSPARENT') summary = course_name if classroom != 'None': summary = course_name + '@' + classroom event.add('location', classroom) description = week_string if teacher != 'None': description += '\n教师:' + teacher description += '\n由 EveryClass 每课 (https://everyclass.xyz) 导入' event.add('summary', summary) event.add('description', description) event.add('dtstart', times[0]) event.add('dtend', times[1]) event.add('last-modified', datetime.now()) # 使用"cid-当前周"作为事件的超码 event_sk = cid + '-' + str(current_week) event['uid'] = hashlib.md5( event_sk.encode('utf-8')).hexdigest() + '@everyclass.xyz' alarm = Alarm() alarm.add('action', 'none') alarm.add('trigger', datetime(1980, 1, 1, 3, 5, 0)) event.add_component(alarm) return event
def writeICS(format_time_list, row): f_year = int(format_time_list[0]) f_month = int(format_time_list[1]) f_day = int(format_time_list[2]) # Event Docs: # https://www.kanzaki.com/docs/ical/ event = Event() alarm = Alarm() alarm.add("description", "This is an event reminder") alarm.add("action", "DISPLAY") alarm.add("trigger", timedelta(minutes=-10)) event.add("rrule", {"freq": "yearly"}) event.add("summary", row["Name"]) event.add("dtstart", datetime(f_year, f_month, f_day, alert_begin, 0, 0, tzinfo=UTC)) event.add("dtend", datetime(f_year, f_month, f_day, alert_end, 0, 0, tzinfo=UTC)) event.add("dtstamp", datetime.now()) # unique ID event["uid"] = str( datetime(f_year, f_month, f_day, alert_begin, 0, 0, tzinfo=UTC)) + row["Name"] event.add("priority", 5) event.add_component(alarm) cal.add_component(event) f = open(ics_export_file, "wb") f.write(cal.to_ical()) f.close()
def process_xls(filename): wb = xlrd.open_workbook(filename) sheet = wb.sheet_by_index(0) calendar = Calendar() calendar.add('x-wr-calname','Schedule for U8 Summer Hockey 2015') for irow in range(sheet.nrows): row = sheet.row(irow) basedate = xlrd.xldate_as_tuple(row[1].value, wb.datemode) (hh, mmxx) = row[3].value.split(':') hh = int(hh) mm = int(mmxx[:2]) xx = mmxx[2:] if xx == 'PM': hh += 12 basedt = list(basedate[:3]) + [hh, mm] tstamp = datetime(*basedt) uid = tstamp.strftime('%Y%m%d%H%M')+'@pugswald.com' event = Event() event.add('uid', uid) event.add('dtstart', tstamp) event.add('summary', 'AYHL U8 Hockey %s'%row[2].value) event.add('dtend', tstamp + timedelta(minutes=60)) event.add('location', row[5].value) alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('description', 'Reminder') alarm.add('trigger', timedelta(minutes=-45)) event.add_component(alarm) calendar.add_component(event) print calendar.to_ical()
def addreminder(): form = IcsForm() content = render_template('index.html', form=form) file = form.icsfile.data if not file: return content hours = form.hours.data minutes = form.minutes.data try: calendar = Calendar.from_ical(file.read()) except ValueError: error = 'can\'t read file' return render_template('index.html', form=form, error=error) for component in calendar.walk('VEVENT'): valarm_found = False for k, v in component.property_items(): if k == 'BEGIN' and v == 'VALARM': valarm_found = True if not valarm_found: alarm = Alarm() alarm.add('ACTION', 'DISPLAY') alarm.add('DESCRIPTION', component.get('SUMMARY')) alarm.add('TRIGGER;VALUE=DURATION', '-PT%dH%dM' % (hours, minutes)) component.add_component(alarm) new_ics = tempfile.TemporaryFile() new_ics.write(calendar.to_ical()) new_ics.seek(0) new_filename = file.filename.rstrip('.ics') + '_with_reminders' + '.ics' return send_file(new_ics, as_attachment=True, attachment_filename=new_filename)
def _create_event(self, match): """ Creates a calendar event for the given match :paran match: A Match object holding the match data """ # print(self.team_data) # print(team_data) event = Event() event["uid"] = match.id() event["location"] = match.location event.add("priority", 5) event.add("summary", match.summary()) event.add("description", str(match)) event.add("dtstart", match.match_start) event.add("dtend", match.match_end) event.add("dtstamp", datetime.utcnow()) alarm = Alarm() alarm.add("action", "DISPLAY") alarm.add("description", "Reminder") alarm.add("trigger", timedelta(hours=-1)) event.add_component(alarm) return event
def process_xls(filename): wb = xlrd.open_workbook(filename) sheet = wb.sheet_by_index(0) calendar = Calendar() calendar.add('x-wr-calname','Schedule for U8 Adv Winter Hockey 2015') for irow in range(sheet.nrows): row = sheet.row(irow) evt_desc = None if row[0].value == "U8 Advanced": evt_desc = row[0].value if row[1].value == "Group 1" or row[1].value == "Group 2": evt_desc = row[1].value if evt_desc is None: continue basedate = xlrd.xldate_as_tuple(row[3].value, wb.datemode) basedt = list(basedate[:3]) + get_hhmm(row[4].value) tstamp = datetime(*basedt) basedt_end = list(basedate[:3]) + get_hhmm(row[5].value) tstamp_end = datetime(*basedt_end) uid = tstamp.strftime('%Y%m%d%H%M')+'@pugswald.com' event = Event() event.add('uid', uid) event.add('dtstart', tstamp) event.add('summary', 'AYHL Hockey - %s'%evt_desc) event.add('dtend', tstamp_end) event.add('location', row[6].value) alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('description', 'Reminder') alarm.add('trigger', timedelta(minutes=-45)) event.add_component(alarm) calendar.add_component(event) print calendar.to_ical()
def callback4(): make_ical_file.config(state="disabled") cal = Calendar() cal.add('prodid', '-//My calendar product//mxm.dk//') cal.add('version', '2.0') event = Event() last_day_date_selected_begin = last_day_date_selected + "/16/30" last_day_date_selected_end = last_day_date_selected + "/17/00" event.add('summary', last_day_selected + ": " + case_var.get()) event.add( 'dtstart', datetime.datetime.strptime(last_day_date_selected_begin, '%m/%d/%Y/%H/%M')) event.add( 'dtend', datetime.datetime.strptime(last_day_date_selected_end, '%m/%d/%Y/%H/%M')) alarm = Alarm() alarm.add("action", "DISPLAY") alarm.add("description", "Reminder") alarm.add("TRIGGER;RELATED=START", "-PT{0}H".format(24)) event.add_component(alarm) cal.add_component(event) m = os.path.join(os.path.expanduser('~'), 'Desktop', "Last Day.ics") with open(m, 'wb') as f: f.write(cal.to_ical()) f.close() quit_button = tk.Button(root, text="Quit", command=quit_widget) quit_button.grid(row=21, column=1)
def createAnIcs(self, title, starttime, endtime, place): ''' title:日历的标题 start:日历的开始时间 endtime:日历持续的时间 place:地点 ''' cal = Calendar() cal['version'] = '2.0' cal['prodid'] = '-//Apple Inc.//Mac OS X 10.13.6//EN' event = Event() alarm = Alarm() #ev_start_date = startdate #ev_start_datetime = datetime.combine(ev_start_date,starttime) ev_start_datetime = starttime #ev_last_relative_delta = relativedelta(lasttime[0],lasttime[1]) #ev_end_datetime = ev_start_date + ev_last_relative_delta ev_end_datetime = endtime event.add('uid', str(uuid1()) + '@COUT') event.add('summary', title) event.add('dtstamp', datetime.now()) event.add('dtstart', ev_start_datetime) event.add('dtend', ev_end_datetime) event.add('location', place) alarm.add('TRIGGER', ev_start_datetime) alarm.add('action', 'DISPLAY') event.add_component(alarm) ''' BEGIN:VALARM TRIGGER:-PT15M ACTION:DISPLAY END:VALARM ''' cal.add_component(event) with open("记忆事件.ics", "w+") as file: file.write(cal.to_ical().decode('utf-8'.replace('\r\n', '\n').strip())) file.close()
def process_xls(filename): wb = xlrd.open_workbook(filename) sheet = wb.sheet_by_index(0) calendar = Calendar() calendar.add('x-wr-calname', 'Schedule for U8 Summer Hockey 2015') for irow in range(sheet.nrows): row = sheet.row(irow) basedate = xlrd.xldate_as_tuple(row[1].value, wb.datemode) (hh, mmxx) = row[3].value.split(':') hh = int(hh) mm = int(mmxx[:2]) xx = mmxx[2:] if xx == 'PM': hh += 12 basedt = list(basedate[:3]) + [hh, mm] tstamp = datetime(*basedt) uid = tstamp.strftime('%Y%m%d%H%M') + '@pugswald.com' event = Event() event.add('uid', uid) event.add('dtstart', tstamp) event.add('summary', 'AYHL U8 Hockey %s' % row[2].value) event.add('dtend', tstamp + timedelta(minutes=60)) event.add('location', row[5].value) alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('description', 'Reminder') alarm.add('trigger', timedelta(minutes=-45)) event.add_component(alarm) calendar.add_component(event) print calendar.to_ical()
def ical_view(request): from icalendar import Calendar, Event, Alarm start = date.today().replace(day=1) end = start + timedelta(days=365) cal = Calendar() cal.add('prodid', '-//TogetherCal//%s//HE' % request.META['HTTP_HOST']) cal.add('version', '1.0') cal['dtstart'] = start cal['dtend'] = end for occurrence in Occurrence.objects.filter(date__range=(start, end)).iterator(): e = occurrence.get_event_as_subclass() if not isinstance(e, WeeklyActivity): event = Event() event.add('uid', '%d@%s' % (occurrence.pk, request.META['HTTP_HOST'])) event.add('summary', e.title) event.add('dtstamp', occurrence.date) event.add('class', 'PRIVATE') event.add('categories', occurrence.event_class_name()) alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('description', e.title) alarm.add('trigger', timedelta(hours=-1)) event.add_component(alarm) cal.add_component(event) response = HttpResponse(cal.to_ical(), content_type='text/calendar') response['Content-Disposition'] = 'filename="family.ics"' return response
def ics(request, team_id=None, team_name=None): if team_id: this_team = Team.objects.get(id=team_id) elif team_name: this_team = Team.objects.get(name=team_name) home_games = Game.objects.filter(home_team=this_team) away_games = Game.objects.filter(away_team=this_team) games = home_games | away_games games = games.order_by("time", "field") cal = Calendar() cal.add('prodid', '-//Breakway Schedules//Soccer Calendars//EN') cal.add('version', '2.0') cal.add('X-WR-CALNAME', this_team.name) cal.add('X-WR-TIMEZONE', 'CST6CDT') cal.add('X-WR-CALDESC', 'Breakaway Team Schedule') now_dt = datetime.now() now_string = "%04d%02d%02dT%02d%02d%02d" % ( now_dt.year, now_dt.month, now_dt.day, now_dt.hour, now_dt.minute, now_dt.second ) for game in games: event = Event() try: summary = '%s vs. %s' % (game.home_team, game.away_team) except Exception: summary = 'Breakaway game' if game.color_conflict: desc = 'Color conflict! (%s vs. %s)' % (game.away_team.color, game.home_team.color) summary += ' (color conflict)' event.add('description', desc) event.add('summary', summary) event.add('dtstart', game.time) event.add('dtend', game.time + timedelta(hours=1)) event.add('dtstamp', datetime.now()) event.add('location', "BreakAway Field %s" % game.field) event['uid'] = '%s/%[email protected]' % (now_string, shortuuid.uuid()) event.add('priority', 5) alarm = Alarm() alarm.add("TRIGGER;RELATED=START", "-PT{0}M".format('45')) alarm.add('action', 'display') alarm.add('description', 'Breakaway game') event.add_component(alarm) cal.add_component(event) return HttpResponse(cal.to_ical(), content_type='text/calendar')
def create_alarm(message, relative_timedelta): alarm = Alarm() alarm.add('ACTION', 'DISPLAY') alarm.add('DESCRIPTION', message) #print(relative_timedelta); alarm.add('TRIGGER', relative_timedelta, parameters={'VALUE':'DURATION'}) return alarm
def festival_instance_to_event(festival_instance, scripts, panchaanga, all_day=False): rules_collection = rules.RulesCollection.get_cached( repos_tuple=tuple(panchaanga.computation_system.options.fest_repos)) fest_details_dict = rules_collection.name_to_rule fest_name = festival_instance.get_best_transliterated_name( scripts=scripts, fest_details_dict=rules_collection.name_to_rule)["text"].replace( "~", " ") event = Event() event.add('summary', fest_name) desc = get_description(festival_instance=festival_instance, script=scripts[0], fest_details_dict=fest_details_dict) event.add('description', desc.strip().replace('\n', '<br/>')) if festival_instance.interval is not None and festival_instance.interval.jd_end is not None and festival_instance.interval.jd_start is not None: # Starting or ending time is empty, e.g. harivasara, so no ICS entry t1 = panchaanga.city.get_timezone_obj().julian_day_to_local_time( julian_day=festival_instance.interval.jd_start) t2 = panchaanga.city.get_timezone_obj().julian_day_to_local_time( julian_day=festival_instance.interval.jd_end) # we know that t1 is something like 'textsf{hh:mm(+1)}{' # so we know the exact positions of min and hour event.add('dtstart', t1.to_datetime()) event.add('dtend', t2.to_datetime()) if all_day: event['X-MICROSOFT-CDO-ALLDAYEVENT'] = 'TRUE' event['TRANSP'] = 'TRANSPARENT' event['X-MICROSOFT-CDO-BUSYSTATUS'] = 'FREE' alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('trigger', timedelta(hours=-4)) # default alarm, with a 4 hour reminder event.add_component(alarm) return event
def writeDailyICS(panchaanga, script=sanscript.DEVANAGARI): """Write out the panchaanga TeX using a specified template """ compute_lagnams = panchaanga.computation_system.festival_options.set_lagnas samvatsara_id = (panchaanga.year - 1568) % 60 + 1 # distance from prabhava samvatsara_names = ( names.NAMES['SAMVATSARA_NAMES']['sa'][script][samvatsara_id], names.NAMES['SAMVATSARA_NAMES']['sa'][script][(samvatsara_id % 60) + 1]) yname_solar = samvatsara_names[0] # Assign year name until Mesha Sankranti yname_lunar = samvatsara_names[0] # Assign year name until Mesha Sankranti ics_calendar = Calendar() alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('trigger', timedelta(hours=-4)) # default alarm, with a 4 hour reminder daily_panchaangas = panchaanga.daily_panchaangas_sorted() for d, daily_panchaanga in enumerate(daily_panchaangas): if daily_panchaanga.date < panchaanga.start_date or daily_panchaanga.date > panchaanga.end_date: continue if daily_panchaanga.solar_sidereal_date_sunset.month == 1: # Flip the year name for the remaining days yname_solar = samvatsara_names[1] if daily_panchaanga.lunar_month_sunrise.index == 1: # Flip the year name for the remaining days yname_lunar = samvatsara_names[1] event = get_day_summary_event(d, panchaanga, script) ics_calendar.add_component(event) return ics_calendar
def session_ical(session): event = Event() event.add('summary', session.title) event.add( 'uid', "/".join([session.proposal_space.name, session.url_name]) + '@' + request.host) event.add( 'dtstart', utc.localize(session.start).astimezone( timezone(session.proposal_space.timezone))) event.add( 'dtend', utc.localize(session.end).astimezone( timezone(session.proposal_space.timezone))) event.add( 'dtstamp', utc.localize(datetime.now()).astimezone( timezone(session.proposal_space.timezone))) event.add( 'created', utc.localize(session.created_at).astimezone( timezone(session.proposal_space.timezone))) event.add( 'last-modified', utc.localize(session.updated_at).astimezone( timezone(session.proposal_space.timezone))) if session.venue_room: location = [ session.venue_room.title + " - " + session.venue_room.venue.title ] if session.venue_room.venue.city: location.append(session.venue_room.venue.city) if session.venue_room.venue.country: location[len(location) - 1] += ", " + session.venue_room.venue.country else: location.append(session.venue_room.venue.country) event.add('location', "\n".join(location)) if session.venue_room.venue.latitude and session.venue_room.venue.longitude: event.add('geo', (session.venue_room.venue.latitude, session.venue_room.venue.longitude)) if session.description_text: event.add('description', session.description_text) if session.proposal: event.add('url', session.url_for(_external=True)) if session.proposal.section: event.add('categories', [session.proposal.section.title]) alarm = Alarm() alarm.add('trigger', timedelta(minutes=-5)) alarm.add('action', 'display') desc = session.title if session.venue_room: desc += " in " + session.venue_room.title desc += " in 5 minutes" alarm.add('description', desc) event.add_component(alarm) return event
def createMemoryEv(self, summary): ''' summary: 标题 提醒复习,1,2,4,8,15,30 ''' _da = [1, 2, 4, 8, 15, 30] cal = Calendar() cal['version'] = '2.0' cal['prodid'] = '-//Apple Inc.//Mac OS X 10.13.6//EN' events = [] for da in _da: event = Event() alarm = Alarm() event.add('uid', str(uuid1()) + '@CQUT') event.add('summary', summary) event.add('dtstamp', datetime.now()) year, month, day = datetime.now().timetuple()[0:3] event.add( 'dtstart', datetime(year, month, day, 23, 0, 0) + relativedelta(days=da - 1)) event.add( 'dtend', datetime(year, month, day, 23, 30, 0) + relativedelta(days=da - 1)) alarm.add( 'TRIGGER', datetime(year, month, day, 22, 57, 0) + relativedelta(days=da - 1)) alarm.add('action', 'DISPLAY') event.add_component(alarm) cal.add_component(event) with open("记忆事件.ics", "w+") as file: file.write(cal.to_ical().decode('utf-8'.replace('\r\n', '\n').strip())) file.close()
def dict2Event(self, item): event = Event() event.add('summary', item['coureName']) event.add( 'location', item['campusName'] + item['teachingBuildingName'] + item['classroomName']) event.add( 'dtstart', self.stDate + datetime.timedelta((self.getStartWeek(item['classWeek']) - 1) * 7 + int(item['classDay'])) + self.getClassTime(str(item['classSessions']))) event.add( 'dtend', self.stDate + datetime.timedelta((self.getStartWeek(item['classWeek']) - 1) * 7 + int(item['classDay'])) + self.getClassTime( str( int(item['classSessions']) + int(item['continuingSession']) - 1)) + datetime.timedelta(minutes=45)) interval = self.getClassInterval(item['classWeek']) event.add( 'description', '课程号: ' + item['coureNumber'] + '\n课序号: ' + item['coureSequenceNumber']) alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('TRIGGER', datetime.timedelta(minutes=-15)) event.add_component(alarm) if interval >= 0: event.add( 'rrule', { 'freq': 'weekly', 'interval': interval, 'count': self.getClassCount(item['classWeek']) }) return event
def json2ical(sdata): """ Convert epresence conferences sdata: conference list in json format (returned from fetch_conf_list) returns a string, the iCal, to be written to a file e.g. """ import json from icalendar import Calendar, Event, Alarm from datetime import datetime import pytz data = json.loads(sdata) if data: cal = Calendar() cal.add('prodid', '-//Gamisterous epresence ical generator//lala.la//') cal.add('version', '3.0') cal.add('X-WR-CALNAME', 'Τηλεδιασκέψεις') local = pytz.timezone("Europe/Athens") for dato in data: confid = dato["cellID"] desc = dato["cellDesc"] start = datetime.strptime( dato["cellStartDate"] + "-" + dato["cellStartTime"], "%d-%m-%Y-%H:%M") end = datetime.strptime( dato["cellStartDate"] + "-" + dato["cellEndTime"], "%d-%m-%Y-%H:%M") now = datetime.now() event = Event() event.add('SUMMARY', desc) event.add('DTSTART', local.localize(start)) event.add('DURATION', end - start) event.add('DTEND', local.localize(end)) event.add('DTSTAMP', datetime.now()) event.add('URL', 'https://new.epresence.grnet.gr') event['UID'] = "conf" + confid + "@conferences" # add a reminder 30m earlier alarm = Alarm() alarm.add("action", "DISPLAY") alarm.add('description', "Reminder") alarm.add("TRIGGER;RELATED=START", "-PT30M") event.add_component(alarm) cal.add_component(event) return cal.to_ical()
def toiCalendar(List_Event): # Entry value has the following structure: it is a LIST!!! # [ event = {'name': '', # 'dstart': '' # 'dtend': '' # 'category': "All day event", # 'infoLink': "", # 'ticketsLink': "", # 'image': ""} # ] cal = Calendar() cal.add('prodid', '-//O2 Arena calendar') cal.add('version', '2.0') organizer = vCalAddress('MAILTO:[email protected]') location = vText('O2 Arena at Ceskomoravska') dtstamp = datetime(2017, 10, 24, 0, 0, 0, tzinfo=pytz.utc) for i in (range(len(List_Event))): event = Event() description = "" print("Elem %i and name %s and datestart %s" % (i, List_Event[i]['name'], List_Event[i]['dtstart'])) # print(List_Event[i]) event.add('dtstart', List_Event[i]['dtstart']) event.add('dtend', List_Event[i]['dtend']) event.add('summary', List_Event[i]['name']) event.add('location', location) event.add('organizer', organizer) event.add('url', List_Event[i]['infoLink']) event.add('geo', '50.104788;14.493774') event.add('dtstamp', dtstamp) event['uid'] = ("%s/%[email protected]" % (dtstamp.now().strftime("%Y%m%d%H%M%S"), i)) print(event['uid']) # if there are NOT tickets left. if (List_Event[i]['TicketsLeft'] == 0): alarm = Alarm() alarm.add("action", "DISPLAY") alarm.add("description", "Reminder") alarm.add("TRIGGER;RELATED=START", "-PT{0}H".format(1)) description = "This event is FULL! " event.add_component(alarm) # print(event) event.add('description', description + List_Event[i]['description']) cal.add_component(event) # print(event) cal_content = cal.to_ical() with open("O2ArenaCalendar.ics", 'wb') as f: f.write(cal_content)
def add_game(cal, game): now_dt = datetime.datetime.now() now_string = "%04d%02d%02dT%02d%02d%02d" % ( now_dt.year, now_dt.month, now_dt.day, now_dt.hour, now_dt.minute, now_dt.second ) event = Event() summary = '%s vs. %s' % (game.home_team, game.away_team) if game.color_conflict: desc = 'Color conflict! ({} vs. {})'.format(game.away_team.color, game.home_team.color) summary += ' (color conflict)' event.add('description', desc) event.add('summary', summary) event.add('dtstart', game.time) event.add('dtend', game.time + datetime.timedelta(hours=1)) event.add('dtstamp', datetime.datetime.now()) event.add('location', "{}".format(game.field.short_name)) event['uid'] = '{}/{}@breakawaysports.com'.format(now_string, shortuuid.uuid()) event.add('priority', 5) alarm = Alarm() alarm.add("TRIGGER;RELATED=START", "-PT{0}M".format('45')) alarm.add('action', 'display') alarm.add('description', 'Breakaway game') if game.color_conflict: alarm.add('description', 'Color Conflict! - bring alternate color') event.add_component(alarm) cal.add_component(event)
def gen_ical(packet): cal = Calendar() cal['version'] = '2.0' cal['prodid'] = '-//Zhejiang University//LIU Gengming+Chen Yuan//ZH' # *mandatory elements* where the prodid can be changed, see RFC 5445 courses = packet[0] exams = packet[1] for course in courses: for lesson in course['lessons']: weeks = lesson['weeks'] for recur in weeks: event = Event() event.add('summary', unify_brackets(course['name'])) offset_days = lesson['day'] - 1 + 7 * (int(recur) - 1) offset = timedelta(days=offset_days) classdate = week_start + offset start = lesson_time[lesson['start']]['start'] end = lesson_time[lesson['end']]['end'] event.add('dtstart', datetime.combine(classdate, start)) event.add('dtend', datetime.combine(classdate, end)) event.add('location', lesson['location']) event.add('description', u'教师:' + course['teacher']) event['uid'] = str(uuid1()) + '@ZJU' cal.add_component(event) for exam in exams: event = Event() event.add('summary', unify_brackets(exam['name']) + u' 考试') event.add('dtstart', exam['start']) event.add('dtend', exam['end']) event.add('location', exam['location'] + ' ' + exam['seat']) event.add('description', u'学分:' + exam['credit']) event['uid'] = str(uuid1()) + '@ZJU' alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('trigger', timedelta(days=-7)) alarm.add('description', u'距离[%s]考试还有一周时间' % unify_brackets(exam['name'])) alarm['uid'] = str(uuid1()) + '@ZJU' event.add_component(alarm) cal.add_component(event) return cal.to_ical()
def session_ical(session): # This function is only called with scheduled sessions. # If for some reason it is used somewhere else and called with an unscheduled session, # this function should fail. if not session.scheduled: raise Exception(u"{0!r} is not scheduled".format(session)) event = Event() event.add('summary', session.title) event.add('uid', "/".join([session.project.name, session.url_name]) + '@' + request.host) event.add('dtstart', utc.localize(session.start).astimezone(session.project.timezone)) event.add('dtend', utc.localize(session.end).astimezone(session.project.timezone)) event.add('dtstamp', utc.localize(datetime.now()).astimezone(session.project.timezone)) event.add('created', utc.localize(session.created_at).astimezone(session.project.timezone)) event.add('last-modified', utc.localize(session.updated_at).astimezone(session.project.timezone)) if session.venue_room: location = [session.venue_room.title + " - " + session.venue_room.venue.title] if session.venue_room.venue.city: location.append(session.venue_room.venue.city) if session.venue_room.venue.country: location[len(location) - 1] += ", " + session.venue_room.venue.country else: location.append(session.venue_room.venue.country) event.add('location', "\n".join(location)) if session.venue_room.venue.latitude and session.venue_room.venue.longitude: event.add('geo', (session.venue_room.venue.latitude, session.venue_room.venue.longitude)) if session.description_text: event.add('description', session.description_text) if session.proposal: event.add('url', session.url_for(_external=True)) if session.proposal.section: event.add('categories', [session.proposal.section.title]) alarm = Alarm() alarm.add('trigger', timedelta(minutes=-5)) alarm.add('action', 'display') desc = session.title if session.venue_room: desc += " in " + session.venue_room.title desc += " in 5 minutes" alarm.add('description', desc) event.add_component(alarm) return event
def finalize(self): if not self.start_date or not self.end_date: raise InvalidEventError() delta = self.end_date - self.start_date if delta.days >= 1: start_date = date(self.start_date.year, self.start_date.month, self.start_date.day) end_date = date(self.end_date.year, self.end_date.month, self.end_date.day) else: start_date = self.start_date end_date = self.end_date if self.start_date > datetime.now(tz=EST()): alarm = Alarm() alarm.add("action", "DISPLAY") alarm.add("description", "REMINDER") alarm.add("trigger", timedelta(minutes=-15)) self.add_component(alarm) self.add('dtstart', start_date) self.add('dtend', end_date)
def session_ical(session): event = Event() event.add("summary", session.title) event.add("uid", "/".join([session.proposal_space.name, session.url_name]) + "@" + request.host) event.add("dtstart", utc.localize(session.start).astimezone(timezone(session.proposal_space.timezone))) event.add("dtend", utc.localize(session.end).astimezone(timezone(session.proposal_space.timezone))) event.add("dtstamp", utc.localize(datetime.now()).astimezone(timezone(session.proposal_space.timezone))) event.add("created", utc.localize(session.created_at).astimezone(timezone(session.proposal_space.timezone))) event.add("last-modified", utc.localize(session.updated_at).astimezone(timezone(session.proposal_space.timezone))) if session.venue_room: location = [session.venue_room.title + " - " + session.venue_room.venue.title] if session.venue_room.venue.city: location.append(session.venue_room.venue.city) if session.venue_room.venue.country: location[len(location) - 1] += ", " + session.venue_room.venue.country else: location.append(session.venue_room.venue.country) event.add("location", "\n".join(location)) if session.venue_room.venue.latitude and session.venue_room.venue.longitude: event.add("geo", (session.venue_room.venue.latitude, session.venue_room.venue.longitude)) if session.description_text: event.add("description", session.description_text) if session.proposal: event.add("url", session.url_for(_external=True)) if session.proposal.section: event.add("categories", [session.proposal.section.title]) alarm = Alarm() alarm.add("trigger", timedelta(minutes=-5)) alarm.add("action", "display") desc = session.title if session.venue_room: desc += " in " + session.venue_room.title desc += " in 5 minutes" alarm.add("description", desc) event.add_component(alarm) return event
def session_ical(session): event = Event() event.add('summary', session.title) event.add('uid', "/".join([session.proposal_space.name, session.url_name]) + '@' + request.host) event.add('dtstart', utc.localize(session.start).astimezone(timezone(session.proposal_space.timezone))) event.add('dtend', utc.localize(session.end).astimezone(timezone(session.proposal_space.timezone))) event.add('dtstamp', utc.localize(datetime.now()).astimezone(timezone(session.proposal_space.timezone))) event.add('created', utc.localize(session.created_at).astimezone(timezone(session.proposal_space.timezone))) event.add('last-modified', utc.localize(session.updated_at).astimezone(timezone(session.proposal_space.timezone))) if session.venue_room: location = [session.venue_room.title + " - " + session.venue_room.venue.title] if session.venue_room.venue.city: location.append(session.venue_room.venue.city) if session.venue_room.venue.country: location[len(location) - 1] += ", " + session.venue_room.venue.country else: location.append(session.venue_room.venue.country) event.add('location', "\n".join(location)) if session.venue_room.venue.latitude and session.venue_room.venue.longitude: event.add('geo', (session.venue_room.venue.latitude, session.venue_room.venue.longitude)) if session.description_text: event.add('description', session.description_text) if session.proposal: event.add('url', session.url_for(_external=True)) if session.proposal.section: event.add('categories', [session.proposal.section.title]) alarm = Alarm() alarm.add('trigger', timedelta(minutes=-5)) alarm.add('action', 'display') desc = session.title if session.venue_room: desc += " in " + session.venue_room.title desc += " in 5 minutes" alarm.add('description', desc) event.add_component(alarm) return event
def createEvent(self, dicEvent, UID = None): event = Event() ok = True if self.dicCal["CalendarCreate"] =="YES": #print ' start create event ' try: if dicEvent.has_key('summary'): event.add('summary', dicEvent['summary']) #print 'Summary', dicEvent['summary'] if dicEvent.has_key('dtstart'): s = time.strptime(dicEvent['dtstart'], dicEvent['DateTimeformatString']) event.add('dtstart', datetime(s[0],s[1],s[2],s[3],s[4],s[5])) #print 'dtstart', datetime(s[0],s[1],s[2],s[3],s[4],s[5]) else: ok = False if dicEvent.has_key('dtend'): s = time.strptime(dicEvent['dtend'], dicEvent['DateTimeformatString']) event.add('dtend', datetime(s[0],s[1],s[2],s[3],s[4],s[5])) #print 'dtend', datetime(s[0],s[1],s[2],s[3],s[4],s[5]) if dicEvent.has_key('dtstamp'): event.add('dtstamp', dicEvent['dtstamp']) #print 'stamp', dicEvent['dtstamp'] if not UID: dicEvent['uid'] = `dicEvent['id']` + '#### ' + self.createUID() else: dicEvent['uid'] = UID event.add('uid',dicEvent['uid']) #print 'UID', dicEvent['uid'] if dicEvent.has_key('priority'): event.add('priority',dicEvent['priority'] ) if dicEvent.has_key('location'): event.add('location',dicEvent['location'] ) if dicEvent.has_key('status'): event.add('status',dicEvent['status'] ) if dicEvent.has_key('description'): event.add('description',dicEvent['description'] ) if dicEvent.has_key('valarm') and dicEvent['valarm'] == True: #print 0 oAlarm=Alarm() #print 1, oAlarm oAlarm.add('action',"DISPLAY") #oAlarm.add('value').value='DURATION' #print 2, oAlarm total_minutes = dicEvent['trigger'] idays = int(total_minutes/86400) ihours = int( (total_minutes - idays*86400) / 3600) iminutes = int (total_minutes - idays*86400 - ihours*3600 ) #print idays, ihours, iminutes #oAlarm.add('trigger',timedelta(minutes=-total_minutes )) td = timedelta(days=-idays, hours=-ihours,minutes=-iminutes) #print td oAlarm.add('trigger',td ) #print 3,oAlarm event.add_component(oAlarm) #print 4, event, oAlarm except Exception, param: print 'Except error 55' print Exception print param if not ok: event = None
def createReminder(minutes): a = Alarm() a.add('ACTION', 'DISPLAY') a.add('DESCRIPTION', 'starting soon...') a.add('TRIGGER', timedelta(minutes = -minutes)) return a
def task_create(task=None, title='Task title', due=None, alarm=None, note='', sequence=0, uid=None, priority=None, next_action=None): from uuid import uuid4 from icalendar import Calendar, Todo, Alarm if task is not None: title = task.name due = task.due alarm = task.alarm note = task.note sequence = task.sequence priority = task.priority next_action = task.next_action if (due is not None and alarm is None): # Should not arrive here, this should have already have been handled alarm = due if is_same_time(due, universe.defaulttime.due): # Warning for day events 1800 - 1000 = 8 hours alarm = due + universe.defaulttime.alldaydiff else: # Default warning of an hour alarm = due + universe.defaulttime.diff if (alarm is not None and due is None): due = alarm # alarm now defunct - just use due cal = Calendar() cal.add('prodid', '-//enoky//v0.1//EN') cal.add('version', '2.0') todo = Todo() todo.add('summary', title) if priority is not None: todo.add('priority', priority) if due is not None: todo.add('due', due) todo.add('dtstart', due) todo.add('status', 'NEEDS-ACTION') todo.add('dtstamp', universe.now) todo.add('created', universe.now) if uid is None: uid = uuid4() todo['uid'] = uid todo.add('sequence', sequence) notenext = note if (next_action is not None) and (len(next_action) > 0): if len(notenext) > 0: notenext = notenext + '\n' notenext = notenext + universe.next_char + ' ' + next_action.lstrip() if len(notenext) > 0: todo.add('description', notenext) if alarm is not None: valarm = Alarm() valarm['uid'] = uuid4() valarm.add('trigger', alarm) # Possibly not needed. How add due date?! valarm.add('description', 'Event reminder') valarm.add('action', 'DISPLAY') todo.add_component(valarm) cal.add_component(todo) vcal = cal.to_ical() return vcal
def get(JSESSIONID,zc): fp=open('zc%s.ics'%zc,'wb') cal = Calendar() cal.add('version','2.0') word ='JSESSIONID='+JSESSIONID params = urllib.urlencode({'xnxqdm': 1369, 'zc': zc}) headers = {"Content-type": "application/x-www-form-urlencoded","Cookie": word} conn = httplib.HTTPConnection("192.168.176.246:8080") conn.request("POST", "/ntss/xskbxx!xskbList.action", params, headers) response = conn.getresponse() print response.status, response.reason data = response.read() weekdate1 = data.split('星期一<br>') weekdate = weekdate1[1][0:10] monthdate = 31 if weekdate[5:7]=='04' or weekdate[5:7]=='06' or weekdate[5:7]=='09' or weekdate[5:7]=='11' : monthdate = 30 elif weekdate[5:7]=='02': monthdate = 28 print(weekdate) word = data.split('[{') if len(word) == 1: data = '' else: word1= word[1].split('}]') data = '[{'+word1[0]+'}]' js=json.loads(data) for i in js: kcmc = i["kcmc"] jxcdmc = i["jxcdmc"] teaxm = i["teaxm"] jcdm = i["jcdm"] xq = i["xq"] al = Alarm() al.add('TRIGGER', timedelta(0, 600)) al.add('ACTION','DISPLAY') event= Event() event.add('summary', kcmc) hstart = 8 hend = 9 mstart = 00 mend = 30 day = (int(weekdate[8:10])+int(xq)-1) month = int(weekdate[5:7]) if jcdm =='0304': hstart = 9 hend = 11 mstart = 40 mend = 20 elif jcdm == '030405': hstart = 9 hend = 12 mstart = 40 mend = 00 elif jcdm == '0607': hstart = 14 hend = 16 mstart = 30 mend = 10 elif jcdm == '060708': hstart = 14 hend = 16 mstart = 30 mend = 40 elif jcdm == '0809': hstart = 16 hend = 17 mstart = 10 mend = 40 elif jcdm == '1011': hstart = 18 hend = 20 mstart = 30 mend = 30 elif jcdm == '01020304': hstart = 8 hend = 11 mstart = 00 mend = 10 elif jcdm == '06070809': hstart = 14 hend = 17 mstart = 30 mend = 40 elif jcdm == '0102030405': hstart = 8 hend = 12 mstart = 00 mend = 00 if day>monthdate: day = day-monthdate print day month = month+1 event.add('dtstart', datetime(int(weekdate[0:4]),month,day,hstart,mstart,0,tzinfo=timezone('Asia/Shanghai'))) event.add('dtend', datetime(int(weekdate[0:4]),month,day,hend,mend,0,tzinfo=timezone('Asia/Shanghai'))) event.add('description', jxcdmc + '--'+teaxm) event.add_component(al) cal.add_component(event) a=cal.to_ical() fp.write(a) fp.close() conn.close() pass
def create_alarm(message, relative_timedelta): alarm = Alarm() alarm.add('ACTION', 'DISPLAY') alarm.add('DESCRIPTION', message) alarm.add('TRIGGER', relative_timedelta, parameters={'VALUE':'DURATION'}) return alarm
#!/usr/bin/env python2 from icalendar import Calendar, Event, Alarm input_file = 'Abfuhrtermine.ics' output_file = 'Abfalltermine_mit_Erinnerung.ics' ical_file = open(input_file,'r') calendar = Calendar.from_ical(ical_file.read()) for component in calendar.walk('VEVENT'): valarm_found = False for k,v in component.property_items(): if k == 'BEGIN' and v == 'VALARM': valarm_found = True if valarm_found == False: alarm = Alarm() alarm.add('ACTION', 'DISPLAY') alarm.add('DESCRIPTION', component.get('SUMMARY')) alarm.add('TRIGGER;VALUE=DURATION', '-PT12H') component.add_component(alarm) ical_file.close() ical_file_new = open(output_file,'w+') ical_file_new.write(calendar.to_ical()) ical_file_new.close()
def get_ics_file(self, events_exported, partner): """ Returns iCalendar file for the event invitation. @param event: event object (browse record) @return: .ics file content """ ics = Event() event = self[0] #~ raise Warning(self.env.cr.dbname) #~ The method below needs som proper rewriting to avoid overusing libraries. 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 #~ try: #~ # FIXME: why isn't this in CalDAV? #~ import vobject #~ except ImportError: #~ return res #~ cal = vobject.iCalendar() #~ event = cal.add('vevent') if not event.start or not event.stop: raise osv.except_osv(_('Warning!'), _("First you have to specify the date of the invitation.")) ics['summary'] = event.name if event.description: ics['description'] = event.description if event.location: ics['location'] = event.location if event.rrule: ics['rrule'] = event.rrule #~ ics.add('rrule', str(event.rrule), encode=0) #~ raise Warning(ics['rrule']) if event.alarm_ids: for alarm in event.alarm_ids: if alarm.type == 'notification': valarm = Alarm() valarm.add('ACTION', 'DISPLAY') if alarm.interval == 'days': delta = timedelta(days=alarm.duration) elif alarm.interval == 'hours': delta = timedelta(hours=alarm.duration) elif alarm.interval == 'minutes': delta = timedelta(minutes=alarm.duration) trigger = valarm.add('TRIGGER', -delta) #fields.Datetime.from_string(event.start) - valarm.add('DESCRIPTION', event.name) ics.add_component(valarm) if event.attendee_ids: for attendee in event.attendee_ids: attendee_add = ics.get('attendee') attendee_add = attendee.cn and ('CN=' + attendee.cn) or '' if attendee.cn and attendee.email: attendee_add += ':' attendee_add += attendee.email and ('MAILTO:' + attendee.email) or '' ics.add('attendee', attendee_add, encode=0) if events_exported: event_not_found = True for event_comparison in events_exported: #~ raise Warning('event_comparison = %s ics = %s' % (event_comparison, ics)) if str(ics) == event_comparison: event_not_found = False break if event_not_found: events_exported.append(str(ics)) ics['uid'] = '%s@%s-%s' % (event.id, self.env.cr.dbname, partner.id) ics['created'] = ics_datetime(strftime(DEFAULT_SERVER_DATETIME_FORMAT)) tmpStart = ics_datetime(event.start, event.allday) tmpEnd = ics_datetime(event.stop, event.allday) if event.allday: ics['dtstart;value=date'] = tmpStart else: ics['dtstart'] = tmpStart if tmpStart != tmpEnd or not event.allday: if event.allday: ics['dtend;value=date'] = str(vDatetime(datetime.fromtimestamp(mktime(strptime(event.stop, DEFAULT_SERVER_DATETIME_FORMAT))) + timedelta(hours=24)).to_ical())[:8] else: ics['dtend'] = tmpEnd return [ics, events_exported] else: events_exported.append(str(ics)) ics['uid'] = '%s@%s-%s' % (event.id, self.env.cr.dbname, partner.id) ics['created'] = ics_datetime(strftime(DEFAULT_SERVER_DATETIME_FORMAT)) tmpStart = ics_datetime(event.start, event.allday) tmpEnd = ics_datetime(event.stop, event.allday) if event.allday: ics['dtstart;value=date'] = tmpStart else: ics['dtstart'] = tmpStart if tmpStart != tmpEnd or not event.allday: if event.allday: ics['dtend;value=date'] = str(vDatetime(datetime.fromtimestamp(mktime(strptime(event.stop, DEFAULT_SERVER_DATETIME_FORMAT))) + timedelta(hours=24)).to_ical())[:8] else: ics['dtend'] = tmpEnd return [ics, events_exported]