Allow moderators to ban and unban users
This commit is contained in:
@@ -158,7 +158,7 @@ class DB:
|
|||||||
|
|
||||||
def get_user_public_info(self, user_id):
|
def get_user_public_info(self, user_id):
|
||||||
return self._db().execute('''
|
return self._db().execute('''
|
||||||
select name, about
|
select name, about, banned_until
|
||||||
from users
|
from users
|
||||||
where user_id = ?
|
where user_id = ?
|
||||||
''',
|
''',
|
||||||
|
|||||||
42
main.py
42
main.py
@@ -166,13 +166,15 @@ def user_edit_password():
|
|||||||
|
|
||||||
@app.route('/user/<int:user_id>/')
|
@app.route('/user/<int:user_id>/')
|
||||||
def user_info(user_id):
|
def user_info(user_id):
|
||||||
name, about = db.get_user_public_info(user_id)
|
name, about, banned_until = db.get_user_public_info(user_id)
|
||||||
return render_template(
|
return render_template(
|
||||||
'user_info.html',
|
'user_info.html',
|
||||||
title = 'Profile',
|
title = 'Profile',
|
||||||
config = config,
|
config = config,
|
||||||
user = get_user(),
|
user = get_user(),
|
||||||
name = name,
|
name = name,
|
||||||
|
id = user_id,
|
||||||
|
banned_until = banned_until,
|
||||||
about = about
|
about = about
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -480,9 +482,8 @@ def admin_new_secrets():
|
|||||||
flash(str(e), 'error')
|
flash(str(e), 'error')
|
||||||
return redirect(url_for('admin'))
|
return redirect(url_for('admin'))
|
||||||
|
|
||||||
@app.route('/admin/user/<int:user_id>/ban/', methods = ['POST'])
|
def ban_user(user_id):
|
||||||
def admin_ban_user(user_id):
|
chk, user = _moderator_check()
|
||||||
chk, user = _admin_check()
|
|
||||||
if not chk:
|
if not chk:
|
||||||
return user
|
return user
|
||||||
|
|
||||||
@@ -490,7 +491,7 @@ def admin_ban_user(user_id):
|
|||||||
d = 0 if d == '' else int(d)
|
d = 0 if d == '' else int(d)
|
||||||
h, m = (0, 0) if t == '' else map(int, t.split(':'))
|
h, m = (0, 0) if t == '' else map(int, t.split(':'))
|
||||||
until = time.time_ns() + (d * 24 * 60 + h * 60 + m) * (60 * 10**9)
|
until = time.time_ns() + (d * 24 * 60 + h * 60 + m) * (60 * 10**9)
|
||||||
until = min(until, 0xffff_ffff_ffff_ffff)
|
until = min(until, 0x7fff_ffff_ffff_ffff)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if db.set_user_ban(user_id, until):
|
if db.set_user_ban(user_id, until):
|
||||||
@@ -499,11 +500,17 @@ def admin_ban_user(user_id):
|
|||||||
flash('Failed to ban user', 'error')
|
flash('Failed to ban user', 'error')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
flash(str(e), 'error')
|
flash(str(e), 'error')
|
||||||
return redirect(url_for('admin'))
|
|
||||||
|
|
||||||
@app.route('/admin/user/<int:user_id>/unban/', methods = ['POST'])
|
@app.route('/user/<int:user_id>/ban/', methods = ['POST'])
|
||||||
def admin_unban_user(user_id):
|
def moderator_ban_user(user_id):
|
||||||
chk, user = _admin_check()
|
return ban_user(user_id) or redirect(url_for('user_info', user_id = user_id))
|
||||||
|
|
||||||
|
@app.route('/admin/user/<int:user_id>/ban/', methods = ['POST'])
|
||||||
|
def admin_ban_user(user_id):
|
||||||
|
return ban_user(user_id) or redirect(url_for('admin'))
|
||||||
|
|
||||||
|
def unban_user(user_id):
|
||||||
|
chk, user = _moderator_check()
|
||||||
if not chk:
|
if not chk:
|
||||||
return user
|
return user
|
||||||
|
|
||||||
@@ -514,7 +521,14 @@ def admin_unban_user(user_id):
|
|||||||
flash('Failed to unban user', 'error')
|
flash('Failed to unban user', 'error')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
flash(str(e), 'error')
|
flash(str(e), 'error')
|
||||||
return redirect(url_for('admin'))
|
|
||||||
|
@app.route('/user/<int:user_id>/unban/', methods = ['POST'])
|
||||||
|
def moderator_unban_user(user_id):
|
||||||
|
return unban_user(user_id) or redirect(url_for('user_info', user_id = user_id))
|
||||||
|
|
||||||
|
@app.route('/admin/user/<int:user_id>/unban/', methods = ['POST'])
|
||||||
|
def admin_unban_user(user_id):
|
||||||
|
return unban_user(user_id) or redirect(url_for('admin'))
|
||||||
|
|
||||||
@app.route('/admin/user/new/', methods = ['POST'])
|
@app.route('/admin/user/new/', methods = ['POST'])
|
||||||
def admin_new_user():
|
def admin_new_user():
|
||||||
@@ -561,6 +575,14 @@ def help():
|
|||||||
user = get_user(),
|
user = get_user(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _moderator_check():
|
||||||
|
user = get_user()
|
||||||
|
if user is None:
|
||||||
|
return False, redirect(url_for('login'))
|
||||||
|
if not user.is_moderator():
|
||||||
|
return False, ('<h1>Forbidden</h1>', 403)
|
||||||
|
return True, user
|
||||||
|
|
||||||
def _admin_check():
|
def _admin_check():
|
||||||
user = get_user()
|
user = get_user()
|
||||||
if user is None:
|
if user is None:
|
||||||
|
|||||||
@@ -100,12 +100,12 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{%- if banned_until > 0 -%}
|
{%- if banned_until > 0 -%}
|
||||||
<form method=post action="user/{{ id }}/unban/">
|
<form method=post action="{{ url_for('admin_ban_user', user_id = id) }}">
|
||||||
{{- format_time(banned_until) }}
|
{{- format_time(banned_until) }}
|
||||||
<input type=submit value=Unban>
|
<input type=submit value=Unban>
|
||||||
</form>
|
</form>
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
<form method=post action="user/{{ id }}/ban/">
|
<form method=post action="{{ url_for('admin_ban_user', user_id = id) }}">
|
||||||
<input type=number name=days placeholder=days>
|
<input type=number name=days placeholder=days>
|
||||||
<input type=time name=time>
|
<input type=time name=time>
|
||||||
<input type=submit value=Ban>
|
<input type=submit value=Ban>
|
||||||
|
|||||||
@@ -1,6 +1,21 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% block content %}
|
{%- block content %}
|
||||||
|
{%- if user is not none and user.is_moderator -%}
|
||||||
|
<p>
|
||||||
|
<form method=post action="{{ url_for('moderator_ban_user', user_id = id) }}">
|
||||||
|
<input type=number name=days placeholder=days>
|
||||||
|
<input type=time name=time>
|
||||||
|
<input type=submit value=Ban>
|
||||||
|
</form>
|
||||||
|
{%- if banned_until > 0 -%}
|
||||||
|
<form method=post action="{{ url_for('moderator_unban_user', user_id = id) }}">
|
||||||
|
{{- format_time(banned_until) -}}
|
||||||
|
<input type=submit value=Unban>
|
||||||
|
</form>
|
||||||
|
{%- endif -%}
|
||||||
|
</p>
|
||||||
|
{%- endif -%}
|
||||||
<p><sup><i>{{ name }}</i></sup></p>
|
<p><sup><i>{{ name }}</i></sup></p>
|
||||||
<p>{{ minimd(about) | safe }}<p>
|
<p>{{ minimd(about) | safe }}<p>
|
||||||
{% endblock %}
|
{%- endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user