From a043876acc2770f9c66c4532705579d83c26f08c Mon Sep 17 00:00:00 2001 From: Alan Roberts Date: Sat, 31 Aug 2024 20:03:35 -0400 Subject: [PATCH 01/11] Adding an export for user settings and subscriptions --- app/templates/user/edit_settings.html | 5 +++ app/user/forms.py | 1 + app/user/routes.py | 64 ++++++++++++++++++++++++++- 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/app/templates/user/edit_settings.html b/app/templates/user/edit_settings.html index c09748fa..233a1eea 100644 --- a/app/templates/user/edit_settings.html +++ b/app/templates/user/edit_settings.html @@ -37,6 +37,11 @@
Import
{{ render_field(form.import_file) }} {{ render_field(form.submit) }} +
+
Export
+

Export community subscriptions and user settings

+ {{ render_field(form.export_settings) }} +

{{ _('Delete account') }} diff --git a/app/user/forms.py b/app/user/forms.py index 6dd64f7a..4ee33815 100644 --- a/app/user/forms.py +++ b/app/user/forms.py @@ -46,6 +46,7 @@ class SettingsForm(FlaskForm): manually_approves_followers = BooleanField(_l('Manually approve followers')) vote_privately = BooleanField(_l('Vote privately')) import_file = FileField(_l('Import community subscriptions and user blocks from Lemmy')) + export_settings = SubmitField(_l('Export')) sorts = [('hot', _l('Hot')), ('top', _l('Top')), ('new', _l('New')), diff --git a/app/user/routes.py b/app/user/routes.py index 2762ec58..6d70f2de 100644 --- a/app/user/routes.py +++ b/app/user/routes.py @@ -1,8 +1,9 @@ from datetime import datetime, timedelta from time import sleep from random import randint +from io import BytesIO -from flask import redirect, url_for, flash, request, make_response, session, Markup, current_app, abort, json, g +from flask import redirect, url_for, flash, request, make_response, session, Markup, current_app, abort, json, g, send_file from flask_login import login_user, logout_user, current_user, login_required from flask_babel import _, lazy_gettext as _l @@ -28,6 +29,7 @@ from app.utils import get_setting, render_template, markdown_to_html, user_acces blocked_communities from sqlalchemy import desc, or_, text import os +import json as python_json @bp.route('/people', methods=['GET', 'POST']) @@ -227,7 +229,65 @@ def change_settings(): ('de', _l('German')), ('ja', _l('Japanese')), ] - if form.validate_on_submit(): + # seperate if to handle just the 'Export' button being clicked + if form.export_settings.data and form.validate(): + # make the empty dict + user_dict = {} + + # take the current_user already found + # add user's settings to the dict for output + user_dict['user_name'] = user.user_name + user_dict['alt_user_name'] = user.alt_user_name + user_dict['title'] = user.title + user_dict['email'] = user.email + user_dict['about'] = user.about + # user_dict['about_html'] = user.about_html + user_dict['keywords'] = user.keywords + user_dict['matrix_user_id'] = user.matrix_user_id + user_dict['hide_nsfw'] = user.hide_nsfw + user_dict['hide_nsfl'] = user.hide_nsfl + # user_dict['public_key'] = user.public_key + # user_dict['private_key'] = user.private_key + user_dict['receive_message_mode'] = user.receive_message_mode + user_dict['bot'] = user.bot + user_dict['ignore_bots'] = user.ignore_bots + user_dict['default_sort'] = user.default_sort + user_dict['default_filter'] = user.default_filter + user_dict['theme'] = user.theme + user_dict['markdown_editor'] = user.markdown_editor + user_dict['interface_language'] = user.interface_language + user_dict['reply_collapse_threshold'] = user.reply_collapse_threshold + # user_dict['roles'] = user.roles + # user_dict['vote_privately'] = user.vote_privately + + # get the user subscribed communities' ap_profile_id + user_subscribed_communities = [] + for c in user.communities(): + if c.ap_profile_id is None: + continue + else: + user_subscribed_communities.append(c.ap_profile_id) + user_dict['followed_communities'] = user_subscribed_communities + + # setup the BytesIO buffer + buffer = BytesIO() + buffer.write(str(python_json.dumps(user_dict)).encode('utf-8')) + buffer.seek(0) + + # confirmation displated to user when the page loads up again + flash(_l('Export Complete.')) + + # send the file to the user as a download + # the as_attachment=True results in flask + # redirecting to the current page, so no + # url_for needed here + return send_file( + buffer, + download_name=f'{user.user_name}_piefed_settings.json', + as_attachment=True, + mimetype='application/json' + ) + elif form.validate_on_submit(): propagate_indexable = form.indexable.data != current_user.indexable current_user.newsletter = form.newsletter.data current_user.searchable = form.searchable.data From b659e463d4a3030e2a23d6cfa850941a69020c24 Mon Sep 17 00:00:00 2001 From: Alan Roberts Date: Sun, 1 Sep 2024 10:21:15 -0400 Subject: [PATCH 02/11] adding admin level export as well --- app/templates/user/show_profile.html | 7 ++ app/user/routes.py | 140 +++++++++++++++++++-------- 2 files changed, 104 insertions(+), 43 deletions(-) diff --git a/app/templates/user/show_profile.html b/app/templates/user/show_profile.html index 14ca3598..46318018 100644 --- a/app/templates/user/show_profile.html +++ b/app/templates/user/show_profile.html @@ -220,6 +220,13 @@ {% endif %} +

