Example #1
0
File: plan.py Project: lttga/op2
    def post(self):
        plan = self.request.validated["plan"]
        tender = self.request.validated["tender"]
        tender.link_plan(plan.id)
        result = super(PlanTendersResource, self).post()
        if not self.request.errors:
            plan.tender_id = tender.id
            save_plan(self.request)

        return result
Example #2
0
File: plan.py Project: lttga/op2
    def patch(self):
        """Plan Edit (partial)

        For example here is how procuring entity can change name:

        .. sourcecode:: http

            PATCH /plans/62179f8f94a246239268750a6eb0e53f HTTP/1.1
            Host: example.com
            Accept: application/json

            {
                "data": {
                    "procuringEntity": {
                        "identifier": {
                            "legalName": "ДП Державне Уравління Справами11"
                        },
                        "name": "ДУС"
                    },
                    "budget": {
                        "project": {
                            "name": "proj_name",
                            "id": "proj_id"
                        },
                        "amount": 10020,
                        "amountNet": 22222,
                        "id": "budget_id",
                        "description": "budget_description"
                    }
                }
            }

        And here is the response to be expected:

        .. sourcecode:: http

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

        """
        plan = self.request.validated["plan"]
        src_data = plan.serialize("plain")
        if apply_patch(self.request,
                       src=self.request.validated["plan_src"],
                       save=False):
            self._check_field_change_events(src_data, plan)
            save_plan(self.request)
            LOGGER.info("Updated plan {}".format(plan.id),
                        extra=context_unpack(self.request,
                                             {"MESSAGE_ID": "plan_patch"}))
        return {"data": plan.serialize("view")}
Example #3
0
    def post(self):
        plan = self.request.validated["plan"]
        data = self.request.validated["ownership_data"]

        location = get_transfer_location(self.request, "Plan", plan_id=plan.id)
        transfer = extract_transfer(self.request, transfer_id=data["id"])

        if transfer.get("usedFor") and transfer.get("usedFor") != location:
            self.request.errors.add("body", "transfer",
                                    "Transfer already used")
            self.request.errors.status = 403
            return

        update_ownership(plan, transfer)
        self.request.validated["plan"] = plan

        transfer.usedFor = location
        self.request.validated["transfer"] = transfer

        if save_transfer(self.request):
            self.LOGGER.info(
                "Updated transfer relation {}".format(transfer.id),
                extra=context_unpack(
                    self.request, {"MESSAGE_ID": "transfer_relation_update"}),
            )

            if save_plan(self.request):
                self.LOGGER.info(
                    "Updated ownership of tender {}".format(plan.id),
                    extra=context_unpack(
                        self.request, {"MESSAGE_ID": "plan_ownership_update"}),
                )

                return {"data": plan.serialize("view")}
Example #4
0
 def put(self):
     """Plan Document Update"""
     document = upload_file(self.request)
     self.request.context.__parent__.documents.append(document)
     if save_plan(self.request):
         self._put_document_log()
         return {"data": document.serialize("view")}
Example #5
0
 def collection_post(self):
     plan = self.request.validated["plan"]
     milestone = self.request.validated["milestone"]
     access = set_ownership(milestone, self.request)
     plan.milestones.append(milestone)
     plan.dateModified = milestone.dateModified
     plan.modified = False
     if save_plan(self.request):
         self.LOGGER.info(
             "Created plan milestone {}".format(milestone.id),
             extra=context_unpack(self.request,
                                  {"MESSAGE_ID": "tender_milestone_post"}, {
                                      "milestone_id": milestone.id,
                                      "plan_id": plan.id
                                  }),
         )
         self.request.response.status = 201
         milestone_route = self.request.matched_route.name.replace(
             "collection_", "")
         self.request.response.headers[
             "Location"] = self.request.current_route_url(
                 _route_name=milestone_route,
                 milestone_id=milestone.id,
                 _query={})
         return {"data": milestone.serialize("view"), "access": access}
 def put(self):
     """Plan Document Update"""
     document = upload_file(self.request)
     self.request.validated['plan'].documents.append(document)
     if save_plan(self.request):
         self.LOGGER.info('Updated plan document {}'.format(self.request.context.id),
                     extra=context_unpack(self.request, {'MESSAGE_ID': 'plan_document_put'}))
         return {'data': document.serialize("view")}
