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
« 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
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
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
17if TYPE_CHECKING:
18 pass
20register = template.Library()
22logger = getLogger(__name__)
23tracer = get_tracer(__name__)
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)
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})
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)
58@register.filter
59def get_impersonate_data(request: HttpRequest) -> ImpersonateData | None:
60 return ImpersonateData.from_session(request.session)
63@register.filter
64@stringfilter
65def filter_email(value):
66 new_value = re.sub(r"\(.*\@.*\)", "", value)
67 return new_value
70@register.filter
71def get_delay(date):
72 today = datetime.date.today()
74 # delta = date - today
75 delta = relativedelta(date, today)
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)
86 badge_class = "success"
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"
116 if days > 0 or months > 0 or years > 1:
117 value = "in " + value
118 else:
119 value = value + " ago"
120 badge_class = "error"
122 value = f'<span class="badge rounded-pill badge-{badge_class}">{value}</span>'
123 return value
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