aboutsummaryrefslogtreecommitdiffstats
path: root/backend/routes
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2020-12-22 03:17:51 +0000
committerGravatar GitHub <[email protected]>2020-12-22 03:17:51 +0000
commita7dd78eda44473e9d9eb32290590eb66ace0753f (patch)
tree7636d44ecda9e04f9fbe22d4521101808bd28b31 /backend/routes
parentMerge pull request #42 from python-discord/big-int-fix (diff)
parentUpdates Patching Strategy (diff)
Merge pull request #43 from python-discord/modify-patch-behavior
Diffstat (limited to 'backend/routes')
-rw-r--r--backend/routes/forms/form.py22
-rw-r--r--backend/routes/forms/index.py5
-rw-r--r--backend/routes/forms/submit.py6
3 files changed, 20 insertions, 13 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)
diff --git a/backend/routes/forms/index.py b/backend/routes/forms/index.py
index 0e1dee8..5fd90ab 100644
--- a/backend/routes/forms/index.py
+++ b/backend/routes/forms/index.py
@@ -6,7 +6,7 @@ from starlette.authentication import requires
from starlette.requests import Request
from starlette.responses import JSONResponse
-from backend.constants import Meta, WebHook
+from backend.constants import WebHook
from backend.models import Form, FormList
from backend.models.form import validate_hook_url
from backend.route import Route
@@ -51,8 +51,7 @@ class FormsList(Route):
# Verify Webhook
try:
# Get url from request
- path = (Meta.__name__.lower(), WebHook.__name__.lower(), WebHook.URL.value)
- url = form_data[path[0]][path[1]][path[2]]
+ url = form_data[WebHook.__name__.lower()][WebHook.URL.value]
# Validate URL
validation = await validate_hook_url(url)
diff --git a/backend/routes/forms/submit.py b/backend/routes/forms/submit.py
index 82caa81..8588a2d 100644
--- a/backend/routes/forms/submit.py
+++ b/backend/routes/forms/submit.py
@@ -155,7 +155,7 @@ class SubmitForm(Route):
) -> None:
"""Helper to send a submission message to a discord webhook."""
# Stop if webhook is not available
- if form.meta.webhook is None:
+ if form.webhook is None:
raise ValueError("Got empty webhook.")
try:
@@ -190,7 +190,7 @@ class SubmitForm(Route):
}
# Set hook message
- message = form.meta.webhook.message
+ message = form.webhook.message
if message:
# Available variables, see SCHEMA.md
ctx = {
@@ -208,5 +208,5 @@ class SubmitForm(Route):
# Post hook
async with httpx.AsyncClient() as client:
- r = await client.post(form.meta.webhook.url, json=hook)
+ r = await client.post(form.webhook.url, json=hook)
r.raise_for_status()