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