from urllib.parse import unquote from MoodleClasses.MoodleActivity import MoodleActivity from MoodleClasses.MoodleResource import MoodleResource from MoodleClasses.MoodleFolder import MoodleFolder from MoodleClasses.MoodleAssign import MoodleAssign from bs4 import BeautifulSoup from typing import Type import bs4 import os class MoodleCourseSection: def __init__(self, soup: bs4.element.Tag): self.soup = soup self.title = self._get_title() self.activities = self._get_activities() def __repr__(self): return f"{self.title}: {len(self.activities)} activities" def _get_title(self) -> str: title = self.soup.find("h3", {"class": "sectionname"}).text.strip() return unquote(title)[:min(len(title), 50)] def _get_activities(self) -> list[Type[MoodleActivity]]: activities_raw = self.soup.find_all("li", {"class": "activity"}) activities = [] for instance, soup in map(lambda x: (self._classify_activity(x), x), activities_raw): if instance is not None: activities.append(instance(soup)) return activities @staticmethod def _classify_activity(soup: BeautifulSoup) -> [None, MoodleActivity]: activitytype = soup["class"][2] if activitytype == "resource": return MoodleResource if activitytype == "folder": return MoodleFolder if activitytype == "assign": return MoodleAssign return None def set_parent_dir(self, parent_dir: os.path, index: int) -> None: for act in self.activities: act.set_parent_dir(os.path.join(parent_dir, f"{index} - {self.title}"))