aboutsummaryrefslogtreecommitdiffstats
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/models/__init__.py3
-rw-r--r--backend/models/form_response.py36
2 files changed, 38 insertions, 1 deletions
diff --git a/backend/models/__init__.py b/backend/models/__init__.py
index a85dc2c..98fa619 100644
--- a/backend/models/__init__.py
+++ b/backend/models/__init__.py
@@ -1,6 +1,7 @@
from .antispam import AntiSpam
from .discord_user import DiscordUser
from .form import Form
+from .form_response import FormResponse
from .question import Question
-__all__ = ["AntiSpam", "DiscordUser", "Form", "Question"]
+__all__ = ["AntiSpam", "DiscordUser", "Form", "FormResponse", "Question"]
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