def post(self, plan_id): plan = Plan.query.get(plan_id) if plan is None: return error("plan not found", http_code=404) args = self.parser.parse_args() step = Step( plan=plan, order=args.order, implementation=args.implementation, ) try: data = json.loads(args.data) except ValueError as e: db.session.rollback() return error("invalid JSON: %s" % e) if not isinstance(data, dict): db.session.rollback() return error("data must be a JSON mapping") impl_cls = step.get_implementation(load=False) if impl_cls is None: db.session.rollback() return error("unable to load build step implementation") try: # XXX(dcramer): It's important that we deepcopy data so any # mutations within the BuildStep don't propagate into the db impl_cls(**deepcopy(data)) except Exception as exc: db.session.rollback() return error("unable to create build step provided data: %s" % exc) step.data = data step.order = args.order db.session.add(step) plan.date_modified = step.date_modified db.session.add(plan) for name in STEP_OPTIONS.keys(): value = args.get(name) if value is None: continue create_or_update(ItemOption, where={ 'item_id': step.id, 'name': name, }, values={ 'value': value, }) return self.serialize(step), 201
def post(self, plan_id): plan = Plan.query.get(plan_id) if plan is None: return {"message": "plan not found"}, 404 args = self.parser.parse_args() step = Step( plan=plan, order=args.order, implementation=args.implementation, ) data = json.loads(args.data) if not isinstance(data, dict): return {"message": "data must be a JSON mapping"}, 400 impl_cls = step.get_implementation(load=False) if impl_cls is None: return {"message": "unable to load build step implementation"}, 400 try: impl_cls(**data) except Exception: return { "message": "unable to create build step provided data" }, 400 step.data = data step.order = args.order db.session.add(step) plan.date_modified = step.date_modified db.session.add(plan) for name in STEP_OPTIONS.keys(): value = args.get(name) if value is None: continue create_or_update(ItemOption, where={ 'item_id': step.id, 'name': name, }, values={ 'value': value, }) return self.serialize(step), 201
def post(self, plan_id): plan = Plan.query.get(plan_id) if plan is None: return {"message": "plan not found"}, 404 args = self.parser.parse_args() step = Step( plan=plan, order=args.order, implementation=args.implementation, ) data = json.loads(args.data) if not isinstance(data, dict): return {"message": "data must be a JSON mapping"}, 400 impl_cls = step.get_implementation(load=False) if impl_cls is None: return {"message": "unable to load build step implementation"}, 400 try: impl_cls(**data) except Exception: return {"message": "unable to create build step provided data"}, 400 step.data = data step.order = args.order db.session.add(step) plan.date_modified = step.date_modified db.session.add(plan) for name in STEP_OPTIONS.keys(): value = args.get(name) if value is None: continue create_or_update(ItemOption, where={ 'item_id': step.id, 'name': name, }, values={ 'value': value, }) return self.serialize(step), 201
def post(self, plan_id): plan = Plan.query.get(plan_id) if plan is None: return {"message": "plan not found"}, 404 args = self.parser.parse_args() step = Step( plan=plan, order=args.order, implementation=args.implementation, ) data = json.loads(args.data) if not isinstance(data, dict): return {"message": "data must be a JSON mapping"}, 400 impl_cls = step.get_implementation(load=False) if impl_cls is None: return {"message": "unable to load build step implementation"}, 400 try: impl_cls(**data) except Exception: return {"message": "unable to create build step provided data"}, 400 step.data = data step.order = args.order db.session.add(step) plan.date_modified = step.date_modified db.session.add(plan) db.session.commit() return self.serialize(step), 201