Exemplo n.º 1
0
def generate(name: str, cards: Dict[Tuple[int, int], List[Dict]],
             semester: Semester, filename: str) -> None:
    """
    生成 ics 文件并保存到目录

    :param name: 姓名
    :param cards: 参与的课程
    :param semester: 当前导出的学期
    :param filename: 输出的文件名称,带后缀
    :return: None
    """
    from everyclass.server import statsd

    with tracer.trace("calendar_init"):
        semester_string = semester.to_str(simplify=True)
        semester = semester.to_tuple()

        # 创建 calender 对象
        cal = Calendar()
        cal.add('prodid', '-//Admirable//EveryClass//EN')
        cal.add('version', '2.0')
        cal.add('calscale', 'GREGORIAN')
        cal.add('method', 'PUBLISH')
        cal.add('X-WR-CALNAME', name + '的' + semester_string + '课表')
        cal.add('X-WR-TIMEZONE', 'Asia/Shanghai')

        # 时区
        tzc.add_component(tzs)
        cal.add_component(tzc)

    with tracer.trace("add_events"):
        # 创建 events
        for time in range(1, 7):
            for day in range(1, 8):
                if (day, time) in cards:
                    for card in cards[(day, time)]:
                        for week in card['week']:
                            dtstart = _get_datetime(week, day,
                                                    get_time(time)[0],
                                                    semester)
                            dtend = _get_datetime(week, day,
                                                  get_time(time)[1], semester)

                            if dtstart.year == 1984:
                                continue

                            cal.add_component(
                                _build_event(card_name=card['name'],
                                             times=(dtstart, dtend),
                                             classroom=card['classroom'],
                                             teacher=card['teacher'],
                                             week_string=card['week_string'],
                                             current_week=week,
                                             cid=card['cid']))

    with tracer.trace("write_file"):
        with open(os.path.join(calendar_dir(), filename), 'wb') as f:
            data = cal.to_ical()
            statsd.histogram('calendar.ics.generate.size', len(data))
            f.write(data)
Exemplo n.º 2
0
def generate(name: str, cards: Dict[Tuple[int, int], List[Dict]],
             semester: Semester, ics_token: str):
    """
    生成 ics 文件并保存到目录

    :param name: 姓名
    :param cards: 参与的课程
    :param semester: 当前导出的学期
    :param ics_token: ics 令牌
    :return: None
    """
    semester_string = semester.to_str(simplify=True)
    semester = semester.to_tuple()

    # 创建 calender 对象
    cal = Calendar()
    cal.add('prodid', '-//Admirable//EveryClass//EN')
    cal.add('version', '2.0')
    cal.add('calscale', 'GREGORIAN')
    cal.add('method', 'PUBLISH')
    cal.add('X-WR-CALNAME', name + '的' + semester_string + '课表')
    cal.add('X-WR-TIMEZONE', 'Asia/Shanghai')

    # 时区
    tzc.add_component(tzs)
    cal.add_component(tzc)

    # 创建 events
    for time in range(1, 7):
        for day in range(1, 8):
            if (day, time) in cards:
                for card in cards[(day, time)]:
                    for week in card['week']:
                        dtstart = _get_datetime(week, day,
                                                get_time(time)[0], semester)
                        dtend = _get_datetime(week, day,
                                              get_time(time)[1], semester)

                        if dtstart.year == 1984:
                            continue

                        cal.add_component(
                            _build_event(card_name=card['name'],
                                         times=(dtstart, dtend),
                                         classroom=card['classroom'],
                                         teacher=card['teacher'],
                                         week_string=card['week_string'],
                                         current_week=week,
                                         cid=card['cid']))

    # 写入文件
    import os

    with open(
            os.path.join(os.path.dirname(__file__),
                         '../../../calendar_files/{}.ics'.format(ics_token)),
            'w') as f:
        f.write(cal.to_ical().decode(encoding='utf-8'))