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"
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)
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:]))