Full Working static multi tenant
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
import datetime
|
||||
from typing import List, Literal, Optional
|
||||
from enum import Enum
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import BaseModel, Field, validator
|
||||
from beanie.operators import ElemMatch
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from ..core.models import CrudDocument, RichtextSingleline, RichtextMultiline, DictionaryEntry
|
||||
from ..core.filter import Filter
|
||||
from ..entity.models import Entity
|
||||
|
||||
|
||||
@@ -57,9 +58,12 @@ class Party(BaseModel):
|
||||
signature_affixed: bool = False
|
||||
signature_png: Optional[str] = None
|
||||
|
||||
class ContractProvisionType(Enum):
|
||||
genuine = 'genuine'
|
||||
template = 'template'
|
||||
|
||||
class ProvisionGenuine(BaseModel):
|
||||
type: Literal['genuine'] = 'genuine'
|
||||
type: Literal['genuine'] = ContractProvisionType.genuine
|
||||
title: str = RichtextSingleline(props={"parametrized": True}, default="", title="Titre")
|
||||
body: str = RichtextMultiline(props={"parametrized": True}, default="", title="Corps")
|
||||
|
||||
@@ -68,7 +72,7 @@ class ProvisionGenuine(BaseModel):
|
||||
|
||||
|
||||
class ContractProvisionTemplateReference(BaseModel):
|
||||
type: Literal['template'] = 'template'
|
||||
type: Literal['template'] = ContractProvisionType.template
|
||||
provision_template_id: str = Field(
|
||||
foreignKey={
|
||||
"reference": {
|
||||
@@ -97,6 +101,9 @@ class Provision(BaseModel):
|
||||
title: str = RichtextSingleline(title="Titre")
|
||||
body: str = RichtextMultiline(title="Corps")
|
||||
|
||||
class ContractDraftUpdateStatus(BaseModel):
|
||||
status: str = Field()
|
||||
todo: List[str] = Field(default=[])
|
||||
|
||||
class ContractDraft(CrudDocument):
|
||||
"""
|
||||
@@ -130,7 +137,7 @@ class ContractDraft(CrudDocument):
|
||||
class Config:
|
||||
title = 'Brouillon de contrat'
|
||||
|
||||
async def check_is_ready(self):
|
||||
async def check_is_ready(self, db):
|
||||
if self.status == ContractDraftStatus.published:
|
||||
return
|
||||
|
||||
@@ -152,18 +159,18 @@ class ContractDraft(CrudDocument):
|
||||
|
||||
for v in self.variables:
|
||||
if not (v.key and v.value):
|
||||
self.todo.append('Empty variable')
|
||||
self.todo.append(f'Empty variable: {v.key}')
|
||||
|
||||
if self.todo:
|
||||
self.status = ContractDraftStatus.in_progress
|
||||
else:
|
||||
self.status = ContractDraftStatus.ready
|
||||
|
||||
await self.update({"$set": {
|
||||
"status": self.status,
|
||||
"todo": self.todo
|
||||
}})
|
||||
await self.update(db, self, ContractDraftUpdateStatus(status=self.status, todo=self.todo))
|
||||
|
||||
async def update_status(self, db, status):
|
||||
update = ContractDraftUpdateStatus(status=status)
|
||||
await self.update(db, self, update)
|
||||
|
||||
class Contract(CrudDocument):
|
||||
"""
|
||||
@@ -181,19 +188,14 @@ class Contract(CrudDocument):
|
||||
lawyer: Entity = Field(title="Avocat en charge")
|
||||
location: str = Field(title="Lieu")
|
||||
date: datetime.date = Field(title="Date")
|
||||
label: Optional[str] = None
|
||||
|
||||
@validator("label", always=True)
|
||||
def generate_label(cls, v, values, **kwargs):
|
||||
if not v:
|
||||
contract_label = values['title']
|
||||
for p in values['parties']:
|
||||
contract_label = contract_label + f" - {p.entity.label}"
|
||||
def compute_label(self) -> str:
|
||||
contract_label = self.title
|
||||
for p in self.parties:
|
||||
contract_label = f"{contract_label} - {p.entity.label}"
|
||||
|
||||
contract_label = contract_label + f" - {values['date'].strftime('%m/%d/%Y')}"
|
||||
return contract_label
|
||||
|
||||
return v
|
||||
contract_label = f"{contract_label} - {self.date.strftime('%m/%d/%Y')}"
|
||||
return contract_label
|
||||
|
||||
class Settings(CrudDocument.Settings):
|
||||
fulltext_search = ['name', 'title']
|
||||
@@ -205,18 +207,19 @@ class Contract(CrudDocument):
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def find_by_signature_id(cls, signature_id: str):
|
||||
crit = ElemMatch(cls.parties, {"signature_uuid": signature_id})
|
||||
return cls.find_one(crit)
|
||||
async def find_by_signature_id(cls, db, signature_id: UUID):
|
||||
request = {'parties': {"$elemMatch": {"signature_uuid": str(signature_id) }}}
|
||||
value = await cls._get_collection(db).find_one(request)
|
||||
return cls.model_validate(value) if value else None
|
||||
|
||||
def get_signature(self, signature_id: str):
|
||||
for p in self.parties:
|
||||
if p.signature_uuid == signature_id:
|
||||
if p.signature_uuid == str(signature_id):
|
||||
return p
|
||||
|
||||
def get_signature_index(self, signature_id: str):
|
||||
for i, p in enumerate(self.parties):
|
||||
if p.signature_uuid == signature_id:
|
||||
if p.signature_uuid == str(signature_id):
|
||||
return i
|
||||
|
||||
def is_signed(self):
|
||||
@@ -225,9 +228,39 @@ class Contract(CrudDocument):
|
||||
return False
|
||||
return True
|
||||
|
||||
async def affix_signature(self, db, signature_index):
|
||||
update_query = {"$set": {
|
||||
f'parties.{signature_index}.signature_affixed': True
|
||||
}}
|
||||
|
||||
self.parties[signature_index].signature_affixed = True
|
||||
if self.is_signed():
|
||||
update_query["$set"]['status'] = 'signed'
|
||||
|
||||
await self._get_collection(db).update_one({"_id": self.id}, update_query)
|
||||
return await self.get(db, self.id)
|
||||
|
||||
|
||||
def replace_variables_in_value(variables, value: str):
|
||||
for v in variables:
|
||||
if v.value:
|
||||
value = value.replace('%{}%'.format(v.key), v.value)
|
||||
return value
|
||||
|
||||
class ContractDraftFilters(Filter):
|
||||
name__like: Optional[str] = None
|
||||
|
||||
order_by: Optional[list[str]] = None
|
||||
|
||||
class Constants(Filter.Constants):
|
||||
model = ContractDraft
|
||||
search_model_fields = ["name"]
|
||||
|
||||
class ContractFilters(Filter):
|
||||
name__like: Optional[str] = None
|
||||
|
||||
order_by: Optional[list[str]] = None
|
||||
|
||||
class Constants(Filter.Constants):
|
||||
model = Contract
|
||||
search_model_fields = ["name"]
|
||||
Reference in New Issue
Block a user