Cloud computing coursework:Saas 图片社交网站
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

191 lines
6.9 KiB

3 years ago
  1. # -*- coding: utf-8 -*-
  2. from flask import render_template, flash, Blueprint, request, current_app
  3. from flask_login import login_required
  4. from phshare.decorators import admin_required, permission_required
  5. from phshare.extensions import db
  6. from phshare.forms.admin import EditProfileAdminForm
  7. from phshare.models import Role, User, Tag, Photo, Comment
  8. from phshare.utils import redirect_back
  9. admin_bp = Blueprint('admin', __name__)
  10. @admin_bp.route('/')
  11. @login_required
  12. @permission_required('MODERATE')
  13. def index():
  14. user_count = User.query.count()
  15. locked_user_count = User.query.filter_by(locked=True).count()
  16. blocked_user_count = User.query.filter_by(active=False).count()
  17. photo_count = Photo.query.count()
  18. reported_photos_count = Photo.query.filter(Photo.flag > 0).count()
  19. tag_count = Tag.query.count()
  20. comment_count = Comment.query.count()
  21. reported_comments_count = Comment.query.filter(Comment.flag > 0).count()
  22. return render_template('admin/index.html', user_count=user_count, photo_count=photo_count,
  23. tag_count=tag_count, comment_count=comment_count, locked_user_count=locked_user_count,
  24. blocked_user_count=blocked_user_count, reported_comments_count=reported_comments_count,
  25. reported_photos_count=reported_photos_count)
  26. @admin_bp.route('/profile/<int:user_id>', methods=['GET', 'POST'])
  27. @login_required
  28. @admin_required
  29. def edit_profile_admin(user_id):
  30. user = User.query.get_or_404(user_id)
  31. form = EditProfileAdminForm(user=user)
  32. if form.validate_on_submit():
  33. user.name = form.name.data
  34. role = Role.query.get(form.role.data)
  35. if role.name == 'Locked':
  36. user.lock()
  37. user.role = role
  38. user.bio = form.bio.data
  39. user.website = form.website.data
  40. user.confirmed = form.confirmed.data
  41. user.active = form.active.data
  42. user.location = form.location.data
  43. user.username = form.username.data
  44. user.email = form.email.data
  45. db.session.commit()
  46. flash('Profile updated.', 'success')
  47. return redirect_back()
  48. form.name.data = user.name
  49. form.role.data = user.role_id
  50. form.bio.data = user.bio
  51. form.website.data = user.website
  52. form.location.data = user.location
  53. form.username.data = user.username
  54. form.email.data = user.email
  55. form.confirmed.data = user.confirmed
  56. form.active.data = user.active
  57. return render_template('admin/edit_profile.html', form=form, user=user)
  58. @admin_bp.route('/block/user/<int:user_id>', methods=['POST'])
  59. @login_required
  60. @permission_required('MODERATE')
  61. def block_user(user_id):
  62. user = User.query.get_or_404(user_id)
  63. if user.role.name in ['Administrator', 'Moderator']:
  64. flash('Permission denied.', 'warning')
  65. else:
  66. user.block()
  67. flash('Account blocked.', 'info')
  68. return redirect_back()
  69. @admin_bp.route('/unblock/user/<int:user_id>', methods=['POST'])
  70. @login_required
  71. @permission_required('MODERATE')
  72. def unblock_user(user_id):
  73. user = User.query.get_or_404(user_id)
  74. user.unblock()
  75. flash('Block canceled.', 'info')
  76. return redirect_back()
  77. @admin_bp.route('/lock/user/<int:user_id>', methods=['POST'])
  78. @login_required
  79. @permission_required('MODERATE')
  80. def lock_user(user_id):
  81. user = User.query.get_or_404(user_id)
  82. if user.role.name in ['Administrator', 'Moderator']:
  83. flash('Permission denied.', 'warning')
  84. else:
  85. user.lock()
  86. flash('Account locked.', 'info')
  87. return redirect_back()
  88. @admin_bp.route('/unlock/user/<int:user_id>', methods=['POST'])
  89. @login_required
  90. @permission_required('MODERATE')
  91. def unlock_user(user_id):
  92. user = User.query.get_or_404(user_id)
  93. user.unlock()
  94. flash('Lock canceled.', 'info')
  95. return redirect_back()
  96. @admin_bp.route('/delete/tag/<int:tag_id>', methods=['GET', 'POST'])
  97. @login_required
  98. @permission_required('MODERATE')
  99. def delete_tag(tag_id):
  100. tag = Tag.query.get_or_404(tag_id)
  101. db.session.delete(tag)
  102. db.session.commit()
  103. flash('Tag deleted.', 'info')
  104. return redirect_back()
  105. @admin_bp.route('/manage/user')
  106. @login_required
  107. @permission_required('MODERATE')
  108. def manage_user():
  109. filter_rule = request.args.get('filter', 'all') # 'all', 'locked', 'blocked', 'administrator', 'moderator'
  110. page = request.args.get('page', 1, type=int)
  111. per_page = current_app.config['PHSHARE_MANAGE_USER_PER_PAGE']
  112. administrator = Role.query.filter_by(name='Administrator').first()
  113. moderator = Role.query.filter_by(name='Moderator').first()
  114. if filter_rule == 'locked':
  115. filtered_users = User.query.filter_by(locked=True)
  116. elif filter_rule == 'blocked':
  117. filtered_users = User.query.filter_by(active=False)
  118. elif filter_rule == 'administrator':
  119. filtered_users = User.query.filter_by(role=administrator)
  120. elif filter_rule == 'moderator':
  121. filtered_users = User.query.filter_by(role=moderator)
  122. else:
  123. filtered_users = User.query
  124. pagination = filtered_users.order_by(User.member_since.desc()).paginate(page, per_page)
  125. users = pagination.items
  126. return render_template('admin/manage_user.html', pagination=pagination, users=users)
  127. @admin_bp.route('/manage/photo', defaults={'order': 'by_flag'})
  128. @admin_bp.route('/manage/photo/<order>')
  129. @login_required
  130. @permission_required('MODERATE')
  131. def manage_photo(order):
  132. page = request.args.get('page', 1, type=int)
  133. per_page = current_app.config['PHSHARE_MANAGE_PHOTO_PER_PAGE']
  134. order_rule = 'flag'
  135. if order == 'by_time':
  136. pagination = Photo.query.order_by(Photo.timestamp.desc()).paginate(page, per_page)
  137. order_rule = 'time'
  138. else:
  139. pagination = Photo.query.order_by(Photo.flag.desc()).paginate(page, per_page)
  140. photos = pagination.items
  141. return render_template('admin/manage_photo.html', pagination=pagination, photos=photos, order_rule=order_rule)
  142. @admin_bp.route('/manage/tag')
  143. @login_required
  144. @permission_required('MODERATE')
  145. def manage_tag():
  146. page = request.args.get('page', 1, type=int)
  147. per_page = current_app.config['PHSHARE_MANAGE_TAG_PER_PAGE']
  148. pagination = Tag.query.order_by(Tag.id.desc()).paginate(page, per_page)
  149. tags = pagination.items
  150. return render_template('admin/manage_tag.html', pagination=pagination, tags=tags)
  151. @admin_bp.route('/manage/comment', defaults={'order': 'by_flag'})
  152. @admin_bp.route('/manage/comment/<order>')
  153. @login_required
  154. @permission_required('MODERATE')
  155. def manage_comment(order):
  156. page = request.args.get('page', 1, type=int)
  157. per_page = current_app.config['PHSHARE_MANAGE_COMMENT_PER_PAGE']
  158. order_rule = 'flag'
  159. if order == 'by_time':
  160. pagination = Comment.query.order_by(Comment.timestamp.desc()).paginate(page, per_page)
  161. order_rule = 'time'
  162. else:
  163. pagination = Comment.query.order_by(Comment.flag.desc()).paginate(page, per_page)
  164. comments = pagination.items
  165. return render_template('admin/manage_comment.html', pagination=pagination, comments=comments, order_rule=order_rule)