65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
import jingrow
|
|
import jingrow.utils
|
|
from jingrow import _
|
|
from jingrow.utils import caching, typing_validations
|
|
|
|
from jcloude.access import support_access
|
|
|
|
|
|
@jingrow.whitelist()
|
|
@caching.redis_cache(ttl=60, user=True)
|
|
@typing_validations.validate_argument_types
|
|
def status(doctype: str, docname: str):
|
|
if not support_access.has_support_access(doctype, docname):
|
|
message = _("You do not have support access to this document.")
|
|
jingrow.throw(message, jingrow.PermissionError)
|
|
|
|
AccessRequest = jingrow.qb.DocType("Support Access")
|
|
AccessRequestResource = jingrow.qb.DocType("Support Access Resource")
|
|
|
|
query = (
|
|
jingrow.qb.from_(AccessRequest)
|
|
.inner_join(AccessRequestResource)
|
|
.on(AccessRequest.name == AccessRequestResource.parent)
|
|
.select(AccessRequest.star)
|
|
.where(AccessRequest.status == "Accepted")
|
|
.where(AccessRequestResource.document_type == doctype)
|
|
.where(AccessRequestResource.document_name == docname)
|
|
.where(AccessRequest.access_allowed_till > jingrow.utils.now_datetime())
|
|
.orderby(AccessRequest.access_allowed_till, order=jingrow.qb.desc)
|
|
)
|
|
|
|
results = query.run(as_dict=True)
|
|
|
|
if len(results) == 0:
|
|
message = _("You do not have support access to this document.")
|
|
jingrow.throw(message, jingrow.PermissionError)
|
|
|
|
until = results[0].access_allowed_till
|
|
|
|
def map_permission(permission: str) -> dict:
|
|
label = jingrow.get_meta("Support Access").get_field(permission).get("label")
|
|
applicable = list(filter(lambda x: bool(x[permission]), results))
|
|
longest = max(applicable, key=lambda x: x.access_allowed_till) if applicable else None
|
|
return {
|
|
"name": label,
|
|
"allowed": bool(longest),
|
|
"until": longest.access_allowed_till if longest else None,
|
|
}
|
|
|
|
def get_permissions() -> list[str]:
|
|
match doctype:
|
|
case "Site":
|
|
return ["site_domains", "login_as_administrator", "site_release_group", "bench_ssh"]
|
|
case "Release Group":
|
|
return ["bench_ssh"]
|
|
case _:
|
|
return []
|
|
|
|
permissions = [map_permission(permission) for permission in get_permissions()]
|
|
|
|
return {
|
|
"until": until,
|
|
"permissions": permissions,
|
|
}
|