Source code for cadrumo.application.user_profile.profile_key
"""Strict records describing editable application profile keys.The setup wizard owns the questions that produce these records. This moduleowns only the record shape and its local invariants; catalogue resolutionlives in :mod:`cadrumo.application.user_profile.profile_keys`."""from__future__importannotationsfrompydanticimportBaseModel,Field,field_validator,model_validatorfrom...core.errors.hierarchyimportpydantic_validation_boundaryfrom...core.i18n.translatableimportTranslatableastrfrom...core.modelsimportSTRICT_FROZEN_CONFIGfrom...core.requirementimportRequirementfrom...domain.contribuyente.errorsimportProfileValidationError
[docs]classProfileKey(BaseModel):"""Strict frozen record describing one editable profile key."""model_config=STRICT_FROZEN_CONFIGkey:str=Field(min_length=1,max_length=128)requirement:Requirementdescription:trrequired_when_key:str|None=Nonerequired_when_value:str|None=None@field_validator("key")@classmethod@pydantic_validation_boundarydef_validate_key_shape(cls,value:str)->str:"""Reject blank or whitespace-padded keys; keep dot-separated paths intact."""ifnotvalue.strip():raiseProfileValidationError("key must not be empty or whitespace-only")ifvalue.strip()!=value:raiseProfileValidationError("key must not be padded with whitespace")returnvalue@field_validator("description")@classmethod@pydantic_validation_boundarydef_validate_description_key(cls,value:tr)->tr:"""Require profile-owned translation keys for authoritative descriptions."""ifnotvalue.strip():raiseProfileValidationError("description must not be empty")ifnotstr(value).startswith("profile.keys."):raiseProfileValidationError("description must use a profile translation key")returnvalue@field_validator("required_when_key","required_when_value")@classmethod@pydantic_validation_boundarydef_validate_conditional_requirement(cls,value:str|None)->str|None:"""Reject blank or padded conditional requirement values."""ifvalueandvalue.strip()!=value:raiseProfileValidationError("conditional requirement fields must not be padded")ifvalue=="":raiseProfileValidationError("conditional requirement fields must not be empty")returnvalue@model_validator(mode="after")@pydantic_validation_boundarydef_validate_conditional_requirement_pair(self)->ProfileKey:"""Require both halves of a conditional requirement together."""ifbool(self.required_when_key)!=bool(self.required_when_value):raiseProfileValidationError("required_when_key and required_when_value must be set together")returnself