def patch(self):
        """
        Submission edit(partial)
        """
        submission = self.request.context
        old_status = submission.status
        new_status = self.request.validated["data"].get("status", old_status)

        now = get_now()
        if new_status != old_status:
            submission.date = now

        activated = new_status == "active" and old_status != new_status
        if activated:
            submission.datePublished = now
            self.create_qualification()

        apply_patch(self.request,
                    src=self.request.validated["submission_src"],
                    obj_name="submission")

        self.LOGGER.info("Updated submission {}".format(submission.id),
                         extra=context_unpack(
                             self.request, {"MESSAGE_ID": "submission_patch"}))

        return {"data": submission.serialize("view")}
示例#2
0
    def create_agreement_contract(self):
        db = self.request.registry.db
        qualification = self.request.validated["qualification"]
        framework = self.request.validated["framework"]
        agreement_data = get_agreement_by_id(db, framework.agreementID)
        submission_data = get_submission_by_id(db, qualification.submissionID)
        if agreement_data["status"] != "active":
            return

        contract_id = generate_id()
        first_milestone_data = {
            "type": "activation",
            "documents": qualification.documents
        }
        contract_data = {
            "id": contract_id,
            "qualificationID": qualification.id,
            "status": "active",
            "suppliers": submission_data["tenderers"],
            "milestones": [first_milestone_data],
        }
        new_contracts = deepcopy(agreement_data.get("contracts", []))
        new_contracts.append(contract_data)

        apply_patch(self.request,
                    data={"contracts": new_contracts},
                    src=agreement_data,
                    obj_name="agreement")
        self.LOGGER.info(
            "Updated agreement {} with contract {}".format(
                agreement_data["_id"], contract_id),
            extra=context_unpack(self.request,
                                 {"MESSAGE_ID": "qualification_patch"}))
示例#3
0
    def patch(self):
        """
        Qualification edit(partial)
        """
        qualification = self.request.context
        old_status = qualification.status
        new_status = self.request.validated["data"].get("status", old_status)
        changed_status = old_status != new_status
        if changed_status:
            qualification.date = get_now()
        apply_patch(self.request,
                    src=self.request.validated["qualification_src"],
                    obj_name="qualification")

        self.LOGGER.info(
            "Updated qualification {}".format(qualification.id),
            extra=context_unpack(self.request,
                                 {"MESSAGE_ID": "qualification_patch"}))

        if changed_status:
            self.complete_submission()
        if old_status == "pending" and new_status == "active":
            self.ensure_agreement()
            self.create_agreement_contract()

        return {"data": qualification.serialize("view")}
 def patch(self):
     agreement = self.context
     apply_patch(self.request,
                 obj_name="agreement",
                 save=False,
                 src=self.request.validated["agreement_src"])
     if save_agreement(self.request):
         self.LOGGER.info(
             "Updated agreement {}".format(agreement.id),
             extra=context_unpack(self.request,
                                  {"MESSAGE_ID": "agreement_patch"}),
         )
         return {"data": agreement.serialize("view")}
    def test_apply_patch(self, mocked_apply_data_patch, mocked_save_framework):
        request = MagicMock()
        data = deepcopy(test_framework_data)
        request.validated = {"data": data, "framework": data}
        mocked_save_framework.return_value = True

        request.context.serialize.return_value = data
        res = apply_patch(request, "framework")
        self.assertTrue(res)

        mocked_apply_data_patch.return_value = data
        res = apply_patch(request, "framework")
        self.assertEqual(res, data)
    def update_agreement(self):
        framework = self.request.validated["framework"]

        updated_agreement_data = {
            "period": {
                "startDate": self.request.validated["agreement_src"]["period"]["startDate"],
                "endDate": framework.qualificationPeriod.endDate.isoformat()
            },
            "procuringEntity": framework.procuringEntity
        }
        apply_patch(
            self.request, src=self.request.validated["agreement_src"], data=updated_agreement_data, obj_name="agreement"
        )
        self.LOGGER.info("Updated agreement {}".format(self.request.validated["agreement_src"]["id"]),
                         extra=context_unpack(self.request, {"MESSAGE_ID": "framework_patch"}))
    def test_apply_patch(self, mocked_apply_data_patch, mocked_save_agreement):
        request = MagicMock()
        agreement = MagicMock()
        agreement.__class__ = Agreement
        data = deepcopy(TEST_AGREEMENT)
        request.validated = {"data": data, "agreement": agreement}
        mocked_save_agreement.return_value = True

        request.context.serialize.return_value = data
        res = apply_patch(request, "agreement")
        self.assertTrue(res)

        mocked_apply_data_patch.return_value = data
        res = apply_patch(request, "agreement")
        self.assertEqual(res, data)
 def complete_submission(self):
     db = self.request.registry.db
     qualification = self.request.validated["qualification"]
     submission_data = get_submission_by_id(db, qualification.submissionID)
     submission = Submission(submission_data)
     self.request.validated["submission_src"] = submission.serialize(
         "plain")
     submission.status = "complete"
     self.request.validated["submission"] = submission
     apply_patch(self.request,
                 src=self.request.validated["submission_src"],
                 obj_name="submission")
     self.LOGGER.info("Updated submission {}".format(submission.id),
                      extra=context_unpack(
                          self.request, {"MESSAGE_ID": "submission_patch"}))