+ {% if user_access('manage users', current_user.id) %} + + {% endif %} +
{% endif %} diff --git a/app/user/routes.py b/app/user/routes.py index 6d70f2de..abf7cb17 100644 --- a/app/user/routes.py +++ b/app/user/routes.py @@ -212,6 +212,71 @@ def remove_cover(): cache.delete_memoized(User.cover_image, current_user) return '
' + _('Banner removed!') + '
' +# export settings function. used in the /user/settings for a user to export their own settings +# used in the admin moderation /u//export_settings call to let admins +# export the user settings plus admin relevant settings +def export_user_settings(user, admin_request=False): + # make the empty dict + user_dict = {} + + # take the current_user already found + # add user's settings to the dict for output + user_dict['user_name'] = user.user_name + user_dict['alt_user_name'] = user.alt_user_name + user_dict['title'] = user.title + user_dict['email'] = user.email + user_dict['about'] = user.about + user_dict['about_html'] = user.about_html + user_dict['keywords'] = user.keywords + user_dict['matrix_user_id'] = user.matrix_user_id + user_dict['hide_nsfw'] = user.hide_nsfw + user_dict['hide_nsfl'] = user.hide_nsfl + user_dict['receive_message_mode'] = user.receive_message_mode + user_dict['bot'] = user.bot + user_dict['ignore_bots'] = user.ignore_bots + user_dict['default_sort'] = user.default_sort + user_dict['default_filter'] = user.default_filter + user_dict['theme'] = user.theme + user_dict['markdown_editor'] = user.markdown_editor + user_dict['interface_language'] = user.interface_language + user_dict['reply_collapse_threshold'] = user.reply_collapse_threshold + + # lemmy output compatibility + user_dict['display_name'] = user.user_name + user_dict['bio'] = user.about + user_dict['matrix_id'] = user.matrix_user_id + user_dict['bot_account'] = user.bot + user_dict['settings'] = { + "email": f"{user.email}", + "show_nsfw": user.hide_nsfw, + "theme": user.theme, + "default_sort_type": user.default_sort, + "default_listing_type": user.default_filter, + "interface_language": user.interface_language + } + + # get the user subscribed communities' ap_profile_id + user_subscribed_communities = [] + for c in user.communities(): + if c.ap_profile_id is None: + continue + else: + user_subscribed_communities.append(c.ap_profile_id) + user_dict['followed_communities'] = user_subscribed_communities + + # if this is an admin level export request + if admin_request: + user_dict['public_key'] = user.public_key + user_dict['private_key'] = user.private_key + + # setup the BytesIO buffer + buffer = BytesIO() + buffer.write(str(python_json.dumps(user_dict)).encode('utf-8')) + buffer.seek(0) + + # pass the buffer back to the calling function, so it can be given to the + # user for downloading + return buffer @bp.route('/user/settings', methods=['GET', 'POST']) @login_required @@ -231,50 +296,10 @@ def change_settings(): ] # seperate if to handle just the 'Export' button being clicked if form.export_settings.data and form.validate(): - # make the empty dict - user_dict = {} - - # take the current_user already found - # add user's settings to the dict for output - user_dict['user_name'] = user.user_name - user_dict['alt_user_name'] = user.alt_user_name - user_dict['title'] = user.title - user_dict['email'] = user.email - user_dict['about'] = user.about - # user_dict['about_html'] = user.about_html - user_dict['keywords'] = user.keywords - user_dict['matrix_user_id'] = user.matrix_user_id - user_dict['hide_nsfw'] = user.hide_nsfw - user_dict['hide_nsfl'] = user.hide_nsfl - # user_dict['public_key'] = user.public_key - # user_dict['private_key'] = user.private_key - user_dict['receive_message_mode'] = user.receive_message_mode - user_dict['bot'] = user.bot - user_dict['ignore_bots'] = user.ignore_bots - user_dict['default_sort'] = user.default_sort - user_dict['default_filter'] = user.default_filter - user_dict['theme'] = user.theme - user_dict['markdown_editor'] = user.markdown_editor - user_dict['interface_language'] = user.interface_language - user_dict['reply_collapse_threshold'] = user.reply_collapse_threshold - # user_dict['roles'] = user.roles - # user_dict['vote_privately'] = user.vote_privately - - # get the user subscribed communities' ap_profile_id - user_subscribed_communities = [] - for c in user.communities(): - if c.ap_profile_id is None: - continue - else: - user_subscribed_communities.append(c.ap_profile_id) - user_dict['followed_communities'] = user_subscribed_communities - - # setup the BytesIO buffer - buffer = BytesIO() - buffer.write(str(python_json.dumps(user_dict)).encode('utf-8')) - buffer.seek(0) + # get the user settings for this user + buffer = export_user_settings(user, admin_request=False) - # confirmation displated to user when the page loads up again + # confirmation displayed to user when the page loads up again flash(_l('Export Complete.')) # send the file to the user as a download @@ -563,6 +588,35 @@ def delete_profile(actor): goto = request.args.get('redirect') if 'redirect' in request.args else f'/u/{actor}' return redirect(goto) +@bp.route('/u//export_settings', methods=['GET']) +@login_required +def export_settings(actor): + if user_access('manage users', current_user.id): + actor = actor.strip() + user:User = User.query.filter_by(user_name=actor, deleted=False).first() + if user is None: + user = User.query.filter_by(ap_id=actor, deleted=False).first() + if user is None: + abort(404) + # get the user settings for this user + buffer = export_user_settings(user, admin_request=True) + + # send the file to the user as a download + # the as_attachment=True results in flask + # redirecting to the current page, so no + # url_for needed here + return send_file( + buffer, + download_name=f'{user.user_name}_piefed_settings.json', + as_attachment=True, + mimetype='application/json' + ) + + else: + abort(401) + + goto = request.args.get('redirect') if 'redirect' in request.args else f'/u/{actor}' + return redirect(goto) @bp.route('/instance//unblock', methods=['GET']) @login_required From e623e1cec078c4d77177a77758803b255f6f8c1c Mon Sep 17 00:00:00 2001 From: Alan Roberts Date: Sun, 1 Sep 2024 14:40:40 -0400 Subject: [PATCH 03/11] adding avatar, cover image, roles, reputations, and attitude to the settings exports --- app/user/routes.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/user/routes.py b/app/user/routes.py index abf7cb17..192910d4 100644 --- a/app/user/routes.py +++ b/app/user/routes.py @@ -240,10 +240,18 @@ def export_user_settings(user, admin_request=False): user_dict['markdown_editor'] = user.markdown_editor user_dict['interface_language'] = user.interface_language user_dict['reply_collapse_threshold'] = user.reply_collapse_threshold + if user.avatar_image() != '': + user_dict['avatar_image'] = f"https://{current_app.config['SERVER_NAME']}/{user.avatar_image()}" + if user.cover_image() != '': + user_dict['cover_image'] = f"https://{current_app.config['SERVER_NAME']}/{user.cover_image()}" # lemmy output compatibility user_dict['display_name'] = user.user_name user_dict['bio'] = user.about + if user.avatar_image() != '': + user_dict['avatar'] = f"https://{current_app.config['SERVER_NAME']}/{user.avatar_image()}" + if user.cover_image() != '': + user_dict['banner'] = f"https://{current_app.config['SERVER_NAME']}/{user.cover_image()}" user_dict['matrix_id'] = user.matrix_user_id user_dict['bot_account'] = user.bot user_dict['settings'] = { @@ -269,6 +277,14 @@ def export_user_settings(user, admin_request=False): user_dict['public_key'] = user.public_key user_dict['private_key'] = user.private_key + user_roles = [] + for r in user.roles.all(): + user_roles.append(r.name) + user_dict['roles'] = user_roles + + user_dict['reputation'] = user.reputation + user_dict['attitude'] = user.attitude + # setup the BytesIO buffer buffer = BytesIO() buffer.write(str(python_json.dumps(user_dict)).encode('utf-8')) From 713516c6ae8c880ef1e876855921ce2135e4b8c6 Mon Sep 17 00:00:00 2001 From: Alan Roberts Date: Mon, 2 Sep 2024 17:50:20 -0400 Subject: [PATCH 04/11] removing the admin bits and just making it a user export --- app/templates/user/show_profile.html | 7 ---- app/user/routes.py | 49 ++-------------------------- 2 files changed, 2 insertions(+), 54 deletions(-) diff --git a/app/templates/user/show_profile.html b/app/templates/user/show_profile.html index 46318018..14ca3598 100644 --- a/app/templates/user/show_profile.html +++ b/app/templates/user/show_profile.html @@ -220,13 +220,6 @@ {% endif %} -
- {% if user_access('manage users', current_user.id) %} - - {% endif %} -
{% endif %} diff --git a/app/user/routes.py b/app/user/routes.py index 192910d4..1c8393e1 100644 --- a/app/user/routes.py +++ b/app/user/routes.py @@ -213,9 +213,7 @@ def remove_cover(): return '
' + _('Banner removed!') + '
' # export settings function. used in the /user/settings for a user to export their own settings -# used in the admin moderation /u//export_settings call to let admins -# export the user settings plus admin relevant settings -def export_user_settings(user, admin_request=False): +def export_user_settings(user): # make the empty dict user_dict = {} @@ -272,19 +270,6 @@ def export_user_settings(user, admin_request=False): user_subscribed_communities.append(c.ap_profile_id) user_dict['followed_communities'] = user_subscribed_communities - # if this is an admin level export request - if admin_request: - user_dict['public_key'] = user.public_key - user_dict['private_key'] = user.private_key - - user_roles = [] - for r in user.roles.all(): - user_roles.append(r.name) - user_dict['roles'] = user_roles - - user_dict['reputation'] = user.reputation - user_dict['attitude'] = user.attitude - # setup the BytesIO buffer buffer = BytesIO() buffer.write(str(python_json.dumps(user_dict)).encode('utf-8')) @@ -313,7 +298,7 @@ def change_settings(): # seperate if to handle just the 'Export' button being clicked if form.export_settings.data and form.validate(): # get the user settings for this user - buffer = export_user_settings(user, admin_request=False) + buffer = export_user_settings(user) # confirmation displayed to user when the page loads up again flash(_l('Export Complete.')) @@ -604,36 +589,6 @@ def delete_profile(actor): goto = request.args.get('redirect') if 'redirect' in request.args else f'/u/{actor}' return redirect(goto) -@bp.route('/u//export_settings', methods=['GET']) -@login_required -def export_settings(actor): - if user_access('manage users', current_user.id): - actor = actor.strip() - user:User = User.query.filter_by(user_name=actor, deleted=False).first() - if user is None: - user = User.query.filter_by(ap_id=actor, deleted=False).first() - if user is None: - abort(404) - # get the user settings for this user - buffer = export_user_settings(user, admin_request=True) - - # send the file to the user as a download - # the as_attachment=True results in flask - # redirecting to the current page, so no - # url_for needed here - return send_file( - buffer, - download_name=f'{user.user_name}_piefed_settings.json', - as_attachment=True, - mimetype='application/json' - ) - - else: - abort(401) - - goto = request.args.get('redirect') if 'redirect' in request.args else f'/u/{actor}' - return redirect(goto) - @bp.route('/instance//unblock', methods=['GET']) @login_required def instance_unblock(instance_id): From 77c527899664e46c0c2e9c2d75bef13b13f14993 Mon Sep 17 00:00:00 2001 From: Alan Roberts Date: Mon, 2 Sep 2024 23:00:08 -0400 Subject: [PATCH 05/11] more lemmy output compatibility --- app/user/routes.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/user/routes.py b/app/user/routes.py index 1c8393e1..bbb18d8a 100644 --- a/app/user/routes.py +++ b/app/user/routes.py @@ -244,20 +244,28 @@ def export_user_settings(user): user_dict['cover_image'] = f"https://{current_app.config['SERVER_NAME']}/{user.cover_image()}" # lemmy output compatibility - user_dict['display_name'] = user.user_name + user_dict['display_name'] = user.title user_dict['bio'] = user.about if user.avatar_image() != '': user_dict['avatar'] = f"https://{current_app.config['SERVER_NAME']}/{user.avatar_image()}" + else: + user_dict['avatar'] = user.avatar_image() if user.cover_image() != '': user_dict['banner'] = f"https://{current_app.config['SERVER_NAME']}/{user.cover_image()}" + else: + user_dict['banner'] = user.cover_image() user_dict['matrix_id'] = user.matrix_user_id user_dict['bot_account'] = user.bot + if user.hide_nsfw == 1: + lemmy_show_nsfw = False + else: + lemmy_show_nsfw = True user_dict['settings'] = { "email": f"{user.email}", - "show_nsfw": user.hide_nsfw, + "show_nsfw": lemmy_show_nsfw, "theme": user.theme, - "default_sort_type": user.default_sort, - "default_listing_type": user.default_filter, + "default_sort_type": f'{user.default_sort}'.capitalize(), + "default_listing_type": f'{user.default_filter}'.capitalize(), "interface_language": user.interface_language } From 6677aa506cb53e7b849eef36cb871963fbc39361 Mon Sep 17 00:00:00 2001 From: Alan Roberts Date: Tue, 3 Sep 2024 12:36:57 -0400 Subject: [PATCH 06/11] adding blocked users to export --- app/user/routes.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/user/routes.py b/app/user/routes.py index bbb18d8a..73606ad3 100644 --- a/app/user/routes.py +++ b/app/user/routes.py @@ -242,6 +242,13 @@ def export_user_settings(user): user_dict['avatar_image'] = f"https://{current_app.config['SERVER_NAME']}/{user.avatar_image()}" if user.cover_image() != '': user_dict['cover_image'] = f"https://{current_app.config['SERVER_NAME']}/{user.cover_image()}" + # get blocked users + blocked_users = [] + user_blocks = UserBlock.query.filter_by(blocker_id=user.id).all() + for ub in user_blocks: + blocked_user = User.query.filter_by(id=ub.blocked_id).first() + blocked_users.append(blocked_user.ap_public_url) + user_dict['user_blocks'] = blocked_users # lemmy output compatibility user_dict['display_name'] = user.title @@ -268,6 +275,7 @@ def export_user_settings(user): "default_listing_type": f'{user.default_filter}'.capitalize(), "interface_language": user.interface_language } + user_dict['blocked_users'] = blocked_users # get the user subscribed communities' ap_profile_id user_subscribed_communities = [] @@ -278,6 +286,14 @@ def export_user_settings(user): user_subscribed_communities.append(c.ap_profile_id) user_dict['followed_communities'] = user_subscribed_communities + # get bookmrked/saved posts + # get bookmarked/saved comments + # get blocked communities + + + + # get blocked instances + # setup the BytesIO buffer buffer = BytesIO() buffer.write(str(python_json.dumps(user_dict)).encode('utf-8')) From a275201a4448a3302471860a7018e48250e7538f Mon Sep 17 00:00:00 2001 From: Alan Roberts Date: Tue, 3 Sep 2024 13:23:40 -0400 Subject: [PATCH 07/11] adding blocked communities and instances --- app/user/routes.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/app/user/routes.py b/app/user/routes.py index 73606ad3..6f9af2db 100644 --- a/app/user/routes.py +++ b/app/user/routes.py @@ -242,6 +242,7 @@ def export_user_settings(user): user_dict['avatar_image'] = f"https://{current_app.config['SERVER_NAME']}/{user.avatar_image()}" if user.cover_image() != '': user_dict['cover_image'] = f"https://{current_app.config['SERVER_NAME']}/{user.cover_image()}" + # get blocked users blocked_users = [] user_blocks = UserBlock.query.filter_by(blocker_id=user.id).all() @@ -250,6 +251,22 @@ def export_user_settings(user): blocked_users.append(blocked_user.ap_public_url) user_dict['user_blocks'] = blocked_users + # get blocked communities + blocked_communities = [] + community_blocks = CommunityBlock.query.filter_by(user_id=user.id).all() + for cb in community_blocks: + c = Community.query.filter_by(id=cb.community_id).first() + blocked_communities.append(c.ap_public_url) + user_dict['blocked_communities'] = blocked_communities + + # get blocked instances + blocked_instances = [] + instance_blocks = InstanceBlock.query.filter_by(user_id=user.id).all() + for ib in instance_blocks: + i = Instance.query.filter_by(id=ib.instance_id).first() + blocked_instances.append(i.domain) + user_dict['blocked_instances'] = blocked_instances + # lemmy output compatibility user_dict['display_name'] = user.title user_dict['bio'] = user.about @@ -288,11 +305,9 @@ def export_user_settings(user): # get bookmrked/saved posts # get bookmarked/saved comments - # get blocked communities - # get blocked instances # setup the BytesIO buffer buffer = BytesIO() From 42da1ab2ea036685c2fb5ae904c9c68671fcc3f1 Mon Sep 17 00:00:00 2001 From: Alan Roberts Date: Tue, 3 Sep 2024 19:08:19 -0400 Subject: [PATCH 08/11] adding saved posts and comments --- app/user/routes.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/app/user/routes.py b/app/user/routes.py index 6f9af2db..8b3c028f 100644 --- a/app/user/routes.py +++ b/app/user/routes.py @@ -267,6 +267,22 @@ def export_user_settings(user): blocked_instances.append(i.domain) user_dict['blocked_instances'] = blocked_instances + # get bookmarked/saved posts + bookmarked_posts = [] + post_bookmarks = PostBookmark.query.filter_by(user_id=user.id).all() + for pb in post_bookmarks: + p = Post.query.filter_by(id=pb.post_id).first() + bookmarked_posts.append(p.ap_id) + user_dict['saved_posts'] = bookmarked_posts + + # get bookmarked/saved comments + saved_comments = [] + post_reply_bookmarks = PostReplyBookmark.query.filter_by(user_id=user.id).all() + for prb in post_reply_bookmarks: + pr = PostReply.query.filter_by(id=prb.post_reply_id).first() + saved_comments.append(pr.ap_id) + user_dict['saved_comments'] = saved_comments + # lemmy output compatibility user_dict['display_name'] = user.title user_dict['bio'] = user.about @@ -303,8 +319,6 @@ def export_user_settings(user): user_subscribed_communities.append(c.ap_profile_id) user_dict['followed_communities'] = user_subscribed_communities - # get bookmrked/saved posts - # get bookmarked/saved comments From e9c1932356595ab72b6541512337af061282e598 Mon Sep 17 00:00:00 2001 From: Alan Roberts Date: Tue, 3 Sep 2024 19:24:11 -0400 Subject: [PATCH 09/11] arrange output to match lemmy output format --- app/user/routes.py | 151 ++++++++++++++++++++++----------------------- 1 file changed, 75 insertions(+), 76 deletions(-) diff --git a/app/user/routes.py b/app/user/routes.py index 8b3c028f..4495897e 100644 --- a/app/user/routes.py +++ b/app/user/routes.py @@ -219,6 +219,80 @@ def export_user_settings(user): # take the current_user already found # add user's settings to the dict for output + # arranaged to match the lemmy settings output order + user_dict['display_name'] = user.title + user_dict['bio'] = user.about + if user.avatar_image() != '': + user_dict['avatar'] = f"https://{current_app.config['SERVER_NAME']}/{user.avatar_image()}" + else: + user_dict['avatar'] = user.avatar_image() + if user.cover_image() != '': + user_dict['banner'] = f"https://{current_app.config['SERVER_NAME']}/{user.cover_image()}" + else: + user_dict['banner'] = user.cover_image() + user_dict['matrix_id'] = user.matrix_user_id + user_dict['bot_account'] = user.bot + user_dict['settings'] = { + "email": f"{user.email}", + "show_nsfw": lemmy_show_nsfw, + "theme": user.theme, + "default_sort_type": f'{user.default_sort}'.capitalize(), + "default_listing_type": f'{user.default_filter}'.capitalize(), + "interface_language": user.interface_language + } + # get the user subscribed communities' ap_profile_id + user_subscribed_communities = [] + for c in user.communities(): + if c.ap_profile_id is None: + continue + else: + user_subscribed_communities.append(c.ap_profile_id) + user_dict['followed_communities'] = user_subscribed_communities + + # get bookmarked/saved posts + bookmarked_posts = [] + post_bookmarks = PostBookmark.query.filter_by(user_id=user.id).all() + for pb in post_bookmarks: + p = Post.query.filter_by(id=pb.post_id).first() + bookmarked_posts.append(p.ap_id) + user_dict['saved_posts'] = bookmarked_posts + + # get bookmarked/saved comments + saved_comments = [] + post_reply_bookmarks = PostReplyBookmark.query.filter_by(user_id=user.id).all() + for prb in post_reply_bookmarks: + pr = PostReply.query.filter_by(id=prb.post_reply_id).first() + saved_comments.append(pr.ap_id) + user_dict['saved_comments'] = saved_comments + + # get blocked communities + blocked_communities = [] + community_blocks = CommunityBlock.query.filter_by(user_id=user.id).all() + for cb in community_blocks: + c = Community.query.filter_by(id=cb.community_id).first() + blocked_communities.append(c.ap_public_url) + user_dict['blocked_communities'] = blocked_communities + + # get blocked users + blocked_users = [] + user_blocks = UserBlock.query.filter_by(blocker_id=user.id).all() + for ub in user_blocks: + blocked_user = User.query.filter_by(id=ub.blocked_id).first() + blocked_users.append(blocked_user.ap_public_url) + user_dict['blocked_users'] = blocked_users + + # get blocked instances + blocked_instances = [] + instance_blocks = InstanceBlock.query.filter_by(user_id=user.id).all() + for ib in instance_blocks: + i = Instance.query.filter_by(id=ib.instance_id).first() + blocked_instances.append(i.domain) + user_dict['blocked_instances'] = blocked_instances + + # piefed versions of (most of) the same settings + # TO-DO: adjust the piefed side import method to just take the doubled + # settings from the lemmy formatted output. Then remove the duplicate + # items here. user_dict['user_name'] = user.user_name user_dict['alt_user_name'] = user.alt_user_name user_dict['title'] = user.title @@ -242,86 +316,11 @@ def export_user_settings(user): user_dict['avatar_image'] = f"https://{current_app.config['SERVER_NAME']}/{user.avatar_image()}" if user.cover_image() != '': user_dict['cover_image'] = f"https://{current_app.config['SERVER_NAME']}/{user.cover_image()}" - - # get blocked users - blocked_users = [] - user_blocks = UserBlock.query.filter_by(blocker_id=user.id).all() - for ub in user_blocks: - blocked_user = User.query.filter_by(id=ub.blocked_id).first() - blocked_users.append(blocked_user.ap_public_url) - user_dict['user_blocks'] = blocked_users - - # get blocked communities - blocked_communities = [] - community_blocks = CommunityBlock.query.filter_by(user_id=user.id).all() - for cb in community_blocks: - c = Community.query.filter_by(id=cb.community_id).first() - blocked_communities.append(c.ap_public_url) - user_dict['blocked_communities'] = blocked_communities - - # get blocked instances - blocked_instances = [] - instance_blocks = InstanceBlock.query.filter_by(user_id=user.id).all() - for ib in instance_blocks: - i = Instance.query.filter_by(id=ib.instance_id).first() - blocked_instances.append(i.domain) - user_dict['blocked_instances'] = blocked_instances - - # get bookmarked/saved posts - bookmarked_posts = [] - post_bookmarks = PostBookmark.query.filter_by(user_id=user.id).all() - for pb in post_bookmarks: - p = Post.query.filter_by(id=pb.post_id).first() - bookmarked_posts.append(p.ap_id) - user_dict['saved_posts'] = bookmarked_posts - - # get bookmarked/saved comments - saved_comments = [] - post_reply_bookmarks = PostReplyBookmark.query.filter_by(user_id=user.id).all() - for prb in post_reply_bookmarks: - pr = PostReply.query.filter_by(id=prb.post_reply_id).first() - saved_comments.append(pr.ap_id) - user_dict['saved_comments'] = saved_comments - - # lemmy output compatibility - user_dict['display_name'] = user.title - user_dict['bio'] = user.about - if user.avatar_image() != '': - user_dict['avatar'] = f"https://{current_app.config['SERVER_NAME']}/{user.avatar_image()}" - else: - user_dict['avatar'] = user.avatar_image() - if user.cover_image() != '': - user_dict['banner'] = f"https://{current_app.config['SERVER_NAME']}/{user.cover_image()}" - else: - user_dict['banner'] = user.cover_image() - user_dict['matrix_id'] = user.matrix_user_id - user_dict['bot_account'] = user.bot if user.hide_nsfw == 1: lemmy_show_nsfw = False else: lemmy_show_nsfw = True - user_dict['settings'] = { - "email": f"{user.email}", - "show_nsfw": lemmy_show_nsfw, - "theme": user.theme, - "default_sort_type": f'{user.default_sort}'.capitalize(), - "default_listing_type": f'{user.default_filter}'.capitalize(), - "interface_language": user.interface_language - } - user_dict['blocked_users'] = blocked_users - - # get the user subscribed communities' ap_profile_id - user_subscribed_communities = [] - for c in user.communities(): - if c.ap_profile_id is None: - continue - else: - user_subscribed_communities.append(c.ap_profile_id) - user_dict['followed_communities'] = user_subscribed_communities - - - - + user_dict['user_blocks'] = blocked_users # setup the BytesIO buffer buffer = BytesIO() From 0181c28a64cdb5c694defc4e2346df1b9d008a6b Mon Sep 17 00:00:00 2001 From: Alan Roberts Date: Tue, 3 Sep 2024 19:37:25 -0400 Subject: [PATCH 10/11] adding show bot accounts --- app/user/routes.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/user/routes.py b/app/user/routes.py index 4495897e..b7205c7e 100644 --- a/app/user/routes.py +++ b/app/user/routes.py @@ -232,13 +232,22 @@ def export_user_settings(user): user_dict['banner'] = user.cover_image() user_dict['matrix_id'] = user.matrix_user_id user_dict['bot_account'] = user.bot + if user.hide_nsfw == 1: + lemmy_show_nsfw = False + else: + lemmy_show_nsfw = True + if user.ignore_bots == 1: + lemmy_show_bot_accounts = False + else: + lemmy_show_bot_accounts = True user_dict['settings'] = { "email": f"{user.email}", "show_nsfw": lemmy_show_nsfw, "theme": user.theme, "default_sort_type": f'{user.default_sort}'.capitalize(), "default_listing_type": f'{user.default_filter}'.capitalize(), - "interface_language": user.interface_language + "interface_language": user.interface_language, + "show_bot_accounts": lemmy_show_bot_accounts } # get the user subscribed communities' ap_profile_id user_subscribed_communities = [] @@ -316,10 +325,6 @@ def export_user_settings(user): user_dict['avatar_image'] = f"https://{current_app.config['SERVER_NAME']}/{user.avatar_image()}" if user.cover_image() != '': user_dict['cover_image'] = f"https://{current_app.config['SERVER_NAME']}/{user.cover_image()}" - if user.hide_nsfw == 1: - lemmy_show_nsfw = False - else: - lemmy_show_nsfw = True user_dict['user_blocks'] = blocked_users # setup the BytesIO buffer From 50bc016c6bd4b9c80bee028cc539bc6fbcf40c34 Mon Sep 17 00:00:00 2001 From: Alan Roberts Date: Fri, 6 Sep 2024 13:51:53 -0400 Subject: [PATCH 11/11] adding lemmy default settings --- app/user/routes.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/app/user/routes.py b/app/user/routes.py index b7205c7e..892cd31c 100644 --- a/app/user/routes.py +++ b/app/user/routes.py @@ -224,12 +224,8 @@ def export_user_settings(user): user_dict['bio'] = user.about if user.avatar_image() != '': user_dict['avatar'] = f"https://{current_app.config['SERVER_NAME']}/{user.avatar_image()}" - else: - user_dict['avatar'] = user.avatar_image() if user.cover_image() != '': user_dict['banner'] = f"https://{current_app.config['SERVER_NAME']}/{user.cover_image()}" - else: - user_dict['banner'] = user.cover_image() user_dict['matrix_id'] = user.matrix_user_id user_dict['bot_account'] = user.bot if user.hide_nsfw == 1: @@ -247,7 +243,31 @@ def export_user_settings(user): "default_sort_type": f'{user.default_sort}'.capitalize(), "default_listing_type": f'{user.default_filter}'.capitalize(), "interface_language": user.interface_language, - "show_bot_accounts": lemmy_show_bot_accounts + "show_bot_accounts": lemmy_show_bot_accounts, + # the below items are needed for lemmy to do the import + # the "id" and "person_id" are just set to 42 + # as they expect an int, but it does not override the + # existing user's "id" and "public_id" + "id": 42, + "person_id": 42, + "show_avatars": True, + "send_notifications_to_email": False, + "show_scores": True, + "show_bot_accounts": True, + "show_read_posts": True, + "email_verified": False, + "accepted_application": True, + "open_links_in_new_tab": False, + "blur_nsfw": True, + "auto_expand": False, + "infinite_scroll_enabled": False, + "admin": False, + "post_listing_mode": "List", + "totp_2fa_enabled": False, + "enable_keyboard_navigation": False, + "enable_animated_images": True, + "collapse_bot_comments": False + } # get the user subscribed communities' ap_profile_id user_subscribed_communities = []