Files
OSIT-AE-API-FastAPI/app/models/api_crud_models.py

94 lines
3.2 KiB
Python

import datetime, pytz
from typing import Any, Dict, List, Optional, Set, Union
from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationError, validator
import logging
log = logging.getLogger(__name__)
from app.models.common_field_schema import base_fields, default_num_bytes
# ### BEGIN ### API Search Models ###
class SearchFilter(BaseModel):
"""
Represents a single filter condition.
Example: {"field": "price", "op": "gt", "value": 100}
"""
field: str
op: str # eq, ne, gt, gte, lt, lte, like, in, is_null, is_not_null, contains, startswith, endswith
value: Optional[Any] = None
class SearchQuery(BaseModel):
"""
Represents a complex search query with optional logical grouping.
"""
query_string: Optional[str] = Field(None, alias="q")
and_filters: Optional[List[Union[SearchFilter, 'SearchQuery']]] = Field(None, alias="and")
or_filters: Optional[List[Union[SearchFilter, 'SearchQuery']]] = Field(None, alias="or")
# Support recursive models in Pydantic v1
SearchQuery.update_forward_refs()
# ### END ### API Search Models ###
# ### BEGIN ### API CRUD Models ### Fundraising_Cfg_Base() ###
class Api_Crud_Base(BaseModel):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
super_key: Optional[str] = None # Query(None, min_length=8, max_length=50),
jwt: Optional[str] = None
create_key: Optional[str] = None # Query(None, min_length=6, max_length=50),
read_key: Optional[str] = None # Query(None, min_length=5, max_length=50),
update_key: Optional[str] = None # Query(None, min_length=6, max_length=50),
delete_key: Optional[str] = None # Query(None, min_length=7, max_length=50),
# id_random: Optional[str] = Field(
# alias = 'obj_id_random',
# )
# id: Optional[int] = Field(
# alias = 'obj_id',
# )
obj_type: Optional[str]
# account_id_random: Optional[str]
# account_id: Optional[int]
data_list: Optional[dict]
# enable: Optional[bool]
# hide: Optional[bool]
# priority: Optional[bool]
# sort: Optional[int]
# group: Optional[str] # Same or similar as file_purpose?
# created_on: Optional[datetime.datetime] = None
# updated_on: Optional[datetime.datetime] = None
_processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now)
# @validator('id', always=True)
# def fundraising_cfg_id_lookup(cls, v, values, **kwargs):
# if isinstance(v, int) and v > 0: return v
# elif id_random := values.get('id_random'):
# return redis_lookup_id_random(record_id_random=id_random, table_name='v_fundraising_cfg') # There is only a view 2022-11-18
# return None
# @validator('account_id', always=True)
# def account_id_lookup(cls, v, values, **kwargs):
# if isinstance(v, int) and v > 0: return v
# elif id_random := values.get('account_id_random'):
# return redis_lookup_id_random(record_id_random=id_random, table_name='account')
# return None
class Config:
underscore_attrs_are_private = True
allow_population_by_field_name = True
fields = base_fields
# ### END ### API CRUD Models ### Api_Crud_Base() ###