views.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2016 jianglin
  5. # File Name: views.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2016-10-28 10:26:10 (CST)
  9. # Last Update:星期六 2017-4-8 12:40:29 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from random import sample
  14. from string import ascii_letters, digits
  15. from flask import current_app, redirect, render_template, request, url_for
  16. from flask.views import MethodView
  17. from flask_babelex import gettext as _
  18. from flask_login import current_user, login_required, login_user, logout_user
  19. from flask_principal import Identity, identity_changed, AnonymousIdentity
  20. from flask_maple.auth.forms import (ForgetForm, LoginForm, RegisterForm,
  21. form_validate)
  22. from forums.api.user.models import User
  23. from forums.common.response import HTTPResponse
  24. from forums.common.serializer import Serializer
  25. from forums.permission import is_guest
  26. from forums.count import Count
  27. class LoginView(MethodView):
  28. @is_guest
  29. def get(self):
  30. form = LoginForm()
  31. data = {'form': form}
  32. return render_template('auth/login.html', **data)
  33. @form_validate(LoginForm)
  34. def post(self):
  35. form = LoginForm()
  36. post_data = form.data
  37. username = post_data.pop('username', None)
  38. password = post_data.pop('password', None)
  39. remember = post_data.pop('remember', None)
  40. remember = True if remember else None
  41. user = User.query.filter_by(username=username).first()
  42. if user and user.check_password(password):
  43. login_user(user, remember=remember)
  44. identity_changed.send(
  45. current_app._get_current_object(), identity=Identity(user.id))
  46. serializer = Serializer(user, many=False, depth=1)
  47. return HTTPResponse(
  48. HTTPResponse.NORMAL_STATUS, data=serializer.data).to_response()
  49. return HTTPResponse(
  50. HTTPResponse.AUTH_USER_OR_PASSWORD_ERROR).to_response()
  51. class LogoutView(MethodView):
  52. @login_required
  53. def get(self):
  54. logout_user()
  55. identity_changed.send(
  56. current_app._get_current_object(), identity=AnonymousIdentity())
  57. return redirect(request.args.get('next') or '/')
  58. class RegisterView(MethodView):
  59. @is_guest
  60. def get(self):
  61. form = RegisterForm()
  62. data = {'form': form}
  63. return render_template('auth/register.html', **data)
  64. @form_validate(RegisterForm)
  65. def post(self):
  66. form = RegisterForm()
  67. post_data = form.data
  68. username = post_data.pop('username', None)
  69. email = post_data.pop('email', None)
  70. password = post_data.pop('password', None)
  71. user = User.query.filter_by(username=username).first()
  72. if user is not None:
  73. return HTTPResponse(HTTPResponse.AUTH_USERNAME_UNIQUE).to_response(
  74. )
  75. user = User.query.filter_by(email=email).first()
  76. if user is not None:
  77. return HTTPResponse(HTTPResponse.AUTH_EMAIL_UNIQUE).to_response()
  78. user = User(username=username, email=email)
  79. user.set_password(password)
  80. user.save()
  81. login_user(user)
  82. Count.forums_user_count(1)
  83. self.email(user)
  84. return HTTPResponse(HTTPResponse.NORMAL_STATUS).to_response()
  85. def email(self, user):
  86. token = user.email_token
  87. confirm_url = url_for(
  88. 'auth.confirm_token', token=token, _external=True)
  89. html = render_template('templet/email.html', confirm_url=confirm_url)
  90. subject = _("Please confirm your email!")
  91. user.send_email(subject=subject, html=html)
  92. user.send_email_to_admin()
  93. class ForgetView(MethodView):
  94. @is_guest
  95. def get(self):
  96. form = ForgetForm()
  97. data = {'form': form}
  98. return render_template('auth/forget.html', **data)
  99. @form_validate(ForgetForm)
  100. def post(self):
  101. form = ForgetForm()
  102. post_data = form.data
  103. email = post_data.pop('email', None)
  104. user = User.query.filter_by(email=email).first()
  105. if not user:
  106. return HTTPResponse(
  107. HTTPResponse.AUTH_EMAIL_NOT_REGISTER).to_response()
  108. password = ''.join(sample(ascii_letters + digits, 12))
  109. user.set_password(password)
  110. user.save()
  111. html = render_template('templet/forget.html', confirm_url=password)
  112. subject = "Please update your password in time"
  113. user.send_email(html=html, subject=subject)
  114. return HTTPResponse(HTTPResponse.NORMAL_STATUS).to_response()
  115. class ConfirmView(MethodView):
  116. @login_required
  117. def post(self):
  118. user = request.user
  119. if user.is_confirmed:
  120. return HTTPResponse(
  121. HTTPResponse.AUTH_USER_IS_CONFIRMED).to_response()
  122. if not user.email_is_allowed:
  123. msg = "user isn't allowed to send email"
  124. return HTTPResponse(
  125. HTTPResponse.AUTH_USER_IS_CONFIRMED, message=msg).to_response()
  126. token = user.email_token
  127. confirm_url = url_for(
  128. 'auth.confirm_token', token=token, _external=True)
  129. html = render_template('templet/email.html', confirm_url=confirm_url)
  130. subject = _("Please confirm your email")
  131. user.send_email(html=html, subject=subject)
  132. return HTTPResponse(
  133. HTTPResponse.NORMAL_STATUS, message='send success').to_response()
  134. class ConfirmTokenView(MethodView):
  135. def get(self, token):
  136. user = User.check_email_token(token)
  137. if not user:
  138. return HTTPResponse(
  139. HTTPResponse.AUTH_TOKEN_VERIFY_FAIL).to_response()
  140. if user.is_confirmed:
  141. return HTTPResponse(
  142. HTTPResponse.AUTH_USER_IS_CONFIRMED).to_response()
  143. user.is_confirmed = True
  144. user.save()
  145. return HTTPResponse(HTTPResponse.NORMAL_STATUS).to_response()