From 706b3dc2753782df4a57047e51f4d15b3e26bf29 Mon Sep 17 00:00:00 2001 From: ewandor Date: Thu, 27 Mar 2025 00:11:53 +0100 Subject: [PATCH] WIP - Adding multi tenant --- back/app/contract/print/templates/styles.css | 9 +++++++-- back/app/core/routes.py | 14 +++++++------- back/app/db.py | 1 - back/app/main.py | 10 ++++++---- back/app/user/manager.py | 3 +++ 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/back/app/contract/print/templates/styles.css b/back/app/contract/print/templates/styles.css index 53a04640..8f694d0e 100644 --- a/back/app/contract/print/templates/styles.css +++ b/back/app/contract/print/templates/styles.css @@ -109,6 +109,11 @@ h2 { text-indent: 2em; } +.content td p { + text-indent: 0; + text-align: left; +} + .provision { page-break-inside: avoid; } @@ -127,7 +132,7 @@ li { } .mention { - margin: 0px; + margin: 0; font-size: 0.9em; } @@ -139,4 +144,4 @@ li { vertical-align: top; text-align: center; height: 3cm; -} \ No newline at end of file +} diff --git a/back/app/core/routes.py b/back/app/core/routes.py index 0c45938a..036f5a60 100644 --- a/back/app/core/routes.py +++ b/back/app/core/routes.py @@ -6,7 +6,7 @@ from fastapi import APIRouter, HTTPException, Depends from fastapi_pagination import Page, Params, add_pagination from fastapi_pagination.ext.beanie import paginate -from ..user.manager import get_current_user, get_current_superuser +from ..user.manager import get_current_user, get_current_superuser, get_current_user_and_firm def parse_sort(sort_by): @@ -63,19 +63,19 @@ def get_crud_router(model, model_create, model_read, model_update): router = APIRouter() @router.post("/", response_description="{} added to the database".format(model.__name__)) - async def create(item: model_create, user=Depends(get_current_user)) -> dict: + async def create(instance: str, firm: str, item: model_create, user=Depends(get_current_user)) -> dict: await item.validate_foreign_key() o = await model(**item.dict()).create() return {"message": "{} added successfully".format(model.__name__), "id": o.id} @router.get("/{id}", response_description="{} record retrieved".format(model.__name__)) - async def read_id(id: PydanticObjectId, user=Depends(get_current_user)) -> model_read: + async def read_id(instance: str, firm: str, id: PydanticObjectId, user=Depends(get_current_user)) -> model_read: item = await model.get(id) return model_read(**item.dict()) @router.get("/", response_model=Page[model_read], response_description="{} records retrieved".format(model.__name__)) - async def read_list(size: int = 50, page: int = 1, sort_by: str = None, query: str = None, - user=Depends(get_current_user)) -> Page[model_read]: + async def read_list(instance: str, firm: str, size: int = 50, page: int = 1, sort_by: str = None, query: str = None, + user=Depends(get_current_user_and_firm)) -> Page[model_read]: sort = parse_sort(sort_by) query = parse_query(query, model_read) @@ -83,7 +83,7 @@ def get_crud_router(model, model_create, model_read, model_update): return await items @router.put("/{id}", response_description="{} record updated".format(model.__name__)) - async def update(id: PydanticObjectId, req: model_update, user=Depends(get_current_user)) -> model_read: + async def update(instance: str, firm: str, id: PydanticObjectId, req: model_update, user=Depends(get_current_user)) -> model_read: req = {k: v for k, v in req.dict().items() if v is not None} update_query = {"$set": { field: value for field, value in req.items() @@ -100,7 +100,7 @@ def get_crud_router(model, model_create, model_read, model_update): return model_read(**item.dict()) @router.delete("/{id}", response_description="{} record deleted from the database".format(model.__name__)) - async def delete(id: PydanticObjectId, user=Depends(get_current_superuser)) -> dict: + async def delete(instance: str, firm: str, id: PydanticObjectId, user=Depends(get_current_superuser)) -> dict: item = await model.get(id) if not item: diff --git a/back/app/db.py b/back/app/db.py index 7e74dc55..376f5247 100644 --- a/back/app/db.py +++ b/back/app/db.py @@ -6,7 +6,6 @@ from .user import User, AccessToken from .entity.models import Entity from .template.models import ContractTemplate, ProvisionTemplate from .contract.models import ContractDraft, Contract -# from .order.models import Order DB_PASSWORD = "IBO3eber0mdw2R9pnInLdtFykQFY2f06" DATABASE_URL = f"mongodb://root:{DB_PASSWORD}@mongo:27017/" diff --git a/back/app/main.py b/back/app/main.py index 9c53015b..9865bb48 100644 --- a/back/app/main.py +++ b/back/app/main.py @@ -17,10 +17,12 @@ async def on_startup(): app.include_router(get_auth_router(), prefix="/auth", tags=["auth"], ) app.include_router(user_router, prefix="/users", tags=["users"], ) -app.include_router(entity_router, prefix="/entity", tags=["entity"], ) -app.include_router(template_router, prefix="/template", tags=["template"], ) -app.include_router(contract_router, prefix="/contract", tags=["contract"], ) -# app.include_router(order_router, prefix="/order", tags=["order"], ) + +multitenant_prefix = "/{instance}/{firm}" + +app.include_router(entity_router, prefix=f"{multitenant_prefix}/entity", tags=["entity"], ) +app.include_router(template_router, prefix=f"{multitenant_prefix}/template", tags=["template"], ) +app.include_router(contract_router, prefix=f"{multitenant_prefix}/contract", tags=["contract"], ) if __name__ == '__main__': import uvicorn diff --git a/back/app/user/manager.py b/back/app/user/manager.py index daa8e0c5..44778641 100644 --- a/back/app/user/manager.py +++ b/back/app/user/manager.py @@ -109,6 +109,9 @@ fastapi_users = FastAPIUsers[User, uuid.UUID]( get_current_user = fastapi_users.current_user(active=True) get_current_superuser = fastapi_users.current_user(active=True, superuser=True) +def get_current_user_and_firm(user=Depends(get_current_user)): + return user + def get_auth_router(): return fastapi_users.get_auth_router(auth_backend)