Coverage for src / mesh / templatetags / mesh_tags.py: 71%

90 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-05-04 12:41 +0000

1import datetime 

2import re 

3from logging import getLogger 

4from typing import TYPE_CHECKING 

5 

6from dateutil.relativedelta import relativedelta 

7from django import template 

8from django.http import HttpRequest 

9from django.template.defaultfilters import stringfilter 

10from opentelemetry.trace import get_tracer 

11 

12from mesh.models.file_helpers import file_name as original_file_name 

13from mesh.models.orm.submission_models import SUBMISSION_STATE_CHOICES 

14from mesh.models.user.user_interfaces import ImpersonateData 

15from mesh.views.forms.role_forms import RoleSwitchForm 

16 

17if TYPE_CHECKING: 

18 pass 

19 

20register = template.Library() 

21 

22logger = getLogger(__name__) 

23tracer = get_tracer(__name__) 

24 

25 

26@register.filter 

27@stringfilter 

28def file_name(file_path: str) -> str: 

29 """ 

30 Returns the base name of a file from its path. 

31 """ 

32 return original_file_name(file_path) 

33 

34 

35@register.filter 

36@stringfilter 

37def role_switch_form(role_code: str) -> RoleSwitchForm: 

38 """ 

39 Returns a RoleSwitchForm whose POST switches the user current role to 

40 the provided role code. 

41 """ 

42 return RoleSwitchForm(initial={"role_code": role_code}) 

43 

44 

45@register.simple_tag(takes_context=True) 

46def check_rights(context, function_name: str, *args, **kwargs) -> bool: 

47 """ 

48 Wrapper around `RoleHandler.check_rights` method for use in template. 

49 """ 

50 role = context["request"].current_role 

51 fct = getattr(role, function_name, None) 

52 if not fct: 

53 logger.error(f"function {function_name} not found for role {role}") 

54 return False 

55 return fct(*args, **kwargs) 

56 

57 

58@register.filter 

59def get_impersonate_data(request: HttpRequest) -> ImpersonateData | None: 

60 return ImpersonateData.from_session(request.session) 

61 

62 

63@register.filter 

64@stringfilter 

65def filter_email(value): 

66 new_value = re.sub(r"\(.*\@.*\)", "", value) 

67 return new_value 

68 

69 

70@register.filter 

71def get_delay(date): 

72 today = datetime.date.today() 

73 

74 # delta = date - today 

75 delta = relativedelta(date, today) 

76 

77 days = delta.days 

78 weeks = delta.weeks 

79 months = delta.months 

80 years = delta.years 

81 abs_days = abs(days) 

82 abs_weeks = abs(weeks) 

83 abs_months = abs(months) 

84 abs_years = abs(years) 

85 

86 badge_class = "success" 

87 

88 if date == today: 

89 value = "today" 

90 badge_class = "warning" 

91 elif days == 1 and months == 0: 

92 value = "tomorrow" 

93 badge_class = "warning" 

94 elif days == -1 and months == 0: 

95 value = "yesterday" 

96 badge_class = "error" 

97 else: 

98 if abs_years == 1: 

99 value = "1 year" 

100 elif abs_years > 1: 

101 value = f"{abs_years} years" 

102 elif abs_months == 1: 

103 value = "1 month" 

104 elif abs_months > 1: 

105 value = f"{abs_months} months" 

106 elif days % 7 == 0: 

107 if abs_weeks == 1: 

108 value = "1 week" 

109 else: 

110 value = f"{abs_weeks} weeks" 

111 else: 

112 value = f"{abs_days} days" 

113 if abs_days < 7: 

114 badge_class = "warning" 

115 

116 if days > 0 or months > 0 or years > 1: 

117 value = "in " + value 

118 else: 

119 value = value + " ago" 

120 badge_class = "error" 

121 

122 value = f'<span class="badge rounded-pill badge-{badge_class}">{value}</span>' 

123 return value 

124 

125 

126@register.filter 

127@stringfilter 

128def get_state_display(value): 

129 results = [s[1] for s in SUBMISSION_STATE_CHOICES if s[0] == value] 

130 if len(results) > 0: 

131 value = results[0] 

132 return value