from ics import Calendar, Event from datetime import datetime, timedelta import pytz from models.schedule import Schedule from models.user import User timezone = pytz.timezone("Europe/Moscow") class ICS: def __init__(self, user: User, use_this_week: bool = False) -> None: self.userID: int = user.id schedule: Schedule = user.schedule() if not schedule: raise ValueError if not use_this_week: # happens only on Sunday -> move to next week schedule.weekNumber += 1 self.start_week_date = timezone.localize(datetime.now()) + timedelta(days=7-schedule.weekDay) else: # on this week self.start_week_date = timezone.localize(datetime.now()) - timedelta(days=schedule.weekDay) self.calendar = Calendar() for target in range(5): schedule.weekDay = target event_date = self.start_week_date + timedelta(days=target) # print(f'\n\n--- {target} -> {event_date.strftime("%Y-%m-%d")} ---') for lesson in schedule.today(): event = Event() event.name = f'{lesson.name}' event.description = f'{lesson.type} ({", ".join([_ for _ in lesson.info if "ауд" in _])})' if ' ()' in event.description: event.description = event.description.replace(' ()', '') event.begin = event_date.replace(hour=lesson.start[0], minute=lesson.start[1], second=0, microsecond=0) event.duration = timedelta(hours=1, minutes=30) event.end = event_date.replace(hour=lesson.end[0], minute=lesson.end[1], second=0, microsecond=0) self.calendar.events.add(event) # print(event.name, '|', event.description, f'[{event.begin} - {event.end}]') # break # break def save(self) -> str: """returns path to file""" content = self.calendar.serialize() for line in self.calendar.serialize().split('\n'): if 'DTSTART' in line: ts = line.split(':')[1] content = content.replace(f'DTSTART:{ts}', f'DTSTART:{ts}\nDTSTAMP:{ts}') path = f'./temp/{self.userID}.ics' with open(path, 'w', encoding='utf-8', newline='') as file: file.writelines(content) return path