Skip to content

Commit 628056a

Browse files
Merge pull request #75 from unicef/feature/240865-setup-mailjet
AB#240865: Setup Mailjet
2 parents cbfb0ba + 921cef1 commit 628056a

File tree

7 files changed

+297
-40
lines changed

7 files changed

+297
-40
lines changed

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ dependencies = [
5151
"social-auth-app-django",
5252
"unicef-security>=1.5.1",
5353
"django-pghistory>=3.5.4",
54+
"django-anymail[mailjet]>=13.0",
5455
]
5556
[project.scripts]
5657
celery-monitor = "country_workspace.__monitor__:run"

src/country_workspace/config/__init__.py

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -107,27 +107,6 @@ class Group(Enum):
107107
"https://django-environ.readthedocs.io/en/latest/types.html#environ-env-db-url",
108108
),
109109
"DEBUG": (bool, False, True, False, setting("debug")),
110-
"EMAIL_HOST": (str, "", "", False, setting("email-host")),
111-
"EMAIL_HOST_USER": (str, "", "", False, setting("email-host-user")),
112-
"EMAIL_HOST_PASSWORD": (str, "", "", False, setting("email-host-password")),
113-
"EMAIL_PORT": (int, "25", "25", False, setting("email-port")),
114-
"EMAIL_SUBJECT_PREFIX": (
115-
str,
116-
"[Hope-cw]",
117-
"[Hope-ce]",
118-
False,
119-
setting("email-subject-prefix"),
120-
),
121-
"EMAIL_USE_LOCALTIME": (
122-
bool,
123-
False,
124-
False,
125-
False,
126-
setting("email-use-localtime"),
127-
),
128-
"EMAIL_USE_TLS": (bool, False, False, False, setting("email-use-tls")),
129-
"EMAIL_USE_SSL": (bool, False, False, False, setting("email-use-ssl")),
130-
"EMAIL_TIMEOUT": (str, None, None, False, setting("email-timeout")),
131110
"ENVIRONMENT": (str, "production", "develop", False, "Environment"),
132111
"EXTRA_APPS": (list, "", "", False, ""), # nosec
133112
"EXTRA_AUTHENTICATION_BACKENDS": (
@@ -189,6 +168,13 @@ class Group(Enum):
189168
"KOBO_MASTER_API_TOKEN": (str, "", "", False, "Kobo API master token"),
190169
"KOBO_PROJECT_VIEW_ID": (str, "", "", False, "Kobo project view ID"),
191170
"KOBO_API_TOKEN": (str, "", "", False, "Kobo API token"),
171+
"MAILJET_API_URL": (str, "", "", False, "Mailjet API URL"),
172+
"MAILJET_API_KEY": (str, "", "", False, "Mailjet API key"),
173+
"MAILJET_SECRET_KEY": (str, "", "", False, "Mailjet API secret key"),
174+
"IGNORE_RECIPIENT_STATUS": (bool, False, True),
175+
"IGNORE_UNSUPPORTED_FEATURES": (bool, False, True),
176+
"REQUESTS_TIMEOUT": (int, 30, 30),
177+
"DEBUG_API_REQUESTS": (bool, False, False),
192178
}
193179

194180
env = SmartEnv(**CONFIG)

src/country_workspace/config/fragments/constance.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .app import AURORA_API_TOKEN, AURORA_API_URL, HOPE_API_TOKEN, HOPE_API_URL, NEW_USER_DEFAULT_GROUP
22
from .kobo import KOBO_API_TOKEN, KOBO_KF_URL, KOBO_MASTER_API_TOKEN, KOBO_PROJECT_VIEW_ID
3+
from .mail import MAILJET_API_KEY, MAILJET_SECRET_KEY
34

45
CONSTANCE_BACKEND = "constance.backends.database.DatabaseBackend"
56

@@ -61,6 +62,8 @@
6162
" overwrites of newer information.",
6263
bool,
6364
),
65+
"MAILJET_API_KEY": (MAILJET_API_KEY, "Mailjet API key", str),
66+
"MAILJET_SECRET_KEY": (MAILJET_SECRET_KEY, "Mailjet secret key", "write_only_input"),
6467
}
6568

