class SchoolEmailFormPartial( _SubmissionPartial, PasswordResetView, ): form_class = account_forms.ReportingVerificationEmailForm token_generator = account_tokens.StudentVerificationTokenGenerator() # success_url is used for inputting a valid school email address success_url = None # next_url is used for having your account already verified, # and inputting a correct account verification token next_url = None EVAL_ACTION_TYPE = 'SCHOOL_EMAIL_ENTRY' def dispatch(self, request, *args, **kwargs): if self.email_is_verified(): return self._redirect_to_next() else: return super().dispatch(request, *args, **kwargs) def get_success_url(self): return reverse(self.success_url) def form_valid(self, form): ''' avoid saving the form twice (and thus sending emails twice) ''' return ModelFormMixin.form_valid(self, form) def email_is_verified(self): return self.request.user.account.is_verified def _redirect_to_next(self): next_url = reverse( self.next_url, kwargs={'uuid': self.report.uuid}, ) return redirect(next_url)
class SchoolEmailFormPartial(_SubmissionPartial, CallistoPasswordResetView): form_class = account_forms.ReportingVerificationEmailForm token_generator = account_tokens.StudentVerificationTokenGenerator() # success_url is used for inputting a valid school email address success_url = None # next_url is used for having your account already verified, # and inputting a correct account verification token next_url = None EVAL_ACTION_TYPE = "SCHOOL_EMAIL_ENTRY" @property def student_confirmation_url(self): uidb64 = urlsafe_base64_encode(force_bytes( self.request.user.pk)).decode("utf-8") token = self.token_generator.make_token(self.request.user) return reverse( self.request.resolver_match.view_name, kwargs={ "uuid": self.report.uuid, "uidb64": uidb64, "token": token }, ) def dispatch(self, request, *args, **kwargs): if self.request.user.account.is_verified: return self._redirect_to_next() else: return super().dispatch(request, *args, **kwargs) def get_success_url(self): return reverse(self.success_url) def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs.update({"school_email_domain": self.school_email_domain}) return kwargs def form_valid(self, form): self._update_email(form) self._send_mail(form) return super().form_valid(form) def _update_email(self, form): self.request.user.account.school_email = form.cleaned_data.get("email") self.request.user.account.save() def _send_mail(self, form): NotificationApi.send_with_kwargs( site_id=self.request.user.account.site_id, to_addresses=[form.cleaned_data.get("email")], email_subject="Verify your student email", email_name="student_verification_email", redirect_url=self.student_confirmation_url, email_template_name=self.email_template_name, user=self.request.user, ) def _redirect_to_next(self): next_url = reverse(self.next_url, kwargs={"uuid": self.report.uuid}) return redirect(next_url)