From 8729a14d4407f2b7bcded214b71777f6a245bb82 Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Thu, 7 Oct 2021 08:13:03 +0530 Subject: [PATCH 01/13] Resolved Issue #61 --- api/versions/v1/routers/roles/models.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/api/versions/v1/routers/roles/models.py b/api/versions/v1/routers/roles/models.py index 712cb89..460d7c1 100644 --- a/api/versions/v1/routers/roles/models.py +++ b/api/versions/v1/routers/roles/models.py @@ -1,5 +1,6 @@ from typing import List, Optional from pydantic import BaseModel, Field +from pydantic.color import Color class RoleResponse(BaseModel): @@ -7,7 +8,7 @@ class RoleResponse(BaseModel): name: str position: int permissions: int - color: Optional[int] + color: Optional[Color] class DetailedRoleResponse(RoleResponse): @@ -16,12 +17,12 @@ class DetailedRoleResponse(RoleResponse): class NewRoleBody(BaseModel): name: str = Field(..., min_length=4, max_length=32) - color: Optional[int] = Field(None, le=0xFFFFFF, ge=0) + color: Optional[Color] = Field(None, le=0xFFFFFF, ge=0) permissions: Optional[int] = Field(0, ge=0) class UpdateRoleBody(BaseModel): - name: str = Field("", min_length=4, max_length=64) - color: Optional[int] = Field(None, le=0xFFFFFF, ge=0) + name: str = Field("", min_length=4, max_length=32) + color: Optional[Color] = Field(None, le=0xFFFFFF, ge=0) permissions: int = Field(0, ge=0) position: int = Field(0, ge=0) From 3627ac7e9c927a51df15cb4685c71c8658744b5a Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Fri, 8 Oct 2021 11:23:14 +0530 Subject: [PATCH 02/13] Changed Field(None, le=0xFFFFFF, ge=0) to None --- api/versions/v1/routers/roles/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/versions/v1/routers/roles/models.py b/api/versions/v1/routers/roles/models.py index 460d7c1..a72ca3b 100644 --- a/api/versions/v1/routers/roles/models.py +++ b/api/versions/v1/routers/roles/models.py @@ -17,12 +17,12 @@ class DetailedRoleResponse(RoleResponse): class NewRoleBody(BaseModel): name: str = Field(..., min_length=4, max_length=32) - color: Optional[Color] = Field(None, le=0xFFFFFF, ge=0) + color: Optional[Color] = None permissions: Optional[int] = Field(0, ge=0) class UpdateRoleBody(BaseModel): name: str = Field("", min_length=4, max_length=32) - color: Optional[Color] = Field(None, le=0xFFFFFF, ge=0) + color: Optional[Color] = None permissions: int = Field(0, ge=0) position: int = Field(0, ge=0) From fb8222273790c7aa2167176a32807dc25d71bfae Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Thu, 14 Oct 2021 20:34:49 +0530 Subject: [PATCH 03/13] Converted Color Values to string from hex ints :mhm: --- tests/test_roles.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/test_roles.py b/tests/test_roles.py index dfc6dc0..4f0fe8d 100644 --- a/tests/test_roles.py +++ b/tests/test_roles.py @@ -26,11 +26,11 @@ async def manage_roles_role(db): ({}, 422), ({"name": ""}, 422), ({"permissions": -1}, 422), - ({"name": "test1", "color": 0xFFFFFFF}, 422), - ({"name": "test1", "color": -0x000001}, 422), - ({"name": "test2", "color": 0x000000, "permissions": 8}, 403), - ({"name": "test2", "color": 0x000000, "permissions": 0}, 201), - ({"name": "test2", "color": 0x000000, "permissions": 0}, 409), + ({"name": "test1", "color": "0xFFFFFFF"}, 422), + ({"name": "test1", "color": "-0x000001"}, 422), + ({"name": "test2", "color": "0x000000", "permissions": 8}, 403), + ({"name": "test2", "color": "0x000000", "permissions": 0}, 201), + ({"name": "test2", "color": "0x000000", "permissions": 0}, 409), ], ) async def test_role_create( @@ -66,31 +66,31 @@ async def test_fetch_all_roles(app: AsyncClient): @pytest.mark.parametrize( ("request_data", "new_data", "status"), [ - ({}, {"name": "test update", "permissions": 0, "color": 0}, 204), - ({"name": ""}, {"name": "test update", "permissions": 0, "color": 0}, 422), + ({}, {"name": "test update", "permissions": 0, "color": "0x0"}, 204), + ({"name": ""}, {"name": "test update", "permissions": 0, "color": "0x0"}, 422), ( {"permissions": -1}, - {"name": "test update", "permissions": 0, "color": 0}, + {"name": "test update", "permissions": 0, "color": "0x0"}, 422, ), ( - {"color": 0xFFFFFFF}, - {"name": "test update", "permissions": 0, "color": 0}, + {"color": "0xFFFFFFF"}, + {"name": "test update", "permissions": 0, "color": "0x0"}, 422, ), ( - {"color": -0x000001}, - {"name": "test update", "permissions": 0, "color": 0}, + {"color": "-0x000001"}, + {"name": "test update", "permissions": 0, "color": "0x0"}, 422, ), ( - {"color": 0x5, "permissions": 8}, - {"name": "test update", "permissions": 0, "color": 0x0}, + {"color": "0x5", "permissions": 8}, + {"name": "test update", "permissions": 0, "color": "0x0"}, 403, ), ( - {"color": 0x5, "permissions": ManageRoles().value}, - {"name": "test update", "permissions": ManageRoles().value, "color": 0x5}, + {"color": "0x5", "permissions": ManageRoles().value}, + {"name": "test update", "permissions": ManageRoles().value, "color": "0x5"}, 204, ), ], @@ -390,4 +390,4 @@ async def test_update_role_positions_down( user.id, ) for role in roles: - await db.execute("DELETE FROM roles WHERE id = $1", role.id) + await db.execute("DELETE FROM roles WHERE id = $1", role.id) \ No newline at end of file From 24b22d6175bc3a1b66c4353a15576b27d60d1f1c Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Fri, 15 Oct 2021 08:31:01 +0530 Subject: [PATCH 04/13] Added newline at end of the file :bonk: --- api/versions/v1/routers/roles/models.py | 1 + tests/test_roles.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/api/versions/v1/routers/roles/models.py b/api/versions/v1/routers/roles/models.py index a72ca3b..82a4726 100644 --- a/api/versions/v1/routers/roles/models.py +++ b/api/versions/v1/routers/roles/models.py @@ -26,3 +26,4 @@ class UpdateRoleBody(BaseModel): color: Optional[Color] = None permissions: int = Field(0, ge=0) position: int = Field(0, ge=0) + diff --git a/tests/test_roles.py b/tests/test_roles.py index 4f0fe8d..50f2f5e 100644 --- a/tests/test_roles.py +++ b/tests/test_roles.py @@ -390,4 +390,4 @@ async def test_update_role_positions_down( user.id, ) for role in roles: - await db.execute("DELETE FROM roles WHERE id = $1", role.id) \ No newline at end of file + await db.execute("DELETE FROM roles WHERE id = $1", role.id) From 07c489757bcb393c5930ebeda92d353d2ac40c57 Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Fri, 15 Oct 2021 08:35:42 +0530 Subject: [PATCH 05/13] Added newline at end of the file :bonk: --- tests/test_roles.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_roles.py b/tests/test_roles.py index 50f2f5e..d33335d 100644 --- a/tests/test_roles.py +++ b/tests/test_roles.py @@ -391,3 +391,4 @@ async def test_update_role_positions_down( ) for role in roles: await db.execute("DELETE FROM roles WHERE id = $1", role.id) + From 78e2212e7d1d6cdfdd97f2738dafb99974a353ac Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Sat, 6 Nov 2021 14:08:35 +0530 Subject: [PATCH 06/13] Added Linting and Black formatting --- api/versions/v1/routers/roles/models.py | 1 - tests/test_roles.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/api/versions/v1/routers/roles/models.py b/api/versions/v1/routers/roles/models.py index 82a4726..a72ca3b 100644 --- a/api/versions/v1/routers/roles/models.py +++ b/api/versions/v1/routers/roles/models.py @@ -26,4 +26,3 @@ class UpdateRoleBody(BaseModel): color: Optional[Color] = None permissions: int = Field(0, ge=0) position: int = Field(0, ge=0) - diff --git a/tests/test_roles.py b/tests/test_roles.py index d33335d..bd8697d 100644 --- a/tests/test_roles.py +++ b/tests/test_roles.py @@ -1,5 +1,4 @@ import pytest - from httpx import AsyncClient from api.models import Role, UserRole @@ -391,4 +390,3 @@ async def test_update_role_positions_down( ) for role in roles: await db.execute("DELETE FROM roles WHERE id = $1", role.id) - From b9410ec2cb553df6e4583c3015e3d3a848f040a2 Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Thu, 11 Nov 2021 11:32:26 +0530 Subject: [PATCH 07/13] Fix tests --- api/versions/v1/routers/roles/routes.py | 2 +- tests/test_roles.py | 34 ++++++++++++++++--------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/api/versions/v1/routers/roles/routes.py b/api/versions/v1/routers/roles/routes.py index 4beca11..0acfe74 100644 --- a/api/versions/v1/routers/roles/routes.py +++ b/api/versions/v1/routers/roles/routes.py @@ -93,7 +93,7 @@ async def create_role(body: NewRoleBody, roles=has_permissions([ManageRoles()])) try: record = await Role.pool.fetchrow( - query, body.name, body.color, body.permissions + query, body.name, int(body.color.as_hex()[1:], 16), body.permissions ) except asyncpg.exceptions.UniqueViolationError: raise HTTPException(409, "Role with that name already exists") diff --git a/tests/test_roles.py b/tests/test_roles.py index bd8697d..489da59 100644 --- a/tests/test_roles.py +++ b/tests/test_roles.py @@ -12,7 +12,9 @@ async def manage_roles_role(db): VALUES (create_snowflake(), $1, $2, $3, (SELECT COUNT(*) FROM roles) + 1) RETURNING *; """ - record = await Role.pool.fetchrow(query, "Roles Manager", 0x0, ManageRoles().value) + record = await Role.pool.fetchrow( + query, "Roles Manager", "0x000", ManageRoles().value + ) yield Role(**record) await db.execute("DELETE FROM roles WHERE id = $1;", record["id"]) @@ -25,7 +27,7 @@ async def manage_roles_role(db): ({}, 422), ({"name": ""}, 422), ({"permissions": -1}, 422), - ({"name": "test1", "color": "0xFFFFFFF"}, 422), + ({"name": "test1", "color": "0x000000"}, 422), ({"name": "test1", "color": "-0x000001"}, 422), ({"name": "test2", "color": "0x000000", "permissions": 8}, 403), ({"name": "test2", "color": "0x000000", "permissions": 0}, 201), @@ -65,31 +67,39 @@ async def test_fetch_all_roles(app: AsyncClient): @pytest.mark.parametrize( ("request_data", "new_data", "status"), [ - ({}, {"name": "test update", "permissions": 0, "color": "0x0"}, 204), - ({"name": ""}, {"name": "test update", "permissions": 0, "color": "0x0"}, 422), + ({}, {"name": "test update", "permissions": 0, "color": "0x000"}, 204), + ( + {"name": ""}, + {"name": "test update", "permissions": 0, "color": "0x000"}, + 422, + ), ( {"permissions": -1}, - {"name": "test update", "permissions": 0, "color": "0x0"}, + {"name": "test update", "permissions": 0, "color": "0x000"}, 422, ), ( - {"color": "0xFFFFFFF"}, - {"name": "test update", "permissions": 0, "color": "0x0"}, + {"color": "0xffffff"}, + {"name": "test update", "permissions": 0, "color": "0x000"}, 422, ), ( {"color": "-0x000001"}, - {"name": "test update", "permissions": 0, "color": "0x0"}, + {"name": "test update", "permissions": 0, "color": "0x000"}, 422, ), ( - {"color": "0x5", "permissions": 8}, - {"name": "test update", "permissions": 0, "color": "0x0"}, + {"color": "0x005", "permissions": 8}, + {"name": "test update", "permissions": 0, "color": "0x000"}, 403, ), ( - {"color": "0x5", "permissions": ManageRoles().value}, - {"name": "test update", "permissions": ManageRoles().value, "color": "0x5"}, + {"color": "0x005", "permissions": ManageRoles().value}, + { + "name": "test update", + "permissions": ManageRoles().value, + "color": "0x005", + }, 204, ), ], From b790512d827c4cbcfb4532abda6d0af72b02d844 Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Thu, 11 Nov 2021 11:40:18 +0530 Subject: [PATCH 08/13] Altered a testcase by mistake fix :bonk: --- tests/test_roles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_roles.py b/tests/test_roles.py index 489da59..25e0aba 100644 --- a/tests/test_roles.py +++ b/tests/test_roles.py @@ -27,7 +27,7 @@ async def manage_roles_role(db): ({}, 422), ({"name": ""}, 422), ({"permissions": -1}, 422), - ({"name": "test1", "color": "0x000000"}, 422), + ({"name": "test1", "color": "0xffffff"}, 422), ({"name": "test1", "color": "-0x000001"}, 422), ({"name": "test2", "color": "0x000000", "permissions": 8}, 403), ({"name": "test2", "color": "0x000000", "permissions": 0}, 201), From c50dbc1e49c050c248c56f36a9f99970dcd672f5 Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Fri, 12 Nov 2021 08:36:47 +0530 Subject: [PATCH 09/13] Updated Tests and update_role --- api/versions/v1/routers/roles/routes.py | 2 ++ tests/test_roles.py | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/api/versions/v1/routers/roles/routes.py b/api/versions/v1/routers/roles/routes.py index 0acfe74..2f14051 100644 --- a/api/versions/v1/routers/roles/routes.py +++ b/api/versions/v1/routers/roles/routes.py @@ -118,6 +118,8 @@ async def update_role( body: UpdateRoleBody, roles=has_permissions([ManageRoles()]), ): + + body.color = int(body.color.as_hex()[1:], 16) role = await Role.fetch(id) if not role: raise HTTPException(404, "Role Not Found") diff --git a/tests/test_roles.py b/tests/test_roles.py index 25e0aba..c32aa76 100644 --- a/tests/test_roles.py +++ b/tests/test_roles.py @@ -13,7 +13,7 @@ async def manage_roles_role(db): RETURNING *; """ record = await Role.pool.fetchrow( - query, "Roles Manager", "0x000", ManageRoles().value + query, "Roles Manager", 0x000, ManageRoles().value ) yield Role(**record) await db.execute("DELETE FROM roles WHERE id = $1;", record["id"]) @@ -32,6 +32,8 @@ async def manage_roles_role(db): ({"name": "test2", "color": "0x000000", "permissions": 8}, 403), ({"name": "test2", "color": "0x000000", "permissions": 0}, 201), ({"name": "test2", "color": "0x000000", "permissions": 0}, 409), + ({"name": "test3", "color": "black", "permissions": 0}, 201), + ({"name": "test4", "color": "#bafc03", "permissions": 0}, 201), ], ) async def test_role_create( @@ -93,6 +95,11 @@ async def test_fetch_all_roles(app: AsyncClient): {"name": "test update", "permissions": 0, "color": "0x000"}, 403, ), + ( + {"color": "black", "permissions": 8}, + {"name": "test update", "permissions": 0, "color": "#bafc03"}, + 403, + ), ( {"color": "0x005", "permissions": ManageRoles().value}, { From 5f3e58f26dccde915ed9290cfe69735a26024373 Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Fri, 12 Nov 2021 17:29:30 +0530 Subject: [PATCH 10/13] Fix Tests --- api/versions/v1/routers/roles/routes.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/api/versions/v1/routers/roles/routes.py b/api/versions/v1/routers/roles/routes.py index 2f14051..797427b 100644 --- a/api/versions/v1/routers/roles/routes.py +++ b/api/versions/v1/routers/roles/routes.py @@ -61,7 +61,10 @@ async def fetch_role(id: int): if not record: raise HTTPException(404, "Role not found") - return dict(record) + record = dict(record) + if record["color"]: + record["color"] = int(record["color"].as_hex()[1:], 16) + return record @router.post( @@ -118,8 +121,9 @@ async def update_role( body: UpdateRoleBody, roles=has_permissions([ManageRoles()]), ): + if body.color: + body.color = int(body.color.as_hex()[1:], 16) - body.color = int(body.color.as_hex()[1:], 16) role = await Role.fetch(id) if not role: raise HTTPException(404, "Role Not Found") @@ -174,7 +178,7 @@ async def update_role( await Role.pool.execute(query) if data: - query = "UPDATE ROLES SET " + query = "UPDATE ROLESre SET " query += ", ".join("%s = $%d" % (key, i) for i, key in enumerate(data, 2)) query += " WHERE id = $1" From 0157c81401f8412eb876a6f713cdc54861604c6b Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Fri, 12 Nov 2021 17:32:18 +0530 Subject: [PATCH 11/13] Altered SQL Query by mistake :bonk: --- api/versions/v1/routers/roles/routes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/versions/v1/routers/roles/routes.py b/api/versions/v1/routers/roles/routes.py index 797427b..4b8b522 100644 --- a/api/versions/v1/routers/roles/routes.py +++ b/api/versions/v1/routers/roles/routes.py @@ -178,7 +178,7 @@ async def update_role( await Role.pool.execute(query) if data: - query = "UPDATE ROLESre SET " + query = "UPDATE ROLES SET " query += ", ".join("%s = $%d" % (key, i) for i, key in enumerate(data, 2)) query += " WHERE id = $1" From f6e107ee39b1006ca9c7567ae7c7733a1609a029 Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Tue, 16 Nov 2021 19:39:58 +0530 Subject: [PATCH 12/13] tests --- tests/test_roles.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_roles.py b/tests/test_roles.py index c32aa76..9e6238f 100644 --- a/tests/test_roles.py +++ b/tests/test_roles.py @@ -136,6 +136,7 @@ async def test_role_update( data = role.as_dict() data.pop("id") data.pop("position") + print(data.color) assert data == new_data finally: From 54c295379633f7a434c00f40da4f784c5d43a84f Mon Sep 17 00:00:00 2001 From: KrishnaKanth1729 Date: Thu, 2 Dec 2021 09:03:30 +0530 Subject: [PATCH 13/13] Reverted print statement and int conversion --- api/versions/v1/routers/roles/routes.py | 3 +-- tests/test_roles.py | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/api/versions/v1/routers/roles/routes.py b/api/versions/v1/routers/roles/routes.py index 4b8b522..4c7cb3d 100644 --- a/api/versions/v1/routers/roles/routes.py +++ b/api/versions/v1/routers/roles/routes.py @@ -62,8 +62,7 @@ async def fetch_role(id: int): raise HTTPException(404, "Role not found") record = dict(record) - if record["color"]: - record["color"] = int(record["color"].as_hex()[1:], 16) + return record diff --git a/tests/test_roles.py b/tests/test_roles.py index 9e6238f..c32aa76 100644 --- a/tests/test_roles.py +++ b/tests/test_roles.py @@ -136,7 +136,6 @@ async def test_role_update( data = role.as_dict() data.pop("id") data.pop("position") - print(data.color) assert data == new_data finally: