diff --git a/app/static/js/Requests/users/settings.js b/app/static/js/Requests/users/settings.js new file mode 100644 index 00000000..0a92a09c --- /dev/null +++ b/app/static/js/Requests/users/settings.js @@ -0,0 +1,16 @@ +/***************************************************************************** +* Settings * +* Fetch requests for /users//settings routes * +*****************************************************************************/ +Requests.users.entity.settings = {}; + +Requests.users.entity.settings.profilePrivacy = {}; + +Requests.users.entity.settings.profilePrivacy.update = (userId, profilePrivacySetting, enabled) => { + let input = `/users/${userId}/settings/profile-privacy/${profilePrivacySetting}`; + let init = { + method: 'PUT', + body: JSON.stringify(enabled) + }; + return Requests.JSONfetch(input, init); +} diff --git a/app/static/js/Requests/users/users.js b/app/static/js/Requests/users/users.js index 9ed77cb0..053fd687 100644 --- a/app/static/js/Requests/users/users.js +++ b/app/static/js/Requests/users/users.js @@ -14,25 +14,12 @@ Requests.users.entity.delete = (userId) => { return Requests.JSONfetch(input, init); }; -Requests.users.entity.settings = {}; +Requests.users.entity.avatar = {}; -Requests.users.entity.settings.avatar = {}; - -Requests.users.entity.settings.avatar.delete = (userId) => { - let input = `/users/${userId}/settings/avatar`; +Requests.users.entity.avatar.delete = (userId) => { + let input = `/users/${userId}/avatar`; let init = { method: 'DELETE' }; return Requests.JSONfetch(input, init); } - -Requests.users.entity.settings.profilePrivacy = {}; - -Requests.users.entity.settings.profilePrivacy.update = (userId, profilePrivacySetting, enabled) => { - let input = `/users/${userId}/settings/profile-privacy/${profilePrivacySetting}`; - let init = { - method: 'PUT', - body: JSON.stringify(enabled) - }; - return Requests.JSONfetch(input, init); -} diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2 index dbc26470..9dd81933 100644 --- a/app/templates/_scripts.html.j2 +++ b/app/templates/_scripts.html.j2 @@ -66,7 +66,8 @@ 'js/Requests/corpora/files.js', 'js/Requests/corpora/followers.js', 'js/Requests/jobs/jobs.js', - 'js/Requests/users/users.js' + 'js/Requests/users/users.js', + 'js/Requests/users/settings.js' %} {%- endassets %} diff --git a/app/templates/users/settings/settings.html.j2 b/app/templates/users/settings/settings.html.j2 index 91b2864d..f862840d 100644 --- a/app/templates/users/settings/settings.html.j2 +++ b/app/templates/users/settings/settings.html.j2 @@ -213,7 +213,7 @@ avatarUploadElement.addEventListener('change', () => { }); document.querySelector('#delete-avatar').addEventListener('click', () => { - Requests.users.entity.settings.avatar.delete({{ user.hashid|tojson }}) + Requests.users.entity.avatar.delete({{ user.hashid|tojson }}) .then( (response) => { avatarPreviewElement.src = {{ url_for('static', filename='images/user_avatar.png')|tojson }}; diff --git a/app/users/__init__.py b/app/users/__init__.py index 11a38f25..a1ed4f2e 100644 --- a/app/users/__init__.py +++ b/app/users/__init__.py @@ -2,5 +2,5 @@ from flask import Blueprint bp = Blueprint('users', __name__) -from . import events, routes +from . import events, json_routes, routes from . import settings diff --git a/app/users/json_routes.py b/app/users/json_routes.py index d228f8f3..571fa78c 100644 --- a/app/users/json_routes.py +++ b/app/users/json_routes.py @@ -3,7 +3,7 @@ from flask_login import current_user, login_required, logout_user from threading import Thread from app import db from app.decorators import content_negotiation -from app.models import User +from app.models import Avatar, User from . import bp @@ -22,7 +22,7 @@ def delete_user(user_id): abort(403) thread = Thread( target=_delete_user, - args=(current_app._get_current_object(), user_id) + args=(current_app._get_current_object(), user.id) ) if user == current_user: logout_user() @@ -31,3 +31,28 @@ def delete_user(user_id): 'message': f'User "{user.username}" marked for deletion' } return response_data, 202 + + +@bp.route('//avatar', methods=['DELETE']) +@content_negotiation(produces='application/json') +def delete_user_avatar(user_id): + def _delete_avatar(app, avatar_id): + with app.app_context(): + avatar = Avatar.query.get(avatar_id) + avatar.delete() + db.session.commit() + + user = User.query.get_or_404(user_id) + if user.avatar is None: + abort(404) + if not (user == current_user or current_user.is_administrator()): + abort(403) + thread = Thread( + target=_delete_avatar, + args=(current_app._get_current_object(), user.avatar.id) + ) + thread.start() + response_data = { + 'message': f'Avatar marked for deletion' + } + return response_data, 202 diff --git a/app/users/settings/json_routes.py b/app/users/settings/json_routes.py index 7fdfa7fc..1d0c4d9e 100644 --- a/app/users/settings/json_routes.py +++ b/app/users/settings/json_routes.py @@ -1,38 +1,11 @@ -from flask import abort, current_app, request +from flask import abort, request from flask_login import current_user, login_required -from threading import Thread -import os from app import db from app.decorators import content_negotiation -from app.models import Avatar, User, ProfilePrivacySettings +from app.models import User, ProfilePrivacySettings from . import bp -@bp.route('//settings/avatar', methods=['DELETE']) -@content_negotiation(produces='application/json') -def delete_user_avatar(user_id): - def _delete_avatar(app, avatar_id): - with app.app_context(): - avatar = Avatar.query.get(avatar_id) - avatar.delete() - db.session.commit() - - user = User.query.get_or_404(user_id) - if user.avatar is None: - abort(404) - if not (user == current_user or current_user.is_administrator()): - abort(403) - thread = Thread( - target=_delete_avatar, - args=(current_app._get_current_object(), user.avatar.id) - ) - thread.start() - response_data = { - 'message': f'Avatar marked for deletion' - } - return response_data, 202 - - @bp.route('//settings/profile-privacy/is-public', methods=['PUT']) @login_required @content_negotiation(consumes='application/json', produces='application/json')