From f9b6aae927759529c0d7ae7ef48d21bfdcbf2ebc Mon Sep 17 00:00:00 2001 From: ewandor Date: Fri, 2 May 2025 00:03:08 +0200 Subject: [PATCH] Implementing the partner into the db and contracts --- api/rpk-api/firm/contract/routes_contract.py | 3 +-- api/rpk-api/firm/core/depends.py | 19 +++++++++++++------ api/rpk-api/firm/core/models.py | 13 +++++++++---- api/rpk-api/firm/current_firm/__init__.py | 5 +++-- api/rpk-api/firm/current_firm/routes.py | 11 +++++++++-- 5 files changed, 35 insertions(+), 16 deletions(-) diff --git a/api/rpk-api/firm/contract/routes_contract.py b/api/rpk-api/firm/contract/routes_contract.py index 358eb5e..bd86a55 100644 --- a/api/rpk-api/firm/contract/routes_contract.py +++ b/api/rpk-api/firm/contract/routes_contract.py @@ -31,8 +31,7 @@ async def create(schema: ContractCreate, reg=Depends(get_authed_tenant_registry) contract_dict = schema.model_dump() del(contract_dict['draft_id']) - lawyer = await Entity.get(reg.db, reg.user.entity_id) - contract_dict['lawyer'] = lawyer.model_dump() + contract_dict['lawyer'] = reg.partner.model_dump() contract_dict['name'] = draft.name contract_dict['title'] = draft.title diff --git a/api/rpk-api/firm/core/depends.py b/api/rpk-api/firm/core/depends.py index 8f3342c..227d538 100644 --- a/api/rpk-api/firm/core/depends.py +++ b/api/rpk-api/firm/core/depends.py @@ -1,11 +1,15 @@ from fastapi import HTTPException, Depends + from hub.auth import get_current_user +from firm.current_firm import CurrentFirmModel, Partner from firm.db import get_db_client -from firm.current_firm import CurrentFirmModel +from firm.entity.models import Entity + class Registry: user = None + partner = None def __init__(self, db_client, instance, firm): self.db = db_client[f"tenant_{instance}_{firm}"] @@ -14,11 +18,14 @@ class Registry: self.current_firm = CurrentFirmModel.get_current(self.db) - def set_user(self, user): + async def set_user(self, user): for firm in user.firms: if firm.instance == self.instance and firm.firm == self.firm: + partner = await Partner.get_by_user_id(self.db, user.id) + partner_entity = await Entity.get(self.db, partner.entity_id) self.user = user - self.db.user = user + self.partner = partner_entity + self.db.partner = partner_entity return raise PermissionError @@ -30,9 +37,9 @@ async def get_tenant_registry(instance: str, firm: str, db_client=Depends(get_db return registry -def get_authed_tenant_registry(registry=Depends(get_tenant_registry), user=Depends(get_current_user)) -> Registry: +async def get_authed_tenant_registry(registry=Depends(get_tenant_registry), user=Depends(get_current_user)) -> Registry: try: - registry.set_user(user) + await registry.set_user(user) except PermissionError: raise HTTPException(status_code=404, detail="This firm doesn't exist or you are not allowed to access it.") @@ -44,7 +51,7 @@ async def get_uninitialized_registry(instance: str, firm: str, db_client=Depends raise HTTPException(status_code=409, detail="Firm configuration already exists") try: - registry.set_user(user) + await registry.set_user(user) except PermissionError: raise HTTPException(status_code=404, detail="This firm doesn't exist or you are not allowed to access it.") diff --git a/api/rpk-api/firm/core/models.py b/api/rpk-api/firm/core/models.py index 6b2f15e..f0cf5ff 100644 --- a/api/rpk-api/firm/core/models.py +++ b/api/rpk-api/firm/core/models.py @@ -37,7 +37,7 @@ class CrudDocument(BaseModel): @classmethod async def create(cls, db, create_schema): - model_dict = create_schema.model_dump() | {"created_by": db.user.id, "updated_by": db.user.id} + model_dict = create_schema.model_dump() | {"created_by": db.partner.id, "updated_by": db.partner.id} document = cls.model_validate(model_dict).model_dump(mode="json") result = await cls._get_collection(db).insert_one(document) @@ -52,8 +52,13 @@ class CrudDocument(BaseModel): } @classmethod - def list(cls, db): - return cls._get_collection(db).find({}) + async def list(cls, db, criteria={}): + result = [] + for document in await cls._get_collection(db).find(criteria).to_list(): + document["id"] = document.pop("_id") + result.append(cls.model_validate(document)) + + return result @classmethod async def get(cls, db, model_id): @@ -66,7 +71,7 @@ class CrudDocument(BaseModel): @classmethod async def update(cls, db, model, update_schema): - model_dict = update_schema.model_dump(mode="json") | {"updated_by": db.user.id} + model_dict = update_schema.model_dump(mode="json") | {"updated_by": db.partner.id} update_query = { "$set": {field: value for field, value in model_dict.items() if field!= "id" } } diff --git a/api/rpk-api/firm/current_firm/__init__.py b/api/rpk-api/firm/current_firm/__init__.py index a52a44f..490db2b 100644 --- a/api/rpk-api/firm/current_firm/__init__.py +++ b/api/rpk-api/firm/current_firm/__init__.py @@ -36,14 +36,15 @@ class CurrentFirmModel(CrudDocument): class CurrentFirmSchemaRead(Reader): entity: EntityRead partner: EntityRead + partner_list: list[EntityRead] instance: str firm: str primary_color: str secondary_color: str @classmethod - def from_model_and_entities(cls, model, entity, partner): - schema = cls(**model.model_dump(mode="json"), entity=entity, partner=partner) + def from_model_and_entities(cls, model, entity, partner, partner_list): + schema = cls(**model.model_dump(mode="json"), entity=entity, partner=partner, partner_list=partner_list) return schema class CurrentFirmSchemaCreate(Writer): diff --git a/api/rpk-api/firm/current_firm/routes.py b/api/rpk-api/firm/current_firm/routes.py index 3f5c506..5f0f31c 100644 --- a/api/rpk-api/firm/current_firm/routes.py +++ b/api/rpk-api/firm/current_firm/routes.py @@ -10,10 +10,17 @@ current_firm_router = APIRouter() @current_firm_router.get("/", response_model=CurrentFirmSchemaRead, response_description=f"Current Firm records retrieved") async def read(reg=Depends(get_authed_tenant_registry)) -> CurrentFirmSchemaRead: document = await CurrentFirmModel.get_current(reg.db) - entity = await Entity.get(reg.db, document.entity_id) + firm_entity = await Entity.get(reg.db, document.entity_id) partner = await Partner.get_by_user_id(reg.db, reg.user.id) partner = await Entity.get(reg.db, partner.entity_id) - return CurrentFirmSchemaRead.from_model_and_entities(document, EntityRead.from_model(entity), EntityRead.from_model(partner)) + partner_list = await Partner.list(reg.db) + partner_list = await Entity.list(reg.db, {"_id": {"$in": [p.entity_id for p in partner_list]}}) + return CurrentFirmSchemaRead.from_model_and_entities( + document, + EntityRead.from_model(firm_entity), + EntityRead.from_model(partner), + [EntityRead.from_model(p) for p in partner_list] + ) @current_firm_router.post("/", response_description=f"Current Firm added to the database") async def create(schema: CurrentFirmSchemaCreate, reg=Depends(get_uninitialized_registry)) -> CurrentFirmSchemaRead: