Bubble [main]

Composer: Toggle for per-post "Omit from All Posts"

aec7f03d91cb8d5429e83eb1d7741ba8b4509761
diff --git a/composer.py b/composer.py
index 56387dd..0784601 100644
--- a/composer.py
+++ b/composer.py
@@ -114,7 +114,7 @@ def make_composer_page(session):
     try:
         post_id = int(found.group(1))
     except:
-        return 59, 'Bad request'
+        return 30, session.server_root()
     post_action = found.group(3)
     req_token = found.group(5)
     post = db.get_post(post_id)
@@ -209,6 +209,10 @@ def make_composer_page(session):
         db.update_post(post, flags=post.flags ^ Post.OMIT_FROM_FEED_FLAG)
         return 30, link
 
+    if post_action == 'omit-all':
+        db.update_post(post, flags=post.flags ^ Post.OMIT_FROM_ALL_FLAG)
+        return 30, link
+
     if post_action == 'preview':
         db.update_post_summary(post)
         page = f'=> {link}/publish 📤 Publish {post_type.lower()} (in {subspace.title()})\n'
@@ -297,6 +301,8 @@ def make_composer_page(session):
         # Options and metadata:
         page += f'\n## {post.title_text()}\n'
         page += f'=> {link}/title ✏️ Edit {post_type.lower()} title\n'
+        if not subspace.flags & Subspace.OMIT_FROM_ALL_FLAG:
+            page += f'=> {link}/omit-all {session.CHECKS[nonzero(post.flags & Post.OMIT_FROM_ALL_FLAG)]} Omit {post_type.lower()} from All Posts\n'
         page += f'=> {link}/omit-feed {session.CHECKS[nonzero(post.flags & Post.OMIT_FROM_FEED_FLAG)]} Omit {post_type.lower()} from Gemini feed\n'
         if is_issue_tracker:
             page += f'=> /{subspace.title()} 🐞 Issue in: {subspace.title()}\n'
diff --git a/model.py b/model.py
index 54ed437..2207659 100644
--- a/model.py
+++ b/model.py
@@ -260,6 +260,7 @@ class Post:
     TAG_CLOSED = 'closed'
 
     OMIT_FROM_FEED_FLAG = 0x1
+    OMIT_FROM_ALL_FLAG = 0x2
 
     def __init__(self, id, subspace, parent, user, issueid, title, flags,  is_draft, is_pinned,
                  num_cmts, num_likes, tags, ts_created, ts_edited, summary,
@@ -1408,7 +1409,7 @@ class Database:
             PIN_ORDER = 'p.is_pinned DESC'
         else:
             if id is None and user is None and parent is None:
-                where_stm.append(f'(sub1.flags & {Subspace.OMIT_FROM_ALL_FLAG})=0')
+                where_stm.append(f'((sub1.flags & {Subspace.OMIT_FROM_ALL_FLAG})=0 AND (p.flags & {Post.OMIT_FROM_ALL_FLAG})=0)')
             PIN_ORDER = 'p.is_pinned=2 DESC'
 
         if draft != None:
@@ -1514,7 +1515,7 @@ class Database:
             values.append(subspace.id)
         else:
             # Need filter out posts from subspaces that are flagged for omission.
-            cond.append(f'(s.flags & {Subspace.OMIT_FROM_ALL_FLAG})=0')
+            cond.append(f'((s.flags & {Subspace.OMIT_FROM_ALL_FLAG})=0 AND (p.flags & {Post.OMIT_FROM_ALL_FLAG})=0)')
         if filter_issue_status != None:
             cond.append('p.tags NOT LIKE ?' if filter_issue_status else \
                         'p.tags LIKE ?')