views.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.user.views
  4. ~~~~~~~~~~~~~~~~~~
  5. The user view handles the user profile
  6. and the user settings from a signed in user.
  7. :copyright: (c) 2014 by the FlaskBB Team.
  8. :license: BSD, see LICENSE for more details.
  9. """
  10. import logging
  11. from flask import Blueprint, flash, request
  12. from flask.views import MethodView
  13. from flask_babelplus import gettext as _
  14. from flask_login import current_user, login_required
  15. from flaskbb.user.forms import (ChangeEmailForm, ChangePasswordForm,
  16. ChangeUserDetailsForm, GeneralSettingsForm)
  17. from flaskbb.user.models import User
  18. from flaskbb.utils.helpers import (get_available_languages,
  19. get_available_themes, register_view,
  20. render_template)
  21. logger = logging.getLogger(__name__)
  22. user = Blueprint("user", __name__)
  23. class UserSettings(MethodView):
  24. decorators = [login_required]
  25. form = GeneralSettingsForm
  26. def get(self):
  27. form = self.form()
  28. form.theme.choices = get_available_themes()
  29. form.language.choices = get_available_languages()
  30. form.theme.data = current_user.theme
  31. form.language.data = current_user.language
  32. return render_template("user/general_settings.html", form=form)
  33. def post(self):
  34. form = self.form()
  35. form.theme.choices = get_available_themes()
  36. form.language.choices = get_available_languages()
  37. if form.validate_on_submit():
  38. current_user.theme = form.theme.data
  39. current_user.language = form.language.data
  40. current_user.save()
  41. flash(_("Settings updated."), "success")
  42. else:
  43. form.theme.data = current_user.theme
  44. form.language.data = current_user.language
  45. return render_template("user/general_settings.html", form=form)
  46. class ChangePassword(MethodView):
  47. decorators = [login_required]
  48. form = ChangePasswordForm
  49. def get(self):
  50. return render_template("user/change_password.html", form=self.form())
  51. def post(self):
  52. form = self.form()
  53. if form.validate_on_submit():
  54. current_user.password = form.new_password.data
  55. current_user.save()
  56. flash(_("Password updated."), "success")
  57. return render_template("user/change_password.html", form=form)
  58. class ChangeEmail(MethodView):
  59. decorators = [login_required]
  60. form = ChangeEmailForm
  61. def get(self):
  62. return render_template("user/change_email.html", form=self.form(current_user))
  63. def post(self):
  64. form = self.form(current_user)
  65. if form.validate_on_submit():
  66. current_user.email = form.new_email.data
  67. current_user.save()
  68. flash(_("Email address updated."), "success")
  69. return render_template("user/change_email.html", form=form)
  70. class ChangeUserDetails(MethodView):
  71. decorators = [login_required]
  72. form = ChangeUserDetailsForm
  73. def get(self):
  74. return render_template("user/change_user_details.html", form=self.form(obj=current_user))
  75. def post(self):
  76. form = self.form(obj=current_user)
  77. if form.validate_on_submit():
  78. form.populate_obj(current_user)
  79. current_user.save()
  80. flash(_("User details updated."), "success")
  81. return render_template("user/change_user_details.html", form=form)
  82. class AllUserTopics(MethodView):
  83. def get(self, username):
  84. page = request.args.get("page", 1, type=int)
  85. user = User.query.filter_by(username=username).first_or_404()
  86. topics = user.all_topics(page, current_user)
  87. return render_template("user/all_topics.html", user=user, topics=topics)
  88. class AllUserPosts(MethodView):
  89. def get(self, username):
  90. page = request.args.get("page", 1, type=int)
  91. user = User.query.filter_by(username=username).first_or_404()
  92. posts = user.all_posts(page, current_user)
  93. return render_template("user/all_posts.html", user=user, posts=posts)
  94. class UserProfile(MethodView):
  95. def get(self, username):
  96. user = User.query.filter_by(username=username).first_or_404()
  97. return render_template("user/profile.html", user=user)
  98. register_view(user, routes=['/settings/email'], view_func=ChangeEmail.as_view('change_email'))
  99. register_view(user, routes=['/settings/general'], view_func=UserSettings.as_view('settings'))
  100. register_view(
  101. user, routes=['/settings/password'], view_func=ChangePassword.as_view('change_password')
  102. )
  103. register_view(
  104. user,
  105. routes=["/settings/user-details"],
  106. view_func=ChangeUserDetails.as_view('change_user_details')
  107. )
  108. register_view(user, routes=['/<username>/posts'], view_func=AllUserPosts.as_view('view_all_posts'))
  109. register_view(
  110. user, routes=['/<username>/topics'], view_func=AllUserTopics.as_view('view_all_topics')
  111. )
  112. register_view(user, routes=['/<username>'], view_func=UserProfile.as_view('profile'))