university-setup/scripts/courses.py

67 lines
2 KiB
Python
Raw Permalink Normal View History

2019-09-15 20:42:11 +02:00
#!/usr/bin/python3
from pathlib import Path
import yaml
import warnings
2019-09-15 20:42:11 +02:00
from lectures import Lectures
2021-09-16 18:02:36 +02:00
from notes import Notes
2021-09-16 13:28:51 +02:00
from config import ROOT, CURRENT_COURSE_ROOT, CURRENT_COURSE_SYMLINK, CURRENT_COURSE_WATCH_FILE, COURSE_IGNORE_FILE, \
COURSE_INFO_FILE
class Course:
2019-09-15 20:42:11 +02:00
def __init__(self, path):
self.path = path
self.name = path.stem
if (path / COURSE_INFO_FILE).is_file():
self.info = yaml.safe_load((path / COURSE_INFO_FILE).open())
else:
warnings.warn(f"No course info file found in directory '{path.stem}'. Place a {COURSE_INFO_FILE} "
f"file in the directory or add the directory to the course ignore file named"
f" '{COURSE_IGNORE_FILE}' in your root directory ({ROOT})")
self.info = {'title': path.stem, 'short': path.stem}
2021-09-16 18:02:36 +02:00
self._notes = None
2019-09-15 20:42:11 +02:00
@property
2021-09-16 18:02:36 +02:00
def notes(self):
if not self._notes:
self._notes = Notes(self)
return self._notes
2019-09-15 20:42:11 +02:00
def __eq__(self, other):
2021-09-16 13:28:51 +02:00
if other is None:
2019-09-15 20:42:11 +02:00
return False
return self.path == other.path
2021-09-16 13:28:51 +02:00
def ignored_courses():
if (ROOT / COURSE_IGNORE_FILE).is_file():
with open(ROOT / COURSE_IGNORE_FILE) as ignore:
lines = ignore.readlines()
paths = []
for line in lines:
paths.append(ROOT / line.strip())
return paths
return []
2021-09-16 13:28:51 +02:00
def read_files():
course_directories = [x for x in ROOT.iterdir() if x.is_dir() and x not in ignored_courses()]
_courses = [Course(path) for path in course_directories]
return sorted(_courses, key=lambda c: c.name)
2019-09-15 20:42:11 +02:00
class Courses(list):
def __init__(self):
2021-09-16 13:28:51 +02:00
list.__init__(self, read_files())
2019-09-15 20:42:11 +02:00
@property
def current(self):
return Course(CURRENT_COURSE_ROOT.resolve())
@current.setter
def current(self, course):
CURRENT_COURSE_SYMLINK.unlink()
CURRENT_COURSE_SYMLINK.symlink_to(course.path)
CURRENT_COURSE_WATCH_FILE.write_text('{}\n'.format(course.info['short']))