Пример #1
0
def change():
    """ Change (create) or delete an event by POST request """
    calendar = Config.calendar()
    changes = request.get_json()
    for uid in changes["deleted"]:
        try:
            calendar.event_by_uid(uid).delete()
        except caldav.lib.error.NotFoundError:
            # the event haven't been in the calendar, maybe was just created and deleted
            pass

    for schedule in changes["created"]:
        c = iCalendar()
        c.add('prodid', '-//Schedule shift//csirt.cz//')
        c.add('version', '2.0')
        event = iEvent()
        event.add('uid', schedule["id"])
        event.add('summary', schedule["calendarId"] + " " + schedule["title"])
        # event.add('dtstart', parse(schedule["start"]["_date"]).astimezone().date()+timedelta(1))

        # print(schedule)
        # import ipdb; ipdb.set_trace()

        event.add('dtstart', parse(schedule["start-ics"]))
        event.add('dtend', parse(schedule["end-ics"]))
        # event.add('dtstart', parse(schedule["start"]["_date"]))
        # event.add('dtend', parse(schedule["end"]["_date"]))
        c.add_component(event)
        calendar.add_event(c.to_ical().decode("utf-8"))

    return "Saved"
Пример #2
0
def homepage():
    calendar = Config.calendar()
    schedules = []
    projects = Config.projects
    Config.reset_projects()

    for event in caldav2events(calendar.events()):
        project, name = event.project_and_name()  # parse out the member name
        if project:
            # count number of working days
            # Different DTEND formats: We have to shorten the end date:
            # Ex: days 2019-03-02 and 2019-03-03 in SoGo 2019-03-02 – 04, in Tui.Calendar 2019-03-02 – 03
            dates = rrule.rruleset()
            dates.rrule(
                rrule.rrule(rrule.DAILY,
                            dtstart=event["dtstart"].dt,
                            until=(event["dtend"].dt - timedelta(1))))
            dates.exrule(
                rrule.rrule(rrule.DAILY,
                            byweekday=(rrule.SA, rrule.SU),
                            dtstart=event["dtstart"].dt))
            projects[project][name] += dates.count()

            print(str(event["uid"]), str(event["dtstart"].dt),
                  str(event["dtend"].dt))
            #if event["uid"] == "d0b2edae-f15d-541b-982b-e5b66d5751f9":
            # if event["uid"] == "3943-5C990600-2F-13558D40":
            #     import ipdb;
            #     ipdb.set_trace()

            schedules.append({
                "id": str(event["uid"]),
                "calendarId": project,
                "isAllDay": 1,
                "title": str(name),
                "category": 'time',
                "start": str(event["dtstart"].dt),
                "end": str(event["dtend"].dt -
                           timedelta(1))  # see above: different DTEND formats
            })

    # modify projects so that we see relative number of worked out days (to see who should take the shift)
    for project in projects.values():
        print(min(project, key=project.get), project[min(project,
                                                         key=project.get)])
        m = project[min(project, key=project.get)]
        for member in project:
            project[member] -= m

    return render_template('calendar.html',
                           projects=json.loads(json.dumps(projects)),
                           schedules=schedules)
Пример #3
0
        description="Schedule shift via nice GUI to a SOGO calendar",
        formatter_class=argparse.RawTextHelpFormatter)
    #parser.add_argument('-v', '--verbose', action='store_true', help="Print out the mail contents.")
    parser.add_argument('--send',
                        action='store_true',
                        help="Send e-mails. (By default, no mails are sent.)")
    parser.add_argument('notify', help=__help__, nargs='+')
    args = parser.parse_args()

    Config.verbose = True  # args.verbose

    if sys.argv[1] == "notify":
        today = datetime.today().date()
        try:
            events = list(
                caldav2events(Config.calendar().date_search(today, today)))
        except InvalidSchema:
            logging.error(f"Invalid schema: {today}")
            exit(1)

        defaults = [
            "all", "any", "owner", None
        ]  # default instructions values - all projects, any state, inform owner, no fallback
        instructions = []
        # we expand 'all' projects to the real project names
        for p in " ".join(args.notify[1:]).split(","):
            pp = p.strip().split(" ")
            i = pp + defaults[len(pp):]
            if i[0] in ["all", ""]:
                for pr in Config.projects:
                    instructions.append((pr, *i[1:]))