views.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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 pluggy import HookimplMarker
  16. from flaskbb.user.forms import (ChangeEmailForm, ChangePasswordForm,
  17. ChangeUserDetailsForm, GeneralSettingsForm)
  18. from flaskbb.user.models import User
  19. from flaskbb.utils.helpers import (get_available_languages,
  20. get_available_themes, register_view,
  21. render_template)
  22. impl = HookimplMarker('flaskbb')
  23. logger = logging.getLogger(__name__)
  24. class UserSettings(MethodView):
  25. decorators = [login_required]
  26. form = GeneralSettingsForm
  27. def get(self):
  28. form = self.form()
  29. form.theme.choices = get_available_themes()
  30. form.theme.choices.insert(0, ('', 'Default'))
  31. form.language.choices = get_available_languages()
  32. form.theme.data = current_user.theme
  33. form.language.data = current_user.language
  34. return render_template("user/general_settings.html", form=form)
  35. def post(self):
  36. form = self.form()
  37. form.theme.choices = get_available_themes()
  38. form.theme.choices.insert(0, ('', 'Default'))
  39. form.language.choices = get_available_languages()
  40. if form.validate_on_submit():
  41. current_user.theme = form.theme.data
  42. current_user.language = form.language.data
  43. current_user.save()
  44. flash(_("Settings updated."), "success")
  45. else:
  46. form.theme.data = current_user.theme
  47. form.language.data = current_user.language
  48. return render_template("user/general_settings.html", form=form)
  49. class ChangePassword(MethodView):
  50. decorators = [login_required]
  51. form = ChangePasswordForm
  52. def get(self):
  53. return render_template("user/change_password.html", form=self.form())
  54. def post(self):
  55. form = self.form()
  56. if form.validate_on_submit():
  57. current_user.password = form.new_password.data
  58. current_user.save()
  59. flash(_("Password updated."), "success")
  60. return render_template("user/change_password.html", form=form)
  61. class ChangeEmail(MethodView):
  62. decorators = [login_required]
  63. form = ChangeEmailForm
  64. def get(self):
  65. return render_template(
  66. "user/change_email.html", form=self.form(current_user)
  67. )
  68. def post(self):
  69. form = self.form(current_user)
  70. if form.validate_on_submit():
  71. current_user.email = form.new_email.data
  72. current_user.save()
  73. flash(_("Email address updated."), "success")
  74. return render_template("user/change_email.html", form=form)
  75. class ChangeUserDetails(MethodView):
  76. decorators = [login_required]
  77. form = ChangeUserDetailsForm
  78. def get(self):
  79. return render_template(
  80. "user/change_user_details.html", form=self.form(obj=current_user)
  81. )
  82. def post(self):
  83. form = self.form(obj=current_user)
  84. if form.validate_on_submit():
  85. form.populate_obj(current_user)
  86. current_user.save()
  87. flash(_("User details updated."), "success")
  88. return render_template("user/change_user_details.html", form=form)
  89. class AllUserTopics(MethodView):
  90. def get(self, username):
  91. page = request.args.get("page", 1, type=int)
  92. user = User.query.filter_by(username=username).first_or_404()
  93. topics = user.all_topics(page, current_user)
  94. return render_template("user/all_topics.html", user=user, topics=topics)
  95. class AllUserPosts(MethodView):
  96. def get(self, username):
  97. page = request.args.get("page", 1, type=int)
  98. user = User.query.filter_by(username=username).first_or_404()
  99. posts = user.all_posts(page, current_user)
  100. return render_template("user/all_posts.html", user=user, posts=posts)
  101. class UserProfile(MethodView):
  102. def get(self, username):
  103. user = User.query.filter_by(username=username).first_or_404()
  104. return render_template("user/profile.html", user=user)
  105. @impl(tryfirst=True)
  106. def flaskbb_load_blueprints(app):
  107. user = Blueprint("user", __name__)
  108. register_view(
  109. user,
  110. routes=['/settings/email'],
  111. view_func=ChangeEmail.as_view('change_email')
  112. )
  113. register_view(
  114. user,
  115. routes=['/settings/general'],
  116. view_func=UserSettings.as_view('settings')
  117. )
  118. register_view(
  119. user,
  120. routes=['/settings/password'],
  121. view_func=ChangePassword.as_view('change_password')
  122. )
  123. register_view(
  124. user,
  125. routes=["/settings/user-details"],
  126. view_func=ChangeUserDetails.as_view('change_user_details')
  127. )
  128. register_view(
  129. user,
  130. routes=['/<username>/posts'],
  131. view_func=AllUserPosts.as_view('view_all_posts')
  132. )
  133. register_view(
  134. user,
  135. routes=['/<username>/topics'],
  136. view_func=AllUserTopics.as_view('view_all_topics')
  137. )
  138. register_view(
  139. user, routes=['/<username>'], view_func=UserProfile.as_view('profile')
  140. )
  141. app.register_blueprint(user, url_prefix=app.config["USER_URL_PREFIX"])