aboutsummaryrefslogtreecommitdiffstats
path: root/backend
diff options
context:
space:
mode:
authorGravatar Hassan Abouelela <[email protected]>2020-12-22 04:55:23 +0300
committerGravatar Hassan Abouelela <[email protected]>2020-12-22 04:57:11 +0300
commit0f04292ce4121aa861cd1f67c3501a715a031e3c (patch)
tree7636d44ecda9e04f9fbe22d4521101808bd28b31 /backend
parentDedents Webhook Object (diff)
Updates Patching Strategy
Changes the patching strategy to modify certain objects instead of outright overwriting them. Signed-off-by: Hassan Abouelela <[email protected]>
Diffstat (limited to 'backend')
-rw-r--r--backend/routes/forms/form.py22
1 files changed, 15 insertions, 7 deletions
diff --git a/backend/routes/forms/form.py b/backend/routes/forms/form.py
index b87c7cf..8ecfdf6 100644
--- a/backend/routes/forms/form.py
+++ b/backend/routes/forms/form.py
@@ -1,15 +1,16 @@
"""
Returns, updates or deletes a single form given an ID.
"""
+import deepmerge
from pydantic import ValidationError
from spectree.response import Response
from starlette.authentication import requires
from starlette.requests import Request
from starlette.responses import JSONResponse
-from backend.route import Route
from backend.models import Form
-from backend.validation import OkayResponse, api, ErrorMessage
+from backend.route import Route
+from backend.validation import ErrorMessage, OkayResponse, api
class SingleForm(Route):
@@ -53,15 +54,22 @@ class SingleForm(Route):
"""Updates form by ID."""
data = await request.json()
- if raw_form := await request.state.db.forms.find_one(
- {"_id": request.path_params["form_id"]}
- ):
+ form_id = {"_id": request.path_params["form_id"]}
+ if raw_form := await request.state.db.forms.find_one(form_id):
if "_id" in data or "id" in data:
return JSONResponse({"error": "locked_field"}, status_code=400)
- raw_form.update(data)
+ # Build Data Merger
+ merge_strategy = [
+ (dict, ["merge"])
+ ]
+ merger = deepmerge.Merger(merge_strategy, ["override"], ["override"])
+
+ # Merge Form Data
+ updated_form = merger.merge(raw_form, data)
+
try:
- form = Form(**raw_form)
+ form = Form(**updated_form)
except ValidationError as e:
return JSONResponse(e.errors(), status_code=422)