passwords.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. # coding=utf-8
  2. from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm
  3. from django.contrib.auth.tokens import default_token_generator
  4. from django.contrib.auth.views import PasswordResetConfirmView as password_reset_confirm
  5. from django.template.response import TemplateResponse
  6. from django.utils.translation import ugettext as _
  7. from xadmin.sites import site
  8. from xadmin.views.base import BaseAdminPlugin, BaseAdminView, csrf_protect_m
  9. from xadmin.views.website import LoginView
  10. class ResetPasswordSendView(BaseAdminView):
  11. need_site_permission = False
  12. password_reset_form = PasswordResetForm
  13. password_reset_template = 'xadmin/auth/password_reset/form.html'
  14. password_reset_done_template = 'xadmin/auth/password_reset/done.html'
  15. password_reset_token_generator = default_token_generator
  16. password_reset_from_email = None
  17. password_reset_email_template = 'xadmin/auth/password_reset/email.html'
  18. password_reset_subject_template = None
  19. def get(self, request, *args, **kwargs):
  20. context = super(ResetPasswordSendView, self).get_context()
  21. context['form'] = kwargs.get('form', self.password_reset_form())
  22. return TemplateResponse(request, self.password_reset_template, context)
  23. @csrf_protect_m
  24. def post(self, request, *args, **kwargs):
  25. form = self.password_reset_form(request.POST)
  26. if form.is_valid():
  27. opts = {
  28. 'use_https': request.is_secure(),
  29. 'token_generator': self.password_reset_token_generator,
  30. 'email_template_name': self.password_reset_email_template,
  31. 'request': request,
  32. 'domain_override': request.get_host()
  33. }
  34. if self.password_reset_from_email:
  35. opts['from_email'] = self.password_reset_from_email
  36. if self.password_reset_subject_template:
  37. opts['subject_template_name'] = self.password_reset_subject_template
  38. form.save(**opts)
  39. context = super(ResetPasswordSendView, self).get_context()
  40. return TemplateResponse(request, self.password_reset_done_template, context)
  41. else:
  42. return self.get(request, form=form)
  43. site.register_view(r'^xadmin/password_reset/$', ResetPasswordSendView, name='xadmin_password_reset')
  44. class ResetLinkPlugin(BaseAdminPlugin):
  45. def block_form_bottom(self, context, nodes):
  46. reset_link = self.get_admin_url('xadmin_password_reset')
  47. return '<div class="text-info" style="margin-top:15px;"><a href="%s"><i class="fa fa-question-sign"></i> %s</a></div>' % (reset_link, _('Forgotten your password or username?'))
  48. site.register_plugin(ResetLinkPlugin, LoginView)
  49. class ResetPasswordComfirmView(BaseAdminView):
  50. need_site_permission = False
  51. password_reset_set_form = SetPasswordForm
  52. password_reset_confirm_template = 'xadmin/auth/password_reset/confirm.html'
  53. password_reset_token_generator = default_token_generator
  54. def do_view(self, request, uidb36, token, *args, **kwargs):
  55. context = super(ResetPasswordComfirmView, self).get_context()
  56. return password_reset_confirm(request, uidb36, token,
  57. template_name=self.password_reset_confirm_template,
  58. token_generator=self.password_reset_token_generator,
  59. set_password_form=self.password_reset_set_form,
  60. post_reset_redirect=self.get_admin_url('xadmin_password_reset_complete'),
  61. current_app=self.admin_site.name, extra_context=context)
  62. def get(self, request, uidb36, token, *args, **kwargs):
  63. return self.do_view(request, uidb36, token)
  64. def post(self, request, uidb36, token, *args, **kwargs):
  65. return self.do_view(request, uidb36, token)
  66. def get_media(self):
  67. return super(ResetPasswordComfirmView, self).get_media() + \
  68. self.vendor('xadmin.page.form.js', 'xadmin.form.css')
  69. site.register_view(r'^xadmin/password_reset/(?P<uidb36>[0-9A-Za-z]{1,13})-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
  70. ResetPasswordComfirmView, name='xadmin_password_reset_confirm')
  71. class ResetPasswordCompleteView(BaseAdminView):
  72. need_site_permission = False
  73. password_reset_complete_template = 'xadmin/auth/password_reset/complete.html'
  74. def get(self, request, *args, **kwargs):
  75. context = super(ResetPasswordCompleteView, self).get_context()
  76. context['login_url'] = self.get_admin_url('index')
  77. return TemplateResponse(request, self.password_reset_complete_template, context)
  78. site.register_view(r'^xadmin/password_reset/complete/$', ResetPasswordCompleteView, name='xadmin_password_reset_complete')