diff options
Diffstat (limited to 'backend/models')
-rw-r--r-- | backend/models/__init__.py | 3 | ||||
-rw-r--r-- | backend/models/form_response.py | 36 |
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 |