42
42
if type not in [AttrType ._NAMED , AttrType ._ARRAY ]
43
43
}
44
44
45
+ # Constants for reference hierarchy
46
+ REFERENCE_DEPTH = 3
47
+ ENTRIES_PER_LEVEL = 2
48
+
49
+
50
+ class ReferenceLevel :
51
+ def __init__ (self , entity : Entity , entries : list [Entry ]):
52
+ self .entity = entity
53
+ self .entries = entries
54
+
45
55
46
56
def _random_string (length = 10 ) -> str :
47
57
letters = string .ascii_letters
@@ -126,31 +136,76 @@ def _generate_entry(
126
136
)
127
137
128
138
139
+ def generate_reference_hierarchy (user : User , suffix : str ) -> list [ReferenceLevel ]:
140
+ levels : list [ReferenceLevel ] = []
141
+
142
+ # First, create entities and entries for all levels
143
+ for level in range (1 , REFERENCE_DEPTH + 1 ):
144
+ entity = Entity .objects .create (
145
+ name = f"Referred_Entity_L{ level } _{ suffix } " ,
146
+ is_active = True ,
147
+ created_user = user ,
148
+ )
149
+
150
+ # Add string attribute to the entity
151
+ string_attr = EntityAttr .objects .create (
152
+ parent_entity = entity ,
153
+ name = "Attr_string" ,
154
+ type = AttrType .STRING ,
155
+ is_active = True ,
156
+ created_user = user ,
157
+ )
158
+
159
+ entries = [
160
+ Entry .objects .create (
161
+ schema = entity ,
162
+ name = f"Referred_Entry_L{ level } _{ suffix } _{ i } " ,
163
+ is_active = True ,
164
+ created_user = user ,
165
+ )
166
+ for i in range (ENTRIES_PER_LEVEL )
167
+ ]
168
+
169
+ # Set string attribute value for each entry
170
+ for entry in entries :
171
+ string_entry_attr = entry .add_attribute_from_base (string_attr , user )
172
+ string_entry_attr .add_value (user , f"string_value_{ _random_string ()} " )
173
+
174
+ levels .append (ReferenceLevel (entity , entries ))
175
+
176
+ # Set up reference relationships from upper to lower levels (L1->L2->L3->...)
177
+ # The lowest level has no reference
178
+ for level in range (REFERENCE_DEPTH - 1 ):
179
+ current_level = levels [level ]
180
+ next_level = levels [level + 1 ]
181
+
182
+ # Add reference attribute to the current level's entity
183
+ attr = EntityAttr .objects .create (
184
+ parent_entity = current_level .entity ,
185
+ name = f"ref_L{ level + 2 } " ,
186
+ type = AttrType .OBJECT ,
187
+ is_active = True ,
188
+ created_user = user ,
189
+ )
190
+ attr .referral .add (next_level .entity )
191
+
192
+ # Set random reference to next level's entry for each current level entry
193
+ for entry in current_level .entries :
194
+ entry_attr = entry .add_attribute_from_base (attr , user )
195
+ entry_attr .add_value (user , random .choice (next_level .entries ))
196
+
197
+ return levels
198
+
199
+
129
200
def generate_testdata (num_entities : int , num_entries : int , suffix : str ):
130
201
user = User .objects .first ()
131
202
if not user :
132
203
user = User .objects .create (username = "testuser" , email = "testuser@example.com" )
133
204
user .set_password ("password" )
134
205
user .save ()
135
206
136
- ref_entity = Entity .objects .create (
137
- name = f"Referred_Entity_{ suffix } " , is_active = True , created_user = user
138
- )
139
- ref_entries = [
140
- Entry .objects .create (
141
- schema = ref_entity ,
142
- name = f"Referred_Entry_{ suffix } _{ i } " ,
143
- is_active = True ,
144
- created_user = user ,
145
- )
146
- for i in range (2 )
147
- ]
148
- ref_groups = [
149
- Group .objects .create (name = f"Referred_Group_{ suffix } _{ i } " , is_active = True ) for i in range (2 )
150
- ]
151
- ref_roles = [
152
- Role .objects .create (name = f"Referred_Role_{ suffix } _{ i } " , is_active = True ) for i in range (2 )
153
- ]
207
+ # Generate reference hierarchy instead of single reference entity
208
+ reference_levels = generate_reference_hierarchy (user , suffix )
154
209
155
210
entities : list [Entity ] = []
156
211
for i in range (num_entities ):
@@ -173,7 +228,15 @@ def generate_testdata(num_entities: int, num_entries: int, suffix: str):
173
228
AttrType .NAMED_OBJECT ,
174
229
AttrType .ARRAY_NAMED_OBJECT ,
175
230
]:
176
- entity_attr .referral .add (ref_entity )
231
+ # Reference L1 entity for root entities
232
+ entity_attr .referral .add (reference_levels [0 ].entity )
233
+
234
+ ref_groups = [
235
+ Group .objects .create (name = f"Referred_Group_{ suffix } _{ i } " , is_active = True ) for i in range (2 )
236
+ ]
237
+ ref_roles = [
238
+ Role .objects .create (name = f"Referred_Role_{ suffix } _{ i } " , is_active = True ) for i in range (2 )
239
+ ]
177
240
178
241
with ThreadPoolExecutor () as executor :
179
242
futures : list [Future ] = []
@@ -185,7 +248,7 @@ def generate_testdata(num_entities: int, num_entries: int, suffix: str):
185
248
entity ,
186
249
user ,
187
250
f"{ i } _{ j } _{ suffix } " ,
188
- ref_entries ,
251
+ reference_levels [ 0 ]. entries , # Use L1 entries as referrals
189
252
ref_groups ,
190
253
ref_roles ,
191
254
)
0 commit comments