Exemplo n.º 1
0
    def get_auction_info(self, prepare=False):
        if not self.debug:
            if prepare:
                self._auction_data = get_tender_data(
                    self.tender_url,
                    request_id=self.request_id,
                    session=self.session
                )
            else:
                self._auction_data = {'data': {}}

            auction_data = get_tender_data(
                self.tender_url + '/auction',
                user=self.worker_defaults["resource_api_token"],
                request_id=self.request_id,
                session=self.session
            )

            if auction_data:
                self._auction_data['data'].update(auction_data['data'])
                self.startDate = self.convert_datetime(
                    self._auction_data['data']['auctionPeriod']['startDate']
                )
                del auction_data
            else:
                self.get_auction_document()
                if self.auction_document:
                    self.auction_document["current_stage"] = -100
                    self.save_auction_document()
                    LOGGER.warning("Cancel auction: {}".format(
                        self.auction_doc_id
                    ), extra={"JOURNAL_REQUEST_ID": self.request_id,
                              "MESSAGE_ID": AUCTION_WORKER_API_AUCTION_CANCEL})
                else:
                    LOGGER.error("Auction {} not exists".format(
                        self.auction_doc_id
                    ), extra={
                        "JOURNAL_REQUEST_ID": self.request_id,
                        "MESSAGE_ID": AUCTION_WORKER_API_AUCTION_NOT_EXIST
                    })
                    self._end_auction_event.set()
                    sys.exit(1)

        self.startDate = self.convert_datetime(
            self._auction_data['data'].get('auctionPeriod', {}).get('startDate', '')
        )
        self.bidders_data = [
            {
                'id': bid['id'],
                'date': bid['date'],
                'owner': bid.get('owner', '')
            }
            for bid in self._auction_data['data'].get('bids', [])
            if bid.get('status', 'active') == 'active'
        ]
        for index, bid in enumerate(self.bidders_data):
            if bid['id'] not in self.mapping:
                self.mapping[self.bidders_data[index]['id']]\
                    = len(self.mapping.keys()) + 1
        return self._auction_data
Exemplo n.º 2
0
    def get_auction_info(self, prepare=False):
        # TODO: get bid info on login
        if not self.debug:
            if prepare:
                self._auction_data = get_tender_data(
                    self.tender_url,
                    request_id=self.request_id,
                    session=self.session)
            else:
                self._auction_data = {'data': {}}

            auction_data = get_tender_data(
                self.tender_url + '/auction',
                user=self.worker_defaults["resource_api_token"],
                request_id=self.request_id,
                session=self.session)

            if auction_data:
                self._auction_data['data'].update(auction_data['data'])
                self.startDate = self.convert_datetime(
                    self._auction_data['data']['auctionPeriod']['startDate'])
                del auction_data
            else:
                self.get_auction_document()
                if self.auction_document:
                    self.auction_document["current_stage"] = -100
                    self.save_auction_document()
                    LOGGER.warning("Cancel auction: {}".format(
                        self.auction_doc_id),
                                   extra={
                                       "JOURNAL_REQUEST_ID":
                                       self.request_id,
                                       "MESSAGE_ID":
                                       AUCTION_WORKER_API_AUCTION_CANCEL
                                   })
                else:
                    LOGGER.error("Auction {} not exists".format(
                        self.auction_doc_id),
                                 extra={
                                     "JOURNAL_REQUEST_ID":
                                     self.request_id,
                                     "MESSAGE_ID":
                                     AUCTION_WORKER_API_AUCTION_NOT_EXIST
                                 })
                    self._end_auction_event.set()
                    sys.exit(1)

        self.startDate = self.convert_datetime(
            self._auction_data['data']['auctionPeriod']['startDate'])
def announce_results_data(auction, results=None):
    """TODO: make me work"""
    if not results:
        results = get_tender_data(
            auction.tender_url,
            user=auction.worker_defaults["resource_api_token"],
            request_id=auction.request_id,
            session=auction.session
        )
    bids_information = dict([
        (bid["id"], bid.get("tenderers"))
        for bid in results["data"].get("bids", [])
        if bid.get("status", "active") == "active"
    ])
    for field in ['results', 'stages']:
        for index, stage in enumerate(auction.auction_document[field]):
            if 'bidder_id' in stage and stage['bidder_id'] in bids_information:
                auction.auction_document[field][index].update({
                    "label": {
                        'uk': bids_information[stage['bidder_id']][0]["name"],
                        'en': bids_information[stage['bidder_id']][0]["name"],
                        'ru': bids_information[stage['bidder_id']][0]["name"],
                    }
                })
    return bids_information