示例#9
0
    def create_agreement_contract(self):
        qualification = self.request.validated["qualification"]
        framework = self.request.validated["framework"]
        agreement_data = get_agreement_by_id(self.request,
                                             framework.agreementID)
        if not agreement_data:
            raise_operation_error(
                self.request,
                "agreementID must be one of exists agreement",
            )
        submission_data = get_submission_by_id(self.request,
                                               qualification.submissionID)
        if not agreement_data:
            raise_operation_error(
                self.request,
                "submissionID must be one of exists submission",
            )
        if agreement_data["status"] != "active":
            return

        contract_id = generate_id()
        first_milestone_data = {
            "type": "activation",
            "dueDate": framework.get("qualificationPeriod").get("endDate")
        }
        contract_data = {
            "id": contract_id,
            "qualificationID": qualification.id,
            "submissionID": submission_data["_id"],
            "status": "active",
            "suppliers": submission_data["tenderers"],
            "milestones": [first_milestone_data],
        }
        new_contracts = deepcopy(agreement_data.get("contracts", []))
        new_contracts.append(contract_data)

        apply_patch(self.request,
                    data={"contracts": new_contracts},
                    src=agreement_data,
                    obj_name="agreement")
        self.LOGGER.info(
            "Updated agreement {} with contract {}".format(
                agreement_data["_id"], contract_id),
            extra=context_unpack(self.request,
                                 {"MESSAGE_ID": "qualification_patch"}))
示例#10
0
    def patch(self):
        contract = self.request.validated["contract"]

        if apply_patch(self.request, "agreement", src=contract.to_primitive()):
            self.LOGGER.info(
                f"Updated contract {contract.id}",
                extra=context_unpack(self.request,
                                     {"MESSAGE_ID": "contract_patch"}),
            )

        return {"data": contract.serialize("view")}
 def patch(self):
     if self.request.authenticated_role == "chronograph":
         if not check_agreement_status(self.request):
             check_contract_statuses(self.request)
     if apply_patch(self.request,
                    obj_name="agreement",
                    data=self.request.validated["agreement"].to_primitive(),
                    src=self.request.validated["agreement_src"]):
         self.LOGGER.info(
             f"Updated agreement {self.request.validated['agreement'].id}",
             extra=context_unpack(self.request,
                                  {"MESSAGE_ID": "agreement_patch"}))
     return {"data": self.request.context.serialize("view")}
    def patch(self):
        # PATCH now working only for milestone type `activation`
        milestone = self.request.context
        apply_patch(self.request,
                    obj_name="agreement",
                    save=False,
                    src=milestone.to_primitive())

        if milestone.status == "met":
            contract = self.request.validated["contract"]
            contract.status = "terminated"

            for i in contract.milestones:
                if i.status == 'scheduled':
                    i.status = 'notMet'

        if save_agreement(self.request, additional_obj_names=("milestone", )):
            self.LOGGER.info(
                f"Updated milestone {milestone.id}",
                extra=context_unpack(self.request,
                                     {"MESSAGE_ID": "milestone_patch"}),
            )

        return {"data": milestone.serialize("view")}
