def post(self): """Report auction results for lot. """ apply_patch(self.request, save=False, src=self.request.validated['tender_src']) if all([i.auctionPeriod and i.auctionPeriod.endDate for i in self.request.validated['tender'].lots if i.status == 'active']): add_next_award(self.request) if save_tender(self.request): self.LOGGER.info('Report auction results', extra=context_unpack(self.request, {'MESSAGE_ID': 'tender_lot_auction_post'})) return {'data': self.request.validated['tender'].serialize(self.request.validated['tender'].status)}
def cancel_lot(self, cancellation=None): if not cancellation: cancellation = self.context tender = self.request.validated['tender'] [setattr(i, 'status', 'cancelled') for i in tender.lots if i.id == cancellation.relatedLot] cancelled_lots = [i.id for i in tender.lots if i.status == 'cancelled'] cancelled_items = [i.id for i in tender.items if i.relatedLot in cancelled_lots] cancelled_features = [ i.code for i in (tender.features or []) if i.featureOf == 'lot' and i.relatedItem in cancelled_lots or i.featureOf == 'item' and i.relatedItem in cancelled_items ] if tender.status in ['active.tendering', 'active.pre-qualification', 'active.pre-qualification.stand-still', 'active.auction']: for bid in tender.bids: if tender.status == "active.tendering": bid.documents = [i for i in bid.documents if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots] bid.financialDocuments = [i for i in bid.financialDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots] bid.eligibilityDocuments = [i for i in bid.eligibilityDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots] bid.qualificationDocuments = [i for i in bid.qualificationDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots] bid.parameters = [i for i in bid.parameters if i.code not in cancelled_features] bid.lotValues = [i for i in bid.lotValues if i.relatedLot not in cancelled_lots] if not bid.lotValues: bid.status = 'invalid' for qualification in tender.qualifications: if qualification.lotID in cancelled_lots: qualification.status = 'cancelled' statuses = set([lot.status for lot in tender.lots]) if statuses == set(['cancelled']): self.cancel_tender() elif not statuses.difference(set(['unsuccessful', 'cancelled'])): tender.status = 'unsuccessful' elif not statuses.difference(set(['complete', 'unsuccessful', 'cancelled'])): tender.status = 'complete' if tender.status == 'active.auction' and all([ i.auctionPeriod and i.auctionPeriod.endDate for i in self.request.validated['tender'].lots if i.status == 'active' ]): add_next_award(self.request)
def cancel_lot(self, cancellation=None): if not cancellation: cancellation = self.context tender = self.request.validated['tender'] [setattr(i, 'status', 'cancelled') for i in tender.lots if i.id == cancellation.relatedLot] cancelled_lots = [i.id for i in tender.lots if i.status == 'cancelled'] cancelled_items = [i.id for i in tender.items if i.relatedLot in cancelled_lots] cancelled_features = [ i.code for i in (tender.features or []) if i.featureOf == 'lot' and i.relatedItem in cancelled_lots or i.featureOf == 'item' and i.relatedItem in cancelled_items ] if tender.status in ['active.tendering', 'active.pre-qualification', 'active.pre-qualification.stand-still', 'active.auction']: for bid in tender.bids: if tender.status == "active.tendering": bid.documents = [i for i in bid.documents if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots] bid.financialDocuments = [i for i in bid.financialDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots] bid.eligibilityDocuments = [i for i in bid.eligibilityDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots] bid.qualificationDocuments = [i for i in bid.qualificationDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots] bid.parameters = [i for i in bid.parameters if i.code not in cancelled_features] bid.lotValues = [i for i in bid.lotValues if i.relatedLot not in cancelled_lots] if not bid.lotValues: bid.status = 'invalid' if tender.status == 'active.tendering' and bid.status in ['pending', 'active'] else 'invalid.pre-qualification' for qualification in tender.qualifications: if qualification.lotID in cancelled_lots: qualification.status = 'cancelled' statuses = set([lot.status for lot in tender.lots]) if statuses == set(['cancelled']): self.cancel_tender() elif not statuses.difference(set(['unsuccessful', 'cancelled'])): tender.status = 'unsuccessful' elif not statuses.difference(set(['complete', 'unsuccessful', 'cancelled'])): tender.status = 'complete' if tender.status == 'active.auction' and all([ i.auctionPeriod and i.auctionPeriod.endDate for i in self.request.validated['tender'].lots if i.status == 'active' ]): add_next_award(self.request)
def collection_post(self): """Report auction results. Report auction results ---------------------- Example request to report auction results: .. sourcecode:: http POST /tenders/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['tender_src']) if all([i.auctionPeriod and i.auctionPeriod.endDate for i in self.request.validated['tender'].lots if i.status == 'active']): add_next_award(self.request) if save_tender(self.request): self.LOGGER.info('Report auction results', extra=context_unpack(self.request, {'MESSAGE_ID': 'tender_auction_post'})) return {'data': self.request.validated['tender'].serialize(self.request.validated['tender'].status)}