def collection_post(self): """Post a contract for award """ tender = self.request.validated['tender'] if tender.status not in ['active.awarded', 'complete']: self.request.errors.add( 'body', 'data', 'Can\'t add contract in current ({}) tender status'.format( tender.status)) self.request.errors.status = 403 return contract_data = self.request.validated['data'] contract = Contract(contract_data) contract.awardID = self.request.validated['award_id'] self.request.validated['award'].contracts.append(contract) if save_tender(self.request): update_journal_handler_params({'contract_id': contract.id}) LOGGER.info('Created tender award contract {}'.format(contract.id), extra={'MESSAGE_ID': 'tender_award_contract_create'}) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url( 'Tender Award Contracts', tender_id=tender.id, award_id=self.request.validated['award_id'], contract_id=contract['id']) return {'data': contract.serialize()}
def collection_post(self): """Tender Award Complaint Document Upload """ if self.request.validated["tender_status"] not in ["active.qualification", "active.awarded"]: self.request.errors.add( "body", "data", "Can't add document in current ({}) tender status".format(self.request.validated["tender_status"]), ) self.request.errors.status = 403 return document = upload_file(self.request) self.request.validated["complaint"].documents.append(document) if save_tender(self.request): update_journal_handler_params({"document_id": document.id}) LOGGER.info( "Created tender award complaint document {}".format(document.id), extra={"MESSAGE_ID": "tender_award_complaint_document_create"}, ) self.request.response.status = 201 document_route = self.request.matched_route.name.replace("collection_", "") self.request.response.headers["Location"] = self.request.current_route_url( _route_name=document_route, document_id=document.id, _query={} ) return {"data": document.serialize("view")}
def collection_post(self): """Tender Document Upload""" if self.request.authenticated_role != 'auction' and self.request.validated['tender_status'] != 'active.enquiries' or \ self.request.authenticated_role == 'auction' and self.request.validated['tender_status'] not in ['active.auction', 'active.qualification']: self.request.errors.add( 'body', 'data', 'Can\'t add document in current ({}) tender status'.format( self.request.validated['tender_status'])) self.request.errors.status = 403 return document = upload_file(self.request) self.request.validated['tender'].documents.append(document) if save_tender(self.request): update_journal_handler_params({'document_id': document.id}) LOGGER.info('Created tender document {}'.format(document.id), extra={'MESSAGE_ID': 'tender_document_create'}) self.request.response.status = 201 document_route = self.request.matched_route.name.replace( "collection_", "") self.request.response.headers[ 'Location'] = self.request.current_route_url( _route_name=document_route, document_id=document.id, _query={}) return {'data': document.serialize("view")}
def validate_file_upload(request): update_journal_handler_params({'document_id': '__new__'}) if 'file' not in request.POST or not hasattr(request.POST['file'], 'filename'): request.errors.add('body', 'file', 'Not Found') request.errors.status = 404 else: request.validated['file'] = request.POST['file']
def collection_post(self): """Post a complaint for award """ tender = self.request.validated['tender'] if tender.status not in ['active.qualification', 'active.awarded']: self.request.errors.add( 'body', 'data', 'Can\'t add complaint in current ({}) tender status'.format( tender.status)) self.request.errors.status = 403 return if self.request.context.complaintPeriod and \ (self.request.context.complaintPeriod.startDate and self.request.context.complaintPeriod.startDate > get_now() or self.request.context.complaintPeriod.endDate and self.request.context.complaintPeriod.endDate < get_now()): self.request.errors.add( 'body', 'data', 'Can add complaint only in complaintPeriod') self.request.errors.status = 403 return complaint_data = self.request.validated['data'] complaint = Complaint(complaint_data) self.request.context.complaints.append(complaint) if save_tender(self.request): update_journal_handler_params({'complaint_id': complaint.id}) LOGGER.info('Created tender award complaint {}'.format( complaint.id), extra={'MESSAGE_ID': 'tender_award_complaint_create'}) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url( 'Tender Award Complaints', tender_id=tender.id, award_id=self.request.validated['award_id'], complaint_id=complaint['id']) return {'data': complaint.serialize("view")}
def validate_file_upload(request): update_journal_handler_params({'document_id': '__new__'}) if 'file' not in request.POST or not hasattr(request.POST['file'], 'filename'): request.errors.add('body', 'file', 'Not Found') request.errors.status = 404 else: request.validated['file'] = request.POST['file']
def collection_post(self): """Tender Award Document Upload """ if self.request.validated['tender_status'] != 'active.qualification': self.request.errors.add('body', 'data', 'Can\'t add document in current ({}) tender status'.format(self.request.validated['tender_status'])) self.request.errors.status = 403 return document = upload_file(self.request) self.request.validated['award'].documents.append(document) if save_tender(self.request): update_journal_handler_params({'document_id': document.id}) LOGGER.info('Created tender award document {}'.format(document.id), extra={'MESSAGE_ID': 'tender_award_document_create'}) self.request.response.status = 201 document_route = self.request.matched_route.name.replace("collection_", "") self.request.response.headers['Location'] = self.request.current_route_url(_route_name=document_route, document_id=document.id, _query={}) return {'data': document.serialize("view")}
def collection_post(self): """Post a question """ tender = self.request.validated['tender'] if tender.status != 'active.enquiries' or get_now() < tender.enquiryPeriod.startDate or get_now() > tender.enquiryPeriod.endDate: self.request.errors.add('body', 'data', 'Can add question only in enquiryPeriod') self.request.errors.status = 403 return question_data = self.request.validated['data'] question = Question(question_data) tender.questions.append(question) if save_tender(self.request): update_journal_handler_params({'question_id': question.id}) LOGGER.info('Created tender question {}'.format(question.id), extra={'MESSAGE_ID': 'tender_question_create'}) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url('Tender Questions', tender_id=tender.id, question_id=question.id) return {'data': question.serialize("view")}
def collection_post(self): """Post a contract for award """ tender = self.request.validated['tender'] if tender.status not in ['active.awarded', 'complete']: self.request.errors.add('body', 'data', 'Can\'t add contract in current ({}) tender status'.format(tender.status)) self.request.errors.status = 403 return contract_data = self.request.validated['data'] contract = Contract(contract_data) contract.awardID = self.request.validated['award_id'] self.request.validated['award'].contracts.append(contract) if save_tender(self.request): update_journal_handler_params({'contract_id': contract.id}) LOGGER.info('Created tender award contract {}'.format(contract.id), extra={'MESSAGE_ID': 'tender_award_contract_create'}) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url('Tender Award Contracts', tender_id=tender.id, award_id=self.request.validated['award_id'], contract_id=contract['id']) return {'data': contract.serialize()}
def collection_post(self): """Post a cancellation """ tender = self.request.validated['tender'] if tender.status in ['complete', 'cancelled', 'unsuccessful']: self.request.errors.add('body', 'data', 'Can\'t add cancellation in current ({}) tender status'.format(tender.status)) self.request.errors.status = 403 return cancellation_data = self.request.validated['data'] cancellation = Cancellation(cancellation_data) if cancellation.status == 'active': tender.status = 'cancelled' tender.cancellations.append(cancellation) if save_tender(self.request): update_journal_handler_params({'cancellation_id': cancellation.id}) LOGGER.info('Created tender cancellation {}'.format(cancellation.id), extra={'MESSAGE_ID': 'tender_cancellation_create'}) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url('Tender Cancellations', tender_id=tender.id, cancellation_id=cancellation.id) return {'data': cancellation.serialize("view")}
def collection_post(self): """Tender Bid Document Upload """ if self.request.validated['tender_status'] not in ['active.tendering', 'active.qualification']: self.request.errors.add('body', 'data', 'Can\'t add document in current ({}) tender status'.format(self.request.validated['tender_status'])) self.request.errors.status = 403 return if self.request.validated['tender_status'] == 'active.qualification' and not [i for i in self.request.validated['tender'].awards if i.status == 'pending' and i.bid_id == self.request.validated['bid_id']]: self.request.errors.add('body', 'data', 'Can\'t add document because award of bid is not in pending state') self.request.errors.status = 403 return document = upload_file(self.request) self.request.validated['bid'].documents.append(document) if save_tender(self.request): update_journal_handler_params({'document_id': document.id}) LOGGER.info('Created tender bid document {}'.format(document.id), extra={'MESSAGE_ID': 'tender_bid_document_create'}) self.request.response.status = 201 document_route = self.request.matched_route.name.replace("collection_", "") self.request.response.headers['Location'] = self.request.current_route_url(_route_name=document_route, document_id=document.id, _query={}) return {'data': document.serialize("view")}
def collection_post(self): """Post a complaint """ tender = self.request.validated["tender"] if tender.status not in ["active.enquiries", "active.tendering"]: self.request.errors.add( "body", "data", "Can't add complaint in current ({}) tender status".format(tender.status) ) self.request.errors.status = 403 return complaint_data = self.request.validated["data"] complaint = Complaint(complaint_data) tender.complaints.append(complaint) if save_tender(self.request): update_journal_handler_params({"complaint_id": complaint.id}) LOGGER.info( "Created tender complaint {}".format(complaint.id), extra={"MESSAGE_ID": "tender_complaint_create"} ) self.request.response.status = 201 self.request.response.headers["Location"] = self.request.route_url( "Tender Complaints", tender_id=tender.id, complaint_id=complaint.id ) return {"data": complaint.serialize("view")}
def collection_post(self): """Post a complaint for award """ tender = self.request.validated["tender"] if tender.status not in ["active.qualification", "active.awarded"]: self.request.errors.add( "body", "data", "Can't add complaint in current ({}) tender status".format(tender.status) ) self.request.errors.status = 403 return if self.request.context.complaintPeriod and ( self.request.context.complaintPeriod.startDate and self.request.context.complaintPeriod.startDate > get_now() or self.request.context.complaintPeriod.endDate and self.request.context.complaintPeriod.endDate < get_now() ): self.request.errors.add("body", "data", "Can add complaint only in complaintPeriod") self.request.errors.status = 403 return complaint_data = self.request.validated["data"] complaint = Complaint(complaint_data) self.request.context.complaints.append(complaint) if save_tender(self.request): update_journal_handler_params({"complaint_id": complaint.id}) LOGGER.info( "Created tender award complaint {}".format(complaint.id), extra={"MESSAGE_ID": "tender_award_complaint_create"}, ) self.request.response.status = 201 self.request.response.headers["Location"] = self.request.route_url( "Tender Award Complaints", tender_id=tender.id, award_id=self.request.validated["award_id"], complaint_id=complaint["id"], ) return {"data": complaint.serialize("view")}
def collection_post(self): """Post a complaint """ tender = self.request.validated['tender'] if tender.status not in ['active.enquiries', 'active.tendering']: self.request.errors.add( 'body', 'data', 'Can\'t add complaint in current ({}) tender status'.format( tender.status)) self.request.errors.status = 403 return complaint_data = self.request.validated['data'] complaint = Complaint(complaint_data) tender.complaints.append(complaint) if save_tender(self.request): update_journal_handler_params({'complaint_id': complaint.id}) LOGGER.info('Created tender complaint {}'.format(complaint.id), extra={'MESSAGE_ID': 'tender_complaint_create'}) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url( 'Tender Complaints', tender_id=tender.id, complaint_id=complaint.id) return {'data': complaint.serialize("view")}
def collection_post(self): """Tender Award Contract Document Upload """ if self.request.validated['tender_status'] not in [ 'active.awarded', 'complete' ]: self.request.errors.add( 'body', 'data', 'Can\'t add document in current ({}) tender status'.format( self.request.validated['tender_status'])) self.request.errors.status = 403 return contract = self.request.validated['contract'] if contract.status not in ['pending', 'active']: self.request.errors.add( 'body', 'data', 'Can\'t add document in current contract status') self.request.errors.status = 403 return document = upload_file(self.request) self.request.validated['contract'].documents.append(document) if save_tender(self.request): update_journal_handler_params({'document_id': document.id}) LOGGER.info( 'Created tender award contract document {}'.format( document.id), extra={'MESSAGE_ID': 'tender_award_contract_document_create'}) self.request.response.status = 201 document_route = self.request.matched_route.name.replace( "collection_", "") self.request.response.headers[ 'Location'] = self.request.current_route_url( _route_name=document_route, document_id=document.id, _query={}) return {'data': document.serialize("view")}
def validate_question_data(request): update_journal_handler_params({'question_id': '__new__'}) return validate_data(request, Question)
def validate_contract_data(request): update_journal_handler_params({'contract_id': '__new__'}) return validate_data(request, Contract)
def validate_question_data(request): update_journal_handler_params({'question_id': '__new__'}) return validate_data(request, Question)
def validate_award_data(request): update_journal_handler_params({'award_id': '__new__'}) return validate_data(request, Award)
def validate_bid_data(request): update_journal_handler_params({'bid_id': '__new__'}) return validate_data(request, Bid)
def validate_contract_data(request): update_journal_handler_params({'contract_id': '__new__'}) return validate_data(request, Contract)
def validate_award_data(request): update_journal_handler_params({'award_id': '__new__'}) return validate_data(request, Award)
def collection_post(self): """Accept or reject bidder application Creating new Award ------------------ Example request to create award: .. sourcecode:: http POST /tenders/4879d3f8ee2443169b5fbbc9f89fa607/awards HTTP/1.1 Host: example.com Accept: application/json { "data": { "status": "active", "suppliers": [ { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } } ], "value": { "amount": 489, "currency": "UAH", "valueAddedTaxIncluded": true } } } This is what one should expect in response: .. sourcecode:: http HTTP/1.1 201 Created Content-Type: application/json { "data": { "id": "4879d3f8ee2443169b5fbbc9f89fa607", "date": "2014-10-28T11:44:17.947Z", "status": "active", "suppliers": [ { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } } ], "value": { "amount": 489, "currency": "UAH", "valueAddedTaxIncluded": true } } } """ tender = self.request.validated['tender'] if tender.status != 'active.qualification': self.request.errors.add('body', 'data', 'Can\'t create award in current ({}) tender status'.format(tender.status)) self.request.errors.status = 403 return award_data = self.request.validated['data'] award_data['complaintPeriod'] = {'startDate': get_now().isoformat()} award = Award(award_data) tender.awards.append(award) if save_tender(self.request): update_journal_handler_params({'award_id': award.id}) LOGGER.info('Created tender award {}'.format(award.id), extra={'MESSAGE_ID': 'tender_award_create'}) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url('Tender Awards', tender_id=tender.id, award_id=award['id']) return {'data': award.serialize("view")}
def validate_tender_data(request): update_journal_handler_params({'tender_id': '__new__'}) return validate_data(request, Tender)
def collection_post(self): """Accept or reject bidder application Creating new Award ------------------ Example request to create award: .. sourcecode:: http POST /tenders/4879d3f8ee2443169b5fbbc9f89fa607/awards HTTP/1.1 Host: example.com Accept: application/json { "data": { "status": "active", "suppliers": [ { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } } ], "value": { "amount": 489, "currency": "UAH", "valueAddedTaxIncluded": true } } } This is what one should expect in response: .. sourcecode:: http HTTP/1.1 201 Created Content-Type: application/json { "data": { "id": "4879d3f8ee2443169b5fbbc9f89fa607", "date": "2014-10-28T11:44:17.947Z", "status": "active", "suppliers": [ { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } } ], "value": { "amount": 489, "currency": "UAH", "valueAddedTaxIncluded": true } } } """ tender = self.request.validated["tender"] if tender.status != "active.qualification": self.request.errors.add( "body", "data", "Can't create award in current ({}) tender status".format(tender.status) ) self.request.errors.status = 403 return award_data = self.request.validated["data"] award_data["complaintPeriod"] = {"startDate": get_now().isoformat()} award = Award(award_data) tender.awards.append(award) if save_tender(self.request): update_journal_handler_params({"award_id": award.id}) LOGGER.info("Created tender award {}".format(award.id), extra={"MESSAGE_ID": "tender_award_create"}) self.request.response.status = 201 self.request.response.headers["Location"] = self.request.route_url( "Tender Awards", tender_id=tender.id, award_id=award["id"] ) return {"data": award.serialize("view")}
def collection_post(self): """Registration of new bid proposal Creating new Bid proposal ------------------------- Example request to create bid proposal: .. sourcecode:: http POST /tenders/4879d3f8ee2443169b5fbbc9f89fa607/bids HTTP/1.1 Host: example.com Accept: application/json { "data": { "tenderers": [ { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } } ], "value": { "amount": 489, "currency": "UAH", "valueAddedTaxIncluded": true } } } This is what one should expect in response: .. sourcecode:: http HTTP/1.1 201 Created Content-Type: application/json { "data": { "id": "4879d3f8ee2443169b5fbbc9f89fa607", "status": "registration", "date": "2014-10-28T11:44:17.947Z", "tenderers": [ { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } } ], "value": { "amount": 489, "currency": "UAH", "valueAddedTaxIncluded": true } } } """ # See https://github.com/open-contracting/standard/issues/78#issuecomment-59830415 # for more info upon schema tender = self.request.validated['tender'] if self.request.validated['tender_status'] != 'active.tendering': self.request.errors.add( 'body', 'data', 'Can\'t add bid in current ({}) tender status'.format( self.request.validated['tender_status'])) self.request.errors.status = 403 return bid_data = self.request.validated['data'] bid = Bid(bid_data) set_ownership(bid, self.request) tender.bids.append(bid) if save_tender(self.request): update_journal_handler_params({'bid_id': bid.id}) LOGGER.info('Created tender bid {}'.format(bid.id), extra={'MESSAGE_ID': 'tender_bid_create'}) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url( 'Tender Bids', tender_id=tender.id, bid_id=bid['id']) return { 'data': bid.serialize('view'), 'access': { 'token': bid.owner_token } }
def collection_post(self): """This API request is targeted to creating new Tenders by procuring organizations. Creating new Tender ------------------- Example request to create tender: .. sourcecode:: http POST /tenders HTTP/1.1 Host: example.com Accept: application/json { "data": { "procuringEntity": { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } }, "value": { "amount": 500, "currency": "UAH", "valueAddedTaxIncluded": true }, "itemsToBeProcured": [ { "description": "футляри до державних нагород", "primaryClassification": { "scheme": "CPV", "id": "44617100-9", "description": "Cartons" }, "additionalClassification": [ { "scheme": "ДКПП", "id": "17.21.1", "description": "папір і картон гофровані, паперова й картонна тара" } ], "unitOfMeasure": "item", "quantity": 5 } ], "enquiryPeriod": { "endDate": "2014-10-31T00:00:00" }, "tenderPeriod": { "startDate": "2014-11-03T00:00:00", "endDate": "2014-11-06T10:00:00" }, "awardPeriod": { "endDate": "2014-11-13T00:00:00" }, "deliveryDate": { "endDate": "2014-11-20T00:00:00" }, "minimalStep": { "amount": 35, "currency": "UAH" } } } This is what one should expect in response: .. sourcecode:: http HTTP/1.1 201 Created Location: http://localhost/api/0.1/tenders/64e93250be76435397e8c992ed4214d1 Content-Type: application/json { "data": { "id": "64e93250be76435397e8c992ed4214d1", "tenderID": "UA-64e93250be76435397e8c992ed4214d1", "dateModified": "2014-10-27T08:06:58.158Z", "procuringEntity": { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } }, "value": { "amount": 500, "currency": "UAH", "valueAddedTaxIncluded": true }, "itemsToBeProcured": [ { "description": "футляри до державних нагород", "primaryClassification": { "scheme": "CPV", "id": "44617100-9", "description": "Cartons" }, "additionalClassification": [ { "scheme": "ДКПП", "id": "17.21.1", "description": "папір і картон гофровані, паперова й картонна тара" } ], "unitOfMeasure": "item", "quantity": 5 } ], "enquiryPeriod": { "endDate": "2014-10-31T00:00:00" }, "tenderPeriod": { "startDate": "2014-11-03T00:00:00", "endDate": "2014-11-06T10:00:00" }, "awardPeriod": { "endDate": "2014-11-13T00:00:00" }, "deliveryDate": { "endDate": "2014-11-20T00:00:00" }, "minimalStep": { "amount": 35, "currency": "UAH" } } } """ tender_data = self.request.validated['data'] tender_id = generate_id() tender = Tender(tender_data) tender.id = tender_id if not tender.enquiryPeriod.startDate: tender.enquiryPeriod.startDate = get_now() tender.tenderID = generate_tender_id(tender.enquiryPeriod.startDate, self.db) if not tender.tenderPeriod.startDate: tender.tenderPeriod.startDate = tender.enquiryPeriod.endDate set_ownership(tender, self.request) self.request.validated['tender'] = tender self.request.validated['tender_src'] = {} if save_tender(self.request): update_journal_handler_params({'tender_id': tender_id, 'tenderID': tender.tenderID}) LOGGER.info('Created tender {} ({})'.format(tender_id, tender.tenderID), extra={'MESSAGE_ID': 'tender_create'}) self.request.response.status = 201 self.request.response.headers[ 'Location'] = self.request.route_url('Tender', tender_id=tender_id) return { 'data': tender.serialize(tender.status), 'access': { 'token': tender.owner_token } }
def validate_tender_data(request): update_journal_handler_params({'tender_id': '__new__'}) return validate_data(request, Tender)
def collection_post(self): """Registration of new bid proposal Creating new Bid proposal ------------------------- Example request to create bid proposal: .. sourcecode:: http POST /tenders/4879d3f8ee2443169b5fbbc9f89fa607/bids HTTP/1.1 Host: example.com Accept: application/json { "data": { "tenderers": [ { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } } ], "value": { "amount": 489, "currency": "UAH", "valueAddedTaxIncluded": true } } } This is what one should expect in response: .. sourcecode:: http HTTP/1.1 201 Created Content-Type: application/json { "data": { "id": "4879d3f8ee2443169b5fbbc9f89fa607", "status": "registration", "date": "2014-10-28T11:44:17.947Z", "tenderers": [ { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } } ], "value": { "amount": 489, "currency": "UAH", "valueAddedTaxIncluded": true } } } """ # See https://github.com/open-contracting/standard/issues/78#issuecomment-59830415 # for more info upon schema tender = self.request.validated['tender'] if self.request.validated['tender_status'] != 'active.tendering': self.request.errors.add('body', 'data', 'Can\'t add bid in current ({}) tender status'.format(self.request.validated['tender_status'])) self.request.errors.status = 403 return bid_data = self.request.validated['data'] bid = Bid(bid_data) set_ownership(bid, self.request) tender.bids.append(bid) if save_tender(self.request): update_journal_handler_params({'bid_id': bid.id}) LOGGER.info('Created tender bid {}'.format(bid.id), extra={'MESSAGE_ID': 'tender_bid_create'}) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url('Tender Bids', tender_id=tender.id, bid_id=bid['id']) return { 'data': bid.serialize('view'), 'access': { 'token': bid.owner_token } }
def validate_bid_data(request): update_journal_handler_params({'bid_id': '__new__'}) return validate_data(request, Bid)
def collection_post(self): """This API request is targeted to creating new Tenders by procuring organizations. Creating new Tender ------------------- Example request to create tender: .. sourcecode:: http POST /tenders HTTP/1.1 Host: example.com Accept: application/json { "data": { "procuringEntity": { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } }, "value": { "amount": 500, "currency": "UAH", "valueAddedTaxIncluded": true }, "itemsToBeProcured": [ { "description": "футляри до державних нагород", "primaryClassification": { "scheme": "CPV", "id": "44617100-9", "description": "Cartons" }, "additionalClassification": [ { "scheme": "ДКПП", "id": "17.21.1", "description": "папір і картон гофровані, паперова й картонна тара" } ], "unitOfMeasure": "item", "quantity": 5 } ], "enquiryPeriod": { "endDate": "2014-10-31T00:00:00" }, "tenderPeriod": { "startDate": "2014-11-03T00:00:00", "endDate": "2014-11-06T10:00:00" }, "awardPeriod": { "endDate": "2014-11-13T00:00:00" }, "deliveryDate": { "endDate": "2014-11-20T00:00:00" }, "minimalStep": { "amount": 35, "currency": "UAH" } } } This is what one should expect in response: .. sourcecode:: http HTTP/1.1 201 Created Location: http://localhost/api/0.1/tenders/64e93250be76435397e8c992ed4214d1 Content-Type: application/json { "data": { "id": "64e93250be76435397e8c992ed4214d1", "tenderID": "UA-64e93250be76435397e8c992ed4214d1", "dateModified": "2014-10-27T08:06:58.158Z", "procuringEntity": { "id": { "name": "Державне управління справами", "scheme": "https://ns.openprocurement.org/ua/edrpou", "uid": "00037256", "uri": "http://www.dus.gov.ua/" }, "address": { "countryName": "Україна", "postalCode": "01220", "region": "м. Київ", "locality": "м. Київ", "streetAddress": "вул. Банкова, 11, корпус 1" } }, "value": { "amount": 500, "currency": "UAH", "valueAddedTaxIncluded": true }, "itemsToBeProcured": [ { "description": "футляри до державних нагород", "primaryClassification": { "scheme": "CPV", "id": "44617100-9", "description": "Cartons" }, "additionalClassification": [ { "scheme": "ДКПП", "id": "17.21.1", "description": "папір і картон гофровані, паперова й картонна тара" } ], "unitOfMeasure": "item", "quantity": 5 } ], "enquiryPeriod": { "endDate": "2014-10-31T00:00:00" }, "tenderPeriod": { "startDate": "2014-11-03T00:00:00", "endDate": "2014-11-06T10:00:00" }, "awardPeriod": { "endDate": "2014-11-13T00:00:00" }, "deliveryDate": { "endDate": "2014-11-20T00:00:00" }, "minimalStep": { "amount": 35, "currency": "UAH" } } } """ tender_data = self.request.validated['data'] tender_id = generate_id() tender = Tender(tender_data) tender.id = tender_id if not tender.enquiryPeriod.startDate: tender.enquiryPeriod.startDate = get_now() tender.tenderID = generate_tender_id(tender.enquiryPeriod.startDate, self.db) if not tender.tenderPeriod.startDate: tender.tenderPeriod.startDate = tender.enquiryPeriod.endDate set_ownership(tender, self.request) self.request.validated['tender'] = tender self.request.validated['tender_src'] = {} if save_tender(self.request): update_journal_handler_params({ 'tender_id': tender_id, 'tenderID': tender.tenderID }) LOGGER.info('Created tender {} ({})'.format( tender_id, tender.tenderID), extra={'MESSAGE_ID': 'tender_create'}) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url( 'Tender', tender_id=tender_id) return { 'data': tender.serialize(tender.status), 'access': { 'token': tender.owner_token } }