You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by ke...@apache.org on 2019/01/03 14:57:15 UTC

[10/11] allura git commit: [#5461] don't show subscribe checkbox if already subscribed to the tool

[#5461] don't show subscribe checkbox if already subscribed to the tool


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/ce7f1417
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/ce7f1417
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/ce7f1417

Branch: refs/heads/master
Commit: ce7f141790c62fea25ab6634ec5c380cc888971f
Parents: 5170721
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 20 11:58:15 2018 -0500
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Fri Dec 21 12:07:41 2018 -0500

----------------------------------------------------------------------
 Allura/allura/controllers/repository.py         |  9 ++++---
 Allura/allura/lib/widgets/repo.py               | 13 +++++----
 Allura/allura/model/artifact.py                 | 23 +++++++++-------
 Allura/allura/templates/widgets/edit_post.html  |  3 +--
 .../templates/widgets/new_topic_post.html       |  4 +--
 .../allura/templates/widgets/threads_table.html |  2 +-
 Allura/allura/tests/model/test_artifact.py      | 28 ++++++++++++++++++++
 ForgeBlog/forgeblog/main.py                     |  8 ++++--
 .../forgeblog/templates/blog/edit_post.html     |  2 +-
 .../templates/blog_widgets/post_form.html       |  3 +--
 .../forgediscussion/controllers/root.py         | 12 +++++----
 ForgeDiscussion/forgediscussion/model/forum.py  | 13 +++++++++
 .../discussion_widgets/add_forum_short.html     |  4 +--
 .../discussionforums/create_topic.html          |  3 ++-
 .../templates/tracker/new_ticket.html           |  2 +-
 .../templates/tracker_widgets/ticket_form.html  |  3 +--
 ForgeTracker/forgetracker/tracker_main.py       |  6 ++++-
 .../forgewiki/templates/wiki/page_edit.html     |  3 +--
 ForgeWiki/forgewiki/wiki_main.py                |  7 +++--
 19 files changed, 103 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/Allura/allura/controllers/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index db5f9a4..48a80f8 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -45,7 +45,7 @@ from allura.lib.diff import HtmlSideBySideDiff
 from allura.lib.security import require_access, require_authenticated, has_access
 from allura.lib.widgets import form_fields as ffw
 from allura.lib.widgets.repo import SCMLogWidget, SCMRevisionWidget, SCMTreeWidget
-from allura.lib.widgets.repo import SCMMergeRequestWidget, SCMMergeRequestWidgetNew
+from allura.lib.widgets.repo import SCMMergeRequestWidget
 from allura.lib.widgets.repo import SCMMergeRequestDisposeWidget, SCMCommitBrowserWidget
 from allura.lib.widgets.subscriptions import SubscribeForm
 from allura.controllers import AppDiscussionController
@@ -162,9 +162,12 @@ class RepoRootController(BaseController, FeedController):
             target_branches = [
                 b.name
                 for b in c.app.repo.get_branches() + c.app.repo.get_tags()]
-        return SCMMergeRequestWidgetNew(
+            subscribed_to_upstream = M.Mailbox.subscribed()
+        return SCMMergeRequestWidget(
             source_branches=source_branches,
-            target_branches=target_branches)
+            target_branches=target_branches,
+            show_subscribe_checkbox=not subscribed_to_upstream,
+        )
 
     @without_trailing_slash
     @expose('jinja:allura:templates/repo/request_merge.html')

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/Allura/allura/lib/widgets/repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/repo.py b/Allura/allura/lib/widgets/repo.py
index 3a9e7d9..60d358f 100644
--- a/Allura/allura/lib/widgets/repo.py
+++ b/Allura/allura/lib/widgets/repo.py
@@ -63,6 +63,7 @@ class SCMTreeWidget(ew_core.Widget):
 class SCMMergeRequestWidget(ff.ForgeForm):
     source_branches = []
     target_branches = []
+    show_subscribe_checkbox = False
 
     @property
     def fields(self):
@@ -81,15 +82,13 @@ class SCMMergeRequestWidget(ff.ForgeForm):
             ffw.MarkdownEdit(name='description')]
         return result
 
-
-class SCMMergeRequestWidgetNew(SCMMergeRequestWidget):
-
     @property
     def buttons(self):
-        # add to after the default submit button
-        return ew_core.NameList([
-            ew.Checkbox(name='subscribe', label='Subscribe to this merge request', value=True),
-        ])
+        # add things after the default submit button
+        fields = ew_core.NameList()
+        if self.show_subscribe_checkbox:
+            fields.append(ew.Checkbox(name='subscribe', label='Subscribe to this merge request', value=True))
+        return fields
 
 
 class SCMMergeRequestDisposeWidget(ff.ForgeForm):

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/Allura/allura/model/artifact.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/artifact.py b/Allura/allura/model/artifact.py
index 8ae24c6..8f9c5b6 100644
--- a/Allura/allura/model/artifact.py
+++ b/Allura/allura/model/artifact.py
@@ -34,11 +34,10 @@ from allura.lib import security
 from allura.lib import utils
 from allura.lib import plugin
 from allura.lib import exceptions as forge_exc
-
+from allura.lib.decorators import memoize
 from allura.lib.search import SearchIndexable
 from .session import main_orm_session
 from .session import project_orm_session
-
 from .session import artifact_orm_session
 from .index import ArtifactReference
 from .types import ACL, MarkdownCache
@@ -233,16 +232,22 @@ class Artifact(MappedClass, SearchIndexable):
             app_config_id=self.app_config._id,
             artifact_index_id=self.index_id())
 
