def post(self): """Report auction results for lot. """ apply_patch(self.request, save=False, src=self.request.validated['auction_src']) auction = self.request.validated['auction'] if all([ i.auctionPeriod and i.auctionPeriod.endDate for i in auction.lots if i.numberOfBids > 1 and i.status == 'active' ]): cleanup_bids_for_cancelled_lots(auction) invalidate_bids_under_threshold(auction) if any([i.status == 'active' for i in auction.bids]): self.request.content_configurator.start_awarding() else: auction.status = 'unsuccessful' if save_auction(self.request): self.LOGGER.info('Report auction results', extra=context_unpack( self.request, {'MESSAGE_ID': 'auction_lot_auction_post'})) return { 'data': self.request.validated['auction'].serialize( self.request.validated['auction'].status) }
def collection_post(self): apply_patch(self.request, save=False, src=self.request.validated['auction_src']) auction = self.request.validated['auction'] invalidate_bids_under_threshold(auction) if any([i.status == 'active' for i in auction.bids]): self.request.content_configurator.start_awarding() else: auction.status = 'unsuccessful' if save_auction(self.request): self.LOGGER.info( 'Report auction results', extra=context_unpack(self.request, {'MESSAGE_ID': 'auction_auction_post'})) return { 'data': self.request.validated['auction'].serialize( self.request.validated['auction'].status) }
def from0to1(registry): class Request(object): def __init__(self, registry): self.registry = registry results = registry.db.iterview('auctions/all', 2**10, include_docs=True) request = Request(registry) root = Root(request) docs = [] for i in results: auction = i.doc if auction['procurementMethodType'] not in ['dgfOtherAssets', 'dgfFinancialAssets'] \ or auction['status'] not in ['active.qualification', 'active.awarded'] \ or 'awards' not in auction: continue now = get_now().isoformat() awards = auction["awards"] unique_awards = len(set([a['bid_id'] for a in awards])) if unique_awards > 2: switch_auction_to_unsuccessful(auction) else: invalidate_bids_under_threshold(auction) if all(bid['status'] == 'invalid' for bid in auction['bids']): switch_auction_to_unsuccessful(auction) if auction['status'] != 'unsuccessful': award = [ a for a in auction["awards"] if a['status'] in ['active', 'pending'] ][0] award_create_date = award['complaintPeriod']['startDate'] periods = { 'verificationPeriod': { 'startDate': award_create_date, 'endDate': award_create_date }, 'paymentPeriod': { 'startDate': award_create_date, 'endDate': calculate_business_date(parse_date(award_create_date, TZ), AWARD_PAYMENT_TIME, auction, True).isoformat() }, 'signingPeriod': { 'startDate': award_create_date, 'endDate': calculate_business_date(parse_date(award_create_date, TZ), CONTRACT_SIGNING_TIME, auction, True).isoformat() } } award.update(periods) if award['status'] == 'pending': award['status'] = 'pending.payment' elif award['status'] == 'active': award['verificationPeriod']['endDate'] = award[ 'paymentPeriod']['endDate'] = now if unique_awards == 1: bid = chef(auction['bids'], auction.get('features'), [], True)[1] award = { 'id': uuid4().hex, 'bid_id': bid['id'], 'status': 'pending.waiting', 'date': awards[0]['date'], 'value': bid['value'], 'suppliers': bid['tenderers'], 'complaintPeriod': { 'startDate': awards[0]['date'] } } if bid['status'] == 'invalid': award['status'] == 'unsuccessful' award['complaintPeriod']['endDate'] = now awards.append(award) model = registry.auction_procurementMethodTypes.get( auction['procurementMethodType']) if model: try: auction = model(auction) auction.__parent__ = root auction = auction.to_primitive() except: LOGGER.error( "Failed migration of auction {} to schema 1.".format( auction.id), extra={ 'MESSAGE_ID': 'migrate_data_failed', 'AUCTION_ID': auction.id }) else: auction['dateModified'] = get_now().isoformat() docs.append(auction) if len(docs) >= 2**7: registry.db.update(docs) docs = [] if docs: registry.db.update(docs)
def collection_post(self): """Report auction results. Report auction results ---------------------- Example request to report auction results: .. sourcecode:: http POST /auctions/4879d3f8ee2443169b5fbbc9f89fa607/auction HTTP/1.1 Host: example.com Accept: application/json { "data": { "dateModified": "2014-10-27T08:06:58.158Z", "bids": [ { "value": { "amount": 400, "currency": "UAH" } }, { "value": { "amount": 385, "currency": "UAH" } } ] } } This is what one should expect in response: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "data": { "dateModified": "2014-10-27T08:06:58.158Z", "bids": [ { "value": { "amount": 400, "currency": "UAH", "valueAddedTaxIncluded": true } }, { "value": { "amount": 385, "currency": "UAH", "valueAddedTaxIncluded": true } } ], "minimalStep":{ "amount": 35, "currency": "UAH" }, "tenderPeriod":{ "startDate": "2014-11-04T08:00:00" } } } """ apply_patch(self.request, save=False, src=self.request.validated['auction_src']) auction = self.request.validated['auction'] invalidate_bids_under_threshold(auction) if any([i.status == 'active' for i in auction.bids]): self.request.content_configurator.start_awarding() else: auction.status = 'unsuccessful' if save_auction(self.request): self.LOGGER.info( 'Report auction results', extra=context_unpack(self.request, {'MESSAGE_ID': 'auction_auction_post'})) return { 'data': self.request.validated['auction'].serialize( self.request.validated['auction'].status) }