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
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")}
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")}
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")}
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")}
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')}
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")}
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")}
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)