Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
f985f6f
Merge pull request #2 from openprocurement/upstream
Dec 11, 2018
1f5609c
Merge pull request #3 from openprocurement/upstream
Dec 11, 2018
62a2a83
Update setup.py
Dec 24, 2018
bee01fc
Added extra loggers
ktarasz Jan 11, 2019
910d6c0
Added Exception loggers on get_resource_items
ktarasz Jan 14, 2019
459b731
Merge pull request #5 from ktarasz/patch-1
Jan 14, 2019
af847e7
Retrievers parameters based on DEFAULT_RETRIEVERS_PARAMS
ktarasz Jan 14, 2019
fba34cc
Typo fix
ktarasz Jan 14, 2019
b6f4d46
Merge pull request #6 from ktarasz/patch-1
Jan 14, 2019
ecd32dc
Update setup.py
Jan 15, 2019
a13face
first version
alexdiatlov May 28, 2019
a26d8ec
first version
alexdiatlov May 28, 2019
e530fba
add fix
alexdiatlov May 29, 2019
b9ea85b
final version
alexdiatlov May 30, 2019
75c94ec
Merge pull request #7 from openprocurement/upstream
alekseystryukov May 30, 2019
2fa895d
Merge branch 'upstream' of git://github.com/openprocurement/openprocu…
alexdiatlov May 30, 2019
34bce88
fix unit test resource
alexdiatlov May 30, 2019
a12dce5
fix unit test utils
alexdiatlov May 30, 2019
b19edd2
Merge pull request #8 from ProzorroUKR/dasu_client
alexdiatlov May 30, 2019
1530c55
update plan tender branch
alexdiatlov Jun 4, 2019
f07d8f9
Merge pull request #9 from ProzorroUKR/plan_tender
alexdiatlov Jun 4, 2019
c630274
Revert "Merge pull request #9 from ProzorroUKR/plan_tender"
alexdiatlov Jun 21, 2019
ac28d62
Revert "Revert "Merge pull request #9 from ProzorroUKR/plan_tender""
alexdiatlov Jun 25, 2019
a35be68
the last revert for plan tender
alexdiatlov Jun 27, 2019
39e7809
add plan tender testing
alexdiatlov Jul 11, 2019
4f47d1b
Merge pull request #10 from ProzorroUKR/plan_tender
alexdiatlov Jul 11, 2019
b350ecd
add qualification/cancellation complaint methods
alexdiatlov Apr 8, 2020
2a81b24
add suites to main test suite
alexdiatlov Apr 8, 2020
db9874e
Merge pull request #11 from ProzorroUKR/complaints
alexdiatlov Apr 8, 2020
d70f35a
add push constant, add patch complaint methods, add payment client class
alexdiatlov Apr 13, 2020
7ba0bc7
Merge pull request #12 from ProzorroUKR/complaints
alexdiatlov Apr 13, 2020
d671d40
Add base catalogue client
VDigitall Mar 25, 2020
bfb512d
Initialize category tests
hexponent Apr 8, 2020
ddc263a
Fix category suppliers test
hexponent Apr 8, 2020
005e569
Add profiles client tests
hexponent Apr 8, 2020
f1ea1ea
Add ECatalogues client tests
hexponent Apr 8, 2020
ccd573d
Dont setup document service for ECatalogues client tests
hexponent Apr 9, 2020
e82a261
add milestone creation methods
alexdiatlov May 5, 2020
da11a71
delete duplicate methods
alexdiatlov May 5, 2020
5a1fc58
Merge pull request #13 from ProzorroUKR/24_hours
alexdiatlov May 5, 2020
bcb73b3
Merge pull request #14 from quintagroup/feature/catalogues
Jul 22, 2020
20d77b2
add retry into get plan/tender methods
alexdiatlov Aug 12, 2020
5a7b581
Merge pull request #16 from ProzorroUKR/CS-7514
alexdiatlov Aug 12, 2020
a2bfd46
add criteria constants
alexdiatlov Oct 2, 2020
fcf5bf3
post criteria in tender/post criteria response in bid methods
alexdiatlov Oct 2, 2020
456e482
Merge pull request #17 from ProzorroUKR/criteria
alexdiatlov Oct 2, 2020
f37cdb6
CS-8853 procuringEntity qualification/pre-qualification requirement r…
alexdiatlov Nov 17, 2020
31719a3
add new method/constant
alexdiatlov Mar 23, 2021
35ce910
fix host url and api versions in tests
alexdiatlov Mar 23, 2021
ab90972
Merge pull request #18 from ProzorroUKR/CS-9765
alexdiatlov Mar 23, 2021
f651286
ctireria status test methods
alexdiatlov Apr 13, 2021
9cad1ae
Merge pull request #19 from ProzorroUKR/CS-9764
alexdiatlov Apr 13, 2021
367f25a
add method for search agreements by classification_id
Apr 19, 2021
2feaf49
update method
Apr 19, 2021
2dd36ed
fix
Apr 19, 2021
04dcb3f
fix
Apr 19, 2021
e79e404
add new method
Apr 19, 2021
f09b1a8
Merge pull request #20 from ProzorroUKR/cs-9698
Apr 21, 2021
10a0f5f
add retry to create/patch methods
alexdiatlov Apr 27, 2021
6e31787
Merge pull request #21 from ProzorroUKR/CS-10353
alexdiatlov Apr 27, 2021
e4a44ca
fix
Jun 10, 2021
55de96f
Merge pull request #22 from ProzorroUKR/cs-9698
Jun 22, 2021
f03e850
apeal/liability methods
alexdiatlov Jul 1, 2021
ff2f3a2
Merge pull request #23 from ProzorroUKR/CS-5628
alexdiatlov Jul 1, 2021
7d53591
bid testing methods
alexdiatlov Jul 12, 2021
45a1538
Merge pull request #24 from ProzorroUKR/CS-10653
alexdiatlov Jul 12, 2021
51353ce
during create item we can have both 200/201 posible responses
alexdiatlov Oct 28, 2021
dd5fb52
aggregate plans method - add plan id in plans array
alexdiatlov Oct 28, 2021
4f852c6
Merge pull request #25 from ProzorroUKR/CS-10564
alexdiatlov Oct 28, 2021
85e48a5
change version to be compatible with pep-0440
alekseystryukov Jul 7, 2023
d6f18b4
CS-13656
Slavikus82 Aug 1, 2023
59bb71d
added get methods for qualification
Slavikus81 Aug 4, 2023
89fc2f1
added upload_framework_document
Slavikus81 Aug 21, 2023
87df548
added upload_framework_document
Slavikus81 Aug 21, 2023
51a8a7d
added patch_framework
Slavikus81 Aug 21, 2023
5b81aa6
added create_submission
Slavikus81 Aug 22, 2023
d27f876
added create_submission
Slavikus81 Aug 22, 2023
88d191d
added submissions class
Slavikus81 Aug 22, 2023
47795e6
updated submissions class
Slavikus81 Aug 22, 2023
5b642f4
added upload_submission_document
Slavikus81 Aug 23, 2023
c5fd4f9
added patch_submission
Slavikus81 Aug 24, 2023
b2da83d
added qualifications client
Slavikus81 Aug 24, 2023
79ad377
added get_qualifications
Slavikus81 Aug 25, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 63 additions & 1 deletion openprocurement_client/clients.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,13 @@ 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 {})

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)
Expand Down Expand Up @@ -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 {})
Expand All @@ -117,6 +119,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']),
Expand Down Expand Up @@ -146,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:
Expand Down Expand Up @@ -226,6 +250,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
###########################################################################
Expand Down Expand Up @@ -363,6 +404,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
###########################################################################
Expand Down
13 changes: 12 additions & 1 deletion openprocurement_client/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
AWARDS = 'awards'
BIDS = 'bids'
CANCELLATIONS = 'cancellations'
CATEGORIES = 'categories'
CHANGES = 'changes'
COMPLAINTS = 'complaints'
CONTRACTS = 'contracts'
Expand All @@ -14,10 +15,20 @@
LOTS = 'lots'
MILESTONES = 'milestones'
PLANS = 'plans'
PROFILES = 'profiles'
PROLONGATIONS = 'prolongations'
SUPPLIERS = 'suppliers'
QUALIFICATIONS = 'qualifications'
QUALIFICATION_DOCUMENTS = 'qualificationDocuments'
QUESTIONS = 'questions'
TENDERS = 'tenders'
TRANSFERS = 'transfers'
AGREEMENTS= 'agreements'
AGREEMENTS = 'agreements'
PUSH = 'push'
CRITERIA = 'criteria'
REQUIREMENT_RESPONSES = 'requirement_responses'
EVIDENCES = 'evidences'
REQUIREMENT_GROUPS = 'requirement_groups'
REQUIREMENTS = 'requirements'
FRAMEWORKS = 'frameworks'
SUBMISSIONS = 'submissions'
39 changes: 34 additions & 5 deletions openprocurement_client/dasu_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,22 @@
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,
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:
Expand Down Expand Up @@ -85,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),
Expand Down Expand Up @@ -113,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,
Expand All @@ -124,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(
Expand Down
31 changes: 30 additions & 1 deletion openprocurement_client/resources/agreements.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
# -*- 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,
CHANGES,
DOCUMENTS,
)

