diff --git a/print_service/models/__init__.py b/print_service/models/__init__.py index d1ffcfe..9852ee0 100644 --- a/print_service/models/__init__.py +++ b/print_service/models/__init__.py @@ -23,8 +23,10 @@ class UnionMember(Model): union_number: Mapped[str] = mapped_column(String, nullable=True) student_number: Mapped[str] = mapped_column(String, nullable=True) - files: Mapped[list[File]] = relationship('File', back_populates='owner') - print_facts: Mapped[list[PrintFact]] = relationship('PrintFact', back_populates='owner') + files: Mapped[list[File]] = relationship('File', back_populates='owner', lazy="joined") + print_facts: Mapped[list[PrintFact]] = relationship( + 'PrintFact', back_populates='owner', lazy="joined" + ) class File(Model): diff --git a/print_service/routes/user.py b/print_service/routes/user.py index c8098f9..0b9c646 100644 --- a/print_service/routes/user.py +++ b/print_service/routes/user.py @@ -10,7 +10,7 @@ from print_service import __version__ from print_service.exceptions import UnionStudentDuplicate, UserNotFound -from print_service.models import UnionMember +from print_service.models import File, PrintFact, UnionMember from print_service.schema import BaseModel from print_service.settings import get_settings @@ -90,7 +90,7 @@ def update_list( set(student_numbers) ): raise UnionStudentDuplicate() - + users_id = [] for user in input.users: db_user: UnionMember = ( db.session.query(UnionMember) @@ -108,21 +108,29 @@ def update_list( ) .one_or_none() ) - if db_user: db_user.surname = user.username db_user.union_number = user.union_number db_user.student_number = user.student_number else: db.session.add( - UnionMember( + db_user := UnionMember( surname=user.username, union_number=user.union_number, student_number=user.student_number, ) ) db.session.flush() - + users_id.append(db_user.id) + db_delete_users: list[UnionMember] = ( + db.session.query(UnionMember).filter(UnionMember.id.notin_(users_id)).all() + ) + for _user in db_delete_users: + for print_fact in _user.print_facts: + db.session.delete(print_fact) + for files in _user.files: + db.session.delete(files) + db.session.delete(_user) db.session.commit() return {"status": "ok", "count": len(input.users)} diff --git a/tests/test_routes/test_user.py b/tests/test_routes/test_user.py index 97fdb44..0900236 100644 --- a/tests/test_routes/test_user.py +++ b/tests/test_routes/test_user.py @@ -88,3 +88,105 @@ def test_post_list_duplicates(users, client): body = {'users': users} res = client.post(url, json=body) assert res.status_code == status.HTTP_400_BAD_REQUEST, res.json() + + +def test_post_delete(client): + body = { + 'users': [ + { + 'username': 'paul', + 'union_number': '1966', + 'student_number': '1967', + } + ], + } + params = { + 'surname': 'paul', + 'number': '1966', + } + res_post = client.post(url, json=body) + assert res_post.status_code == status.HTTP_200_OK + res_get1 = client.get(url, params=params) + assert res_get1.status_code == status.HTTP_202_ACCEPTED + res_post_delete = client.post(url, json={'users': []}) + assert res_post_delete.status_code == status.HTTP_200_OK + res_get2 = client.get(url, params=params) + assert res_get2.status_code == status.HTTP_404_NOT_FOUND + body = { + 'users': [ + { + 'username': 'paul', + 'union_number': '1966', + 'student_number': '1967', + }, + { + 'username': 'semen', + 'union_number': '1888', + 'student_number': '1887', + }, + { + 'username': 'artem', + 'union_number': '1777', + 'student_number': '1776', + }, + ], + } + res_post = client.post(url, json=body) + assert res_post.status_code == status.HTTP_200_OK + params = { + 'surname': 'semen', + 'number': '1888', + } + res_get = client.get(url, params=params) + assert res_get.status_code == status.HTTP_202_ACCEPTED + params = { + 'surname': 'artem', + 'number': '1777', + } + res_get = client.get(url, params=params) + assert res_get.status_code == status.HTTP_202_ACCEPTED + body = { + 'users': [ + { + 'username': 'semen', + 'union_number': '1889', + 'student_number': '1887', + }, + { + 'username': 'artem', + 'union_number': '1777', + 'student_number': '1776', + }, + { + 'username': 'roman', + 'union_number': '1999', + 'student_number': '1998', + }, + ], + } + res_post_multi = client.post(url, json=body) + assert res_post_multi.status_code == status.HTTP_200_OK + params = { + 'surname': 'semen', + 'number': '1888', + } + res_get = client.get(url, params=params) + assert res_get.status_code == status.HTTP_404_NOT_FOUND + params = { + 'surname': 'semen', + 'number': '1889', + } + res_get = client.get(url, params=params) + assert res_get.status_code == status.HTTP_202_ACCEPTED + params = { + 'surname': 'artem', + 'number': '1777', + } + res_get = client.get(url, params=params) + assert res_get.status_code == status.HTTP_202_ACCEPTED + params = { + 'surname': 'roman', + 'number': '1999', + } + res_get = client.get(url, params=params) + assert res_get.status_code == status.HTTP_202_ACCEPTED