Showing
5 changed files
with
104 additions
and
42 deletions
| @@ -78,6 +78,12 @@ Library openprocurement_client_helper.py | @@ -78,6 +78,12 @@ Library openprocurement_client_helper.py | ||
| 78 | Fail Field not found: ${field_name} | 78 | Fail Field not found: ${field_name} |
| 79 | 79 | ||
| 80 | 80 | ||
| 81 | +Отримати інформацію із запитання | ||
| 82 | + [Arguments] ${username} ${question_id} ${field_name} | ||
| 83 | + ${field_name}= Отримати шлях до поля об’єкта ${username} ${field_name} ${question_id} | ||
| 84 | + Run Keyword And Return openprocurement_client.Отримати інформацію із тендера ${username} ${field_name} | ||
| 85 | + | ||
| 86 | + | ||
| 81 | Внести зміни в тендер | 87 | Внести зміни в тендер |
| 82 | [Arguments] ${username} ${tender_uaid} ${fieldname} ${fieldvalue} | 88 | [Arguments] ${username} ${tender_uaid} ${fieldname} ${fieldvalue} |
| 83 | ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} | 89 | ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} |
| @@ -136,10 +142,10 @@ Library openprocurement_client_helper.py | @@ -136,10 +142,10 @@ Library openprocurement_client_helper.py | ||
| 136 | 142 | ||
| 137 | 143 | ||
| 138 | Відповісти на питання | 144 | Відповісти на питання |
| 139 | - [Arguments] ${username} ${tender_uaid} ${question} ${answer_data} | 145 | + [Arguments] ${username} ${tender_uaid} ${question} ${answer_data} ${question_id} |
| 140 | ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} | 146 | ${tender}= openprocurement_client.Пошук тендера по ідентифікатору ${username} ${tender_uaid} |
| 141 | ${tender}= set_access_key ${tender} ${USERS.users['${username}'].access_token} | 147 | ${tender}= set_access_key ${tender} ${USERS.users['${username}'].access_token} |
| 142 | - ${answer_data.data.id}= Set Variable ${question.data.id} | 148 | + ${answer_data.data.id}= openprocurement_client.Отримати інформацію із запитання ${username} ${question_id} id |
| 143 | ${question_with_answer}= Call Method ${USERS.users['${username}'].client} patch_question ${tender} ${answer_data} | 149 | ${question_with_answer}= Call Method ${USERS.users['${username}'].client} patch_question ${tender} ${answer_data} |
| 144 | Log object data ${question_with_answer} question_with_answer | 150 | Log object data ${question_with_answer} question_with_answer |
| 145 | [return] ${question_with_answer} | 151 | [return] ${question_with_answer} |
| @@ -311,10 +311,8 @@ Get Broker Property By Username | @@ -311,10 +311,8 @@ Get Broker Property By Username | ||
| 311 | 311 | ||
| 312 | 312 | ||
| 313 | Звірити поле тендера із значенням | 313 | Звірити поле тендера із значенням |
| 314 | - [Arguments] ${username} ${left} ${field} | ||
| 315 | - ${right}= Отримати дані із тендера ${username} ${field} | ||
| 316 | - Log ${left} | ||
| 317 | - Log ${right} | 314 | + [Arguments] ${username} ${left} ${field} ${object_id}=${None} |
| 315 | + ${right}= Отримати дані із тендера ${username} ${field} ${object_id} | ||
| 318 | Порівняти об'єкти ${left} ${right} | 316 | Порівняти об'єкти ${left} ${right} |
| 319 | 317 | ||
| 320 | 318 | ||
| @@ -334,8 +332,8 @@ Get Broker Property By Username | @@ -334,8 +332,8 @@ Get Broker Property By Username | ||
| 334 | 332 | ||
| 335 | 333 | ||
| 336 | Звірити дату тендера із значенням | 334 | Звірити дату тендера із значенням |
| 337 | - [Arguments] ${username} ${left} ${field} | ||
| 338 | - ${right}= Отримати дані із тендера ${username} ${field} | 335 | + [Arguments] ${username} ${left} ${field} ${object_id}=${None} |
| 336 | + ${right}= Отримати дані із тендера ${username} ${field} ${object_id} | ||
| 339 | Порівняти дати ${left} ${right} | 337 | Порівняти дати ${left} ${right} |
| 340 | 338 | ||
| 341 | 339 | ||
| @@ -374,6 +372,44 @@ Get Broker Property By Username | @@ -374,6 +372,44 @@ Get Broker Property By Username | ||
| 374 | \ Звірити дату тендера ${viewer} ${tender_data} items[${index}].${field} | 372 | \ Звірити дату тендера ${viewer} ${tender_data} items[${index}].${field} |
| 375 | 373 | ||
| 376 | 374 | ||
| 375 | +Отримати дані із тендера | ||
| 376 | + [Arguments] ${username} ${field_name} ${object_id}=${None} | ||
| 377 | + Log ${username} | ||
| 378 | + Log ${field_name} | ||
| 379 | + ${field}= Run Keyword If '${object_id}'=='${None}' Set Variable ${field_name} | ||
| 380 | + ... ELSE Отримати шлях до поля об’єкта ${username} ${field_name} ${object_id} | ||
| 381 | + ${status} ${field_value}= Run keyword and ignore error | ||
| 382 | + ... Get from object | ||
| 383 | + ... ${USERS.users['${username}'].tender_data.data} | ||
| 384 | + ... ${field} | ||
| 385 | + # If field in cache, return its value | ||
| 386 | + Run Keyword if '${status}' == 'PASS' Return from keyword ${field_value} | ||
| 387 | + # Else call broker to find field | ||
| 388 | + ${field_value}= Run Keyword IF '${object_id}'=='${None}' Run As ${username} Отримати інформацію із тендера ${field} | ||
| 389 | + ... ELSE Отримати дані із об’єкта тендера ${username} ${object_id} ${field_name} | ||
| 390 | + # And caching its value before return | ||
| 391 | + Set_To_Object ${USERS.users['${username}'].tender_data.data} ${field} ${field_value} | ||
| 392 | + [return] ${field_value} | ||
| 393 | + | ||
| 394 | + | ||
| 395 | +Отримати шлях до поля об’єкта | ||
| 396 | + [Arguments] ${username} ${field_name} ${object_id} | ||
| 397 | + ${object_type}= get_object_type_by_id ${object_id} | ||
| 398 | + ${objects}= Get Variable Value ${USERS.users['${username}'].tender_data.data['${object_type}']} ${empty} | ||
| 399 | + ${object_index}= get_object_index_by_id ${objects} ${object_id} | ||
| 400 | + [return] ${object_type}[${object_index}].${field_name} | ||
| 401 | + | ||
| 402 | + | ||
| 403 | +Отримати дані із об’єкта тендера | ||
| 404 | + [Arguments] ${username} ${object_id} ${field_name} | ||
| 405 | + ${object_type}= get_object_type_by_id ${object_id} | ||
| 406 | + ${status} ${value}= Run Keyword And Ignore Error Run As ${username} Отримати інформацію із запитання ${object_id} ${field_name} | ||
| 407 | + ${field}= Отримати шлях до поля об’єкта ${username} ${field_name} ${object_id} | ||
| 408 | + ${field_value}= Run Keyword IF '${status}'=='PASS' Set Variable ${value} | ||
| 409 | + ... ELSE Run As ${username} Отримати інформацію із тендера ${field} | ||
| 410 | + [return] ${field_value} | ||
| 411 | + | ||
| 412 | + | ||
| 377 | Викликати для учасника | 413 | Викликати для учасника |
| 378 | [Arguments] ${username} ${command} @{arguments} | 414 | [Arguments] ${username} ${command} @{arguments} |
| 379 | Run keyword unless '${WARN_RUN_AS}' == '${True}' | 415 | Run keyword unless '${WARN_RUN_AS}' == '${True}' |
| @@ -388,24 +424,6 @@ Get Broker Property By Username | @@ -388,24 +424,6 @@ Get Broker Property By Username | ||
| 388 | Run Keyword And Return Run As ${username} ${command} @{arguments} | 424 | Run Keyword And Return Run As ${username} ${command} @{arguments} |
| 389 | 425 | ||
| 390 | 426 | ||
| 391 | -Отримати дані із тендера | ||
| 392 | - [Arguments] ${username} ${field_name} | ||
| 393 | - Log ${username} | ||
| 394 | - Log ${field_name} | ||
| 395 | - | ||
| 396 | - ${status} ${field_value}= Run keyword and ignore error | ||
| 397 | - ... Get from object | ||
| 398 | - ... ${USERS.users['${username}'].tender_data.data} | ||
| 399 | - ... ${field_name} | ||
| 400 | - # If field in cache, return its value | ||
| 401 | - Run Keyword if '${status}' == 'PASS' Return from keyword ${field_value} | ||
| 402 | - # Else call broker to find field | ||
| 403 | - ${field_value}= Викликати для учасника ${username} Отримати інформацію із тендера ${field_name} | ||
| 404 | - # And caching its value before return | ||
| 405 | - Set_To_Object ${USERS.users['${username}'].tender_data.data} ${field_name} ${field_value} | ||
| 406 | - [return] ${field_value} | ||
| 407 | - | ||
| 408 | - | ||
| 409 | Run As | 427 | Run As |
| 410 | [Arguments] ${username} ${command} @{arguments} | 428 | [Arguments] ${username} ${command} @{arguments} |
| 411 | [Documentation] | 429 | [Documentation] |
| @@ -415,7 +433,12 @@ Run As | @@ -415,7 +433,12 @@ Run As | ||
| 415 | Log ${command} | 433 | Log ${command} |
| 416 | Log Many @{arguments} | 434 | Log Many @{arguments} |
| 417 | ${keywords_file}= Get Broker Property By Username ${username} keywords_file | 435 | ${keywords_file}= Get Broker Property By Username ${username} keywords_file |
| 418 | - Run Keyword And Return ${keywords_file}.${command} ${username} @{arguments} | 436 | + ${status} ${value}= Run keyword and ignore keyword definitions ${keywords_file}.${command} ${username} @{arguments} |
| 437 | + ${unexpected_args}= Get Regexp Matches '${value}' expected [0-9] arguments, got [0-9] | ||
| 438 | + ${status} ${value}= Run Keyword If "${unexpected_args}"=="[]" Set Variable ${status} ${value} | ||
| 439 | + ... ELSE Run keyword and ignore keyword definitions ${keywords_file}.${command} ${username} @{arguments[:-1]} | ||
| 440 | + Run Keyword If '${status}' == 'FAIL' Fail ${value} | ||
| 441 | + [return] ${value} | ||
| 419 | 442 | ||
| 420 | 443 | ||
| 421 | Require Failure | 444 | Require Failure |
| @@ -15,7 +15,6 @@ ${mode} multi | @@ -15,7 +15,6 @@ ${mode} multi | ||
| 15 | ${role} viewer | 15 | ${role} viewer |
| 16 | ${broker} Quinta | 16 | ${broker} Quinta |
| 17 | 17 | ||
| 18 | -${question_id} 1 | ||
| 19 | ${complaint_id} 1 | 18 | ${complaint_id} 1 |
| 20 | 19 | ||
| 21 | *** Test Cases *** | 20 | *** Test Cases *** |
| @@ -177,8 +176,12 @@ ${complaint_id} 1 | @@ -177,8 +176,12 @@ ${complaint_id} 1 | ||
| 177 | ${question_resp}= Викликати для учасника ${provider} Задати питання ${TENDER['TENDER_UAID']} ${question} | 176 | ${question_resp}= Викликати для учасника ${provider} Задати питання ${TENDER['TENDER_UAID']} ${question} |
| 178 | ${now}= Get Current TZdate | 177 | ${now}= Get Current TZdate |
| 179 | ${question.data.date}= Set variable ${now} | 178 | ${question.data.date}= Set variable ${now} |
| 180 | - ${question_data}= Create Dictionary question=${question} question_resp=${question_resp} | 179 | + ${question_id}= get_id_from_field ${question.data.description} |
| 180 | + ${question_data}= Create Dictionary question=${question} question_resp=${question_resp} question_id=${question_id} | ||
| 181 | + ${question_data}= munch_dict arg=${question_data} | ||
| 181 | Set To Dictionary ${USERS.users['${provider}']} question_data ${question_data} | 182 | Set To Dictionary ${USERS.users['${provider}']} question_data ${question_data} |
| 183 | + | ||
| 184 | + | ||
| 182 | Можливість відповісти на запитання | 185 | Можливість відповісти на запитання |
| 183 | [Tags] ${USERS.users['${tender_owner}'].broker}: Можливість відповісти на запитання | 186 | [Tags] ${USERS.users['${tender_owner}'].broker}: Можливість відповісти на запитання |
| 184 | ... tender_owner | 187 | ... tender_owner |
| @@ -186,7 +189,10 @@ ${complaint_id} 1 | @@ -186,7 +189,10 @@ ${complaint_id} 1 | ||
| 186 | [Setup] Дочекатись синхронізації з майданчиком ${tender_owner} | 189 | [Setup] Дочекатись синхронізації з майданчиком ${tender_owner} |
| 187 | [Teardown] Оновити LAST_MODIFICATION_DATE | 190 | [Teardown] Оновити LAST_MODIFICATION_DATE |
| 188 | ${answer}= Підготовка даних для відповіді на запитання | 191 | ${answer}= Підготовка даних для відповіді на запитання |
| 189 | - ${answer_resp}= Викликати для учасника ${tender_owner} Відповісти на питання ${TENDER['TENDER_UAID']} ${USERS.users['${provider}']['question_data']['question_resp']} ${answer} | 192 | + ${answer_resp}= Викликати для учасника ${tender_owner} |
| 193 | + ... Відповісти на питання ${TENDER['TENDER_UAID']} | ||
| 194 | + ... ${USERS.users['${provider}']['question_data']['question_resp']} ${answer} | ||
| 195 | + ... question_id=${USERS.users['${provider}'].question_data.question_id} | ||
| 190 | ${now}= Get Current TZdate | 196 | ${now}= Get Current TZdate |
| 191 | ${answer.data.date}= Set variable ${now} | 197 | ${answer.data.date}= Set variable ${now} |
| 192 | ${answer_data}= Create Dictionary answer=${answer} answer_resp=${answer_resp} | 198 | ${answer_data}= Create Dictionary answer=${answer} answer_resp=${answer_resp} |
| @@ -8,7 +8,7 @@ from json import load | @@ -8,7 +8,7 @@ from json import load | ||
| 8 | from jsonpath_rw import parse as parse_path | 8 | from jsonpath_rw import parse as parse_path |
| 9 | from munch import fromYAML, Munch, munchify | 9 | from munch import fromYAML, Munch, munchify |
| 10 | from restkit import request | 10 | from restkit import request |
| 11 | -from robot.errors import HandlerExecutionFailed | 11 | +from robot.errors import ExecutionFailed |
| 12 | from robot.libraries.BuiltIn import BuiltIn | 12 | from robot.libraries.BuiltIn import BuiltIn |
| 13 | from robot.output import LOGGER | 13 | from robot.output import LOGGER |
| 14 | from robot.output.loggerhelper import Message | 14 | from robot.output.loggerhelper import Message |
| @@ -202,9 +202,8 @@ def run_keyword_and_ignore_keyword_definitions(name, *args, **kwargs): | @@ -202,9 +202,8 @@ def run_keyword_and_ignore_keyword_definitions(name, *args, **kwargs): | ||
| 202 | """ | 202 | """ |
| 203 | try: | 203 | try: |
| 204 | status, _ = BuiltIn().run_keyword_and_ignore_error(name, *args, **kwargs) | 204 | status, _ = BuiltIn().run_keyword_and_ignore_error(name, *args, **kwargs) |
| 205 | - except HandlerExecutionFailed: | ||
| 206 | - LOGGER.log_message(Message("Keyword is not implemented: {}".format(name), "ERROR")) | ||
| 207 | - status, _ = "FAIL", None | 205 | + except ExecutionFailed as e: |
| 206 | + status, _ = "FAIL", e.message | ||
| 208 | return status, _ | 207 | return status, _ |
| 209 | 208 | ||
| 210 | 209 | ||
| @@ -339,6 +338,24 @@ def munch_dict(arg=None, data=False): | @@ -339,6 +338,24 @@ def munch_dict(arg=None, data=False): | ||
| 339 | return munchify(arg) | 338 | return munchify(arg) |
| 340 | 339 | ||
| 341 | 340 | ||
| 341 | +def get_id_from_field(field): | ||
| 342 | + return re.match(r'(^[filq]-[0-9a-fA-F]{8}): ', field).group(1) | ||
| 343 | + | ||
| 344 | + | ||
| 345 | +def get_object_type_by_id(object_id): | ||
| 346 | + prefixes = {'q': 'questions', 'f': 'features', 'i': 'items', 'l': 'lots'} | ||
| 347 | + return prefixes.get(object_id[0]) | ||
| 348 | + | ||
| 349 | + | ||
| 350 | +def get_object_index_by_id(data, object_id): | ||
| 351 | + for index, element in enumerate(data): | ||
| 352 | + element_id = get_id_from_field(element['description']) | ||
| 353 | + if element_id == object_id: | ||
| 354 | + break | ||
| 355 | + else: | ||
| 356 | + index = 0 | ||
| 357 | + return index | ||
| 358 | + | ||
| 342 | # GUI Frontends common | 359 | # GUI Frontends common |
| 343 | def add_data_for_gui_frontends(tender_data): | 360 | def add_data_for_gui_frontends(tender_data): |
| 344 | now = get_now() | 361 | now = get_now() |
| @@ -15,8 +15,6 @@ ${mode} single | @@ -15,8 +15,6 @@ ${mode} single | ||
| 15 | ${role} viewer | 15 | ${role} viewer |
| 16 | ${broker} Quinta | 16 | ${broker} Quinta |
| 17 | 17 | ||
| 18 | -${question_id} 0 | ||
| 19 | - | ||
| 20 | *** Test Cases *** | 18 | *** Test Cases *** |
| 21 | Можливість оголосити однопредметний тендер | 19 | Можливість оголосити однопредметний тендер |
| 22 | [Tags] ${USERS.users['${tender_owner}'].broker}: Можливість оголосити тендер | 20 | [Tags] ${USERS.users['${tender_owner}'].broker}: Можливість оголосити тендер |
| @@ -331,7 +329,8 @@ ${question_id} 0 | @@ -331,7 +329,8 @@ ${question_id} 0 | ||
| 331 | ${question_resp}= Викликати для учасника ${provider} Задати питання ${TENDER['TENDER_UAID']} ${question} | 329 | ${question_resp}= Викликати для учасника ${provider} Задати питання ${TENDER['TENDER_UAID']} ${question} |
| 332 | ${now}= Get Current TZdate | 330 | ${now}= Get Current TZdate |
| 333 | ${question.data.date}= Set variable ${now} | 331 | ${question.data.date}= Set variable ${now} |
| 334 | - ${question_data}= Create Dictionary question=${question} question_resp=${question_resp} | 332 | + ${question_id}= get_id_from_field ${question.data.description} |
| 333 | + ${question_data}= Create Dictionary question=${question} question_resp=${question_resp} question_id=${question_id} | ||
| 335 | ${question_data}= munch_dict arg=${question_data} | 334 | ${question_data}= munch_dict arg=${question_data} |
| 336 | Set To Dictionary ${USERS.users['${provider}']} question_data=${question_data} | 335 | Set To Dictionary ${USERS.users['${provider}']} question_data=${question_data} |
| 337 | 336 | ||
| @@ -346,7 +345,9 @@ ${question_id} 0 | @@ -346,7 +345,9 @@ ${question_id} 0 | ||
| 346 | ... level2 | 345 | ... level2 |
| 347 | [Setup] Дочекатись синхронізації з майданчиком ${viewer} | 346 | [Setup] Дочекатись синхронізації з майданчиком ${viewer} |
| 348 | Викликати для учасника ${viewer} Оновити сторінку з тендером ${TENDER['TENDER_UAID']} | 347 | Викликати для учасника ${viewer} Оновити сторінку з тендером ${TENDER['TENDER_UAID']} |
| 349 | - Звірити поле тендера із значенням ${viewer} ${USERS.users['${provider}'].question_data.question.data.title} questions[${question_id}].title | 348 | + Звірити поле тендера із значенням ${viewer} |
| 349 | + ... ${USERS.users['${provider}'].question_data.question.data.title} title | ||
| 350 | + ... object_id=${USERS.users['${provider}'].question_data.question_id} | ||
| 350 | 351 | ||
| 351 | 352 | ||
| 352 | Відображення опису анонімного питання без відповіді | 353 | Відображення опису анонімного питання без відповіді |
| @@ -354,14 +355,18 @@ ${question_id} 0 | @@ -354,14 +355,18 @@ ${question_id} 0 | ||
| 354 | ... viewer | 355 | ... viewer |
| 355 | ... ${USERS.users['${viewer}'].broker} | 356 | ... ${USERS.users['${viewer}'].broker} |
| 356 | ... level2 | 357 | ... level2 |
| 357 | - Звірити поле тендера із значенням ${viewer} ${USERS.users['${provider}'].question_data.question.data.description} questions[${question_id}].description | 358 | + Звірити поле тендера із значенням ${viewer} |
| 359 | + ... ${USERS.users['${provider}'].question_data.question.data.description} description | ||
| 360 | + ... object_id=${USERS.users['${provider}'].question_data.question_id} | ||
| 358 | 361 | ||
| 359 | 362 | ||
| 360 | Відображення дати анонімного питання без відповіді | 363 | Відображення дати анонімного питання без відповіді |
| 361 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення анонімного питання без відповідей | 364 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення анонімного питання без відповідей |
| 362 | ... viewer | 365 | ... viewer |
| 363 | ... ${USERS.users['${viewer}'].broker} | 366 | ... ${USERS.users['${viewer}'].broker} |
| 364 | - Звірити дату тендера із значенням ${viewer} ${USERS.users['${provider}'].question_data.question.data.date} questions[${question_id}].date | 367 | + Звірити дату тендера із значенням ${viewer} |
| 368 | + ... ${USERS.users['${provider}'].question_data.question.data.date} date | ||
| 369 | + ... object_id=${USERS.users['${provider}'].question_data.question_id} | ||
| 365 | 370 | ||
| 366 | ############################################################################################## | 371 | ############################################################################################## |
| 367 | # МОЖЛИВІСТЬ | 372 | # МОЖЛИВІСТЬ |
| @@ -389,7 +394,10 @@ ${question_id} 0 | @@ -389,7 +394,10 @@ ${question_id} 0 | ||
| 389 | [Setup] Дочекатись синхронізації з майданчиком ${tender_owner} | 394 | [Setup] Дочекатись синхронізації з майданчиком ${tender_owner} |
| 390 | [Teardown] Оновити LAST_MODIFICATION_DATE | 395 | [Teardown] Оновити LAST_MODIFICATION_DATE |
| 391 | ${answer}= Підготовка даних для відповіді на запитання | 396 | ${answer}= Підготовка даних для відповіді на запитання |
| 392 | - ${answer_resp}= Викликати для учасника ${tender_owner} Відповісти на питання ${TENDER['TENDER_UAID']} ${USERS.users['${provider}']['question_data']['question_resp']} ${answer} | 397 | + ${answer_resp}= Викликати для учасника ${tender_owner} |
| 398 | + ... Відповісти на питання ${TENDER['TENDER_UAID']} | ||
| 399 | + ... ${USERS.users['${provider}']['question_data']['question_resp']} ${answer} | ||
| 400 | + ... question_id=${USERS.users['${provider}'].question_data.question_id} | ||
| 393 | ${now}= Get Current TZdate | 401 | ${now}= Get Current TZdate |
| 394 | ${answer.data.date}= Set variable ${now} | 402 | ${answer.data.date}= Set variable ${now} |
| 395 | ${answer_data}= Create Dictionary answer=${answer} answer_resp=${answer_resp} | 403 | ${answer_data}= Create Dictionary answer=${answer} answer_resp=${answer_resp} |
| @@ -406,7 +414,9 @@ ${question_id} 0 | @@ -406,7 +414,9 @@ ${question_id} 0 | ||
| 406 | ... level2 | 414 | ... level2 |
| 407 | [Setup] Дочекатись синхронізації з майданчиком ${viewer} | 415 | [Setup] Дочекатись синхронізації з майданчиком ${viewer} |
| 408 | Викликати для учасника ${viewer} Оновити сторінку з тендером ${TENDER['TENDER_UAID']} | 416 | Викликати для учасника ${viewer} Оновити сторінку з тендером ${TENDER['TENDER_UAID']} |
| 409 | - Звірити поле тендера із значенням ${viewer} ${USERS.users['${provider}']['answer_data']['answer'].data.answer} questions[${question_id}].answer | 417 | + Звірити поле тендера із значенням ${viewer} |
| 418 | + ... ${USERS.users['${provider}']['answer_data']['answer'].data.answer} answer | ||
| 419 | + ... object_id=${USERS.users['${provider}'].question_data.question_id} | ||
| 410 | 420 | ||
| 411 | ############################################################################################## | 421 | ############################################################################################## |
| 412 | # МОЖЛИВІСТЬ | 422 | # МОЖЛИВІСТЬ |
Please
register
or
login
to post a comment