예제 #1
0
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
예제 #2
0
 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
예제 #3
0
    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))
예제 #4
0
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
예제 #5
0
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))
예제 #7
0
 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
예제 #8
0
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()
예제 #9
0
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
예제 #10
0
    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)
예제 #11
0
 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
예제 #12
0
파일: ical.py 프로젝트: Clpsplug/Kawaz3rd
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
예제 #13
0
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
예제 #14
0
파일: ical.py 프로젝트: xxfyx/Kawaz3rd
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
예제 #15
0
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()
예제 #16
0
    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
예제 #17
0
 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
예제 #18
0
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)
예제 #19
0
 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
예제 #20
0
파일: ical.py 프로젝트: sacckth/scripts
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
예제 #21
0
        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
예제 #23
0
    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()
예제 #24
0
 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
예제 #25
0
 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
예제 #26
0
 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
예제 #27
0
    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
예제 #28
0
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)
예제 #29
0
 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
예제 #30
0
파일: fMain.py 프로젝트: nervatura/nerva2py
 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()
예제 #31
0
    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)
예제 #32
0
 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
예제 #33
0
 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
예제 #34
0
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
예제 #35
0
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())
예제 #36
0
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
예제 #37
0
 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
예제 #38
0
파일: event.py 프로젝트: stralar/reminder
    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)
예제 #39
0
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
예제 #40
0
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())
예제 #41
0
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()
예제 #42
0
    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)
예제 #43
0
    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'
예제 #44
0
    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)
예제 #45
0
파일: csv2ics.py 프로젝트: shaleh/csv2ics
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)
예제 #46
0
파일: ical-gen.py 프로젝트: vruyr/scripts
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())
예제 #47
0
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("&nbsp;", " ", 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())
예제 #48
0
 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
예제 #49
0
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),
    })
예제 #50
0
파일: ical.py 프로젝트: tuomas777/respa
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
예제 #52
0
파일: ics.py 프로젝트: gabriellet/calendar
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()
예제 #53
0
    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
예제 #54
0
 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(),
                                  }
예제 #55
0
    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)
예제 #56
0
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
예제 #57
0
    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)
예제 #58
0
    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'