Example #7
0
    def patch(self):
        """Plan Edit (partial)

        For example here is how procuring entity can change name:

        .. sourcecode:: http

            PATCH /plans/62179f8f94a246239268750a6eb0e53f HTTP/1.1
            Host: example.com
            Accept: application/json

            {
                "data": {
                    "procuringEntity": {
                        "identifier": {
                            "legalName": "ДП Державне Уравління Справами11"
                        },
                        "name": "ДУС"
                    },
                    "budget": {
                        "project": {
                            "name": "proj_name",
                            "id": "proj_id"
                        },
                        "amount": 10020,
                        "amountNet": 22222,
                        "id": "budget_id",
                        "description": "budget_description"
                    }
                }
            }

        And here is the response to be expected:

        .. sourcecode:: http

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

        """
        plan = self.request.validated['plan']
        apply_patch(self.request, save=False, src=self.request.validated['plan_src'])
        save_plan(self.request)
        LOGGER.info('Updated plan {}'.format(plan.id),
                    extra=context_unpack(self.request, {'MESSAGE_ID': 'plan_patch'}))
        return {'data': plan.serialize('view')}
Example #8
0
    def patch(self):
        plan = self.request.validated['plan']
        milestone = self.request.context
        status = milestone.status
        prev_due_date = milestone.dueDate
        description = milestone.description

        if apply_patch(self.request, src=self.request.context.serialize(), save=False):
            plan.dateModified = milestone.dateModified = get_now()
            plan.modified = False
            if status != milestone.status:  # Allowed status changes: scheduled -> met/notMet
                if (
                        status == Milestone.STATUS_SCHEDULED
                        and milestone.status in (Milestone.STATUS_MET, Milestone.STATUS_NOT_MET)
                ):
                    if milestone.status == Milestone.STATUS_MET:
                        milestone.dateMet = milestone.dateModified
                else:
                    raise_operation_error(
                        self.request,
                        "Can't update milestone status from '{}' to '{}'".format(status, milestone.status)
                    )

            if prev_due_date != milestone.dueDate and status != Milestone.STATUS_SCHEDULED:
                raise_operation_error(
                    self.request,
                    "Can't update dueDate at '{}' milestone status".format(status)
                )

            if (
                description != milestone.description and
                status not in (Milestone.STATUS_SCHEDULED, Milestone.STATUS_MET)
            ):
                raise_operation_error(
                    self.request,
                    "Can't update description at '{}' milestone status".format(status)
                )

            save_plan(self.request)
            self.LOGGER.info('Updated plan milestone {}'.format(self.request.context.id),
                             extra=context_unpack(self.request, {'MESSAGE_ID': 'plan_milestone_patch'}))

        return {'data': self.request.context.serialize("view")}
 def put(self):
     """Plan Document Update"""
     document = upload_file(self.request)
     self.request.validated["plan"].documents.append(document)
     if save_plan(self.request):
         self.LOGGER.info(
             "Updated plan document {}".format(self.request.context.id),
             extra=context_unpack(self.request, {"MESSAGE_ID": "plan_document_put"}),
         )
         return {"data": document.serialize("view")}
 def collection_post(self):
     """Plan Document Upload"""
     document = upload_file(self.request)
     self.context.documents.append(document)
     if save_plan(self.request):
         self.LOGGER.info('Created plan document {}'.format(document.id),
                     extra=context_unpack(self.request, {'MESSAGE_ID': 'plan_document_create'}, {'document_id': document.id}))
         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")}
Example #11
0
 def collection_post(self):
     """Plan Document Upload"""
     document = upload_file(self.request)
     self.context.documents.append(document)
     if save_plan(self.request):
         self._post_document_log(document)
         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):
     """Plan Document Upload"""
     document = upload_file(self.request)
     self.context.documents.append(document)
     if save_plan(self.request):
         self.LOGGER.info(
             "Created plan document {}".format(document.id),
             extra=context_unpack(
                 self.request, {"MESSAGE_ID": "plan_document_create"}, {"document_id": document.id}
             ),
         )
         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")}
