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["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 = 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)
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)
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_count = len(self._auction_data["data"]["bids"])
    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.bidders = [bid["id"]
                    for bid in self._auction_data["data"]["bids"]
                    if bid.get('status', 'active') == 'active']
    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)