aboutsummaryrefslogtreecommitdiffstats
path: root/backend/models/form_response.py
diff options
context:
space:
mode:
Diffstat (limited to 'backend/models/form_response.py')
-rw-r--r--backend/models/form_response.py36
1 files changed, 36 insertions, 0 deletions
diff --git a/backend/models/form_response.py b/backend/models/form_response.py
new file mode 100644
index 0000000..9fffdde
--- /dev/null
+++ b/backend/models/form_response.py
@@ -0,0 +1,36 @@
+import typing as t
+
+from pydantic import BaseModel, Field, root_validator
+
+from backend.constants import FormFeatures
+from .antispam import AntiSpam
+from .discord_user import DiscordUser
+
+
+class FormResponse(BaseModel):
+ """Schema model for form response."""
+
+ id: str = Field(alias="_id")
+ user: t.Optional[DiscordUser]
+ antispam: t.Optional[AntiSpam]
+ response: t.Dict[str, t.Any]
+ form_id: str
+
+ class Config:
+ allow_population_by_field_name = True
+
+ @root_validator
+ def validate_data(cls, values: t.Dict[str, t.Any]) -> t.Dict[str, t.Any]:
+ """Validates is all required (based on flags) is provided."""
+ flags = values.get("flags", [])
+
+ if FormFeatures.DISABLE_ANTISPAM not in flags and values.get("antispam") is None: # noqa
+ raise ValueError("Antispam information required.")
+
+ if FormFeatures.REQUIRES_LOGIN in flags:
+ if values.get("user") is None:
+ raise ValueError("User information required.")
+
+ values["user"]["require_email"] = FormFeatures.COLLECT_EMAIL in flags
+
+ return values