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