Commit c81d7647a8166e9ef7c30d26f144f3c81ea10423
Committed by
mykhaly
1 parent
34dd7c34
Optimization initial_data and upd belowThreshold mods
Showing
3 changed files
with
102 additions
and
159 deletions
@@ -2,6 +2,7 @@ | @@ -2,6 +2,7 @@ | ||
2 | from datetime import timedelta | 2 | from datetime import timedelta |
3 | from faker import Factory | 3 | from faker import Factory |
4 | from munch import munchify | 4 | from munch import munchify |
5 | +from uuid import uuid4 | ||
5 | from tempfile import NamedTemporaryFile | 6 | from tempfile import NamedTemporaryFile |
6 | from .local_time import get_now | 7 | from .local_time import get_now |
7 | from op_faker import OP_Provider | 8 | from op_faker import OP_Provider |
@@ -46,7 +47,7 @@ def create_fake_doc(): | @@ -46,7 +47,7 @@ def create_fake_doc(): | ||
46 | return tf.name | 47 | return tf.name |
47 | 48 | ||
48 | 49 | ||
49 | -def test_tender_data(intervals, periods=("enquiry", "tender")): | 50 | +def test_tender_data(intervals, periods=("enquiry", "tender"), number_of_lots=0, meat=False): |
50 | now = get_now() | 51 | now = get_now() |
51 | value_amount = round(random.uniform(3000, 99999999999.99), 2) # max value equals to budget of Ukraine in hryvnias | 52 | value_amount = round(random.uniform(3000, 99999999999.99), 2) # max value equals to budget of Ukraine in hryvnias |
52 | data = { | 53 | data = { |
@@ -71,8 +72,6 @@ def test_tender_data(intervals, periods=("enquiry", "tender")): | @@ -71,8 +72,6 @@ def test_tender_data(intervals, periods=("enquiry", "tender")): | ||
71 | "items": [] | 72 | "items": [] |
72 | } | 73 | } |
73 | data["procuringEntity"]["kind"] = "other" | 74 | data["procuringEntity"]["kind"] = "other" |
74 | - new_item = test_item_data() | ||
75 | - data["items"].append(new_item) | ||
76 | if data.get("mode") == "test": | 75 | if data.get("mode") == "test": |
77 | data["title"] = u"[ТЕСТУВАННЯ] {}".format(data["title"]) | 76 | data["title"] = u"[ТЕСТУВАННЯ] {}".format(data["title"]) |
78 | data["title_en"] = u"[TESTING] {}".format(data["title_en"]) | 77 | data["title_en"] = u"[TESTING] {}".format(data["title_en"]) |
@@ -85,6 +84,54 @@ def test_tender_data(intervals, periods=("enquiry", "tender")): | @@ -85,6 +84,54 @@ def test_tender_data(intervals, periods=("enquiry", "tender")): | ||
85 | inc_dt += timedelta(minutes=intervals[period_name][i]) | 84 | inc_dt += timedelta(minutes=intervals[period_name][i]) |
86 | period_dict[period_name + "Period"][j + "Date"] = inc_dt.isoformat() | 85 | period_dict[period_name + "Period"][j + "Date"] = inc_dt.isoformat() |
87 | data.update(period_dict) | 86 | data.update(period_dict) |
87 | + number_of_lots = int(number_of_lots) | ||
88 | + cpv_group = fake.cpv()[:3] | ||
89 | + if number_of_lots: | ||
90 | + data['lots'] = [] | ||
91 | + for lot_number in range(number_of_lots): | ||
92 | + lot_id = uuid4().hex | ||
93 | + new_lot = test_lot_data(data['value']['amount']) | ||
94 | + data['lots'].append(new_lot) | ||
95 | + data['lots'][lot_number]['id'] = lot_id | ||
96 | + for i in range(fake.random_int(min=1, max=5)): | ||
97 | + new_item = test_item_data(cpv_group) | ||
98 | + data['items'].append(new_item) | ||
99 | + data['items'][lot_number]['relatedLot'] = lot_id | ||
100 | + value_amount = sum(lot['value']['amount'] for lot in data['lots']) | ||
101 | + minimalStep = min(lot['minimalStep']['amount'] for lot in data['lots']) | ||
102 | + data['value']['amount'] = value_amount | ||
103 | + data['minimalStep']['amount'] = minimalStep | ||
104 | + else: | ||
105 | + for i in range(fake.random_int(min=1, max=5)): | ||
106 | + new_item = test_item_data(cpv_group) | ||
107 | + data['items'].append(new_item) | ||
108 | + if meat: | ||
109 | + data['features'] = [ | ||
110 | + { | ||
111 | + "code": uuid4().hex, | ||
112 | + "featureOf": "tenderer", | ||
113 | + "title": field_with_id("f", fake.title()), | ||
114 | + "description": fake.description(), | ||
115 | + "enum": [ | ||
116 | + { | ||
117 | + "value": 0.15, | ||
118 | + "title": fake.word() | ||
119 | + }, | ||
120 | + { | ||
121 | + "value": 0.10, | ||
122 | + "title": fake.word() | ||
123 | + }, | ||
124 | + { | ||
125 | + "value": 0.05, | ||
126 | + "title": fake.word() | ||
127 | + }, | ||
128 | + { | ||
129 | + "value": 0, | ||
130 | + "title": fake.word() | ||
131 | + } | ||
132 | + ] | ||
133 | + } | ||
134 | + ] | ||
88 | return munchify(data) | 135 | return munchify(data) |
89 | 136 | ||
90 | 137 | ||
@@ -119,79 +166,6 @@ def test_tender_data_limited(intervals, procurement_method_type): | @@ -119,79 +166,6 @@ def test_tender_data_limited(intervals, procurement_method_type): | ||
119 | return munchify(data) | 166 | return munchify(data) |
120 | 167 | ||
121 | 168 | ||
122 | -def test_tender_data_multiple_items(intervals): | ||
123 | - t_data = test_tender_data(intervals) | ||
124 | - for _ in range(4): | ||
125 | - new_item = test_item_data() | ||
126 | - t_data['items'].append(new_item) | ||
127 | - return munchify(t_data) | ||
128 | - | ||
129 | - | ||
130 | -def test_tender_data_multiple_lots(intervals): | ||
131 | - tender = test_tender_data(intervals) | ||
132 | - first_lot_id = "3c8f387879de4c38957402dbdb8b31af" | ||
133 | - tender['items'][0]['relatedLot'] = first_lot_id | ||
134 | - tender['lots'] = [test_lot_data(tender['value']['amount'])] | ||
135 | - tender['lots'][0]['id'] = first_lot_id | ||
136 | - max_lot_value_amount = max([lot['value']['amount'] for lot in tender['lots']]) | ||
137 | - tender['value']['amount'] = max_lot_value_amount | ||
138 | - return munchify(tender) | ||
139 | - | ||
140 | - | ||
141 | -def test_tender_data_meat(intervals): | ||
142 | - tender = munchify(test_tender_data(intervals)) | ||
143 | - item_id = "edd0032574bf4402877ad5f362df225a" | ||
144 | - tender['items'][0].id = item_id | ||
145 | - tender.features = [ | ||
146 | - { | ||
147 | - "code": "ee3e24bc17234a41bd3e3a04cc28e9c6", | ||
148 | - "featureOf": "tenderer", | ||
149 | - "title": field_with_id("f", fake.title()), | ||
150 | - "description": fake.description(), | ||
151 | - "enum": [ | ||
152 | - { | ||
153 | - "value": 0.15, | ||
154 | - "title": fake.word() | ||
155 | - }, | ||
156 | - { | ||
157 | - "value": 0.1, | ||
158 | - "title": fake.word() | ||
159 | - }, | ||
160 | - { | ||
161 | - "value": 0.05, | ||
162 | - "title": fake.word() | ||
163 | - }, | ||
164 | - { | ||
165 | - "value": 0, | ||
166 | - "title": fake.word() | ||
167 | - } | ||
168 | - ] | ||
169 | - }, | ||
170 | - { | ||
171 | - "code": "48cfd91612c04125ab406374d7cc8d93", | ||
172 | - "featureOf": "item", | ||
173 | - "relatedItem": item_id, | ||
174 | - "title": field_with_id("f", fake.title()), | ||
175 | - "description": fake.description(), | ||
176 | - "enum": [ | ||
177 | - { | ||
178 | - "value": 0.05, | ||
179 | - "title": fake.word() | ||
180 | - }, | ||
181 | - { | ||
182 | - "value": 0.01, | ||
183 | - "title": fake.word() | ||
184 | - }, | ||
185 | - { | ||
186 | - "value": 0, | ||
187 | - "title": fake.word() | ||
188 | - } | ||
189 | - ] | ||
190 | - } | ||
191 | - ] | ||
192 | - return munchify(tender) | ||
193 | - | ||
194 | - | ||
195 | def test_question_data(): | 169 | def test_question_data(): |
196 | return munchify({ | 170 | return munchify({ |
197 | "data": { | 171 | "data": { |
@@ -202,6 +176,11 @@ def test_question_data(): | @@ -202,6 +176,11 @@ def test_question_data(): | ||
202 | }) | 176 | }) |
203 | 177 | ||
204 | 178 | ||
179 | +def test_related_question(question, relation, obj_id): | ||
180 | + question.data.update({"questionOf": relation, "relatedItem": obj_id}) | ||
181 | + return munchify(question) | ||
182 | + | ||
183 | + | ||
205 | def test_question_answer_data(): | 184 | def test_question_answer_data(): |
206 | return munchify({ | 185 | return munchify({ |
207 | "data": { | 186 | "data": { |
@@ -263,7 +242,7 @@ def test_complaint_reply_data(): | @@ -263,7 +242,7 @@ def test_complaint_reply_data(): | ||
263 | }) | 242 | }) |
264 | 243 | ||
265 | 244 | ||
266 | -def test_bid_data(mode, max_value_amount): | 245 | +def test_bid_data(): |
267 | bid = munchify({ | 246 | bid = munchify({ |
268 | "data": { | 247 | "data": { |
269 | "tenderers": [ | 248 | "tenderers": [ |
@@ -273,35 +252,9 @@ def test_bid_data(mode, max_value_amount): | @@ -273,35 +252,9 @@ def test_bid_data(mode, max_value_amount): | ||
273 | }) | 252 | }) |
274 | bid.data.tenderers[0].address.countryName_en = translate_country_en(bid.data.tenderers[0].address.countryName) | 253 | bid.data.tenderers[0].address.countryName_en = translate_country_en(bid.data.tenderers[0].address.countryName) |
275 | bid.data.tenderers[0].address.countryName_ru = translate_country_ru(bid.data.tenderers[0].address.countryName) | 254 | bid.data.tenderers[0].address.countryName_ru = translate_country_ru(bid.data.tenderers[0].address.countryName) |
276 | - if 'open' in mode: | ||
277 | - bid.data['selfEligible'] = True | ||
278 | - bid.data['selfQualified'] = True | ||
279 | - if mode == 'multiLot': | ||
280 | - bid.data.lotValues = list() | ||
281 | - for _ in range(2): | ||
282 | - bid.data.lotValues.append(test_bid_value(max_value_amount)) | ||
283 | - else: | ||
284 | - bid.data.update(test_bid_value(max_value_amount)) | ||
285 | - if mode == 'meat': | ||
286 | - bid.data.update(test_bid_params()) | ||
287 | return bid | 255 | return bid |
288 | 256 | ||
289 | 257 | ||
290 | -def test_bid_params(): | ||
291 | - return munchify({ | ||
292 | - "parameters": [ | ||
293 | - { | ||
294 | - "code": "ee3e24bc17234a41bd3e3a04cc28e9c6", | ||
295 | - "value": fake.random_element(elements=(0.15, 0.1, 0.05, 0)) | ||
296 | - }, | ||
297 | - { | ||
298 | - "code": "48cfd91612c04125ab406374d7cc8d93", | ||
299 | - "value": fake.random_element(elements=(0.05, 0.01, 0)) | ||
300 | - } | ||
301 | - ] | ||
302 | - }) | ||
303 | - | ||
304 | - | ||
305 | def test_bid_value(max_value_amount): | 258 | def test_bid_value(max_value_amount): |
306 | return munchify({ | 259 | return munchify({ |
307 | "value": { | 260 | "value": { |
@@ -354,23 +307,6 @@ def test_invalid_features_data(): | @@ -354,23 +307,6 @@ def test_invalid_features_data(): | ||
354 | "title": fake.word() | 307 | "title": fake.word() |
355 | } | 308 | } |
356 | ] | 309 | ] |
357 | - }, | ||
358 | - { | ||
359 | - "code": "48cfd91612c04125ab406374d7cc8d93", | ||
360 | - "featureOf": "item", | ||
361 | - "relatedItem": "edd0032574bf4402877ad5f362df225a", | ||
362 | - "title": fake.title(), | ||
363 | - "description": fake.description(), | ||
364 | - "enum": [ | ||
365 | - { | ||
366 | - "value": 0.35, | ||
367 | - "title": fake.word() | ||
368 | - }, | ||
369 | - { | ||
370 | - "value": 0, | ||
371 | - "title": fake.word() | ||
372 | - } | ||
373 | - ] | ||
374 | } | 310 | } |
375 | ] | 311 | ] |
376 | 312 | ||
@@ -400,11 +336,6 @@ def test_lot_document_data(document, lot_id): | @@ -400,11 +336,6 @@ def test_lot_document_data(document, lot_id): | ||
400 | return munchify(document) | 336 | return munchify(document) |
401 | 337 | ||
402 | 338 | ||
403 | -def test_lot_question_data(question, lot_id): | ||
404 | - question.data.update({"questionOf": "lot", "relatedItem": lot_id}) | ||
405 | - return munchify(question) | ||
406 | - | ||
407 | - | ||
408 | def test_lot_complaint_data(complaint, lot_id): | 339 | def test_lot_complaint_data(complaint, lot_id): |
409 | complaint.data.update({"complaintOf": "lot", "relatedItem": lot_id}) | 340 | complaint.data.update({"complaintOf": "lot", "relatedItem": lot_id}) |
410 | return munchify(complaint) | 341 | return munchify(complaint) |
@@ -418,12 +349,12 @@ def test_tender_data_openua(intervals): | @@ -418,12 +349,12 @@ def test_tender_data_openua(intervals): | ||
418 | # We should not provide any values for `enquiryPeriod` when creating | 349 | # We should not provide any values for `enquiryPeriod` when creating |
419 | # an openUA or openEU procedure. That field should not be present at all. | 350 | # an openUA or openEU procedure. That field should not be present at all. |
420 | # Therefore, we pass a nondefault list of periods to `test_tender_data()`. | 351 | # Therefore, we pass a nondefault list of periods to `test_tender_data()`. |
421 | - t_data = test_tender_data(intervals, periods=('tender',)) | ||
422 | - t_data['procurementMethodType'] = 'aboveThresholdUA' | ||
423 | - t_data['procurementMethodDetails'] = 'quick, ' \ | 352 | + data = test_tender_data(intervals, periods=('tender',)) |
353 | + data['procurementMethodType'] = 'aboveThresholdUA' | ||
354 | + data['procurementMethodDetails'] = 'quick, ' \ | ||
424 | 'accelerator={}'.format(accelerator) | 355 | 'accelerator={}'.format(accelerator) |
425 | - t_data['procuringEntity']['kind'] = 'general' | ||
426 | - return t_data | 356 | + data['procuringEntity']['kind'] = 'general' |
357 | + return data | ||
427 | 358 | ||
428 | 359 | ||
429 | def test_tender_data_openeu(intervals): | 360 | def test_tender_data_openeu(intervals): |
@@ -434,15 +365,15 @@ def test_tender_data_openeu(intervals): | @@ -434,15 +365,15 @@ def test_tender_data_openeu(intervals): | ||
434 | # We should not provide any values for `enquiryPeriod` when creating | 365 | # We should not provide any values for `enquiryPeriod` when creating |
435 | # an openUA or openEU procedure. That field should not be present at all. | 366 | # an openUA or openEU procedure. That field should not be present at all. |
436 | # Therefore, we pass a nondefault list of periods to `test_tender_data()`. | 367 | # Therefore, we pass a nondefault list of periods to `test_tender_data()`. |
437 | - t_data = test_tender_data(intervals, periods=('tender',)) | ||
438 | - t_data['procurementMethodType'] = 'aboveThresholdEU' | ||
439 | - t_data['procurementMethodDetails'] = 'quick, ' \ | 368 | + data = test_tender_data(intervals, periods=('tender',)) |
369 | + data['procurementMethodType'] = 'aboveThresholdEU' | ||
370 | + data['procurementMethodDetails'] = 'quick, ' \ | ||
440 | 'accelerator={}'.format(accelerator) | 371 | 'accelerator={}'.format(accelerator) |
441 | - t_data['title_en'] = "[TESTING]" | ||
442 | - for item_number, item in enumerate(t_data['items']): | 372 | + data['title_en'] = "[TESTING]" |
373 | + for item_number, item in enumerate(data['items']): | ||
443 | item['description_en'] = "Test item #{}".format(item_number) | 374 | item['description_en'] = "Test item #{}".format(item_number) |
444 | - t_data['procuringEntity']['contactPoint']['name_en'] = fake_en.name() | ||
445 | - t_data['procuringEntity']['contactPoint']['availableLanguage'] = "en" | ||
446 | - t_data['procuringEntity']['identifier']['legalName_en'] = "Institution \"Vinnytsia City Council primary and secondary general school № 10\"" | ||
447 | - t_data['procuringEntity']['kind'] = 'general' | ||
448 | - return t_data | 375 | + data['procuringEntity']['contactPoint']['name_en'] = fake_en.name() |
376 | + data['procuringEntity']['contactPoint']['availableLanguage'] = "en" | ||
377 | + data['procuringEntity']['identifier']['legalName_en'] = "Institution \"Vinnytsia City Council primary and secondary general school № 10\"" | ||
378 | + data['procuringEntity']['kind'] = 'general' | ||
379 | + return data |
@@ -240,9 +240,9 @@ Get Broker Property By Username | @@ -240,9 +240,9 @@ Get Broker Property By Username | ||
240 | 240 | ||
241 | 241 | ||
242 | Підготувати дані для подання пропозиції | 242 | Підготувати дані для подання пропозиції |
243 | - [Arguments] ${max_value_amount} | ||
244 | - ${bid_data}= test_bid_data ${mode} ${max_value_amount} | ||
245 | - [Return] ${bid_data} | 243 | + [Arguments] ${username} |
244 | + ${bid}= generate_test_bid_data ${USERS.users['${username}'].tender_data} | ||
245 | + [Return] ${bid} | ||
246 | 246 | ||
247 | 247 | ||
248 | Підготувати дані про постачальника | 248 | Підготувати дані про постачальника |
@@ -19,7 +19,9 @@ from robot.output.loggerhelper import Message | @@ -19,7 +19,9 @@ from robot.output.loggerhelper import Message | ||
19 | from .initial_data import ( | 19 | from .initial_data import ( |
20 | create_fake_doc, | 20 | create_fake_doc, |
21 | create_fake_sentence, | 21 | create_fake_sentence, |
22 | + fake, | ||
22 | test_bid_data, | 23 | test_bid_data, |
24 | + test_bid_value, | ||
23 | test_claim_answer_data, | 25 | test_claim_answer_data, |
24 | test_claim_data, | 26 | test_claim_data, |
25 | test_complaint_data, | 27 | test_complaint_data, |
@@ -30,17 +32,14 @@ from .initial_data import ( | @@ -30,17 +32,14 @@ from .initial_data import ( | ||
30 | test_lot_complaint_data, | 32 | test_lot_complaint_data, |
31 | test_lot_data, | 33 | test_lot_data, |
32 | test_lot_document_data, | 34 | test_lot_document_data, |
33 | - test_lot_question_data, | 35 | + test_related_question, |
34 | test_question_answer_data, | 36 | test_question_answer_data, |
35 | test_question_data, | 37 | test_question_data, |
36 | test_supplier_data, | 38 | test_supplier_data, |
37 | test_tender_data, | 39 | test_tender_data, |
38 | test_tender_data_limited, | 40 | test_tender_data_limited, |
39 | - test_tender_data_meat, | ||
40 | - test_tender_data_multiple_items, | ||
41 | - test_tender_data_multiple_lots, | ||
42 | test_tender_data_openeu, | 41 | test_tender_data_openeu, |
43 | - test_tender_data_openua | 42 | + test_tender_data_openua, |
44 | ) | 43 | ) |
45 | from barbecue import chef | 44 | from barbecue import chef |
46 | from restkit import request | 45 | from restkit import request |
@@ -263,7 +262,7 @@ def compute_intrs(brokers_data, used_brokers): | @@ -263,7 +262,7 @@ def compute_intrs(brokers_data, used_brokers): | ||
263 | return result | 262 | return result |
264 | 263 | ||
265 | 264 | ||
266 | -def prepare_test_tender_data(procedure_intervals, mode): | 265 | +def prepare_test_tender_data(procedure_intervals, mode, number_of_lots=0, meat=False): |
267 | # Get actual intervals by mode name | 266 | # Get actual intervals by mode name |
268 | if mode in procedure_intervals: | 267 | if mode in procedure_intervals: |
269 | intervals = procedure_intervals[mode] | 268 | intervals = procedure_intervals[mode] |
@@ -281,14 +280,7 @@ def prepare_test_tender_data(procedure_intervals, mode): | @@ -281,14 +280,7 @@ def prepare_test_tender_data(procedure_intervals, mode): | ||
281 | else: | 280 | else: |
282 | assert 'accelerator' not in intervals.keys(), \ | 281 | assert 'accelerator' not in intervals.keys(), \ |
283 | "Accelerator is not available for mode '{0}'".format(mode) | 282 | "Accelerator is not available for mode '{0}'".format(mode) |
284 | - | ||
285 | - if mode == 'meat': | ||
286 | - return munchify({'data': test_tender_data_meat(intervals)}) | ||
287 | - elif mode == 'multiItem': | ||
288 | - return munchify({'data': test_tender_data_multiple_items(intervals)}) | ||
289 | - elif mode == 'multiLot': | ||
290 | - return munchify({'data': test_tender_data_multiple_lots(intervals)}) | ||
291 | - elif mode == 'negotiation': | 283 | + if mode == 'negotiation': |
292 | return munchify({'data': test_tender_data_limited(intervals, 'negotiation')}) | 284 | return munchify({'data': test_tender_data_limited(intervals, 'negotiation')}) |
293 | elif mode == 'negotiation.quick': | 285 | elif mode == 'negotiation.quick': |
294 | return munchify({'data': test_tender_data_limited(intervals, 'negotiation.quick')}) | 286 | return munchify({'data': test_tender_data_limited(intervals, 'negotiation.quick')}) |
@@ -298,8 +290,8 @@ def prepare_test_tender_data(procedure_intervals, mode): | @@ -298,8 +290,8 @@ def prepare_test_tender_data(procedure_intervals, mode): | ||
298 | return munchify({'data': test_tender_data_openua(intervals)}) | 290 | return munchify({'data': test_tender_data_openua(intervals)}) |
299 | elif mode == 'reporting': | 291 | elif mode == 'reporting': |
300 | return munchify({'data': test_tender_data_limited(intervals, 'reporting')}) | 292 | return munchify({'data': test_tender_data_limited(intervals, 'reporting')}) |
301 | - elif mode == 'single': | ||
302 | - return munchify({'data': test_tender_data(intervals)}) | 293 | + elif mode == 'belowThreshold': |
294 | + return munchify({'data': test_tender_data(intervals, number_of_lots=number_of_lots, meat=meat)}) | ||
303 | raise ValueError("Invalid mode for prepare_test_tender_data") | 295 | raise ValueError("Invalid mode for prepare_test_tender_data") |
304 | 296 | ||
305 | 297 | ||
@@ -432,6 +424,26 @@ def get_document_index_by_id(data, document_id): | @@ -432,6 +424,26 @@ def get_document_index_by_id(data, document_id): | ||
432 | raise IndexError | 424 | raise IndexError |
433 | 425 | ||
434 | 426 | ||
427 | +def generate_test_bid_data(tender_data): | ||
428 | + bid = test_bid_data() | ||
429 | + if 'open' in tender_data['data']['mode']: | ||
430 | + bid.data.selfEligible = True | ||
431 | + bid.data.selfQualified = True | ||
432 | + if 'lots' in tender_data['data']: | ||
433 | + bid.data.lotValues = [] | ||
434 | + for lot in tender_data['data']['lots']: | ||
435 | + value = test_bid_value(lot['value']['amount']) | ||
436 | + value['relatedLot'] = lot['id'] | ||
437 | + bid.data.lotValues.append(value) | ||
438 | + else: | ||
439 | + bid.data.update(test_bid_value(tender_data['data']['value']['amount'])) | ||
440 | + if 'features' in tender_data['data']: | ||
441 | + bid.data.parameters = [] | ||
442 | + for feature in tender_data['data']['features']: | ||
443 | + parameter = {"value": fake.random_element(elements=(0.15, 0.1, 0.05, 0)), "code": feature['code']} | ||
444 | + bid.data.parameters.append(parameter) | ||
445 | + return bid | ||
446 | + | ||
435 | 447 | ||
436 | # GUI Frontends common | 448 | # GUI Frontends common |
437 | def add_data_for_gui_frontends(tender_data): | 449 | def add_data_for_gui_frontends(tender_data): |
Please
register
or
login
to post a comment