コード例 #1
0
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)
コード例 #2
0
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)