|
9 | 9 | AliasPath, |
10 | 10 | field_serializer, |
11 | 11 | ) |
| 12 | +from pydantic.functional_validators import model_validator |
12 | 13 |
|
13 | 14 | from core.logging import InterceptHandler |
14 | 15 | from core.config import ASSEMBLY_URLS |
@@ -87,6 +88,30 @@ class BaseGenomeDetails(BaseModel): |
87 | 88 | assembly: AssemblyInGenome = None |
88 | 89 | release: Release = None |
89 | 90 |
|
| 91 | + @model_validator(mode="before") |
| 92 | + @classmethod |
| 93 | + def inject_type_from_organism(cls, data): |
| 94 | + """ |
| 95 | + Build a 'type' object from organism.strainType and organism.strain |
| 96 | + before normal field parsing. |
| 97 | + """ |
| 98 | + if not isinstance(data, dict): |
| 99 | + return data |
| 100 | + |
| 101 | + org = data.get("organism") or {} |
| 102 | + strain_type = org.get("strainType") |
| 103 | + strain = org.get("strain") |
| 104 | + |
| 105 | + # only inject if we actually have both strain_type and strain |
| 106 | + if strain_type is not None and strain is not None and "type" not in data: |
| 107 | + data = dict(data) # shallow copy to avoid mutating original |
| 108 | + data["type"] = { |
| 109 | + "kind": strain_type, |
| 110 | + "value": strain, |
| 111 | + } |
| 112 | + |
| 113 | + return data |
| 114 | + |
90 | 115 | @validator("species_taxonomy_id", pre=True) |
91 | 116 | def convert_int_to_str(cls, value): |
92 | 117 | return str(value) |
@@ -137,11 +162,6 @@ def parse_date(cls, value): |
137 | 162 | return year + "-" + month |
138 | 163 |
|
139 | 164 | def __init__(self, **data): |
140 | | - if data.get("organism", {}).get("strainType", None): |
141 | | - data["type"] = { |
142 | | - "kind": data.get("organism", {}).get("strainType", ""), |
143 | | - "value": data.get("organism", {}).get("strain", ""), |
144 | | - } |
145 | 165 | if data.get("attributesInfo", {}).get("AssemblyProviderName", None): |
146 | 166 | data["assembly_provider"] = { |
147 | 167 | "name": data.get("attributesInfo", {}).get( |
|
0 commit comments