Пример #1
0
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)
Пример #2
0
    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})
Пример #3
0
 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
Пример #5
0
    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)
Пример #6
0
    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)
Пример #8
0
    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
Пример #11
0
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