WIP - Adding multi tenant

This commit is contained in:
2025-03-27 00:11:53 +01:00
parent ff78f9da54
commit 706b3dc275
5 changed files with 23 additions and 14 deletions

View File

@@ -109,6 +109,11 @@ h2 {
text-indent: 2em; text-indent: 2em;
} }
.content td p {
text-indent: 0;
text-align: left;
}
.provision { .provision {
page-break-inside: avoid; page-break-inside: avoid;
} }
@@ -127,7 +132,7 @@ li {
} }
.mention { .mention {
margin: 0px; margin: 0;
font-size: 0.9em; font-size: 0.9em;
} }

View File

@@ -6,7 +6,7 @@ from fastapi import APIRouter, HTTPException, Depends
from fastapi_pagination import Page, Params, add_pagination from fastapi_pagination import Page, Params, add_pagination
from fastapi_pagination.ext.beanie import paginate 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): def parse_sort(sort_by):
@@ -63,19 +63,19 @@ def get_crud_router(model, model_create, model_read, model_update):
router = APIRouter() router = APIRouter()
@router.post("/", response_description="{} added to the database".format(model.__name__)) @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() await item.validate_foreign_key()
o = await model(**item.dict()).create() o = await model(**item.dict()).create()
return {"message": "{} added successfully".format(model.__name__), "id": o.id} return {"message": "{} added successfully".format(model.__name__), "id": o.id}
@router.get("/{id}", response_description="{} record retrieved".format(model.__name__)) @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) item = await model.get(id)
return model_read(**item.dict()) return model_read(**item.dict())
@router.get("/", response_model=Page[model_read], response_description="{} records retrieved".format(model.__name__)) @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, 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)) -> Page[model_read]: user=Depends(get_current_user_and_firm)) -> Page[model_read]:
sort = parse_sort(sort_by) sort = parse_sort(sort_by)
query = parse_query(query, model_read) query = parse_query(query, model_read)
@@ -83,7 +83,7 @@ def get_crud_router(model, model_create, model_read, model_update):
return await items return await items
@router.put("/{id}", response_description="{} record updated".format(model.__name__)) @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} req = {k: v for k, v in req.dict().items() if v is not None}
update_query = {"$set": { update_query = {"$set": {
field: value for field, value in req.items() 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()) return model_read(**item.dict())
@router.delete("/{id}", response_description="{} record deleted from the database".format(model.__name__)) @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) item = await model.get(id)
if not item: if not item:

View File

@@ -6,7 +6,6 @@ from .user import User, AccessToken
from .entity.models import Entity from .entity.models import Entity
from .template.models import ContractTemplate, ProvisionTemplate from .template.models import ContractTemplate, ProvisionTemplate
from .contract.models import ContractDraft, Contract from .contract.models import ContractDraft, Contract
# from .order.models import Order
DB_PASSWORD = "IBO3eber0mdw2R9pnInLdtFykQFY2f06" DB_PASSWORD = "IBO3eber0mdw2R9pnInLdtFykQFY2f06"
DATABASE_URL = f"mongodb://root:{DB_PASSWORD}@mongo:27017/" DATABASE_URL = f"mongodb://root:{DB_PASSWORD}@mongo:27017/"

View File

@@ -17,10 +17,12 @@ async def on_startup():
app.include_router(get_auth_router(), prefix="/auth", tags=["auth"], ) app.include_router(get_auth_router(), prefix="/auth", tags=["auth"], )
app.include_router(user_router, prefix="/users", tags=["users"], ) 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"], ) multitenant_prefix = "/{instance}/{firm}"
app.include_router(contract_router, prefix="/contract", tags=["contract"], )
# app.include_router(order_router, prefix="/order", tags=["order"], ) 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__': if __name__ == '__main__':
import uvicorn import uvicorn

View File

@@ -109,6 +109,9 @@ fastapi_users = FastAPIUsers[User, uuid.UUID](
get_current_user = fastapi_users.current_user(active=True) get_current_user = fastapi_users.current_user(active=True)
get_current_superuser = fastapi_users.current_user(active=True, superuser=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(): def get_auth_router():
return fastapi_users.get_auth_router(auth_backend) return fastapi_users.get_auth_router(auth_backend)