ID Vision Phase 2: Standardize Page, Post, Person, Organization, and Hosted File objects

This commit is contained in:
Scott Idem
2026-01-19 18:04:17 -05:00
parent ab8afb72d2
commit 817bb80f87
11 changed files with 324 additions and 457 deletions

View File

@@ -1,10 +1,10 @@
import datetime, pytz
from typing import Dict, List, Optional, Set, Union
from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationError, validator
from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationError, validator, root_validator
from app.db_sql import redis_lookup_id_random
from app.lib_general import *
from app.lib_general import log, logging
from app.models.common_field_schema import base_fields, default_num_bytes
@@ -14,29 +14,50 @@ class Page_Base(BaseModel):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
id_random: Optional[str] = Field(
**base_fields['page_id_random'],
alias = 'page_id_random',
)
id: Optional[int] = Field(
#alias = 'page_id'
)
account_id_random: Optional[str]
account_id: Optional[int]
# --- Standardized Vision IDs (Strings) ---
id: Optional[str] = Field(None, **base_fields['page_id_random'])
page_id: Optional[str] = Field(None, **base_fields['page_id_random'])
account_id: Optional[str] = Field(None, **base_fields['account_id_random'])
site_id: Optional[str] = Field(None, **base_fields['site_id_random'])
alias: Optional[str]
# page_id_random: Optional[str] = Field(
# **base_fields['page_id_random'],
# alias = 'page_id_random',
# )
# id: Optional[int] = Field(
# alias = 'page_id'
# )
code: Optional[str]
name: Optional[str]
title: Optional[str]
description: Optional[str]
summary: Optional[str]
outline: Optional[str]
head_html: Optional[str]
body_html: Optional[str]
footer_html: Optional[str]
content_html: Optional[str]
content_json: Optional[Union[Json, None]]
# keywords: Optional[str]
tags: Optional[str]
start_datetime: Optional[datetime.datetime]
end_datetime: Optional[datetime.datetime]
timezone: Optional[str] # = 'UTC' # Default to UTC
cfg_json: Optional[Union[Json, None]]
data_json: Optional[Union[Json, None]] # Used to store additional data for the page
meta_json: Optional[Union[Json, None]] # Used to store additional data for about the page
enable: Optional[bool]
enable_from: Optional[datetime.datetime] = None
enable_to: Optional[datetime.datetime] = None
title: Optional[str]
body: Optional[str]
style_href: Optional[str]
script_src: Optional[str]
authentication_required: Optional[bool]
hide: Optional[bool]
priority: Optional[bool]
sort: Optional[int]
group: Optional[str]
notes: Optional[str]
created_on: Optional[datetime.datetime] = None
@@ -44,27 +65,31 @@ class Page_Base(BaseModel):
_processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now)
#@validator('page_id_random', always=True)
def page_id_random_copy(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
log.debug(locals())
if values['id_random']:
return values['id_random']
return None
@validator('id', always=True)
def page_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
log.debug(locals())
if values['id_random']:
log.debug(values['id_random'])
return redis_lookup_id_random(record_id_random=values['id_random'], table_name='page')
return None
@root_validator(pre=True)
def map_v3_ids(cls, values):
"""
Vision Transformer:
Map DB keys to clean API keys and strip internal integers.
"""
# 1. Map Random Strings to Clean Names
if rid := values.get('id_random') or values.get('page_id_random'):
values['id'] = rid
values['page_id'] = rid
if a_rid := values.get('account_id_random'):
values['account_id'] = a_rid
if s_rid := values.get('site_id_random'):
values['site_id'] = s_rid
# 2. Prevent "Collision Population"
for k in ['id', 'account_id', 'site_id']:
if k in values and not isinstance(values[k], str):
del values[k]
return values
class Config:
underscore_attrs_are_private = True
allow_population_by_field_name = True
allow_population_by_field_name = False
fields = base_fields
# ### END ### API Page Models ### Page_Base() ###