You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by tv...@apache.org on 2013/12/05 23:21:09 UTC

[1/5] git commit: [#6941] Don't break on svn commit _id, which contains ':'

Updated Branches:
  refs/heads/tv/6829 0221e3e67 -> dcd27597d (forced update)


[#6941] Don't break on svn commit _id, which contains ':'

Signed-off-by: Tim Van Steenburgh <tv...@gmail.com>


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

Branch: refs/heads/tv/6829
Commit: 83bb21c3d2b42fa788ed1b444626bd660cd008eb
Parents: 1edeb4a
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Wed Dec 4 01:18:57 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 5 21:03:28 2013 +0000

----------------------------------------------------------------------
 Allura/allura/model/timeline.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/83bb21c3/Allura/allura/model/timeline.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/timeline.py b/Allura/allura/model/timeline.py
index 38550b8..a80e5ba 100644
--- a/Allura/allura/model/timeline.py
+++ b/Allura/allura/model/timeline.py
@@ -67,7 +67,7 @@ def perm_check(user):
         if not extras_dict: return True
         allura_id = extras_dict.get('allura_id')
         if not allura_id: return True
-        classname, _id = allura_id.split(':')
+        classname, _id = allura_id.split(':', 1)
         cls = Mapper.by_classname(classname).mapped_class
         try:
             _id = bson.ObjectId(_id)


[3/5] git commit: [#6941] Check commit activity access against original tool if possible.

Posted by tv...@apache.org.
[#6941] Check commit activity access against original tool if possible.

Signed-off-by: Tim Van Steenburgh <tv...@gmail.com>


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

Branch: refs/heads/tv/6829
Commit: 0aedbc9f4c084b954f6ff6fcf458321d02cda75d
Parents: 83bb21c
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Thu Dec 5 22:16:30 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 5 22:16:30 2013 +0000

----------------------------------------------------------------------
 Allura/allura/model/discuss.py  |  2 +-
 Allura/allura/model/repo.py     | 19 ++++++++++++++++++-
 Allura/allura/model/timeline.py |  4 ++--
 3 files changed, 21 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/0aedbc9f/Allura/allura/model/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index df55ac9..7b4f306 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -476,7 +476,7 @@ class Post(Message, VersionedArtifact, ActivityObject):
     def activity_name(self):
         return 'a comment'
 
-    def has_activity_access(self, perm, user):
+    def has_activity_access(self, perm, user, activity):
         """Return True if user has perm access to this object, otherwise
         return False.
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/0aedbc9f/Allura/allura/model/repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repo.py b/Allura/allura/model/repo.py
index 1ff6641..4a5d1ef 100644
--- a/Allura/allura/model/repo.py
+++ b/Allura/allura/model/repo.py
@@ -37,8 +37,10 @@ from ming.orm import mapper, session
 
 from allura.lib import utils
 from allura.lib import helpers as h
+from allura.lib.security import has_access
 
 from .auth import User
+from .project import AppConfig, Project
 from .session import main_doc_session, project_doc_session
 from .session import repository_orm_session
 from .timeline import ActivityObject
@@ -174,10 +176,25 @@ class Commit(RepoObject, ActivityObject):
     def activity_name(self):
         return self.shorthand_id()
 
-    def has_activity_access(self, perm, user):
+    @property
+    def activity_extras(self):
+        d = ActivityObject.activity_extras.fget(self)
+        d.update(summary=self.summary)
+        if self.repo:
+            d.update(app_config_id=self.repo.app.config._id)
+        return d
+
+    def has_activity_access(self, perm, user, activity):
         """Commits have no ACLs and are therefore always viewable by any user.
 
         """
+        app_config_id = activity.obj.activity_extras.get('app_config_id')
+        if app_config_id:
+            app_config = AppConfig.query.get(_id=app_config_id)
+            if app_config:
+                project = Project.query.get(_id=app_config.project_id)
+                app = app_config.load()(project, app_config)
+                return has_access(app, perm, user, project)
         return True
 
     def set_context(self, repo):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/0aedbc9f/Allura/allura/model/timeline.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/timeline.py b/Allura/allura/model/timeline.py
index a80e5ba..b45118e 100644
--- a/Allura/allura/model/timeline.py
+++ b/Allura/allura/model/timeline.py
@@ -51,7 +51,7 @@ class ActivityObject(base.ActivityObjectBase):
         """
         return "%s:%s" % (self.__class__.__name__, self._id)
 
-    def has_activity_access(self, perm, user):
+    def has_activity_access(self, perm, user, activity):
         """Return True if user has perm access to this object, otherwise
         return False.
         """
@@ -74,5 +74,5 @@ def perm_check(user):
         except bson.errors.InvalidId:
             pass
         obj = cls.query.get(_id=_id)
-        return obj and obj.has_activity_access('read', user)
+        return obj and obj.has_activity_access('read', user, activity)
     return _perm_check


[2/5] git commit: [#6941] Create activity events for commits

Posted by tv...@apache.org.
[#6941] Create activity events for commits

Signed-off-by: Tim Van Steenburgh <tv...@gmail.com>


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

Branch: refs/heads/tv/6829
Commit: 1edeb4ad6c89b3d8024b5dc77a4c3f32bf4a5037
Parents: 6426ead
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Wed Dec 4 00:59:20 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 5 21:03:28 2013 +0000

----------------------------------------------------------------------
 Allura/allura/model/repo.py         | 13 ++++++++++++-
 Allura/allura/model/repo_refresh.py |  2 ++
 2 files changed, 14 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1edeb4ad/Allura/allura/model/repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repo.py b/Allura/allura/model/repo.py
index 3b4feca..1ff6641 100644
--- a/Allura/allura/model/repo.py
+++ b/Allura/allura/model/repo.py
@@ -41,6 +41,7 @@ from allura.lib import helpers as h
 from .auth import User
 from .session import main_doc_session, project_doc_session
 from .session import repository_orm_session
+from .timeline import ActivityObject
 
 log = logging.getLogger(__name__)
 
@@ -164,11 +165,21 @@ class RepoObject(object):
             r = cls.query.get(_id=id)
         return r, isnew
 
-class Commit(RepoObject):
+class Commit(RepoObject, ActivityObject):
     type_s = 'Commit'
     # Ephemeral attrs
     repo=None
 
+    @property
+    def activity_name(self):
+        return self.shorthand_id()
+
+    def has_activity_access(self, perm, user):
+        """Commits have no ACLs and are therefore always viewable by any user.
+
+        """
+        return True
+
     def set_context(self, repo):
         self.repo = repo
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1edeb4ad/Allura/allura/model/repo_refresh.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repo_refresh.py b/Allura/allura/model/repo_refresh.py
index 52855b5..2a8af51 100644
--- a/Allura/allura/model/repo_refresh.py
+++ b/Allura/allura/model/repo_refresh.py
@@ -137,6 +137,8 @@ def refresh_repo(repo, all_commits=False, notify=True, new_clone=False):
                 user = User.by_username(new.committed.name)
             if user is not None:
                 g.statsUpdater.newCommit(new, repo.app_config.project, user)
+                g.director.create_activity(user, 'committed', new,
+                        related_nodes=[repo.app_config.project])
 
     log.info('Refresh complete for %s', repo.full_fs_path)
     g.post_event('repo_refreshed', len(commit_ids), all_commits, new_clone)


[5/5] git commit: [#6829] Minor fixes, added tests

Posted by tv...@apache.org.
[#6829] Minor fixes, added tests

Signed-off-by: Tim Van Steenburgh <tv...@gmail.com>


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

Branch: refs/heads/tv/6829
Commit: dcd27597dac4af12b3da9bb60f1312fd5fd86f92
Parents: 6f469f6
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Thu Dec 5 15:15:48 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 5 22:20:30 2013 +0000

----------------------------------------------------------------------
 Allura/allura/model/discuss.py                  |  8 ++-
 Allura/allura/model/repo.py                     |  4 ++
 Allura/allura/tests/test_globals.py             |  2 +-
 Allura/allura/tests/unit/test_post_model.py     | 11 ++++
 Allura/allura/tests/unit/test_repo.py           |  7 ++
 ForgeActivity/forgeactivity/main.py             | 14 +++-
 .../forgeactivity/nf/activity/css/activity.css  |  8 +--
 .../forgeactivity/templates/index.html          | 18 +++--
 .../forgeactivity/tests/functional/test_root.py | 69 ++++++++++++++++++++
 .../forgeblog/tests/unit/test_blog_post.py      |  4 +-
 .../tests/unit/test_ticket_model.py             |  5 ++
 .../forgeuserstats/tests/test_stats.py          |  2 +-
 12 files changed, 131 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/Allura/allura/model/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index 4043c3e..1059295 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -496,10 +496,14 @@ class Post(Message, VersionedArtifact, ActivityObject):
     @property
     def activity_extras(self):
         d = ActivityObject.activity_extras.fget(self)
+        # For activity summary, convert Post text to html,
+        # strip all tags, and truncate near the 80 char mark
+        LEN = 80
         summary = jinja2.Markup.escape(
                 g.markdown.cached_convert(self, 'text')).striptags()
-        if len(summary) > 80:
-            summary = summary[:80] + '...'
+        if len(summary) > LEN:
+            split = max(summary.find(' ', LEN), LEN)
+            summary = summary[:split] + '...'
         d.update(summary=summary)
         return d
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/Allura/allura/model/repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repo.py b/Allura/allura/model/repo.py
index 1f935b0..83db57d 100644
--- a/Allura/allura/model/repo.py
+++ b/Allura/allura/model/repo.py
@@ -172,6 +172,10 @@ class Commit(RepoObject, ActivityObject):
     # Ephemeral attrs
     repo=None
 
+    def __init__(self, **kw):
+        for k, v in kw.iteritems():
+            setattr(self, k, v)
+
     @property
     def activity_name(self):
         return self.shorthand_id()

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/Allura/allura/tests/test_globals.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_globals.py b/Allura/allura/tests/test_globals.py
index c35f69c..789af0e 100644
--- a/Allura/allura/tests/test_globals.py
+++ b/Allura/allura/tests/test_globals.py
@@ -188,7 +188,7 @@ def test_macro_neighborhood_feeds():
             r = g.markdown_wiki.convert('[[neighborhood_blog_posts]]')
         assert 'test content' in r
 
-@with_setup(teardown=setUp) # reset everything we changed
+@with_setup(setUp, setUp) # start clean and reset everything we change
 def test_macro_members():
     p_nbhd = M.Neighborhood.query.get(name='Projects')
     p_test = M.Project.query.get(shortname='test', neighborhood_id=p_nbhd._id)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/Allura/allura/tests/unit/test_post_model.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/unit/test_post_model.py b/Allura/allura/tests/unit/test_post_model.py
index 9ac2256..ed33ecb 100644
--- a/Allura/allura/tests/unit/test_post_model.py
+++ b/Allura/allura/tests/unit/test_post_model.py
@@ -39,3 +39,14 @@ class TestPostModel(WithDatabase):
         with h.push_config(c, user=M.User()):
             self.post.approve()
         assert self.post.status == 'ok'
+
+    def test_activity_extras(self):
+        self.post.text = """\
+This is a **bold thing**, 40 chars here.
+* Here's the first item in our list.
+* And here's the second item."""
+        assert 'allura_id' in self.post.activity_extras
+        summary = self.post.activity_extras['summary']
+        assert summary == "This is a bold thing, 40 chars here. " + \
+                          "Here's the first item in our list. " + \
+                          "And here's..."

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/Allura/allura/tests/unit/test_repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/unit/test_repo.py b/Allura/allura/tests/unit/test_repo.py
index 8c104fa..c730d59 100644
--- a/Allura/allura/tests/unit/test_repo.py
+++ b/Allura/allura/tests/unit/test_repo.py
@@ -208,6 +208,13 @@ class TestBlob(unittest.TestCase):
 
 
 class TestCommit(unittest.TestCase):
+    def test_activity_extras(self):
+        commit = M.repo.Commit()
+        commit.shorthand_id = MagicMock(return_value='abcdef')
+        commit.message = 'commit msg'
+        self.assertIn('allura_id', commit.activity_extras)
+        self.assertEqual(commit.activity_extras['summary'], commit.summary)
+
     def test_get_path_no_create(self):
         commit = M.repo.Commit()
         commit.get_tree = MagicMock()

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/ForgeActivity/forgeactivity/main.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/main.py b/ForgeActivity/forgeactivity/main.py
index 6249ed0..3d1e62f 100644
--- a/ForgeActivity/forgeactivity/main.py
+++ b/ForgeActivity/forgeactivity/main.py
@@ -46,8 +46,7 @@ class ForgeActivityApp(Application):
 
     def __init__(self, project, config):
         Application.__init__(self, project, config)
-        self.root = ForgeActivityController()
-        g.register_app_css('css/activity.css', app=self)
+        self.root = ForgeActivityController(self)
 
     def main_menu(self): # pragma no cover
         return []
@@ -68,6 +67,17 @@ class W:
     follow_toggle = FollowToggle()
 
 class ForgeActivityController(BaseController):
+    def __init__(self, app, *args, **kw):
+        super(ForgeActivityController, self).__init__(*args, **kw)
+        self.app = app
+
+    def _before(self, *args, **kw):
+        """Runs before each request to this controller.
+
+        """
+        # register the custom css for our tool
+        g.register_app_css('css/activity.css', app=self.app)
+
     @expose('jinja:forgeactivity:templates/index.html')
     @with_trailing_slash
     def index(self, **kw):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/ForgeActivity/forgeactivity/nf/activity/css/activity.css
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/nf/activity/css/activity.css b/ForgeActivity/forgeactivity/nf/activity/css/activity.css
index be36ba0..f7198fe 100644
--- a/ForgeActivity/forgeactivity/nf/activity/css/activity.css
+++ b/ForgeActivity/forgeactivity/nf/activity/css/activity.css
@@ -9,21 +9,21 @@
   padding: 20px;
   border-bottom: 1px solid #eee;
 }
-.activity ul.timeline li article time {
+.activity ul.timeline li time {
   font-size: 12px;
   color: #777;
 }
-.activity ul.timeline li article h1 {
+.activity ul.timeline li h1 {
   padding: 0;
   font-size: 16px;
   line-height: 32px;
 }
-.activity ul.timeline li article p {
+.activity ul.timeline li p {
   padding: 0;
   vertical-align: top;
   font-size: 14px;
 }
-.activity ul.timeline li article p .avatar {
+.activity ul.timeline li p .avatar {
   display: inline-block;
   margin: 0 8px 8px 0;
 }

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/ForgeActivity/forgeactivity/templates/index.html
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/templates/index.html b/ForgeActivity/forgeactivity/templates/index.html
index eadb82a..f430c64 100644
--- a/ForgeActivity/forgeactivity/templates/index.html
+++ b/ForgeActivity/forgeactivity/templates/index.html
@@ -59,16 +59,14 @@
     <ul class="timeline">
         {% for a in timeline %}
         <li>
-          <article>
-            <time datetime="{{a.published}}" title="{{a.published}}">{{h.ago(a.published, show_date_after=None)}}</time>
-            <h1>{{activity_obj(a.actor)}} {{a.verb}} {{activity_obj(a.obj)}} {% if a.target.activity_name %}on {{activity_obj(a.target)}}{% endif %}</h1>
-            {% if a.obj.activity_extras.get('summary') %}
-            <p>
-              {{ icon(a.actor, 16, 'avatar') }}
-              {{ a.obj.activity_extras.get('summary') }}
-            </p>
-            {% endif %}
-          </article>
+          <time datetime="{{a.published|datetimeformat}}" title="{{a.published|datetimeformat}}">{{h.ago(a.published, show_date_after=None)}}</time>
+          <h1>{{activity_obj(a.actor)}} {{a.verb}} {{activity_obj(a.obj)}} {% if a.target.activity_name %}on {{activity_obj(a.target)}}{% endif %}</h1>
+          {% if a.obj.activity_extras.get('summary') %}
+          <p>
+            {{ icon(a.actor, 16, 'avatar') }}
+            {{ a.obj.activity_extras.get('summary') }}
+          </p>
+          {% endif %}
         </li>
         {% endfor %}
     </ul>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/ForgeActivity/forgeactivity/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/tests/functional/test_root.py b/ForgeActivity/forgeactivity/tests/functional/test_root.py
index d0b9884..b008fc4 100644
--- a/ForgeActivity/forgeactivity/tests/functional/test_root.py
+++ b/ForgeActivity/forgeactivity/tests/functional/test_root.py
@@ -16,8 +16,10 @@
 #       under the License.
 
 from mock import patch
+from textwrap import dedent
 from tg import config
 
+import dateutil.parser
 from nose.tools import assert_equal
 
 from alluratest.controller import TestController
@@ -48,6 +50,73 @@ class TestActivityController(TestController):
         resp = self.app.get('/activity/')
         assert 'No activity to display.' in resp
 
+    @td.with_tool('test', 'activity')
+    @patch('forgeactivity.main.g.director')
+    def test_index_html(self, director):
+        from activitystream.storage.base import StoredActivity
+        from bson import ObjectId
+        director.get_timeline.return_value = [StoredActivity(**{
+            "_id" : ObjectId("529fa331033c5e6406d8b338"),
+            "obj" : {
+                    "activity_extras" : {
+                            "allura_id" : "Post:971389ad979eaafa658beb807bf4629d30f5f642.tickets@test.p.sourceforge.net",
+                            "summary" : "Just wanted to leave a comment on this..."
+                    },
+                    "activity_url" : "/p/test/tickets/_discuss/thread/08e74efd/ed7c/",
+                    "activity_name" : "a comment"
+            },
+            "target" : {
+                    "activity_extras" : {
+                            "allura_id" : "Ticket:529f57a6033c5e5985db2efa",
+                            "summary" : "Make activitystream timeline look better"
+                    },
+                    "activity_url" : "/p/test/tickets/34/",
+                    "activity_name" : "ticket #34"
+            },
+            "actor" : {
+                    "activity_extras" : {
+                            "icon_url" : "/u/test-admin/user_icon",
+                            "allura_id" : "User:521f96cb033c5e2587adbdff"
+                    },
+                    "activity_url" : "/u/test-admin/",
+                    "activity_name" : "Administrator 1",
+                    "node_id" : "User:521f96cb033c5e2587adbdff"
+            },
+            "verb" : "posted",
+            "published" : dateutil.parser.parse("2013-12-04T21:48:19.817"),
+            "score" : 1386193699,
+            "node_id" : "Project:527a6584033c5e62126f5a60",
+            "owner_id" : "Project:527a6584033c5e62126f5a60"
+        })]
+        r = self.app.get('/p/test/activity/')
+        timeline = r.html.find('ul', 'timeline')
+        assert_equal(1, len(timeline.findAll('li')))
+        activity = timeline.find('li')
+        assert_equal(activity.time['title'], "2013-12-04 21:48:19")
+        h1 = """\
+        <h1>
+        <a href="/u/test-admin/">
+         Administrator 1
+        </a>
+        posted
+        <a href="/p/test/tickets/_discuss/thread/08e74efd/ed7c/">
+         a comment
+        </a>
+        on
+        <a href="/p/test/tickets/34/">
+         ticket #34
+        </a>
+        </h1>
+        """
+        assert_equal(dedent(h1), activity.h1.prettify())
+        p = """\
+        <p>
+        <img src="/u/test-admin/user_icon" alt="Administrator 1" title="Administrator 1" class="emboss x16 avatar" />
+        Just wanted to leave a comment on this...
+        </p>
+        """
+        assert_equal(dedent(p), activity.p.prettify())
+
     @td.with_tool('u/test-user-1', 'activity')
     @td.with_user_project('test-user-1')
     def test_follow_user(self):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/ForgeBlog/forgeblog/tests/unit/test_blog_post.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/tests/unit/test_blog_post.py b/ForgeBlog/forgeblog/tests/unit/test_blog_post.py
index 919ac14..f2274d9 100644
--- a/ForgeBlog/forgeblog/tests/unit/test_blog_post.py
+++ b/ForgeBlog/forgeblog/tests/unit/test_blog_post.py
@@ -16,7 +16,7 @@
 #       under the License.
 
 from datetime import datetime
-from nose.tools import assert_equal
+from nose.tools import assert_equal, assert_true
 from pylons import tmpl_context as c
 
 from forgeblog import model as M
@@ -33,6 +33,8 @@ class TestBlogPost(BlogTestWithModel):
         assert_equal(post.title, 'test')
         assert_equal(post.text, 'test message')
         assert_equal(post.state, 'published')
+        assert_equal(post.activity_extras['summary'], post.title)
+        assert_true('allura_id' in post.activity_extras)
 
 
 class TestFeed(BlogTestWithModel):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py b/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
index 8fc8038..e7ccb2d 100644
--- a/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
+++ b/ForgeTracker/forgetracker/tests/unit/test_ticket_model.py
@@ -77,6 +77,11 @@ class TestTicketModel(TrackerTestWithModel):
         else:
             raise AssertionError('Expected schema.Invalid to be thrown')
 
+    def test_activity_extras(self):
+        t = Ticket(summary='my ticket', ticket_num=12)
+        assert_in('allura_id', t.activity_extras)
+        assert_equal(t.activity_extras['summary'], t.summary)
+
     def test_private_ticket(self):
         from pylons import tmpl_context as c
         from allura.model import ProjectRole, User

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/dcd27597/ForgeUserStats/forgeuserstats/tests/test_stats.py
----------------------------------------------------------------------
diff --git a/ForgeUserStats/forgeuserstats/tests/test_stats.py b/ForgeUserStats/forgeuserstats/tests/test_stats.py
index bbb43f5..0f8efa9 100644
--- a/ForgeUserStats/forgeuserstats/tests/test_stats.py
+++ b/ForgeUserStats/forgeuserstats/tests/test_stats.py
@@ -51,11 +51,11 @@ class TestStats(TestController):
         assert user.stats.tot_logins_count == 1 + init_logins
         assert user.stats.getLastMonthLogins() == 1 + init_logins
 
+    @td.with_user_project('test-admin')
     @td.with_tool('test', 'wiki', mount_point='wiki', mount_label='wiki', username='test-admin')
     def test_wiki_stats(self):
         initial_artifacts = c.user.stats.getArtifacts()
         initial_wiki = c.user.stats.getArtifacts(art_type="Wiki")
-
         self.app.post('/wiki/TestPage/update',
             params=dict(title='TestPage', text='some text'),
             extra_environ=dict(username=str(c.user.username)))


[4/5] git commit: [#6829] Make activity timeline look better

Posted by tv...@apache.org.
[#6829] Make activity timeline look better

Along with style changes, this also includes adding a 'summary' key
to the activity_extras dict for several ActivityObject subclasses,
and adding an 'icon_url' key to the User activity_extras dict.

Signed-off-by: Tim Van Steenburgh <tv...@gmail.com>


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

Branch: refs/heads/tv/6829
Commit: 6f469f64a99615bd07e2bb154e311f94cd6e00a6
Parents: 0aedbc9
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Wed Dec 4 22:01:58 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 5 22:20:29 2013 +0000

----------------------------------------------------------------------
 Allura/allura/model/auth.py                     |  6 ++++
 Allura/allura/model/discuss.py                  | 11 +++++++
 Allura/allura/model/repo.py                     |  2 +-
 ForgeActivity/forgeactivity/main.py             |  1 +
 .../forgeactivity/nf/activity/css/activity.css  | 29 ++++++++++++++++++
 .../forgeactivity/templates/index.html          | 31 ++++++++++++++++----
 ForgeBlog/forgeblog/model/blog.py               |  8 ++++-
 ForgeTracker/forgetracker/model/ticket.py       |  6 ++++
 ForgeWiki/forgewiki/model/wiki.py               |  8 ++++-
 9 files changed, 94 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6f469f64/Allura/allura/model/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index 432898b..d1f5b7f 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -407,6 +407,12 @@ class User(MappedClass, ActivityNode, ActivityObject):
         return self.display_name or self.username
 
     @property
+    def activity_extras(self):
+        d = ActivityObject.activity_extras.fget(self)
+        d.update(icon_url=self.icon_url())
+        return d
+
+    @property
     def stats(self):
         if 'userstats' in g.entry_points['stats']:
             from forgeuserstats.model.stats import UserStats

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6f469f64/Allura/allura/model/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index 7b4f306..4043c3e 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -18,6 +18,7 @@
 import logging
 from datetime import datetime
 
+import jinja2
 import pymongo
 from pymongo.errors import DuplicateKeyError
 from pylons import tmpl_context as c, app_globals as g
@@ -492,6 +493,16 @@ class Post(Message, VersionedArtifact, ActivityObject):
         return artifact_access and security.has_access(self, perm, user,
                 self.project)
 
+    @property
+    def activity_extras(self):
+        d = ActivityObject.activity_extras.fget(self)
+        summary = jinja2.Markup.escape(
+                g.markdown.cached_convert(self, 'text')).striptags()
+        if len(summary) > 80:
+            summary = summary[:80] + '...'
+        d.update(summary=summary)
+        return d
+
     def index(self):
         result = super(Post, self).index()
         result.update(

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6f469f64/Allura/allura/model/repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repo.py b/Allura/allura/model/repo.py
index 4a5d1ef..1f935b0 100644
--- a/Allura/allura/model/repo.py
+++ b/Allura/allura/model/repo.py
@@ -185,7 +185,7 @@ class Commit(RepoObject, ActivityObject):
         return d
 
     def has_activity_access(self, perm, user, activity):
-        """Commits have no ACLs and are therefore always viewable by any user.
+        """Check access against the original app.
 
         """
         app_config_id = activity.obj.activity_extras.get('app_config_id')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6f469f64/ForgeActivity/forgeactivity/main.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/main.py b/ForgeActivity/forgeactivity/main.py
index dbdceee..6249ed0 100644
--- a/ForgeActivity/forgeactivity/main.py
+++ b/ForgeActivity/forgeactivity/main.py
@@ -47,6 +47,7 @@ class ForgeActivityApp(Application):
     def __init__(self, project, config):
         Application.__init__(self, project, config)
         self.root = ForgeActivityController()
+        g.register_app_css('css/activity.css', app=self)
 
     def main_menu(self): # pragma no cover
         return []

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6f469f64/ForgeActivity/forgeactivity/nf/activity/css/activity.css
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/nf/activity/css/activity.css b/ForgeActivity/forgeactivity/nf/activity/css/activity.css
new file mode 100644
index 0000000..be36ba0
--- /dev/null
+++ b/ForgeActivity/forgeactivity/nf/activity/css/activity.css
@@ -0,0 +1,29 @@
+.activity {
+  padding: 0 20px 20px 20px;
+}
+.activity ul.timeline {
+  list-style: none;
+  margin: 0;
+}
+.activity ul.timeline li {
+  padding: 20px;
+  border-bottom: 1px solid #eee;
+}
+.activity ul.timeline li article time {
+  font-size: 12px;
+  color: #777;
+}
+.activity ul.timeline li article h1 {
+  padding: 0;
+  font-size: 16px;
+  line-height: 32px;
+}
+.activity ul.timeline li article p {
+  padding: 0;
+  vertical-align: top;
+  font-size: 14px;
+}
+.activity ul.timeline li article p .avatar {
+  display: inline-block;
+  margin: 0 8px 8px 0;
+}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6f469f64/ForgeActivity/forgeactivity/templates/index.html
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/templates/index.html b/ForgeActivity/forgeactivity/templates/index.html
index 6189688..eadb82a 100644
--- a/ForgeActivity/forgeactivity/templates/index.html
+++ b/ForgeActivity/forgeactivity/templates/index.html
@@ -40,17 +40,38 @@
   <a href="{{o.activity_url}}">{{o.activity_name}}</a>
 {% endmacro %}
 
+{% macro icon(o, size, className) -%}
+  {% if o.activity_extras.get('icon_url') %}
+    <img src="{{ o.activity_extras.get('icon_url') }}"
+         alt="{{ o.activity_name }}"
+         title="{{ o.activity_name }}"
+         class="emboss{% if size %} x{{size}}{% endif %}{% if className %} {{className}}{% endif %}">
+  {% else %}
+    <b data-icon="{{g.icons['user'].char}}" class="ico emboss {{g.icons['user'].css}}{% if size %} x{{size}}{% endif %}{% if className %} {{className}}{% endif %}"></b>
+  {% endif %}
+{%- endmacro %}
+
 {% block content %}
-  <div class="grid-23">
+<div class="activity">
   {% if not timeline %}
     No activity to display.
   {% else %}
-    <ul>
+    <ul class="timeline">
         {% for a in timeline %}
-        <li>{{activity_obj(a.actor)}} {{a.verb}} {{activity_obj(a.obj)}} {% if a.target.activity_name %}on {{activity_obj(a.target)}}{% endif %} {{h.ago(a.published)}}</li>
-        <!-- Score: {{ a.score }} -->
+        <li>
+          <article>
+            <time datetime="{{a.published}}" title="{{a.published}}">{{h.ago(a.published, show_date_after=None)}}</time>
+            <h1>{{activity_obj(a.actor)}} {{a.verb}} {{activity_obj(a.obj)}} {% if a.target.activity_name %}on {{activity_obj(a.target)}}{% endif %}</h1>
+            {% if a.obj.activity_extras.get('summary') %}
+            <p>
+              {{ icon(a.actor, 16, 'avatar') }}
+              {{ a.obj.activity_extras.get('summary') }}
+            </p>
+            {% endif %}
+          </article>
+        </li>
         {% endfor %}
     </ul>
   {% endif %}
-  </div>
+</div>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6f469f64/ForgeBlog/forgeblog/model/blog.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/model/blog.py b/ForgeBlog/forgeblog/model/blog.py
index 2d8f0fd..7e34aea 100644
--- a/ForgeBlog/forgeblog/model/blog.py
+++ b/ForgeBlog/forgeblog/model/blog.py
@@ -114,7 +114,13 @@ class BlogPost(M.VersionedArtifact, ActivityObject):
 
     @property
     def activity_name(self):
-        return 'blog post %s' % self.title
+        return 'a blog post'
+
+    @property
+    def activity_extras(self):
+        d = ActivityObject.activity_extras.fget(self)
+        d.update(summary=self.title)
+        return d
 
     def author(self):
         '''The author of the first snapshot of this BlogPost'''

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6f469f64/ForgeTracker/forgetracker/model/ticket.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/model/ticket.py b/ForgeTracker/forgetracker/model/ticket.py
index 5605c70..8cde75a 100644
--- a/ForgeTracker/forgetracker/model/ticket.py
+++ b/ForgeTracker/forgetracker/model/ticket.py
@@ -600,6 +600,12 @@ class Ticket(VersionedArtifact, ActivityObject, VotableArtifact):
     def activity_name(self):
         return 'ticket #%s' % self.ticket_num
 
+    @property
+    def activity_extras(self):
+        d = ActivityObject.activity_extras.fget(self)
+        d.update(summary=self.summary)
+        return d
+
     @classmethod
     def new(cls):
         '''Create a new ticket, safely (ensuring a unique ticket_num'''

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6f469f64/ForgeWiki/forgewiki/model/wiki.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/model/wiki.py b/ForgeWiki/forgewiki/model/wiki.py
index a6565d6..11ad589 100644
--- a/ForgeWiki/forgewiki/model/wiki.py
+++ b/ForgeWiki/forgewiki/model/wiki.py
@@ -107,7 +107,13 @@ class Page(VersionedArtifact, ActivityObject):
 
     @property
     def activity_name(self):
-        return 'wiki page %s' % self.title
+        return 'a wiki page'
+
+    @property
+    def activity_extras(self):
+        d = ActivityObject.activity_extras.fget(self)
+        d.update(summary=self.title)
+        return d
 
     def __json__(self):
         return dict(super(Page, self).__json__(),