44import os
55import logging
66from pathlib import Path
7+ from pydantic import BaseModel , create_model , ConfigDict
8+ from typing import Any , List , Dict , Union
9+ import rdflib
710from Settings import auto_config as cfg
811
12+ TYPE_MAP = {
13+ 'float' : float ,
14+ 'str' : str ,
15+ 'int' : int ,
16+ 'bool' : bool ,
17+ 'object' : dict ,
18+ 'list' : list ,
19+ 'object_list' : list
20+ }
21+
922def handle_upload_file (uploaded_file ):
1023 UPLOAD_DIR = Path (cfg .UPLOAD_DIR )
1124 if not os .path .exists (UPLOAD_DIR ):
@@ -61,4 +74,35 @@ def ensure_package_installed(package_name):
6174 if importlib .util .find_spec (package_name ) is None :
6275 install_package (package_name )
6376 else :
64- logging .info (f"Package '{ package_name } ' is already installed." )
77+ logging .info (f"Package '{ package_name } ' is already installed." )
78+
79+
80+ def build_nested_model (name : str , flat_data : Dict [str , Any ]) -> type [BaseModel ]:
81+ tree = {}
82+ for key , (rdf_type , _ ) in flat_data .items ():
83+ parts = key .split ('.' )
84+ current = tree
85+ for i , part in enumerate (parts ):
86+ if part not in current :
87+ current [part ] = {"_children" : {}}
88+ if i == len (parts ) - 1 :
89+ current [part ]["_type" ] = str (rdf_type )
90+ current = current [part ]["_children" ]
91+
92+ def generate_pydantic (model_name : str , node_dict : Dict ) -> type [BaseModel ]:
93+ fields = {}
94+ for field_name , metadata in node_dict .items ():
95+ field_type_str = metadata .get ("_type" , "object" )
96+ children = metadata .get ("_children" )
97+ if children :
98+ sub_model = generate_pydantic (f"{ field_name } Model" , children )
99+ if field_type_str == 'object_list' :
100+ fields [field_name ] = (List [sub_model ], ...)
101+ else :
102+ fields [field_name ] = (sub_model , ...)
103+ else :
104+ python_type = TYPE_MAP .get (field_type_str , Any )
105+ fields [field_name ] = (python_type , ...)
106+ return create_model (model_name , ** fields , __config__ = ConfigDict (extra = 'allow' ))
107+
108+ return generate_pydantic (name , tree )
0 commit comments