Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Userdata update #11

Merged
merged 4 commits into from
Jul 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions tests/test_routes/test_user_post_then_get.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def test_create_new(dbsession, client, param, source, admin_source):
dbsession.expire_all()
assert response_upd.status_code == 200
response_get = client.get("/user/0")
assert response_get.json() == response_upd.json()
assert response_upd.json() == {'status': 'Success', 'message': 'User patch succeeded'}
assert {"category": param.category.name, "param": param.name, "value": "admin_info"} in list(
response_get.json()["items"]
)
Expand Down Expand Up @@ -63,8 +63,8 @@ def test_delete(dbsession, client, param, admin_source):
dbsession.expire_all()
response_get = client.get("/user/0")
assert response_upd.status_code == 200
assert response_get.json() == response_upd.json()
assert response_get.json() == {"items": []}
assert response_upd.json() == {'status': 'Success', 'message': 'User patch succeeded'}
assert response_get.status_code == 404
dbsession.delete(info1)
dbsession.commit()

Expand Down Expand Up @@ -93,7 +93,8 @@ def test_update(dbsession, client, param, admin_source):
dbsession.expire_all()
response_get = client.get("/user/0")
assert response_upd.status_code == 200
assert response_get.json() == response_upd.json()
assert response_get.status_code == 200
assert response_upd.json() == {'status': 'Success', 'message': 'User patch succeeded'}
assert {"category": param.category.name, "param": param.name, "value": "new"} in list(response_get.json()["items"])
assert len(response_get.json()["items"]) == 1
dbsession.delete(info1)
Expand Down Expand Up @@ -153,8 +154,9 @@ def test_update_not_changeable_with_scopes(dbsession, client, param, admin_sourc
)
dbsession.expire_all()
response_get = client.get("/user/0")
assert response_get.status_code == 200
assert response_upd.status_code == 200
assert response_get.json() == response_upd.json()
assert response_upd.json() == {'status': 'Success', 'message': 'User patch succeeded'}
assert {"category": param.category.name, "param": param.name, "value": "new"} in list(response_get.json()["items"])
assert len(response_get.json()["items"]) == 1
dbsession.delete(info1)
Expand All @@ -169,15 +171,16 @@ def test_create_new_no_category(dbsession, client, param, admin_source):
param.category.read_scope = "test.cat_read.first"
dbsession.commit()
response_old = client.get("/user/0")
assert response_old.json() == {"items": []}
assert response_old.status_code == 404
response_upd = client.post(
f"/user/0",
json={"source": "admin", "items": [{"category": param.category.name, "param": param.name, "value": "new"}]},
)
dbsession.expire_all()
response_get = client.get("/user/0")
assert response_get.status_code == 200
assert response_upd.status_code == 200
assert response_get.json() == response_upd.json()
assert response_upd.json() == {'status': 'Success', 'message': 'User patch succeeded'}
assert {"category": param.category.name, "param": param.name, "value": "new"} in list(response_get.json()["items"])
assert len(response_get.json()["items"]) == 1
info_new = (
Expand Down Expand Up @@ -207,7 +210,8 @@ def test_update_no_read_scope(dbsession, client, param, admin_source):
dbsession.expire_all()
response_get = client.get("/user/0")
assert response_upd.status_code == 200
assert response_get.json() == response_upd.json()
assert response_get.status_code == 200
assert response_upd.json() == {'status': 'Success', 'message': 'User patch succeeded'}
assert response_get.json() == {"items": []}
assert info1.value == "new"
dbsession.delete(info1)
Expand Down Expand Up @@ -240,7 +244,8 @@ def test_update_from_user_source(dbsession, client, param, source):
dbsession.expire_all()
response_get = client.get("/user/0")
assert response_upd.status_code == 200
assert response_get.json() == response_upd.json()
assert response_upd.json() == {'status': 'Success', 'message': 'User patch succeeded'}
assert response_get.status_code == 200
assert {"category": param.category.name, "param": param.name, "value": "new_user_info"} in list(
response_get.json()["items"]
)
Expand Down Expand Up @@ -277,7 +282,7 @@ def test_update_from_user_source_not_changeable(dbsession, client, param, source
dbsession.expire_all()
response_get = client.get("/user/0")
assert response_upd.status_code == 403
assert response_get.json() != response_upd.json()
assert response_get.status_code == 200
assert {"category": param.category.name, "param": param.name, "value": "user_info"} in list(
response_old.json()["items"]
)
Expand Down
8 changes: 5 additions & 3 deletions userdata_api/routes/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from auth_lib.fastapi import UnionAuth
from fastapi import APIRouter, Depends

from userdata_api.schemas.response_model import StatusResponseModel
from userdata_api.schemas.user import UserInfoGet, UserInfoUpdate
from userdata_api.utils.user import get_user_info as get
from userdata_api.utils.user import patch_user_info as patch
Expand Down Expand Up @@ -31,12 +32,12 @@ async def get_user_info(
return UserInfoGet.model_validate(await get(id, user))


@user.post("/{id}", response_model=UserInfoGet)
@user.post("/{id}", response_model=StatusResponseModel)
async def update_user(
new_info: UserInfoUpdate,
id: int,
user: dict[str, Any] = Depends(UnionAuth(scopes=[], allow_none=False, auto_error=True)),
) -> UserInfoGet:
) -> StatusResponseModel:
"""
Обновить информацию о пользователе.
Объект - пользователь, информацию которого обновляют
Expand All @@ -61,4 +62,5 @@ async def update_user(
:param user:
:return:
"""
return UserInfoGet.model_validate(await patch(new_info, id, user))
await patch(new_info, id, user)
return StatusResponseModel(status='Success', message='User patch succeeded')
16 changes: 8 additions & 8 deletions userdata_api/utils/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@
from userdata_api.schemas.user import UserInfoGet, UserInfoUpdate


async def patch_user_info(
new: UserInfoUpdate, user_id: int, user: dict[str, int | list[dict[str, str | int]]]
) -> UserInfoGet:
async def patch_user_info(new: UserInfoUpdate, user_id: int, user: dict[str, int | list[dict[str, str | int]]]) -> None:
"""
Обновить информацию о пользователе в соотетствии с переданным токеном.

Expand Down Expand Up @@ -84,12 +82,12 @@ async def patch_user_info(
db.session.rollback()
raise Forbidden(f"Param {param.name=} change requires 'userdata.info.update' scope")
info.value = item.value
db.session.commit()
db.session.flush()
continue
if item.value is None:
info.is_deleted = True
db.session.flush()
continue
info.is_deleted = True
db.session.flush()
continue
return await get_user_info(user_id, user)


async def get_user_info(user_id: int, user: dict[str, int | list[dict[str, str | int]]]) -> UserInfoGet:
Expand All @@ -105,6 +103,8 @@ async def get_user_info(user_id: int, user: dict[str, int | list[dict[str, str |
:return: Список словарей содержащих категорию, параметр категории и значение этого параметра у польщователя
"""
infos: list[Info] = Info.query(session=db.session).filter(Info.owner_id == user_id).all()
if not infos:
raise ObjectNotFound(Info, user_id)
scope_names = [scope["name"] for scope in user["session_scopes"]]
param_dict: dict[Param, list[Info] | Info | None] = {}
for info in infos:
Expand Down