From 62a2a83f639b32e199f44cbca8972d687a2e03d2 Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Mon, 24 Dec 2018 23:56:10 +0200 Subject: [PATCH 01/59] Update setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index fee5b68..2c6d344 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import find_packages, setup -version = '2.0.0' +version = '2.1dp' install_requires = [ 'gevent', From bee01fc3517457b2df8afeb2971110df91d535e5 Mon Sep 17 00:00:00 2001 From: Taras Kozlovskyi Date: Fri, 11 Jan 2019 15:13:09 +0200 Subject: [PATCH 02/59] Added extra loggers --- openprocurement_client/resources/sync.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/resources/sync.py b/openprocurement_client/resources/sync.py index 4bf886c..fa5abe3 100644 --- a/openprocurement_client/resources/sync.py +++ b/openprocurement_client/resources/sync.py @@ -185,9 +185,13 @@ def feeder(self): LOGGER.info('Stop check backward worker') check_down_worker = False else: + if not self.backward_worker.successful(): + LOGGER.warning('Exception from forward_worker: {}'.format(repr(self.backward_worker.exception))) self.restart_sync() check_down_worker = True if self.forward_worker.ready(): + if not self.forward_worker.successful(): + LOGGER.warning('Exception from forward_worker: {}'.format(repr(self.forward_worker.exception))) self.restart_sync() check_down_worker = True LOGGER.debug('Feeder queue size {} items'.format(self.queue.qsize()), @@ -204,6 +208,9 @@ def retriever_backward(self): LOGGER.debug('Backward response length {} items'.format(len(response.data)), extra={'BACKWARD_RESPONSE_LENGTH': len(response.data)}) if self.cookies != self.backward_client.session.cookies: + LOGGER.info('Backward client Cookies mismatch: {}, {}'.format( + repr(self.cookies), repr(self.backward_client.session.cookies)) + ) raise Exception('LB Server mismatch') while response.data: LOGGER.debug('Backward: Start process data.') @@ -215,6 +222,9 @@ def retriever_backward(self): LOGGER.debug('Backward response length {} items'.format(len(response.data)), extra={'BACKWARD_RESPONSE_LENGTH': len(response.data)}) if self.cookies != self.backward_client.session.cookies: + LOGGER.info('Backward client Cookies mismatch: {}, {}'.format( + repr(self.cookies), repr(self.backward_client.session.cookies)) + ) raise Exception('LB Server mismatch') LOGGER.info('Backward: pause between requests {} sec.'.format( self.retrievers_params.get('down_requests_sleep', 5))) @@ -228,6 +238,9 @@ def retriever_forward(self): LOGGER.debug('Forward response length {} items'.format(len(response.data)), extra={'FORWARD_RESPONSE_LENGTH': len(response.data)}) if self.cookies != self.forward_client.session.cookies: + LOGGER.info('Forward client Cookies mismatch: {}, {}'.format( + repr(self.cookies), repr(self.forward_client.session.cookies)) + ) raise Exception('LB Server mismatch') while 1: self.forward_heartbeat = time() @@ -240,6 +253,9 @@ def retriever_forward(self): LOGGER.debug('Forward response length {} items'.format(len(response.data)), extra={'FORWARD_RESPONSE_LENGTH': len(response.data)}) if self.cookies != self.forward_client.session.cookies: + LOGGER.info('Forward client Cookies mismatch: {}, {}'.format( + repr(self.cookies), repr(self.forward_client.session.cookies)) + ) raise Exception('LB Server mismatch') if len(response.data) != 0: LOGGER.info( @@ -264,6 +280,9 @@ def retriever_forward(self): if self.retrievers_params['up_wait_sleep'] < 30: self.retrievers_params['up_wait_sleep'] += 1 if self.cookies != self.forward_client.session.cookies: + LOGGER.info('Forward client Cookies mismatch: {}, {}'.format( + repr(self.cookies), repr(self.forward_client.session.cookies)) + ) raise Exception('LB Server mismatch') return 1 @@ -309,4 +328,4 @@ def get_tenders(host=DEFAULT_API_HOST, version=DEFAULT_API_VERSION, if __name__ == '__main__': for tender_item in get_tenders(): - print('Tender {0[id]}'.format(tender_item)) \ No newline at end of file + print('Tender {0[id]}'.format(tender_item)) From 910d6c001830ab7512a48f84cdd2e0f9ffdc0079 Mon Sep 17 00:00:00 2001 From: Taras Kozlovskyi Date: Mon, 14 Jan 2019 12:39:47 +0200 Subject: [PATCH 03/59] Added Exception loggers on get_resource_items --- openprocurement_client/resources/sync.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openprocurement_client/resources/sync.py b/openprocurement_client/resources/sync.py index fa5abe3..269e691 100644 --- a/openprocurement_client/resources/sync.py +++ b/openprocurement_client/resources/sync.py @@ -140,9 +140,13 @@ def get_resource_items(self): LOGGER.info('Stop check backward worker') check_down_worker = False else: + if not self.backward_worker.successful(): + LOGGER.warning('Exception from forward_worker: {}'.format(repr(self.backward_worker.exception))) self.restart_sync() check_down_worker = True if self.forward_worker.ready(): + if not self.forward_worker.successful(): + LOGGER.warning('Exception from forward_worker: {}'.format(repr(self.forward_worker.exception))) self.restart_sync() check_down_worker = True while not self.queue.empty(): From af847e79c9b0452026a9675908e469286893590f Mon Sep 17 00:00:00 2001 From: Taras Kozlovskyi Date: Mon, 14 Jan 2019 13:14:19 +0200 Subject: [PATCH 04/59] Retrievers parameters based on DEFAULT_RETRIEVERS_PARAMS --- openprocurement_client/resources/sync.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/openprocurement_client/resources/sync.py b/openprocurement_client/resources/sync.py index 269e691..ac48be3 100644 --- a/openprocurement_client/resources/sync.py +++ b/openprocurement_client/resources/sync.py @@ -9,7 +9,7 @@ from openprocurement_client.clients import APIResourceClientSync from openprocurement_client.utils import get_response - +from copy import deepcopy DEFAULT_RETRIEVERS_PARAMS = { 'down_requests_sleep': 5, @@ -36,7 +36,7 @@ class ResourceFeeder(object): def __init__(self, host=DEFAULT_API_HOST, version=DEFAULT_API_VERSION, key=DEFAULT_API_KEY, resource='tenders', extra_params=DEFAULT_API_EXTRA_PARAMS, - retrievers_params=DEFAULT_RETRIEVERS_PARAMS, adaptive=False, + retrievers_params={}, adaptive=False, with_priority=False): super(ResourceFeeder, self).__init__() LOGGER.info('Init Resource Feeder...') @@ -47,7 +47,8 @@ def __init__(self, host=DEFAULT_API_HOST, version=DEFAULT_API_VERSION, self.adaptive = adaptive self.extra_params = extra_params - self.retrievers_params = retrievers_params + self.retrievers_params = deepcopy(DEFAULT_RETRIEVERS_PARAMS) + self.retrievers_params.update(retrievers_params) self.queue = PriorityQueue(maxsize=retrievers_params['queue_size']) self.forward_priority = 1 if with_priority else 0 From fba34ccaf6a35518bce7aaa6519211853b9cc6a9 Mon Sep 17 00:00:00 2001 From: Taras Kozlovskyi Date: Mon, 14 Jan 2019 13:25:37 +0200 Subject: [PATCH 05/59] Typo fix --- openprocurement_client/resources/sync.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openprocurement_client/resources/sync.py b/openprocurement_client/resources/sync.py index ac48be3..5f9598c 100644 --- a/openprocurement_client/resources/sync.py +++ b/openprocurement_client/resources/sync.py @@ -49,7 +49,7 @@ def __init__(self, host=DEFAULT_API_HOST, version=DEFAULT_API_VERSION, self.extra_params = extra_params self.retrievers_params = deepcopy(DEFAULT_RETRIEVERS_PARAMS) self.retrievers_params.update(retrievers_params) - self.queue = PriorityQueue(maxsize=retrievers_params['queue_size']) + self.queue = PriorityQueue(maxsize=self.retrievers_params['queue_size']) self.forward_priority = 1 if with_priority else 0 self.backward_priority = 1000 if with_priority else 0 From ecd32dc1aaae35a8e15cf2d90471f4ea8d1e153f Mon Sep 17 00:00:00 2001 From: Dmitriy Belyaev Date: Tue, 15 Jan 2019 11:45:49 +0200 Subject: [PATCH 06/59] Update setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 2c6d344..44e45b8 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import find_packages, setup -version = '2.1dp' +version = '2.1.1dp' install_requires = [ 'gevent', From a13face1384c8d88b065335465bfd355e31ba4cc Mon Sep 17 00:00:00 2001 From: qa-user-1 Date: Tue, 28 May 2019 11:59:21 +0300 Subject: [PATCH 07/59] first version --- openprocurement_client/dasu_client.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openprocurement_client/dasu_client.py b/openprocurement_client/dasu_client.py index 5f17dac..62bc252 100755 --- a/openprocurement_client/dasu_client.py +++ b/openprocurement_client/dasu_client.py @@ -24,16 +24,17 @@ class DasuClient(APIBaseClient, APITemplateClient): headers = {'Content-Type': 'application/json'} def __init__(self, - key, resource='monitorings', host_url=None, api_version=None, + username=None, + password=None, params=None, ds_client=None, user_agent=None, ds_config=None): - APITemplateClient.__init__(self, login_pass=(key, ''), headers=self.headers, + APITemplateClient.__init__(self, login_pass=(username, password), headers=self.headers, user_agent=user_agent) if ds_config: From a26d8ec89b154f4827fe28f05d7e9860ec76f0c1 Mon Sep 17 00:00:00 2001 From: qa-user-1 Date: Tue, 28 May 2019 15:23:15 +0300 Subject: [PATCH 08/59] first version --- openprocurement_client/resources/tenders.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index c211087..5155414 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -9,12 +9,20 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS) + TENDERS, AGREEMENTS, PLANS) LOGGER = logging.getLogger(__name__) +class CreateTenderClient(APIResourceClient): + """client only for tender creation""" + resource = PLANS + + def create_tender(self, plan_id, tender, access_token=None): + return self.create_resource_item_subitem(plan_id, tender, TENDERS, access_token=access_token) + + class TendersClient(APIResourceClient): """client for tenders""" resource = TENDERS @@ -31,9 +39,6 @@ def _create_tender_resource_item(self, tender, item_obj, items_name): headers={'X-Access-Token': self._get_access_token(tender)} ) - def create_tender(self, tender): - return self.create_resource_item(tender) - def create_question(self, tender_id, question, access_token=None): return self.create_resource_item_subitem( tender_id, question, QUESTIONS, access_token=access_token @@ -431,6 +436,10 @@ class Client(TendersClient): """client for tenders for backward compatibility""" +class TenderCreateClient(CreateTenderClient): + """client for tender publication only""" + + class TendersClientSync(APIResourceClientSync): resource = TENDERS From e530fba6e5f8472bb646951b9e35e463a3e6d275 Mon Sep 17 00:00:00 2001 From: qa-user-1 Date: Wed, 29 May 2019 10:45:44 +0300 Subject: [PATCH 09/59] add fix --- openprocurement_client/resources/tenders.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index 5155414..5ced87b 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -9,7 +9,7 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS, PLANS) + TENDERS, AGREEMENTS, PLANS, CHANGES) LOGGER = logging.getLogger(__name__) @@ -39,6 +39,9 @@ def _create_tender_resource_item(self, tender, item_obj, items_name): headers={'X-Access-Token': self._get_access_token(tender)} ) + def get_plans(self, params=None, feed=CHANGES): + return self.get_resource_items(params, feed) + def create_question(self, tender_id, question, access_token=None): return self.create_resource_item_subitem( tender_id, question, QUESTIONS, access_token=access_token From b9ea85b0334bc142eed1d22af8a3db72a6ef9116 Mon Sep 17 00:00:00 2001 From: qa-user-1 Date: Thu, 30 May 2019 11:43:36 +0300 Subject: [PATCH 10/59] final version --- openprocurement_client/resources/tenders.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index 5ced87b..5155414 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -9,7 +9,7 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS, PLANS, CHANGES) + TENDERS, AGREEMENTS, PLANS) LOGGER = logging.getLogger(__name__) @@ -39,9 +39,6 @@ def _create_tender_resource_item(self, tender, item_obj, items_name): headers={'X-Access-Token': self._get_access_token(tender)} ) - def get_plans(self, params=None, feed=CHANGES): - return self.get_resource_items(params, feed) - def create_question(self, tender_id, question, access_token=None): return self.create_resource_item_subitem( tender_id, question, QUESTIONS, access_token=access_token From 34bce889a5e8ea7c492fdc25aa6b04a947d9c47c Mon Sep 17 00:00:00 2001 From: qa-user-1 Date: Thu, 30 May 2019 16:35:18 +0300 Subject: [PATCH 11/59] fix unit test resource --- openprocurement_client/tests/tests_dasu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openprocurement_client/tests/tests_dasu.py b/openprocurement_client/tests/tests_dasu.py index 6aecab5..f65bbd7 100644 --- a/openprocurement_client/tests/tests_dasu.py +++ b/openprocurement_client/tests/tests_dasu.py @@ -34,7 +34,7 @@ class TestUtilsFunctions(unittest.TestCase): 'auth_ds': AUTH_DS_FAKE } - client = DasuClient('', ds_config=ds_config) + client = DasuClient(resource='monitorings', ds_config=ds_config) def setUp(self): with open(ROOT + 'monitoring_' + TEST_MONITORING_KEYS.monitoring_id + '.json') as monitoring: From a12dce5655181ce25fd9b28c60c39ae25a60d398 Mon Sep 17 00:00:00 2001 From: qa-user-1 Date: Thu, 30 May 2019 16:55:04 +0300 Subject: [PATCH 12/59] fix unit test utils --- openprocurement_client/tests/tests_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openprocurement_client/tests/tests_utils.py b/openprocurement_client/tests/tests_utils.py index 4dfe360..d572ba7 100644 --- a/openprocurement_client/tests/tests_utils.py +++ b/openprocurement_client/tests/tests_utils.py @@ -114,7 +114,7 @@ def test_get_agreement_id_by_uaid(self, mock_get_agreements): 'get_monitorings') def test_get_monitoring_id_by_uaid(self, mock_get_monitorings): mock_get_monitorings.side_effect = [self.response.data, []] - client = DasuClient('') + client = DasuClient(resource='monitorings') with self.assertRaises(IdNotFound): result = get_monitoring_id_by_uaid('f3849ade33534174b8402579152a5f41', client, id_field='dateModified') From c6302740738e776939aa94b90a01a812f5c365a2 Mon Sep 17 00:00:00 2001 From: qa-user-1 Date: Fri, 21 Jun 2019 17:57:15 +0300 Subject: [PATCH 13/59] Revert "Merge pull request #9 from ProzorroUKR/plan_tender" This reverts commit f07d8f92a42bc9ed5a5186f502a2eafc7a17ea34, reversing changes made to b19edd2c6bfff19035d22449584c01d7910c0ae6. --- openprocurement_client/resources/tenders.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index 5155414..c211087 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -9,20 +9,12 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS, PLANS) + TENDERS, AGREEMENTS) LOGGER = logging.getLogger(__name__) -class CreateTenderClient(APIResourceClient): - """client only for tender creation""" - resource = PLANS - - def create_tender(self, plan_id, tender, access_token=None): - return self.create_resource_item_subitem(plan_id, tender, TENDERS, access_token=access_token) - - class TendersClient(APIResourceClient): """client for tenders""" resource = TENDERS @@ -39,6 +31,9 @@ def _create_tender_resource_item(self, tender, item_obj, items_name): headers={'X-Access-Token': self._get_access_token(tender)} ) + def create_tender(self, tender): + return self.create_resource_item(tender) + def create_question(self, tender_id, question, access_token=None): return self.create_resource_item_subitem( tender_id, question, QUESTIONS, access_token=access_token @@ -436,10 +431,6 @@ class Client(TendersClient): """client for tenders for backward compatibility""" -class TenderCreateClient(CreateTenderClient): - """client for tender publication only""" - - class TendersClientSync(APIResourceClientSync): resource = TENDERS From ac28d62b66323a20ca0834fc507637b396ff5c20 Mon Sep 17 00:00:00 2001 From: qa-user-1 Date: Tue, 25 Jun 2019 17:18:36 +0300 Subject: [PATCH 14/59] Revert "Revert "Merge pull request #9 from ProzorroUKR/plan_tender"" This reverts commit c6302740738e776939aa94b90a01a812f5c365a2. --- openprocurement_client/resources/tenders.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index c211087..5155414 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -9,12 +9,20 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS) + TENDERS, AGREEMENTS, PLANS) LOGGER = logging.getLogger(__name__) +class CreateTenderClient(APIResourceClient): + """client only for tender creation""" + resource = PLANS + + def create_tender(self, plan_id, tender, access_token=None): + return self.create_resource_item_subitem(plan_id, tender, TENDERS, access_token=access_token) + + class TendersClient(APIResourceClient): """client for tenders""" resource = TENDERS @@ -31,9 +39,6 @@ def _create_tender_resource_item(self, tender, item_obj, items_name): headers={'X-Access-Token': self._get_access_token(tender)} ) - def create_tender(self, tender): - return self.create_resource_item(tender) - def create_question(self, tender_id, question, access_token=None): return self.create_resource_item_subitem( tender_id, question, QUESTIONS, access_token=access_token @@ -431,6 +436,10 @@ class Client(TendersClient): """client for tenders for backward compatibility""" +class TenderCreateClient(CreateTenderClient): + """client for tender publication only""" + + class TendersClientSync(APIResourceClientSync): resource = TENDERS From a35be6873466956708c9d133da5edff286a19d89 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Thu, 27 Jun 2019 14:35:26 +0300 Subject: [PATCH 15/59] the last revert for plan tender --- openprocurement_client/resources/tenders.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index 5155414..c211087 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -9,20 +9,12 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS, PLANS) + TENDERS, AGREEMENTS) LOGGER = logging.getLogger(__name__) -class CreateTenderClient(APIResourceClient): - """client only for tender creation""" - resource = PLANS - - def create_tender(self, plan_id, tender, access_token=None): - return self.create_resource_item_subitem(plan_id, tender, TENDERS, access_token=access_token) - - class TendersClient(APIResourceClient): """client for tenders""" resource = TENDERS @@ -39,6 +31,9 @@ def _create_tender_resource_item(self, tender, item_obj, items_name): headers={'X-Access-Token': self._get_access_token(tender)} ) + def create_tender(self, tender): + return self.create_resource_item(tender) + def create_question(self, tender_id, question, access_token=None): return self.create_resource_item_subitem( tender_id, question, QUESTIONS, access_token=access_token @@ -436,10 +431,6 @@ class Client(TendersClient): """client for tenders for backward compatibility""" -class TenderCreateClient(CreateTenderClient): - """client for tender publication only""" - - class TendersClientSync(APIResourceClientSync): resource = TENDERS From 39e780976baa0dab9edbd08aff6a7a69131624a2 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Thu, 11 Jul 2019 22:12:08 +0300 Subject: [PATCH 16/59] add plan tender testing --- openprocurement_client/resources/tenders.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index c211087..e7777aa 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -9,12 +9,20 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS) + TENDERS, AGREEMENTS, PLANS) LOGGER = logging.getLogger(__name__) +class CreateTenderClient(APIResourceClient): + """client only for tender creation""" + resource = PLANS + + def create_tender(self, plan_id, tender, access_token=None): + return self.create_resource_item_subitem(plan_id, tender, TENDERS, access_token=access_token) + + class TendersClient(APIResourceClient): """client for tenders""" resource = TENDERS @@ -437,3 +445,7 @@ class TendersClientSync(APIResourceClientSync): sync_tenders = APIResourceClientSync.sync_resource_items get_tender = APIResourceClientSync.get_resource_item + + +class TenderCreateClient(CreateTenderClient): + """client for tender publication only""" From b350ecd1bf2f4c31c717850233d7fbe52c5a3810 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Wed, 8 Apr 2020 14:02:49 +0300 Subject: [PATCH 17/59] add qualification/cancellation complaint methods --- openprocurement_client/resources/tenders.py | 44 +++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index e7777aa..86103d9 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -80,6 +80,20 @@ def create_award_complaint(self, tender_id, complaint, award_id, depth_path=depth_path, access_token=access_token ) + def create_qualification_complaint(self, tender_id, complaint, qualification_id, access_token=None): + depth_path = '{}/{}'.format(QUALIFICATIONS, qualification_id) + return self.create_resource_item_subitem( + tender_id, complaint, COMPLAINTS, + depth_path=depth_path, access_token=access_token + ) + + def create_cancellations_complaint(self, tender_id, complaint, cancellation_id, access_token=None): + depth_path = '{}/{}'.format(CANCELLATIONS, cancellation_id) + return self.create_resource_item_subitem( + tender_id, complaint, COMPLAINTS, + depth_path=depth_path, access_token=access_token + ) + def create_thin_document(self, tender_id, document_data, access_token=None): return self.create_resource_item_subitem( tender_id, document_data, DOCUMENTS, access_token=access_token @@ -208,6 +222,20 @@ def patch_award_document(self, tender_id, document_data, award_id, document_id, depth_path=depth_path, access_token=access_token ) + def patch_qualification_complaint(self, tender_id, complaint, qualification_id, complaint_id='', access_token=None): + return self.patch_resource_item_subitem( + tender_id, complaint, COMPLAINTS, subitem_id=complaint_id, + depth_path='{}/{}'.format(QUALIFICATIONS, qualification_id), + access_token=access_token + ) + + def patch_cancellation_complaint(self, tender_id, complaint, cancellation_id, complaint_id='', access_token=None): + return self.patch_resource_item_subitem( + tender_id, complaint, COMPLAINTS, subitem_id=complaint_id, + depth_path='{}/{}'.format(CANCELLATIONS, cancellation_id), + access_token=access_token + ) + def patch_cancellation(self, tender_id, cancellation, cancellation_id='', access_token=None): return self.patch_resource_item_subitem( tender_id, cancellation, CANCELLATIONS, @@ -352,6 +380,14 @@ def upload_cancellation_document(self, file_, tender_id, cancellation_id, use_ds doc_registration=doc_registration, depth_path=depth_path, access_token=access_token) + def upload_cancellation_complaint_document(self, file_, tender_id, cancellation_id, complaint_id, use_ds_client=True, + doc_registration=True, access_token=None): + depth_path = '{}/{}/{}/{}'.format(CANCELLATIONS, cancellation_id, COMPLAINTS, complaint_id) + return self.upload_document(file_, tender_id, + use_ds_client=use_ds_client, + doc_registration=doc_registration, + depth_path=depth_path, access_token=access_token) + def upload_complaint_document(self, file_, tender_id, complaint_id, use_ds_client=True, doc_registration=True, access_token=None): depth_path = '{}/{}'.format(COMPLAINTS, complaint_id) @@ -376,6 +412,14 @@ def upload_qualification_document(self, file_, tender_id, qualification_id, use_ doc_registration=doc_registration, depth_path=depth_path, access_token=access_token) + def upload_qualification_complaint_document(self, file_, tender_id, qualification_id, complaint_id, use_ds_client=True, + doc_registration=True, access_token=None): + depth_path = '{}/{}/{}/{}'.format(QUALIFICATIONS, qualification_id, COMPLAINTS, complaint_id) + return self.upload_document(file_, tender_id, + use_ds_client=use_ds_client, + doc_registration=doc_registration, + depth_path=depth_path, access_token=access_token) + def upload_prolongation_document(self, file_, tender_id, contract_id, prolongation_id, use_ds_client=True, doc_registration=True, access_token=None): depth_path = "{}/{}/{}/{}".format(CONTRACTS, contract_id, PROLONGATIONS, prolongation_id) From 2a81b24827c8873f288c7d3d3c1ffcaf2e2204f3 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Wed, 8 Apr 2020 14:04:02 +0300 Subject: [PATCH 18/59] add suites to main test suite --- openprocurement_client/tests/main.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/tests/main.py b/openprocurement_client/tests/main.py index a6e892f..6d50aa6 100644 --- a/openprocurement_client/tests/main.py +++ b/openprocurement_client/tests/main.py @@ -3,7 +3,9 @@ from openprocurement_client.tests import ( tests_resources, tests_sync, - test_registry_client + test_registry_client, + tests_dasu, + tests_utils ) @@ -12,6 +14,8 @@ def suite(): suite.addTest(tests_sync.suite()) suite.addTest(test_registry_client.suite()) suite.addTest(tests_resources.suite()) + suite.addTest(tests_dasu.suite()) + suite.addTest(tests_utils.suite()) return suite From d70f35a37854368870378fc7fc251a131f624029 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Tue, 14 Apr 2020 02:21:31 +0300 Subject: [PATCH 19/59] add push constant, add patch complaint methods, add payment client class --- openprocurement_client/constants.py | 3 +- openprocurement_client/resources/tenders.py | 31 ++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/openprocurement_client/constants.py b/openprocurement_client/constants.py index 84fee27..3fa8c2c 100644 --- a/openprocurement_client/constants.py +++ b/openprocurement_client/constants.py @@ -20,4 +20,5 @@ QUESTIONS = 'questions' TENDERS = 'tenders' TRANSFERS = 'transfers' -AGREEMENTS= 'agreements' +AGREEMENTS = 'agreements' +PUSH = 'push' diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index 86103d9..5b5e066 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -9,7 +9,7 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS, PLANS) + TENDERS, AGREEMENTS, PLANS, PUSH) LOGGER = logging.getLogger(__name__) @@ -23,6 +23,17 @@ def create_tender(self, plan_id, tender, access_token=None): return self.create_resource_item_subitem(plan_id, tender, TENDERS, access_token=access_token) +class CreatePaymentClient(APIResourceClient): + """client only for payment creation""" + resource = PUSH + + def create_payment(self, payment): + return self.create_resource_item(payment) + + def _obtain_cookie(self): + pass + + class TendersClient(APIResourceClient): """client for tenders""" resource = TENDERS @@ -265,6 +276,20 @@ def patch_award_complaint(self, tender_id, complaint, award_id, complaint_id='', access_token=access_token ) + def patch_cancellation_complaint(self, tender_id, complaint, cancellation_id, complaint_id='', access_token=None): + return self.patch_resource_item_subitem( + tender_id, complaint, COMPLAINTS, subitem_id=complaint_id, + depth_path='{}/{}'.format(CANCELLATIONS, cancellation_id), + access_token=access_token + ) + + def patch_qualification_complaint(self, tender_id, complaint, qualification_id, complaint_id='', access_token=None): + return self.patch_resource_item_subitem( + tender_id, complaint, COMPLAINTS, subitem_id=complaint_id, + depth_path='{}/{}'.format(QUALIFICATIONS, qualification_id), + access_token=access_token + ) + def patch_lot(self, tender_id, lot, lot_id='', access_token=None): return self.patch_resource_item_subitem( tender_id, lot, LOTS, subitem_id=lot_id, access_token=access_token @@ -479,6 +504,10 @@ def delete_lot(self, tender_id, lot_id, access_token=None): ########################################################################### +class PaymentClient(CreatePaymentClient): + """client for payment push only""" + + class Client(TendersClient): """client for tenders for backward compatibility""" From d671d40848fd1de2908f24fa42aa1d84dcd4b074 Mon Sep 17 00:00:00 2001 From: Vitalii Martyniak Date: Wed, 25 Mar 2020 13:23:03 +0200 Subject: [PATCH 20/59] Add base catalogue client --- openprocurement_client/constants.py | 3 ++ .../resources/ecatalogues.py | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 openprocurement_client/resources/ecatalogues.py diff --git a/openprocurement_client/constants.py b/openprocurement_client/constants.py index 3fa8c2c..abf1010 100644 --- a/openprocurement_client/constants.py +++ b/openprocurement_client/constants.py @@ -4,6 +4,7 @@ AWARDS = 'awards' BIDS = 'bids' CANCELLATIONS = 'cancellations' +CATEGORIES = 'categories' CHANGES = 'changes' COMPLAINTS = 'complaints' CONTRACTS = 'contracts' @@ -14,7 +15,9 @@ LOTS = 'lots' MILESTONES = 'milestones' PLANS = 'plans' +PROFILES = 'profiles' PROLONGATIONS = 'prolongations' +SUPPLIERS = 'suppliers' QUALIFICATIONS = 'qualifications' QUALIFICATION_DOCUMENTS = 'qualificationDocuments' QUESTIONS = 'questions' diff --git a/openprocurement_client/resources/ecatalogues.py b/openprocurement_client/resources/ecatalogues.py new file mode 100644 index 0000000..1521a97 --- /dev/null +++ b/openprocurement_client/resources/ecatalogues.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from openprocurement_client.clients import APIResourceClient +from openprocurement_client.constants import CATEGORIES, PROFILES, SUPPLIERS + + +class CategoriesClient(APIResourceClient): + """ Client for eCatalogues categories """ + resource = CATEGORIES + + def get_category(self, category_id): + return self.get_resource_item(category_id) + + def get_category_suppliers(self, category_id): + return self.get_resource_item_subitem(category_id, SUPPLIERS) + + +class ProfilesClient(APIResourceClient): + """ Client for eCatalogues profiles """ + resource = PROFILES + + def get_profile(self, profile_id): + return self.get_resource_item(profile_id) + + +class ECataloguesClient(object): + + def __init__(self, *args, **kwargs): + self.categories = CategoriesClient(*args, **kwargs) + self.profiles = ProfilesClient(*args, **kwargs) From bfb512d0130f7acb73a99ec598e6967b9f9a1646 Mon Sep 17 00:00:00 2001 From: Bohdan Borkivskyi Date: Wed, 8 Apr 2020 15:10:34 +0300 Subject: [PATCH 21/59] Initialize category tests --- openprocurement_client/tests/_server.py | 17 ++++- .../category_33140000-560716-42000777.json | 73 +++++++++++++++++++ openprocurement_client/tests/data_dict.py | 4 + .../tests/tests_resources.py | 26 ++++++- 4 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 openprocurement_client/tests/data/category_33140000-560716-42000777.json diff --git a/openprocurement_client/tests/_server.py b/openprocurement_client/tests/_server.py index 2bc2f71..fab8977 100644 --- a/openprocurement_client/tests/_server.py +++ b/openprocurement_client/tests/_server.py @@ -9,8 +9,8 @@ TEST_CONTRACT_KEYS, TEST_ASSET_KEYS, TEST_LOT_KEYS, - TEST_AGREEMENT_KEYS -) + TEST_AGREEMENT_KEYS, + TEST_CATEGORY_KEYS) import magic import os @@ -31,6 +31,7 @@ CONTRACTS_PATH = API_PATH.format('contracts') AGREEMENTS_PATH = API_PATH.format('agreements') SPORE_PATH = API_PATH.format('spore') +CATEGORIES_PATH = API_PATH.format('categories') DOWNLOAD_URL_EXTENSION = 'some_key_etc' RESOURCE_DICT = { 'tender': {'sublink': 'tenders', 'data': TEST_TENDER_KEYS}, @@ -39,6 +40,7 @@ 'asset': {'sublink': 'assets', 'data': TEST_ASSET_KEYS}, 'lot': {'sublink': 'lots', 'data': TEST_LOT_KEYS}, 'agreement': {'sublink': 'agreements', 'data': TEST_AGREEMENT_KEYS}, + 'category': {'sublink': 'categories', 'data': TEST_CATEGORY_KEYS} } @@ -347,6 +349,12 @@ def contract_patch_milestone(contract_id, milestone_id): milestone.update(request.json['data']) return dumps({'data': milestone}) +#categories operations + +def category_suppliers(category_id): + subpage = resource_partition(category_id, resource_name="category", part="suppliers") + return dumps({'data': subpage}) + # Routes @@ -410,6 +418,11 @@ def contract_patch_milestone(contract_id, milestone_id): "agreement_subpage_item_create": (AGREEMENTS_PATH + "//", 'POST', resource_subpage_item_create), "agreement_change_patch": (API_PATH.format('agreements') + '//changes/', 'PATCH', agreement_change_patch), "agreement_document_patch": (API_PATH.format('agreements') + '//documents/', 'PATCH', agreement_document_patch), + "categories_head": (CATEGORIES_PATH, 'HEAD', spore), + "category": (API_PATH.format( + '') + '/', + 'GET', resource_page), + "category_suppliers": (CATEGORIES_PATH + "//suppliers", 'GET', category_suppliers), } diff --git a/openprocurement_client/tests/data/category_33140000-560716-42000777.json b/openprocurement_client/tests/data/category_33140000-560716-42000777.json new file mode 100644 index 0000000..2de268b --- /dev/null +++ b/openprocurement_client/tests/data/category_33140000-560716-42000777.json @@ -0,0 +1,73 @@ +{ + "data": [ + { + "address": { + "countryName": "Україна", + "locality": "м.Ірпінь", + "postalCode": "08202", + "region": "Київська область", + "streetAddress": "вул. Соборна, 152" + }, + "contactPoint": { + "email": "galinakirilenkohosp@tmngroup.com.ua", + "name": "Галина Кириленко", + "telephone": "067-470-07-03" + }, + "id": "UA-EDR-38571763", + "identifier": { + "id": "38571763", + "legalName": "ТОВ «ТМН-ГРУП УКРАЇНА»", + "scheme": "UA-EDR" + }, + "name": "ТОВ «ТМН-ГРУП УКРАЇНА»", + "scale": "sme", + "status": "active" + }, + { + "address": { + "countryName": "Україна", + "locality": "м. Дубровиця", + "postalCode": "34100", + "region": "", + "streetAddress": "вул. Гагаріна, 29-а" + }, + "contactPoint": { + "email": "info.gbi_clc@mail.ee", + "name": "Ярослав Кикоть", + "telephone": "38-050-648-24-55" + }, + "id": "UA-EDR-40551463", + "identifier": { + "id": "40551463", + "legalName": "ТОВ «Захід-Медіка»", + "scheme": "UA-EDR" + }, + "name": "ТОВ «Захід-Медіка»", + "scale": "micro", + "status": "active" + }, + { + "address": { + "countryName": "Україна", + "locality": "м. Дніпропетровськ", + "postalCode": "49005", + "region": "Дніпропетровська область", + "streetAddress": "вул. Панікахи 2, корпус 12, кім. 426" + }, + "contactPoint": { + "email": "dkanurin@badm-b.biz", + "name": "Канурин Дмитрий Александрович", + "telephone": "(063) 985-10-75" + }, + "id": "UA-EDR-39273420", + "identifier": { + "id": "39273420", + "legalName": "ТОВ «БАДМ-Б", + "scheme": "UA-EDR" + }, + "name": "ТОВ «БАДМ-Б»", + "scale": "mid", + "status": "active" + } + ] +} \ No newline at end of file diff --git a/openprocurement_client/tests/data_dict.py b/openprocurement_client/tests/data_dict.py index cd41918..463f6d1 100644 --- a/openprocurement_client/tests/data_dict.py +++ b/openprocurement_client/tests/data_dict.py @@ -87,3 +87,7 @@ "name": 'The State Audit Service of Ukraine', "roles": 'sas' }) + +TEST_CATEGORY_KEYS = munchify({ + "category_id": '33140000-560716-42000777' +}) diff --git a/openprocurement_client/tests/tests_resources.py b/openprocurement_client/tests/tests_resources.py index 3b33db2..1ce97bf 100644 --- a/openprocurement_client/tests/tests_resources.py +++ b/openprocurement_client/tests/tests_resources.py @@ -24,6 +24,7 @@ from openprocurement_client.resources.tenders import ( TendersClient, TendersClientSync ) +from openprocurement_client.resources.ecatalogues import CategoriesClient from openprocurement_client.tests.data_dict import ( TEST_CONTRACT_KEYS, TEST_PLAN_KEYS, @@ -31,7 +32,7 @@ TEST_TENDER_KEYS_LIMITED, TEST_TENDER_KEYS_AGREEMENT, TEST_AGREEMENT_KEYS, -) + TEST_CATEGORY_KEYS) from openprocurement_client.tests._server import ( API_KEY, API_VERSION, @@ -247,6 +248,29 @@ def test_sync_tenders(self): self.assertEqual(tenders.data, self.tenders.data) +class CategoriesClientTestCase(BaseTestClass): + + def setUp(self): + self.setting_up(client=CategoriesClient) + + with open(ROOT + 'category_' + TEST_CATEGORY_KEYS.category_id + '.json') as \ + category: + self.category = munchify(load(category)) + + def tearDown(self): + self.server.stop() + + def test_get_category(self): + setup_routing(self.app, routes=['category']) + category = self.client.get_category(TEST_CATEGORY_KEYS.category_id) + self.assertEqual(category, self.category) + + def test_get_suppliers(self): + setup_routing(self.app, routes=['category_suppliers']) + suppliers = self.client.get_category_suppliers(TEST_CATEGORY_KEYS.category_id) + self.assertEqual(suppliers, self.category) + + class UserTestCase(BaseTestClass): """""" def setUp(self): From ddc263a4896cda40921585036aa53b8a7f2d4661 Mon Sep 17 00:00:00 2001 From: Bohdan Borkivskyi Date: Wed, 8 Apr 2020 15:24:16 +0300 Subject: [PATCH 22/59] Fix category suppliers test --- .../category_33140000-560716-42000777.json | 159 +++++++++++------- .../tests/tests_resources.py | 2 +- 2 files changed, 101 insertions(+), 60 deletions(-) diff --git a/openprocurement_client/tests/data/category_33140000-560716-42000777.json b/openprocurement_client/tests/data/category_33140000-560716-42000777.json index 2de268b..eb2f441 100644 --- a/openprocurement_client/tests/data/category_33140000-560716-42000777.json +++ b/openprocurement_client/tests/data/category_33140000-560716-42000777.json @@ -1,73 +1,114 @@ { - "data": [ - { - "address": { - "countryName": "Україна", - "locality": "м.Ірпінь", - "postalCode": "08202", - "region": "Київська область", - "streetAddress": "вул. Соборна, 152" - }, - "contactPoint": { - "email": "galinakirilenkohosp@tmngroup.com.ua", - "name": "Галина Кириленко", - "telephone": "067-470-07-03" - }, - "id": "UA-EDR-38571763", - "identifier": { - "id": "38571763", - "legalName": "ТОВ «ТМН-ГРУП УКРАЇНА»", - "scheme": "UA-EDR" - }, - "name": "ТОВ «ТМН-ГРУП УКРАЇНА»", - "scale": "sme", - "status": "active" + "data": { + "classification": { + "description": "Медичні матеріали", + "id": "33140000-3", + "scheme": "ДК021" }, - { + "dateModified": "2019-08-06T06:16:41.391680+03:00", + "description": "", + "id": "33140000-560716-42000777", + "images": [ + { + "sizes": "738x652", + "url": "/static/images/medical_cotton_wool.png" + } + ], + "procuringEntity": { "address": { "countryName": "Україна", - "locality": "м. Дубровиця", - "postalCode": "34100", - "region": "", - "streetAddress": "вул. Гагаріна, 29-а" + "locality": "м. Київ", + "postalCode": "01601", + "region": "м. Київ", + "streetAddress": "вул. Грушевського, буд. 7" }, "contactPoint": { - "email": "info.gbi_clc@mail.ee", - "name": "Ярослав Кикоть", - "telephone": "38-050-648-24-55" + "email": "catalogue@medpro.health", + "faxNumber": "", + "name": "Надія Бігун", + "telephone": "", + "url": "http://fb.me/uamedpro" }, - "id": "UA-EDR-40551463", "identifier": { - "id": "40551463", - "legalName": "ТОВ «Захід-Медіка»", + "id": "42000777", + "legalName": "ДЕРЖАВНЕ ПІДПРИЄМСТВО «МЕДИЧНІ ЗАКУПІВЛІ УКРАЇНИ»", "scheme": "UA-EDR" }, - "name": "ТОВ «Захід-Медіка»", - "scale": "micro", - "status": "active" + "kind": "central", + "name": "ДЕРЖАВНЕ ПІДПРИЄМСТВО «МЕДИЧНІ ЗАКУПІВЛІ УКРАЇНИ»" }, - { - "address": { - "countryName": "Україна", - "locality": "м. Дніпропетровськ", - "postalCode": "49005", - "region": "Дніпропетровська область", - "streetAddress": "вул. Панікахи 2, корпус 12, кім. 426" + "status": "active", + "suppliers": [ + { + "address": { + "countryName": "Україна", + "locality": "м.Ірпінь", + "postalCode": "08202", + "region": "Київська область", + "streetAddress": "вул. Соборна, 152" + }, + "contactPoint": { + "email": "galinakirilenkohosp@tmngroup.com.ua", + "name": "Галина Кириленко", + "telephone": "067-470-07-03" + }, + "id": "UA-EDR-38571763", + "identifier": { + "id": "38571763", + "legalName": "ТОВ «ТМН-ГРУП УКРАЇНА»", + "scheme": "UA-EDR" + }, + "name": "ТОВ «ТМН-ГРУП УКРАЇНА»", + "scale": "sme", + "status": "active" }, - "contactPoint": { - "email": "dkanurin@badm-b.biz", - "name": "Канурин Дмитрий Александрович", - "telephone": "(063) 985-10-75" - }, - "id": "UA-EDR-39273420", - "identifier": { - "id": "39273420", - "legalName": "ТОВ «БАДМ-Б", - "scheme": "UA-EDR" + { + "address": { + "countryName": "Україна", + "locality": "м. Дубровиця", + "postalCode": "34100", + "region": "", + "streetAddress": "вул. Гагаріна, 29-а" + }, + "contactPoint": { + "email": "info.gbi_clc@mail.ee", + "name": "Ярослав Кикоть", + "telephone": "38-050-648-24-55" + }, + "id": "UA-EDR-40551463", + "identifier": { + "id": "40551463", + "legalName": "ТОВ «Захід-Медіка»", + "scheme": "UA-EDR" + }, + "name": "ТОВ «Захід-Медіка»", + "scale": "micro", + "status": "active" }, - "name": "ТОВ «БАДМ-Б»", - "scale": "mid", - "status": "active" - } - ] + { + "address": { + "countryName": "Україна", + "locality": "м. Дніпропетровськ", + "postalCode": "49005", + "region": "Дніпропетровська область", + "streetAddress": "вул. Панікахи 2, корпус 12, кім. 426" + }, + "contactPoint": { + "email": "dkanurin@badm-b.biz", + "name": "Канурин Дмитрий Александрович", + "telephone": "(063) 985-10-75" + }, + "id": "UA-EDR-39273420", + "identifier": { + "id": "39273420", + "legalName": "ТОВ «БАДМ-Б", + "scheme": "UA-EDR" + }, + "name": "ТОВ «БАДМ-Б»", + "scale": "mid", + "status": "active" + } + ], + "title": "Вата медична" + } } \ No newline at end of file diff --git a/openprocurement_client/tests/tests_resources.py b/openprocurement_client/tests/tests_resources.py index 1ce97bf..4b52905 100644 --- a/openprocurement_client/tests/tests_resources.py +++ b/openprocurement_client/tests/tests_resources.py @@ -268,7 +268,7 @@ def test_get_category(self): def test_get_suppliers(self): setup_routing(self.app, routes=['category_suppliers']) suppliers = self.client.get_category_suppliers(TEST_CATEGORY_KEYS.category_id) - self.assertEqual(suppliers, self.category) + self.assertEqual(suppliers["data"], self.category["data"]["suppliers"]) class UserTestCase(BaseTestClass): From 005e569311476e129dfea3b5d1b450da1b0eeab5 Mon Sep 17 00:00:00 2001 From: Bohdan Borkivskyi Date: Wed, 8 Apr 2020 16:46:53 +0300 Subject: [PATCH 23/59] Add profiles client tests --- openprocurement_client/tests/_server.py | 10 +- ...ofile_195333-32420000-214469-40000777.json | 114 ++++++++++++++++++ openprocurement_client/tests/data_dict.py | 4 + .../tests/tests_resources.py | 27 ++++- 4 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 openprocurement_client/tests/data/profile_195333-32420000-214469-40000777.json diff --git a/openprocurement_client/tests/_server.py b/openprocurement_client/tests/_server.py index fab8977..b1fa9af 100644 --- a/openprocurement_client/tests/_server.py +++ b/openprocurement_client/tests/_server.py @@ -10,7 +10,8 @@ TEST_ASSET_KEYS, TEST_LOT_KEYS, TEST_AGREEMENT_KEYS, - TEST_CATEGORY_KEYS) + TEST_CATEGORY_KEYS, + TEST_PROFILE_KEYS) import magic import os @@ -40,7 +41,8 @@ 'asset': {'sublink': 'assets', 'data': TEST_ASSET_KEYS}, 'lot': {'sublink': 'lots', 'data': TEST_LOT_KEYS}, 'agreement': {'sublink': 'agreements', 'data': TEST_AGREEMENT_KEYS}, - 'category': {'sublink': 'categories', 'data': TEST_CATEGORY_KEYS} + 'category': {'sublink': 'categories', 'data': TEST_CATEGORY_KEYS}, + 'profile': {'sublink': 'profiles', 'data': TEST_PROFILE_KEYS} } @@ -423,6 +425,10 @@ def category_suppliers(category_id): '') + '/', 'GET', resource_page), "category_suppliers": (CATEGORIES_PATH + "//suppliers", 'GET', category_suppliers), + "profiles_head": (API_PATH.format("profiles"), 'HEAD', spore), + "profile": (API_PATH.format( + '') + '/', + 'GET', resource_page), } diff --git a/openprocurement_client/tests/data/profile_195333-32420000-214469-40000777.json b/openprocurement_client/tests/data/profile_195333-32420000-214469-40000777.json new file mode 100644 index 0000000..b2d5a64 --- /dev/null +++ b/openprocurement_client/tests/data/profile_195333-32420000-214469-40000777.json @@ -0,0 +1,114 @@ +{ + "data": { + "classification": { + "description": "Мережеве обладнання", + "id": "32420000-3", + "scheme": "ДК021" + }, + "criteria": [ + { + "code": "OCDS-FORM-FACTOR", + "description": "Форм-фактор", + "id": "214469-0001", + "requirementGroups": [ + { + "description": "Форм-фактор", + "id": "214469-0001-001", + "requirements": [ + { + "dataType": "string", + "expectedValue": "настільний", + "id": "214469-0001-001-01", + "title": "Форм-фактор" + } + ] + } + ], + "title": "Форм-фактор" + }, + { + "code": "OCDS-TYPE-SWITCH", + "description": "Тип комутатора", + "id": "214469-0002", + "requirementGroups": [ + { + "description": "Тип комутатора", + "id": "214469-0002-001", + "requirements": [ + { + "dataType": "string", + "expectedValue": "некерований", + "id": "214469-0002-001-01", + "title": "Тип комутатора" + } + ] + } + ], + "title": "Тип комутатора" + }, + { + "code": "OCDS-PORT-FASTETHERNET", + "description": "Кількість портів Fast Ethernet (10/100 Мбит/c)", + "id": "214469-0003", + "requirementGroups": [ + { + "description": "Кількість портів Fast Ethernet (10/100 Мбит/c), не менше 5", + "id": "214469-0003-001", + "requirements": [ + { + "dataType": "integer", + "id": "214469-0003-001-01", + "minValue": 5, + "title": "Кількість портів Fast Ethernet (10/100 Мбит/c)", + "unit": { + "code": "H87", + "name": "штук" + } + } + ] + } + ], + "title": "Кількість портів Fast Ethernet (10/100 Мбит/c)" + }, + { + "code": "OCDS-SWITCH-GUARANTEE", + "description": "Гарантія", + "id": "214469-0099", + "requirementGroups": [ + { + "description": "Гарантія, не менше 12 місяців", + "id": "214469-0099-001", + "requirements": [ + { + "dataType": "integer", + "id": "214469-0099-001-01", + "minValue": 12, + "title": "Гарантія", + "unit": { + "code": "MON", + "name": "місяців" + } + } + ] + } + ], + "title": "Гарантія" + } + ], + "dateModified": "2019-08-06T06:17:07.618531+03:00", + "description": "Комутатор настільний 5-портовий 10/100 Мбіт/с", + "id": "195333-32420000-214469-40000777", + "relatedCategory": "32420000-214469-40000777", + "status": "active", + "title": "Комутатор настільний 5-портовий 10/100 Мбіт/с", + "unit": { + "code": "H87", + "name": "штуки" + }, + "value": { + "amount": 200, + "currency": "UAH", + "valueAddedTaxIncluded": true + } + } +} \ No newline at end of file diff --git a/openprocurement_client/tests/data_dict.py b/openprocurement_client/tests/data_dict.py index 463f6d1..987cfbd 100644 --- a/openprocurement_client/tests/data_dict.py +++ b/openprocurement_client/tests/data_dict.py @@ -91,3 +91,7 @@ TEST_CATEGORY_KEYS = munchify({ "category_id": '33140000-560716-42000777' }) + +TEST_PROFILE_KEYS = munchify({ + "profile_id": '195333-32420000-214469-40000777' +}) diff --git a/openprocurement_client/tests/tests_resources.py b/openprocurement_client/tests/tests_resources.py index 4b52905..d3dd3d9 100644 --- a/openprocurement_client/tests/tests_resources.py +++ b/openprocurement_client/tests/tests_resources.py @@ -24,7 +24,9 @@ from openprocurement_client.resources.tenders import ( TendersClient, TendersClientSync ) -from openprocurement_client.resources.ecatalogues import CategoriesClient +from openprocurement_client.resources.ecatalogues import ( + CategoriesClient, + ProfilesClient) from openprocurement_client.tests.data_dict import ( TEST_CONTRACT_KEYS, TEST_PLAN_KEYS, @@ -32,7 +34,8 @@ TEST_TENDER_KEYS_LIMITED, TEST_TENDER_KEYS_AGREEMENT, TEST_AGREEMENT_KEYS, - TEST_CATEGORY_KEYS) + TEST_CATEGORY_KEYS, + TEST_PROFILE_KEYS) from openprocurement_client.tests._server import ( API_KEY, API_VERSION, @@ -253,8 +256,7 @@ class CategoriesClientTestCase(BaseTestClass): def setUp(self): self.setting_up(client=CategoriesClient) - with open(ROOT + 'category_' + TEST_CATEGORY_KEYS.category_id + '.json') as \ - category: + with open(ROOT + 'category_' + TEST_CATEGORY_KEYS.category_id + '.json') as category: self.category = munchify(load(category)) def tearDown(self): @@ -271,6 +273,23 @@ def test_get_suppliers(self): self.assertEqual(suppliers["data"], self.category["data"]["suppliers"]) +class ProfileCLientTestCase(BaseTestClass): + + def setUp(self): + self.setting_up(client=ProfilesClient) + + with open(ROOT + 'profile_' + TEST_PROFILE_KEYS.profile_id + '.json') as profile: + self.profile = munchify(load(profile)) + + def tearDown(self): + self.server.stop() + + def test_get_profile(self): + setup_routing(self.app, routes=['profile']) + profile = self.client.get_profile(TEST_PROFILE_KEYS.profile_id) + self.assertEqual(profile, self.profile) + + class UserTestCase(BaseTestClass): """""" def setUp(self): From f1ea1eac6e1f04b784d6dab25eb0f9439e140cc9 Mon Sep 17 00:00:00 2001 From: Bohdan Borkivskyi Date: Wed, 8 Apr 2020 17:11:29 +0300 Subject: [PATCH 24/59] Add ECatalogues client tests --- .../tests/tests_resources.py | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/tests/tests_resources.py b/openprocurement_client/tests/tests_resources.py index d3dd3d9..1347adf 100644 --- a/openprocurement_client/tests/tests_resources.py +++ b/openprocurement_client/tests/tests_resources.py @@ -26,7 +26,8 @@ ) from openprocurement_client.resources.ecatalogues import ( CategoriesClient, - ProfilesClient) + ProfilesClient, + ECataloguesClient) from openprocurement_client.tests.data_dict import ( TEST_CONTRACT_KEYS, TEST_PLAN_KEYS, @@ -290,6 +291,54 @@ def test_get_profile(self): self.assertEqual(profile, self.profile) +class ECataloguesClientTestCase(BaseTestClass): + + def setting_up(self, client, resource_clients): + self.app = Bottle() + self.app.router.add_filter('resource_filter', resource_filter) + for resource_client in resource_clients: + setup_routing(self.app, routes=['{}_head'.format(resource_client.resource), 'spore']) + self.server = WSGIServer(('localhost', PORT), self.app, log=None) + try: + self.server.start() + except Exception as error: + print(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2], + file=sys.stderr) + raise error + ds_config = { + 'host_url': DS_HOST_URL, + 'auth_ds': AUTH_DS_FAKE + } + self.client = client('', host_url=HOST_URL, api_version=API_VERSION, ds_config=ds_config) + + def setUp(self): + self.setting_up(client=ECataloguesClient, resource_clients=[CategoriesClient, ProfilesClient]) + + with open(ROOT + 'category_' + TEST_CATEGORY_KEYS.category_id + '.json') as category: + self.category = munchify(load(category)) + + with open(ROOT + 'profile_' + TEST_PROFILE_KEYS.profile_id + '.json') as profile: + self.profile = munchify(load(profile)) + + def tearDown(self): + self.server.stop() + + def test_get_category(self): + setup_routing(self.app, routes=['category']) + category = self.client.categories.get_category(TEST_CATEGORY_KEYS.category_id) + self.assertEqual(category, self.category) + + def test_get_suppliers(self): + setup_routing(self.app, routes=['category_suppliers']) + suppliers = self.client.categories.get_category_suppliers(TEST_CATEGORY_KEYS.category_id) + self.assertEqual(suppliers["data"], self.category["data"]["suppliers"]) + + def test_get_profile(self): + setup_routing(self.app, routes=['profile']) + profile = self.client.profiles.get_profile(TEST_PROFILE_KEYS.profile_id) + self.assertEqual(profile, self.profile) + + class UserTestCase(BaseTestClass): """""" def setUp(self): From ccd573d2b71fe8ab197773253e170c132c66501b Mon Sep 17 00:00:00 2001 From: Bohdan Borkivskyi Date: Thu, 9 Apr 2020 11:49:30 +0300 Subject: [PATCH 25/59] Dont setup document service for ECatalogues client tests --- .../category_33140000-560716-42000777.json | 60 +++++++++---------- .../tests/tests_resources.py | 7 +-- 2 files changed, 32 insertions(+), 35 deletions(-) diff --git a/openprocurement_client/tests/data/category_33140000-560716-42000777.json b/openprocurement_client/tests/data/category_33140000-560716-42000777.json index eb2f441..dfb37d1 100644 --- a/openprocurement_client/tests/data/category_33140000-560716-42000777.json +++ b/openprocurement_client/tests/data/category_33140000-560716-42000777.json @@ -1,7 +1,7 @@ { "data": { "classification": { - "description": "Медичні матеріали", + "description": "Текстильні матеріали", "id": "33140000-3", "scheme": "ДК021" }, @@ -11,31 +11,31 @@ "images": [ { "sizes": "738x652", - "url": "/static/images/medical_cotton_wool.png" + "url": "/static/images/cotton_wool.png" } ], "procuringEntity": { "address": { "countryName": "Україна", "locality": "м. Київ", - "postalCode": "01601", + "postalCode": "01001", "region": "м. Київ", - "streetAddress": "вул. Грушевського, буд. 7" + "streetAddress": "вул. Дубова, буд. 54" }, "contactPoint": { - "email": "catalogue@medpro.health", + "email": "user1@domain.org", "faxNumber": "", - "name": "Надія Бігун", + "name": "Юзер 1", "telephone": "", - "url": "http://fb.me/uamedpro" + "url": "http://fb.me/user1_profile" }, "identifier": { "id": "42000777", - "legalName": "ДЕРЖАВНЕ ПІДПРИЄМСТВО «МЕДИЧНІ ЗАКУПІВЛІ УКРАЇНИ»", + "legalName": "ПРИВАТНЕ ПІДПРИЄМСТВО «ТЕКСТИЛЬНІ ЗАКУПІВЛІ УКРАЇНИ»", "scheme": "UA-EDR" }, "kind": "central", - "name": "ДЕРЖАВНЕ ПІДПРИЄМСТВО «МЕДИЧНІ ЗАКУПІВЛІ УКРАЇНИ»" + "name": "ПРИВАТНЕ ПІДПРИЄМСТВО «ТЕКСТИЛЬНІ ЗАКУПІВЛІ УКРАЇНИ»" }, "status": "active", "suppliers": [ @@ -43,22 +43,22 @@ "address": { "countryName": "Україна", "locality": "м.Ірпінь", - "postalCode": "08202", + "postalCode": "08200", "region": "Київська область", - "streetAddress": "вул. Соборна, 152" + "streetAddress": "вул. Липова, 23" }, "contactPoint": { - "email": "galinakirilenkohosp@tmngroup.com.ua", - "name": "Галина Кириленко", - "telephone": "067-470-07-03" + "email": "user2@domain.org", + "name": "Юзер 2", + "telephone": "067-000-00-00" }, "id": "UA-EDR-38571763", "identifier": { "id": "38571763", - "legalName": "ТОВ «ТМН-ГРУП УКРАЇНА»", + "legalName": "ТОВ «ВИГАДАЙКА УА»", "scheme": "UA-EDR" }, - "name": "ТОВ «ТМН-ГРУП УКРАЇНА»", + "name": "ТОВ «ВИГАДАЙКА УА»", "scale": "sme", "status": "active" }, @@ -68,47 +68,47 @@ "locality": "м. Дубровиця", "postalCode": "34100", "region": "", - "streetAddress": "вул. Гагаріна, 29-а" + "streetAddress": "вул. Смерекова, 16" }, "contactPoint": { - "email": "info.gbi_clc@mail.ee", - "name": "Ярослав Кикоть", - "telephone": "38-050-648-24-55" + "email": "user3@domain.org", + "name": "Юзер 3", + "telephone": "38-050-000-00-11" }, "id": "UA-EDR-40551463", "identifier": { "id": "40551463", - "legalName": "ТОВ «Захід-Медіка»", + "legalName": "ТОВ «МОРШИН ТЕКСТИЛЬ»", "scheme": "UA-EDR" }, - "name": "ТОВ «Захід-Медіка»", + "name": "ТОВ «МОРШИН ТЕКСТИЛЬ»", "scale": "micro", "status": "active" }, { "address": { "countryName": "Україна", - "locality": "м. Дніпропетровськ", - "postalCode": "49005", + "locality": "м. Дніпро", + "postalCode": "49000", "region": "Дніпропетровська область", - "streetAddress": "вул. Панікахи 2, корпус 12, кім. 426" + "streetAddress": "вул. Річкова 71" }, "contactPoint": { - "email": "dkanurin@badm-b.biz", - "name": "Канурин Дмитрий Александрович", + "email": "user4@domain.org", + "name": "Юзер 4", "telephone": "(063) 985-10-75" }, "id": "UA-EDR-39273420", "identifier": { "id": "39273420", - "legalName": "ТОВ «БАДМ-Б", + "legalName": "ТОВ «Дніпрові кручі", "scheme": "UA-EDR" }, - "name": "ТОВ «БАДМ-Б»", + "name": "ТОВ «Дніпрові кручі", "scale": "mid", "status": "active" } ], - "title": "Вата медична" + "title": "Вата будівельна" } } \ No newline at end of file diff --git a/openprocurement_client/tests/tests_resources.py b/openprocurement_client/tests/tests_resources.py index 1347adf..e021ad1 100644 --- a/openprocurement_client/tests/tests_resources.py +++ b/openprocurement_client/tests/tests_resources.py @@ -305,11 +305,8 @@ def setting_up(self, client, resource_clients): print(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2], file=sys.stderr) raise error - ds_config = { - 'host_url': DS_HOST_URL, - 'auth_ds': AUTH_DS_FAKE - } - self.client = client('', host_url=HOST_URL, api_version=API_VERSION, ds_config=ds_config) + + self.client = client(host_url=HOST_URL, api_version=API_VERSION) def setUp(self): self.setting_up(client=ECataloguesClient, resource_clients=[CategoriesClient, ProfilesClient]) From e82a261f1ddedbcf019302c2b392f5daad8fa5ee Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Tue, 5 May 2020 18:24:59 +0300 Subject: [PATCH 26/59] add milestone creation methods --- openprocurement_client/resources/tenders.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index 5b5e066..e353be9 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -9,7 +9,7 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS, PLANS, PUSH) + TENDERS, AGREEMENTS, PLANS, PUSH, MILESTONES) LOGGER = logging.getLogger(__name__) @@ -119,6 +119,18 @@ def create_prolongation(self, tender_id, contract_id, prolongation_data, access_ tender_id, prolongation_data, PROLONGATIONS, depth_path=depth_path, access_token=access_token ) + def create_award_milestone(self, tender_id, milestone, award_id, access_token=None): + depth_path = '{}/{}'.format(AWARDS, award_id) + return self.create_resource_item_subitem( + tender_id, milestone, MILESTONES, depth_path=depth_path, access_token=access_token + ) + + def create_qualification_milestone(self, tender_id, milestone, qualification_id, access_token=None): + depth_path = '{}/{}'.format(QUALIFICATIONS, qualification_id) + return self.create_resource_item_subitem( + tender_id, milestone, MILESTONES, depth_path=depth_path, access_token=access_token + ) + ########################################################################### # GET ITEMS LIST API METHODS ########################################################################### From da11a712b1d6d7b7a87e3302c69007a1558ddcaf Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Tue, 5 May 2020 18:33:53 +0300 Subject: [PATCH 27/59] delete duplicate methods --- openprocurement_client/resources/tenders.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index e353be9..c73f1d7 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -288,20 +288,6 @@ def patch_award_complaint(self, tender_id, complaint, award_id, complaint_id='', access_token=access_token ) - def patch_cancellation_complaint(self, tender_id, complaint, cancellation_id, complaint_id='', access_token=None): - return self.patch_resource_item_subitem( - tender_id, complaint, COMPLAINTS, subitem_id=complaint_id, - depth_path='{}/{}'.format(CANCELLATIONS, cancellation_id), - access_token=access_token - ) - - def patch_qualification_complaint(self, tender_id, complaint, qualification_id, complaint_id='', access_token=None): - return self.patch_resource_item_subitem( - tender_id, complaint, COMPLAINTS, subitem_id=complaint_id, - depth_path='{}/{}'.format(QUALIFICATIONS, qualification_id), - access_token=access_token - ) - def patch_lot(self, tender_id, lot, lot_id='', access_token=None): return self.patch_resource_item_subitem( tender_id, lot, LOTS, subitem_id=lot_id, access_token=access_token From 20d77b2b51908040d06d989cb1ee1bf5e9d2debf Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Wed, 12 Aug 2020 14:06:48 +0300 Subject: [PATCH 28/59] add retry into get plan/tender methods --- openprocurement_client/resources/plans.py | 2 ++ openprocurement_client/resources/tenders.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/openprocurement_client/resources/plans.py b/openprocurement_client/resources/plans.py index b5a0636..26430c6 100644 --- a/openprocurement_client/resources/plans.py +++ b/openprocurement_client/resources/plans.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import logging +from retrying import retry from zope.deprecation import deprecation @@ -45,6 +46,7 @@ def _create_plan_resource_item(self, plan, item_obj, items_name): # GET ITEM API METHODS ########################################################################### + @retry(stop_max_attempt_number=5) def get_plan(self, plan_id): return self.get_resource_item(plan_id) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index c73f1d7..660db49 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import logging +from retrying import retry from retrying import retry from zope.deprecation import deprecation @@ -188,6 +189,7 @@ def _get_tender_resource_item(self, tender, item_id, items_name, headers=headers ) + @retry(stop_max_attempt_number=5) def get_tender(self, tender_id): return self.get_resource_item(tender_id) From a2bfd46fcb5778869039b9d1d479728f2f1b9ce6 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Fri, 2 Oct 2020 14:10:46 +0300 Subject: [PATCH 29/59] add criteria constants --- openprocurement_client/constants.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openprocurement_client/constants.py b/openprocurement_client/constants.py index abf1010..ff0fc05 100644 --- a/openprocurement_client/constants.py +++ b/openprocurement_client/constants.py @@ -25,3 +25,5 @@ TRANSFERS = 'transfers' AGREEMENTS = 'agreements' PUSH = 'push' +CRITERIA = 'criteria' +REQUIREMENT_RESPONSES = 'requirement_responses' From fcf5bf306784c6de7d0ca47392cd831b869e3209 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Fri, 2 Oct 2020 14:15:14 +0300 Subject: [PATCH 30/59] post criteria in tender/post criteria response in bid methods --- openprocurement_client/resources/tenders.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index 660db49..8199234 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -10,7 +10,7 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS, PLANS, PUSH, MILESTONES) + TENDERS, AGREEMENTS, PLANS, PUSH, MILESTONES, CRITERIA, REQUIREMENT_RESPONSES) LOGGER = logging.getLogger(__name__) @@ -132,6 +132,17 @@ def create_qualification_milestone(self, tender_id, milestone, qualification_id, tender_id, milestone, MILESTONES, depth_path=depth_path, access_token=access_token ) + def create_criteria(self, tender_id, criteria, access_token=None): + return self.create_resource_item_subitem( + tender_id, criteria, CRITERIA, access_token=access_token + ) + + def create_bid_criteria_response(self, tender_id, criteria_data, bid_id, access_token=None): + depth_path = '{}/{}'.format(BIDS, bid_id) + return self.create_resource_item_subitem( + tender_id, criteria_data, REQUIREMENT_RESPONSES, depth_path=depth_path, access_token=access_token + ) + ########################################################################### # GET ITEMS LIST API METHODS ########################################################################### From f37cdb69e56a4b3e3140a68284f1183c7a94ab5e Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Tue, 17 Nov 2020 12:58:54 +0200 Subject: [PATCH 31/59] CS-8853 procuringEntity qualification/pre-qualification requirement response --- openprocurement_client/resources/tenders.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index 8199234..cd76e91 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -143,6 +143,18 @@ def create_bid_criteria_response(self, tender_id, criteria_data, bid_id, access_ tender_id, criteria_data, REQUIREMENT_RESPONSES, depth_path=depth_path, access_token=access_token ) + def create_qualification_criteria_response(self, tender_id, criteria_data, qualification_id, access_token=None): + depth_path = '{}/{}'.format(QUALIFICATIONS, qualification_id) + return self.create_resource_item_subitem( + tender_id, criteria_data, REQUIREMENT_RESPONSES, depth_path=depth_path, access_token=access_token + ) + + def create_award_criteria_response(self, tender_id, criteria_data, award_id, access_token=None): + depth_path = '{}/{}'.format(AWARDS, award_id) + return self.create_resource_item_subitem( + tender_id, criteria_data, REQUIREMENT_RESPONSES, depth_path=depth_path, access_token=access_token + ) + ########################################################################### # GET ITEMS LIST API METHODS ########################################################################### From 31719a34351587f9f3f7f442eed0a1ceab486e99 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Tue, 23 Mar 2021 09:43:40 +0200 Subject: [PATCH 32/59] add new method/constant --- openprocurement_client/constants.py | 1 + openprocurement_client/resources/tenders.py | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/constants.py b/openprocurement_client/constants.py index ff0fc05..594eb3b 100644 --- a/openprocurement_client/constants.py +++ b/openprocurement_client/constants.py @@ -27,3 +27,4 @@ PUSH = 'push' CRITERIA = 'criteria' REQUIREMENT_RESPONSES = 'requirement_responses' +EVIDENCES = 'evidences' \ No newline at end of file diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index cd76e91..4e2eca5 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -10,7 +10,7 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS, PLANS, PUSH, MILESTONES, CRITERIA, REQUIREMENT_RESPONSES) + TENDERS, AGREEMENTS, PLANS, PUSH, MILESTONES, CRITERIA, REQUIREMENT_RESPONSES, EVIDENCES) LOGGER = logging.getLogger(__name__) @@ -155,6 +155,13 @@ def create_award_criteria_response(self, tender_id, criteria_data, award_id, acc tender_id, criteria_data, REQUIREMENT_RESPONSES, depth_path=depth_path, access_token=access_token ) + def create_bid_criteria_contract_guarantee_response(self, tender_id, contract_criteria_data, bid_id, + requirement_response_id, access_token=None): + depth_path = '{}/{}/{}/{}'.format(BIDS, bid_id, REQUIREMENT_RESPONSES, requirement_response_id) + return self.create_resource_item_subitem( + tender_id, contract_criteria_data, EVIDENCES, depth_path=depth_path, access_token=access_token + ) + ########################################################################### # GET ITEMS LIST API METHODS ########################################################################### From 35ce910291e9251277e7d481f09c44393968b1b3 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Tue, 23 Mar 2021 09:49:21 +0200 Subject: [PATCH 33/59] fix host url and api versions in tests --- openprocurement_client/dasu_client.py | 4 ++-- openprocurement_client/resources/document_service.py | 2 +- openprocurement_client/resources/edr.py | 4 ++-- openprocurement_client/resources/sync.py | 4 ++-- openprocurement_client/tests/tests_sync.py | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/openprocurement_client/dasu_client.py b/openprocurement_client/dasu_client.py index 2bbbb92..175d4b4 100755 --- a/openprocurement_client/dasu_client.py +++ b/openprocurement_client/dasu_client.py @@ -21,8 +21,8 @@ class DasuClient(APIBaseClient, APITemplateClient): """client for monitorings""" - host_url = 'https://audit-api-sandbox.prozorro.gov.ua' - api_version = '2.4' + host_url = 'https://audit-api-staging.prozorro.gov.ua' + api_version = '2.5' headers = {'Content-Type': 'application/json'} def __init__(self, diff --git a/openprocurement_client/resources/document_service.py b/openprocurement_client/resources/document_service.py index 2a3f599..ca3e39a 100644 --- a/openprocurement_client/resources/document_service.py +++ b/openprocurement_client/resources/document_service.py @@ -14,7 +14,7 @@ class DocumentServiceClient(APITemplateClient): """class for work with Document Service""" - host_url = 'https://upload.docs-sandbox.openprocurement.org' + host_url = 'https://upload-docs-staging.prozorro.gov.ua' url_register_part = 'register' url_upload_part = 'upload' diff --git a/openprocurement_client/resources/edr.py b/openprocurement_client/resources/edr.py index 7333df4..f20a507 100644 --- a/openprocurement_client/resources/edr.py +++ b/openprocurement_client/resources/edr.py @@ -13,8 +13,8 @@ class EDRClient(APITemplateClient): """ Client for validate members by EDR """ - host_url = 'https://api-sandbox.openprocurement.org' - api_version = '2.0' + host_url = 'https://lb-api-staging.prozorro.gov.ua' + api_version = '2.5' def __init__(self, host_url=None, api_version=None, username=None, password=None): diff --git a/openprocurement_client/resources/sync.py b/openprocurement_client/resources/sync.py index 5f9598c..414ac17 100644 --- a/openprocurement_client/resources/sync.py +++ b/openprocurement_client/resources/sync.py @@ -19,8 +19,8 @@ 'queue_size': 101 } -DEFAULT_API_HOST = 'https://lb.api-sandbox.openprocurement.org/' -DEFAULT_API_VERSION = '2.3' +DEFAULT_API_HOST = 'https://lb-api-staging.prozorro.gov.ua' +DEFAULT_API_VERSION = '2.5' DEFAULT_API_KEY = '' DEFAULT_API_EXTRA_PARAMS = { 'opt_fields': 'status', 'mode': '_all_' diff --git a/openprocurement_client/tests/tests_sync.py b/openprocurement_client/tests/tests_sync.py index 232e074..f181ebc 100644 --- a/openprocurement_client/tests/tests_sync.py +++ b/openprocurement_client/tests/tests_sync.py @@ -166,8 +166,8 @@ def test_instance_initialization(self): self.resource_feeder = ResourceFeeder() self.assertEqual(self.resource_feeder.key, '') self.assertEqual(self.resource_feeder.host, - 'https://lb.api-sandbox.openprocurement.org/') - self.assertEqual(self.resource_feeder.version, '2.3') + 'https://lb-api-staging.prozorro.gov.ua') + self.assertEqual(self.resource_feeder.version, '2.5') self.assertEqual(self.resource_feeder.resource, 'tenders') self.assertEqual(self.resource_feeder.adaptive, False) self.assertEqual(self.resource_feeder.extra_params, From f65128635173e29836cb52680209f8e1bbebc036 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Tue, 13 Apr 2021 16:01:34 +0300 Subject: [PATCH 34/59] ctireria status test methods --- openprocurement_client/clients.py | 46 +++++++++++++++++++++ openprocurement_client/constants.py | 4 +- openprocurement_client/resources/tenders.py | 22 +++++++++- 3 files changed, 70 insertions(+), 2 deletions(-) diff --git a/openprocurement_client/clients.py b/openprocurement_client/clients.py index 4e82db5..10744ea 100755 --- a/openprocurement_client/clients.py +++ b/openprocurement_client/clients.py @@ -117,6 +117,14 @@ def _patch_resource_item(self, url, payload, headers=None): return munchify(loads(response_item.text)) raise InvalidResponse(response_item) + def _put_resource_item(self, url, payload, headers=None): + _headers = self.headers.copy() + _headers.update(headers or {}) + response_item = self.request('PUT', url, headers=_headers, json=payload) + if response_item.status_code == 200: + return munchify(loads(response_item.text)) + raise InvalidResponse(response_item) + def _patch_obj_resource_item(self, patched_obj, item_obj, items_name): return self._patch_resource_item( '{}/{}/{}/{}'.format(self.prefix_path, patched_obj.data.id, items_name, item_obj['data']['id']), @@ -226,6 +234,23 @@ def create_resource_item_subitem(self, resource_item_id, subitem_obj, subitem_name) return self._create_resource_item(url, subitem_obj, headers=headers) + def create_resource_item_sub_subitem(self, resource_item_id, sub_subitem_obj, + sub_subitem_name, access_token=None, + depth_path=None): + headers = None + if access_token: + headers = {'X-Access-Token': access_token} + if isinstance(resource_item_id, dict): + headers = {'X-Access-Token': self._get_access_token(resource_item_id)} + resource_item_id = resource_item_id['data']['id'] + if depth_path: + url = '{}/{}/{}/{}'.format(self.prefix_path, resource_item_id, + depth_path, sub_subitem_name) + else: + url = '{}/{}/{}'.format(self.prefix_path, resource_item_id, + sub_subitem_name) + return self._create_resource_item(url, sub_subitem_obj, headers=headers) + ########################################################################### # DELETE CLIENT METHODS ########################################################################### @@ -363,6 +388,27 @@ def patch_document(self, resource_item_id, document_data, document_id, access_token, depth_path ) + def put_resource_item_subitem(self, resource_item_id, put_data, subitem_name, subitem_id=None, + access_token=None, depth_path=None): + headers = None + if access_token: + headers = {'X-Access-Token': access_token} + if isinstance(resource_item_id, dict): + headers = {'X-Access-Token': self._get_access_token(resource_item_id)} + resource_item_id = resource_item_id['data']['id'] + if not subitem_id: + subitem_id = put_data['data']['id'] + if depth_path: + url = '{}/{}/{}/{}/{}'.format( + self.prefix_path, resource_item_id, depth_path, subitem_name, + subitem_id + ) + else: + url = '{}/{}/{}/{}'.format( + self.prefix_path, resource_item_id, subitem_name, subitem_id + ) + return self._put_resource_item(url, put_data, headers=headers) + ########################################################################### # UPLOAD CLIENT METHODS ########################################################################### diff --git a/openprocurement_client/constants.py b/openprocurement_client/constants.py index 594eb3b..8cd7464 100644 --- a/openprocurement_client/constants.py +++ b/openprocurement_client/constants.py @@ -27,4 +27,6 @@ PUSH = 'push' CRITERIA = 'criteria' REQUIREMENT_RESPONSES = 'requirement_responses' -EVIDENCES = 'evidences' \ No newline at end of file +EVIDENCES = 'evidences' +REQUIREMENT_GROUPS = 'requirement_groups' +REQUIREMENTS = 'requirements' diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index 4e2eca5..004fe9e 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -10,7 +10,9 @@ from openprocurement_client.constants import (AUCTIONS, AWARDS, BIDS, CANCELLATIONS, COMPLAINTS, CONTRACTS, DOCUMENTS, ITEMS, LOTS, PROLONGATIONS, QUALIFICATIONS, QUESTIONS, - TENDERS, AGREEMENTS, PLANS, PUSH, MILESTONES, CRITERIA, REQUIREMENT_RESPONSES, EVIDENCES) + TENDERS, AGREEMENTS, PLANS, PUSH, MILESTONES, + CRITERIA, REQUIREMENT_RESPONSES, EVIDENCES, REQUIREMENT_GROUPS, + REQUIREMENTS) LOGGER = logging.getLogger(__name__) @@ -483,6 +485,24 @@ def upload_prolongation_document(self, file_, tender_id, contract_id, prolongati doc_registration=doc_registration, depth_path=depth_path, access_token=access_token) + def patch_requirement(self, tender_id, requirement_data, criteria_id, requirement_groups_id, requirement_id='', + access_token=None): + return self.put_resource_item_subitem( + tender_id, requirement_data, REQUIREMENTS, + subitem_id=requirement_id, + depth_path='{}/{}/{}/{}'.format(CRITERIA, criteria_id, REQUIREMENT_GROUPS, requirement_groups_id), + access_token=access_token + ) + + def patch_evidence(self, tender_id, evidence_data, criteria_id, requirement_groups_id, requirement_id='', + access_token=None): + return self.put_resource_item_subitem( + tender_id, evidence_data, REQUIREMENTS, + subitem_id=requirement_id, + depth_path='{}/{}/{}/{}'.format(CRITERIA, criteria_id, REQUIREMENT_GROUPS, requirement_groups_id), + access_token=access_token + ) + ########################################################################### # UPDATE FILE API METHODS ########################################################################### From 367f25a2f1add38812d10bd40172827ed3b4a6ea Mon Sep 17 00:00:00 2001 From: Serhij Andreev Date: Mon, 19 Apr 2021 13:46:29 +0300 Subject: [PATCH 35/59] add method for search agreements by classification_id --- openprocurement_client/resources/agreements.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/resources/agreements.py b/openprocurement_client/resources/agreements.py index 2b51078..e613487 100644 --- a/openprocurement_client/resources/agreements.py +++ b/openprocurement_client/resources/agreements.py @@ -32,4 +32,11 @@ def patch_change(self, agreement_id, data, change_id, access_token=None): def patch_document(self, agreement_id, data, document_id, access_token=None): return self.patch_resource_item_subitem( - agreement_id, data, DOCUMENTS, document_id, access_token=access_token) \ No newline at end of file + agreement_id, data, DOCUMENTS, document_id, access_token=access_token) + + def find_agreements_by_classification_ids(self, classification_id, additional_classifications=""): + url = "{}_by_classification/{}".format(self.prefix_path, classification_id) + params = {} + if additional_classifications: + params["additional_classifications"] = additional_classifications.join(",") + self.request('GET', url, params_dict=params) From 2feaf49326b1cde467affa51d4b03f3101fc0c21 Mon Sep 17 00:00:00 2001 From: Serhij Andreev Date: Mon, 19 Apr 2021 13:56:03 +0300 Subject: [PATCH 36/59] update method --- openprocurement_client/resources/agreements.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/resources/agreements.py b/openprocurement_client/resources/agreements.py index e613487..5d94375 100644 --- a/openprocurement_client/resources/agreements.py +++ b/openprocurement_client/resources/agreements.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- from zope.deprecation import deprecation +from simplejson import loads +from openprocurement_client.compatibility_utils import munchify_factory +from openprocurement_client.exceptions import InvalidResponse from openprocurement_client.clients import APIResourceClient from openprocurement_client.constants import ( AGREEMENTS, @@ -8,6 +11,8 @@ DOCUMENTS, ) +munchify = munchify_factory() + class AgreementClient(APIResourceClient): """ Client for agreements """ @@ -39,4 +44,12 @@ def find_agreements_by_classification_ids(self, classification_id, additional_cl params = {} if additional_classifications: params["additional_classifications"] = additional_classifications.join(",") - self.request('GET', url, params_dict=params) + response = self.request('GET', url, params_dict=params) + if response.status_code == 200: + resource_items_list = munchify(loads(response.text)) + self._update_params(resource_items_list.next_page) + return resource_items_list.data + elif response.status_code == 404: + del self.params['offset'] + + raise InvalidResponse(response) From 2dd36ed3f3f6b60211ee7dee7590179cabaed916 Mon Sep 17 00:00:00 2001 From: Serhij Andreev Date: Mon, 19 Apr 2021 13:56:52 +0300 Subject: [PATCH 37/59] fix --- openprocurement_client/resources/agreements.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openprocurement_client/resources/agreements.py b/openprocurement_client/resources/agreements.py index 5d94375..646c34c 100644 --- a/openprocurement_client/resources/agreements.py +++ b/openprocurement_client/resources/agreements.py @@ -47,7 +47,6 @@ def find_agreements_by_classification_ids(self, classification_id, additional_cl response = self.request('GET', url, params_dict=params) if response.status_code == 200: resource_items_list = munchify(loads(response.text)) - self._update_params(resource_items_list.next_page) return resource_items_list.data elif response.status_code == 404: del self.params['offset'] From 04dcb3f0717793021c11c85c0e5f432f91ec3511 Mon Sep 17 00:00:00 2001 From: Serhij Andreev Date: Mon, 19 Apr 2021 13:57:25 +0300 Subject: [PATCH 38/59] fix --- openprocurement_client/resources/agreements.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openprocurement_client/resources/agreements.py b/openprocurement_client/resources/agreements.py index 646c34c..59eb8e5 100644 --- a/openprocurement_client/resources/agreements.py +++ b/openprocurement_client/resources/agreements.py @@ -48,7 +48,5 @@ def find_agreements_by_classification_ids(self, classification_id, additional_cl if response.status_code == 200: resource_items_list = munchify(loads(response.text)) return resource_items_list.data - elif response.status_code == 404: - del self.params['offset'] raise InvalidResponse(response) From e79e40469bb921318c8cb57c8b98f9ff773fe5ed Mon Sep 17 00:00:00 2001 From: Serhij Andreev Date: Mon, 19 Apr 2021 16:40:46 +0300 Subject: [PATCH 39/59] add new method --- openprocurement_client/resources/agreements.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/resources/agreements.py b/openprocurement_client/resources/agreements.py index 59eb8e5..04f5b41 100644 --- a/openprocurement_client/resources/agreements.py +++ b/openprocurement_client/resources/agreements.py @@ -39,7 +39,7 @@ def patch_document(self, agreement_id, data, document_id, access_token=None): return self.patch_resource_item_subitem( agreement_id, data, DOCUMENTS, document_id, access_token=access_token) - def find_agreements_by_classification_ids(self, classification_id, additional_classifications=""): + def find_agreements_by_classification_id(self, classification_id, additional_classifications=""): url = "{}_by_classification/{}".format(self.prefix_path, classification_id) params = {} if additional_classifications: @@ -50,3 +50,15 @@ def find_agreements_by_classification_ids(self, classification_id, additional_cl return resource_items_list.data raise InvalidResponse(response) + + def find_recursive_agreements_by_classification_id(self, classification_id, additional_classifications=""): + if "-" in classification_id: + classification_id = classification_id[:classification_id.find("-")] + needed_level = 2 + while classification_id[needed_level] != '0': + agreements = self.find_agreements_by_classification_id(classification_id, additional_classifications) + if agreements: + return agreements + + pos = classification_id[1:].find('0') + classification_id = classification_id[:pos] + '0' + classification_id[pos+1:] From 10a0f5f42bc5937e80eb18fc0485fe19a19ed7a4 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Tue, 27 Apr 2021 12:36:37 +0300 Subject: [PATCH 40/59] add retry to create/patch methods --- openprocurement_client/clients.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openprocurement_client/clients.py b/openprocurement_client/clients.py index 10744ea..269f5a8 100755 --- a/openprocurement_client/clients.py +++ b/openprocurement_client/clients.py @@ -68,6 +68,7 @@ def _obtain_cookie(self): def _get_access_token(obj): return getattr(getattr(obj, 'access', ''), 'token', '') + @retry(stop_max_attempt_number=5) def _create_resource_item(self, url, payload, headers=None, method='POST'): _headers = self.headers.copy() _headers.update(headers or {}) @@ -109,6 +110,7 @@ def _get_resource_items(self, params=None, feed='changes'): raise InvalidResponse(response) + @retry(stop_max_attempt_number=5) def _patch_resource_item(self, url, payload, headers=None): _headers = self.headers.copy() _headers.update(headers or {}) From e4a44ca23c1b7e1e43a473c5b08ec83b8a8a05dc Mon Sep 17 00:00:00 2001 From: Serhij Andreev Date: Thu, 10 Jun 2021 17:05:48 +0300 Subject: [PATCH 41/59] fix --- openprocurement_client/resources/agreements.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openprocurement_client/resources/agreements.py b/openprocurement_client/resources/agreements.py index 04f5b41..0e8ded5 100644 --- a/openprocurement_client/resources/agreements.py +++ b/openprocurement_client/resources/agreements.py @@ -39,11 +39,11 @@ def patch_document(self, agreement_id, data, document_id, access_token=None): return self.patch_resource_item_subitem( agreement_id, data, DOCUMENTS, document_id, access_token=access_token) - def find_agreements_by_classification_id(self, classification_id, additional_classifications=""): + def find_agreements_by_classification_id(self, classification_id, additional_classifications=()): url = "{}_by_classification/{}".format(self.prefix_path, classification_id) params = {} if additional_classifications: - params["additional_classifications"] = additional_classifications.join(",") + params["additional_classifications"] = ",".join(additional_classifications) response = self.request('GET', url, params_dict=params) if response.status_code == 200: resource_items_list = munchify(loads(response.text)) @@ -51,7 +51,7 @@ def find_agreements_by_classification_id(self, classification_id, additional_cla raise InvalidResponse(response) - def find_recursive_agreements_by_classification_id(self, classification_id, additional_classifications=""): + def find_recursive_agreements_by_classification_id(self, classification_id, additional_classifications=()): if "-" in classification_id: classification_id = classification_id[:classification_id.find("-")] needed_level = 2 From f03e8503beacfcc1d7625364bc750e797f88085a Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Thu, 1 Jul 2021 13:18:59 +0300 Subject: [PATCH 42/59] apeal/liability methods --- openprocurement_client/dasu_client.py | 30 ++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/dasu_client.py b/openprocurement_client/dasu_client.py index 175d4b4..deb4d07 100755 --- a/openprocurement_client/dasu_client.py +++ b/openprocurement_client/dasu_client.py @@ -86,6 +86,24 @@ def create_party(self, monitoring, party): headers={'X-Access-Token': self._get_access_token(monitoring)} ) + def create_liability(self, monitoring, monitoring_id): + return self._create_resource_item( + '{}/{}/{}'.format( + self.prefix_path, monitoring_id, 'liabilities' + ), + payload=monitoring, + headers={'X-Access-Token': self._get_access_token(monitoring)}, + ) + + def patch_liability(self, monitoring, monitoring_id, liability_id): + return self._patch_resource_item( + '{}/{}/{}/{}'.format( + self.prefix_path, monitoring_id, 'liabilities', liability_id + ), + payload=monitoring, + headers={'X-Access-Token': self._get_access_token(monitoring)} + ) + def patch_monitoring(self, monitoring, monitoring_id): return self._patch_resource_item( '{}/{}'.format(self.prefix_path, monitoring_id), @@ -114,7 +132,7 @@ def patch_eliminationReport(self, monitoring, report): method='PUT' ) - def patch_appeal(self, monitoring, appeal): + def create_appeal(self, monitoring, appeal): return self._create_resource_item( '{}/{}/{}'.format( self.prefix_path, monitoring.data.id, @@ -125,6 +143,16 @@ def patch_appeal(self, monitoring, appeal): method='PUT' ) + def patch_appeal(self, monitoring, appeal): + return self._patch_resource_item( + '{}/{}/{}'.format( + self.prefix_path, monitoring.data.id, + 'appeal' + ), + payload=appeal, + headers={'X-Access-Token': self._get_access_token(monitoring)}, + ) + @verify_file def upload_obj_document(self, file_): response = self.ds_client.document_upload_registered( From 7d53591918ef92a2fedebf6aebeb5e49902be929 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Mon, 12 Jul 2021 12:52:05 +0300 Subject: [PATCH 43/59] bid testing methods --- openprocurement_client/clients.py | 14 ++++++++++++++ openprocurement_client/resources/tenders.py | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/openprocurement_client/clients.py b/openprocurement_client/clients.py index 269f5a8..a4435b2 100755 --- a/openprocurement_client/clients.py +++ b/openprocurement_client/clients.py @@ -156,6 +156,20 @@ def upload_document(self, file_, resource_item_id, subitem_name=DOCUMENTS, doc_t file_=file_, headers=headers, doc_registration=doc_registration, doc_type=doc_type, use_ds_client=use_ds_client) + @verify_file + def register_and_upload_document(self, file_, use_ds_client=True, doc_registration=True): + headers = None + return self._register_and_upload_file(file_=file_, headers=headers, use_ds_client=use_ds_client, + doc_registration=doc_registration) + + def _register_and_upload_file(self, file_=None, headers=None, use_ds_client=True, doc_registration=True): + if hasattr(self, 'ds_client') and use_ds_client: + if doc_registration: + response = self.ds_client.document_upload_registered(file_=file_, headers=headers) + else: + response = self.ds_client.document_upload_not_registered(file_=file_, headers=headers) + return response + def _update_params(self, params): for key in params: if key not in IGNORE_PARAMS: diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index 004fe9e..ae0c63f 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -188,6 +188,10 @@ def get_questions(self, tender_id, access_token=None): def get_documents(self, tender_id, access_token=None): return self.get_resource_item_subitem(tender_id, DOCUMENTS, access_token=access_token) + def get_bid_documents(self, tender_id, bid_id, access_token=None): + return self.get_resource_item_subitem( + tender_id, DOCUMENTS, depth_path='{}/{}'.format(BIDS, bid_id), access_token=access_token) + def get_awards_documents(self, tender_id, award_id, access_token=None): return self.get_resource_item_subitem( tender_id, DOCUMENTS, depth_path='{}/{}'.format(AWARDS, award_id), @@ -207,6 +211,9 @@ def get_awards(self, tender_id, access_token=None): def get_lots(self, tender_id, access_token=None): return self.get_resource_item_subitem(tender_id, LOTS, access_token=access_token) + def get_bids(self, tender_id, access_token=None): + return self.get_resource_item_subitem(tender_id, BIDS, access_token=access_token) + ########################################################################### # GET ITEM API METHODS ########################################################################### From 51353ce5fd16fd26d55adef0610b4a1fb1d6abb3 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Thu, 28 Oct 2021 15:40:52 +0300 Subject: [PATCH 44/59] during create item we can have both 200/201 posible responses --- openprocurement_client/clients.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openprocurement_client/clients.py b/openprocurement_client/clients.py index a4435b2..cf8df63 100755 --- a/openprocurement_client/clients.py +++ b/openprocurement_client/clients.py @@ -74,7 +74,7 @@ def _create_resource_item(self, url, payload, headers=None, method='POST'): _headers.update(headers or {}) response_item = self.request(method, url, headers=_headers, json=payload) - if ((response_item.status_code == 201 and method == 'POST') or + if ((response_item.status_code in (200, 201) and method == 'POST') or (response_item.status_code in (200, 204) and method in ('PUT', 'DELETE'))): return munchify(loads(response_item.text)) raise InvalidResponse(response_item) From dd5fb521236e9d130a038ad5bfc559e6d464e785 Mon Sep 17 00:00:00 2001 From: AlexDiatlov Date: Thu, 28 Oct 2021 15:41:56 +0300 Subject: [PATCH 45/59] aggregate plans method - add plan id in plans array --- openprocurement_client/resources/tenders.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openprocurement_client/resources/tenders.py b/openprocurement_client/resources/tenders.py index ae0c63f..d960608 100644 --- a/openprocurement_client/resources/tenders.py +++ b/openprocurement_client/resources/tenders.py @@ -164,6 +164,11 @@ def create_bid_criteria_contract_guarantee_response(self, tender_id, contract_cr tender_id, contract_criteria_data, EVIDENCES, depth_path=depth_path, access_token=access_token ) + def aggregate_plans(self, tender_id, plans_data, access_token=None): + return self.create_resource_item_subitem( + tender_id, plans_data, PLANS, access_token=access_token + ) + ########################################################################### # GET ITEMS LIST API METHODS ########################################################################### From 85e48a53abbcce7bc16c11b53b283549b11c7bf8 Mon Sep 17 00:00:00 2001 From: Aleksey Stryukov Date: Fri, 7 Jul 2023 12:03:45 +0300 Subject: [PATCH 46/59] change version to be compatible with pep-0440 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 44e45b8..5ee3cd6 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import find_packages, setup -version = '2.1.1dp' +version = '2.1.1+dp' install_requires = [ 'gevent', From d6f18b44a96e1850914b49f603e3f7217efee9bd Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Tue, 1 Aug 2023 17:25:52 +0200 Subject: [PATCH 47/59] CS-13656 --- openprocurement_client/constants.py | 1 + .../resources/frameworks.py | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 openprocurement_client/resources/frameworks.py diff --git a/openprocurement_client/constants.py b/openprocurement_client/constants.py index 8cd7464..f06ddce 100644 --- a/openprocurement_client/constants.py +++ b/openprocurement_client/constants.py @@ -30,3 +30,4 @@ EVIDENCES = 'evidences' REQUIREMENT_GROUPS = 'requirement_groups' REQUIREMENTS = 'requirements' +FRAMEWORKS = 'frameworks' diff --git a/openprocurement_client/resources/frameworks.py b/openprocurement_client/resources/frameworks.py new file mode 100644 index 0000000..ec4af64 --- /dev/null +++ b/openprocurement_client/resources/frameworks.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +import logging +from retrying import retry + +from openprocurement_client.clients import APIResourceClient +from openprocurement_client.constants import FRAMEWORKS + +LOGGER = logging.getLogger(__name__) + + +class FrameworksClient(APIResourceClient): + """Client for frameworks""" + + resource = FRAMEWORKS + + ########################################################################### + # GET ITEMS LIST API METHODS + ########################################################################### + + ########################################################################### + # CREATE ITEM API METHODS + ########################################################################### + + def create_qualification(self, qualification): + return self.create_resource_item(qualification) + + ########################################################################### + # GET ITEM API METHODS + ########################################################################### + + ########################################################################### + # PATCH ITEM API METHODS + ########################################################################### From 59bb71d2e6d17d7ec68103677e4d6a930b7c309f Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Fri, 4 Aug 2023 13:32:43 +0200 Subject: [PATCH 48/59] added get methods for qualification --- openprocurement_client/resources/frameworks.py | 8 ++++++++ openprocurement_client/utils.py | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/openprocurement_client/resources/frameworks.py b/openprocurement_client/resources/frameworks.py index ec4af64..81be239 100644 --- a/openprocurement_client/resources/frameworks.py +++ b/openprocurement_client/resources/frameworks.py @@ -17,6 +17,10 @@ class FrameworksClient(APIResourceClient): # GET ITEMS LIST API METHODS ########################################################################### + retry(stop_max_attempt_number=5) + def get_qualifications(self, params=None, feed='changes'): + return self.get_resource_items(params=params, feed=feed) + ########################################################################### # CREATE ITEM API METHODS ########################################################################### @@ -28,6 +32,10 @@ def create_qualification(self, qualification): # GET ITEM API METHODS ########################################################################### + @retry(stop_max_attempt_number=5) + def get_qualification(self, qualification_id): + return self.get_resource_item(qualification_id) + ########################################################################### # PATCH ITEM API METHODS ########################################################################### diff --git a/openprocurement_client/utils.py b/openprocurement_client/utils.py index 60b5418..ec844f8 100644 --- a/openprocurement_client/utils.py +++ b/openprocurement_client/utils.py @@ -107,6 +107,18 @@ def get_plan_id_by_uaid(ua_id, client, descending=True, id_field='planID'): raise IdNotFound +def get_qualification_id_by_uaid(ua_id, client, descending=True, id_field='qualificationID'): + params = {'offset': '', 'opt_fields': id_field, 'descending': descending} + qualification_list = True + client._update_params(params) + while qualification_list: + qualification_list = client.get_qualifications() + for qualification in qualification_list: + if qualification[id_field] == ua_id: + return qualification.id + raise IdNotFound + + def get_monitoring_id_by_uaid(ua_id, client, descending=True, id_field='monitoring_id'): params = {'offset': '', 'opt_fields': id_field, 'descending': descending} monitoring_list = True From 89fc2f17c3fa2f448398f8af2d14f76d91bd604b Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Mon, 21 Aug 2023 14:08:06 +0200 Subject: [PATCH 49/59] added upload_framework_document --- .../resources/frameworks.py | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/openprocurement_client/resources/frameworks.py b/openprocurement_client/resources/frameworks.py index 81be239..f563b74 100644 --- a/openprocurement_client/resources/frameworks.py +++ b/openprocurement_client/resources/frameworks.py @@ -3,7 +3,7 @@ from retrying import retry from openprocurement_client.clients import APIResourceClient -from openprocurement_client.constants import FRAMEWORKS +from openprocurement_client.constants import (FRAMEWORKS, DOCUMENTS) LOGGER = logging.getLogger(__name__) @@ -25,17 +25,29 @@ def get_qualifications(self, params=None, feed='changes'): # CREATE ITEM API METHODS ########################################################################### - def create_qualification(self, qualification): - return self.create_resource_item(qualification) + def create_qualification(self, framework): + return self.create_resource_item(framework) ########################################################################### # GET ITEM API METHODS ########################################################################### @retry(stop_max_attempt_number=5) - def get_qualification(self, qualification_id): - return self.get_resource_item(qualification_id) + def get_qualification(self, framework_id): + return self.get_resource_item(framework_id) ########################################################################### # PATCH ITEM API METHODS ########################################################################### + + + ########################################################################### + # UPLOAD FILE API METHODS + ########################################################################### + def upload_framework_document(self, file, framework_id, use_ds_client=True, + doc_registration=True, access_token=None): + depth_path = '{}'.format(DOCUMENTS) + return self.upload_document(file, framework_id, + use_ds_client=use_ds_client, + doc_registration=doc_registration, + depth_path=depth_path, access_token=access_token) \ No newline at end of file From 87df548ff387537bfff69a489b73db09c9beb6be Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Mon, 21 Aug 2023 15:45:38 +0200 Subject: [PATCH 50/59] added upload_framework_document --- openprocurement_client/clients.py | 1 + openprocurement_client/resources/frameworks.py | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openprocurement_client/clients.py b/openprocurement_client/clients.py index cf8df63..f9785cc 100755 --- a/openprocurement_client/clients.py +++ b/openprocurement_client/clients.py @@ -152,6 +152,7 @@ def upload_document(self, file_, resource_item_id, subitem_name=DOCUMENTS, doc_t url = '{}/{}/{}/{}'.format(self.prefix_path, resource_item_id, depth_path, subitem_name) else: url = '{}/{}/{}'.format(self.prefix_path, resource_item_id, subitem_name) + LOGGER.warn(url) return self._upload_resource_file(url, file_=file_, headers=headers, doc_registration=doc_registration, doc_type=doc_type, use_ds_client=use_ds_client) diff --git a/openprocurement_client/resources/frameworks.py b/openprocurement_client/resources/frameworks.py index f563b74..c9dd60d 100644 --- a/openprocurement_client/resources/frameworks.py +++ b/openprocurement_client/resources/frameworks.py @@ -46,8 +46,7 @@ def get_qualification(self, framework_id): ########################################################################### def upload_framework_document(self, file, framework_id, use_ds_client=True, doc_registration=True, access_token=None): - depth_path = '{}'.format(DOCUMENTS) return self.upload_document(file, framework_id, use_ds_client=use_ds_client, doc_registration=doc_registration, - depth_path=depth_path, access_token=access_token) \ No newline at end of file + access_token=access_token) \ No newline at end of file From 51a8a7d0effef44d8b6cb4da3982d23cbcefccd6 Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Mon, 21 Aug 2023 17:44:55 +0200 Subject: [PATCH 51/59] added patch_framework --- openprocurement_client/clients.py | 1 - openprocurement_client/resources/frameworks.py | 6 +++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/openprocurement_client/clients.py b/openprocurement_client/clients.py index f9785cc..cf8df63 100755 --- a/openprocurement_client/clients.py +++ b/openprocurement_client/clients.py @@ -152,7 +152,6 @@ def upload_document(self, file_, resource_item_id, subitem_name=DOCUMENTS, doc_t url = '{}/{}/{}/{}'.format(self.prefix_path, resource_item_id, depth_path, subitem_name) else: url = '{}/{}/{}'.format(self.prefix_path, resource_item_id, subitem_name) - LOGGER.warn(url) return self._upload_resource_file(url, file_=file_, headers=headers, doc_registration=doc_registration, doc_type=doc_type, use_ds_client=use_ds_client) diff --git a/openprocurement_client/resources/frameworks.py b/openprocurement_client/resources/frameworks.py index c9dd60d..c082c98 100644 --- a/openprocurement_client/resources/frameworks.py +++ b/openprocurement_client/resources/frameworks.py @@ -36,10 +36,14 @@ def create_qualification(self, framework): def get_qualification(self, framework_id): return self.get_resource_item(framework_id) + def get_documents(self, framework_id, access_token=None): + return self.get_resource_item_subitem(framework_id, DOCUMENTS, access_token=access_token) + ########################################################################### # PATCH ITEM API METHODS ########################################################################### - + def patch_framework(self, framework_id, patch_data={}, access_token=None): + return self.patch_resource_item(framework_id, patch_data, access_token=access_token) ########################################################################### # UPLOAD FILE API METHODS From 5b81aa68a5c4683e55eb2e8d6690416178870683 Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Tue, 22 Aug 2023 14:05:43 +0200 Subject: [PATCH 52/59] added create_submission --- openprocurement_client/constants.py | 1 + openprocurement_client/resources/frameworks.py | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/constants.py b/openprocurement_client/constants.py index f06ddce..321b63d 100644 --- a/openprocurement_client/constants.py +++ b/openprocurement_client/constants.py @@ -31,3 +31,4 @@ REQUIREMENT_GROUPS = 'requirement_groups' REQUIREMENTS = 'requirements' FRAMEWORKS = 'frameworks' +SUBMISSIONS = 'submissions' diff --git a/openprocurement_client/resources/frameworks.py b/openprocurement_client/resources/frameworks.py index c082c98..9700a11 100644 --- a/openprocurement_client/resources/frameworks.py +++ b/openprocurement_client/resources/frameworks.py @@ -3,7 +3,8 @@ from retrying import retry from openprocurement_client.clients import APIResourceClient -from openprocurement_client.constants import (FRAMEWORKS, DOCUMENTS) +from openprocurement_client.constants import (FRAMEWORKS, DOCUMENTS, SUBMISSION) +from openprocurement_client.exceptions import InvalidResponse LOGGER = logging.getLogger(__name__) @@ -27,6 +28,13 @@ def get_qualifications(self, params=None, feed='changes'): def create_qualification(self, framework): return self.create_resource_item(framework) + def create_submission(self, submission): + submission_resource= SUBMISSION + url = self.host_url.replace(self.resource, submission_resource) + response_item = self.request('POST', url, headers=self.headers, json=submission) + if response_item.status_code in (200, 201): + return self.munchify(self.loads(response_item.text)) + raise InvalidResponse(response_item) ########################################################################### # GET ITEM API METHODS From d27f876c9280d4219f7f65c7d0b0a30acba3de4a Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Tue, 22 Aug 2023 14:47:00 +0200 Subject: [PATCH 53/59] added create_submission --- openprocurement_client/resources/frameworks.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openprocurement_client/resources/frameworks.py b/openprocurement_client/resources/frameworks.py index 9700a11..c37e076 100644 --- a/openprocurement_client/resources/frameworks.py +++ b/openprocurement_client/resources/frameworks.py @@ -3,7 +3,7 @@ from retrying import retry from openprocurement_client.clients import APIResourceClient -from openprocurement_client.constants import (FRAMEWORKS, DOCUMENTS, SUBMISSION) +from openprocurement_client.constants import (FRAMEWORKS, DOCUMENTS, SUBMISSIONS) from openprocurement_client.exceptions import InvalidResponse LOGGER = logging.getLogger(__name__) @@ -28,8 +28,9 @@ def get_qualifications(self, params=None, feed='changes'): def create_qualification(self, framework): return self.create_resource_item(framework) + def create_submission(self, submission): - submission_resource= SUBMISSION + submission_resource= SUBMISSIONS url = self.host_url.replace(self.resource, submission_resource) response_item = self.request('POST', url, headers=self.headers, json=submission) if response_item.status_code in (200, 201): From 88d191dba825ee7ecd3d586bbf44948d603f6549 Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Tue, 22 Aug 2023 15:00:07 +0200 Subject: [PATCH 54/59] added submissions class --- openprocurement_client/resources/frameworks.py | 9 --------- openprocurement_client/resources/submissions.py | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 openprocurement_client/resources/submissions.py diff --git a/openprocurement_client/resources/frameworks.py b/openprocurement_client/resources/frameworks.py index c37e076..7813f06 100644 --- a/openprocurement_client/resources/frameworks.py +++ b/openprocurement_client/resources/frameworks.py @@ -4,7 +4,6 @@ from openprocurement_client.clients import APIResourceClient from openprocurement_client.constants import (FRAMEWORKS, DOCUMENTS, SUBMISSIONS) -from openprocurement_client.exceptions import InvalidResponse LOGGER = logging.getLogger(__name__) @@ -29,14 +28,6 @@ def get_qualifications(self, params=None, feed='changes'): def create_qualification(self, framework): return self.create_resource_item(framework) - def create_submission(self, submission): - submission_resource= SUBMISSIONS - url = self.host_url.replace(self.resource, submission_resource) - response_item = self.request('POST', url, headers=self.headers, json=submission) - if response_item.status_code in (200, 201): - return self.munchify(self.loads(response_item.text)) - raise InvalidResponse(response_item) - ########################################################################### # GET ITEM API METHODS ########################################################################### diff --git a/openprocurement_client/resources/submissions.py b/openprocurement_client/resources/submissions.py new file mode 100644 index 0000000..deef333 --- /dev/null +++ b/openprocurement_client/resources/submissions.py @@ -0,0 +1,17 @@ +import logging + +from openprocurement_client.clients import APIResourceClient +from openprocurement_client.constants import (DOCUMENTS, SUBMISSIONS) + +LOGGER = logging.getLogger(__name__) + + +class SubmissionsClient(APIResourceClient): + """Client for submissions""" + + resource = SUBMISSIONS + + + def create_qualification(self, submission): + return self.create_resource_item(submission) + From 47795e6d2c7fd0cc6cbfcfea58d1f08fefb611e3 Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Tue, 22 Aug 2023 15:17:49 +0200 Subject: [PATCH 55/59] updated submissions class --- openprocurement_client/resources/submissions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openprocurement_client/resources/submissions.py b/openprocurement_client/resources/submissions.py index deef333..63fc01c 100644 --- a/openprocurement_client/resources/submissions.py +++ b/openprocurement_client/resources/submissions.py @@ -12,6 +12,6 @@ class SubmissionsClient(APIResourceClient): resource = SUBMISSIONS - def create_qualification(self, submission): + def create_submission(self, submission): return self.create_resource_item(submission) From 5b642f47e59b51e466daddc8ab3d020d504147f9 Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Wed, 23 Aug 2023 14:16:36 +0200 Subject: [PATCH 56/59] added upload_submission_document --- openprocurement_client/resources/submissions.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/resources/submissions.py b/openprocurement_client/resources/submissions.py index 63fc01c..a89d3ad 100644 --- a/openprocurement_client/resources/submissions.py +++ b/openprocurement_client/resources/submissions.py @@ -11,7 +11,14 @@ class SubmissionsClient(APIResourceClient): resource = SUBMISSIONS - def create_submission(self, submission): return self.create_resource_item(submission) + def upload_submission_document(self, file, submission_id, use_ds_client=True, + doc_registration=True, access_token=None): + return self.upload_document(file, submission_id, + use_ds_client=use_ds_client, + doc_registration=doc_registration, + access_token=access_token) + + From c5fd4f9bcf27756d3d23ca0375ab495971bbb857 Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Thu, 24 Aug 2023 09:13:02 +0200 Subject: [PATCH 57/59] added patch_submission --- openprocurement_client/resources/submissions.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openprocurement_client/resources/submissions.py b/openprocurement_client/resources/submissions.py index a89d3ad..9fa77ac 100644 --- a/openprocurement_client/resources/submissions.py +++ b/openprocurement_client/resources/submissions.py @@ -14,6 +14,9 @@ class SubmissionsClient(APIResourceClient): def create_submission(self, submission): return self.create_resource_item(submission) + def patch_submission(self, submission_id, patch_data={}, access_token=None): + return self.patch_resource_item(submission_id, patch_data, access_token=access_token) + def upload_submission_document(self, file, submission_id, use_ds_client=True, doc_registration=True, access_token=None): return self.upload_document(file, submission_id, From b2da83d3694f1195b1913da7f0718de6e0417ab7 Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Thu, 24 Aug 2023 09:21:48 +0200 Subject: [PATCH 58/59] added qualifications client --- .../resources/qualifications.py | 25 +++++++++++++++++++ .../resources/submissions.py | 5 +++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 openprocurement_client/resources/qualifications.py diff --git a/openprocurement_client/resources/qualifications.py b/openprocurement_client/resources/qualifications.py new file mode 100644 index 0000000..1e83ae7 --- /dev/null +++ b/openprocurement_client/resources/qualifications.py @@ -0,0 +1,25 @@ +import logging + +from openprocurement_client.clients import APIResourceClient +from openprocurement_client.constants import (QUALIFICATIONS) + +LOGGER = logging.getLogger(__name__) + + +class QualificationClient(APIResourceClient): + """Client for qualification""" + + resource = QUALIFICATIONS + + def get_qualification(self, qualification_id): + return self.get_resource_item(qualification_id) + + def patch_qualification(self, qualification_id, patch_data={}, access_token=None): + return self.patch_resource_item(qualification_id, patch_data, access_token=access_token) + + def upload_qualification_document(self, file, qualification_id, use_ds_client=True, + doc_registration=True, access_token=None): + return self.upload_document(file, qualification_id, + use_ds_client=use_ds_client, + doc_registration=doc_registration, + access_token=access_token) \ No newline at end of file diff --git a/openprocurement_client/resources/submissions.py b/openprocurement_client/resources/submissions.py index 9fa77ac..3d2fbb7 100644 --- a/openprocurement_client/resources/submissions.py +++ b/openprocurement_client/resources/submissions.py @@ -1,7 +1,7 @@ import logging from openprocurement_client.clients import APIResourceClient -from openprocurement_client.constants import (DOCUMENTS, SUBMISSIONS) +from openprocurement_client.constants import (SUBMISSIONS) LOGGER = logging.getLogger(__name__) @@ -11,6 +11,9 @@ class SubmissionsClient(APIResourceClient): resource = SUBMISSIONS + def get_submission(self, submission_id): + return self.get_resource_item(submission_id) + def create_submission(self, submission): return self.create_resource_item(submission) From 79ad37750775e46c379f445bf9695fe41394af00 Mon Sep 17 00:00:00 2001 From: VTinkovan Date: Fri, 25 Aug 2023 11:35:49 +0200 Subject: [PATCH 59/59] added get_qualifications --- openprocurement_client/resources/frameworks.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openprocurement_client/resources/frameworks.py b/openprocurement_client/resources/frameworks.py index 7813f06..11a757d 100644 --- a/openprocurement_client/resources/frameworks.py +++ b/openprocurement_client/resources/frameworks.py @@ -3,7 +3,7 @@ from retrying import retry from openprocurement_client.clients import APIResourceClient -from openprocurement_client.constants import (FRAMEWORKS, DOCUMENTS, SUBMISSIONS) +from openprocurement_client.constants import (FRAMEWORKS, DOCUMENTS, SUBMISSIONS, QUALIFICATIONS) LOGGER = logging.getLogger(__name__) @@ -39,6 +39,12 @@ def get_qualification(self, framework_id): def get_documents(self, framework_id, access_token=None): return self.get_resource_item_subitem(framework_id, DOCUMENTS, access_token=access_token) + def get_submissions(self, framework_id, access_token=None): + return self.get_resource_item_subitem(framework_id, SUBMISSIONS, access_token=access_token) + + def get_qualifications(self, framework_id, access_token=None): + return self.get_resource_item_subitem(framework_id, QUALIFICATIONS, access_token=access_token) + ########################################################################### # PATCH ITEM API METHODS ###########################################################################