示例#13
0
 def collection_post(self):
     milestone = self.request.validated["milestone"]
     self.request.context.date = milestone.dateModified
     self.request.context.milestones.append(milestone)
     upload_objects_documents(
         self.request,
         milestone,
         route_kwargs={"milestone_id": milestone.id},
     )
     if apply_patch(
             self.request,
             obj_name="agreement",
             data={"status": MILESTONE_CONTRACT_STATUSES[milestone.type]},
             src=self.request.validated["contract"].to_primitive()):
         self.request.response.status = 201
         return {"data": milestone.serialize("view")}
    def patch(self):
        """Framework Edit (partial)


        .. sourcecode:: http

            PATCH /frameworks/40b48e4878534db1bf228d5928f8f1d9?acc_token=7c6a46e300bb41438ef626232028950b HTTP/1.1
            Host: example.com
            Accept: application/json

            {
              "data": {
                "qualificationPeriod": {
                  "endDate": "2021-02-22T14:33:22.129267+02:00"
                },
                "procuringEntity": {
                  "contactPoint": {
                    "email": "*****@*****.**",
                    "name": "зміна",
                    "telephone": "0440000002"
                  }
                },
                "description": "Назва предмета закупівлі1"
              }
            }

        And here is the response to be expected:

        .. sourcecode:: http

            HTTP/1.0 200 OK
            Content-Type: application/json

            {
              "data": {
                "status": "active",
                "description": "Назва предмета закупівлі1",
                "classification": {
                  "scheme": "ДК021",
                  "description": "Mustard seeds",
                  "id": "03111600-8"
                },
                "title": "updated in draft status",
                "enquiryPeriod": {
                  "startDate": "2020-09-08T01:00:00+03:00",
                  "endDate": "2020-09-23T00:00:00+03:00"
                },
                "qualificationPeriod": {
                  "startDate": "2020-09-23T00:00:00+03:00",
                  "endDate": "2021-02-22T14:33:22.129267+02:00"
                },
                "prettyID": "UA-F-2020-09-08-000001",
                "period": {
                  "startDate": "2020-09-08T01:00:00+03:00",
                  "endDate": "2021-01-23T00:00:00+02:00"
                },
                "frameworkType": "electronicCatalogue",
                "date": "2020-09-08T01:00:00+03:00",
                "additionalClassifications": [
                  {
                    "scheme": "ДК003",
                    "id": "17.21.1",
                    "description": "папір і картон гофровані, паперова й картонна тара"
                  }
                ],
                "next_check": "2020-10-07T00:00:00+03:00",
                "procuringEntity": {
                  "contactPoint": {
                    "email": "*****@*****.**",
                    "telephone": "0440000002",
                    "name": "зміна"
                  },
                  "identifier": {
                    "scheme": "UA-EDR",
                    "id": "40996564",
                    "legalName": "Назва організації(ЦЗО)"
                  },
                  "name": "Повна назва юридичної організації.",
                  "kind": "central",
                  "address": {
                    "countryName": "Україна",
                    "postalCode": "01220",
                    "streetAddress": "вул. Банкова, 11, корпус 1",
                    "region": "м. Київ",
                    "locality": "м. Київ"
                  }
                },
                "owner": "broker",
                "dateModified": "2020-09-08T01:00:00+03:00",
                "id": "40b48e4878534db1bf228d5928f8f1d9"
              }
            }
        """
        framework = self.context
        if self.request.authenticated_role == "chronograph":
            check_status(self.request)
            save_framework(self.request)
        else:
            if self.request.validated["data"].get("status") not in ("draft",
                                                                    "active"):
                raise_operation_error(
                    self.request, "Can't switch to {} status".format(
                        self.request.validated["data"].get("status")))
            if self.request.validated["data"].get("status") == "active":
                model = self.request.context._fields["qualificationPeriod"]
                calculate_framework_periods(self.request, model)
                validate_qualification_period_duration(self.request, model)

            apply_patch(self.request,
                        src=self.request.validated["framework_src"],
                        obj_name="framework")
        self.LOGGER.info("Updated framework {}".format(framework.id),
                         extra=context_unpack(
                             self.request, {"MESSAGE_ID": "framework_patch"}))
        # TODO: Change to chronograph_view for chronograph
        return {"data": framework.serialize(framework.status)}
