From 62a7dda4a2e83b880a7e16df4687d8ea86c1bd69 Mon Sep 17 00:00:00 2001 From: ks129 <45097959+ks129@users.noreply.github.com> Date: Mon, 7 Dec 2020 20:08:31 +0200 Subject: Create Pydantic model for form response antispam data --- backend/models/antispam.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 backend/models/antispam.py (limited to 'backend/models') diff --git a/backend/models/antispam.py b/backend/models/antispam.py new file mode 100644 index 0000000..b16f686 --- /dev/null +++ b/backend/models/antispam.py @@ -0,0 +1,10 @@ +from pydantic import BaseModel + + +class AntiSpam(BaseModel): + """Schema model for form response antispam field.""" + + ip_hash: str + user_agent_hash: str + captcha_pass: bool + dns_blacklisted: bool -- cgit v1.2.3 From bc68d2f7363d81c3a36f4c5641377dd4d024a932 Mon Sep 17 00:00:00 2001 From: ks129 <45097959+ks129@users.noreply.github.com> Date: Tue, 8 Dec 2020 10:41:04 +0200 Subject: Create DiscordUser Pydantic model for form response --- backend/models/discord_user.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 backend/models/discord_user.py (limited to 'backend/models') diff --git a/backend/models/discord_user.py b/backend/models/discord_user.py new file mode 100644 index 0000000..99d6248 --- /dev/null +++ b/backend/models/discord_user.py @@ -0,0 +1,33 @@ +import typing as t + +from pydantic import BaseModel, root_validator + + +class DiscordUser(BaseModel): + """Schema model of Discord user for form response.""" + + # Discord default fields + id: int # This is actually snowflake, but we simplify it here + username: str + discriminator: str + avatar: t.Optional[str] + bot: t.Optional[bool] + system: t.Optional[bool] + locale: t.Optional[str] + verified: t.Optional[bool] + email: t.Optional[str] + flags: t.Optional[int] + premium_type: t.Optional[int] + public_flags: t.Optional[int] + + # Custom fields + admin: bool + + @root_validator + def validate_data(cls, values: t.Dict[str, t.Any]) -> t.Dict[str, t.Any]: + """Validates email data when email collection is required.""" + if values.get("require_email", False) is True: + if values.get("email") is None or values.get("verified") is None: + raise ValueError("Email information about user is required.") + + return values -- cgit v1.2.3 From 8e0a9a634e9bcc50ccad36ca1304e4e27f2992b1 Mon Sep 17 00:00:00 2001 From: ks129 <45097959+ks129@users.noreply.github.com> Date: Tue, 8 Dec 2020 10:41:52 +0200 Subject: Add AntiSpam and DiscordUser models to __init__.py --- backend/models/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'backend/models') diff --git a/backend/models/__init__.py b/backend/models/__init__.py index 80abf6f..a85dc2c 100644 --- a/backend/models/__init__.py +++ b/backend/models/__init__.py @@ -1,4 +1,6 @@ +from .antispam import AntiSpam +from .discord_user import DiscordUser from .form import Form from .question import Question -__all__ = ["Form", "Question"] +__all__ = ["AntiSpam", "DiscordUser", "Form", "Question"] -- cgit v1.2.3 From 5112df454e868175a898f1f15167becada26d55a Mon Sep 17 00:00:00 2001 From: ks129 <45097959+ks129@users.noreply.github.com> Date: Tue, 8 Dec 2020 11:02:26 +0200 Subject: Create model for form response --- backend/models/__init__.py | 3 ++- backend/models/form_response.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 backend/models/form_response.py (limited to 'backend/models') 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 -- cgit v1.2.3 From f04f605c89446dd854956162ad47698c2933ff8c Mon Sep 17 00:00:00 2001 From: ks129 <45097959+ks129@users.noreply.github.com> Date: Wed, 9 Dec 2020 19:30:38 +0200 Subject: Remove some validators from models because they don't work --- backend/models/discord_user.py | 11 +---------- backend/models/form_response.py | 19 +------------------ 2 files changed, 2 insertions(+), 28 deletions(-) (limited to 'backend/models') diff --git a/backend/models/discord_user.py b/backend/models/discord_user.py index 99d6248..e835176 100644 --- a/backend/models/discord_user.py +++ b/backend/models/discord_user.py @@ -1,6 +1,6 @@ import typing as t -from pydantic import BaseModel, root_validator +from pydantic import BaseModel class DiscordUser(BaseModel): @@ -22,12 +22,3 @@ class DiscordUser(BaseModel): # Custom fields admin: bool - - @root_validator - def validate_data(cls, values: t.Dict[str, t.Any]) -> t.Dict[str, t.Any]: - """Validates email data when email collection is required.""" - if values.get("require_email", False) is True: - if values.get("email") is None or values.get("verified") is None: - raise ValueError("Email information about user is required.") - - return values diff --git a/backend/models/form_response.py b/backend/models/form_response.py index 9fffdde..bea070f 100644 --- a/backend/models/form_response.py +++ b/backend/models/form_response.py @@ -1,8 +1,7 @@ import typing as t -from pydantic import BaseModel, Field, root_validator +from pydantic import BaseModel, Field -from backend.constants import FormFeatures from .antispam import AntiSpam from .discord_user import DiscordUser @@ -18,19 +17,3 @@ class FormResponse(BaseModel): 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 -- cgit v1.2.3