# -*- coding: utf-8 -*- """ Script permettant de générer des fichiers CSV à partir d'agenda Nextcloud contenant un récapitulatif des heures de travail effectué Pour Crealead @author: Jordan @date: 17/11/2022 @TODO: Améliorer la structure du code, pour l'instant c'est un peu moche @TODO: Ajouter des paramètres pour le mois, et le verbose pour avoir des logs @TOOD: README sur l'utilisation du script """ import sys import caldav import json import csv from datetime import date, datetime, time, timezone from icalendar import Calendar import pytz from urllib.parse import unquote import re import traceback from contextlib import contextmanager, redirect_stdout, redirect_stderr from pathlib import Path def utc_timestamp(): return datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ') class TimestampedLog: """Prefix each log line, including lines written in several fragments.""" def __init__(self, log_file): self.log_file = log_file self.line_start = True def write(self, value): # Keep an event warning separate from an unfinished console message. if value.startswith('[warning][event] - ') and not self.line_start: self.log_file.write('\n') self.line_start = True for fragment in value.splitlines(keepends=True): if self.line_start: self.log_file.write('[{}]: '.format(utc_timestamp())) if not fragment.startswith('[warning][event] - '): self.log_file.write('[info] - ') self.log_file.write(fragment) self.line_start = fragment.endswith(('\n', '\r')) return len(value) def flush(self): self.log_file.flush() class TeeOutput: """Write to the original console stream and to the shared log file.""" def __init__(self, stream, log_file): self.stream = stream self.log_file = log_file def write(self, value): written = self.stream.write(value) self.log_file.write(value) self.log_file.flush() return written def flush(self): self.stream.flush() self.log_file.flush() def __getattr__(self, name): return getattr(self.stream, name) @contextmanager def log_output(): """Append console output to logs/