mirror of
https://github.com/Garmelon/PFERD.git
synced 2023-12-21 10:23:01 +01:00
Add support for ILIAS cards
This commit is contained in:
parent
f9a3f9b9f2
commit
e42ab83d32
@ -368,6 +368,8 @@ class IliasPage:
|
|||||||
log.explain(f"Found {element_name!r}")
|
log.explain(f"Found {element_name!r}")
|
||||||
result.append(IliasPageElement(element_type, abs_url, element_name, description=description))
|
result.append(IliasPageElement(element_type, abs_url, element_name, description=description))
|
||||||
|
|
||||||
|
result += self._find_cards()
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def _find_upwards_folder_hierarchy(self, tag: Tag) -> List[str]:
|
def _find_upwards_folder_hierarchy(self, tag: Tag) -> List[str]:
|
||||||
@ -450,6 +452,90 @@ class IliasPage:
|
|||||||
log.explain(f"Found file {full_path!r}")
|
log.explain(f"Found file {full_path!r}")
|
||||||
return IliasPageElement(IliasElementType.FILE, url, full_path, modification_date)
|
return IliasPageElement(IliasElementType.FILE, url, full_path, modification_date)
|
||||||
|
|
||||||
|
def _find_cards(self) -> List[IliasPageElement]:
|
||||||
|
result: List[IliasPageElement] = []
|
||||||
|
|
||||||
|
card_titles: List[Tag] = self._soup.select(".card-title a")
|
||||||
|
|
||||||
|
for title in card_titles:
|
||||||
|
url = self._abs_url_from_link(title)
|
||||||
|
name = _sanitize_path_name(title.getText().strip())
|
||||||
|
type = self._find_type_from_card(title)
|
||||||
|
|
||||||
|
if not type:
|
||||||
|
_unexpected_html_warning()
|
||||||
|
log.warn_contd(f"Could not extract type for {title}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
result.append(IliasPageElement(type, url, name))
|
||||||
|
|
||||||
|
card_button_tiles: List[Tag] = self._soup.select(".card-title button")
|
||||||
|
|
||||||
|
for button in card_button_tiles:
|
||||||
|
regex = re.compile(button["id"] + r".*window.open\(['\"](.+?)['\"]")
|
||||||
|
res = regex.search(str(self._soup))
|
||||||
|
if not res:
|
||||||
|
_unexpected_html_warning()
|
||||||
|
log.warn_contd(f"Could not find click handler target for {button}")
|
||||||
|
continue
|
||||||
|
url = self._abs_url_from_relative(res.group(1))
|
||||||
|
name = _sanitize_path_name(button.getText().strip())
|
||||||
|
type = self._find_type_from_card(button)
|
||||||
|
caption_parent = button.findParent(
|
||||||
|
"div",
|
||||||
|
attrs={"class": lambda x: x and "caption" in x},
|
||||||
|
)
|
||||||
|
description = caption_parent.find_next_sibling("div").getText().strip()
|
||||||
|
|
||||||
|
if not type:
|
||||||
|
_unexpected_html_warning()
|
||||||
|
log.warn_contd(f"Could not extract type for {button}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
result.append(IliasPageElement(type, url, name, description=description))
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _find_type_from_card(self, card_title: Tag) -> Optional[IliasElementType]:
|
||||||
|
def is_card_root(element: Tag) -> bool:
|
||||||
|
return "il-card" in element["class"] and "thumbnail" in element["class"]
|
||||||
|
|
||||||
|
card_root: Optional[Tag] = None
|
||||||
|
|
||||||
|
# We look for the card root
|
||||||
|
for parent in card_title.parents:
|
||||||
|
if is_card_root(parent):
|
||||||
|
card_root = parent
|
||||||
|
break
|
||||||
|
|
||||||
|
if card_root is None:
|
||||||
|
_unexpected_html_warning()
|
||||||
|
log.warn_contd(f"Tried to figure out element type, but did not find an icon for {card_title}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
icon: Tag = card_root.select_one(".il-card-repository-head .icon")
|
||||||
|
|
||||||
|
if "opencast" in icon["class"]:
|
||||||
|
return IliasElementType.VIDEO_FOLDER_MAYBE_PAGINATED
|
||||||
|
if "exc" in icon["class"]:
|
||||||
|
return IliasElementType.EXERCISE
|
||||||
|
if "webr" in icon["class"]:
|
||||||
|
return IliasElementType.LINK
|
||||||
|
if "book" in icon["class"]:
|
||||||
|
return IliasElementType.BOOKING
|
||||||
|
if "frm" in icon["class"]:
|
||||||
|
return IliasElementType.FORUM
|
||||||
|
if "sess" in icon["class"]:
|
||||||
|
return IliasElementType.MEETING
|
||||||
|
if "tst" in icon["class"]:
|
||||||
|
return IliasElementType.TEST
|
||||||
|
if "fold" in icon["class"]:
|
||||||
|
return IliasElementType.FOLDER
|
||||||
|
|
||||||
|
_unexpected_html_warning()
|
||||||
|
log.warn_contd(f"Could not extract type from {icon} for card title {card_title}")
|
||||||
|
return None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _find_type_from_link(
|
def _find_type_from_link(
|
||||||
element_name: str,
|
element_name: str,
|
||||||
@ -550,7 +636,13 @@ class IliasPage:
|
|||||||
"""
|
"""
|
||||||
Create an absolute url from an <a> tag.
|
Create an absolute url from an <a> tag.
|
||||||
"""
|
"""
|
||||||
return urljoin(self._page_url, link_tag.get("href"))
|
return self._abs_url_from_relative(link_tag.get("href"))
|
||||||
|
|
||||||
|
def _abs_url_from_relative(self, relative_url: str) -> str:
|
||||||
|
"""
|
||||||
|
Create an absolute url from a relative URL.
|
||||||
|
"""
|
||||||
|
return urljoin(self._page_url, relative_url)
|
||||||
|
|
||||||
|
|
||||||
def _unexpected_html_warning() -> None:
|
def _unexpected_html_warning() -> None:
|
||||||
|
Loading…
Reference in New Issue
Block a user