-    def subscribed(self, user=None):
+    @memoize  # since its called many times from edit_post.html within threaded comments
+    def subscribed(self, user=None, include_parents=True):
         from allura.model import Mailbox
         if user is None:
             user = c.user
-        return Mailbox.subscribed(
-            user_id=user._id,
-            project_id=self.app_config.project_id,
-            app_config_id=self.app_config._id,
-            artifact=self,
-        )
+        user_proj_app_q = dict(user_id=user._id,
+                               project_id=self.app_config.project_id,
+                               app_config_id=self.app_config._id)
+        art_subscribed = Mailbox.subscribed(artifact=self, **user_proj_app_q)
+        if art_subscribed:
+            return True
+        if include_parents:
+            tool_subscribed = Mailbox.subscribed(**user_proj_app_q)
+            if tool_subscribed:
+                return True
+        return False
 
     def primary(self):
         """If an artifact is a "secondary" artifact (discussion of a ticket, for

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/Allura/allura/templates/widgets/edit_post.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/edit_post.html b/Allura/allura/templates/widgets/edit_post.html
index 63181b8..49a8242 100644
--- a/Allura/allura/templates/widgets/edit_post.html
+++ b/Allura/allura/templates/widgets/edit_post.html
@@ -32,8 +32,7 @@
     <input type="file" class="text attachment_form_fields" style="display:none" multiple name="{{att_name}}" {% if att_id %}id="{{att_id}}"{% endif %}/>
     <br>
     <input type="submit" value="{{submit_text}}" />
-    {% if primary_artifact and c.user and c.user != c.user.anonymous() %}
-      {# TODO: if not already subscribed (to artifact, or to whole tool) #}
+    {% if primary_artifact and c.user and c.user != c.user.anonymous() and not primary_artifact.subscribed() %}
       <label class="subscribe">
         <input type="checkbox" checked name="subscribe">Subscribe to this {{ primary_artifact.type_name }}
       </label>

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/Allura/allura/templates/widgets/new_topic_post.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/new_topic_post.html b/Allura/allura/templates/widgets/new_topic_post.html
index 46c806b..8910187 100644
--- a/Allura/allura/templates/widgets/new_topic_post.html
+++ b/Allura/allura/templates/widgets/new_topic_post.html
@@ -49,8 +49,8 @@
     <div class="grid-19">&nbsp;</div>
     <div class="grid-19">
       <input type="submit" value="{{submit_text}}">
-      {% if c.user and c.user != c.user.anonymous() %}
-          {# TODO: if not already subscribed to whole tool, or to forum #}
+      {% if c.user and c.user != c.user.anonymous() and not (subscribed or subscribed_to_tool) %}
+        {# subscribed is per-forum and won't change if they change the forum dropdown value, but better than nothing? :( #}
         <label class="subscribe">
           <input type="checkbox" checked name="subscribe">Subscribe to this topic
         </label>

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/Allura/allura/templates/widgets/threads_table.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/threads_table.html b/Allura/allura/templates/widgets/threads_table.html
index c4f3d0b..e259446 100644
--- a/Allura/allura/templates/widgets/threads_table.html
+++ b/Allura/allura/templates/widgets/threads_table.html
@@ -40,7 +40,7 @@
         {% if not c.user.is_anonymous() and allow_subscriptions %}
           <td>
             <input type="checkbox" name="threads-{{loop.index0}}.subscription"
-                   {%- if thread.subscribed() or forum_subscribed or tool_subscribed %} checked="checked" {% endif -%}
+                   {%- if thread.subscribed(include_parents=False) or forum_subscribed or tool_subscribed %} checked="checked" {% endif -%}
                    {%- if forum_subscribed or tool_subscribed %}
                         disabled title="You are subscribed to this entire {% if forum_subscribed %}Forum. Unsubscribe with mail icon in upper right, or on Account - Subscriptions page.
                             {%- else %}Discussion tool.  Unsubscribe on Account - Subscriptions page.{% endif %}"

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/Allura/allura/tests/model/test_artifact.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/model/test_artifact.py b/Allura/allura/tests/model/test_artifact.py
index 02a3052..017d0d3 100644
--- a/Allura/allura/tests/model/test_artifact.py
+++ b/Allura/allura/tests/model/test_artifact.py
@@ -299,3 +299,31 @@ def test_feed_from_username():
            title='Something')
     ThreadLocalORMSession.flush_all()
     assert_equal(len(M.Feed.from_username('johndoe')), 1)
+
+
+@with_setup(setUp, tearDown)
+def test_subscribed():
+    pg = WM.Page(title='TestPage4a')
+    assert pg.subscribed(include_parents=True)  # tool is subscribed to admins by default
+    assert not pg.subscribed(include_parents=False)
+
+
+@with_setup(setUp, tearDown)
+def test_subscribed_no_tool_sub():
+    pg = WM.Page(title='TestPage4b')
+    M.Mailbox.unsubscribe(user_id=c.user._id,
+                          project_id=c.project._id,
+                          app_config_id=c.app.config._id)
+    pg.subscribe()
+    assert pg.subscribed(include_parents=True)
+    assert pg.subscribed(include_parents=False)
+
+
+@with_setup(setUp, tearDown)
+def test_not_subscribed():
+    pg = WM.Page(title='TestPage4c')
+    M.Mailbox.unsubscribe(user_id=c.user._id,
+                          project_id=c.project._id,
+                          app_config_id=c.app.config._id)
+    assert not pg.subscribed(include_parents=True)
+    assert not pg.subscribed(include_parents=False)

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeBlog/forgeblog/main.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/main.py b/ForgeBlog/forgeblog/main.py
index f4706d9..7205610 100644
--- a/ForgeBlog/forgeblog/main.py
+++ b/ForgeBlog/forgeblog/main.py
@@ -296,7 +296,9 @@ class RootController(BaseController, FeedController):
         post = dict(
             state='published')
         c.form = W.new_post_form
-        return dict(post=post)
+        return dict(post=post,
+                    subscribed_to_tool=M.Mailbox.subscribed(),
+                    )
 
     @memorable_forget()
     @expose()
@@ -390,7 +392,9 @@ class PostController(BaseController, FeedController):
         self.rate_limit(BM.BlogPost, 'Create/edit', c.app.config.url())
         c.form = W.edit_post_form
         c.attachment_list = W.attachment_list
-        return dict(post=self.post)
+        return dict(post=self.post,
+                    subscribed_to_tool=M.Mailbox.subscribed(),
+                    )
 
     @without_trailing_slash
     @expose('jinja:forgeblog:templates/blog/post_history.html')

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeBlog/forgeblog/templates/blog/edit_post.html
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/templates/blog/edit_post.html b/ForgeBlog/forgeblog/templates/blog/edit_post.html
index c908a67..aa34e53 100644
--- a/ForgeBlog/forgeblog/templates/blog/edit_post.html
+++ b/ForgeBlog/forgeblog/templates/blog/edit_post.html
@@ -26,6 +26,6 @@
 
 {% block content %}
     <div class="content">
-      {{c.form.display(value=post, action='save')}}
+      {{c.form.display(value=post, action='save', subscribed_to_tool=subscribed_to_tool)}}
     </div>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeBlog/forgeblog/templates/blog_widgets/post_form.html
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/templates/blog_widgets/post_form.html b/ForgeBlog/forgeblog/templates/blog_widgets/post_form.html
index 6a4f5ba..9030e87 100644
--- a/ForgeBlog/forgeblog/templates/blog_widgets/post_form.html
+++ b/ForgeBlog/forgeblog/templates/blog_widgets/post_form.html
@@ -51,8 +51,7 @@
     {% for b in buttons %}
       {{b.display()}}
     {% endfor %}
-    {% if c.user and c.user != c.user.anonymous() and widget.fields.subscribe|default %}
-      {# TODO: if not already subscribed to whole tool #}
+    {% if c.user and c.user != c.user.anonymous() and widget.fields.subscribe|default and not subscribed_to_tool %}
       <label class="subscribe">
         <input type="checkbox" checked name="subscribe">Subscribe to this blog post
       </label>

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index bc70dbe..55c2e1f 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -39,6 +39,7 @@ from allura.lib.decorators import require_post, memorable_forget
 from allura.controllers import BaseController, DispatchIndex
 from allura.controllers.rest import AppRestControllerMixin
 from allura.controllers.feed import FeedArgs, FeedController
+from allura import model as M
 
 from .forum import ForumController
 from forgediscussion import import_support
@@ -73,8 +74,6 @@ class RootController(BaseController, DispatchIndex, FeedController):
     @with_trailing_slash
     @expose('jinja:forgediscussion:templates/discussionforums/index.html')
     def index(self, new_forum=False, **kw):
-        c.new_topic = self.W.new_topic
-        c.new_topic = self.W.new_topic
         c.add_forum = self.W.add_forum
         c.announcements_table = self.W.announcements_table
         announcements = model.ForumThread.query.find(dict(
@@ -111,15 +110,18 @@ class RootController(BaseController, DispatchIndex, FeedController):
                                              deleted=False))
         c.new_topic = self.W.new_topic
         my_forums = []
-        forum_name = h.really_unicode(unquote(
-            forum_name)) if forum_name else None
+        forum_name = h.really_unicode(unquote(forum_name)) if forum_name else None
         current_forum = None
         for f in forums:
             if forum_name == f.shortname:
                 current_forum = f
             if has_access(f, 'post')():
                 my_forums.append(f)
-        return dict(forums=my_forums, current_forum=current_forum)
+        return dict(forums=my_forums,
+                    current_forum=current_forum,
+                    subscribed=M.Mailbox.subscribed(artifact=current_forum),
+                    subscribed_to_tool=M.Mailbox.subscribed(),
+                    )
 
     @memorable_forget()
     @h.vardec

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeDiscussion/forgediscussion/model/forum.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/model/forum.py b/ForgeDiscussion/forgediscussion/model/forum.py
index 94cb053..ce54156 100644
--- a/ForgeDiscussion/forgediscussion/model/forum.py
+++ b/ForgeDiscussion/forgediscussion/model/forum.py
@@ -185,6 +185,19 @@ class ForumThread(M.Thread):
     def primary(self):
         return self
 
+    def subscribed(self, user=None, include_parents=True):
+        subbed = super(ForumThread, self).subscribed(user=user, include_parents=include_parents)
+        if subbed:
+            return subbed
+        if include_parents:
+            if user is None:
+                user = c.user
+            forum = self.discussion
+            forum_subscribed = M.Mailbox.subscribed(artifact=forum, user_id=user._id)
+            if forum_subscribed:
+                return True
+        return False
+
     def post(self, subject, text, message_id=None, parent_id=None, **kw):
         post = super(ForumThread, self).post(text, message_id=message_id, parent_id=parent_id, **kw)
         if not self.first_post_id:

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum_short.html
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum_short.html b/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum_short.html
index b949cf1..a302222 100644
--- a/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum_short.html
+++ b/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum_short.html
@@ -21,11 +21,11 @@
   <input type="hidden" name="add_forum.app_id" value="{{app and app.config._id}}">
   <div class="grid-6">
     <label class="cr">Forum Title:</label>
-    <input type="text" name="add_forum.name" style="width:90%"/>
+    <input type="text" name="add_forum.name" style="width:90%" required/>
   </div>
   <div class="grid-6">
     <label class="cr">Short Name (for URL):</label>
-    <input type="text" name="add_forum.shortname" style="width:90%"/>
+    <input type="text" name="add_forum.shortname" style="width:90%" required/>
   </div>
   <div class="grid-7">
     <label class="cr">Summary:</label>

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeDiscussion/forgediscussion/templates/discussionforums/create_topic.html
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/templates/discussionforums/create_topic.html b/ForgeDiscussion/forgediscussion/templates/discussionforums/create_topic.html
index 852c2d6..487553c 100644
--- a/ForgeDiscussion/forgediscussion/templates/discussionforums/create_topic.html
+++ b/ForgeDiscussion/forgediscussion/templates/discussionforums/create_topic.html
@@ -30,7 +30,8 @@
   {% endif %}
 {% else %}
   <div class="editbox">
-    {{c.new_topic.display(action=c.app.url + 'save_new_topic',show_subject=True,forums=forums, current_forum=current_forum)}}
+    {{c.new_topic.display(action=c.app.url + 'save_new_topic', show_subject=True, forums=forums,
+                          current_forum=current_forum, subscribed=subscribed, subscribed_to_tool=subscribed_to_tool)}}
     <div class="clear"></div>
   </div>
 {% endif %}

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeTracker/forgetracker/templates/tracker/new_ticket.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker/new_ticket.html b/ForgeTracker/forgetracker/templates/tracker/new_ticket.html
index e586a1c..b5c858d 100644
--- a/ForgeTracker/forgetracker/templates/tracker/new_ticket.html
+++ b/ForgeTracker/forgetracker/templates/tracker/new_ticket.html
@@ -25,7 +25,7 @@
 {% block edit_box %}
 <div class="editbox">
   <div class="form_holder">
-      {{c.ticket_form.display(action=action, value=url_params, help_msg=help_msg)}}
+      {{c.ticket_form.display(action=action, value=url_params, help_msg=help_msg, subscribed_to_tool=subscribed_to_tool)}}
   </div>
 </div>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_form.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_form.html b/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_form.html
index be256c1..bf280f8 100644
--- a/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_form.html
+++ b/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_form.html
@@ -126,8 +126,7 @@
   <div style="clear:both">&nbsp;</div>
   <div class="grid-18">
     {{widget.display_field_by_name('submit')|safe}}
-    {% if c.user and c.user != c.user.anonymous() and not ticket %}
-        {# TODO: if not already subscribed to whole tool #}
+    {% if c.user and c.user != c.user.anonymous() and not ticket and not subscribed_to_tool|default %}
         <label class="subscribe">
           <input type="checkbox" checked name="ticket_form.subscribe">Subscribe to this ticket
         </label>

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index c065606..ad3b2b7 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -902,7 +902,11 @@ class RootController(BaseController, FeedController):
         self.rate_limit(TM.Ticket, 'Ticket creation', redir='..')
         c.ticket_form = W.ticket_form
         help_msg = c.app.config.options.get('TicketHelpNew', '').strip()
-        return dict(action=c.app.config.url() + 'save_ticket', help_msg=help_msg, url_params=kw)
+        return dict(action=c.app.config.url() + 'save_ticket',
+                    help_msg=help_msg,
+                    url_params=kw,
+                    subscribed_to_tool=M.Mailbox.subscribed(),
+                    )
 
     @expose('jinja:allura:templates/markdown_syntax.html')
     def markdown_syntax(self, **kw):

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeWiki/forgewiki/templates/wiki/page_edit.html
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/templates/wiki/page_edit.html b/ForgeWiki/forgewiki/templates/wiki/page_edit.html
index 2cb5f50..2b468e8 100644
--- a/ForgeWiki/forgewiki/templates/wiki/page_edit.html
+++ b/ForgeWiki/forgewiki/templates/wiki/page_edit.html
@@ -70,8 +70,7 @@
   <div class="grid-20">
     <input type="submit" value="Save">
     <input type="reset" value="Cancel">
-    {% if c.user and c.user != c.user.anonymous() %}
-      {# TODO: if not already subscribed to whole tool #}
+    {% if c.user and c.user != c.user.anonymous() and not subscribed_to_tool %}
       <label class="subscribe">
         <input type="checkbox" checked name="subscribe">Subscribe to this wiki page
       </label>

http://git-wip-us.apache.org/repos/asf/allura/blob/ce7f1417/ForgeWiki/forgewiki/wiki_main.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/wiki_main.py b/ForgeWiki/forgewiki/wiki_main.py
index cb5d893..c62ee0b 100644
--- a/ForgeWiki/forgewiki/wiki_main.py
+++ b/ForgeWiki/forgewiki/wiki_main.py
@@ -620,8 +620,11 @@ class PageController(BaseController, FeedController):
         c.attachment_list = W.attachment_list
         c.label_edit = W.label_edit
         hide_left_bar = not c.app.show_left_bar
-        return dict(page=page, page_exists=page_exists,
-                    hide_left_bar=hide_left_bar)
+        return dict(page=page,
+                    page_exists=page_exists,
+                    hide_left_bar=hide_left_bar,
+                    subscribed_to_tool=M.Mailbox.subscribed(),
+                    )
 
     @without_trailing_slash
     @expose('json:')