def prepare_auction_and_participation_urls(self): auction_url = self.worker_defaults["AUCTIONS_URL"].format( auction_id=self.tender_id) patch_data = {"data": {"auctionUrl": auction_url, "bids": []}} for bid in self._auction_data["data"]["bids"]: if bid.get('status', 'active') == 'active': participation_url = self.worker_defaults["AUCTIONS_URL"].format( auction_id=self.auction_doc_id) participation_url += '/login?bidder_id={}&hash={}'.format( bid["id"], calculate_hash(bid["id"], self.worker_defaults["HASH_SECRET"])) patch_data['data']['bids'].append({ "participationUrl": participation_url, "id": bid["id"] }) else: patch_data['data']['bids'].append({"id": bid["id"]}) LOGGER.info("Set auction and participation urls for tender {}".format( self.tender_id), extra={ "JOURNAL_REQUEST_ID": self.request_id, "MESSAGE_ID": AUCTION_WORKER_SET_AUCTION_URLS }) LOGGER.info(repr(patch_data)) make_request(self.tender_url + '/auction', patch_data, user=self.worker_defaults["TENDERS_API_TOKEN"], request_id=self.request_id, session=self.session)
def upload_audit_file_with_document_service(self, doc_id=None): files = {'file': ('audit_{}.yaml'.format(self.auction_doc_id), yaml_dump(self.audit, default_flow_style=False))} ds_response = make_request(self.worker_defaults["DOCUMENT_SERVICE"]["url"], files=files, method='post', user=self.worker_defaults["DOCUMENT_SERVICE"]["username"], password=self.worker_defaults["DOCUMENT_SERVICE"]["password"], session=self.session_ds, retry_count=3) if doc_id: method = 'put' path = self.tender_url + '/documents/{}'.format(doc_id) else: method = 'post' path = self.tender_url + '/documents' response = make_request(path, data=ds_response, user=self.worker_defaults["TENDERS_API_TOKEN"], method=method, request_id=self.request_id, session=self.session, retry_count=2 ) if response: doc_id = response["data"]['id'] LOGGER.info( "Audit log approved. Document id: {}".format(doc_id), extra={"JOURNAL_REQUEST_ID": self.request_id, "MESSAGE_ID": AUCTION_WORKER_API_AUDIT_LOG_APPROVED} ) return doc_id else: LOGGER.warning( "Audit log not approved.", extra={"JOURNAL_REQUEST_ID": self.request_id, "MESSAGE_ID": AUCTION_WORKER_API_AUDIT_LOG_NOT_APPROVED})
def set_participation_urls(self, external_data): request_id = generate_request_id() patch_data = {"data": {"auctionUrl": self.auction_url, "bids": []}} for bid in external_data["data"]["bids"]: if bid.get('status', 'active') == 'active': participation_url = self.auction_url participation_url += '/login?bidder_id={}&hash={}'.format( bid["id"], calculate_hash(bid["id"], self.hash_secret)) patch_data['data']['bids'].append({ "participationUrl": participation_url, "id": bid["id"] }) else: patch_data['data']['bids'].append({"id": bid["id"]}) LOGGER.info("Set auction and participation urls for tender {}".format( self.source_id), extra={ "JOURNAL_REQUEST_ID": request_id, "MESSAGE_ID": AUCTION_WORKER_SET_AUCTION_URLS }) LOGGER.info(repr(patch_data)) make_request(self.api_url + '/auction', patch_data, user=self.api_token, request_id=request_id, session=self.session)
def post_results_data(self, with_auctions_results=True): patch_data = {'data': {'bids': list(self._auction_data['data']['bids'])}} if with_auctions_results: for bid_index, bid in enumerate(self._auction_data['data']['bids']): if bid.get('status', 'active') == 'active': for lot_index, lot_bid in enumerate(bid['lotValues']): if lot_bid['relatedLot'] == self.lot_id and lot_bid.get( 'status', 'active') == 'active': auction_bid_info = get_latest_bid_for_bidder( self.auction_document["results"], bid["id"]) patch_data['data']['bids'][bid_index]['lotValues'][ lot_index]["value"]["amount"] = auction_bid_info[ "amount"] patch_data['data']['bids'][bid_index]['lotValues'][ lot_index]["date"] = auction_bid_info["time"] break logger.info("Approved data: {}".format(patch_data), extra={ "JOURNAL_REQUEST_ID": self.request_id, "MESSAGE_ID": AUCTION_WORKER_API_APPROVED_DATA }) results = make_request(self.tender_url + '/auction/{}'.format(self.lot_id), data=patch_data, user=self.worker_defaults["TENDERS_API_TOKEN"], method='post', request_id=self.request_id, session=self.session) return results
def _post_results_data(self, external_data, db_document): """ :param auction_data: data from api :param auction_document: data from auction module couchdb :return: response from api where data is posted """ request_id = generate_request_id() result_bids = deepcopy(db_document["results"]) posted_result_data = deepcopy(external_data["data"]["bids"]) for index, bid_info in enumerate(external_data["data"]["bids"]): if bid_info.get('status', 'active') == 'active': auction_bid_info = get_latest_bid_for_bidder( result_bids, bid_info["id"]) posted_result_data[index]["value"][ "amount"] = auction_bid_info["amount"] posted_result_data[index]["date"] = auction_bid_info["time"] data = {'data': {'bids': posted_result_data}} LOGGER.info("Approved data: {}".format(data), extra={ "JOURNAL_REQUEST_ID": request_id, "MESSAGE_ID": AUCTION_WORKER_API_APPROVED_DATA }) return make_request(self.api_url + '/auction', data=data, user=self.api_token, method='post', request_id=request_id, session=self.session)
def __init__(self, config): # Checking API availability health_url = urljoin(config['resource_api_server'], "/api/{resource_api_version}/health") response = make_request(url=health_url.format(**config), method="get", retry_count=5) if not response: raise Exception("API can't be reached") self.api_url = urljoin( config['resource_api_server'], '/api/{0}/{1}/{2}'.format(config['resource_api_version'], config['resource_name'], config['auction_id'])) self.api_token = config["resource_api_token"] self.source_id = config['auction_id'] self.auction_url = config["AUCTIONS_URL"].format( auction_id=self.source_id) self.hash_secret = config["HASH_SECRET"] self.with_document_service = config.get('with_document_service', False) self.session = RequestsSession() if config.get('with_document_service', False): self.ds_credential['username'] = config['DOCUMENT_SERVICE'][ 'username'] self.ds_credential['password'] = config['DOCUMENT_SERVICE'][ 'password'] self.document_service_url = config['DOCUMENT_SERVICE']['url'] # Checking DS availability and setting session_ds attribute request("GET", self.document_service_url, timeout=5) self.session_ds = RequestsSession()
def post_results_data(self, with_auctions_results=True): if with_auctions_results: all_bids = self.auction_document["results"] for index, bid_info in enumerate(self._auction_data["data"]["bids"]): if bid_info.get('status', 'active') == 'active': auction_bid_info = get_latest_bid_for_bidder( all_bids, bid_info["id"]) self._auction_data["data"]["bids"][index]["value"]["amount"] =\ auction_bid_info["amount"] self._auction_data["data"]["bids"][index]["date"] =\ auction_bid_info["time"] data = {'data': {'bids': self._auction_data["data"]['bids']}} LOGGER.info("Approved data: {}".format(data), extra={ "JOURNAL_REQUEST_ID": self.request_id, "MESSAGE_ID": AUCTION_WORKER_API_APPROVED_DATA }) return make_request(self.tender_url + '/auction', data=data, user=self.worker_defaults["resource_api_token"], method='post', request_id=self.request_id, session=self.session)
def _upload_audit_file_with_document_service(self, history_data, doc_id=None): request_id = generate_request_id() files = { 'file': ('audit_{}.yaml'.format(self.source_id), yaml_dump(history_data, default_flow_style=False)) } ds_response = make_request(self.document_service_url, files=files, method='post', user=self.ds_credential["username"], password=self.ds_credential["password"], session=self.session_ds, retry_count=3) if doc_id: method = 'put' path = self.api_url + '/documents/{}'.format(doc_id) else: method = 'post' path = self.api_url + '/documents' response = make_request(path, data=ds_response, user=self.api_token, method=method, request_id=request_id, session=self.session, retry_count=2) if response: doc_id = response["data"]['id'] LOGGER.info("Audit log approved. Document id: {}".format(doc_id), extra={ "JOURNAL_REQUEST_ID": request_id, "MESSAGE_ID": AUCTION_WORKER_API_AUDIT_LOG_APPROVED }) return doc_id else: LOGGER.warning("Audit log not approved.", extra={ "JOURNAL_REQUEST_ID": request_id, "MESSAGE_ID": AUCTION_WORKER_API_AUDIT_LOG_NOT_APPROVED })
def prepare_auction_and_participation_urls(self): auction_url = self.worker_defaults['AUCTIONS_URL'].format( auction_id=self.auction_doc_id) patch_data = { 'data': { 'lots': list(self._auction_data['data']['lots']), 'bids': list(self._auction_data['data']['bids']) } } for index, lot in enumerate(self._auction_data['data']['lots']): if lot['id'] == self.lot_id: patch_data['data']['lots'][index]['auctionUrl'] = auction_url break for bid_index, bid in enumerate(self._auction_data['data']['bids']): if bid.get('status', 'active') == 'active': for lot_index, lot_bid in enumerate(bid['lotValues']): if lot_bid['relatedLot'] == self.lot_id and lot_bid.get( 'status', 'active') == 'active': participation_url = self.worker_defaults[ 'AUCTIONS_URL'].format(auction_id=self.auction_doc_id) participation_url += '/login?bidder_id={}&hash={}'.format( bid['id'], calculate_hash(bid['id'], self.worker_defaults['HASH_SECRET'])) patch_data['data']['bids'][bid_index]['lotValues'][ lot_index]['participationUrl'] = participation_url break logger.info("Set auction and participation urls for tender {}".format( self.tender_id), extra={ "JOURNAL_REQUEST_ID": self.request_id, "MESSAGE_ID": AUCTION_WORKER_SET_AUCTION_URLS }) logger.info(repr(patch_data)) make_request(self.tender_url + '/auction/{}'.format(self.lot_id), patch_data, user=self.worker_defaults["TENDERS_API_TOKEN"], request_id=self.request_id, session=self.session) return patch_data
def post_results_data(auction, with_auctions_results=True): """TODO: make me work""" def generate_value(bid_info): auction_bid = bid_info['amount'] if str(bid_info['amount']) != '-1'\ else None value = auction.auction_document['value'] return { "amount": str(auction_bid), "currency": value.get('currency'), "valueAddedTaxIncluded": value.get('valueAddedTaxIncluded') } info = auction.get_auction_info() bids = info['data'].get("bids", []) if with_auctions_results: for bid_info in bids: if bid_info.get('status', 'active') == 'active': bidder_id = bid_info.get('bidder_id', bid_info.get('id', '')) if bidder_id: try: bid = get_latest_bid_for_bidder( auction.auction_document['results'], bidder_id ) except IndexError: bid = '' if bid: bid_info['value'] = generate_value(bid) bid_info['date'] = bid['time'] data = {'data': {'bids': bids}} LOGGER.info( "Approved data: {}".format(data), extra={"JOURNAL_REQUEST_ID": auction.request_id, "MESSAGE_ID": AUCTION_WORKER_API_APPROVED_DATA} ) if not auction.debug: return make_request( auction.tender_url + '/auction', data=data, user=auction.worker_defaults["resource_api_token"], method='post', request_id=auction.request_id, session=auction.session ) LOGGER.info( "Making request to api with params {}".format( dict(method="post", url=auction.tender_url + '/auction', data=data))) return data
def post_results_data(auction, with_auctions_results=True): """TODO: make me work""" if with_auctions_results: for index, bid_info in enumerate( auction._auction_data["data"]["bids"]): if bid_info.get('status', 'active') == 'active': bidder_id = bid_info.get('bidder_id', bid_info.get('id', '')) if bidder_id: try: bid = get_latest_bid_for_bidder( auction.auction_document['results'], bidder_id) except IndexError: bid = '' if bid: auction._auction_data["data"]["bids"][index]["value"][ "amount"] = bid['amount'] auction._auction_data["data"]["bids"][index][ "date"] = bid['time'] data = {'data': {'bids': auction._auction_data["data"]['bids']}} LOGGER.info("Approved data: {}".format(data), extra={ "JOURNAL_REQUEST_ID": auction.request_id, "MESSAGE_ID": AUCTION_WORKER_API_APPROVED_DATA }) if not auction.debug: return make_request(auction.tender_url + '/auction', data=data, user=auction.worker_defaults["resource_api_token"], method='post', request_id=auction.request_id, session=auction.session) else: LOGGER.info("Making request to api with params {}".format( dict(method="post", url=auction.tender_url + '/auction', data=data))) return data