From 7a17fac38ec351f93f4a1144abeefedd92874620 Mon Sep 17 00:00:00 2001 From: Andrew Buss <abuss@ucsd.edu> Date: Sat, 30 May 2015 14:03:37 -0700 Subject: [PATCH] add view to resend confirmation email --- flashcards/models.py | 22 ++++++++++++---------- flashcards/views.py | 7 +++++++ flashy/urls.py | 3 ++- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/flashcards/models.py b/flashcards/models.py index dcfdcb2..fd8dd0b 100644 --- a/flashcards/models.py +++ b/flashcards/models.py @@ -20,6 +20,8 @@ from flashy.settings import IN_PRODUCTION + + # Hack to fix AbstractUser before subclassing it AbstractUser._meta.get_field('email')._unique = True @@ -43,21 +45,12 @@ class EmailOnlyUserManager(UserManager): date_joined=now(), **extra_fields) user.set_password(password) user.save(using=self._db) + user.send_confirmation_email() return user def create_user(self, email, password=None, **extra_fields): user = self._create_user(email, password, False, False, **extra_fields) - body = ''' - Visit the following link to confirm your email address: - https://flashy.cards/app/verifyemail/%s - - If you did not register for Flashy, no action is required. - ''' - assert send_mail("Flashy email verification", - body % user.confirmation_key, - "noreply@flashy.cards", - [user.email]) return user def create_superuser(self, email, password, **extra_fields): @@ -83,6 +76,15 @@ class User(AbstractUser, SimpleEmailConfirmationUserMixin): sections = ManyToManyField('Section', help_text="The sections which the user is enrolled in") confirmed_email = BooleanField(default=False) + def send_confirmation_email(self): + body = ''' + Visit the following link to confirm your email address: + https://flashy.cards/app/verifyemail/%s + + If you did not register for Flashy, no action is required. + ''' + send_mail("Flashy email verification", body % self.confirmation_key, "noreply@flashy.cards", [self.email]) + def is_in_section(self, section): return self.sections.filter(pk=section.pk).exists() diff --git a/flashcards/views.py b/flashcards/views.py index 2773d14..dbf5451 100644 --- a/flashcards/views.py +++ b/flashcards/views.py @@ -189,6 +189,13 @@ class UserDetail(GenericAPIView): return Response(status=HTTP_204_NO_CONTENT) + +@api_view(['POST']) +@permission_classes([IsAuthenticated]) +def resend_confirmation_email(request): + request.user.send_confirmation_email() + return Response(status=HTTP_204_NO_CONTENT) + @api_view(['POST']) def register(request, format=None): """ diff --git a/flashy/urls.py b/flashy/urls.py index 27a8b4a..68262f6 100644 --- a/flashy/urls.py +++ b/flashy/urls.py @@ -1,7 +1,7 @@ from django.conf.urls import include, url from django.contrib import admin from flashcards.views import SectionViewSet, UserDetail, FlashcardViewSet, UserSectionListView, request_password_reset, \ - reset_password, logout, login, register, UserFlashcardQuizViewSet + reset_password, logout, login, register, UserFlashcardQuizViewSet, resend_confirmation_email from flashy.frontend_serve import serve_with_default from flashy.settings import DEBUG, IN_PRODUCTION from rest_framework.routers import DefaultRouter @@ -19,6 +19,7 @@ urlpatterns = [ url(r'^api/login/$', login), url(r'^api/logout/$', logout), url(r'^api/me/sections/', UserSectionListView.as_view()), + url(r'^api/resend_confirmation_email/', resend_confirmation_email), url(r'^api/request_password_reset/', request_password_reset), url(r'^api/reset_password/', reset_password), url(r'^api/', include(router.urls)), -- 1.9.1