Coverage for src / mesh / ojs / lxml_utils.py: 0%
37 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-05-04 12:41 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-05-04 12:41 +0000
1from dateutil import tz
2from django.utils.dateparse import parse_datetime
3from lxml import etree
5from mesh.ojs import NSMAP, OJS_TIMEZONE, XPATH_NSMAP
8def str_to_datetime(date_string: str):
9 date = parse_datetime(date_string)
10 if date is None:
11 raise ValueError(f"Couldn't convert string to datetime: {date_string}")
12 return date.astimezone(tz=tz.gettz(OJS_TIMEZONE))
15def get_or_raise(element: "etree._Element", attr: str):
16 """Gets an element's attribute
18 raises `ValueError` if the element cannot be found"""
19 value = element.get(attr)
20 if value is None:
21 raise ValueError(
22 f"Could not find attribute {attr} on element {element} at line {element.sourceline}"
23 )
24 return value
27def find_or_raise(element: "etree._Element", path: str):
28 """Finds an element inside an xml
30 raises `ValueError` if the element cannot be found"""
31 found = element.find(path, NSMAP)
32 if found is None:
33 raise ValueError(
34 f"Could not find element {path} inside {element.tag} at line {element.sourceline}"
35 )
36 return found
39def findtext_or_raise(element: "etree._Element", path: str):
40 """Finds an element inside an xml and return its text content
42 raises `ValueError` if the element cannot be found or has no contents,"""
43 text = find_or_raise(element, path).text
44 if not text:
45 raise ValueError(
46 f"Could not find text inside element {element.tag}/{path} at line {element.sourceline}"
47 )
48 return text
51def findall_xpath(element: "etree._Element", path: str):
52 """prefix tag names with `ojs:` for xpath to recognize them"""
53 return element.xpath(path, namespaces=XPATH_NSMAP)
56def find_xpath_or_raise(element: "etree._Element", path: str):
57 """prefix tag names with `ojs:` for xpath to recognize them"""
58 el = next(iter(findall_xpath(element, path)), None)
59 if el is None:
60 raise ValueError(
61 f"Could not find element {path} inside {element.tag} at line {element.sourceline}"
62 )
63 return el
66def find_and_make_test_email_or_raise(element: "etree._Element", path: str):
67 email = findtext_or_raise(element, path)
68 return email + "_test"
71def get_and_make_test_email_or_raise(element: "etree._Element", path: str):
72 email = get_or_raise(element, path)
73 return email + "_test"