From 22e614f1381a0855dc836311cc617f7c2f5e7d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Wed, 8 Nov 2023 16:51:48 +0200 Subject: [PATCH 1/1] Added new home feed types Variants of All Posts where userspaces are omitted or all non-userspaces are omitted. IssueID #95 --- feeds.py | 12 +++++++++++- model.py | 19 +++++++++++++++++-- settings.py | 48 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 64 insertions(+), 15 deletions(-) diff --git a/feeds.py b/feeds.py index 0426f2a..8e5450c 100644 --- a/feeds.py +++ b/feeds.py @@ -275,8 +275,12 @@ def make_post_page_or_configure_feed(session): return page if arg2 == '/group': - page = '# Grouped Posts\n' subspace = db.get_subspace(id=post.subspace) + if session.c_user: + page = f'# {session.c_user.avatar} {session.c_user.name}' + else: + page = f'# {subspace.title()}' + page += ': Grouped Posts\n' page += f'=> /{subspace.title()} {subspace.title()}\n' page += '=> / Back to front page\n' user = session.user @@ -699,6 +703,8 @@ def make_feed_page(session): page_index = int(param[1:]) - 1 sort_mode = ' šŸ”„' if sort_hotness else '' + omit_user_subspaces = (user.flags & User.HOME_NO_USERS_FEED_FLAG) != 0 + omit_nonuser_subspaces = (user.flags & User.HOME_USERS_FEED_FLAG) != 0 rotate_per_day = (session.is_rotation_enabled() and not context and not sort_hotness @@ -710,6 +716,8 @@ def make_feed_page(session): filter_by_followed=filter_by_followed, filter_issue_status=filter_issue_status, filter_tag=session.feed_tag_filter, + omit_user_subspaces=omit_user_subspaces, + omit_nonuser_subspaces=omit_nonuser_subspaces, muted_by_user_id=(user.id if user else 0), rotate_per_day=rotate_per_day) num_pages = int((num_total + page_size - 1) / page_size) @@ -786,6 +794,8 @@ def make_feed_page(session): filter_by_followed=filter_by_followed, filter_issue_status=filter_issue_status, filter_tag=session.feed_tag_filter, + omit_user_subspaces=omit_user_subspaces, + omit_nonuser_subspaces=omit_nonuser_subspaces, muted_by_user_id=(user.id if user else 0), gemini_feed=is_gemini_feed or is_atom_feed, rotate_per_day=rotate_per_day, diff --git a/model.py b/model.py index a21ca54..56fdf36 100644 --- a/model.py +++ b/model.py @@ -224,8 +224,8 @@ class User: BASIC, ADMIN, LIMITED = range(3) # Sort modes: - SORT_POST_RECENT = 'r' - SORT_POST_HOTNESS = 'h' + SORT_POST_RECENT = 'r' + SORT_POST_HOTNESS = 'h' SORT_COMMENT_OLDEST = 'o' SORT_COMMENT_NEWEST = 'n' @@ -237,6 +237,10 @@ class User: HIDE_THANKS_FLAG = 0x0010 SHORT_PREVIEW_FLAG = 0x0020 DISABLE_ROTATION_FLAG = 0x0040 + HOME_NO_USERS_FEED_FLAG = 0x0080 + HOME_USERS_FEED_FLAG = 0x0100 + + FEED_MASK = HOME_FOLLOWED_FEED_FLAG | HOME_USERS_FEED_FLAG | HOME_NO_USERS_FEED_FLAG def __init__(self, id, name, info, url, recovery, avatar, role, flags, notif, email, email_inter, \ email_range, password, ts_password, ts_created, ts_active, sort_post, sort_cmt, @@ -1709,6 +1713,7 @@ class Database: def get_posts(self, id=None, subspace=None, comment=None, user=None, draft=None, parent=None, filter_by_followed=None, filter_issue_status=None, filter_tag=None, + omit_user_subspaces=False, omit_nonuser_subspaces=False, rotation_group_of_post:Post=None, rotate_per_day=False, gemini_feed=False, notifs_for_user_id=0, muted_by_user_id=0, @@ -1741,6 +1746,10 @@ class Database: if user != None: where_stm.append('p.user=?') values.append(user.id) + if omit_user_subspaces: + where_stm.append('sub1.owner=0') + if omit_nonuser_subspaces: + where_stm.append('sub1.owner!=0') if subspace != None: where_stm.append('p.subspace=?') @@ -1914,6 +1923,8 @@ class Database: draft=False, is_comment=None, ignore_omit_flags=False, + omit_user_subspaces=False, + omit_nonuser_subspaces=False, filter_by_followed=None, filter_issue_status=None, filter_tag=None, @@ -1940,6 +1951,10 @@ class Database: filter += Database.TAG_FILTER_JOIN cond.append('tg.tag=?') values.append(filter_tag) + if omit_user_subspaces: + cond.append('s.owner=0') + if omit_nonuser_subspaces: + cond.append('s.owner!=0') if user != None: cond.append('p.user=?') values.append(user.id) diff --git a/settings.py b/settings.py index 5d03ce9..292ab7a 100644 --- a/settings.py +++ b/settings.py @@ -397,8 +397,27 @@ def make_settings_page(session): return page elif req.path == session.path + 'settings/homefeed': - db.update_user(session.user, flags=session.user.flags ^ User.HOME_FOLLOWED_FEED_FLAG) - return 30, '/settings' + uflags = user.flags & ~User.FEED_MASK + arg = clean_query(req) + if arg == 'all': + db.update_user(user, flags=uflags) + return 30, '/settings' + if arg == 'nouser': + db.update_user(user, flags=uflags | User.HOME_NO_USERS_FEED_FLAG) + return 30, '/settings' + if arg == 'user': + db.update_user(user, flags=uflags | User.HOME_USERS_FEED_FLAG) + return 30, '/settings' + if arg == 'followed': + db.update_user(user, flags=uflags | User.HOME_FOLLOWED_FEED_FLAG) + return 30, '/settings' + + page = 'Which feed to show on the front page?\n\n' + page += '=> ?all All Posts\n' + page += '=> ?nouser All Posts (excluding userspaces)\n' + page += '=> ?user Userspaces only\n' + page += '=> ?followed Followed\n' + return page elif req.path == session.path + 'settings/follow': page += f'# {session.user.name}: Settings\n' @@ -591,18 +610,23 @@ def make_settings_page(session): elif req.path == session.path + 'settings' or \ req.path == session.path + 'settings/': - page = f'# {session.user.name}: Settings\n' + page = f'# {user.name}: Settings\n' page += f'\n=> /dashboard Back to Dashboard\n' page += f'=> / Back to front page\n\n' SORT_POST = { 'r': 'šŸ•‘ Most recent', 'h': 'šŸ”„ Hotness' } SORT_COMMENT = { 'o': '⬇ Oldest first', 'n': '⬆ Newest first' } - HOME_FEED = [ 'All Posts', 'Followed' ] - user_space = db.get_subspace(owner=session.user.id) - - page += f'=> /settings/homefeed Home feed: {HOME_FEED[nonzero(session.user.flags & User.HOME_FOLLOWED_FEED_FLAG)]}\n' - page += f'=> /settings/sort-feed Sort posts: {SORT_POST[session.user.sort_post]}\n' - page += f'=> /settings/sort-cmt Sort comments: {SORT_COMMENT[session.user.sort_cmt]}\n' + HOME_FEED = { + 0: 'All Posts', + User.HOME_NO_USERS_FEED_FLAG: 'All Posts (excluding userspaces)', + User.HOME_USERS_FEED_FLAG: 'Userspaces only', + User.HOME_FOLLOWED_FEED_FLAG: 'Followed' + } + user_space = db.get_subspace(owner=user.id) + + page += f'=> /settings/homefeed Home feed: {HOME_FEED[user.flags & User.FEED_MASK]}\n' + page += f'=> /settings/sort-feed Sort posts: {SORT_POST[user.sort_post]}\n' + page += f'=> /settings/sort-cmt Sort comments: {SORT_COMMENT[user.sort_cmt]}\n' page += '\n' if not user_space.flags & Subspace.HIDE_OMIT_SETTING_FLAG: @@ -621,13 +645,13 @@ def make_settings_page(session): page += '\n## Account\n' - page += f'\n=> /export/{session.user.name}.gpub šŸ“¤ Export data archive\n' + page += f'\n=> /export/{user.name}.gpub šŸ“¤ Export data archive\n' page += 'Download a ZIP archive containing all posts and comments you have made. You can extract the contents and serve them as a static Gemini capsule. The archive has Gempub metadata so it can also be viewed in a Gempub reader. \n' page += f'\n=> /settings/rename/{session.get_token()} Rename user\n' - page += f'Renaming the account will break links pointing to u/{session.user.name}.\n' + page += f'Renaming the account will break links pointing to u/{user.name}.\n' - page += f'\n=> /settings/delete-account/{session.get_token()} āš ļø Delete user {session.user.name}\n' + page += f'\n=> /settings/delete-account/{session.get_token()} āš ļø Delete user {user.name}\n' page += 'All of your posts and comments will be deleted.\n' page += f'\nšŸ’¬ Bubble v{session.bubble.version} by @jk@skyjake.fi\n' -- 2.34.1