def save(self, domain_override=None, use_https=False, request=None, **kwargs): """ Generates a one-use only link for resetting password and sends to the user. """ site = get_current_site(request) if domain_override is not None: site.domain = site.name = domain_override email = self.cleaned_data['email'] active_users = User._default_manager.filter( email__iexact=email, is_active=True) for user in active_users: # Build reset url reset_url = "%s://%s%s" % ( 'https' if use_https else 'http', site.domain, get_password_reset_url(user)) ctx = { 'user': user, 'site': site, 'reset_url': reset_url} messages = CommunicationEventType.objects.get_and_render( code=self.communication_type_code, context=ctx) Dispatcher().dispatch_user_messages(user, messages)
def form_valid(self, form): # Grab current user instance before we save form. We may need this to # send a warning email if the email address is changed. try: old_user = User.objects.get(id=self.request.user.id) except User.DoesNotExist: old_user = None form.save() # We have to look up the email address from the form's # cleaned data because the object created by form.save() can # either be a user or profile instance depending whether a profile # class has been specified by the AUTH_PROFILE_MODULE setting. new_email = form.cleaned_data['email'] if old_user and new_email != old_user.email: # Email address has changed - send a confirmation email to the old # address including a password reset link in case this is a # suspicious change. ctx = { 'user': self.request.user, 'site': get_current_site(self.request), 'reset_url': get_password_reset_url(old_user), 'new_email': new_email, } msgs = CommunicationEventType.objects.get_and_render( code=self.communication_type_code, context=ctx) Dispatcher().dispatch_user_messages(old_user, msgs) messages.success(self.request, _("Profile updated")) return redirect(self.get_success_url())
def form_valid(self, form): # Grab current user instance before we save form. We may need this to # send a warning email if the email address is changed. try: old_user = User.objects.get(id=self.request.user.id) except User.DoesNotExist: old_user = None form.save() # We have to look up the email address from the form's # cleaned data because the object created by form.save() can # either be a user or profile depending on AUTH_PROFILE_MODULE new_email = form.cleaned_data['email'] if old_user and new_email != old_user.email: # Email address has changed - send a confirmation email to the old # address including a password reset link in case this is a # suspicious change. ctx = { 'user': self.request.user, 'site': get_current_site(self.request), 'reset_url': get_password_reset_url(old_user), 'new_email': new_email, } msgs = CommunicationEventType.objects.get_and_render( code=self.communication_type_code, context=ctx) Dispatcher().dispatch_user_messages(old_user, msgs) messages.success(self.request, _("Profile updated")) return HttpResponseRedirect(self.get_success_url())
def save(self, domain_override=None, subject_template_name='registration/password_reset_subject.txt', email_template_name='registration/password_reset_email.html', use_https=False, token_generator=default_token_generator, from_email=None, request=None, **kwargs): """ Generates a one-use only link for resetting password and sends to the user. """ site = get_current_site(request) if domain_override is not None: site.domain = site.name = domain_override for user in self.users_cache: # Build reset url reset_url = "%s://%s%s" % ( 'https' if use_https else 'http', site.domain, get_password_reset_url(user)) ctx = { 'user': user, 'site': site, 'reset_url': reset_url} messages = CommunicationEventType.objects.get_and_render( code=self.communication_type_code, context=ctx) Dispatcher().dispatch_user_messages(user, messages)
def get_reset_url(self, site, request, user, use_https): # the request argument isn't used currently, but implementors might # need it to determine the correct subdomain reset_url = "%s://%s%s" % ('https' if use_https else 'http', site.domain, get_password_reset_url(user)) return reset_url
def send_password_changed_email(self): user = self.request.user extra_context = { 'user': user, 'reset_url': get_password_reset_url(self.request.user), } CustomerDispatcher().send_password_changed_email_for_user(user, extra_context)
def send_password_reset_email(self, site, user): extra_context = { 'user': user, 'site': site, 'reset_url': get_password_reset_url(user), } CustomerDispatcher().send_password_reset_email_for_user( user, extra_context)
def send_email_changed_email(self, old_user, new_email): user = self.request.user extra_context = { 'user': user, 'reset_url': get_password_reset_url(old_user), 'new_email': new_email, } CustomerDispatcher().send_email_changed_email_for_user(old_user, extra_context)
def get_reset_url(self, site, request, user, use_https): # the request argument isn't used currently, but implementors might # need it to determine the correct subdomain reset_url = "%s://%s%s" % ( 'https' if use_https else 'http', site.domain, get_password_reset_url(user)) return reset_url
def form_valid(self, form): form.save() messages.success(self.request, _("Password updated")) ctx = { 'site': get_current_site(self.request), 'reset_url': get_password_reset_url(self.request.user), } msgs = CommunicationEventType.objects.get_and_render( code=self.communication_type_code, context=ctx) Dispatcher().dispatch_user_messages(self.request.user, msgs) return HttpResponseRedirect(self.get_success_url())
def test_dispatch_email_changed_user_message(self): user = User.objects.create_user('testuser', '*****@*****.**', 'somesimplepassword') CommunicationEventType.objects.create(code='EMAIL_CHANGED', name='Email Changed', category=CommunicationEventType.USER_RELATED) ctx = { 'user': user, 'site': SiteFactory(name='Test Site'), 'reset_url': get_password_reset_url(user), 'new_email': '*****@*****.**', } self._dispatch_user_messages( user, 'EMAIL_CHANGED', ctx, 'Your email address has changed at Test Site.' )
def form_valid(self, form): form.save() update_session_auth_hash(self.request, self.request.user) messages.success(self.request, _("密码更改成功")) ctx = { 'user': self.request.user, 'site': get_current_site(self.request), 'reset_url': get_password_reset_url(self.request.user), } msgs = CommunicationEventType.objects.get_and_render( code=self.communication_type_code, context=ctx) Dispatcher().dispatch_user_messages(self.request.user, msgs) return redirect(self.get_success_url())
def test_dispatch_email_changed_user_message(self): user = User.objects.create_user('testuser', '*****@*****.**', 'somesimplepassword') event_code = CustomerDispatcher.EMAIL_CHANGED_EVENT_CODE CommunicationEventType.objects.create( code=event_code, name='Email Changed', category=CommunicationEventType.USER_RELATED, ) ctx = { 'user': user, 'site': { 'name': 'test', 'domain': 'test.com' }, 'reset_url': get_password_reset_url(user), 'new_email': '*****@*****.**', } self._dispatch_user_messages( user, event_code, ctx, 'Your email address has changed at Test Site.')
def form_valid(self, form): # Grab current user instance before we save form. We may need this to # send a warning email if the email address is changed. # 在保存表单之前抓取当前用户实例。 如果更改了电子邮件地址,我们 # 可能需要此信息才能发送警告电子邮件。 try: old_user = User.objects.get(id=self.request.user.id) except User.DoesNotExist: old_user = None form.save() # We have to look up the email address from the form's # cleaned data because the object created by form.save() can # either be a user or profile instance depending whether a profile # class has been specified by the AUTH_PROFILE_MODULE setting. # 我们必须从表单的清理数据中查找电子邮件地址,因为form.save() # 创建的对象可以是用户或配置文件实例,具体取决于AUTH_PROFILE_MODULE设置 # 是否指定了配置文件类。 new_email = form.cleaned_data.get('email') if new_email and old_user and new_email != old_user.email: # Email address has changed - send a confirmation email to the old # address including a password reset link in case this is a # suspicious change. # 电子邮件地址已更改 - 如果这是可疑更改,请向旧地址发送确认电子 # 邮件,包括密码重置链接。 ctx = { 'user': self.request.user, 'site': get_current_site(self.request), 'reset_url': get_password_reset_url(old_user), 'new_email': new_email, } msgs = CommunicationEventType.objects.get_and_render( code=self.communication_type_code, context=ctx) Dispatcher().dispatch_user_messages(old_user, msgs) messages.success(self.request, _("Profile updated")) return redirect(self.get_success_url())
def save(self, domain_override=None, use_https=False, request=None, **kwargs): """ Generates a one-use only link for resetting password and sends to the user. """ site = get_current_site(request) if domain_override is not None: site.domain = site.name = domain_override email = self.cleaned_data['email'] users = User._default_manager.filter(email__iexact=email) for user in users: # Build reset url reset_url = "%s://%s%s" % ('https' if use_https else 'http', site.domain, get_password_reset_url(user)) ctx = {'user': user, 'site': site, 'reset_url': reset_url} messages = CommunicationEventType.objects.get_and_render( code=self.communication_type_code, context=ctx) Dispatcher().dispatch_user_messages(user, messages)
def test_sending_user_related_message(self): email = '*****@*****.**' user = User.objects.create_user('testuser', email, 'somesimplepassword') CommunicationEventType.objects.create( code='EMAIL_CHANGED', name='Email Changed', category=CommunicationEventType.USER_RELATED) ctx = { 'user': user, 'site': SiteFactory(name='Test Site'), 'reset_url': get_password_reset_url(user), 'new_email': '*****@*****.**', } msgs = CommunicationEventType.objects.get_and_render( code='EMAIL_CHANGED', context=ctx) Dispatcher().dispatch_user_messages(user, msgs) self.assertEqual(len(mail.outbox), 1) self.assertEquals(mail.outbox[0].subject, 'Your email address has changed at Test Site.') self.assertEquals(Email.objects.count(), 1) email = Email.objects.last() self.assertEquals(email.user.id, user.id) self.assertEquals(email.email, '*****@*****.**')
def test_dispatcher_password_reset_url(self): user = User.objects.create_user('testuser', '*****@*****.**', 'dummypassword') url = get_password_reset_url(user) self.assertTrue(url.startswith('/password-reset/confirm/'))
def get_reset_url(self, user, request): relative_url = get_password_reset_url(user) return request.build_absolute_uri(relative_url)