Implementing the partner into the db and contracts

This commit is contained in:
2025-05-02 00:03:08 +02:00
parent 6683d60be5
commit f9b6aae927
5 changed files with 35 additions and 16 deletions

View File

@@ -31,8 +31,7 @@ async def create(schema: ContractCreate, reg=Depends(get_authed_tenant_registry)
contract_dict = schema.model_dump() contract_dict = schema.model_dump()
del(contract_dict['draft_id']) del(contract_dict['draft_id'])
lawyer = await Entity.get(reg.db, reg.user.entity_id) contract_dict['lawyer'] = reg.partner.model_dump()
contract_dict['lawyer'] = lawyer.model_dump()
contract_dict['name'] = draft.name contract_dict['name'] = draft.name
contract_dict['title'] = draft.title contract_dict['title'] = draft.title

View File

@@ -1,11 +1,15 @@
from fastapi import HTTPException, Depends from fastapi import HTTPException, Depends
from hub.auth import get_current_user from hub.auth import get_current_user
from firm.current_firm import CurrentFirmModel, Partner
from firm.db import get_db_client from firm.db import get_db_client
from firm.current_firm import CurrentFirmModel from firm.entity.models import Entity
class Registry: class Registry:
user = None user = None
partner = None
def __init__(self, db_client, instance, firm): def __init__(self, db_client, instance, firm):
self.db = db_client[f"tenant_{instance}_{firm}"] self.db = db_client[f"tenant_{instance}_{firm}"]
@@ -14,11 +18,14 @@ class Registry:
self.current_firm = CurrentFirmModel.get_current(self.db) self.current_firm = CurrentFirmModel.get_current(self.db)
def set_user(self, user): async def set_user(self, user):
for firm in user.firms: for firm in user.firms:
if firm.instance == self.instance and firm.firm == self.firm: 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.user = user
self.db.user = user self.partner = partner_entity
self.db.partner = partner_entity
return return
raise PermissionError raise PermissionError
@@ -30,9 +37,9 @@ async def get_tenant_registry(instance: str, firm: str, db_client=Depends(get_db
return registry 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: try:
registry.set_user(user) await registry.set_user(user)
except PermissionError: except PermissionError:
raise HTTPException(status_code=404, detail="This firm doesn't exist or you are not allowed to access it.") 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") raise HTTPException(status_code=409, detail="Firm configuration already exists")
try: try:
registry.set_user(user) await registry.set_user(user)
except PermissionError: except PermissionError:
raise HTTPException(status_code=404, detail="This firm doesn't exist or you are not allowed to access it.") raise HTTPException(status_code=404, detail="This firm doesn't exist or you are not allowed to access it.")

View File

@@ -37,7 +37,7 @@ class CrudDocument(BaseModel):
@classmethod @classmethod
async def create(cls, db, create_schema): 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") document = cls.model_validate(model_dict).model_dump(mode="json")
result = await cls._get_collection(db).insert_one(document) result = await cls._get_collection(db).insert_one(document)
@@ -52,8 +52,13 @@ class CrudDocument(BaseModel):
} }
@classmethod @classmethod
def list(cls, db): async def list(cls, db, criteria={}):
return cls._get_collection(db).find({}) 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 @classmethod
async def get(cls, db, model_id): async def get(cls, db, model_id):
@@ -66,7 +71,7 @@ class CrudDocument(BaseModel):
@classmethod @classmethod
async def update(cls, db, model, update_schema): 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 = { update_query = {
"$set": {field: value for field, value in model_dict.items() if field!= "id" } "$set": {field: value for field, value in model_dict.items() if field!= "id" }
} }

View File

@@ -36,14 +36,15 @@ class CurrentFirmModel(CrudDocument):
class CurrentFirmSchemaRead(Reader): class CurrentFirmSchemaRead(Reader):
entity: EntityRead entity: EntityRead
partner: EntityRead partner: EntityRead
partner_list: list[EntityRead]
instance: str instance: str
firm: str firm: str
primary_color: str primary_color: str
secondary_color: str secondary_color: str
@classmethod @classmethod
def from_model_and_entities(cls, model, entity, partner): def from_model_and_entities(cls, model, entity, partner, partner_list):
schema = cls(**model.model_dump(mode="json"), entity=entity, partner=partner) schema = cls(**model.model_dump(mode="json"), entity=entity, partner=partner, partner_list=partner_list)
return schema return schema
class CurrentFirmSchemaCreate(Writer): class CurrentFirmSchemaCreate(Writer):

View File

@@ -10,10 +10,17 @@ current_firm_router = APIRouter()
@current_firm_router.get("/", response_model=CurrentFirmSchemaRead, response_description=f"Current Firm records retrieved") @current_firm_router.get("/", response_model=CurrentFirmSchemaRead, response_description=f"Current Firm records retrieved")
async def read(reg=Depends(get_authed_tenant_registry)) -> CurrentFirmSchemaRead: async def read(reg=Depends(get_authed_tenant_registry)) -> CurrentFirmSchemaRead:
document = await CurrentFirmModel.get_current(reg.db) 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 Partner.get_by_user_id(reg.db, reg.user.id)
partner = await Entity.get(reg.db, partner.entity_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") @current_firm_router.post("/", response_description=f"Current Firm added to the database")
async def create(schema: CurrentFirmSchemaCreate, reg=Depends(get_uninitialized_registry)) -> CurrentFirmSchemaRead: async def create(schema: CurrentFirmSchemaCreate, reg=Depends(get_uninitialized_registry)) -> CurrentFirmSchemaRead: