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")}
Exemple #3
0
 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")}
Exemple #26
0
    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
                }
            }