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

1from dateutil import tz 

2from django.utils.dateparse import parse_datetime 

3from lxml import etree 

4 

5from mesh.ojs import NSMAP, OJS_TIMEZONE, XPATH_NSMAP 

6 

7 

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

13 

14 

15def get_or_raise(element: "etree._Element", attr: str): 

16 """Gets an element's attribute 

17 

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 

25 

26 

27def find_or_raise(element: "etree._Element", path: str): 

28 """Finds an element inside an xml 

29 

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 

37 

38 

39def findtext_or_raise(element: "etree._Element", path: str): 

40 """Finds an element inside an xml and return its text content 

41 

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 

49 

50 

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) 

54 

55 

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 

64 

65 

66def find_and_make_test_email_or_raise(element: "etree._Element", path: str): 

67 email = findtext_or_raise(element, path) 

68 return email + "_test" 

69 

70 

71def get_and_make_test_email_or_raise(element: "etree._Element", path: str): 

72 email = get_or_raise(element, path) 

73 return email + "_test"