# Functions not dependent on advlabdb
from flask import flash, url_for
from markupsafe import Markup, escape
def flashRandomPassword(email: str, password: str):
flash(f"New random password for email {email}: {password}", category="warning")
def parse_bool(str):
str_lower = str.lower()
if str_lower == "false":
return False
elif str_lower == "true":
return True
else:
raise ValueError(f'Can not parse a bool from "{str}"')
def deep_getattr(object, composed_name):
names = composed_name.split(".")
attr = getattr(object, names[0])
for name in names[1:]:
attr = getattr(attr, name)
return attr
def missing_formatter(view, context, model, name):
attr = deep_getattr(model, name)
if attr is None:
return Markup("MISSING")
return attr
def str_without_semester_formatter(view, context, model, name):
attr = deep_getattr(model, name)
if attr is None:
return ""
if hasattr(attr, "__iter__") and not isinstance(attr, str):
# List of attributes
return ", ".join([a.str_without_semester() for a in attr])
return attr.str_without_semester()
def str_formatter(view, context, model, name):
attr = deep_getattr(model, name)
if attr is None:
return ""
if hasattr(attr, "__iter__") and not isinstance(attr, str):
# List of attributes
return ", ".join([a.str() for a in attr])
return attr.str()
def _details_link(url, attr, attr_formatter):
return f"{escape(attr_formatter(attr))}"
def _default_attr_formatter(attr):
return attr
def link_formatter(model, name, endpoint, attr_formatter=_default_attr_formatter):
attr = deep_getattr(model, name)
if attr is None:
return ""
url = url_for(f"{endpoint}.details_view")
if hasattr(attr, "__iter__") and not isinstance(attr, str):
# List of attributes
links = (_details_link(url, a, attr_formatter) for a in attr)
return Markup(", ".join(links))
# Single attribute
return Markup(_details_link(url, attr, attr_formatter))
def link_formatter_factory(endpoint, attr_formatter=_default_attr_formatter):
def formatter(view, context, model, name):
return link_formatter(model, name, endpoint, attr_formatter)
return formatter
def email_formatter(view, context, model, name):
attr = deep_getattr(model, name)
if attr is None:
return ""
return Markup(f"{escape(attr)}")
def experiment_marks_missing_formatter(view, context, model, name):
experiment_marks_missing = getattr(model, name)
if experiment_marks_missing is True:
return Markup("Yes")
return "No"