57 lines
2.4 KiB
Python
57 lines
2.4 KiB
Python
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
|