jcloude/press/api/access.py
2025-12-23 19:56:26 +08:00

65 lines
2.0 KiB
Python

import jingrow
import jingrow.utils
from jingrow import _
from jingrow.utils import caching, typing_validations
from press.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,
}