47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
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}"))
|