Skip to content
Snippets Groups Projects
Commit 0466b9ff authored by Valentin Rigal's avatar Valentin Rigal Committed by Erwan Rouchet
Browse files

RQ task to send a verification email

parent a2f33483
No related branches found
No related tags found
1 merge request!2335RQ task to send a verification email
......@@ -150,6 +150,7 @@ def get_settings_parser(base_dir):
job_timeouts_parser.add_option("notify_process_completion", type=int, default=120)
# Task execution in RQ timeouts after 10 hours by default
job_timeouts_parser.add_option("task", type=int, default=36000)
job_timeouts_parser.add_option("send_verification_email", type=int, default=120)
csrf_parser = parser.add_subparser("csrf", default={})
csrf_parser.add_option("cookie_name", type=str, default="arkindex.csrf")
......
......@@ -61,6 +61,7 @@ job_timeouts:
notify_process_completion: 120
process_delete: 3600
reindex_corpus: 7200
send_verification_email: 120
task: 36000
worker_results_delete: 3600
jwt_signing_key: null
......
......@@ -44,6 +44,7 @@ job_timeouts:
reindex_corpus: {}
task: ''
worker_results_delete: null
send_verification_email: lol
jwt_signing_key: null
local_imageserver_id: 1
metrics_port: 12
......
......@@ -29,6 +29,7 @@ job_timeouts:
reindex_corpus: "int() argument must be a string, a bytes-like object or a real number, not 'dict'"
task: "invalid literal for int() with base 10: ''"
worker_results_delete: "int() argument must be a string, a bytes-like object or a real number, not 'NoneType'"
send_verification_email: "invalid literal for int() with base 10: 'lol'"
ponos:
artifact_max_size: cannot convert float NaN to integer
task_expiry: "invalid literal for int() with base 10: 'zero'"
......
......@@ -75,8 +75,9 @@ job_timeouts:
notify_process_completion: 6
process_delete: 7
reindex_corpus: 8
task: 9
worker_results_delete: 10
send_verification_email: 9
task: 10
worker_results_delete: 11
jwt_signing_key: deadbeef
local_imageserver_id: 45
metrics_port: 4242
......
......@@ -16,6 +16,8 @@ from arkindex.ponos.models import State, Task
from arkindex.process import tasks as process_tasks
from arkindex.process.models import Process, WorkerActivityState, WorkerConfiguration, WorkerRun, WorkerVersion
from arkindex.training.models import ModelVersion
from arkindex.users import tasks as user_tasks
from arkindex.users.models import User
def corpus_delete(corpus: Union[Corpus, UUID, str], user_id: Optional[int] = None) -> None:
......@@ -259,3 +261,9 @@ def schedule_tasks(process: Process, run: int):
if parent_job:
kwargs["depends_on"] = Dependency(jobs=[parent_job], allow_failure=True)
parent_job = ponos_tasks.run_task_rq.delay(task, **kwargs)
def send_verification_email(user: User):
"""Send validation email to an user"""
assert user.verified_email is False, "Only non verified users can receive a verification email"
user_tasks.send_verification_email.delay(user)
import logging
import urllib.parse
from django.conf import settings
from django.contrib.auth import login, logout
from django.contrib.auth.forms import PasswordResetForm
from django.contrib.auth.tokens import default_token_generator
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.urls import reverse
from django_rq.queues import get_queue
from django_rq.settings import QUEUES
from drf_spectacular.types import OpenApiTypes
......@@ -19,6 +15,7 @@ from rest_framework.response import Response
from rq.job import JobStatus
from arkindex.project.permissions import IsAuthenticatedOrReadOnly, IsVerified
from arkindex.project.triggers import send_verification_email
from arkindex.users.models import User
from arkindex.users.serializers import (
EmailLoginSerializer,
......@@ -97,29 +94,7 @@ class UserCreate(CreateAPIView):
user = serializer.save()
login(self.request, user)
activation_url = "{}?{}".format(
self.request.build_absolute_uri(reverse("frontend-verify-email")),
urllib.parse.urlencode({
"email": user.email,
"token": default_token_generator.make_token(user),
}),
)
sent = send_mail(
# Subject cannot have any newlines
subject="".join(render_to_string("registration/verification_email_subject.txt").splitlines()),
message=render_to_string(
"registration/verification_email.html",
context={
"url": activation_url,
},
request=self.request,
),
from_email=None,
recipient_list=[user.email],
fail_silently=True,
)
if sent == 0:
logger.error(f"Failed to send registration email to {user.email}")
send_verification_email(user)
return Response(UserSerializer(user).data, status=status.HTTP_201_CREATED)
......
import urllib
from django.conf import settings
from django.contrib.auth.tokens import default_token_generator
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.urls import reverse
from django_rq import job
from arkindex.users.models import User
@job("default", timeout=settings.RQ_TIMEOUTS["send_verification_email"])
def send_verification_email(user: User):
activation_url = "{}?{}".format(
urllib.parse.urljoin(settings.PUBLIC_HOSTNAME, reverse("frontend-verify-email")),
urllib.parse.urlencode({
"email": user.email,
"token": default_token_generator.make_token(user),
}),
)
send_mail(
# Subject cannot have any newlines
subject="".join(render_to_string("registration/verification_email_subject.txt").splitlines()),
message=render_to_string(
"registration/verification_email.html",
context={"url": activation_url},
),
from_email=None,
recipient_list=[user.email],
fail_silently=False,
)
......@@ -11,6 +11,7 @@ from arkindex.documents.models import Corpus
from arkindex.project.default_corpus import DEFAULT_CORPUS_TYPES
from arkindex.project.tests import FixtureAPITestCase
from arkindex.users.models import Group, Right, Role, Scope, User
from arkindex.users.tasks import send_verification_email
class TestRegistration(FixtureAPITestCase):
......@@ -319,7 +320,9 @@ class TestRegistration(FixtureAPITestCase):
"__all__": ["There is no user with this email or the token is invalid."]
})
def test_create_no_password(self):
@patch("arkindex.users.tasks.send_verification_email.delay")
def test_create_no_password(self, async_verification_email):
async_verification_email.side_effect = send_verification_email
response = self.client.post(
reverse("api:user-new"),
data={"display_name": "New user", "email": "newuser@example.com"},
......@@ -334,7 +337,9 @@ class TestRegistration(FixtureAPITestCase):
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].to, ["newuser@example.com"])
def test_create(self):
@patch("arkindex.users.tasks.send_verification_email.delay")
def test_create(self, async_verification_email):
async_verification_email.side_effect = send_verification_email
response = self.client.post(
reverse("api:user-new"),
data={"display_name": "New user", "email": "newuser@example.com", "password": "myVerySecretPassword"},
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment