def __call__(self, request, cancellation): if cancellation.status == "active": validate_absence_of_pending_accepted_satisfied_complaints(request, cancellation) if cancellation.relatedLot: self.cancel_lot(request, cancellation) else: self.cancel_tender(request)
def patch(self): cancellation = self.request.context prev_status = cancellation.status apply_patch(self.request, save=False, src=cancellation.serialize()) new_rules = get_first_revision_date( self.request.tender, default=get_now()) > RELEASE_2020_04_19 if new_rules: if prev_status == "draft" and cancellation.status == "pending": validate_absence_of_pending_accepted_satisfied_complaints( self.request) tender = self.request.validated["tender"] now = get_now() cancellation.complaintPeriod = { "startDate": now.isoformat(), "endDate": calculate_complaint_business_date(now, timedelta(days=10), tender).isoformat() } if cancellation.status == "active" and prev_status != "active": self.cancel_tender_lot_method(self.request, cancellation) if save_tender(self.request): self.LOGGER.info( "Updated tender cancellation {}".format(cancellation.id), extra=context_unpack( self.request, {"MESSAGE_ID": "tender_cancellation_patch"}), ) return {"data": cancellation.serialize("view")}
def collection_post(self): cancellation = self.request.validated["cancellation"] cancellation.date = get_now() if get_first_revision_date(self.request.tender, default=get_now()) > RELEASE_2020_04_19 \ and cancellation.cancellationOf == "tender": cancellation.status = None if cancellation.status == "active": validate_absence_of_pending_accepted_satisfied_complaints( self.request) if cancellation.relatedLot: self.cancel_lot(cancellation) else: self.cancel_tender_method(self.request) self.request.context.cancellations.append(cancellation) if save_tender(self.request): self.LOGGER.info( "Created tender cancellation {}".format(cancellation.id), extra=context_unpack( self.request, {"MESSAGE_ID": "tender_cancellation_create"}, {"cancellation_id": cancellation.id}), ) self.request.response.status = 201 self.request.response.headers["Location"] = self.request.route_url( "{}:Tender Cancellations".format( self.request.validated["tender"].procurementMethodType), tender_id=self.request.validated["tender_id"], cancellation_id=cancellation.id, ) return {"data": cancellation.serialize("view")}
def test_validation_qualification_complaint(complaint_status): request = mock.Mock(validated=dict( tender={ "qualifications": [ { "complaints": [ { "status": complaint_status, } ] } ] }, cancellation={}, )) with mock_release_date(): with mock.patch("openprocurement.tender.core.validation.raise_operation_error") as error_mock: validate_absence_of_pending_accepted_satisfied_complaints(request) if complaint_status in affected_complaint_statuses: error_mock.assert_called_once_with( request, "Can't perform operation for there is a qualification complaint in {} status".format(complaint_status) ) else: error_mock.assert_not_called()
def test_award_lot_cancellation_complaint(complaint_status, cancellation_lot, complaint_lot): request = mock.Mock(validated=dict( tender={ "awards": [ { "complaints": [ { "status": complaint_status, "relatedLot": complaint_lot, } ] } ] }, cancellation={ "relatedLot": cancellation_lot, } )) with mock_release_date(): with mock.patch("openprocurement.tender.core.validation.raise_operation_error") as error_mock: validate_absence_of_pending_accepted_satisfied_complaints(request) error_mock.assert_called_once_with( request, "Can't perform operation for there is an award complaint in {} status".format(complaint_status) )
def __call__(self, request, cancellation): if cancellation.status == "active": from openprocurement.tender.core.validation import ( validate_absence_of_pending_accepted_satisfied_complaints, ) validate_absence_of_pending_accepted_satisfied_complaints( request, cancellation) if cancellation.relatedLot: self.cancel_lot(request, cancellation) else: self.cancel_tender(request)
def test_validation_before_release(complaint_status): request = mock.Mock(validated=dict( tender={ "complaints": [ { "status": complaint_status, } ] }, cancellation={}, )) with mock_release_date(get_now() + timedelta(1)): with mock.patch("openprocurement.tender.core.validation.raise_operation_error") as error_mock: validate_absence_of_pending_accepted_satisfied_complaints(request) error_mock.assert_not_called()
def test_tender_lot_cancellation_complaint_pass(complaint_status): request = mock.Mock(validated=dict( tender={ "complaints": [ { "status": complaint_status, "relatedLot": a_lot, } ] }, cancellation={ "relatedLot": b_lot, } )) with mock_release_date(): with mock.patch("openprocurement.tender.core.validation.raise_operation_error") as error_mock: validate_absence_of_pending_accepted_satisfied_complaints(request) error_mock.assert_not_called()
def patch(self): cancellation = self.request.context prev_status = cancellation.status apply_patch(self.request, save=False, src=cancellation.serialize()) if cancellation.status == "active": if prev_status != "active": validate_absence_of_pending_accepted_satisfied_complaints( self.request) if cancellation.relatedLot: self.cancel_lot(cancellation) else: self.cancel_tender() if save_tender(self.request): self.LOGGER.info( "Updated tender cancellation {}".format(cancellation.id), extra=context_unpack( self.request, {"MESSAGE_ID": "tender_cancellation_patch"}), ) return {"data": cancellation.serialize("view")}