/shabti/templates/authplus/+package+/controllers/accounts.py_tmpl

https://bitbucket.org/gawel/shabti · Unknown · 221 lines · 180 code · 41 blank · 0 comment · 0 complexity · 25c71a393e5dee9c7325c1759b572445 MD5 · raw file

  1. from datetime import datetime
  2. import logging
  3. from pylons import url, request, response, session, tmpl_context as c
  4. from pylons.controllers.util import abort, redirect
  5. from pylons.decorators import rest, secure, jsonify
  6. from tw.mods.pylonshf import validate
  7. from {{package}}.lib.base import BaseController, render
  8. from {{package}}.lib.helpers import failure_flash, success_flash
  9. from {{package}}.lib.mail import EmailMessage
  10. from {{package}}.model import meta
  11. from {{package}}.model import *
  12. from {{package}}.forms import identity
  13. log = logging.getLogger(__name__)
  14. class AccountsController(BaseController):
  15. def __before__(self):
  16. c.active_tab = True
  17. c.active_sub = True
  18. c.openid = False
  19. @rest.dispatch_on(POST='_forgot_password')
  20. def forgot_password(self):
  21. return render('/accounts/forgot_password.mako')
  22. def verify_email(self, token):
  23. # users = list(User.by_email_token(self.db)[token])
  24. users = meta.Session.query(User).filter_by(email_token=token).all()
  25. if users:
  26. user = users[0]
  27. # If there's a email token issue (change email address), verify
  28. # its still valid
  29. if user.email_token_issue:
  30. diff = datetime.utcnow() - user.email_token_issue
  31. if diff.days > 1 or diff.seconds > 3600:
  32. failure_flash('This e-mail verification token has expired.')
  33. redirect(url('home'))
  34. user.active = True
  35. # Valid e-mail token, remove it and log the user in
  36. user.email_token = user.email_token_issue = None
  37. user.process_login()
  38. success_flash('Your email has been verified, and you have been'
  39. ' logged into PylonsHQ')
  40. redirect(url('home'))
  41. else:
  42. # No valid e-mail token
  43. failure_flash('Invalid e-mail token')
  44. redirect(url('home'))
  45. @validate(form=identity.forgot_password_form, error_handler='forgot_password')
  46. @secure.authenticate_form
  47. def _forgot_password(self):
  48. # user = list(User.by_email(self.db)[self.form_result['email_address']])[0]
  49. user = meta.Session.query(User).by_email(self.form_result['email_address']).all()[0]
  50. user.password_token = user.generate_token()
  51. c.password_token = user.password_token
  52. user.password_token_issue = datetime.utcnow()
  53. # user.store(self.db)
  54. meta.Session.commit()
  55. message = EmailMessage(subject="PylonsHQ - Lost Password",
  56. body=render('/email/lost_password.mako'),
  57. from_email="PylonsHQ <pylonshq@groovie.org>",
  58. to=[self.form_result['email_address']])
  59. message.send(fail_silently=True)
  60. success_flash('An e-mail has been sent to your account to verify the password reset request.')
  61. redirect(url('account_login'))
  62. @rest.dispatch_on(POST='_change_password')
  63. def change_password(self, token):
  64. # users = list(User.by_password_token(self.db)[token])
  65. users = meta.Session.query(User).by_email_token(token).all()
  66. if not users:
  67. failure_flash('That password token is no longer valid.')
  68. redirect(url('account_login'))
  69. user = users[0]
  70. diff = datetime.utcnow() - user.password_token_issue
  71. if diff.days > 1 or diff.seconds > 3600:
  72. failure_flash('Password token is no longer valid, please make a new password reset request.')
  73. redirect(url('forgot_password'))
  74. return render('/accounts/change_password.mako')
  75. @validate(form=identity.change_password_form, error_handler='change_password')
  76. @secure.authenticate_form
  77. def _change_password(self, token):
  78. users = meta.Session.query(User).by_password_token(token).all() or abort(401)
  79. # users = list(User.by_password_token(self.db)[token]) or abort(401)
  80. user = users[0]
  81. diff = datetime.utcnow() - user.password_token_issue
  82. if diff.days > 1 or diff.seconds > 3600:
  83. failure_flash('Password token is no longer valid, please make a new password reset request.')
  84. redirect(url('forgot_password'))
  85. user.password_token = user.password_token_issue = None
  86. user.password = user.hash_password(self.form_result['password'])
  87. # user.store(self.db)
  88. meta.Session.commit()
  89. success_flash('Your password has been reset successfully')
  90. redirect(url('account_login'))
  91. def logout(self):
  92. if hasattr(c, 'user') and c.user:
  93. c.user.session_id = None
  94. # c.user.store(self.db)
  95. meta.Session.commit()
  96. session.clear()
  97. session.save()
  98. success_flash('You have logged out of your session')
  99. redirect(url('home'))
  100. @rest.dispatch_on(POST='_process_login')
  101. def login(self):
  102. redir = request.GET.get('redir')
  103. if redir and redir.startswith('/'):
  104. session['redirect'] = str(redir)
  105. session.save()
  106. return render('/accounts/login.mako')
  107. @validate(form=identity.login_form, error_handler='login')
  108. @secure.authenticate_form
  109. def _process_login(self):
  110. user = self.form_result['user']
  111. user.process_login()
  112. success_flash('You have logged into PylonsHQ')
  113. if session.get('redirect'):
  114. redir_url = session.pop('redirect')
  115. session.save()
  116. redirect(url(**redir_url))
  117. redirect(url('home'))
  118. @rest.dispatch_on(POST='_process_openid_associate')
  119. def openid_associate(self):
  120. openid_url = session.get('openid_identity')
  121. if not openid_url:
  122. redirect(url('account_register'))
  123. c.openid = openid_url
  124. return render('/accounts/associate.mako')
  125. @validate(form=identity.login_form, error_handler='login')
  126. def _process_openid_associate(self):
  127. openid_url = session.get('openid_identity')
  128. user = self.form_result['user']
  129. if user.openids:
  130. user.openids.append(openid_url)
  131. else:
  132. user.openids = [openid_url]
  133. user.process_login()
  134. success_flash('You have associated your OpenID to your account, and signed in')
  135. if session.get('redirect'):
  136. redir_url = session.pop('redirect')
  137. session.save()
  138. redirect(url(**redir_url))
  139. redirect(url('home'))
  140. @rest.dispatch_on(POST='_process_openid_registration')
  141. def openid_register(self):
  142. openid_url = session.get('openid_identity')
  143. if not openid_url:
  144. redirect(url('account_register'))
  145. c.openid = session.get('openid_identity')
  146. c.defaults = {}
  147. return render('/accounts/register.mako')
  148. @validate(form=identity.openid_registration_form, error_handler='openid_register')
  149. def _process_openid_registration(self):
  150. new_user = User(displayname=self.form_result['displayname'],
  151. timezone = self.form_result['timezone'],
  152. email=self.form_result['email_address'])
  153. new_openid = OpenID(text=session['openid_identity'])
  154. new_user.openids.append(new_openid)
  155. return self._finish_registration(new_user)
  156. @rest.dispatch_on(POST='_process_registration')
  157. def register(self):
  158. return render('/accounts/register.mako')
  159. @validate(form=identity.registration_form, error_handler='register')
  160. @secure.authenticate_form
  161. def _process_registration(self):
  162. new_user = User(displayname=self.form_result['displayname'],
  163. timezone = self.form_result['timezone'],
  164. email=self.form_result['email_address'])
  165. new_user.password = User.hash_password(self.form_result['password'])
  166. return self._finish_registration(new_user)
  167. def _finish_registration(self, user):
  168. user.email_token = c.email_token = user.generate_token()
  169. user.email_token_issue = datetime.utcnow()
  170. # user.store(self.db)
  171. meta.Session.commit()
  172. # Send out the welcome email with the reg token
  173. message = EmailMessage(subject="PylonsHQ - Registration Confirmation",
  174. body=render('/email/register.mako'),
  175. from_email="PylonsHQ <pylonshq@groovie.org>",
  176. to=[self.form_result['email_address']])
  177. message.send(fail_silently=True)
  178. success_flash("User account '%s' created successfully. An e-mail has"
  179. " been sent to activate your account." % user.displayname)
  180. redirect(url('home'))