munchify = munchify_factory()


class AgreementClient(APIResourceClient):
""" Client for agreements """
Expand All @@ -32,4 +37,28 @@ 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)
agreement_id, data, DOCUMENTS, document_id, access_token=access_token)

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"] = ",".join(additional_classifications)
response = self.request('GET', url, params_dict=params)
if response.status_code == 200:
resource_items_list = munchify(loads(response.text))
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:]
2 changes: 1 addition & 1 deletion openprocurement_client/resources/document_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'

Expand Down
29 changes: 29 additions & 0 deletions openprocurement_client/resources/ecatalogues.py
Original file line number Diff line number Diff line change
@@ -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)
4 changes: 2 additions & 2 deletions openprocurement_client/resources/edr.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
62 changes: 62 additions & 0 deletions openprocurement_client/resources/frameworks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# -*- coding: utf-8 -*-
import logging
from retrying import retry

from openprocurement_client.clients import APIResourceClient
from openprocurement_client.constants import (FRAMEWORKS, DOCUMENTS, SUBMISSIONS, QUALIFICATIONS)

LOGGER = logging.getLogger(__name__)


class FrameworksClient(APIResourceClient):
"""Client for frameworks"""

resource = FRAMEWORKS

###########################################################################
# 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
###########################################################################

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, 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)

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
###########################################################################
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
###########################################################################
def upload_framework_document(self, file, framework_id, use_ds_client=True,
doc_registration=True, access_token=None):
return self.upload_document(file, framework_id,
use_ds_client=use_ds_client,
doc_registration=doc_registration,
access_token=access_token)
2 changes: 2 additions & 0 deletions openprocurement_client/resources/plans.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
import logging
from retrying import retry

from zope.deprecation import deprecation

Expand Down Expand Up @@ -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)

Expand Down
Loading