From 88f380e07267bb34a8c559c7c297d3907a520783 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Fri, 4 Aug 2023 16:44:13 +0300 Subject: [PATCH 1/6] Union members upgrade fix. --- print_service/routes/user.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/print_service/routes/user.py b/print_service/routes/user.py index c8098f9..0892611 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,7 +108,6 @@ def update_list( ) .one_or_none() ) - if db_user: db_user.surname = user.username db_user.union_number = user.union_number @@ -122,7 +121,23 @@ def update_list( ) ) db.session.flush() - + user_not_to_delete: UnionMember = db.session.query(UnionMember).filter(UnionMember.surname == user.username, UnionMember.union_number == user.union_number, UnionMember.student_number == user.student_number).one() + users_id.append(user_not_to_delete.id) + db_delete_print_facts: list[PrintFact] = ( + db.session.query(PrintFact).filter(PrintFact.owner_id.notin_(users_id)).all() + ) + db_delete_files: list[File] = db.session.query(File).filter(File.owner_id.notin_(users_id)).all() + db_delete_users: list[UnionMember] = ( + db.session.query(UnionMember).filter(UnionMember.id.notin_(users_id)).all() + ) + for print_fact in db_delete_print_facts: + db.session.delete(print_fact) + db.session.flush() + for file in db_delete_files: + db.session.delete(file) + db.session.flush() + for _user in db_delete_users: + db.session.delete(_user) db.session.commit() return {"status": "ok", "count": len(input.users)} From c66c1a5c66192a0fb68053c40beabdadb00c87a0 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Fri, 4 Aug 2023 16:47:18 +0300 Subject: [PATCH 2/6] Union members upgrade fix. Linting. --- print_service/routes/user.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/print_service/routes/user.py b/print_service/routes/user.py index 0892611..f1169e7 100644 --- a/print_service/routes/user.py +++ b/print_service/routes/user.py @@ -121,7 +121,15 @@ def update_list( ) ) db.session.flush() - user_not_to_delete: UnionMember = db.session.query(UnionMember).filter(UnionMember.surname == user.username, UnionMember.union_number == user.union_number, UnionMember.student_number == user.student_number).one() + user_not_to_delete: UnionMember = ( + db.session.query(UnionMember) + .filter( + UnionMember.surname == user.username, + UnionMember.union_number == user.union_number, + UnionMember.student_number == user.student_number, + ) + .one() + ) users_id.append(user_not_to_delete.id) db_delete_print_facts: list[PrintFact] = ( db.session.query(PrintFact).filter(PrintFact.owner_id.notin_(users_id)).all() From 252e924d1ee8dcbbcf19d3e95c37d9ed190c592c Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Fri, 4 Aug 2023 16:56:15 +0300 Subject: [PATCH 3/6] Union members upgrade fix. Tests. --- tests/test_routes/test_user.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/test_routes/test_user.py b/tests/test_routes/test_user.py index 97fdb44..eb18518 100644 --- a/tests/test_routes/test_user.py +++ b/tests/test_routes/test_user.py @@ -88,3 +88,27 @@ 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 From 707bd8de3d22a52d31386e0966ac66e59e3f0551 Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Fri, 4 Aug 2023 17:25:05 +0300 Subject: [PATCH 4/6] Union members upgrade fix. Fixes after review. --- print_service/routes/user.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/print_service/routes/user.py b/print_service/routes/user.py index f1169e7..02da44e 100644 --- a/print_service/routes/user.py +++ b/print_service/routes/user.py @@ -114,23 +114,14 @@ def update_list( 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() - user_not_to_delete: UnionMember = ( - db.session.query(UnionMember) - .filter( - UnionMember.surname == user.username, - UnionMember.union_number == user.union_number, - UnionMember.student_number == user.student_number, - ) - .one() - ) - users_id.append(user_not_to_delete.id) + users_id.append(db_user.id) db_delete_print_facts: list[PrintFact] = ( db.session.query(PrintFact).filter(PrintFact.owner_id.notin_(users_id)).all() ) From bb7a9f35b1d201575a9b941c9d6b66576c73bf3e Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Fri, 4 Aug 2023 18:54:38 +0300 Subject: [PATCH 5/6] Union members upgrade fix. Fixes after review. +Test. --- print_service/models/__init__.py | 4 +- print_service/routes/user.py | 14 ++---- tests/test_routes/test_user.py | 78 ++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 12 deletions(-) diff --git a/print_service/models/__init__.py b/print_service/models/__init__.py index d1ffcfe..372761d 100644 --- a/print_service/models/__init__.py +++ b/print_service/models/__init__.py @@ -23,8 +23,8 @@ 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 02da44e..0b9c646 100644 --- a/print_service/routes/user.py +++ b/print_service/routes/user.py @@ -122,20 +122,14 @@ def update_list( ) db.session.flush() users_id.append(db_user.id) - db_delete_print_facts: list[PrintFact] = ( - db.session.query(PrintFact).filter(PrintFact.owner_id.notin_(users_id)).all() - ) - db_delete_files: list[File] = db.session.query(File).filter(File.owner_id.notin_(users_id)).all() db_delete_users: list[UnionMember] = ( db.session.query(UnionMember).filter(UnionMember.id.notin_(users_id)).all() ) - for print_fact in db_delete_print_facts: - db.session.delete(print_fact) - db.session.flush() - for file in db_delete_files: - db.session.delete(file) - db.session.flush() 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 eb18518..9bfb21d 100644 --- a/tests/test_routes/test_user.py +++ b/tests/test_routes/test_user.py @@ -112,3 +112,81 @@ def test_post_delete(client): 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 From 01c39d69290636874fab2a6351db834faf9e907a Mon Sep 17 00:00:00 2001 From: Artem Morozov Date: Fri, 4 Aug 2023 19:02:29 +0300 Subject: [PATCH 6/6] Union members upgrade fix. Linting. --- print_service/models/__init__.py | 4 +++- tests/test_routes/test_user.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/print_service/models/__init__.py b/print_service/models/__init__.py index 372761d..9852ee0 100644 --- a/print_service/models/__init__.py +++ b/print_service/models/__init__.py @@ -24,7 +24,9 @@ class UnionMember(Model): student_number: Mapped[str] = mapped_column(String, nullable=True) files: Mapped[list[File]] = relationship('File', back_populates='owner', lazy="joined") - print_facts: Mapped[list[PrintFact]] = relationship('PrintFact', back_populates='owner', lazy="joined") + print_facts: Mapped[list[PrintFact]] = relationship( + 'PrintFact', back_populates='owner', lazy="joined" + ) class File(Model): diff --git a/tests/test_routes/test_user.py b/tests/test_routes/test_user.py index 9bfb21d..0900236 100644 --- a/tests/test_routes/test_user.py +++ b/tests/test_routes/test_user.py @@ -128,7 +128,7 @@ def test_post_delete(client): 'username': 'artem', 'union_number': '1777', 'student_number': '1776', - } + }, ], } res_post = client.post(url, json=body)