Skip to content

Commit 7881a43

Browse files
committed
Информация о пользователе от лк мгу
1 parent 25b0ed8 commit 7881a43

9 files changed

Lines changed: 109 additions & 6 deletions

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ db:
2222
docker run -d -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust --name db-userdata_api postgres:15
2323

2424
migrate:
25-
alembic upgrade head
25+
source ./venv/bin/activate && alembic upgrade head

tests/test_routes/test_users_get.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from time import sleep
2-
31
import pytest
42

53
from userdata_api.models.db import Info, Param

userdata_api/routes/admin.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from typing import Any
2+
3+
from auth_lib.fastapi import UnionAuth
4+
from fastapi import APIRouter, Depends
5+
6+
from userdata_api.schemas.admin import UserDebugCardGet, UserDebugCardUpdate
7+
from userdata_api.schemas.response_model import StatusResponseModel
8+
from userdata_api.utils.admin import get_user_info as get
9+
from userdata_api.utils.admin import patch_user_info as patch
10+
11+
12+
admin = APIRouter(prefix="/admin", tags=["Admin"])
13+
14+
15+
@admin.get("/user/{user_id}", response_model=UserDebugCardGet)
16+
async def get_user_debug_card(
17+
user_id: int, ##or full_name
18+
user: dict[str, Any] = Depends(UnionAuth(scopes=[], allow_none=False, auto_error=True)), ##scopes
19+
) -> UserDebugCardGet:
20+
"""
21+
Получает профсоюзную информацию пользователя.
22+
"""
23+
24+
return UserDebugCardGet.model_validate(await get(user_id, user))
25+
26+
27+
@admin.patch("/user/{user_id}", response_model=StatusResponseModel)
28+
async def update_user_debug_card(
29+
new_info: UserDebugCardUpdate,
30+
user_id: int,
31+
user: dict[str, Any] = Depends(UnionAuth(scopes=[], allow_none=False, auto_error=True)), ##scopes
32+
) -> StatusResponseModel:
33+
"""
34+
Обновить данные в профсоюзной информации пользователя.
35+
36+
- **user_id**: id пользователя.
37+
38+
Возвращает **ObjectNotFound** пользователь с указанным user_id не найден.
39+
"""
40+
41+
await patch(new_info, user_id, user)
42+
return StatusResponseModel(status="Success", message="User patch succeeded", ru="Изменение успешно")

userdata_api/routes/base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from settings import get_settings
66
from userdata_api import __version__
77

8+
from .admin import admin
89
from .category import category
910
from .param import param
1011
from .source import source
@@ -41,3 +42,4 @@
4142
app.include_router(category)
4243
app.include_router(param)
4344
app.include_router(user)
45+
app.include_router(admin)

userdata_api/routes/user.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
from auth_lib.fastapi import UnionAuth
44
from fastapi import APIRouter, Depends, Query
5-
from fastapi_sqlalchemy import db
65

7-
from userdata_api.models.db import Category, Info
86
from userdata_api.schemas.response_model import StatusResponseModel
97
from userdata_api.schemas.user import UserInfoGet, UserInfoUpdate, UsersInfoGet
108
from userdata_api.utils.user import get_user_info as get

userdata_api/schemas/admin.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from datetime import datetime
2+
3+
from .base import Base
4+
5+
6+
class UserDebugCardGet(Base):
7+
user_id: int
8+
full_name: str | None = None
9+
student_card_number: str | None = None
10+
union_card_number: str | None = None
11+
is_union_member: str
12+
last_check_timestamp: datetime | None = None
13+
14+
15+
class UserDebugCardUpdate(Base):
16+
full_name: str | None = None
17+
student_card_number: str | None = None

userdata_api/schemas/user.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,11 @@ class UsersInfoGet(Base):
3434

3535
class UserInfoUpdate(UserInfoGet):
3636
source: constr(min_length=1)
37+
38+
39+
class UserDebugCard(Base):
40+
user_id: int
41+
full_name: str | None = None
42+
student_card_number: str | None = None
43+
union_card_number: str | None = None
44+
is_union_member: str

userdata_api/utils/admin.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from __future__ import annotations
2+
3+
from userdata_api.schemas.admin import UserDebugCardGet, UserDebugCardUpdate
4+
5+
6+
async def patch_user_info(
7+
new: UserDebugCardUpdate, user_id: int, user: dict[str, int | list[dict[str, str | int]]]
8+
) -> None:
9+
"""
10+
Обновить информацию о пользователе в соотетствии с переданным токеном.
11+
12+
Метод обновляет только информацию из источников `admin`, `user` или `dwh`.
13+
14+
Для обновления от имени админа нужен скоуп `userdata.info.admin`
15+
16+
Для обновления информации из dwh нужен скоуп `userdata.info.dwh`
17+
18+
:param new: модель запроса, в ней то, на что будет изменена информация о пользователе
19+
:param user_id: Айди пользователя
20+
:param user: Сессия пользователя выполняющего запрос
21+
:return: get_user_info для текущего пользователя с переданными правами
22+
"""
23+
24+
25+
async def get_user_info(user_id: int, user: dict[str, int | list[dict[str, str | int]]]) -> UserDebugCardGet:
26+
"""
27+
Получить профсоюзную информацию пользователя для админки.
28+
29+
:param user_id: Айди пользователя, информацию о котором запрашиваем
30+
:param user: Сессия пользователя, выполняющего запрос (должен иметь права администратора)
31+
:return: Словарь с данными пользователя:
32+
- user_id: ID пользователя
33+
- full_name: Полное имя (из параметра "Полное имя")
34+
- student_card_number: Номер студенческого билета (из параметра "Номер студенческого билета")
35+
- union_card_number: Номер профсоюзного билета (из параметра "Номер профсоюзного билета")
36+
- is_union_member: Статус мэтчинга (из параметра "Членство в профсоюзе")
37+
- last_check_timestamp: Дата последней проверки
38+
"""

userdata_api/utils/user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from re import search
44

55
from fastapi_sqlalchemy import db
6-
from sqlalchemy import String, cast, func, not_, or_
6+
from sqlalchemy import not_, or_
77

88
from userdata_api.exceptions import Forbidden, InvalidValidation, ObjectNotFound
99
from userdata_api.models.db import Category, Info, Param, Source, ViewType

0 commit comments

Comments
 (0)