6669
CONSTANCE_CONFIG_FIELDSETS = {
@@ -76,6 +79,8 @@
7679
"KOBO_PROJECT_VIEW_ID",
7780
"KOBO_KF_URL",
7881
"KOBO_CACHE_TTL",
82+
"MAILJET_API_KEY",
83+
"MAILJET_SECRET_KEY",
7984
),
8085
"Data consistency": ("CONCURRENCY_GUARD",),
8186
}
@@ -86,4 +91,5 @@
8691
"HOPE_API_TOKEN": "***",
8792
"KOBO_API_TOKEN": "***",
8893
"KOBO_API_MASTER_TOKEN": "***",
94+
"MAILJET_SECRET_KEY": "***",
8995
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from .. import env
2+
3+
DEFAULT_FROM_EMAIL = "hope@unicef.org"
4+
SERVER_EMAIL = "root@localhost"
5+
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
6+
7+
ANYMAIL = {
8+
"MAILJET_API_URL": env("MAILJET_API_URL", default="https://api.mailjet.com/v3.1/"),
9+
"MAILJET_API_KEY": (MAILJET_API_KEY := env("MAILJET_API_KEY")),
10+
"MAILJET_SECRET_KEY": (MAILJET_SECRET_KEY := env("MAILJET_SECRET_KEY")),
11+
"IGNORE_RECIPIENT_STATUS": env("IGNORE_RECIPIENT_STATUS", default=True),
12+
"IGNORE_UNSUPPORTED_FEATURES": env("IGNORE_UNSUPPORTED_FEATURES", default=True),
13+
"REQUESTS_TIMEOUT": env("REQUESTS_TIMEOUT", default=30),
14+
"DEBUG_API_REQUESTS": env("DEBUG_API_REQUESTS", default=False),
15+
}

src/country_workspace/config/settings.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"hope_smart_import",
4949
"hope_smart_export",
5050
"smart_env",
51+
"anymail",
5152
"country_workspace.security",
5253
"country_workspace.apps.HCWConfig",
5354
"country_workspace.workspaces.apps.Config",
@@ -221,15 +222,6 @@
221222
AUTH_USER_MODEL = "country_workspace.User"
222223
SUPERUSERS = env("SUPERUSERS")
223224

224-
DEFAULT_FROM_EMAIL = "hope@unicef.org"
225-
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
226-
EMAIL_HOST = env("EMAIL_HOST", default="")
227-
EMAIL_HOST_USER = env("EMAIL_HOST_USER", default="")
228-
EMAIL_HOST_PASSWORD = env("EMAIL_HOST_PASSWORD", default="")
229-
EMAIL_PORT = env("EMAIL_PORT", default=25)
230-
EMAIL_USE_TLS = env("EMAIL_USE_TLS", default=False)
231-
EMAIL_USE_SSL = env("EMAIL_USE_SSL", default=False)
232-
233225
from .fragments.app import * # noqa: E402, F403
234226
from .fragments.celery import * # noqa: E402, F403
235227
from .fragments.constance import * # noqa: E402, F403
@@ -244,3 +236,4 @@
244236
from .fragments.social_auth import * # noqa: E402, F403
245237
from .fragments.spectacular import * # noqa: E402, F403
246238
from .fragments.tailwind import * # noqa: E402, F403
239+
from .fragments.mail import * # noqa: E402, F403

tests/test_mail_configuration.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from django.core import mail
2+
from django.core.mail import send_mail
3+
import pytest
4+
from pytest_django.fixtures import SettingsWrapper
5+
6+
7+
@pytest.fixture
8+
def mail_backend(settings: SettingsWrapper) -> None:
9+
settings.EMAIL_BACKEND = "anymail.backends.test.EmailBackend"
10+
11+
12+
def test_mail_configuration(mail_backend: None, settings: SettingsWrapper) -> None:
13+
send_mail(subject := "subject", body := "body", from_ := "to@example.com", to := ["user@example.com"])
14+
15+
assert len(mail.outbox) == 1
16+
17+
mail0 = mail.outbox[0]
18+
assert mail0.subject == subject
19+
assert mail0.body == body
20+
assert mail0.from_email == from_
21+
assert mail0.to == to
22+
23+
connection = mail0.connection
24+
assert connection.debug_api_requests == settings.ANYMAIL["DEBUG_API_REQUESTS"]
25+
assert connection.ignore_recipient_status == settings.ANYMAIL["IGNORE_RECIPIENT_STATUS"]
26+
assert connection.ignore_unsupported_features == settings.ANYMAIL["IGNORE_UNSUPPORTED_FEATURES"]

0 commit comments

Comments
 (0)