53 lines
2.2 KiB
Python
53 lines
2.2 KiB
Python
"""Справочник ролей в команде проекта (порт eMemberRole.php)."""
|
||
|
||
from __future__ import annotations
|
||
|
||
# id -> (title with hierarchy prefix, archive)
|
||
_MEMBER_ROLES: dict[int, tuple[str, bool]] = {
|
||
2: ("• ГИП", False),
|
||
5: ("•• ГАП", False),
|
||
6: ("••• Архитектор", False),
|
||
11: ("••• Специалист генплана", False),
|
||
3: ("•• ГКП", False),
|
||
4: ("••• Инженер-конструктор", False),
|
||
12: ("••• Инженер-геотехник", False),
|
||
13: ("••• Инженер-обследователь", False),
|
||
14: ("•• Ведущий инженер ЭОМ", False),
|
||
15: ("••• Инженер ЭОМ", False),
|
||
16: ("•• Ведущий инженер ССиАК", False),
|
||
17: ("••• Инженер ССиАК", False),
|
||
18: ("•• Ведущий инженер ВК", False),
|
||
19: ("••• Инженер ВК", False),
|
||
20: ("•• Ведущий инженер ОВиК", False),
|
||
21: ("••• Инженер ОВиК", False),
|
||
7: ("•• Ведущий инженер", True),
|
||
8: ("••• Инженер", True),
|
||
10: ("• BIM-координатор", False),
|
||
22: ("• Сотрудник", False),
|
||
}
|
||
|
||
|
||
def member_role_title(role_id: int) -> str | None:
|
||
entry = _MEMBER_ROLES.get(int(role_id))
|
||
return entry[0] if entry else None
|
||
|
||
|
||
def list_member_roles(include_role: int | None = None) -> list[dict[str, int | str]]:
|
||
"""Неархивные роли; include_role добавляет архивную текущую роль при edit."""
|
||
out: list[dict[str, int | str]] = []
|
||
seen: set[int] = set()
|
||
for rid, (title, archive) in sorted(_MEMBER_ROLES.items()):
|
||
if archive and rid != include_role:
|
||
continue
|
||
out.append({"id": rid, "title": title})
|
||
seen.add(rid)
|
||
if include_role and include_role not in seen and include_role in _MEMBER_ROLES:
|
||
title, _ = _MEMBER_ROLES[include_role]
|
||
out.append({"id": include_role, "title": title})
|
||
out.sort(key=lambda x: int(x["id"]))
|
||
return out
|
||
|
||
|
||
def is_valid_member_role(role_id: int) -> bool:
|
||
return int(role_id) in _MEMBER_ROLES
|