mirror of
https://github.com/simon987/nyaa.git
synced 2025-12-18 01:09:03 +00:00
Move /user/<user_name> route into a blueprint
Move supporting functions and variables into other files * nyaa.utils: - cached_function - chain_get * nyaa.search: - DEFAULT_MAX_SEARCH_RESULT - DEFAULT_PER_PAGE - SERACH_PAGINATE_DISPLAY_MSG - _generate_query_string
This commit is contained in:
@@ -2,8 +2,10 @@ from nyaa.views import (
|
||||
account,
|
||||
admin,
|
||||
site,
|
||||
users,
|
||||
)
|
||||
|
||||
account_bp = account.bp
|
||||
admin_bp = admin.bp
|
||||
site_bp = site.bp
|
||||
users_bp = users.bp
|
||||
|
||||
@@ -46,19 +46,19 @@ def view_reports():
|
||||
log = log.format(report_id, 'Deleted', torrent_id,
|
||||
flask.url_for('view_torrent', torrent_id=torrent_id),
|
||||
report_user.username,
|
||||
flask.url_for('view_user', user_name=report_user.username))
|
||||
flask.url_for('users.view_user', user_name=report_user.username))
|
||||
elif action == 'hide':
|
||||
log = log.format(report_id, 'Hid', torrent_id,
|
||||
flask.url_for('view_torrent', torrent_id=torrent_id),
|
||||
report_user.username,
|
||||
flask.url_for('view_user', user_name=report_user.username))
|
||||
flask.url_for('users.view_user', user_name=report_user.username))
|
||||
torrent.hidden = True
|
||||
report.status = 1
|
||||
else:
|
||||
log = log.format(report_id, 'Closed', torrent_id,
|
||||
flask.url_for('view_torrent', torrent_id=torrent_id),
|
||||
report_user.username,
|
||||
flask.url_for('view_user', user_name=report_user.username))
|
||||
flask.url_for('users.view_user', user_name=report_user.username))
|
||||
report.status = 2
|
||||
|
||||
adminlog = models.AdminLog(log=log, admin_id=flask.g.user.id)
|
||||
|
||||
156
nyaa/views/users.py
Normal file
156
nyaa/views/users.py
Normal file
@@ -0,0 +1,156 @@
|
||||
import math
|
||||
|
||||
import flask
|
||||
from flask_paginate import Pagination
|
||||
|
||||
from nyaa import app, db, forms, models
|
||||
from nyaa.search import (DEFAULT_MAX_SEARCH_RESULT, DEFAULT_PER_PAGE, SERACH_PAGINATE_DISPLAY_MSG,
|
||||
_generate_query_string, search_db, search_elastic)
|
||||
from nyaa.utils import chain_get
|
||||
|
||||
bp = flask.Blueprint('users', __name__)
|
||||
|
||||
|
||||
@bp.route('/user/<user_name>', methods=['GET', 'POST'])
|
||||
def view_user(user_name):
|
||||
user = models.User.by_username(user_name)
|
||||
|
||||
if not user:
|
||||
flask.abort(404)
|
||||
|
||||
admin_form = None
|
||||
if flask.g.user and flask.g.user.is_moderator and flask.g.user.level > user.level:
|
||||
admin_form = forms.UserForm()
|
||||
default, admin_form.user_class.choices = _create_user_class_choices(user)
|
||||
if flask.request.method == 'GET':
|
||||
admin_form.user_class.data = default
|
||||
|
||||
url = flask.url_for('users.view_user', user_name=user.username)
|
||||
if flask.request.method == 'POST' and admin_form and admin_form.validate():
|
||||
selection = admin_form.user_class.data
|
||||
log = None
|
||||
if selection == 'regular':
|
||||
user.level = models.UserLevelType.REGULAR
|
||||
log = "[{}]({}) changed to regular user".format(user_name, url)
|
||||
elif selection == 'trusted':
|
||||
user.level = models.UserLevelType.TRUSTED
|
||||
log = "[{}]({}) changed to trusted user".format(user_name, url)
|
||||
elif selection == 'moderator':
|
||||
user.level = models.UserLevelType.MODERATOR
|
||||
log = "[{}]({}) changed to moderator user".format(user_name, url)
|
||||
elif selection == 'banned':
|
||||
user.status = models.UserStatusType.BANNED
|
||||
log = "[{}]({}) changed to banned user".format(user_name, url)
|
||||
|
||||
adminlog = models.AdminLog(log=log, admin_id=flask.g.user.id)
|
||||
db.session.add(user)
|
||||
db.session.add(adminlog)
|
||||
db.session.commit()
|
||||
|
||||
return flask.redirect(url)
|
||||
|
||||
user_level = ['Regular', 'Trusted', 'Moderator', 'Administrator'][user.level]
|
||||
|
||||
req_args = flask.request.args
|
||||
|
||||
search_term = chain_get(req_args, 'q', 'term')
|
||||
|
||||
sort_key = req_args.get('s')
|
||||
sort_order = req_args.get('o')
|
||||
|
||||
category = chain_get(req_args, 'c', 'cats')
|
||||
quality_filter = chain_get(req_args, 'f', 'filter')
|
||||
|
||||
page_number = chain_get(req_args, 'p', 'page', 'offset')
|
||||
try:
|
||||
page_number = max(1, int(page_number))
|
||||
except (ValueError, TypeError):
|
||||
page_number = 1
|
||||
|
||||
results_per_page = app.config.get('RESULTS_PER_PAGE', DEFAULT_PER_PAGE)
|
||||
|
||||
query_args = {
|
||||
'term': search_term or '',
|
||||
'user': user.id,
|
||||
'sort': sort_key or 'id',
|
||||
'order': sort_order or 'desc',
|
||||
'category': category or '0_0',
|
||||
'quality_filter': quality_filter or '0',
|
||||
'page': page_number,
|
||||
'rss': False,
|
||||
'per_page': results_per_page
|
||||
}
|
||||
|
||||
if flask.g.user:
|
||||
query_args['logged_in_user'] = flask.g.user
|
||||
if flask.g.user.is_moderator: # God mode
|
||||
query_args['admin'] = True
|
||||
|
||||
# Use elastic search for term searching
|
||||
rss_query_string = _generate_query_string(search_term, category, quality_filter, user_name)
|
||||
use_elastic = app.config.get('USE_ELASTIC_SEARCH')
|
||||
if use_elastic and search_term:
|
||||
query_args['term'] = search_term
|
||||
|
||||
max_search_results = app.config.get('ES_MAX_SEARCH_RESULT', DEFAULT_MAX_SEARCH_RESULT)
|
||||
|
||||
# Only allow up to (max_search_results / page) pages
|
||||
max_page = min(query_args['page'], int(math.ceil(max_search_results / results_per_page)))
|
||||
|
||||
query_args['page'] = max_page
|
||||
query_args['max_search_results'] = max_search_results
|
||||
|
||||
query_results = search_elastic(**query_args)
|
||||
|
||||
max_results = min(max_search_results, query_results['hits']['total'])
|
||||
# change p= argument to whatever you change page_parameter to or pagination breaks
|
||||
pagination = Pagination(p=query_args['page'], per_page=results_per_page,
|
||||
total=max_results, bs_version=3, page_parameter='p',
|
||||
display_msg=SERACH_PAGINATE_DISPLAY_MSG)
|
||||
return flask.render_template('user.html',
|
||||
use_elastic=True,
|
||||
pagination=pagination,
|
||||
torrent_query=query_results,
|
||||
search=query_args,
|
||||
user=user,
|
||||
user_page=True,
|
||||
rss_filter=rss_query_string,
|
||||
level=user_level,
|
||||
admin_form=admin_form)
|
||||
# Similar logic as home page
|
||||
else:
|
||||
if use_elastic:
|
||||
query_args['term'] = ''
|
||||
else:
|
||||
query_args['term'] = search_term or ''
|
||||
query = search_db(**query_args)
|
||||
return flask.render_template('user.html',
|
||||
use_elastic=False,
|
||||
torrent_query=query,
|
||||
search=query_args,
|
||||
user=user,
|
||||
user_page=True,
|
||||
rss_filter=rss_query_string,
|
||||
level=user_level,
|
||||
admin_form=admin_form)
|
||||
|
||||
|
||||
def _create_user_class_choices(user):
|
||||
choices = [('regular', 'Regular')]
|
||||
default = 'regular'
|
||||
if flask.g.user:
|
||||
if flask.g.user.is_moderator:
|
||||
choices.append(('trusted', 'Trusted'))
|
||||
if flask.g.user.is_superadmin:
|
||||
choices.append(('moderator', 'Moderator'))
|
||||
choices.append(('banned', 'Banned'))
|
||||
|
||||
if user:
|
||||
if user.is_moderator:
|
||||
default = 'moderator'
|
||||
elif user.is_trusted:
|
||||
default = 'trusted'
|
||||
elif user.is_banned:
|
||||
default = 'banned'
|
||||
|
||||
return default, choices
|
||||
Reference in New Issue
Block a user