-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathadmin.py
More file actions
86 lines (75 loc) · 4.3 KB
/
admin.py
File metadata and controls
86 lines (75 loc) · 4.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
from __future__ import annotations
from fastapi_sqlalchemy import db
from userdata_api.exceptions import ObjectNotFound
from userdata_api.models.db import Info, Param
from userdata_api.schemas.admin import UserCardGet, UserCardUpdate
from userdata_api.schemas.user import UserInfo, UserInfoUpdate
from .user import patch_user_info as user_patch
async def patch_user_info(new: UserCardUpdate, user_id: int, user: dict[str, int | list[dict[str, str | int]]]) -> None:
"""
Обновить информацию о пользователе в соотетствии с переданным токеном.
Метод обновляет только информацию из источников `admin`.
Для обновления от имени админа нужен скоуп `userdata.info.admin`
:param new: модель запроса, в ней то, на что будет изменена информация о пользователе
:param user_id: Айди пользователя
:param user: Сессия пользователя выполняющего запрос
:return: get_user_info для текущего пользователя с переданными правами
"""
update_info = []
if new.full_name is not None:
update_info.append(UserInfo(category="Личная информация", param="Полное имя", value=new.full_name))
if new.student_card_number is not None:
update_info.append(
UserInfo(category="Учёба", param="Номер студенческого билета", value=new.student_card_number)
)
if update_info:
update_request = UserInfoUpdate(items=update_info, source="admin")
await user_patch(update_request, user_id, user)
async def get_user_info(user_id: int, user: dict[str, int | list[dict[str, str | int]]]) -> UserCardGet:
"""
Получить профсоюзную информацию пользователя для админки.
:param user_id: Айди пользователя, информацию о котором запрашиваем
:param user: Сессия пользователя, выполняющего запрос (должен иметь права администратора)
:return: Словарь с данными пользователя:
- user_id: ID пользователя
- full_name: Полное имя (из параметра "Полное имя")
- student_card_number: Номер студенческого билета (из параметра "Номер студенческого билета")
- union_card_number: Номер профсоюзного билета (из параметра "Номер профсоюзного билета")
- is_union_member: Статус мэтчинга (из параметра "Членство в профсоюзе")
- last_check_timestamp: Дата последней проверки
"""
users = db.session.query(Info).filter(Info.owner_id == user_id).first()
if not users:
raise ObjectNotFound(Info, user_id)
full_name = (
db.session.query(Info)
.join(Info.param)
.filter(Info.owner_id == user_id, Param.name == "Полное имя")
.one_or_none()
)
is_union_member = (
db.session.query(Info)
.join(Info.param)
.filter(Info.owner_id == user_id, Param.name == "Членство в профсоюзе")
.one_or_none()
)
student_card_number = (
db.session.query(Info)
.join(Info.param)
.filter(Info.owner_id == user_id, Param.name == "Номер студенческого билета")
.one_or_none()
)
union_card_number = (
db.session.query(Info)
.join(Info.param)
.filter(Info.owner_id == user_id, Param.name == "Номер профсоюзного билета")
.one_or_none()
)
result = {
"user_id": user_id,
"full_name": full_name.value if full_name else None,
"student_card_number": student_card_number.value if student_card_number else None,
"union_card_number": union_card_number.value if union_card_number else None,
"is_union_member": is_union_member.value if is_union_member else "false",
}
return result