示例#15
0
 def apply(self, request, **kwargs):
     return apply_patch(request, "agreement", **kwargs)
示例#16
0
 def apply(self, request, **kwargs):
     return apply_patch(request, "agreement", additional_obj_names=("milestone",), **kwargs)
示例#17
0
    def ensure_agreement(self):
        framework_data = self.request.validated["framework_src"]
        agreementID = framework_data.get("agreementID")
        if agreementID:
            agreement = get_agreement_by_id(self.request, agreementID)
            if not agreement:
                raise_operation_error(
                    self.request,
                    "agreementID must be one of exists agreement",
                )
            self.request.validated["agreement"] = agreement = Agreement(
                agreement)
            agreement.__parent__ = self.request.validated[
                "qualification"].__parent__
            self.request.validated["agreement_src"] = agreement.serialize(
                "plain")
        else:
            agreement_id = generate_id()
            now = get_now()
            transfer = generate_id()
            transfer_token = sha512(transfer.encode("utf-8")).hexdigest()
            agreement_data = {
                "id":
                agreement_id,
                "agreementID":
                generate_agreementID(
                    get_now(), self.request.registry.databases.agreements,
                    self.server_id),
                "frameworkID":
                framework_data["id"],
                "agreementType":
                framework_data["frameworkType"],
                "status":
                "active",
                "period": {
                    "startDate":
                    now,
                    "endDate":
                    framework_data.get("qualificationPeriod").get("endDate")
                },
                "procuringEntity":
                framework_data.get("procuringEntity"),
                "classification":
                framework_data.get("classification"),
                "additionalClassifications":
                framework_data.get("additionalClassifications"),
                "contracts": [],
                "owner":
                framework_data["owner"],
                "owner_token":
                framework_data["owner_token"],
                "mode":
                framework_data.get("mode"),
                "dateModified":
                now,
                "date":
                now,
                "transfer_token":
                transfer_token,
                "frameworkDetails":
                framework_data.get("frameworkDetails"),
            }
            agreement = Agreement(agreement_data)

            self.request.validated["agreement_src"] = {}
            self.request.validated["agreement"] = agreement
            if save_agreement(self.request):
                self.LOGGER.info(
                    "Created agreement {}".format(agreement_id),
                    extra=context_unpack(
                        self.request,
                        {"MESSAGE_ID": "agreement_create"},
                        {
                            "agreement_id": agreement_id,
                            "agreement_mode": agreement.mode
                        },
                    ),
                )

                framework_data_updated = {"agreementID": agreement_id}
                apply_patch(self.request,
                            data=framework_data_updated,
                            src=self.request.validated["framework_src"],
                            obj_name="framework")
                self.LOGGER.info(
                    "Updated framework {} with agreementID".format(
                        framework_data["id"]),
                    extra=context_unpack(
                        self.request, {"MESSAGE_ID": "qualification_patch"}))
示例#18
0
 def apply(self, request, **kwargs):
     return apply_patch(request, self.context_short_name, **kwargs)