Example #13
0
File: plan.py Project: lttga/op2
    def post(self):
        """This API request is targeted to creating new Plan by procuring organizations.

        Creating new Plan

        -------------------

        Example request to create plan:

        .. sourcecode:: http

            POST /plans HTTP/1.1
            Host: example.com
            Accept: application/json

            {
                "data": {
                    "tender": {
                        "procurementMethod": "допорогові закупівлі",
                        "tenderPeriod": {
                            "startDate": "2015-05-09T23:11:39.720908+03:00"
                        }
                    },
                    "items": [
                        {
                            "deliveryDate": {
                                "endDate": "2015-05-11T23:11:39.721063+03:00"
                            },
                            "additionalClassifications": [
                                {
                                    "scheme": "ДКПП",
                                    "id": "28.29.39-10.00",
                                    "description": "Прилади контролювання маси та прилади контрольні автоматичні з максимальною масою зважування не більше ніж 5000 кг"
                                }
                            ],
                            "unit": {
                                "code": "KGM",
                                "name": "кг"
                            },
                            "classification": {
                                "scheme": "CPV",
                                "description": "Роботи з будування пневматичних будівель",
                                "id": "45217000-1"
                            },
                            "quantity": 760
                        }
                    ],
                    "procuringEntity": {
                        "identifier": {
                            "scheme": "UA-EDR",
                            "id": "111983",
                            "legalName": "ДП Державне Уравління Справами"
                        },
                        "name": "ДУС"
                    },
                    "budget": {
                        "project": {
                            "name": "proj_name",
                            "id": "proj_id"
                        },
                        "amount": 10000,
                        "amountNet": 12222,
                        "id": "budget_id",
                        "description": "budget_description"
                    }
                }
            }

        This is what one should expect in response:

        .. sourcecode:: http

            HTTP/1.1 201 Created
            Location: http://localhost/api/0.10/plans/84582807b5654bee9e216adb05e57d39
            Content-Type: application/json

            {
                "access": {
                    "token": "e4c75de4320649a4bbbdfa180e7a9ef2"
                },
                "data": {
                    "items": [
                        {
                            "classification": {
                                "scheme": "CPV",
                                "description": "Роботи з будування пневматичних будівель",
                                "id": "45217000-1"
                            },
                            "additionalClassifications": [
                                {
                                    "scheme": "ДКПП",
                                    "id": "28.29.39-10.00",
                                    "description": "Прилади контролювання маси та прилади контрольні"
                                },
                                {
                                    "scheme": "КЕКВ",
                                    "id": "123",
                                    "description": "-"
                                }
                            ],
                            "deliveryDate": {
                                "endDate": "2015-05-11T23:11:39.721063+03:00"
                            },
                            "id": "8cd4abfd0bbb489a83a81dec1393ab8d",
                            "unit": {
                                "code": "KGM",
                                "name": "кг"
                            },
                            "quantity": 760
                        }
                    ],
                    "planID": "UA-2015-11-26-000001",
                    "budget": {
                        "amountNet": 12222,
                        "description": "budget_description",
                        "project": {
                            "id": "proj_id",
                            "name": "proj_name"
                        },
                        "currency": "UAH",
                        "amount": 10000,
                        "id": "budget_id"
                    },
                    "procuringEntity": {
                        "identifier": {
                            "scheme": "UA-EDR",
                            "id": "111983",
                            "legalName": "ДП Державне Уравління Справами"
                        },
                        "name": "ДУС"
                    },
                    "tender": {
                        "procurementMethod": "open",
                        "tenderPeriod": {
                            "startDate": "2015-05-09T23:11:39.720908+03:00"
                        }
                    },
                    "id": "ac658c4ff7ab47dea27e32d15a655ddb"
                }
}
        """
        plan_id = generate_id()
        plan = self.request.validated["plan"]
        plan.id = plan_id

        plan.planID = generate_plan_id(get_now(), self.db, self.server_id)
        access = set_ownership(plan, self.request)
        self.request.validated["plan"] = plan
        self.request.validated["plan_src"] = {}
        if save_plan(self.request):
            LOGGER.info(
                "Created plan {} ({})".format(plan_id, plan.planID),
                extra=context_unpack(self.request,
                                     {"MESSAGE_ID": "plan_create"}, {
                                         "plan_id": plan_id,
                                         "planID": plan.planID
                                     }),
            )
            self.request.response.status = 201
            self.request.response.headers["Location"] = self.request.route_url(
                "Plan", plan_id=plan_id)
            return {"data": plan.serialize("view"), "access": access}
    def post(self):
        """This API request is targeted to creating new Plan by procuring organizations.

        Creating new Plan

        -------------------

        Example request to create plan:

        .. sourcecode:: http

            POST /plans HTTP/1.1
            Host: example.com
            Accept: application/json

            {
                "data": {
                    "tender": {
                        "procurementMethod": "допорогові закупівлі",
                        "tenderPeriod": {
                            "startDate": "2015-05-09T23:11:39.720908+03:00"
                        }
                    },
                    "items": [
                        {
                            "deliveryDate": {
                                "endDate": "2015-05-11T23:11:39.721063+03:00"
                            },
                            "additionalClassifications": [
                                {
                                    "scheme": "ДКПП",
                                    "id": "28.29.39-10.00",
                                    "description": "Прилади контролювання маси та прилади контрольні автоматичні з максимальною масою зважування не більше ніж 5000 кг"
                                }
                            ],
                            "unit": {
                                "code": "KGM",
                                "name": "кг"
                            },
                            "classification": {
                                "scheme": "CPV",
                                "description": "Роботи з будування пневматичних будівель",
                                "id": "45217000-1"
                            },
                            "quantity": 760
                        }
                    ],
                    "procuringEntity": {
                        "identifier": {
                            "scheme": "UA-EDR",
                            "id": "111983",
                            "legalName": "ДП Державне Уравління Справами"
                        },
                        "name": "ДУС"
                    },
                    "budget": {
                        "project": {
                            "name": "proj_name",
                            "id": "proj_id"
                        },
                        "amount": 10000,
                        "amountNet": 12222,
                        "id": "budget_id",
                        "description": "budget_description"
                    }
                }
            }

        This is what one should expect in response:

        .. sourcecode:: http

            HTTP/1.1 201 Created
            Location: http://localhost/api/0.10/plans/84582807b5654bee9e216adb05e57d39
            Content-Type: application/json

            {
                "access": {
                    "token": "e4c75de4320649a4bbbdfa180e7a9ef2"
                },
                "data": {
                    "items": [
                        {
                            "classification": {
                                "scheme": "CPV",
                                "description": "Роботи з будування пневматичних будівель",
                                "id": "45217000-1"
                            },
                            "additionalClassifications": [
                                {
                                    "scheme": "ДКПП",
                                    "id": "28.29.39-10.00",
                                    "description": "Прилади контролювання маси та прилади контрольні"
                                },
                                {
                                    "scheme": "КЕКВ",
                                    "id": "123",
                                    "description": "-"
                                }
                            ],
                            "deliveryDate": {
                                "endDate": "2015-05-11T23:11:39.721063+03:00"
                            },
                            "id": "8cd4abfd0bbb489a83a81dec1393ab8d",
                            "unit": {
                                "code": "KGM",
                                "name": "кг"
                            },
                            "quantity": 760
                        }
                    ],
                    "planID": "UA-2015-11-26-000001",
                    "budget": {
                        "amountNet": 12222,
                        "description": "budget_description",
                        "project": {
                            "id": "proj_id",
                            "name": "proj_name"
                        },
                        "currency": "UAH",
                        "amount": 10000,
                        "id": "budget_id"
                    },
                    "procuringEntity": {
                        "identifier": {
                            "scheme": "UA-EDR",
                            "id": "111983",
                            "legalName": "ДП Державне Уравління Справами"
                        },
                        "name": "ДУС"
                    },
                    "tender": {
                        "procurementMethod": "open",
                        "tenderPeriod": {
                            "startDate": "2015-05-09T23:11:39.720908+03:00"
                        }
                    },
                    "id": "ac658c4ff7ab47dea27e32d15a655ddb"
                }
}
        """
        plan_id = generate_id()
        plan = self.request.validated["plan"]
        plan.id = plan_id

        plan.planID = generate_plan_id(get_now(), self.db, self.server_id)
        set_ownership(plan, self.request)
        self.request.validated["plan"] = plan
        self.request.validated["plan_src"] = {}
        if save_plan(self.request):
            LOGGER.info(
                "Created plan {} ({})".format(plan_id, plan.planID),
                extra=context_unpack(
                    self.request, {"MESSAGE_ID": "plan_create"}, {"plan_id": plan_id, "planID": plan.planID}
                ),
            )
            self.request.response.status = 201
            self.request.response.headers["Location"] = self.request.route_url("Plan", plan_id=plan_id)
            return {"data": plan.serialize("create"), "access": {"token": plan.owner_token}}
 def save(self, request, **kwargs):
     return save_plan(request)