Files
MoodleScraper/MoodleClasses/MoodleCourseSection.py

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}"))