def announce_results_data(self, results=None):
    if not results:
        results = get_tender_data(
            self.tender_url,
            user=self.worker_defaults["TENDERS_API_TOKEN"],
            request_id=self.request_id,
            session=self.session)

    bidders_data = {}

    for bid_index, bid in enumerate(results['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':
                    bid_data = {
                        'id': bid['id'],
                        'name': bid['tenderers'][0]['name']
                    }
                    bidders_data[bid['id']] = bid_data

    for section in ['initial_bids', 'stages', 'results']:
        for index, stage in enumerate(self.auction_document[section]):
            if 'bidder_id' in stage and stage['bidder_id'] in bidders_data:
                self.auction_document[section][index]["label"][
                    "uk"] = bidders_data[stage['bidder_id']]["name"]
                self.auction_document[section][index]["label"][
                    "ru"] = bidders_data[stage['bidder_id']]["name"]
                self.auction_document[section][index]["label"][
                    "en"] = bidders_data[stage['bidder_id']]["name"]
    self.auction_document["current_stage"] = (
        len(self.auction_document["stages"]) - 1)

    return None
Exemplo n.º 5
0
    def get_data(self, public=True, with_credentials=False):
        request_id = generate_request_id()

        if not public:
            auction_data = get_tender_data(self.api_url + '/auction',
                                           user=self.api_token,
                                           request_id=request_id,
                                           session=self.session)
            return auction_data
        else:
            credentials = self.api_token if with_credentials else ''
            auction_data = get_tender_data(self.api_url,
                                           request_id=request_id,
                                           user=credentials,
                                           session=self.session)

        return auction_data
Exemplo n.º 6
0
    def prepare_auction(self):
        self.generate_request_id()
        auction_data = get_tender_data(
            self.tender_url,
            request_id=self.request_id,
            session=self.session
        )
        public_document = self.get_auction_document()

        self.auction_document = {}
        if public_document:
            self.auction_document = {"_rev": public_document["_rev"]}

        if auction_data:
            LOGGER.info("Prepare insider auction id={}".format(self.auction_doc_id))
            self.auction_document = utils.prepare_auction_data(auction_data)
            self.save_auction_document()
        else:
            LOGGER.warn("Auction {} not exists".format(self.auction_doc_id))
Exemplo n.º 7
0
def announce_results_data(self, results=None):
    if not results:
        results = get_tender_data(
            self.tender_url,
            user=self.worker_defaults["TENDERS_API_TOKEN"],
            request_id=self.request_id,
            session=self.session)
    bids_information = dict([(bid["id"], bid["tenderers"])
                             for bid in results["data"]["bids"]
                             if bid.get("status", "active") == "active"])
    for section in ['initial_bids', 'stages', 'results']:
        for index, stage in enumerate(self.auction_document[section]):
            if 'bidder_id' in stage and stage['bidder_id'] in bids_information:
                self.auction_document[section][index]["label"][
                    "uk"] = bids_information[stage['bidder_id']][0]["name"]
                self.auction_document[section][index]["label"][
                    "ru"] = bids_information[stage['bidder_id']][0]["name"]
                self.auction_document[section][index]["label"][
                    "en"] = bids_information[stage['bidder_id']][0]["name"]
    self.auction_document["current_stage"] = (
        len(self.auction_document["stages"]) - 1)
    return bids_information
Exemplo n.º 8
0
def get_auction_info(self, prepare=False):
    if not self.debug:
        if prepare:
            self._auction_data = get_tender_data(self.tender_url,
                                                 request_id=self.request_id,
                                                 session=self.session)
        else:
            self._auction_data = {'data': {}}
        auction_data = get_tender_data(
            self.tender_url + '/auction',
            user=self.worker_defaults["TENDERS_API_TOKEN"],
            request_id=self.request_id,
            session=self.session)
        if auction_data:
            self._auction_data['data'].update(auction_data['data'])
            self.startDate = self.convert_datetime(
                self._auction_data['data']['auctionPeriod']['startDate'])
            del auction_data
        else:
            self.get_auction_document()
            if self.auction_document:
                self.auction_document["current_stage"] = -100
                self.save_auction_document()
                LOGGER.warning(
                    "Cancel auction: {}".format(self.auction_doc_id),
                    extra={
                        "JOURNAL_REQUEST_ID": self.request_id,
                        "MESSAGE_ID": AUCTION_WORKER_API_AUCTION_CANCEL
                    })
            else:
                LOGGER.error(
                    "Auction {} not exists".format(self.auction_doc_id),
                    extra={
                        "JOURNAL_REQUEST_ID": self.request_id,
                        "MESSAGE_ID": AUCTION_WORKER_API_AUCTION_NOT_EXIST
                    })
            self._end_auction_event.set()
            sys.exit(1)
    self.bidders = [
        bid["id"] for bid in self._auction_data["data"]["bids"]
        if bid.get('status', 'active') == 'active'
    ]
    self.bidders_count = len(self.bidders)
    LOGGER.info("Bidders count: {}".format(self.bidders_count),
                extra={
                    "JOURNAL_REQUEST_ID": self.request_id,
                    "MESSAGE_ID": AUCTION_WORKER_SERVICE_NUMBER_OF_BIDS
                })
    self.rounds_stages = []
    for stage in range((self.bidders_count + 1) * ROUNDS + 1):
        if (stage + self.bidders_count) % (self.bidders_count + 1) == 0:
            self.rounds_stages.append(stage)
    self.mapping = {}
    self.startDate = self.convert_datetime(
        self._auction_data['data']['auctionPeriod']['startDate'])
    if "features" in self._auction_data["data"]:
        self.features = self._auction_data["data"]["features"]

    if not prepare:
        self.bidders_data = []
        if self.features:
            self.bidders_features = {}
            self.bidders_coeficient = {}
            self.features = self._auction_data["data"]["features"]
            for bid in self._auction_data["data"]["bids"]:
                if bid.get('status', 'active') == 'active':
                    self.bidders_features[bid["id"]] = bid["parameters"]
                    self.bidders_coeficient[bid["id"]] = calculate_coeficient(
                        self.features, bid["parameters"])
        else:
            self.bidders_features = None
            self.features = None

        for bid in self._auction_data['data']['bids']:
            if bid.get('status', 'active') == 'active':
                self.bidders_data.append({
                    'id': bid['id'],
                    'date': bid['date'],
                    'value': bid['value']
                })
                if self.features:
                    self.bidders_features[bid["id"]] = bid["parameters"]
                    self.bidders_coeficient[bid["id"]] = calculate_coeficient(
                        self.features, bid["parameters"])
        self.bidders_count = len(self.bidders_data)

        for index, uid in enumerate(self.bidders_data):
            self.mapping[self.bidders_data[index]['id']] = str(index + 1)
def get_auction_info(self, prepare=False):
    if not self.debug:
        if prepare:
            self._auction_data = get_tender_data(self.tender_url,
                                                 request_id=self.request_id,
                                                 session=self.session)
        else:
            self._auction_data = {'data': {}}
        auction_data = get_tender_data(
            self.tender_url + '/auction',
            user=self.worker_defaults['TENDERS_API_TOKEN'],
            request_id=self.request_id,
            session=self.session)
        if auction_data:
            self._auction_data['data'].update(auction_data['data'])
            del auction_data
        else:
            self.get_auction_document()
            if self.auction_document:
                self.auction_document['current_stage'] = -100
                self.save_auction_document()
                logger.warning(
                    'Cancel auction: {}'.format(self.auction_doc_id),
                    extra={
                        'JOURNAL_REQUEST_ID': self.request_id,
                        'MESSAGE_ID': AUCTION_WORKER_API_AUCTION_CANCEL
                    })
            else:
                logger.error(
                    'Auction {} not exists'.format(self.auction_doc_id),
                    extra={
                        'JOURNAL_REQUEST_ID': self.request_id,
                        'MESSAGE_ID': AUCTION_WORKER_API_AUCTION_NOT_EXIST
                    })
            self._end_auction_event.set()
            sys.exit(1)
    self._lot_data = dict(
        {item['id']: item
         for item in self._auction_data['data']['lots']}[self.lot_id])
    self._lot_data['items'] = [
        item for item in self._auction_data['data'].get('items', [])
        if item.get('relatedLot') == self.lot_id
    ]
    self._lot_data['features'] = [
        item for item in self._auction_data['data'].get('features', [])
        if item['featureOf'] == 'tenderer' \
        or item['featureOf'] == 'lot' and item['relatedItem'] == self.lot_id \
        or item['featureOf'] == 'item' and item['relatedItem'] in [i['id'] for i in self._lot_data['items']]
    ]
    self.startDate = self.convert_datetime(
        self._lot_data['auctionPeriod']['startDate'])
    self.bidders_features = None
    self.features = self._lot_data.get('features', None)
    if not prepare:
        codes = [i['code'] for i in self._lot_data['features']]
        self.bidders_data = []
        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':
                        bid_data = {
                            'id': bid['id'],
                            'date': lot_bid['date'],
                            'value': lot_bid['value']
                        }
                        if 'parameters' in bid:
                            bid_data['parameters'] = [
                                i for i in bid['parameters']
                                if i['code'] in codes
                            ]
                        self.bidders_data.append(bid_data)
        self.bidders_count = len(self.bidders_data)
        logger.info('Bidders count: {}'.format(self.bidders_count),
                    extra={
                        'JOURNAL_REQUEST_ID': self.request_id,
                        'MESSAGE_ID': AUCTION_WORKER_SERVICE_NUMBER_OF_BIDS
                    })
        self.rounds_stages = []
        for stage in range((self.bidders_count + 1) * ROUNDS + 1):
            if (stage + self.bidders_count) % (self.bidders_count + 1) == 0:
                self.rounds_stages.append(stage)
        self.mapping = {}
        if self._lot_data.get('features', None):
            self.bidders_features = {}
            self.bidders_coeficient = {}
            self.features = self._lot_data['features']
            for bid in self.bidders_data:
                self.bidders_features[bid['id']] = bid['parameters']
                self.bidders_coeficient[bid['id']] = calculate_coeficient(
                    self.features, bid['parameters'])
        else:
            self.bidders_features = None
            self.features = None

        for index, uid in enumerate(self.bidders_data):
            self.mapping[self.bidders_data[index]['id']] = str(index + 1)