From 0947ade71504b08bf91d830b0ec872fca6ffaad8 Mon Sep 17 00:00:00 2001 From: Hassan Abouelela <47495861+HassanAbouelela@users.noreply.github.com> Date: Tue, 16 Mar 2021 17:01:48 +0300 Subject: Adds DM Feature Adds the form variables to allow sending DMs. Signed-off-by: Hassan Abouelela <47495861+HassanAbouelela@users.noreply.github.com> --- backend/constants.py | 1 + backend/models/form.py | 33 +++++++++++++++++++++++++-------- backend/routes/forms/submit.py | 8 ++++++++ 3 files changed, 34 insertions(+), 8 deletions(-) (limited to 'backend') diff --git a/backend/constants.py b/backend/constants.py index 8a32816..d33f205 100644 --- a/backend/constants.py +++ b/backend/constants.py @@ -73,6 +73,7 @@ class FormFeatures(Enum): DISABLE_ANTISPAM = "DISABLE_ANTISPAM" WEBHOOK_ENABLED = "WEBHOOK_ENABLED" ASSIGN_ROLE = "ASSIGN_ROLE" + SEND_DM = "SEND_DM" class WebHook(Enum): diff --git a/backend/models/form.py b/backend/models/form.py index 30ae0e7..9970dce 100644 --- a/backend/models/form.py +++ b/backend/models/form.py @@ -14,7 +14,14 @@ PUBLIC_FIELDS = [ "name", "description", "submitted_text", - "discord_role" + "discord_role", + "dm_message", +] + +REQUIRES_LOGIN_FEATURES = [ + FormFeatures.COLLECT_EMAIL, + FormFeatures.ASSIGN_ROLE, + FormFeatures.SEND_DM, ] @@ -43,6 +50,7 @@ class Form(BaseModel): submitted_text: t.Optional[str] = None webhook: _WebHook = None discord_role: t.Optional[str] + dm_message: t.Optional[str] class Config: allow_population_by_field_name = True @@ -57,13 +65,9 @@ class Form(BaseModel): raise ValueError("Form features list contains one or more invalid values.") if FormFeatures.REQUIRES_LOGIN.value not in value: - if FormFeatures.COLLECT_EMAIL.value in value: - raise ValueError( - "COLLECT_EMAIL feature require REQUIRES_LOGIN feature." - ) - - if FormFeatures.ASSIGN_ROLE.value in value: - raise ValueError("ASSIGN_ROLE feature require REQUIRES_LOGIN feature.") + for feature in REQUIRES_LOGIN_FEATURES: + if feature.value in value: + raise ValueError(f"{feature.value} feature requires REQUIRES_LOGIN feature.") return value @@ -80,6 +84,19 @@ class Form(BaseModel): return values + @root_validator + def validate_dm_message(cls, values: dict[str, t.Any]) -> t.Optional[dict[str, t.Any]]: + """Validates message provided when flag provided.""" + if ( + FormFeatures.SEND_DM.value in values.get("features", []) + and not values.get("dm_message") + ): + raise ValueError( + "dm_message field is required when SEND_DM flag is provided." + ) + + return values + def dict(self, admin: bool = True, **kwargs: t.Any) -> dict[str, t.Any]: """Wrapper for original function to exclude private data for public access.""" data = super().dict(**kwargs) diff --git a/backend/routes/forms/submit.py b/backend/routes/forms/submit.py index d0c7a87..f4b3174 100644 --- a/backend/routes/forms/submit.py +++ b/backend/routes/forms/submit.py @@ -197,6 +197,14 @@ class SubmitForm(Route): request_user=request.user ) + if constants.FormFeatures.SEND_DM.value in form.features: + tasks.add_task( + discord.send_direct_message, + form=form, + response=response_obj, + user=request.user + ) + return JSONResponse({ "form": form.dict(admin=False), "response": response_obj.dict() -- cgit v1.2.3