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/13 06:07:47 UTC

[01/45] git commit: improve .ini comments about github import keys

Updated Branches:
  refs/heads/tv/6942 8c3c7e39e -> d75c7cdc4 (forced update)


improve .ini comments about github import keys


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

Branch: refs/heads/tv/6942
Commit: 6449dbb0b29071728e34c298cd885a75478d6c69
Parents: ac565c9
Author: Dave Brondsema <db...@slashdotmedia.com>
Authored: Tue Dec 3 21:20:03 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Tue Dec 3 21:20:03 2013 +0000

----------------------------------------------------------------------
 Allura/development.ini | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6449dbb0/Allura/development.ini
----------------------------------------------------------------------
diff --git a/Allura/development.ini b/Allura/development.ini
index 848955a..a217641 100644
--- a/Allura/development.ini
+++ b/Allura/development.ini
@@ -157,7 +157,9 @@ bulk_export_download_instructions = Sample instructions for {project}
 
 importer_upload_path = /tmp/importer_upload/{nbhd}/{project}
 
-# GitHub importer keys
+# GitHub importer keys.  For github ticket import, it is best to set
+# up an app at https://github.com/settings/applications  Use the root URL
+# of your Allura instance for both URLs, and enter client values here:
 # github_importer.client_id =
 # github_importer.client_secret =
 


[12/45] 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/785bb177
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/785bb177
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/785bb177

Branch: refs/heads/tv/6942
Commit: 785bb177d0366e52d5acb1d6341e46fd93a18739
Parents: 2374176
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Wed Dec 4 00:59:20 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Fri Dec 6 21:24:26 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/785bb177/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/785bb177/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)


[45/45] git commit: [#6942] Remove redundant etag_cache() call

Posted by tv...@apache.org.
[#6942] Remove redundant etag_cache() call

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/d75c7cdc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/d75c7cdc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/d75c7cdc

Branch: refs/heads/tv/6942
Commit: d75c7cdc4ca1df7f612d8d0ff81df5ec824fa2f5
Parents: 77e22d8
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Fri Dec 13 04:47:55 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Fri Dec 13 04:47:55 2013 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/static.py | 1 -
 Allura/allura/lib/utils.py          | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d75c7cdc/Allura/allura/controllers/static.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/static.py b/Allura/allura/controllers/static.py
index c072b2f..ce04bbe 100644
--- a/Allura/allura/controllers/static.py
+++ b/Allura/allura/controllers/static.py
@@ -48,6 +48,5 @@ class NewForgeController(object):
         """Serve stylesheet containing icon urls for every installed tool.
 
         """
-        etag_cache('tool_icon_css?' + str(g.server_start))
         return utils.serve_file(StringIO(g.tool_icon_css),
                 'tool_icon_css', 'text/css', last_modified=g.server_start)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d75c7cdc/Allura/allura/lib/utils.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/utils.py b/Allura/allura/lib/utils.py
index 60097c5..3e92f46 100644
--- a/Allura/allura/lib/utils.py
+++ b/Allura/allura/lib/utils.py
@@ -481,7 +481,7 @@ def take_while_true(source):
 def serve_file(fp, filename, content_type, last_modified=None, cache_expires=None, size=None, embed=True):
     '''Sets the response headers and serves as a wsgi iter'''
     if filename and last_modified:
-        etag_cache(u'{0}?{1}'.format(filename, last_modified))
+        etag_cache(u'{0}?{1}'.format(filename, last_modified).encode('utf-8'))
     pylons.response.headers['Content-Type'] = ''
     pylons.response.content_type = content_type.encode('utf-8')
     pylons.response.cache_expires = cache_expires or asint(tg.config.get('files_expires_header_secs', 60 * 60))


[42/45] git commit: [#6942] Make App.icon_url() smarter

Posted by tv...@apache.org.
[#6942] Make App.icon_url() smarter

New implementation is smart enough to figure out whether the app
icons are local (in the tool package) or global (part of the active
theme) and generate the proper url accordingly.

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/bb3763b5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/bb3763b5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/bb3763b5

Branch: refs/heads/tv/6942
Commit: bb3763b5517fb699ef8979efb5baad4ed94a3401
Parents: 571b237
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Thu Dec 12 16:36:02 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 21:57:59 2013 +0000

----------------------------------------------------------------------
 Allura/allura/app.py                               | 17 ++++++++++++-----
 .../allura/ext/admin/templates/project_tools.html  |  2 +-
 ForgeUserStats/forgeuserstats/main.py              |  6 +++---
 3 files changed, 16 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/bb3763b5/Allura/allura/app.py
----------------------------------------------------------------------
diff --git a/Allura/allura/app.py b/Allura/allura/app.py
index 259400f..957e880 100644
--- a/Allura/allura/app.py
+++ b/Allura/allura/app.py
@@ -15,11 +15,13 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
+import os
 import logging
 from urllib import basejoin
 from cStringIO import StringIO
 from collections import defaultdict
 
+import pkg_resources
 from tg import expose, redirect, flash, validate
 from tg.decorators import without_trailing_slash
 from pylons import request, app_globals as g, tmpl_context as c
@@ -347,17 +349,22 @@ class Application(object):
         return self.status_map.index(self.status)
 
     @classmethod
-    def icon_url(self, size):
+    def icon_url(cls, size):
         """Return URL for icon of the given ``size``.
 
         Subclasses can define their own icons by overriding
-        :attr:`icons` or by overriding this method (which, by default,
-        returns the URLs defined in :attr:`icons`).
+        :attr:`icons`.
 
         """
-        resource = self.icons.get(size)
+        resource = cls.icons.get(size)
         if resource:
-            return g.theme_href(resource)
+            f = getattr(cls, '_icon_url_maker', None)
+            if not f:
+                f = (g.forge_static if pkg_resources.resource_exists(
+                    cls.__module__, os.path.join('nf', resource))
+                    else g.theme_href)
+                setattr(cls, '_icon_url_maker', f)
+            return f(resource)
         return ''
 
     def has_access(self, user, topic):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/bb3763b5/Allura/allura/ext/admin/templates/project_tools.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_tools.html b/Allura/allura/ext/admin/templates/project_tools.html
index f70996c..56555d1 100644
--- a/Allura/allura/ext/admin/templates/project_tools.html
+++ b/Allura/allura/ext/admin/templates/project_tools.html
@@ -32,7 +32,7 @@
       <span class="tcenter grid-4 installable_tool">
         <a class="install_trig" data-tool="{{ tool['name'] }}" data-relaxed-mount-points="{{ 'true' if tool.app.relaxed_mount_points else 'false' }}">
           <span class="tool_title">{{ tool['app'].tool_label }}{{' (%s)' % tool.app.status if tool.app.status != 'production' else ''}}</span><br />
-          <img src="{{ g.theme.app_icon_url(tool['app'], 32) or 'unk.png' }}" alt="">
+          <img src="{{ g.theme.app_icon_url(tool['name'], 32) or 'unk.png' }}" alt="">
         </a>
       </span>
     {% endfor %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/bb3763b5/ForgeUserStats/forgeuserstats/main.py
----------------------------------------------------------------------
diff --git a/ForgeUserStats/forgeuserstats/main.py b/ForgeUserStats/forgeuserstats/main.py
index 4d41676..b4e4abc 100644
--- a/ForgeUserStats/forgeuserstats/main.py
+++ b/ForgeUserStats/forgeuserstats/main.py
@@ -102,9 +102,9 @@ class ForgeUserStatsApp(Application):
     config_options = Application.config_options
     default_external_feeds = []
     icons={
-        24:'../../tool/userstats/images/stats_24.png',
-        32:'../../tool/userstats/images/stats_32.png',
-        48:'../../tool/userstats/images/stats_48.png'
+        24:'userstats/images/stats_24.png',
+        32:'userstats/images/stats_32.png',
+        48:'userstats/images/stats_48.png'
     }
     root = ForgeUserStatsController()
 


[03/45] git commit: [#5475] ticket:473 Removed useless csrf tokens from oauth forms

Posted by tv...@apache.org.
[#5475] ticket:473 Removed useless csrf tokens from oauth forms


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

Branch: refs/heads/tv/6942
Commit: 5042b1d60bb4bb321a18907057ae3915715085e3
Parents: d778f65
Author: Andrej Aleksandrov <pi...@gmail.com>
Authored: Fri Nov 8 16:49:56 2013 +0200
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Wed Dec 4 15:35:11 2013 +0000

----------------------------------------------------------------------
 Allura/allura/templates/oauth_applications.html | 3 ---
 Allura/allura/templates/oauth_authorize.html    | 1 -
 2 files changed, 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5042b1d6/Allura/allura/templates/oauth_applications.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/oauth_applications.html b/Allura/allura/templates/oauth_applications.html
index 3742662..6bc90a3 100644
--- a/Allura/allura/templates/oauth_applications.html
+++ b/Allura/allura/templates/oauth_applications.html
@@ -105,7 +105,6 @@
                 <form method="POST" action="revoke_access_token" class="revoke_access_token">
                     <input type="hidden" name="_id" value="{{access_token._id}}"/>
                     <input type="submit" value="Revoke"/>
-                    {{lib.csrf_token()}}
                 </form>
             </td>
         </tr>
@@ -132,12 +131,10 @@
                 <form method="POST" action="deregister" class="deregister_consumer_token">
                     <input type="hidden" name="_id" value="{{consumer_token._id}}"/>
                     <input type="submit" value="Deregister"/>
-                    {{lib.csrf_token()}}
                 </form>
                 <form method="POST" action="generate_access_token" class="generate_access_token">
                     <input type="hidden" name="_id" value="{{consumer_token._id}}"/>
                     <input type="submit" value="Generate Bearer Token"/>
-                    {{lib.csrf_token()}}
                 </form>
             </td>
         </tr>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/5042b1d6/Allura/allura/templates/oauth_authorize.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/oauth_authorize.html b/Allura/allura/templates/oauth_authorize.html
index 7177442..0aa0437 100644
--- a/Allura/allura/templates/oauth_authorize.html
+++ b/Allura/allura/templates/oauth_authorize.html
@@ -38,7 +38,6 @@
   <input type="hidden" name="oauth_token" value="{{oauth_token}}"/>
   <input type="submit" name="no" value="No, do not authorize {{ consumer.name }}">
   <input type="submit" name="yes" value="Yes, authorize {{ consumer.name }}"><br>
-  {{lib.csrf_token()}}
 </form>
 <br style="clear:both"/>
 <h2>{{consumer.name}}</h2>


[22/45] git commit: [#6831] Allow standard browser session to auth REST API

Posted by tv...@apache.org.
[#6831] Allow standard browser session to auth REST API

Signed-off-by: Cory Johns <ad...@users.sf.net>


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

Branch: refs/heads/tv/6942
Commit: da7f34aeded76e4e2d3b4d45af5ac327f76defa6
Parents: 56e0caf
Author: Cory Johns <ad...@users.sf.net>
Authored: Tue Dec 10 20:30:37 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 05:54:17 2013 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/rest.py | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/da7f34ae/Allura/allura/controllers/rest.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/rest.py b/Allura/allura/controllers/rest.py
index 5c223f5..3566caa 100644
--- a/Allura/allura/controllers/rest.py
+++ b/Allura/allura/controllers/rest.py
@@ -96,12 +96,9 @@ class RestController(object):
 
     @expose()
     def _lookup(self, name, *remainder):
-        api_token = self._authenticate_request()
-        c.api_token = api_token
-        if api_token:
-            c.user = api_token.user
-        else:
-            c.user = M.User.anonymous()
+        c.api_token = self._authenticate_request()
+        if c.api_token:
+            c.user = c.api_token.user
         neighborhood = M.Neighborhood.query.get(url_prefix = '/' + name + '/')
         if not neighborhood: raise exc.HTTPNotFound, name
         return NeighborhoodRestController(neighborhood), remainder


[19/45] git commit: [#6971] Allow tasks to be created for user projects

Posted by tv...@apache.org.
[#6971] Allow tasks to be created for user projects

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/7fbf93c9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/7fbf93c9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/7fbf93c9

Branch: refs/heads/tv/6942
Commit: 7fbf93c9b95ced4c27f785caa3ce32f8dab7306d
Parents: fcf2e46
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Wed Dec 11 22:09:18 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Wed Dec 11 22:09:18 2013 +0000

----------------------------------------------------------------------
 Allura/allura/lib/validators.py        | 3 ++-
 Allura/allura/tests/test_validators.py | 8 ++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7fbf93c9/Allura/allura/lib/validators.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/validators.py b/Allura/allura/lib/validators.py
index 3295bb0..3556fe0 100644
--- a/Allura/allura/lib/validators.py
+++ b/Allura/allura/lib/validators.py
@@ -152,7 +152,8 @@ class PathValidator(fev.FancyValidator):
         if not nbhd:
             raise fe.Invalid('Invalid neighborhood: %s' % nbhd_url_prefix, value, state)
 
-        project = M.Project.query.get(shortname=project_name, neighborhood_id=nbhd._id)
+        project = M.Project.query.get(shortname=nbhd.shortname_prefix + project_name,
+                neighborhood_id=nbhd._id)
         if not project:
             raise fe.Invalid('Invalid project: %s' % project_name, value, state)
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/7fbf93c9/Allura/allura/tests/test_validators.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_validators.py b/Allura/allura/tests/test_validators.py
index 26779ce..f3ba1ee 100644
--- a/Allura/allura/tests/test_validators.py
+++ b/Allura/allura/tests/test_validators.py
@@ -23,6 +23,7 @@ from allura import model as M
 from allura.lib import validators as v
 from allura.lib.decorators import task
 from alluratest.controller import setup_basic_test
+from allura.websetup.bootstrap import create_user
 
 
 def setUp():
@@ -189,6 +190,13 @@ class TestPathValidator(unittest.TestCase):
         self.assertEqual(d['project'], project)
         self.assertTrue('app' not in d)
 
+    def test_project_in_nbhd_with_prefix(self):
+        create_user('myuser', make_project=True)
+        project = M.Project.query.get(shortname='u/myuser')
+        d = self.val.to_python('/u/myuser')
+        self.assertEqual(d['project'], project)
+        self.assertTrue('app' not in d)
+
     def test_valid_app(self):
         project = M.Project.query.get(shortname='test')
         app = project.app_instance('admin')


[21/45] git commit: [#6958] Added order param to tool install API

Posted by tv...@apache.org.
[#6958] Added order param to tool install API

Signed-off-by: Cory Johns <ad...@users.sf.net>


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

Branch: refs/heads/tv/6942
Commit: 56e0caf8deeec66b0a98577f76671a5d0bbc73c1
Parents: 4d30024
Author: Cory Johns <ad...@users.sf.net>
Authored: Mon Dec 9 20:39:44 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 04:32:53 2013 +0000

----------------------------------------------------------------------
 Allura/allura/ext/admin/admin_main.py        | 45 +++++++++++++++++++++--
 Allura/allura/tests/functional/test_admin.py | 45 +++++++++++++++++++++++
 2 files changed, 87 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/56e0caf8/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index f559da9..88eb0cc 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -21,6 +21,7 @@ from datetime import datetime
 from urlparse import urlparse
 import json
 import os
+from operator import itemgetter
 
 import pkg_resources
 from pylons import tmpl_context as c, app_globals as g
@@ -725,7 +726,7 @@ class ProjectAdminRestController(BaseController):
 
     @expose('json:')
     @require_post()
-    def install_tool(self, tool=None, mount_point=None, mount_label=None, **kw):
+    def install_tool(self, tool=None, mount_point=None, mount_label=None, order=None, **kw):
         """API for installing tools in current project.
 
         Requires a valid tool, mount point and mount label names.
@@ -740,7 +741,8 @@ class ProjectAdminRestController(BaseController):
             {
                 'tool': 'tickets',
                 'mount_point': 'mountpoint',
-                'mount_label': 'mountlabel'
+                'mount_label': 'mountlabel',
+                'order': 'first|last|alpha_tool'
             }
 
         Example output (in successful case)::
@@ -769,10 +771,47 @@ class ProjectAdminRestController(BaseController):
                     'info': 'Incorrect mount point name, or mount point already exists.'
                     }
 
+        if order is None:
+            order = 'last'
+        mounts = [{
+                'ordinal': ac.options.ordinal,
+                'label': ac.options.mount_label,
+                'mount': ac.options.mount_point,
+                'type': ac.tool_name.lower(),
+            } for ac in c.project.app_configs]
+        subs = {p.shortname: p for p in M.Project.query.find({'parent_id': c.project._id})}
+        for sub in subs.values():
+            mounts.append({
+                    'ordinal': sub.ordinal,
+                    'mount': sub.shortname,
+                    'type': 'sub-project',
+                })
+        mounts.sort(key=itemgetter('ordinal'))
+        if order == 'first':
+            ordinal = 0
+        elif order == 'last':
+            ordinal = len(mounts)
+        elif order == 'alpha_tool':
+            tool = tool.lower()
+            for i, mount in enumerate(mounts):
+                if mount['type'] == tool and mount['label'] > mount_label:
+                    ordinal = i
+                    break
+            else:
+                ordinal = len(mounts)
+        mounts.insert(ordinal, {'ordinal': ordinal, 'type': 'new'})
+        for i, mount in enumerate(mounts):
+            if mount['type'] == 'new':
+                pass
+            elif mount['type'] == 'sub-project':
+                subs[mount['mount']].ordinal = i
+            else:
+                c.project.app_config(mount['mount']).options.ordinal = i
+
         data = {
             'install': 'install',
             'ep_name': tool,
-            'ordinal': len(installable_tools) + len(c.project.direct_subprojects),
+            'ordinal': ordinal,
             'mount_point': mount_point,
             'mount_label': mount_label
         }

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/56e0caf8/Allura/allura/tests/functional/test_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_admin.py b/Allura/allura/tests/functional/test_admin.py
index 6953dfe..d4e5192 100644
--- a/Allura/allura/tests/functional/test_admin.py
+++ b/Allura/allura/tests/functional/test_admin.py
@@ -1123,3 +1123,48 @@ class TestRestInstallTool(TestRestApiBase):
                              params=data)
         assert_equals(r.status, '401 Unauthorized')
 
+    def test_order(self):
+        def get_labels():
+            project = M.Project.query.get(shortname='test')
+            labels = []
+            for mount in project.ordered_mounts(include_hidden=True):
+                if 'ac' in mount:
+                    labels.append(mount['ac'].options.mount_label)
+                elif 'sub' in mount:
+                    labels.append(mount['sub'].name)
+            return labels
+        assert_equals(get_labels(), ['Admin', 'Search', 'Activity', 'A Subproject'])
+
+        data = [
+                {
+                    'tool': 'tickets',
+                    'mount_point': 'ticketsmount1',
+                    'mount_label': 'ta',
+                },
+                {
+                    'tool': 'tickets',
+                    'mount_point': 'ticketsmount2',
+                    'mount_label': 'tc',
+                    'order': 'last'
+                },
+                {
+                    'tool': 'tickets',
+                    'mount_point': 'ticketsmount3',
+                    'mount_label': 'tb',
+                    'order': 'alpha_tool'
+                },
+                {
+                    'tool': 'tickets',
+                    'mount_point': 'ticketsmount4',
+                    'mount_label': 't1',
+                    'order': 'first'
+                },
+            ]
+        for datum in data:
+            r = self.api_post('/rest/p/test/admin/install_tool/', **datum)
+            assert_equals(r.json['success'], True)
+            assert_equals(r.json['info'],
+                         'Tool %s with mount_point %s and mount_label %s was created.'
+                         % (datum['tool'], datum['mount_point'], datum['mount_label']))
+
+        assert_equals(get_labels(), ['t1', 'Admin', 'Search', 'Activity', 'A Subproject', 'ta', 'tb', 'tc'])


[29/45] git commit: [#6888] Added CSRF token and missing closing tag to user message pref form

Posted by tv...@apache.org.
[#6888] Added CSRF token and missing closing tag to user message pref form

Signed-off-by: Cory Johns <ad...@users.sf.net>


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

Branch: refs/heads/tv/6942
Commit: 3480d9b4b52d5a4437fe56e801e8acd872e61874
Parents: 55e2b11
Author: Cory Johns <ad...@users.sf.net>
Authored: Thu Dec 12 17:27:10 2013 +0000
Committer: Cory Johns <ad...@users.sf.net>
Committed: Thu Dec 12 17:27:10 2013 +0000

----------------------------------------------------------------------
 Allura/allura/templates/user_prefs.html | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/3480d9b4/Allura/allura/templates/user_prefs.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/user_prefs.html b/Allura/allura/templates/user_prefs.html
index 185712f..4d75a6f 100644
--- a/Allura/allura/templates/user_prefs.html
+++ b/Allura/allura/templates/user_prefs.html
@@ -169,5 +169,7 @@
     <div class="grid-19">
         <input class="submit" type="submit" value="Save">
     </div>
+    {{ lib.csrf_token() }}
+    </form>
 </div>
 {% endblock %}


[34/45] git commit: [#6830] Let derived tools 'inherit' static resources from parent

Posted by tv...@apache.org.
[#6830] Let derived tools 'inherit' static resources from parent

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/4aeceac3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/4aeceac3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/4aeceac3

Branch: refs/heads/tv/6942
Commit: 4aeceac3483f90ab06b31e25188d1fc99a150493
Parents: 6a47d3d
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Tue Dec 10 02:06:31 2013 +0000
Committer: Cory Johns <ad...@users.sf.net>
Committed: Thu Dec 12 17:55:08 2013 +0000

----------------------------------------------------------------------
 Allura/allura/config/resources.py | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4aeceac3/Allura/allura/config/resources.py
----------------------------------------------------------------------
diff --git a/Allura/allura/config/resources.py b/Allura/allura/config/resources.py
index 6e231e4..1f1ce53 100644
--- a/Allura/allura/config/resources.py
+++ b/Allura/allura/config/resources.py
@@ -20,6 +20,7 @@ import logging
 
 import pkg_resources
 
+from allura.app import Application
 from allura.lib.helpers import iter_entry_points
 
 log = logging.getLogger(__name__)
@@ -33,11 +34,22 @@ def register_ew_resources(manager):
         'allura', pkg_resources.resource_filename('allura', 'public/nf'))
     for ep in iter_entry_points('allura'):
         try:
+            # Allow derived tools to "inherit" static resources from a parent.
+            module_name = ep.module_name
+            resource_path = os.path.join('nf', ep.name.lower())
+            if not pkg_resources.resource_exists(module_name, resource_path):
+                for cls in [c for c in ep.load().__mro__[1:]
+                        if issubclass(c, Application)]:
+                    module_name = cls.__module__
+                    if pkg_resources.resource_exists(module_name, resource_path):
+                        break
+                else:
+                    continue
+
             manager.register_directory(
                 'tool/%s' % ep.name.lower(),
                 pkg_resources.resource_filename(
-                    ep.module_name,
-                    os.path.join('nf', ep.name.lower())))
+                    module_name, resource_path))
         except ImportError:
             log.warning('Cannot import entry point %s', ep)
             raise


[20/45] git commit: [#6974] make import doc links be source-specific

Posted by tv...@apache.org.
[#6974] make import doc links be source-specific


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

Branch: refs/heads/tv/6942
Commit: 4d300243b0d6dadf9ce20b00ef8c79ef332b638e
Parents: 7fbf93c
Author: Dave Brondsema <db...@slashdotmedia.com>
Authored: Wed Dec 11 22:18:39 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 04:01:10 2013 +0000

----------------------------------------------------------------------
 Allura/development.ini                                     | 4 ++++
 ForgeImporters/forgeimporters/templates/importer_base.html | 4 ++--
 ForgeImporters/forgeimporters/templates/project_base.html  | 4 ++--
 3 files changed, 8 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4d300243/Allura/development.ini
----------------------------------------------------------------------
diff --git a/Allura/development.ini b/Allura/development.ini
index a217641..b9df222 100644
--- a/Allura/development.ini
+++ b/Allura/development.ini
@@ -319,6 +319,10 @@ markdown_cache_threshold = .1
 # markdown text longer than max length will not be converted to html
 markdown_render_max_length = 999999999
 
+# If your site has docs about specific importers, you can add them here and
+# they'll appear on the import forms
+#doc.url.importers.Google Code = http://...
+
 [app:task]
 use = main
 override_root = task

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4d300243/ForgeImporters/forgeimporters/templates/importer_base.html
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/templates/importer_base.html b/ForgeImporters/forgeimporters/templates/importer_base.html
index b22aa3d..18fc312 100644
--- a/ForgeImporters/forgeimporters/templates/importer_base.html
+++ b/ForgeImporters/forgeimporters/templates/importer_base.html
@@ -87,10 +87,10 @@
   <div>
     You'll receive an email when the import is finished.
     Import time varies depending on the amount of data being imported.
-    {% if config['doc.url.importers'] %}
+    {% if config['doc.url.importers.{}'.format(importer.source)] %}
         <br/><br/>
         For more information on what will be imported and post-import configuration,
-        please see the <a href="{{ config['doc.url.importers'] }}">import documentation</a>.
+        please see the <a href="{{ config['doc.url.importers.{}'.format(importer.source)] }}">{{importer.source}} import documentation</a>.
     {% endif %}
   </div>
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4d300243/ForgeImporters/forgeimporters/templates/project_base.html
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/templates/project_base.html b/ForgeImporters/forgeimporters/templates/project_base.html
index d34c2d1..d0bac1b 100644
--- a/ForgeImporters/forgeimporters/templates/project_base.html
+++ b/ForgeImporters/forgeimporters/templates/project_base.html
@@ -140,10 +140,10 @@
     <div style="margin:5px">
       You'll receive an email after each tool import finishes.
       Import time varies depending on the amount of data being imported.
-      {% if config['doc.url.importers'] %}
+      {% if config['doc.url.importers.{}'.format(importer.source) ] %}
           <br/><br/>
           For more information on what will be imported and post-import configuration,
-          please see the <a href="{{ config['doc.url.importers'] }}">import documentation</a>.
+          please see the <a href="{{ config['doc.url.importers.{}'.format(importer.source) ] }}">{{importer.source}} import documentation</a>.
       {% endif %}
     </div>
 


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

Posted by tv...@apache.org.
[#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/5c312e46
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/5c312e46
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/5c312e46

Branch: refs/heads/tv/6942
Commit: 5c312e46f7ae2f59ff91c9faf9f0f5e0f207bfd5
Parents: 785bb17
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Wed Dec 4 01:18:57 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Fri Dec 6 21:24:26 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/5c312e46/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)


[28/45] git commit: [#6888] ticket:495 option to disable the send message form

Posted by tv...@apache.org.
 [#6888] ticket:495 option to disable the send message form


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

Branch: refs/heads/tv/6942
Commit: 19b00b3b4e76dd1df5caef17da306c5b9c481cf7
Parents: 2426f03
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Mon Nov 25 13:00:08 2013 +0400
Committer: Cory Johns <ad...@users.sf.net>
Committed: Thu Dec 12 15:41:40 2013 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/auth.py                   |  6 ++++++
 .../ext/user_profile/templates/user_index.html      |  2 +-
 Allura/allura/ext/user_profile/user_main.py         |  4 ++++
 Allura/allura/model/auth.py                         |  1 +
 Allura/allura/templates/user_prefs.html             | 12 ++++++++++++
 Allura/allura/tests/functional/test_auth.py         |  8 ++++++++
 Allura/allura/tests/functional/test_user_profile.py | 16 ++++++++++++++++
 7 files changed, 48 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/19b00b3b/Allura/allura/controllers/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/auth.py b/Allura/allura/controllers/auth.py
index d945394..7a58eda 100644
--- a/Allura/allura/controllers/auth.py
+++ b/Allura/allura/controllers/auth.py
@@ -507,6 +507,12 @@ class PreferencesController(BaseController):
         flash('Key uploaded')
         redirect('.')
 
+    @expose()
+    @require_post()
+    def user_message(self, allow_user_message=None):
+        c.user.allow_user_message = allow_user_message is not None
+        redirect(request.referer)
+
 class UserInfoController(BaseController):
 
     def __init__(self, *args, **kwargs):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/19b00b3b/Allura/allura/ext/user_profile/templates/user_index.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/user_profile/templates/user_index.html b/Allura/allura/ext/user_profile/templates/user_index.html
index e3f2833..f3639d1 100644
--- a/Allura/allura/ext/user_profile/templates/user_index.html
+++ b/Allura/allura/ext/user_profile/templates/user_index.html
@@ -229,7 +229,7 @@
       </div>
     {% endif %}
 
-    {% if user.get_pref('email_address') and c.user.get_pref('email_address') %}
+    {% if user.get_pref('email_address') and c.user.get_pref('email_address') and user.allow_user_message %}
     <div class="grid-24">
       <b><a href="send_message">Send me a message</a></b>
     </div>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/19b00b3b/Allura/allura/ext/user_profile/user_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/user_profile/user_main.py b/Allura/allura/ext/user_profile/user_main.py
index 4666e35..c57fb60 100644
--- a/Allura/allura/ext/user_profile/user_main.py
+++ b/Allura/allura/ext/user_profile/user_main.py
@@ -107,6 +107,10 @@ class UserProfileController(BaseController, FeedController):
                     'an email address associated with their account.', 'info')
             redirect(request.referer)
 
+        if not to_user.allow_user_message:
+            flash('This user has disabled user message', 'info')
+            redirect(request.referer)
+
     @expose('jinja:allura.ext.user_profile:templates/user_index.html')
     def index(self, **kw):
         user = c.project.user_project_of

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/19b00b3b/Allura/allura/model/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index d1f5b7f..f7a8705 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -353,6 +353,7 @@ class User(MappedClass, ActivityNode, ActivityObject):
 
     #Statistics
     stats_id = FieldProperty(S.ObjectId, if_missing=None)
+    allow_user_message = FieldProperty(bool, if_missing=True)
 
     def can_send_user_message(self):
         """Return true if User is permitted to send a mesage to another user.

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/19b00b3b/Allura/allura/templates/user_prefs.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/user_prefs.html b/Allura/allura/templates/user_prefs.html
index 3185747..6f9e155 100644
--- a/Allura/allura/templates/user_prefs.html
+++ b/Allura/allura/templates/user_prefs.html
@@ -158,4 +158,16 @@
       </form>
   </div>
   {% endif %}
+<div class="grid-20">
+    <h2>User Messages</h2>
+    <form method="POST" action="user_message">
+    <div class="grid-19">
+        <input type="checkbox" id="allow_user_message" name="allow_user_message" {% if c.user.allow_user_message %} checked {% endif %}>
+        <label for="allow_user_message">Allow user messages</label>
+    </div>
+    <label class="grid-4">&nbsp;</label>
+    <div class="grid-19">
+        <input class="submit" type="submit" value="Save">
+    </div>
+</div>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/19b00b3b/Allura/allura/tests/functional/test_auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_auth.py b/Allura/allura/tests/functional/test_auth.py
index 4bb106d..cad16dd 100644
--- a/Allura/allura/tests/functional/test_auth.py
+++ b/Allura/allura/tests/functional/test_auth.py
@@ -712,6 +712,14 @@ class TestPreferences(TestController):
         user = M.User.query.get(username='test-admin')
         assert len(user.skills) == 0
 
+    @td.with_user_project('test-admin')
+    def test_user_message(self):
+        assert M.User.query.get(username='test-admin').allow_user_message
+        self.app.post('/auth/preferences/user_message')
+        assert not M.User.query.get(username='test-admin').allow_user_message
+        self.app.post('/auth/preferences/user_message', params={'allow_user_message': 'on'})
+        assert M.User.query.get(username='test-admin').allow_user_message
+
 
 class TestPasswordReset(TestController):
     @patch('allura.tasks.mail_tasks.sendmail')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/19b00b3b/Allura/allura/tests/functional/test_user_profile.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_user_profile.py b/Allura/allura/tests/functional/test_user_profile.py
index 5fb23cd..fae35e5 100644
--- a/Allura/allura/tests/functional/test_user_profile.py
+++ b/Allura/allura/tests/functional/test_user_profile.py
@@ -132,3 +132,19 @@ class TestUserProfile(TestController):
                      status=200)
 
         assert '<a href="send_message">Send me a message</a>' not in r
+
+    @td.with_user_project('test-user')
+    def test_allow_user_message(self):
+        User.by_username('test-admin').set_pref('email_address', 'admin@example.com')
+        test_user = User.by_username('test-user')
+        test_user.set_pref('email_address', 'user@example.com')
+        test_user.allow_user_message = False
+        r = self.app.get('/u/test-user/profile')
+        assert '<a href="send_message">Send me a message</a>' not in r
+        r = self.app.get('/u/test-user/profile/send_message', status=302)
+        assert 'This user has disabled user message' in self.webflash(r)
+
+
+
+
+


[33/45] git commit: [#6830] Remove project root redirect to activity app

Posted by tv...@apache.org.
[#6830] Remove project root redirect to activity app

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/6a47d3d9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/6a47d3d9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/6a47d3d9

Branch: refs/heads/tv/6942
Commit: 6a47d3d9602cf37c9bcc39a13225841529e9667a
Parents: 26209f4
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Mon Dec 9 22:22:55 2013 +0000
Committer: Cory Johns <ad...@users.sf.net>
Committed: Thu Dec 12 17:55:08 2013 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/project.py        |  4 +---
 Allura/allura/tests/functional/test_root.py | 17 -----------------
 2 files changed, 1 insertion(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6a47d3d9/Allura/allura/controllers/project.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/project.py b/Allura/allura/controllers/project.py
index ebaeaa3..b0e5b8b 100644
--- a/Allura/allura/controllers/project.py
+++ b/Allura/allura/controllers/project.py
@@ -370,9 +370,7 @@ class ProjectController(FeedController):
         activity_enabled = config.get('activitystream.enabled', False)
         activity_enabled = request.cookies.get('activitystream.enabled', activity_enabled)
         activity_enabled = asbool(activity_enabled)
-        if activity_enabled and c.project.app_instance('activity'):
-            redirect('activity/')
-        elif mount is not None:
+        if mount is not None:
             if 'ac' in mount:
                 redirect(mount['ac'].options.mount_point + '/')
             elif 'sub' in mount:

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6a47d3d9/Allura/allura/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_root.py b/Allura/allura/tests/functional/test_root.py
index aa77873..918377f 100644
--- a/Allura/allura/tests/functional/test_root.py
+++ b/Allura/allura/tests/functional/test_root.py
@@ -94,23 +94,6 @@ class TestRootController(TestController):
         assert len(response.html.findAll('a',{'href':'/adobe/adobe-1/'})) == 0
         assert len(response.html.findAll('a',{'href':'/adobe/adobe-2/'})) == 0
 
-    def test_project_redirect(self):
-        with push_config(config, **{'activitystream.enabled': 'false'}):
-            resp = self.app.get('/p/test2/')
-            assert_equal(resp.status_int, 302)
-            assert_equal(resp.location, 'http://localhost/p/test2/admin/')
-
-        with push_config(config, **{'activitystream.enabled': 'true'}):
-            resp = self.app.get('/p/test2/')
-            assert_equal(resp.status_int, 302)
-            assert_equal(resp.location, 'http://localhost/p/test2/activity/')
-
-        with push_config(config, **{'activitystream.enabled': 'false'}):
-            self.app.cookies['activitystream.enabled'] = 'true'
-            resp = self.app.get('/p/test2/')
-            assert_equal(resp.status_int, 302)
-            assert_equal(resp.location, 'http://localhost/p/test2/activity/')
-
     def test_neighborhood_home(self):
         # Install home app
         nb = M.Neighborhood.query.get(name='Adobe')


[37/45] git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-allura

Posted by tv...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-allura


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

Branch: refs/heads/tv/6942
Commit: c3f5add9ac65f4d7a1b4b4a5532d15a53d58ed15
Parents: 9208599 e569faa
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Thu Dec 12 20:08:50 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 20:08:50 2013 +0000

----------------------------------------------------------------------
 ForgeActivity/forgeactivity/nf/activity/css/activity.css | 6 +++---
 ForgeActivity/forgeactivity/templates/index.html         | 6 ++++--
 2 files changed, 7 insertions(+), 5 deletions(-)
----------------------------------------------------------------------



[25/45] git commit: [#6831] Minor fixes

Posted by tv...@apache.org.
[#6831] Minor fixes

- No trailing slash on feed urls
- Not all activity_extras dicts will have a 'summary' key

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/bad824c9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/bad824c9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/bad824c9

Branch: refs/heads/tv/6942
Commit: bad824c934a51bd107047a8e43de2b061de04a96
Parents: 3328dc0
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Thu Dec 12 06:08:09 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 06:08:09 2013 +0000

----------------------------------------------------------------------
 ForgeActivity/forgeactivity/main.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/bad824c9/ForgeActivity/forgeactivity/main.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/main.py b/ForgeActivity/forgeactivity/main.py
index 33be804..c1cc686 100644
--- a/ForgeActivity/forgeactivity/main.py
+++ b/ForgeActivity/forgeactivity/main.py
@@ -20,7 +20,7 @@ import logging
 from pylons import tmpl_context as c, app_globals as g
 from pylons import request, response
 from tg import expose, validate, config
-from tg.decorators import with_trailing_slash
+from tg.decorators import with_trailing_slash, without_trailing_slash
 from paste.deploy.converters import asbool
 from webob import exc
 from webhelpers import feedgenerator as FG
@@ -109,7 +109,7 @@ class ForgeActivityController(BaseController):
     def index(self, **kw):
         return self._get_activities_data(**kw)
 
-    @with_trailing_slash
+    @without_trailing_slash
     @expose()
     def feed(self, **kw):
         data = self._get_activities_data(**kw)
@@ -135,7 +135,7 @@ class ForgeActivityController(BaseController):
                             ),
                           link=url,
                           pubdate=t.published,
-                          description=t.obj.activity_extras.summary,
+                          description=t.obj.activity_extras.get('summary'),
                           unique_id=url,
                           author_name=t.actor.activity_name,
                           author_link=h.absurl(t.actor.activity_url))


[26/45] git commit: [#6831] Fix tests for new rest api auth logic

Posted by tv...@apache.org.
[#6831] Fix tests for new rest api auth logic

You must explicitly specify anon user for a test rest request now,
since the user will not automatically become anon if oauth or api key
authentication fails (instead, auth falls back to session cookie,
which, in the case of functional tests, would by default be an
admin user.

Also, an authorization failure for a rest request will now return
a 403 instead of a 401, since the user will be authenticated
instead of implicitly set to anon like before (in tests where
anon is not explicitly used).

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/2426f037
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/2426f037
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/2426f037

Branch: refs/heads/tv/6942
Commit: 2426f037a62605c5e899e28e083dbb9802cfe2f2
Parents: bad824c
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Thu Dec 12 07:21:26 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 07:21:26 2013 +0000

----------------------------------------------------------------------
 Allura/allura/tests/functional/test_rest.py             | 2 +-
 ForgeTracker/forgetracker/tests/functional/test_root.py | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2426f037/Allura/allura/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_rest.py b/Allura/allura/tests/functional/test_rest.py
index ea4b769..6829434 100644
--- a/Allura/allura/tests/functional/test_rest.py
+++ b/Allura/allura/tests/functional/test_rest.py
@@ -191,7 +191,7 @@ class TestRestHome(TestRestApiBase):
                      status=401)
         self.app.get('/rest/p/test/wiki/Home/',
                      extra_environ={'username': 'test-user-0'},
-                     status=401)
+                     status=403)
 
     def test_index(self):
         eps = {

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2426f037/ForgeTracker/forgetracker/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tests/functional/test_root.py b/ForgeTracker/forgetracker/tests/functional/test_root.py
index 5a8fc15..d97fadb 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -572,11 +572,11 @@ class TestFunctionalController(TrackerTestController):
         r = self.app.get(ticket_view.request.url, extra_environ=env)
         assert 'Private Ticket' not in r
         # ... and it doesn't appear in the feed
-        r = self.app.get('/p/test/bugs/feed.atom')
+        r = self.app.get('/p/test/bugs/feed.atom', extra_environ=env)
         assert 'Private Ticket' not in r
         # ... or in the API ...
-        r = self.app.get('/rest/p/test/bugs/2/', status=401)
-        r = self.app.get('/rest/p/test/bugs/')
+        r = self.app.get('/rest/p/test/bugs/2/', extra_environ=env, status=401)
+        r = self.app.get('/rest/p/test/bugs/', extra_environ=env)
         assert 'Private Ticket' not in r
 
         # update private ticket


[17/45] git commit: [#6829] Add license header to new css file

Posted by tv...@apache.org.
[#6829] Add license header to new css file

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/9a0faf0d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/9a0faf0d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/9a0faf0d

Branch: refs/heads/tv/6942
Commit: 9a0faf0de4da8da98ab7f047cb47bc338fa58a50
Parents: 1b3248e
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Mon Dec 9 17:16:30 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Mon Dec 9 17:16:30 2013 +0000

----------------------------------------------------------------------
 .../forgeactivity/nf/activity/css/activity.css   | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9a0faf0d/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 f7198fe..ca6ea59 100644
--- a/ForgeActivity/forgeactivity/nf/activity/css/activity.css
+++ b/ForgeActivity/forgeactivity/nf/activity/css/activity.css
@@ -1,3 +1,22 @@
+/*
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+
 .activity {
   padding: 0 20px 20px 20px;
 }


[31/45] git commit: [#6830] Don't make Activity app hidden by default

Posted by tv...@apache.org.
[#6830] Don't make Activity app hidden by default

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/3dc1bd61
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/3dc1bd61
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/3dc1bd61

Branch: refs/heads/tv/6942
Commit: 3dc1bd61b2dc38481e85b8a6ead5abfedd02c4e1
Parents: 1eea58c
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Mon Dec 9 14:28:28 2013 +0000
Committer: Cory Johns <ad...@users.sf.net>
Committed: Thu Dec 12 17:55:08 2013 +0000

----------------------------------------------------------------------
 ForgeActivity/forgeactivity/main.py | 8 --------
 1 file changed, 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/3dc1bd61/ForgeActivity/forgeactivity/main.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/main.py b/ForgeActivity/forgeactivity/main.py
index c1cc686..87c7557 100644
--- a/ForgeActivity/forgeactivity/main.py
+++ b/ForgeActivity/forgeactivity/main.py
@@ -43,20 +43,12 @@ class ForgeActivityApp(Application):
     default_mount_point = 'activity'
     installable = False
     searchable = False
-    hidden = True
-    sitemap=[]
 
     def __init__(self, project, config):
         Application.__init__(self, project, config)
         self.root = ForgeActivityController(self)
         self.api_root = ForgeActivityRestController(self)
 
-    def main_menu(self): # pragma no cover
-        return []
-
-    def sidebar_menu(self): # pragma no cover
-        return []
-
     def admin_menu(self): # pragma no cover
         return []
 


[43/45] git commit: [#6942] Fix App.icon_url(), add ETag caching

Posted by tv...@apache.org.
[#6942] Fix App.icon_url(), add ETag caching

- Icon resource lookup needed MRO search to work properly with
  "inherited" static resources. Moved that logic out into
  App.has_resource() so it could be used by the EW resource
  registration code in config/resource.py.

- Added ETag caching for the new tool_icon_css so we get some
  browser caching. Unfortunately we can only cache it for the life
  of the server process since we can't tell if new tools have
  been added since the last server start.

- While adding ETag caching I noticed that other app-served files
  (like user and project icons) were not being cached by the browser,
  so I added caching for them too.

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/574e4a30
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/574e4a30
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/574e4a30

Branch: refs/heads/tv/6942
Commit: 574e4a301db6910340d5eddc6c087ec02ac232c2
Parents: bb3763b
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Fri Dec 13 04:00:03 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Fri Dec 13 04:00:03 2013 +0000

----------------------------------------------------------------------
 Allura/allura/app.py                | 36 ++++++++++++++++++++++++--------
 Allura/allura/config/resources.py   | 23 +++++++-------------
 Allura/allura/controllers/static.py | 21 ++++++++++++-------
 Allura/allura/lib/app_globals.py    |  6 +++++-
 Allura/allura/lib/utils.py          |  3 +++
 5 files changed, 55 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/574e4a30/Allura/allura/app.py
----------------------------------------------------------------------
diff --git a/Allura/allura/app.py b/Allura/allura/app.py
index 957e880..0fa7556 100644
--- a/Allura/allura/app.py
+++ b/Allura/allura/app.py
@@ -356,16 +356,34 @@ class Application(object):
         :attr:`icons`.
 
         """
-        resource = cls.icons.get(size)
+        cached = getattr(cls, '_icon_url_cache', {}).get(size)
+        if cached is not None:
+            return cached
+
+        if not hasattr(cls, '_icon_url_cache'):
+            setattr(cls, '_icon_url_cache', {})
+
+        resource, url = cls.icons.get(size), ''
         if resource:
-            f = getattr(cls, '_icon_url_maker', None)
-            if not f:
-                f = (g.forge_static if pkg_resources.resource_exists(
-                    cls.__module__, os.path.join('nf', resource))
-                    else g.theme_href)
-                setattr(cls, '_icon_url_maker', f)
-            return f(resource)
-        return ''
+            resource_path = os.path.join('nf', resource)
+            url = (g.forge_static(resource) if cls.has_resource(resource_path)
+                    else g.theme_href(resource))
+        cls._icon_url_cache[size] = url
+        return url
+
+    @classmethod
+    def has_resource(cls, resource_path):
+        """Determine whether this Application has the resource pointed to by
+        ``resource_path``.
+
+        If the resource is not found for the immediate class, its parents
+        will be searched. The return value is the class that "owns" the
+        resource, or None if the resource is not found.
+
+        """
+        for klass in [o for o in cls.__mro__ if issubclass(o, Application)]:
+            if pkg_resources.resource_exists(klass.__module__, resource_path):
+                return klass
 
     def has_access(self, user, topic):
         """Return True if ``user`` can send email to ``topic``.

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/574e4a30/Allura/allura/config/resources.py
----------------------------------------------------------------------
diff --git a/Allura/allura/config/resources.py b/Allura/allura/config/resources.py
index 1f1ce53..b289416 100644
--- a/Allura/allura/config/resources.py
+++ b/Allura/allura/config/resources.py
@@ -20,7 +20,6 @@ import logging
 
 import pkg_resources
 
-from allura.app import Application
 from allura.lib.helpers import iter_entry_points
 
 log = logging.getLogger(__name__)
@@ -34,22 +33,14 @@ def register_ew_resources(manager):
         'allura', pkg_resources.resource_filename('allura', 'public/nf'))
     for ep in iter_entry_points('allura'):
         try:
-            # Allow derived tools to "inherit" static resources from a parent.
-            module_name = ep.module_name
+            app = ep.load()
             resource_path = os.path.join('nf', ep.name.lower())
-            if not pkg_resources.resource_exists(module_name, resource_path):
-                for cls in [c for c in ep.load().__mro__[1:]
-                        if issubclass(c, Application)]:
-                    module_name = cls.__module__
-                    if pkg_resources.resource_exists(module_name, resource_path):
-                        break
-                else:
-                    continue
-
-            manager.register_directory(
-                'tool/%s' % ep.name.lower(),
-                pkg_resources.resource_filename(
-                    module_name, resource_path))
+            resource_cls = app.has_resource(resource_path)
+            if resource_cls:
+                manager.register_directory(
+                    'tool/%s' % ep.name.lower(),
+                    pkg_resources.resource_filename(
+                        resource_cls.__module__, resource_path))
         except ImportError:
             log.warning('Cannot import entry point %s', ep)
             raise

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/574e4a30/Allura/allura/controllers/static.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/static.py b/Allura/allura/controllers/static.py
index 87687f0..c072b2f 100644
--- a/Allura/allura/controllers/static.py
+++ b/Allura/allura/controllers/static.py
@@ -15,16 +15,17 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import os
-import mimetypes
-import pkg_resources
-from tg import expose, redirect, flash, config, validate, request, response
-from tg.decorators import with_trailing_slash, without_trailing_slash
+from cStringIO import StringIO
+
+from tg import expose
+from tg.decorators import without_trailing_slash
 from webob import exc
 
 from pylons import tmpl_context as c, app_globals as g
+from pylons.controllers.util import etag_cache
 from allura.lib import helpers as h
-from allura import model as M
+from allura.lib import utils
+
 
 class NewForgeController(object):
 
@@ -44,5 +45,9 @@ class NewForgeController(object):
 
     @expose()
     def tool_icon_css(self):
-        response.content_type = 'text/css'
-        return g.tool_icon_css
+        """Serve stylesheet containing icon urls for every installed tool.
+
+        """
+        etag_cache('tool_icon_css?' + str(g.server_start))
+        return utils.serve_file(StringIO(g.tool_icon_css),
+                'tool_icon_css', 'text/css', last_modified=g.server_start)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/574e4a30/Allura/allura/lib/app_globals.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/app_globals.py b/Allura/allura/lib/app_globals.py
index 07b8e09..17e3b89 100644
--- a/Allura/allura/lib/app_globals.py
+++ b/Allura/allura/lib/app_globals.py
@@ -139,7 +139,7 @@ class Globals(object):
         self.__dict__ = self.__shared_state
         if self.__shared_state: return
         self.allura_templates = pkg_resources.resource_filename('allura', 'templates')
-
+        self.server_start = datetime.datetime.utcnow()
         # Setup SOLR
         self.solr_server = aslist(config.get('solr.server'), ',')
         # skip empty strings in case of extra commas
@@ -472,6 +472,10 @@ class Globals(object):
 
     @LazyProperty
     def tool_icon_css(self):
+        """Return a string of CSS containing class names and icon urls for
+        every installed tool.
+
+        """
         css = ''
         for tool_name in self.entry_points['tool']:
             for size in (24, 32, 48):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/574e4a30/Allura/allura/lib/utils.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/utils.py b/Allura/allura/lib/utils.py
index 7d4c081..55b36f0 100644
--- a/Allura/allura/lib/utils.py
+++ b/Allura/allura/lib/utils.py
@@ -37,6 +37,7 @@ from formencode import Invalid
 from tg.decorators import before_validate
 from pylons import response
 from pylons import tmpl_context as c
+from pylons.controllers.util import etag_cache
 from paste.deploy.converters import asbool, asint
 from paste.httpheaders import CACHE_CONTROL, EXPIRES
 from webhelpers.html import literal
@@ -479,6 +480,8 @@ def take_while_true(source):
 
 def serve_file(fp, filename, content_type, last_modified=None, cache_expires=None, size=None, embed=True):
     '''Sets the response headers and serves as a wsgi iter'''
+    if filename and last_modified:
+        etag_cache('{0}?{1}'.format(filename, last_modified))
     pylons.response.headers['Content-Type'] = ''
     pylons.response.content_type = content_type.encode('utf-8')
     pylons.response.cache_expires = cache_expires or asint(tg.config.get('files_expires_header_secs', 60 * 60))


[04/45] git commit: [#5475] ticket:473 CSRF token was added to all hand-coded forms

Posted by tv...@apache.org.
[#5475] ticket:473 CSRF token was added to all hand-coded forms


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

Branch: refs/heads/tv/6942
Commit: d778f65aa1ec893ce3a69129b6d14417bf8d3800
Parents: 127ea61
Author: Andrej Aleksandrov <pi...@gmail.com>
Authored: Fri Nov 8 15:11:57 2013 +0200
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Wed Dec 4 15:35:11 2013 +0000

----------------------------------------------------------------------
 .../ext/admin/templates/admin_widgets/metadata_admin.html       | 2 ++
 Allura/allura/ext/admin/templates/export.html                   | 1 +
 Allura/allura/ext/admin/templates/project_groups.html           | 2 ++
 Allura/allura/ext/admin/templates/project_invitations.html      | 1 +
 Allura/allura/ext/admin/templates/project_permissions.html      | 1 +
 Allura/allura/ext/admin/templates/project_tools.html            | 5 +++++
 Allura/allura/ext/admin/templates/project_trove.html            | 5 ++++-
 Allura/allura/ext/admin/templates/widgets/block_list.html       | 2 ++
 Allura/allura/ext/admin/templates/widgets/block_user.html       | 2 ++
 Allura/allura/templates/app_admin_options.html                  | 2 ++
 Allura/allura/templates/app_admin_permissions.html              | 1 +
 Allura/allura/templates/award.html                              | 1 +
 Allura/allura/templates/claim_openid.html                       | 1 +
 Allura/allura/templates/jinja_master/sidebar_menu.html          | 2 ++
 Allura/allura/templates/login.html                              | 1 +
 Allura/allura/templates/neighborhood_admin_accolades.html       | 4 ++++
 Allura/allura/templates/neighborhood_moderate.html              | 2 ++
 Allura/allura/templates/oauth_applications.html                 | 3 +++
 Allura/allura/templates/oauth_authorize.html                    | 1 +
 Allura/allura/templates/repo/default_branch.html                | 1 -
 Allura/allura/templates/repo/fork.html                          | 1 +
 Allura/allura/templates/repo/tarball.html                       | 1 +
 Allura/allura/templates/repo/tree.html                          | 1 +
 Allura/allura/templates/setup_openid_user.html                  | 1 +
 Allura/allura/templates/site_admin_add_subscribers.html         | 1 +
 Allura/allura/templates/site_admin_api_tickets.html             | 1 +
 Allura/allura/templates/site_admin_new_projects.html            | 1 +
 Allura/allura/templates/site_admin_reclone_repo.html            | 3 ++-
 Allura/allura/templates/site_admin_task_new.html                | 1 +
 Allura/allura/templates/site_admin_task_view.html               | 1 +
 Allura/allura/templates/user_prefs.html                         | 3 +++
 Allura/allura/templates/widgets/admin_form.html                 | 2 ++
 Allura/allura/templates/widgets/attachment_add.html             | 2 ++
 Allura/allura/templates/widgets/attachment_list.html            | 3 +++
 Allura/allura/templates/widgets/edit_post.html                  | 2 ++
 Allura/allura/templates/widgets/flag_post.html                  | 4 +++-
 Allura/allura/templates/widgets/forge_form.html                 | 2 +-
 Allura/allura/templates/widgets/moderate_post.html              | 4 ++++
 Allura/allura/templates/widgets/moderate_posts.html             | 2 ++
 Allura/allura/templates/widgets/neighborhood_add_project.html   | 2 ++
 Allura/allura/templates/widgets/neighborhood_overview_form.html | 1 +
 Allura/allura/templates/widgets/new_topic_post.html             | 2 ++
 Allura/allura/templates/widgets/page_size.html                  | 2 ++
 Allura/allura/templates/widgets/post_widget.html                | 1 +
 Allura/allura/templates/widgets/project_screenshots.html        | 3 +++
 Allura/allura/templates/widgets/search_results.html             | 2 ++
 Allura/allura/templates/widgets/subscription_form.html          | 2 ++
 Allura/allura/templates/widgets/vote.html                       | 2 ++
 ForgeBlog/forgeblog/templates/blog/admin_exfeed.html            | 2 ++
 ForgeBlog/forgeblog/templates/blog/post_history.html            | 1 +
 ForgeBlog/forgeblog/templates/blog_widgets/post_form.html       | 2 ++
 .../forgediscussion/templates/discussion_widgets/add_forum.html | 1 +
 .../templates/discussion_widgets/add_forum_short.html           | 2 ++
 .../templates/discussionforums/admin_forums.html                | 2 ++
 .../forgediscussion/templates/discussionforums/stats_graph.html | 4 +++-
 ForgeImporters/forgeimporters/templates/importer_base.html      | 1 +
 ForgeImporters/forgeimporters/templates/project_base.html       | 1 +
 ForgeShortUrl/forgeshorturl/templates/form.html                 | 3 +++
 ForgeTracker/forgetracker/templates/tracker/admin_fields.html   | 1 +
 ForgeTracker/forgetracker/templates/tracker/bin.html            | 1 +
 ForgeTracker/forgetracker/templates/tracker/milestones.html     | 1 +
 ForgeTracker/forgetracker/templates/tracker/search.html         | 1 +
 .../forgetracker/templates/tracker_widgets/bin_form.html        | 2 ++
 .../forgetracker/templates/tracker_widgets/mass_edit_form.html  | 4 +++-
 .../forgetracker/templates/tracker_widgets/options_admin.html   | 2 ++
 .../forgetracker/templates/tracker_widgets/ticket_form.html     | 1 +
 .../templates/tracker_widgets/ticket_search_results.html        | 2 ++
 ForgeWiki/forgewiki/templates/wiki/page_edit.html               | 2 ++
 68 files changed, 122 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/ext/admin/templates/admin_widgets/metadata_admin.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/admin_widgets/metadata_admin.html b/Allura/allura/ext/admin/templates/admin_widgets/metadata_admin.html
index bfce390..a1a20ab 100644
--- a/Allura/allura/ext/admin/templates/admin_widgets/metadata_admin.html
+++ b/Allura/allura/ext/admin/templates/admin_widgets/metadata_admin.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="POST" action="update" enctype="multipart/form-data" id="metadata_form">
   <div class="grid-9">
     {{ widget.display_label(widget.fields.name) }}
@@ -170,4 +171,5 @@
   <div class="grid-15">
     <input type="submit" value="Save">
   </div>
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/ext/admin/templates/export.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/export.html b/Allura/allura/ext/admin/templates/export.html
index a0620ad..a8081f1 100644
--- a/Allura/allura/ext/admin/templates/export.html
+++ b/Allura/allura/ext/admin/templates/export.html
@@ -56,6 +56,7 @@
       </div>
       {% endfor %}
       <p><div class="grid-19"><input type="submit" value="Export" {% if status == 'busy' %}disabled{% endif %}></div></p>
+      {{lib.csrf_token()}}
     </form>
   {% else %}
     There are no exportable tools in your project.

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/ext/admin/templates/project_groups.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_groups.html b/Allura/allura/ext/admin/templates/project_groups.html
index 54f7c26..7783f70 100644
--- a/Allura/allura/ext/admin/templates/project_groups.html
+++ b/Allura/allura/ext/admin/templates/project_groups.html
@@ -45,6 +45,7 @@
 {% endmacro %}
 
 {% block content %}
+              {{lib.csrf_token()}}
 <p>Project permissions are assigned to groups of users. Add users to a group appropriate to the role they fill in your project. <a href="#" id="show_help">more...</a></p>
 <div id="help_text" style="display:none">
 <p>By default, your project has three groups of progressively more privileged users (Member, Developer, and Admin groups). There are also catch alls for any logged in user (Authenticated) and any user even if they aren't logged in (Anonymous). Permissions allowed to a less privileged group are inherited by more privileged ones.</p>
@@ -84,6 +85,7 @@
               <input type="text" placeholder="type a username">
               <input type="submit" value="Save" class="nofloat">
               <a href="#" class="cancel_link">cancel</a>
+              {{lib.csrf_token()}}
             </form>
           </li>
           <li class="adder">

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/ext/admin/templates/project_invitations.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_invitations.html b/Allura/allura/ext/admin/templates/project_invitations.html
index 7f4e63e..32c7e05 100644
--- a/Allura/allura/ext/admin/templates/project_invitations.html
+++ b/Allura/allura/ext/admin/templates/project_invitations.html
@@ -37,5 +37,6 @@
               {% endfor %}
             </select>
             <input type="submit" value="Join Neighborhood"/>
+            {{lib.csrf_token()}}
           </form>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/ext/admin/templates/project_permissions.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_permissions.html b/Allura/allura/ext/admin/templates/project_permissions.html
index 186bd06..c1ef6c6 100644
--- a/Allura/allura/ext/admin/templates/project_permissions.html
+++ b/Allura/allura/ext/admin/templates/project_permissions.html
@@ -47,5 +47,6 @@
     <input type="submit" value="Save">
     <a href="" class="btn link cancel">Cancel</a>
   </p>
+  {{lib.csrf_token()}}
 </form>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/ext/admin/templates/project_tools.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_tools.html b/Allura/allura/ext/admin/templates/project_tools.html
index 36f98f5..dc193c1 100644
--- a/Allura/allura/ext/admin/templates/project_tools.html
+++ b/Allura/allura/ext/admin/templates/project_tools.html
@@ -73,6 +73,7 @@
     <div class="grid-13">
       <input type="submit" value="Save" name="new.install"> <a href="#" class="close btn link">Cancel</a>
     </div>
+    {{lib.csrf_token()}}
   </form>
   {{c.install_modal.display(content='<h1>Install <span id="install_tool_label">Tool</span></h1>')}}
 
@@ -108,6 +109,7 @@
                         {% if mount['ac'].load().uninstallable %}
                           <a href="#" class="mount_delete" data-mount-point="{{ mount['ac'].options.mount_point }}">Delete</a>
                         {% endif %}
+                        {{lib.csrf_token()}}
                       </form>
                     </li>
                     {% endif %}
@@ -131,6 +133,7 @@
                                  value="{{mount['sub'].shortname}}"/>
                           <input name="subproject-{{loop.index0}}.delete" type="hidden" value="Delete"/>
                           <a href="#" class="mount_delete" data-mount-point="{{ mount['sub'].shortname }}">Delete</a>
+                          {{lib.csrf_token()}}
                       </form>
                     </li>
                 </ul>
@@ -147,6 +150,7 @@
   <div class="grid-13">
     <input type="button" value="Delete" class="continue_delete"> <input type="button" value="Cancel" class="cancel_delete close">
   </div>
+  {{lib.csrf_token()}}
 </form>
 {{c.admin_modal.display(content='<h1 id="popup_title"></h1><div id="popup_contents"></div>')}}
 {{c.mount_delete.display(content='<h1>Confirm Delete</h1>')}}
@@ -158,6 +162,7 @@
         <input name="grouping_threshold" value="{{c.project.get_tool_data('allura', 'grouping_threshold', 1)}}"/>
     </label>
     <br/><input type="submit" value="Change"/>
+    {{lib.csrf_token()}}
 </form>
 {% endblock %}
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/ext/admin/templates/project_trove.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_trove.html b/Allura/allura/ext/admin/templates/project_trove.html
index fb799da..fbd220c 100644
--- a/Allura/allura/ext/admin/templates/project_trove.html
+++ b/Allura/allura/ext/admin/templates/project_trove.html
@@ -33,6 +33,7 @@
         <input type="hidden" name="type" value="{{base.shortname}}">
         <input type="hidden" name="trove" value="{{cat.trove_cat_id}}">
         <input type="submit" value="Delete">
+        {{lib.csrf_token()}}
       </form>
     </div>
   {% else %}
@@ -52,6 +53,7 @@
       </select>
       <br>
       <input type="submit" value="Add">
+      {{lib.csrf_token()}}
     </form>
   </div>
 {% endmacro %}
@@ -67,6 +69,7 @@
         {{ c.label_edit.display(id='labels', name='labels', value=c.project.labels) }}
         <br style="clear:both">
         <input type="submit" value="Save">
+        {{lib.csrf_token()}}
       </form>
     </div>
   {{show_trove_base_cat(topic_trove)}}
@@ -105,7 +108,7 @@
                     insertAfter = this;
                 }
               });
-              var $newItem = $('<div><span class="trove_fullpath">'+resp.trove_full_path+'</span> <form class="trove_deleter"><input type="hidden" name="type" value="'+type+'"><input type="hidden" name="trove" value="'+new_id+'">'+del_btn+'</form></div>');
+              var $newItem = $('<div><span class="trove_fullpath">'+resp.trove_full_path+'</span> <form class="trove_deleter"><input type="hidden" name="type" value="'+type+'"><input type="hidden" name="trove" value="'+new_id+'">'+del_btn+'</form>{{lib.csrf_token()}}</div>');
               if (insertAfter) {
                 $newItem.insertAfter(insertAfter);
               } else {

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/ext/admin/templates/widgets/block_list.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/widgets/block_list.html b/Allura/allura/ext/admin/templates/widgets/block_list.html
index c3db3ba..0163a6f 100644
--- a/Allura/allura/ext/admin/templates/widgets/block_list.html
+++ b/Allura/allura/ext/admin/templates/widgets/block_list.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <h1>Block list</h1>
 <form action="unblock_user" method="POST">
 <div class="model-block-list"></div>
@@ -24,4 +25,5 @@
 <hr>
 <div class="grid-13">&nbsp;</div>
 <input type="submit" value="Unblock">
+{{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/ext/admin/templates/widgets/block_user.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/widgets/block_user.html b/Allura/allura/ext/admin/templates/widgets/block_user.html
index 9f087c3..8b1ea92 100644
--- a/Allura/allura/ext/admin/templates/widgets/block_user.html
+++ b/Allura/allura/ext/admin/templates/widgets/block_user.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <h1>Block User</h1>
 <form action="block_user" method="POST">
     <label class="grid-13">User Name</label>
@@ -28,4 +29,5 @@
     <div class="grid-13">&nbsp;</div>
     <input type="submit" value="Save">
     <a href="#" class="close">Cancel</a>
+    {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/app_admin_options.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/app_admin_options.html b/Allura/allura/templates/app_admin_options.html
index 83a3aa6..8924823 100644
--- a/Allura/allura/templates/app_admin_options.html
+++ b/Allura/allura/templates/app_admin_options.html
@@ -17,6 +17,7 @@
        under the License.
 -#}
 <!DOCTYPE html>
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="post" action="{{c.project.url()}}admin/{{app.config.options.mount_point}}/configure">
   {% for o in app.config_options if o.name not in ['mount_point', 'mount_label', 'ordinal'] %}
     <label for="{{o.name}}" class="grid-4">{{o.label}}</label>
@@ -43,4 +44,5 @@
       <a href="#" class="close">Cancel</a>
     </div>
   {% endif %}
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/app_admin_permissions.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/app_admin_permissions.html b/Allura/allura/templates/app_admin_permissions.html
index 8f03987..7433ede 100644
--- a/Allura/allura/templates/app_admin_permissions.html
+++ b/Allura/allura/templates/app_admin_permissions.html
@@ -59,6 +59,7 @@
         <input type="submit" value="Save">
         <a href="{{c.app.url}}" class="btn link cancel">Cancel</a>
       </p>
+      {{lib.csrf_token()}}
     </form>
     {{c.block_user.display()}}
     {{c.block_list.display()}}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/award.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/award.html b/Allura/allura/templates/award.html
index 503714f..329b8b2 100644
--- a/Allura/allura/templates/award.html
+++ b/Allura/allura/templates/award.html
@@ -58,6 +58,7 @@
               </tr>
             </tbody>
           </table>
+          {{lib.csrf_token()}}
         </form>
         <p><a href="../../accolades">&#060;&#060; Back</a></p>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/claim_openid.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/claim_openid.html b/Allura/allura/templates/claim_openid.html
index 7421dfa..4d61d1e 100644
--- a/Allura/allura/templates/claim_openid.html
+++ b/Allura/allura/templates/claim_openid.html
@@ -42,6 +42,7 @@
       <div class="grid-18">
         <input type="submit" id="submit" value="Claim">
       </div>
+      {{lib.csrf_token()}}
     </form>
   </div>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/jinja_master/sidebar_menu.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/sidebar_menu.html b/Allura/allura/templates/jinja_master/sidebar_menu.html
index 08beed2..5f82e64 100644
--- a/Allura/allura/templates/jinja_master/sidebar_menu.html
+++ b/Allura/allura/templates/jinja_master/sidebar_menu.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 {% set ul_active = [] %}
 {% macro sidebar_item(s) -%}
   {% if s.url %}
@@ -41,6 +42,7 @@
   {% if c.app and c.app.searchable %}
     <form id="search" method="GET" action="{{c.app.url + 'search/'}}">
       <input name="q" type="text" title="Search {{c.app.config.options.mount_label}}" placeholder="Search {{c.app.config.options.mount_label}}">
+      {{lib.csrf_token()}}
     </form>
   {% else %}
     <div>&nbsp;</div>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/login.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/login.html b/Allura/allura/templates/login.html
index fef3f7f..9153679 100644
--- a/Allura/allura/templates/login.html
+++ b/Allura/allura/templates/login.html
@@ -47,6 +47,7 @@
             <div class="grid-18"><input type="text" id="username_oid" name="username"/></div>
             <label class="grid-4">&nbsp;</label>
             <div class="grid-18"><input type="submit" id="submit_oid" value="Login"/></div>
+            {{lib.csrf_token()}}
           </form>
         </div>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/neighborhood_admin_accolades.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/neighborhood_admin_accolades.html b/Allura/allura/templates/neighborhood_admin_accolades.html
index 2f6d82f..a092baa 100644
--- a/Allura/allura/templates/neighborhood_admin_accolades.html
+++ b/Allura/allura/templates/neighborhood_admin_accolades.html
@@ -57,6 +57,7 @@
                       <td>
                         <form action="{{award.longurl()}}/delete" method="post">
                           <input type="submit" value="Delete"/>
+                          {{lib.csrf_token()}}
                         </form>
                     </tr>
                   {% endfor %}
@@ -94,6 +95,7 @@
                 </tr>
               </tbody>
             </table>
+            {{lib.csrf_token()}}
           </form>
 
           {% if awards_count > 0 %}
@@ -126,6 +128,7 @@
                   </tr>
                 </tbody>
               </table>
+              {{lib.csrf_token()}}
             </form>
           </p>
           {% endif %}
@@ -150,6 +153,7 @@
                       <td>
                         <form action="{{grant.longurl()}}/revoke" method="post">
                           <input type="submit" value="Revoke"/>
+                          {{lib.csrf_token()}}
                         </form>
                     </tr>
                   {% endfor %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/neighborhood_moderate.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/neighborhood_moderate.html b/Allura/allura/templates/neighborhood_moderate.html
index 5fe5c3f..c164140 100644
--- a/Allura/allura/templates/neighborhood_moderate.html
+++ b/Allura/allura/templates/neighborhood_moderate.html
@@ -47,6 +47,7 @@
 	</p>
     <input type="submit" name="invite" value="Invite!"/>
     <input type="submit" name="uninvite" value="Cancel Invitation!"/>
+    {{lib.csrf_token()}}
   </form>
 
 
@@ -62,5 +63,6 @@
       {% endfor %}
     </select>
     <input type="submit" value="Evict!"/>
+    {{lib.csrf_token()}}
   </form>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/oauth_applications.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/oauth_applications.html b/Allura/allura/templates/oauth_applications.html
index 6bc90a3..3742662 100644
--- a/Allura/allura/templates/oauth_applications.html
+++ b/Allura/allura/templates/oauth_applications.html
@@ -105,6 +105,7 @@
                 <form method="POST" action="revoke_access_token" class="revoke_access_token">
                     <input type="hidden" name="_id" value="{{access_token._id}}"/>
                     <input type="submit" value="Revoke"/>
+                    {{lib.csrf_token()}}
                 </form>
             </td>
         </tr>
@@ -131,10 +132,12 @@
                 <form method="POST" action="deregister" class="deregister_consumer_token">
                     <input type="hidden" name="_id" value="{{consumer_token._id}}"/>
                     <input type="submit" value="Deregister"/>
+                    {{lib.csrf_token()}}
                 </form>
                 <form method="POST" action="generate_access_token" class="generate_access_token">
                     <input type="hidden" name="_id" value="{{consumer_token._id}}"/>
                     <input type="submit" value="Generate Bearer Token"/>
+                    {{lib.csrf_token()}}
                 </form>
             </td>
         </tr>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/oauth_authorize.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/oauth_authorize.html b/Allura/allura/templates/oauth_authorize.html
index 0aa0437..7177442 100644
--- a/Allura/allura/templates/oauth_authorize.html
+++ b/Allura/allura/templates/oauth_authorize.html
@@ -38,6 +38,7 @@
   <input type="hidden" name="oauth_token" value="{{oauth_token}}"/>
   <input type="submit" name="no" value="No, do not authorize {{ consumer.name }}">
   <input type="submit" name="yes" value="Yes, authorize {{ consumer.name }}"><br>
+  {{lib.csrf_token()}}
 </form>
 <br style="clear:both"/>
 <h2>{{consumer.name}}</h2>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/repo/default_branch.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/repo/default_branch.html b/Allura/allura/templates/repo/default_branch.html
index 6c20021..e72634a 100644
--- a/Allura/allura/templates/repo/default_branch.html
+++ b/Allura/allura/templates/repo/default_branch.html
@@ -16,7 +16,6 @@
        specific language governing permissions and limitations
        under the License.
 -#}
-
 <form action="{{c.project.url()}}admin/{{app.config.options.mount_point}}/set_default_branch_name" method="POST">
     <label class="grid-13">Default branch name:</label>
     <div class="grid-13">

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/repo/fork.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/repo/fork.html b/Allura/allura/templates/repo/fork.html
index b552273..b8698d5 100644
--- a/Allura/allura/templates/repo/fork.html
+++ b/Allura/allura/templates/repo/fork.html
@@ -47,5 +47,6 @@
         <input type="submit" value="Fork"/>
       </div>
     {% endif %}
+    {{lib.csrf_token()}}
 </form>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/repo/tarball.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/repo/tarball.html b/Allura/allura/templates/repo/tarball.html
index f929433..d68430d 100644
--- a/Allura/allura/templates/repo/tarball.html
+++ b/Allura/allura/templates/repo/tarball.html
@@ -91,6 +91,7 @@ Commit <a href="{{commit.url()}}">{{commit.shorthand_id()}}</a> {{commit_labels(
       <p>We're having trouble finding that snapshot. Would you like to resubmit?</p>
       <input type="hidden" name="path" value="{{path}}" />
       <input type="submit" value="Resubmit Snapshot Request" />
+      {{lib.csrf_token()}}
     </form>
 </div>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/repo/tree.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/repo/tree.html b/Allura/allura/templates/repo/tree.html
index 851ad38..e310056 100644
--- a/Allura/allura/templates/repo/tree.html
+++ b/Allura/allura/templates/repo/tree.html
@@ -59,6 +59,7 @@ form.tarball button:hover {
 <form class="tarball" action="{{ tarball_url }}" method="post">
   <input type="hidden" name="path" value="{{ path or '' }}" />
   <button><b data-icon="{{g.icons.folder.char}}" class="ico {{g.icons.folder.css}}" title="Snapshot"></b> Download Snapshot</button>
+  {{lib.csrf_token()}}
 </form>
 {% endif %}
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/setup_openid_user.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/setup_openid_user.html b/Allura/allura/templates/setup_openid_user.html
index ee14125..6496b8f 100644
--- a/Allura/allura/templates/setup_openid_user.html
+++ b/Allura/allura/templates/setup_openid_user.html
@@ -31,6 +31,7 @@
       <div class="grid-18"><input type="text" id="display_name" name="display_name"/></div>
       <label class="grid-4">&nbsp;</label>
       <div class="grid-18"><input type="submit" value="Setup Account"/></div>
+      {{lib.csrf_token()}}
     </form>
   </div>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/site_admin_add_subscribers.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_add_subscribers.html b/Allura/allura/templates/site_admin_add_subscribers.html
index 660e55f..3cffdee 100644
--- a/Allura/allura/templates/site_admin_add_subscribers.html
+++ b/Allura/allura/templates/site_admin_add_subscribers.html
@@ -33,5 +33,6 @@
             <td><input type="submit" value="Save"></td>
         </tr>
     </table>
+    {{lib.csrf_token()}}
 </form>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/site_admin_api_tickets.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_api_tickets.html b/Allura/allura/templates/site_admin_api_tickets.html
index fbb6724..0dba2ea 100644
--- a/Allura/allura/templates/site_admin_api_tickets.html
+++ b/Allura/allura/templates/site_admin_api_tickets.html
@@ -39,6 +39,7 @@
 <td><input type="submit" value="Save"><td>
 </tr>
 </table>
+{{lib.csrf_token()}}
 </form>
 
 <table>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/site_admin_new_projects.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_new_projects.html b/Allura/allura/templates/site_admin_new_projects.html
index f6dc2f0..46cad9a 100644
--- a/Allura/allura/templates/site_admin_new_projects.html
+++ b/Allura/allura/templates/site_admin_new_projects.html
@@ -34,6 +34,7 @@
     <label for="end-dt">To: </label><input type="text" name="end-dt" id="end-dt" value="{{ window_end.strftime('%Y/%m/%d %H:%M:%S') }}">
     </div>
     <div class="grid-3"><input type="submit" value="Filter"></div>
+    {{lib.csrf_token()}}
   </form>
   </div>
   {{ _paging() }}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/site_admin_reclone_repo.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_reclone_repo.html b/Allura/allura/templates/site_admin_reclone_repo.html
index f1b28b4..5aeadf2 100644
--- a/Allura/allura/templates/site_admin_reclone_repo.html
+++ b/Allura/allura/templates/site_admin_reclone_repo.html
@@ -36,5 +36,6 @@
             <td><input type="submit" value="Reclone"></td>
         </tr>
     </table>
+    {{lib.csrf_token()}}
 </form>
-{% endblock %}
\ No newline at end of file
+{% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/site_admin_task_new.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_task_new.html b/Allura/allura/templates/site_admin_task_new.html
index 2244e77..cf66620 100644
--- a/Allura/allura/templates/site_admin_task_new.html
+++ b/Allura/allura/templates/site_admin_task_new.html
@@ -103,6 +103,7 @@
   <input type="submit" /><br/>
 
   <pre class="doc"></pre>
+  {{lib.csrf_token()}}
 </form>
 {% endblock %}
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/site_admin_task_view.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_task_view.html b/Allura/allura/templates/site_admin_task_view.html
index e363b8d..6306885 100644
--- a/Allura/allura/templates/site_admin_task_view.html
+++ b/Allura/allura/templates/site_admin_task_view.html
@@ -79,6 +79,7 @@
     {% if task.state in ['error', 'complete'] %}
     <form id="resubmit-task-form" action="../resubmit/{{task._id}}" method="POST">
         <input type="submit" value="Re-Submit Task" />
+        {{lib.csrf_token()}}
     </form>
     {% endif %}
     <h2>Task Details</h2>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/user_prefs.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/user_prefs.html b/Allura/allura/templates/user_prefs.html
index 2efb388..3185747 100644
--- a/Allura/allura/templates/user_prefs.html
+++ b/Allura/allura/templates/user_prefs.html
@@ -116,6 +116,7 @@
         <div class="grid-18">
         {{lib.submit_button('Save Changes')}}
         </div>
+        {{lib.csrf_token()}}
       </form>
   </div>
 
@@ -146,12 +147,14 @@
         </p>
         <form method="POST" action="del_api_token" class="grid-18">
           <input type="submit" value="Delete API Token">
+          {{lib.csrf_token()}}
         </form>
       {% else %}
         <p>No API token generated</p>
       {% endif %}
       <form method="POST" action="gen_api_token" class="grid-18">
         <input type="submit" value="(Re)generate API Token">
+        {{lib.csrf_token()}}
       </form>
   </div>
   {% endif %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/admin_form.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/admin_form.html b/Allura/allura/templates/widgets/admin_form.html
index f516d12..04e29b0 100644
--- a/Allura/allura/templates/widgets/admin_form.html
+++ b/Allura/allura/templates/widgets/admin_form.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="{{method}}"
        {% if enctype %}enctype="{{enctype}}"{% endif %}
       action="{{action}}">
@@ -42,4 +43,5 @@
     {% endfor %}
     <a href="#" class="close">Cancel</a>
   </div>
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/attachment_add.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/attachment_add.html b/Allura/allura/templates/widgets/attachment_add.html
index 51f4d5b..d1a2775 100644
--- a/Allura/allura/templates/widgets/attachment_add.html
+++ b/Allura/allura/templates/widgets/attachment_add.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="post"
       action="{{action}}"
       enctype="multipart/form-data">
@@ -24,4 +25,5 @@
           <input type="file" class="text" name="{{name}}" multiple="True" id="{{name}}" style="margin-left:0"/><br/>
           <input type="submit" value="Attach files"/>
       </div>
+      {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/attachment_list.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/attachment_list.html b/Allura/allura/templates/widgets/attachment_list.html
index 09d8177..d26a35e 100644
--- a/Allura/allura/templates/widgets/attachment_list.html
+++ b/Allura/allura/templates/widgets/attachment_list.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <div>
   {% if attachments %}
     {% set attachments = attachments|list %}
@@ -31,6 +32,7 @@
             <form method="post" action="{{att.url()}}">
               <input type="hidden" name="delete" value="True"/>
               <input type="submit" value="Delete File"/>
+              {{lib.csrf_token()}}
             </form>
             {% endif %}
           </div>
@@ -48,6 +50,7 @@
             <input type="submit" value="Delete File"/>
           </span>
           {% endif %}
+          {{lib.csrf_token()}}
         </form>
       </div>
     {% endfor %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/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 38ad0b3..a42803e 100644
--- a/Allura/allura/templates/widgets/edit_post.html
+++ b/Allura/allura/templates/widgets/edit_post.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <div>
   <form method="post" action="{{action}}"
         enctype="multipart/form-data">
@@ -33,5 +34,6 @@
     <input type="file" class="text attachment_form_fields" style="display:none" multiple="True" name="{{att_name}}" {% if att_id %}id="{{att_id}}"{% endif %}/>
   {% if widget.antispam %}{% for fld in g.antispam.extra_fields() %}
   {{fld}}{% endfor %}{% endif %}
+    {{lib.csrf_token()}}
   </form>
 </div>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/flag_post.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/flag_post.html b/Allura/allura/templates/widgets/flag_post.html
index b539e04..bb77fa6 100644
--- a/Allura/allura/templates/widgets/flag_post.html
+++ b/Allura/allura/templates/widgets/flag_post.html
@@ -16,7 +16,9 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="POST" action="{{action}}">
     <input type="hidden" name="delete" value="True"/>
     <a href="" title="Flag as inappropriate or spam" class="flag_post ico-l"><b data-icon="{{g.icons['flag'].char}}" class="ico {{g.icons['flag'].css}}"></b> <span>Flag</span></a>
-</form>
\ No newline at end of file
+    {{lib.csrf_token()}}
+</form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/forge_form.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/forge_form.html b/Allura/allura/templates/widgets/forge_form.html
index de20c42..6ab41d4 100644
--- a/Allura/allura/templates/widgets/forge_form.html
+++ b/Allura/allura/templates/widgets/forge_form.html
@@ -54,5 +54,5 @@
   {% endif %}
   {% if widget.antispam %}{% for fld in g.antispam.extra_fields() %}
   {{fld}}{% endfor %}{% endif %}
-  {{lib.csrf_token()}} 
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/moderate_post.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/moderate_post.html b/Allura/allura/templates/widgets/moderate_post.html
index 0487016..d111e23 100644
--- a/Allura/allura/templates/widgets/moderate_post.html
+++ b/Allura/allura/templates/widgets/moderate_post.html
@@ -16,20 +16,24 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="POST" action="{{action}}">
     <input type="hidden" name="delete" value="True"/>
     <a href="" class="moderate_post little_link"><span>Delete</span></a>
+    {{lib.csrf_token()}}
 </form>
 <br/>
 {%if status == 'pending'%}
     <form method="POST" class="moderate_approve" action="{{action}}">
         <input type="hidden" name="approve" value="True"/>
         <a href="" class="moderate_post little_link"><span>Approve</span></a>
+        {{lib.csrf_token()}}
     </form>
     <br/>
 {%endif%}
     <form method="POST" class="moderate_spam" action="{{action}}">
         <input type="hidden" name="spam" value="True"/>
         <a href="" class="moderate_post little_link"><span>Spam</span></a>
+        {{lib.csrf_token()}}
     </form>
 <br/>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/moderate_posts.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/moderate_posts.html b/Allura/allura/templates/widgets/moderate_posts.html
index 25294a3..e06fc12 100644
--- a/Allura/allura/templates/widgets/moderate_posts.html
+++ b/Allura/allura/templates/widgets/moderate_posts.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form {{widget.j2_attrs({'name':name, 'id':id, 'method':method, 'action':action, 'enctype':enctype})}}
       {{attrs|default({}, true)|xmlattr}}>
   <fieldset class="grid-19">
@@ -65,4 +66,5 @@
       {% endfor %}
     </tbody>
   </table>
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/neighborhood_add_project.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/neighborhood_add_project.html b/Allura/allura/templates/widgets/neighborhood_add_project.html
index 5a45019..002b8e4 100644
--- a/Allura/allura/templates/widgets/neighborhood_add_project.html
+++ b/Allura/allura/templates/widgets/neighborhood_add_project.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form action="{{action}}" method="POST">
 
     <div class="welcome">
@@ -76,4 +77,5 @@
     </div>
   {% if widget.antispam %}{% for fld in g.antispam.extra_fields() %}
   {{fld}}{% endfor %}{% endif %}
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/neighborhood_overview_form.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/neighborhood_overview_form.html b/Allura/allura/templates/widgets/neighborhood_overview_form.html
index 6b63d3b..c9d0f9d 100644
--- a/Allura/allura/templates/widgets/neighborhood_overview_form.html
+++ b/Allura/allura/templates/widgets/neighborhood_overview_form.html
@@ -58,4 +58,5 @@
 	</div>
     <label class="grid-4">&nbsp;</label>
     <div class="grid-14"><input type="submit" value="Save"/></div>
+    {{lib.csrf_token()}}
   </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/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 60e31a0..1c03b94 100644
--- a/Allura/allura/templates/widgets/new_topic_post.html
+++ b/Allura/allura/templates/widgets/new_topic_post.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="post" action="{{action}}">
     {% if show_subject %}
     <div class="grid-19">&nbsp;</div>
@@ -46,4 +47,5 @@
     </div>
   {% if widget.antispam %}{% for fld in g.antispam.extra_fields() %}
   {{fld}}{% endfor %}{% endif %}
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/page_size.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/page_size.html b/Allura/allura/templates/widgets/page_size.html
index baed90a..99fc3ac 100644
--- a/Allura/allura/templates/widgets/page_size.html
+++ b/Allura/allura/templates/widgets/page_size.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="get">
   {% for k,v in widget.url_params.iteritems() %}
     <input type="hidden" name="{{k}}" value="{{v}}"/>
@@ -34,4 +35,5 @@
   {% endif %}
   result{% if limit|int != 1 %}s{% endif %} of {{count}} </strong></p>
   {% endif %}
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/post_widget.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/post_widget.html b/Allura/allura/templates/widgets/post_widget.html
index 2aebd44..f85fc4b 100644
--- a/Allura/allura/templates/widgets/post_widget.html
+++ b/Allura/allura/templates/widgets/post_widget.html
@@ -88,6 +88,7 @@
                     {% endif %}
                 {% endif %}
                 <input type="hidden" name="delete" value="True">
+                {{lib.csrf_token()}}
                 </form>
             </div>
           {% endfor %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/project_screenshots.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/project_screenshots.html b/Allura/allura/templates/widgets/project_screenshots.html
index 7d3d338..f1c5bca 100644
--- a/Allura/allura/templates/widgets/project_screenshots.html
+++ b/Allura/allura/templates/widgets/project_screenshots.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 {% set screenshots = project.get_screenshots() %}
 {% if screenshots.__len__() > 1 %}
 <p>Drag screenshots to sort.</p>
@@ -36,10 +37,12 @@
         <input type="hidden" value="{{ss._id}}" name="id">
         <input type="text" value="{{ss.caption}}" name="caption"><br>
         <input type="submit" value="Save Changes">
+        {{lib.csrf_token()}}
       </form>
       <form action="delete_screenshot" method="post">
         <input type="hidden" value="{{ss._id}}" name="id">
         <input type="submit" value="Delete">
+        {{lib.csrf_token()}}
       </form>
     </div>
     {% endif %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/search_results.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/search_results.html b/Allura/allura/templates/widgets/search_results.html
index 464dab4..74b9134 100644
--- a/Allura/allura/templates/widgets/search_results.html
+++ b/Allura/allura/templates/widgets/search_results.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="GET" action=".">
   <div class="grid-10">
     <input type="text" name="q" value="{{q}}" class="search-query" title="Search App"/>
@@ -52,6 +53,7 @@
       <input id="search-history" type="checkbox" name="history"{% if history %} checked{% endif %}>
     {% endif %}
   </div>
+  {{lib.csrf_token()}}
 </form>
 <div style="clear:both">&nbsp;</div>
 {% if search_error %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/subscription_form.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/subscription_form.html b/Allura/allura/templates/widgets/subscription_form.html
index b138c58..45aed2a 100644
--- a/Allura/allura/templates/widgets/subscription_form.html
+++ b/Allura/allura/templates/widgets/subscription_form.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <div {{attrs|default({}, true)|xmlattr}} class="discussion_subscription_form">
   <div class="clear"></div>
   <div class="pagination_size">{{widget.fields['page_list'].display(limit=limit, page=page, count=count)}}</div>
@@ -26,6 +27,7 @@
     <input type="submit" value="Update email subscriptions"/>
     {% endif %}
     </p>
+    {{lib.csrf_token()}}
   </form>
   {{widget.fields['page_list'].display(limit=limit, page=page, count=count)}}
   {{widget.fields['page_size'].display(limit=limit, page=page, count=count)}}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/Allura/allura/templates/widgets/vote.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/vote.html b/Allura/allura/templates/widgets/vote.html
index 06f40d7..c5b5f97 100644
--- a/Allura/allura/templates/widgets/vote.html
+++ b/Allura/allura/templates/widgets/vote.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 {% set can_vote = c.user and c.user != c.user.anonymous()
                   and h.has_access(artifact, 'post')() %}
 {% set voted = artifact.user_voted(c.user) %}
@@ -44,6 +45,7 @@
   {% if can_vote %}
   <form action="{{ action }}" method="POST">
     {# csrf protection will be automatically inserted here (_session_id field) #}
+    {{lib.csrf_token()}}
   </form>
   {% endif %}
 </div>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeBlog/forgeblog/templates/blog/admin_exfeed.html
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/templates/blog/admin_exfeed.html b/ForgeBlog/forgeblog/templates/blog/admin_exfeed.html
index 9fc417a..e5d7a18 100644
--- a/ForgeBlog/forgeblog/templates/blog/admin_exfeed.html
+++ b/ForgeBlog/forgeblog/templates/blog/admin_exfeed.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="POST" action="{{c.project.url()}}admin/{{app.config.options.mount_point}}/set_exfeed">
   <label class="grid-13">Existing external feeds:</label>
   <div class="grid-13">
@@ -42,4 +43,5 @@
       <input type="submit" value="Save"/>
     </div>
   {% endif %}
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeBlog/forgeblog/templates/blog/post_history.html
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/templates/blog/post_history.html b/ForgeBlog/forgeblog/templates/blog/post_history.html
index fd1efbf..2fb74e8 100644
--- a/ForgeBlog/forgeblog/templates/blog/post_history.html
+++ b/ForgeBlog/forgeblog/templates/blog/post_history.html
@@ -51,5 +51,6 @@
               {% endfor %}
               </tbody>
             </table>
+            {{lib.csrf_token()}}
           </form>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/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 ecfc16c..66e3b4d 100644
--- a/ForgeBlog/forgeblog/templates/blog_widgets/post_form.html
+++ b/ForgeBlog/forgeblog/templates/blog_widgets/post_form.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <div class="editbox">
 <form method="{{method}}"
       {% if enctype %}enctype="{{enctype}}"{% endif %}
@@ -50,5 +51,6 @@
   </div>
   {% if widget.antispam %}{% for fld in g.antispam.extra_fields() %}
   {{fld}}{% endfor %}{% endif %}
+  {{lib.csrf_token()}}
 </form>
 </div>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum.html
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum.html b/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum.html
index 626b2b3..b483c92 100644
--- a/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum.html
+++ b/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum.html
@@ -48,6 +48,7 @@
       <input type="button" id="add_forum_cancel" value="Cancel">
     </div>
   </div>
+  {{lib.csrf_token()}}
 </form>
 <script type="text/javascript">
     function addLoadEvent(func) {

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/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 701022c..273a00e 100644
--- a/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum_short.html
+++ b/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum_short.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="{{method}}" action="{{action}}" enctype="multipart/form-data" id="new_forum_form">
   <input type="hidden" name="add_forum.app_id" value="{{app and app.config._id}}">
   <div class="grid-6">
@@ -47,6 +48,7 @@
     <input type="submit" id="new_forum.create" name="new_forum.create" value="Save">
     <a id="add_forum_cancel" class="btn link">Cancel</a>
   </div>
+  {{lib.csrf_token()}}
 </form>
 <script type="text/javascript">
   {% for field in widget.fields %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeDiscussion/forgediscussion/templates/discussionforums/admin_forums.html
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/templates/discussionforums/admin_forums.html b/ForgeDiscussion/forgediscussion/templates/discussionforums/admin_forums.html
index 2284a5d..9b6b3e0 100644
--- a/ForgeDiscussion/forgediscussion/templates/discussionforums/admin_forums.html
+++ b/ForgeDiscussion/forgediscussion/templates/discussionforums/admin_forums.html
@@ -17,6 +17,7 @@
        under the License.
 -#}
 {% extends g.theme.master %}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 
 {% block title %}{{c.project.name}} / {{app.config.options.mount_label}} / Admin Forums{% endblock %}
 
@@ -108,6 +109,7 @@
     </tbody>
   </table>
   <div class="grid-19"><input type="button" id="add_forum" value="Add another forum"></div>
+  {{lib.csrf_token()}}
 </form>
 {{c.add_forum.display(method='POST',action='add_forum',app=app, value=c.add_forum)}}
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeDiscussion/forgediscussion/templates/discussionforums/stats_graph.html
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/templates/discussionforums/stats_graph.html b/ForgeDiscussion/forgediscussion/templates/discussionforums/stats_graph.html
index d702657..2d28448 100644
--- a/ForgeDiscussion/forgediscussion/templates/discussionforums/stats_graph.html
+++ b/ForgeDiscussion/forgediscussion/templates/discussionforums/stats_graph.html
@@ -17,6 +17,7 @@
        under the License.
 -#}
 {% extends g.theme.master %}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 
 {% block title %}{{c.project.name}} / {{c.app.config.options.mount_label}} / Stats{% endblock %}
 
@@ -37,6 +38,7 @@
           >{{forum.name}}</option>
     {% endfor %}
   </select>
+  {{lib.csrf_token()}}
 </form>
 
 <div id="stats-viz-container" class="project_stats">
@@ -100,4 +102,4 @@
     });
   });
 </script>
-{% endblock %}
\ No newline at end of file
+{% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeImporters/forgeimporters/templates/importer_base.html
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/templates/importer_base.html b/ForgeImporters/forgeimporters/templates/importer_base.html
index 16cbae2..b22aa3d 100644
--- a/ForgeImporters/forgeimporters/templates/importer_base.html
+++ b/ForgeImporters/forgeimporters/templates/importer_base.html
@@ -95,5 +95,6 @@
   </div>
 
   <input type="submit" value="Import"/>
+  {{lib.csrf_token()}}
 </form>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeImporters/forgeimporters/templates/project_base.html
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/templates/project_base.html b/ForgeImporters/forgeimporters/templates/project_base.html
index d7863eb..d34c2d1 100644
--- a/ForgeImporters/forgeimporters/templates/project_base.html
+++ b/ForgeImporters/forgeimporters/templates/project_base.html
@@ -148,5 +148,6 @@
     </div>
 
     <input type="submit" value="Import"/>
+    {{lib.csrf_token()}}
 </form>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeShortUrl/forgeshorturl/templates/form.html
----------------------------------------------------------------------
diff --git a/ForgeShortUrl/forgeshorturl/templates/form.html b/ForgeShortUrl/forgeshorturl/templates/form.html
index fa39b92..855563c 100644
--- a/ForgeShortUrl/forgeshorturl/templates/form.html
+++ b/ForgeShortUrl/forgeshorturl/templates/form.html
@@ -16,6 +16,8 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
+
 {% set app = app or c.app %}
 <div>
     <h1 id="short-url-form-title" style="display:none"><span id="short-url-form-action-label">Add</span> Short URL</h1>
@@ -35,6 +37,7 @@
         <div class="grid-13"><div class="grid-13">&nbsp;</div>
         <input type="submit" value="Save">
         <a href="#" class="close">Cancel</a></div>
+        {{lib.csrf_token()}}
     </form>
 </div>
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeTracker/forgetracker/templates/tracker/admin_fields.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker/admin_fields.html b/ForgeTracker/forgetracker/templates/tracker/admin_fields.html
index b16c8b5..7d6c343 100644
--- a/ForgeTracker/forgetracker/templates/tracker/admin_fields.html
+++ b/ForgeTracker/forgetracker/templates/tracker/admin_fields.html
@@ -44,6 +44,7 @@
         {%endfor%}
         <tr><td><input type="submit" value="Save"></td><td></td></tr>
     </table>
+    {{lib.csrf_token()}}
 </form>
 {% endblock %}
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeTracker/forgetracker/templates/tracker/bin.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker/bin.html b/ForgeTracker/forgetracker/templates/tracker/bin.html
index 42121b7..4badd12 100644
--- a/ForgeTracker/forgetracker/templates/tracker/bin.html
+++ b/ForgeTracker/forgetracker/templates/tracker/bin.html
@@ -86,6 +86,7 @@
         <a href="#" class="btn link cancel_edit">Cancel</a>
       {% endif %}
     </div>
+    {{lib.csrf_token()}}
   </form>
 {% endblock %}
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeTracker/forgetracker/templates/tracker/milestones.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker/milestones.html b/ForgeTracker/forgetracker/templates/tracker/milestones.html
index e04eb91..7e4a670 100644
--- a/ForgeTracker/forgetracker/templates/tracker/milestones.html
+++ b/ForgeTracker/forgetracker/templates/tracker/milestones.html
@@ -98,6 +98,7 @@
     <input type="submit" value="Save">
     <a href="#" class="btn link cancel_edit">Cancel</a>
   </div>
+  {{lib.csrf_token()}}
   </form>
 {% endblock %}
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeTracker/forgetracker/templates/tracker/search.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker/search.html b/ForgeTracker/forgetracker/templates/tracker/search.html
index c355f47..a690830 100644
--- a/ForgeTracker/forgetracker/templates/tracker/search.html
+++ b/ForgeTracker/forgetracker/templates/tracker/search.html
@@ -74,6 +74,7 @@
     <input type="button" value="Update Search" id="save_search"/>
   {% endif %}
   <input type="submit" value="Search"/>
+  {{lib.csrf_token()}}
 </form>
 <a href="{{tg.url(c.app.url + 'search_help/')}}" target="_blank" class="btn search_help_modal"><b data-icon="{{g.icons['help'].char}}" class="ico {{g.icons['help'].css}}"></b> Help</a>
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeTracker/forgetracker/templates/tracker_widgets/bin_form.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker_widgets/bin_form.html b/ForgeTracker/forgetracker/templates/tracker_widgets/bin_form.html
index c6f6069..c269a37 100644
--- a/ForgeTracker/forgetracker/templates/tracker_widgets/bin_form.html
+++ b/ForgeTracker/forgetracker/templates/tracker_widgets/bin_form.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}       
 <form method="post" action="{{action}}">
   {% for field in hidden_fields -%}
     {% set ctx=widget.context_for(field) -%}
@@ -33,4 +34,5 @@
     <input type="submit" value="Save"/>
     <input type="button" value="Cancel" id="cancel_new_bin"/>
   </div>
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeTracker/forgetracker/templates/tracker_widgets/mass_edit_form.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker_widgets/mass_edit_form.html b/ForgeTracker/forgetracker/templates/tracker_widgets/mass_edit_form.html
index 666c325..bfeaf15 100644
--- a/ForgeTracker/forgetracker/templates/tracker_widgets/mass_edit_form.html
+++ b/ForgeTracker/forgetracker/templates/tracker_widgets/mass_edit_form.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form id="update-values" method="post" action="../update_tickets">
     {% for field in globals.custom_fields %}
       {% if field.name == '_milestone' %}
@@ -108,4 +109,5 @@
     </div>
     <div class="grid-12" id="result"></div>
     <input name="__search" type="hidden" value="" id="id_search" />
-</form>
\ No newline at end of file
+    {{lib.csrf_token()}}
+</form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeTracker/forgetracker/templates/tracker_widgets/options_admin.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker_widgets/options_admin.html b/ForgeTracker/forgetracker/templates/tracker_widgets/options_admin.html
index c298e02..2483917 100644
--- a/ForgeTracker/forgetracker/templates/tracker_widgets/options_admin.html
+++ b/ForgeTracker/forgetracker/templates/tracker_widgets/options_admin.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="{{method}}"
        {% if enctype %}enctype="{{enctype}}"{% endif %}
       action="{{action}}">
@@ -44,4 +45,5 @@
     {% endfor %}
     <a href="#" onclick="window.history.back(); return false;" class="close">Cancel</a>
   </div>
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/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 8676159..93f5fcc 100644
--- a/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_form.html
+++ b/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_form.html
@@ -127,4 +127,5 @@
     {{widget.display_field_by_name('submit')|safe}}
     <a href="{{c.app.url}}" class="btn link cancel_form">Cancel</a>
   </div>
+  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_search_results.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_search_results.html b/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_search_results.html
index 2c5bb6c..91ee78a 100644
--- a/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_search_results.html
+++ b/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_search_results.html
@@ -17,6 +17,7 @@
        under the License.
 -#}
 {% from 'allura:templates/jinja_master/lib.html' import abbr_date with context %}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <div id="ticket_search_results_holder" style="clear:both">
   {% if solr_error %}<p>{{solr_error}}</p>{% endif %}
   {{widget.fields['page_size'].display(page=page, count=count, limit=limit)}}
@@ -103,6 +104,7 @@
       {% if h.has_access(c.app, 'configure') %}
           <a href="{{c.project.url()}}admin/{{c.app.config.options.mount_point}}/fields">Change field settings permanently.</a>
       {% endif %}
+      {{lib.csrf_token()}}
     </form>
     {{widget.fields['lightbox'].display()}}
   {% endif %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d778f65a/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 1944f54..534527e 100644
--- a/ForgeWiki/forgewiki/templates/wiki/page_edit.html
+++ b/ForgeWiki/forgewiki/templates/wiki/page_edit.html
@@ -17,6 +17,7 @@
        under the License.
 -#}
 {% extends 'forgewiki:templates/wiki/master.html' %}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 
 {% block title %}{{c.project.name}} / {{c.app.config.options.mount_label}} / {{page.title}}{% endblock %}
 
@@ -57,6 +58,7 @@
     <input type="submit" value="Save">
     <input type="reset" value="Cancel">
 	</div>
+    {{lib.csrf_token()}}
 </form>
 <div class="grid-19">
   {{c.attachment_list.display(attachments=page.attachments, edit_mode=page_exists and h.has_access(page, 'edit')())}}


[44/45] git commit: [#6942] Add tests for File ETag caching

Posted by tv...@apache.org.
[#6942] Add tests for File ETag caching

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/77e22d8c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/77e22d8c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/77e22d8c

Branch: refs/heads/tv/6942
Commit: 77e22d8c17b197c77657373ac95ef95ee6919237
Parents: 574e4a3
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Fri Dec 13 04:41:16 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Fri Dec 13 04:41:16 2013 +0000

----------------------------------------------------------------------
 Allura/allura/lib/utils.py                   |  2 +-
 Allura/allura/tests/model/test_filesystem.py | 12 +++++++++---
 2 files changed, 10 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/77e22d8c/Allura/allura/lib/utils.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/utils.py b/Allura/allura/lib/utils.py
index 55b36f0..60097c5 100644
--- a/Allura/allura/lib/utils.py
+++ b/Allura/allura/lib/utils.py
@@ -481,7 +481,7 @@ def take_while_true(source):
 def serve_file(fp, filename, content_type, last_modified=None, cache_expires=None, size=None, embed=True):
     '''Sets the response headers and serves as a wsgi iter'''
     if filename and last_modified:
-        etag_cache('{0}?{1}'.format(filename, last_modified))
+        etag_cache(u'{0}?{1}'.format(filename, last_modified))
     pylons.response.headers['Content-Type'] = ''
     pylons.response.content_type = content_type.encode('utf-8')
     pylons.response.cache_expires = cache_expires or asint(tg.config.get('files_expires_header_secs', 60 * 60))

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/77e22d8c/Allura/allura/tests/model/test_filesystem.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/model/test_filesystem.py b/Allura/allura/tests/model/test_filesystem.py
index a10b0ef..1272ecd 100644
--- a/Allura/allura/tests/model/test_filesystem.py
+++ b/Allura/allura/tests/model/test_filesystem.py
@@ -22,7 +22,7 @@ from unittest import TestCase
 from cStringIO import StringIO
 from io import BytesIO
 
-from pylons import tmpl_context as c
+from pylons import tmpl_context as c, app_globals as g
 from ming.orm import session, Mapper
 from nose.tools import assert_equal
 from mock import patch
@@ -124,8 +124,11 @@ class TestFile(TestCase):
         f = File.from_data(u'te s\u0b6e1.txt', 'test1')
         self.session.flush()
         with patch('allura.lib.utils.tg.request', Request.blank('/')), \
-                patch('allura.lib.utils.pylons.response', Response()) as response:
+                patch('allura.lib.utils.pylons.response', Response()) as response, \
+                patch('allura.lib.utils.etag_cache') as etag_cache:
             response_body = list(f.serve())
+            etag_cache.assert_called_once_with(u'{}?{}'.format(f.filename,
+                f._id.generation_time))
             assert_equal([ 'test1' ], response_body)
             assert_equal(response.content_type, f.content_type)
             assert 'Content-Disposition' not in response.headers
@@ -134,8 +137,11 @@ class TestFile(TestCase):
         f = File.from_data(u'te s\u0b6e1.txt', 'test1')
         self.session.flush()
         with patch('allura.lib.utils.tg.request', Request.blank('/')), \
-                patch('allura.lib.utils.pylons.response', Response()) as response:
+                patch('allura.lib.utils.pylons.response', Response()) as response, \
+                patch('allura.lib.utils.etag_cache') as etag_cache:
             response_body = list(f.serve(embed=False))
+            etag_cache.assert_called_once_with(u'{}?{}'.format(f.filename,
+                f._id.generation_time))
             assert_equal([ 'test1' ], response_body)
             assert_equal(response.content_type, f.content_type)
             assert_equal(response.headers['Content-Disposition'],


[16/45] git commit: [#6960] flush the session before flushing the BatchIndexer, so it has all objects

Posted by tv...@apache.org.
[#6960] flush the session before flushing the BatchIndexer, so it has all objects


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

Branch: refs/heads/tv/6942
Commit: 1b3248e0cd74e078bf0a6156b54137d577c2a8e6
Parents: 247633b
Author: Dave Brondsema <db...@slashdotmedia.com>
Authored: Fri Dec 6 21:08:24 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Mon Dec 9 16:15:30 2013 +0000

----------------------------------------------------------------------
 ForgeImporters/forgeimporters/base.py | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1b3248e0/ForgeImporters/forgeimporters/base.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/base.py b/ForgeImporters/forgeimporters/base.py
index 066719b..922367d 100644
--- a/ForgeImporters/forgeimporters/base.py
+++ b/ForgeImporters/forgeimporters/base.py
@@ -120,6 +120,7 @@ def import_tool(importer_path, project_name=None, mount_point=None, mount_label=
          M.session.substitute_extensions(M.artifact_orm_session, [M.session.BatchIndexer]):
         app = importer.import_tool(c.project, c.user, project_name=project_name,
                 mount_point=mount_point, mount_label=mount_label, **kw)
+        M.artifact_orm_session.flush()
         M.session.BatchIndexer.flush()
         if app:
             handler.success(app)


[23/45] git commit: [#6831] Added RSS/ATOM feed to Activity Stream and refactored common code

Posted by tv...@apache.org.
[#6831] Added RSS/ATOM feed to Activity Stream and refactored common code

Signed-off-by: Cory Johns <ad...@users.sf.net>


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

Branch: refs/heads/tv/6942
Commit: 3328dc0399894c2593a9f042412cc42e808a150f
Parents: 0302ba5
Author: Cory Johns <ad...@users.sf.net>
Authored: Wed Dec 11 23:27:35 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 05:54:18 2013 +0000

----------------------------------------------------------------------
 ForgeActivity/forgeactivity/main.py | 74 +++++++++++++++++++++-----------
 1 file changed, 48 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/3328dc03/ForgeActivity/forgeactivity/main.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/main.py b/ForgeActivity/forgeactivity/main.py
index daeb1ce..33be804 100644
--- a/ForgeActivity/forgeactivity/main.py
+++ b/ForgeActivity/forgeactivity/main.py
@@ -18,17 +18,19 @@
 import logging
 
 from pylons import tmpl_context as c, app_globals as g
-from pylons import request
+from pylons import request, response
 from tg import expose, validate, config
 from tg.decorators import with_trailing_slash
 from paste.deploy.converters import asbool
 from webob import exc
+from webhelpers import feedgenerator as FG
 
 from allura.app import Application
 from allura import version
 from allura.controllers import BaseController
 from allura.lib.security import require_authenticated
 from allura.model.timeline import perm_check
+from allura.lib import helpers as h
 
 from .widgets.follow import FollowToggle
 
@@ -71,6 +73,8 @@ class ForgeActivityController(BaseController):
     def __init__(self, app, *args, **kw):
         super(ForgeActivityController, self).__init__(*args, **kw)
         self.app = app
+        setattr(self, 'feed.atom', self.feed)
+        setattr(self, 'feed.rss', self.feed)
 
     def _before(self, *args, **kw):
         """Runs before each request to this controller.
@@ -79,9 +83,7 @@ class ForgeActivityController(BaseController):
         # 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):
+    def _get_activities_data(self, **kw):
         activity_enabled = config.get('activitystream.enabled', False)
         activity_enabled = request.cookies.get('activitystream.enabled', activity_enabled)
         activity_enabled = asbool(activity_enabled)
@@ -102,6 +104,43 @@ class ForgeActivityController(BaseController):
                 filter_func=perm_check(c.user))
         return dict(followee=followee, following=following, timeline=timeline)
 
+    @expose('jinja:forgeactivity:templates/index.html')
+    @with_trailing_slash
+    def index(self, **kw):
+        return self._get_activities_data(**kw)
+
+    @with_trailing_slash
+    @expose()
+    def feed(self, **kw):
+        data = self._get_activities_data(**kw)
+        response.headers['Content-Type'] = ''
+        response.content_type = 'application/xml'
+        d = {
+                'title': 'Activity for %s' % data['followee'].shortname,
+                'link': h.absurl(self.app.url),
+                'description': 'Recent activity for %s' % data['followee'].shortname,
+                'language': u'en',
+            }
+        if request.environ['PATH_INFO'].endswith('.atom'):
+            feed = FG.Atom1Feed(**d)
+        else:
+            feed = FG.Rss201rev2Feed(**d)
+        for t in data['timeline']:
+            url = h.absurl(t.obj.activity_url.encode('utf-8'))
+            feed.add_item(title=u'%s %s %s%s' % (
+                                t.actor.activity_name,
+                                t.verb,
+                                t.obj.activity_name,
+                                ' on %s' % t.target.activity_name if t.target.activity_name else '',
+                            ),
+                          link=url,
+                          pubdate=t.published,
+                          description=t.obj.activity_extras.summary,
+                          unique_id=url,
+                          author_name=t.actor.activity_name,
+                          author_link=h.absurl(t.actor.activity_url))
+        return feed.writeString('utf-8')
+
     @expose('json:')
     @validate(W.follow_toggle)
     def follow(self, follow, **kw):
@@ -142,29 +181,12 @@ class ForgeActivityRestController(BaseController):
 
     @expose('json:')
     def index(self, **kw):
-        activity_enabled = config.get('activitystream.enabled', False)
-        activity_enabled = request.cookies.get('activitystream.enabled', activity_enabled)
-        activity_enabled = asbool(activity_enabled)
-        if not activity_enabled:
-            raise exc.HTTPNotFound()
-
-        c.follow_toggle = W.follow_toggle
-        if c.project.is_user_project:
-            followee = c.project.user_project_of
-            actor_only = followee != c.user
-        else:
-            followee = c.project
-            actor_only = False
-
-        following = g.director.is_connected(c.user, followee)
-        timeline = g.director.get_timeline(followee, page=kw.get('page', 0),
-                limit=kw.get('limit', 100), actor_only=actor_only,
-                filter_func=perm_check(c.user))
+        data = self.app.root._get_activities_data(**kw)
         return {
-                'following': following,
+                'following': data['following'],
                 'followee': {
-                    'activity_name': followee.shortname,
-                    'activity_url': followee.url(),
+                    'activity_name': data['followee'].shortname,
+                    'activity_url': data['followee'].url(),
                     'activity_extras': {},
                 },
                 'timeline': [{
@@ -173,5 +195,5 @@ class ForgeActivityRestController(BaseController):
                         'verb': a.verb,
                         'obj': a.obj._deinstrument(),
                         'target': a.target._deinstrument(),
-                    } for a in timeline],
+                    } for a in data['timeline']],
             }


[40/45] git commit: [#6942] Dynamically generate tool icon css

Posted by tv...@apache.org.
[#6942] Dynamically generate tool icon css

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/b2c2be98
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/b2c2be98
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/b2c2be98

Branch: refs/heads/tv/6942
Commit: b2c2be98deb71bf6d3ff91f4add6ea85978b1561
Parents: 1082505
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Wed Dec 11 21:14:36 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 21:57:59 2013 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/static.py                  |  5 +++++
 Allura/allura/lib/app_globals.py                     | 10 ++++++++++
 Allura/allura/templates/jinja_master/master.html     |  1 +
 Allura/allura/templates/jinja_master/top_nav.html    |  3 +--
 Allura/allura/templates/widgets/project_summary.html |  2 +-
 5 files changed, 18 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b2c2be98/Allura/allura/controllers/static.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/static.py b/Allura/allura/controllers/static.py
index dded144..87687f0 100644
--- a/Allura/allura/controllers/static.py
+++ b/Allura/allura/controllers/static.py
@@ -41,3 +41,8 @@ class NewForgeController(object):
         else:
             html = g.markdown.convert(markdown)
         return html
+
+    @expose()
+    def tool_icon_css(self):
+        response.content_type = 'text/css'
+        return g.tool_icon_css

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b2c2be98/Allura/allura/lib/app_globals.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/app_globals.py b/Allura/allura/lib/app_globals.py
index 6ded51a..07b8e09 100644
--- a/Allura/allura/lib/app_globals.py
+++ b/Allura/allura/lib/app_globals.py
@@ -470,6 +470,16 @@ class Globals(object):
         p1.wait()
         return server_name
 
+    @LazyProperty
+    def tool_icon_css(self):
+        css = ''
+        for tool_name in self.entry_points['tool']:
+            for size in (24, 32, 48):
+                url = self.theme.app_icon_url(tool_name.lower(), size)
+                css += '.ui-icon-tool-%s-%i {background: url(%s) no-repeat;}\n' % (
+                        tool_name, size, url)
+        return css
+
     @property
     def resource_manager(self):
         return ew_core.widget_context.resource_manager

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b2c2be98/Allura/allura/templates/jinja_master/master.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/master.html b/Allura/allura/templates/jinja_master/master.html
index 25e9e45..f574635 100644
--- a/Allura/allura/templates/jinja_master/master.html
+++ b/Allura/allura/templates/jinja_master/master.html
@@ -28,6 +28,7 @@
 {% do g.register_forge_js('js/pb.transformie.min.js') %}
 {% do g.register_forge_js('js/allura-base.js') %}
 {% do g.register_forge_css('css/forge/hilite.css') %}
+{% do g.register_css('/nf/tool_icon_css') %}
 {% do g.theme.require() %}
 {% do g.resource_manager.register_widgets(c) %}
 {# paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ #}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b2c2be98/Allura/allura/templates/jinja_master/top_nav.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/top_nav.html b/Allura/allura/templates/jinja_master/top_nav.html
index 90e1d9e..8fdfb34 100644
--- a/Allura/allura/templates/jinja_master/top_nav.html
+++ b/Allura/allura/templates/jinja_master/top_nav.html
@@ -20,8 +20,7 @@
 <ul class="dropdown">
   {% for s in c.project.grouped_navbar_entries() %}
     <li class="{% if s.matches_url(request) %}selected{% endif %}">
-        <a href="{{s.url}}"
-          style="background-repeat: no-repeat; background-image: url({{ g.theme.app_icon_url((s.tool_name or 'admin').lower(), 32) }});">
+        <a href="{{s.url}}" class="ui-icon-tool-{{(s.tool_name or 'admin').lower()}}-32">
             {{s.label}}
         </a>
         {% set grouped_tool_count = s.matching_urls|length %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b2c2be98/Allura/allura/templates/widgets/project_summary.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/project_summary.html b/Allura/allura/templates/widgets/project_summary.html
index 8f772d3..75c9527 100644
--- a/Allura/allura/templates/widgets/project_summary.html
+++ b/Allura/allura/templates/widgets/project_summary.html
@@ -49,7 +49,7 @@
     <p class="desc">{% if value.summary %}{{value.summary}}{% else %}{{h.text.truncate(value.short_description, 50)}}{% endif %}</p>
     <div class="quik">
       {% for s in sitemap %}
-        <a href="{{s.url}}" class="ui-icon-{{(s.ui_icon or 'admin').lower()}}" title="{{s.label}}"><span>{{s.label}}</span></a>
+      <a href="{{s.url}}" class="ui-icon-{{(s.ui_icon or 'admin').lower()}}-24" title="{{s.label}}"><span>{{s.label}}</span></a>
       {% endfor %}
     </div>
   </div>


[30/45] git commit: [#6888] Invert user message pref to clean up default case

Posted by tv...@apache.org.
[#6888] Invert user message pref to clean up default case

Signed-off-by: Cory Johns <ad...@users.sf.net>


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

Branch: refs/heads/tv/6942
Commit: 1eea58c63d7af0ef278bdc6cfa0c356cafc4fc68
Parents: 3480d9b
Author: Cory Johns <ad...@users.sf.net>
Authored: Thu Dec 12 17:28:22 2013 +0000
Committer: Cory Johns <ad...@users.sf.net>
Committed: Thu Dec 12 17:28:22 2013 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/auth.py                        | 4 ++--
 Allura/allura/ext/user_profile/templates/user_index.html | 2 +-
 Allura/allura/ext/user_profile/user_main.py              | 2 +-
 Allura/allura/lib/plugin.py                              | 3 ---
 Allura/allura/model/auth.py                              | 2 +-
 Allura/allura/templates/user_prefs.html                  | 2 +-
 Allura/allura/tests/functional/test_auth.py              | 6 +++---
 Allura/allura/tests/functional/test_user_profile.py      | 4 ++--
 8 files changed, 11 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1eea58c6/Allura/allura/controllers/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/auth.py b/Allura/allura/controllers/auth.py
index 6116570..bb6e98f 100644
--- a/Allura/allura/controllers/auth.py
+++ b/Allura/allura/controllers/auth.py
@@ -509,8 +509,8 @@ class PreferencesController(BaseController):
 
     @expose()
     @require_post()
-    def user_message(self, allow_user_messages=None):
-        c.user.set_pref('allow_user_messages', allow_user_messages is not None)
+    def user_message(self, allow_user_messages=False):
+        c.user.set_pref('disable_user_messages', not allow_user_messages)
         redirect(request.referer)
 
 class UserInfoController(BaseController):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1eea58c6/Allura/allura/ext/user_profile/templates/user_index.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/user_profile/templates/user_index.html b/Allura/allura/ext/user_profile/templates/user_index.html
index 6052f75..41f7f67 100644
--- a/Allura/allura/ext/user_profile/templates/user_index.html
+++ b/Allura/allura/ext/user_profile/templates/user_index.html
@@ -229,7 +229,7 @@
       </div>
     {% endif %}
 
-    {% if user.get_pref('email_address') and c.user.get_pref('email_address') and user.get_pref('allow_user_messages') %}
+    {% if user.get_pref('email_address') and c.user.get_pref('email_address') and not user.get_pref('disable_user_messages') %}
     <div class="grid-24">
       <b><a href="send_message">Send me a message</a></b>
     </div>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1eea58c6/Allura/allura/ext/user_profile/user_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/user_profile/user_main.py b/Allura/allura/ext/user_profile/user_main.py
index b6342f8..793dbf5 100644
--- a/Allura/allura/ext/user_profile/user_main.py
+++ b/Allura/allura/ext/user_profile/user_main.py
@@ -107,7 +107,7 @@ class UserProfileController(BaseController, FeedController):
                     'an email address associated with their account.', 'info')
             redirect(request.referer)
 
-        if not to_user.get_pref('allow_user_messages'):
+        if to_user.get_pref('disable_user_messages'):
             flash('This user has disabled direct email messages', 'info')
             redirect(request.referer)
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1eea58c6/Allura/allura/lib/plugin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index 955b741..0c6c3b1 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -949,9 +949,6 @@ class LocalUserPreferencesProvider(UserPreferencesProvider):
 
     def get_pref(self, user, pref_name):
         if pref_name in user.preferences:
-            if pref_name == 'allow_user_messages' and user.preferences[pref_name] is None:
-                # allow_user_messages should be True by default
-                user.preferences[pref_name] = True
             return user.preferences[pref_name]
         else:
             return getattr(user, pref_name)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1eea58c6/Allura/allura/model/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index 6d5972e..fb8eaf7 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -320,7 +320,7 @@ class User(MappedClass, ActivityNode, ActivityObject):
             results_per_page=int,
             email_address=str,
             email_format=str,
-            allow_user_messages=bool))
+            disable_user_messages=bool))
 
     #Personal data
     sex=FieldProperty(

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1eea58c6/Allura/allura/templates/user_prefs.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/user_prefs.html b/Allura/allura/templates/user_prefs.html
index 4d75a6f..66b6c99 100644
--- a/Allura/allura/templates/user_prefs.html
+++ b/Allura/allura/templates/user_prefs.html
@@ -162,7 +162,7 @@
     <h2>User Messages</h2>
     <form method="POST" action="user_message">
     <div class="grid-19">
-        <input type="checkbox" id="allow_user_messages" name="allow_user_messages" {% if c.user.get_pref('allow_user_messages') %} checked {% endif %}>
+        <input type="checkbox" id="allow_user_messages" name="allow_user_messages" {% if not c.user.get_pref('disable_user_messages') %} checked {% endif %}>
         <label for="allow_user_messages">Allow another user to send me direct email messages</label>
     </div>
     <label class="grid-4">&nbsp;</label>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1eea58c6/Allura/allura/tests/functional/test_auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_auth.py b/Allura/allura/tests/functional/test_auth.py
index 242d31b..3159784 100644
--- a/Allura/allura/tests/functional/test_auth.py
+++ b/Allura/allura/tests/functional/test_auth.py
@@ -714,11 +714,11 @@ class TestPreferences(TestController):
 
     @td.with_user_project('test-admin')
     def test_user_message(self):
-        assert M.User.query.get(username='test-admin').get_pref('allow_user_messages')
+        assert not M.User.query.get(username='test-admin').get_pref('disable_user_messages')
         self.app.post('/auth/preferences/user_message')
-        assert not M.User.query.get(username='test-admin').get_pref('allow_user_messages')
+        assert M.User.query.get(username='test-admin').get_pref('disable_user_messages')
         self.app.post('/auth/preferences/user_message', params={'allow_user_messages': 'on'})
-        assert M.User.query.get(username='test-admin').get_pref('allow_user_messages')
+        assert not M.User.query.get(username='test-admin').get_pref('disable_user_messages')
 
 
 class TestPasswordReset(TestController):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1eea58c6/Allura/allura/tests/functional/test_user_profile.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_user_profile.py b/Allura/allura/tests/functional/test_user_profile.py
index cc90e2b..25d6430 100644
--- a/Allura/allura/tests/functional/test_user_profile.py
+++ b/Allura/allura/tests/functional/test_user_profile.py
@@ -134,11 +134,11 @@ class TestUserProfile(TestController):
         assert '<a href="send_message">Send me a message</a>' not in r
 
     @td.with_user_project('test-user')
-    def test_allow_user_messages(self):
+    def test_disable_user_messages(self):
         User.by_username('test-admin').set_pref('email_address', 'admin@example.com')
         test_user = User.by_username('test-user')
         test_user.set_pref('email_address', 'user@example.com')
-        test_user.set_pref('allow_user_messages', False)
+        test_user.set_pref('disable_user_messages', True)
         r = self.app.get('/u/test-user/profile')
         assert '<a href="send_message">Send me a message</a>' not in r
         r = self.app.get('/u/test-user/profile/send_message', status=302)


[38/45] git commit: [#6970] Fixed failing test due to icon change

Posted by tv...@apache.org.
[#6970] Fixed failing test due to icon change

Signed-off-by: Cory Johns <ad...@users.sf.net>


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

Branch: refs/heads/tv/6942
Commit: b988a938c4252463fd1789e4439ced1736e662b4
Parents: c3f5add
Author: Cory Johns <ad...@users.sf.net>
Authored: Thu Dec 12 20:29:37 2013 +0000
Committer: Cory Johns <ad...@users.sf.net>
Committed: Thu Dec 12 20:29:37 2013 +0000

----------------------------------------------------------------------
 ForgeActivity/forgeactivity/tests/functional/test_root.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b988a938/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 b008fc4..178bb89 100644
--- a/ForgeActivity/forgeactivity/tests/functional/test_root.py
+++ b/ForgeActivity/forgeactivity/tests/functional/test_root.py
@@ -95,6 +95,7 @@ class TestActivityController(TestController):
         assert_equal(activity.time['title'], "2013-12-04 21:48:19")
         h1 = """\
         <h1>
+        <img src="/u/test-admin/user_icon" alt="Administrator 1" title="Administrator 1" class="emboss x32 avatar" />
         <a href="/u/test-admin/">
          Administrator 1
         </a>
@@ -111,7 +112,6 @@ class TestActivityController(TestController):
         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>
         """


[10/45] 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/192a5a05
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/192a5a05
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/192a5a05

Branch: refs/heads/tv/6942
Commit: 192a5a054433a9a16fdb97a42709523293ddf3e4
Parents: 5c312e4
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Thu Dec 5 22:16:30 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Fri Dec 6 21:24:26 2013 +0000

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


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/192a5a05/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/192a5a05/Allura/allura/model/repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repo.py b/Allura/allura/model/repo.py
index 1ff6641..8918b02 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,23 @@ class Commit(RepoObject, ActivityObject):
     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.
+    @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, if
+        they have access to the tool.
         """
+        app_config_id = activity.obj.activity_extras.get('app_config_id')
+        if app_config_id:
+            app_config = AppConfig.query.get(_id=app_config_id)
+            return has_access(app_config, perm, user)
         return True
 
     def set_context(self, repo):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/192a5a05/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


[02/45] git commit: [#5475] ticket:493 Remove csrf token from GET forms

Posted by tv...@apache.org.
[#5475] ticket:493 Remove csrf token from GET forms


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

Branch: refs/heads/tv/6942
Commit: 9c4b569d1fed1b5880f915e4e4872dacce46c86f
Parents: 5042b1d
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed Nov 13 14:18:40 2013 +0200
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Wed Dec 4 15:35:11 2013 +0000

----------------------------------------------------------------------
 Allura/allura/ext/admin/templates/project_groups.html              | 2 --
 Allura/allura/ext/admin/templates/project_tools.html               | 1 -
 Allura/allura/ext/admin/templates/project_trove.html               | 2 +-
 Allura/allura/ext/user_profile/templates/send_message_form.html    | 2 ++
 Allura/allura/templates/jinja_master/sidebar_menu.html             | 2 --
 Allura/allura/templates/site_admin_new_projects.html               | 1 -
 Allura/allura/templates/widgets/admin_form.html                    | 2 +-
 Allura/allura/templates/widgets/forge_form.html                    | 2 +-
 Allura/allura/templates/widgets/moderate_posts.html                | 2 +-
 Allura/allura/templates/widgets/page_size.html                     | 2 --
 Allura/allura/templates/widgets/search_results.html                | 2 --
 Allura/allura/templates/widgets/subscription_form.html             | 2 +-
 ForgeBlog/forgeblog/templates/blog/post_history.html               | 1 -
 ForgeBlog/forgeblog/templates/blog_widgets/post_form.html          | 2 +-
 .../forgediscussion/templates/discussion_widgets/add_forum.html    | 2 +-
 .../templates/discussion_widgets/add_forum_short.html              | 2 +-
 ForgeTracker/forgetracker/templates/tracker/search.html            | 1 -
 .../forgetracker/templates/tracker_widgets/options_admin.html      | 2 +-
 .../templates/tracker_widgets/ticket_search_results.html           | 2 --
 19 files changed, 11 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/ext/admin/templates/project_groups.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_groups.html b/Allura/allura/ext/admin/templates/project_groups.html
index 7783f70..54f7c26 100644
--- a/Allura/allura/ext/admin/templates/project_groups.html
+++ b/Allura/allura/ext/admin/templates/project_groups.html
@@ -45,7 +45,6 @@
 {% endmacro %}
 
 {% block content %}
-              {{lib.csrf_token()}}
 <p>Project permissions are assigned to groups of users. Add users to a group appropriate to the role they fill in your project. <a href="#" id="show_help">more...</a></p>
 <div id="help_text" style="display:none">
 <p>By default, your project has three groups of progressively more privileged users (Member, Developer, and Admin groups). There are also catch alls for any logged in user (Authenticated) and any user even if they aren't logged in (Anonymous). Permissions allowed to a less privileged group are inherited by more privileged ones.</p>
@@ -85,7 +84,6 @@
               <input type="text" placeholder="type a username">
               <input type="submit" value="Save" class="nofloat">
               <a href="#" class="cancel_link">cancel</a>
-              {{lib.csrf_token()}}
             </form>
           </li>
           <li class="adder">

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/ext/admin/templates/project_tools.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_tools.html b/Allura/allura/ext/admin/templates/project_tools.html
index dc193c1..f70996c 100644
--- a/Allura/allura/ext/admin/templates/project_tools.html
+++ b/Allura/allura/ext/admin/templates/project_tools.html
@@ -150,7 +150,6 @@
   <div class="grid-13">
     <input type="button" value="Delete" class="continue_delete"> <input type="button" value="Cancel" class="cancel_delete close">
   </div>
-  {{lib.csrf_token()}}
 </form>
 {{c.admin_modal.display(content='<h1 id="popup_title"></h1><div id="popup_contents"></div>')}}
 {{c.mount_delete.display(content='<h1>Confirm Delete</h1>')}}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/ext/admin/templates/project_trove.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_trove.html b/Allura/allura/ext/admin/templates/project_trove.html
index fbd220c..dd7bd51 100644
--- a/Allura/allura/ext/admin/templates/project_trove.html
+++ b/Allura/allura/ext/admin/templates/project_trove.html
@@ -108,7 +108,7 @@
                     insertAfter = this;
                 }
               });
-              var $newItem = $('<div><span class="trove_fullpath">'+resp.trove_full_path+'</span> <form class="trove_deleter"><input type="hidden" name="type" value="'+type+'"><input type="hidden" name="trove" value="'+new_id+'">'+del_btn+'</form>{{lib.csrf_token()}}</div>');
+              var $newItem = $('<div><span class="trove_fullpath">'+resp.trove_full_path+'</span> <form class="trove_deleter"><input type="hidden" name="type" value="'+type+'"><input type="hidden" name="trove" value="'+new_id+'">'+del_btn+'</form></div>');
               if (insertAfter) {
                 $newItem.insertAfter(insertAfter);
               } else {

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/ext/user_profile/templates/send_message_form.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/user_profile/templates/send_message_form.html b/Allura/allura/ext/user_profile/templates/send_message_form.html
index 9a2b0df..1a083ac 100644
--- a/Allura/allura/ext/user_profile/templates/send_message_form.html
+++ b/Allura/allura/ext/user_profile/templates/send_message_form.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <div class="editbox">
     <div class="grid-19">
         <b>To:</b> <a href="{{user.url()}}">{{user.display_name|default(user.username)}}</a>
@@ -25,6 +26,7 @@
     </div>
     <div class="grid-19">&nbsp;</div>
     <form method="{{method}}" action="{{action}}">
+        {% if method.upper() == 'POST' %}{{lib.csrf_token()}}{% endif %}
         <div class="grid-19">
             <label class="cr">Subject:</label>
             {{widget.display_field(widget.fields.subject)}}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/templates/jinja_master/sidebar_menu.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/sidebar_menu.html b/Allura/allura/templates/jinja_master/sidebar_menu.html
index 5f82e64..08beed2 100644
--- a/Allura/allura/templates/jinja_master/sidebar_menu.html
+++ b/Allura/allura/templates/jinja_master/sidebar_menu.html
@@ -16,7 +16,6 @@
        specific language governing permissions and limitations
        under the License.
 -#}
-{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 {% set ul_active = [] %}
 {% macro sidebar_item(s) -%}
   {% if s.url %}
@@ -42,7 +41,6 @@
   {% if c.app and c.app.searchable %}
     <form id="search" method="GET" action="{{c.app.url + 'search/'}}">
       <input name="q" type="text" title="Search {{c.app.config.options.mount_label}}" placeholder="Search {{c.app.config.options.mount_label}}">
-      {{lib.csrf_token()}}
     </form>
   {% else %}
     <div>&nbsp;</div>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/templates/site_admin_new_projects.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_new_projects.html b/Allura/allura/templates/site_admin_new_projects.html
index 46cad9a..f6dc2f0 100644
--- a/Allura/allura/templates/site_admin_new_projects.html
+++ b/Allura/allura/templates/site_admin_new_projects.html
@@ -34,7 +34,6 @@
     <label for="end-dt">To: </label><input type="text" name="end-dt" id="end-dt" value="{{ window_end.strftime('%Y/%m/%d %H:%M:%S') }}">
     </div>
     <div class="grid-3"><input type="submit" value="Filter"></div>
-    {{lib.csrf_token()}}
   </form>
   </div>
   {{ _paging() }}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/templates/widgets/admin_form.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/admin_form.html b/Allura/allura/templates/widgets/admin_form.html
index 04e29b0..0c608d6 100644
--- a/Allura/allura/templates/widgets/admin_form.html
+++ b/Allura/allura/templates/widgets/admin_form.html
@@ -43,5 +43,5 @@
     {% endfor %}
     <a href="#" class="close">Cancel</a>
   </div>
-  {{lib.csrf_token()}}
+  {% if method.upper() == 'POST' %}{{lib.csrf_token()}}{% endif %}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/templates/widgets/forge_form.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/forge_form.html b/Allura/allura/templates/widgets/forge_form.html
index 6ab41d4..c62404e 100644
--- a/Allura/allura/templates/widgets/forge_form.html
+++ b/Allura/allura/templates/widgets/forge_form.html
@@ -54,5 +54,5 @@
   {% endif %}
   {% if widget.antispam %}{% for fld in g.antispam.extra_fields() %}
   {{fld}}{% endfor %}{% endif %}
-  {{lib.csrf_token()}}
+  {% if method.upper() == 'POST' %}{{lib.csrf_token()}}{% endif %}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/templates/widgets/moderate_posts.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/moderate_posts.html b/Allura/allura/templates/widgets/moderate_posts.html
index e06fc12..7a81e1e 100644
--- a/Allura/allura/templates/widgets/moderate_posts.html
+++ b/Allura/allura/templates/widgets/moderate_posts.html
@@ -66,5 +66,5 @@
       {% endfor %}
     </tbody>
   </table>
-  {{lib.csrf_token()}}
+  {% if method.upper() == 'POST' %}{{lib.csrf_token()}}{% endif %}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/templates/widgets/page_size.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/page_size.html b/Allura/allura/templates/widgets/page_size.html
index 99fc3ac..baed90a 100644
--- a/Allura/allura/templates/widgets/page_size.html
+++ b/Allura/allura/templates/widgets/page_size.html
@@ -16,7 +16,6 @@
        specific language governing permissions and limitations
        under the License.
 -#}
-{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="get">
   {% for k,v in widget.url_params.iteritems() %}
     <input type="hidden" name="{{k}}" value="{{v}}"/>
@@ -35,5 +34,4 @@
   {% endif %}
   result{% if limit|int != 1 %}s{% endif %} of {{count}} </strong></p>
   {% endif %}
-  {{lib.csrf_token()}}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/templates/widgets/search_results.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/search_results.html b/Allura/allura/templates/widgets/search_results.html
index 74b9134..464dab4 100644
--- a/Allura/allura/templates/widgets/search_results.html
+++ b/Allura/allura/templates/widgets/search_results.html
@@ -16,7 +16,6 @@
        specific language governing permissions and limitations
        under the License.
 -#}
-{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="GET" action=".">
   <div class="grid-10">
     <input type="text" name="q" value="{{q}}" class="search-query" title="Search App"/>
@@ -53,7 +52,6 @@
       <input id="search-history" type="checkbox" name="history"{% if history %} checked{% endif %}>
     {% endif %}
   </div>
-  {{lib.csrf_token()}}
 </form>
 <div style="clear:both">&nbsp;</div>
 {% if search_error %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/Allura/allura/templates/widgets/subscription_form.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/subscription_form.html b/Allura/allura/templates/widgets/subscription_form.html
index 45aed2a..1a58efe 100644
--- a/Allura/allura/templates/widgets/subscription_form.html
+++ b/Allura/allura/templates/widgets/subscription_form.html
@@ -27,7 +27,7 @@
     <input type="submit" value="Update email subscriptions"/>
     {% endif %}
     </p>
-    {{lib.csrf_token()}}
+    {% if method.upper() == 'POST' %}{{lib.csrf_token()}}{% endif %}
   </form>
   {{widget.fields['page_list'].display(limit=limit, page=page, count=count)}}
   {{widget.fields['page_size'].display(limit=limit, page=page, count=count)}}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/ForgeBlog/forgeblog/templates/blog/post_history.html
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/templates/blog/post_history.html b/ForgeBlog/forgeblog/templates/blog/post_history.html
index 2fb74e8..fd1efbf 100644
--- a/ForgeBlog/forgeblog/templates/blog/post_history.html
+++ b/ForgeBlog/forgeblog/templates/blog/post_history.html
@@ -51,6 +51,5 @@
               {% endfor %}
               </tbody>
             </table>
-            {{lib.csrf_token()}}
           </form>
 {% endblock %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/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 66e3b4d..5ec530f 100644
--- a/ForgeBlog/forgeblog/templates/blog_widgets/post_form.html
+++ b/ForgeBlog/forgeblog/templates/blog_widgets/post_form.html
@@ -51,6 +51,6 @@
   </div>
   {% if widget.antispam %}{% for fld in g.antispam.extra_fields() %}
   {{fld}}{% endfor %}{% endif %}
-  {{lib.csrf_token()}}
+  {% if method.upper() == 'POST' %}{{lib.csrf_token()}}{% endif %}
 </form>
 </div>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum.html
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum.html b/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum.html
index b483c92..f53d42d 100644
--- a/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum.html
+++ b/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum.html
@@ -48,7 +48,7 @@
       <input type="button" id="add_forum_cancel" value="Cancel">
     </div>
   </div>
-  {{lib.csrf_token()}}
+  {% if method.upper() == 'POST' %}{{lib.csrf_token()}}{% endif %}
 </form>
 <script type="text/javascript">
     function addLoadEvent(func) {

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/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 273a00e..9c6bdf7 100644
--- a/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum_short.html
+++ b/ForgeDiscussion/forgediscussion/templates/discussion_widgets/add_forum_short.html
@@ -48,7 +48,7 @@
     <input type="submit" id="new_forum.create" name="new_forum.create" value="Save">
     <a id="add_forum_cancel" class="btn link">Cancel</a>
   </div>
-  {{lib.csrf_token()}}
+  {% if method.upper() == 'POST' %}{{lib.csrf_token()}}{% endif %}
 </form>
 <script type="text/javascript">
   {% for field in widget.fields %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/ForgeTracker/forgetracker/templates/tracker/search.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker/search.html b/ForgeTracker/forgetracker/templates/tracker/search.html
index a690830..c355f47 100644
--- a/ForgeTracker/forgetracker/templates/tracker/search.html
+++ b/ForgeTracker/forgetracker/templates/tracker/search.html
@@ -74,7 +74,6 @@
     <input type="button" value="Update Search" id="save_search"/>
   {% endif %}
   <input type="submit" value="Search"/>
-  {{lib.csrf_token()}}
 </form>
 <a href="{{tg.url(c.app.url + 'search_help/')}}" target="_blank" class="btn search_help_modal"><b data-icon="{{g.icons['help'].char}}" class="ico {{g.icons['help'].css}}"></b> Help</a>
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/ForgeTracker/forgetracker/templates/tracker_widgets/options_admin.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker_widgets/options_admin.html b/ForgeTracker/forgetracker/templates/tracker_widgets/options_admin.html
index 2483917..e07cb37 100644
--- a/ForgeTracker/forgetracker/templates/tracker_widgets/options_admin.html
+++ b/ForgeTracker/forgetracker/templates/tracker_widgets/options_admin.html
@@ -45,5 +45,5 @@
     {% endfor %}
     <a href="#" onclick="window.history.back(); return false;" class="close">Cancel</a>
   </div>
-  {{lib.csrf_token()}}
+  {% if method.upper() == 'POST' %}{{lib.csrf_token()}}{% endif %}
 </form>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/9c4b569d/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_search_results.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_search_results.html b/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_search_results.html
index 91ee78a..2c5bb6c 100644
--- a/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_search_results.html
+++ b/ForgeTracker/forgetracker/templates/tracker_widgets/ticket_search_results.html
@@ -17,7 +17,6 @@
        under the License.
 -#}
 {% from 'allura:templates/jinja_master/lib.html' import abbr_date with context %}
-{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <div id="ticket_search_results_holder" style="clear:both">
   {% if solr_error %}<p>{{solr_error}}</p>{% endif %}
   {{widget.fields['page_size'].display(page=page, count=count, limit=limit)}}
@@ -104,7 +103,6 @@
       {% if h.has_access(c.app, 'configure') %}
           <a href="{{c.project.url()}}admin/{{c.app.config.options.mount_point}}/fields">Change field settings permanently.</a>
       {% endif %}
-      {{lib.csrf_token()}}
     </form>
     {{widget.fields['lightbox'].display()}}
   {% endif %}


[07/45] git commit: [#5475] ticket:493 Add CsrfForm and use it instead of SimpleForm where needed

Posted by tv...@apache.org.
[#5475] ticket:493 Add CsrfForm and use it instead of SimpleForm where needed


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

Branch: refs/heads/tv/6942
Commit: 3ca3e1a9dd53812c35b86bc03fb75e05a693c2ec
Parents: 9c4b569
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Nov 25 16:15:21 2013 +0200
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Wed Dec 4 15:35:12 2013 +0000

----------------------------------------------------------------------
 Allura/allura/ext/admin/widgets.py                       | 10 ++++++----
 Allura/allura/lib/widgets/discuss.py                     |  4 ++--
 Allura/allura/lib/widgets/forms.py                       | 11 +++++++++++
 Allura/allura/lib/widgets/subscriptions.py               |  3 ++-
 ForgeDiscussion/forgediscussion/widgets/forum_widgets.py | 11 +++++++----
 5 files changed, 28 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/3ca3e1a9/Allura/allura/ext/admin/widgets.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/widgets.py b/Allura/allura/ext/admin/widgets.py
index 85d9237..8eed0be 100644
--- a/Allura/allura/ext/admin/widgets.py
+++ b/Allura/allura/ext/admin/widgets.py
@@ -110,12 +110,14 @@ class PermissionCard(CardField):
         return role._id
 
 
-class GroupSettings(ew.SimpleForm):
+class GroupSettings(ff.CsrfForm):
     submit_text=None
 
-    class hidden_fields(ew_core.NameList):
-        _id = ew.HiddenField(
-            validator=V.Ming(M.ProjectRole))
+    @property
+    def hidden_fields(self):
+        f = super(GroupSettings, self).hidden_fields
+        f.append(ew.HiddenField(name='_id', validator=V.Ming(M.ProjectRole)))
+        return f
 
     class fields(ew_core.NameList):
         name = ew.InputField(label='Name')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/3ca3e1a9/Allura/allura/lib/widgets/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/discuss.py b/Allura/allura/lib/widgets/discuss.py
index eaec991..151a0c2 100644
--- a/Allura/allura/lib/widgets/discuss.py
+++ b/Allura/allura/lib/widgets/discuss.py
@@ -34,7 +34,7 @@ class NullValidator(fev.FancyValidator):
     def _from_python(self, value, state): return value
 
 # Discussion forms
-class ModerateThread(ew.SimpleForm):
+class ModerateThread(ff.CsrfForm):
     defaults=dict(
         ew.SimpleForm.defaults,
         submit_text=None)
@@ -453,6 +453,6 @@ class Discussion(HierWidget):
         discussion_header=DiscussionHeader(),
         edit_post=EditPost(submit_text='New Topic'),
         subscription_form=SubscriptionForm())
-    
+
     def resources(self):
         for r in super(Discussion, self).resources(): yield r

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/3ca3e1a9/Allura/allura/lib/widgets/forms.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/forms.py b/Allura/allura/lib/widgets/forms.py
index 4e1dae4..d99de0f 100644
--- a/Allura/allura/lib/widgets/forms.py
+++ b/Allura/allura/lib/widgets/forms.py
@@ -957,3 +957,14 @@ class MoveTicketForm(ForgeForm):
         self.fields.tracker.options = (
             [ew.Option(py_value=v, label=l, selected=s)
              for v, l, s in sorted(trackers, key=lambda x: x[1])])
+
+
+class CsrfForm(ew.SimpleForm):
+    @property
+    def hidden_fields(self):
+        return [ew.HiddenField(name='_session_id')]
+    def context_for(self, field):
+        ctx = super(CsrfForm, self).context_for(field)
+        if field.name == '_session_id':
+            ctx['value'] = tg.request.cookies['_session_id']
+        return ctx

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/3ca3e1a9/Allura/allura/lib/widgets/subscriptions.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/subscriptions.py b/Allura/allura/lib/widgets/subscriptions.py
index a0a1bc3..3f68d58 100644
--- a/Allura/allura/lib/widgets/subscriptions.py
+++ b/Allura/allura/lib/widgets/subscriptions.py
@@ -22,6 +22,7 @@ import ew.jinja2_ew as ew
 
 from allura.lib import validators as V
 from allura.lib.widgets import form_fields as ffw
+from allura.lib.widgets.forms import CsrfForm
 from allura import model as M
 
 from .form_fields import SubmitButton
@@ -44,7 +45,7 @@ class _SubscriptionTable(ew.TableField):
         # unsubscribe = SubmitButton()
         subscribed = ew.Checkbox(suppress_label=True)
 
-class SubscriptionForm(ew.SimpleForm):
+class SubscriptionForm(CsrfForm):
     defaults=dict(
         ew.SimpleForm.defaults,
         submit_text='Save')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/3ca3e1a9/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py b/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py
index 5df5370..1b04323 100644
--- a/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py
+++ b/ForgeDiscussion/forgediscussion/widgets/forum_widgets.py
@@ -24,6 +24,7 @@ import ew.jinja2_ew as ew
 from allura.lib import validators as V
 from allura.lib.widgets import discuss as DW
 from allura.lib.widgets import form_fields as ffw
+from allura.lib.widgets.forms import CsrfForm
 from allura.lib.widgets.subscriptions import SubscribeForm
 
 from forgediscussion import model as M
@@ -46,7 +47,7 @@ class _ForumsTable(ew.TableField):
         subscribed=ew.Checkbox(suppress_label=True, show_label=True)
     fields.insert(0, _ForumSummary())
 
-class ForumSubscriptionForm(ew.SimpleForm):
+class ForumSubscriptionForm(CsrfForm):
     class fields(ew_core.NameList):
         forums=_ForumsTable()
         page_list=ffw.PageList()
@@ -95,22 +96,24 @@ class _ForumSelector(ew.SingleSelectField):
     def from_python(self, value, state):
         return value.shortname
 
-class ModerateThread(ew.SimpleForm):
+class ModerateThread(CsrfForm):
     submit_text='Save Changes'
     class fields(ew_core.NameList):
         discussion=_ForumSelector(label='New Forum')
         flags=ew.CheckboxSet(options=['Sticky', 'Announcement'])
+
     class buttons(ew_core.NameList):
         delete=ew.SubmitButton(label='Delete Thread')
 
-class ModeratePost(ew.SimpleForm):
+
+class ModeratePost(CsrfForm):
     submit_text=None
     fields=[
         ew.FieldSet(legend='Promote post to its own thread', fields=[
                 ew.TextField(name='subject', label='Thread title'),
                 ew.SubmitButton(name='promote', label='Promote to thread')])]
 
-class PromoteToThread(ew.SimpleForm):
+class PromoteToThread(CsrfForm):
     submit_text=None
     fields=[
         ew.TextField(name='subject', label='Thread title'),


[05/45] git commit: [#5475] ticket:472 JS CSFR protecion has moved to csfr_token Jinja macro

Posted by tv...@apache.org.
[#5475] ticket:472 JS CSFR protecion has moved to csfr_token Jinja macro


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

Branch: refs/heads/tv/6942
Commit: 127ea61f69d6994ccd6e085ed687a0a6486439c7
Parents: 6449dbb
Author: Andrej Aleksandrov <pi...@gmail.com>
Authored: Thu Nov 7 10:52:00 2013 +0200
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Wed Dec 4 15:35:11 2013 +0000

----------------------------------------------------------------------
 Allura/allura/public/nf/js/allura-base.js       | 4 ----
 Allura/allura/templates/jinja_master/lib.html   | 7 +++++++
 Allura/allura/templates/widgets/forge_form.html | 2 ++
 3 files changed, 9 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/127ea61f/Allura/allura/public/nf/js/allura-base.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/allura-base.js b/Allura/allura/public/nf/js/allura-base.js
index 5973609..e6e205e 100644
--- a/Allura/allura/public/nf/js/allura-base.js
+++ b/Allura/allura/public/nf/js/allura-base.js
@@ -213,10 +213,6 @@ $(function(){
         }
     });
 
-    // Provide CSRF protection
-    var cval = $.cookie('_session_id');
-    $('form[method=post]').append('<input name="_session_id" type="hidden" value="'+cval+'">');
-
     var SN_ID=0, SN_VIEWS=1, SN_CLOSED=2;
     $('#site-notification .btn-close').click(function(e) {
         var $note = $(this).parent();

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/127ea61f/Allura/allura/templates/jinja_master/lib.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/lib.html b/Allura/allura/templates/jinja_master/lib.html
index 8f6ddf2..4162368 100644
--- a/Allura/allura/templates/jinja_master/lib.html
+++ b/Allura/allura/templates/jinja_master/lib.html
@@ -16,6 +16,13 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+
+{% macro csrf_token() -%}
+  {% if request %}
+    <input name="_session_id" type="hidden" value="{{request.cookies['_session_id']}}">
+  {% endif %}
+{%- endmacro %}
+
 {% macro related_artifacts(artifact) -%}
   {% set related_artifacts = artifact.related_artifacts() %}
   {% if related_artifacts %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/127ea61f/Allura/allura/templates/widgets/forge_form.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/forge_form.html b/Allura/allura/templates/widgets/forge_form.html
index adbc01c..de20c42 100644
--- a/Allura/allura/templates/widgets/forge_form.html
+++ b/Allura/allura/templates/widgets/forge_form.html
@@ -16,6 +16,7 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 <form method="{{method}}"
       {% if enctype %}enctype="{{enctype}}"{% endif %}
       {% if target %}target="{{target}}"{% endif %}
@@ -53,4 +54,5 @@
   {% endif %}
   {% if widget.antispam %}{% for fld in g.antispam.extra_fields() %}
   {{fld}}{% endfor %}{% endif %}
+  {{lib.csrf_token()}} 
 </form>


[06/45] git commit: [#5475] ticket:493 Use request.cookies.get() instead of [] to prevent test failures

Posted by tv...@apache.org.
[#5475] ticket:493 Use request.cookies.get() instead of [] to prevent test failures


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

Branch: refs/heads/tv/6942
Commit: 6426ead9bae9368971816ee6d7dd718a0fcc3019
Parents: 3ca3e1a
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Nov 25 17:20:18 2013 +0200
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Wed Dec 4 15:35:12 2013 +0000

----------------------------------------------------------------------
 Allura/allura/lib/widgets/forms.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6426ead9/Allura/allura/lib/widgets/forms.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/forms.py b/Allura/allura/lib/widgets/forms.py
index d99de0f..e656fc0 100644
--- a/Allura/allura/lib/widgets/forms.py
+++ b/Allura/allura/lib/widgets/forms.py
@@ -966,5 +966,5 @@ class CsrfForm(ew.SimpleForm):
     def context_for(self, field):
         ctx = super(CsrfForm, self).context_for(field)
         if field.name == '_session_id':
-            ctx['value'] = tg.request.cookies['_session_id']
+            ctx['value'] = tg.request.cookies.get('_session_id')
         return ctx


[13/45] git commit: [#6917] Spawn task to handle email routing

Posted by tv...@apache.org.
[#6917] Spawn task to handle email routing

Because smtp_server is long-running, it's ming session identity map
can get stale. If an app was already in the identity map, the cached
copy of the acl would be used, even if it had been updated in the
meantime. Consequently, updates to the user block list would not
affect email routing unless smtp_server was restarted.

By moving the email routing out-of-process and into a separate task,
we guarantee that each email will be processed within the context of
a fresh session, and therefore, an up-to-date app acl.

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/633b107a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/633b107a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/633b107a

Branch: refs/heads/tv/6942
Commit: 633b107a3853e101ef2bd4becf8b31ae35bd3d55
Parents: 192a5a0
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Tue Dec 3 16:34:17 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Fri Dec 6 22:22:59 2013 +0000

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


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/633b107a/Allura/allura/command/smtp_server.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/smtp_server.py b/Allura/allura/command/smtp_server.py
index cc1710a..ca26cb4 100644
--- a/Allura/allura/command/smtp_server.py
+++ b/Allura/allura/command/smtp_server.py
@@ -50,6 +50,6 @@ class MailServer(smtpd.SMTPServer):
     def process_message(self, peer, mailfrom, rcpttos, data):
         base.log.info('Msg Received from %s for %s', mailfrom, rcpttos)
         base.log.info(' (%d bytes)', len(data))
-        allura.tasks.mail_tasks.route_email(
+        allura.tasks.mail_tasks.route_email.post(
             peer=peer, mailfrom=mailfrom, rcpttos=rcpttos, data=data)
         base.log.info('Msg passed along')


[36/45] git commit: [#6830] Fix test to account for changed menu

Posted by tv...@apache.org.
[#6830] Fix test to account for changed menu

(The activity tool is no longer hidden.)

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/92085995
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/92085995
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/92085995

Branch: refs/heads/tv/6942
Commit: 920859956083a7741e7f67f89b3a18455de2907d
Parents: 4aeceac
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Thu Dec 12 20:08:43 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 20:08:43 2013 +0000

----------------------------------------------------------------------
 Allura/allura/tests/functional/test_home.py | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/92085995/Allura/allura/tests/functional/test_home.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_home.py b/Allura/allura/tests/functional/test_home.py
index f57107f..1a5bb57 100644
--- a/Allura/allura/tests/functional/test_home.py
+++ b/Allura/allura/tests/functional/test_home.py
@@ -50,9 +50,10 @@ class TestProjectHome(TestController):
 
         response = self.app.get('/p/test/_nav.json')
         menu = response.json['menu']
-        assert_equal(len(menu[1]['children']), 2)
-        assert {u'url': u'/p/test/wiki/', u'name': u'Wiki', u'icon': u'tool-wiki', 'tool_name': 'wiki'} in menu[1]['children'], menu[1]['children']
-        assert {u'url': u'/p/test/wiki2/', u'name': u'wiki2', u'icon': u'tool-wiki', 'tool_name': 'wiki'} in menu[1]['children'], menu[1]['children']
+        wikis = menu[-2]['children']
+        assert_equal(len(wikis), 2)
+        assert {u'url': u'/p/test/wiki/', u'name': u'Wiki', u'icon': u'tool-wiki', 'tool_name': 'wiki'} in wikis, wikis
+        assert {u'url': u'/p/test/wiki2/', u'name': u'wiki2', u'icon': u'tool-wiki', 'tool_name': 'wiki'} in wikis, wikis
 
     @td.with_wiki
     def test_project_group_nav_more_than_ten(self):


[14/45] 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/247633b8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/247633b8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/247633b8

Branch: refs/heads/tv/6942
Commit: 247633b85dc54dfdde4e64d02a3cedc74c886c34
Parents: d20a1de
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Thu Dec 5 15:15:48 2013 +0000
Committer: Cory Johns <ad...@users.sf.net>
Committed: Mon Dec 9 15:52:11 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/247633b8/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/247633b8/Allura/allura/model/repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repo.py b/Allura/allura/model/repo.py
index d9a4a10..682670a 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/247633b8/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/247633b8/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/247633b8/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/247633b8/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/247633b8/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/247633b8/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/247633b8/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/247633b8/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/247633b8/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/247633b8/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)))


[09/45] git commit: [#6960] deal with google code bogus Content-Type header

Posted by tv...@apache.org.
[#6960] deal with google code bogus Content-Type header


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

Branch: refs/heads/tv/6942
Commit: 2374176399a84cdd2d70ca8d42cec5308aa23edc
Parents: 4062227
Author: Dave Brondsema <db...@slashdotmedia.com>
Authored: Fri Dec 6 17:41:54 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Fri Dec 6 17:41:54 2013 +0000

----------------------------------------------------------------------
 ForgeImporters/forgeimporters/google/__init__.py | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/23741763/ForgeImporters/forgeimporters/google/__init__.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/__init__.py b/ForgeImporters/forgeimporters/google/__init__.py
index c4b9a99..87990d0 100644
--- a/ForgeImporters/forgeimporters/google/__init__.py
+++ b/ForgeImporters/forgeimporters/google/__init__.py
@@ -159,8 +159,12 @@ class GoogleCodeProjectExtractor(ProjectExtractor):
             return
         icon_name = urllib.unquote(urlparse(icon_url).path).split('/')[-1]
         icon = File(icon_url, icon_name)
+        filetype = icon.type
+        # work around Google Code giving us bogus file type
+        if filetype.startswith('text/html'):
+            filetype = 'image/png'
         M.ProjectFile.save_image(
-            icon_name, icon.file, icon.type,
+            icon_name, icon.file, filetype,
             square=True, thumbnail_size=(48,48),
             thumbnail_meta={'project_id': project._id, 'category': 'icon'})
 


[08/45] git commit: [#6956] Fixed silent nbhd error on import for neighborhoods with spaces in the name

Posted by tv...@apache.org.
[#6956] Fixed silent nbhd error on import for neighborhoods with spaces in the name

Signed-off-by: Cory Johns <cj...@slashdotmedia.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/40622275
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/40622275
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/40622275

Branch: refs/heads/tv/6942
Commit: 4062227538627df3293ed168ab5f5108144a78cd
Parents: 6426ead
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Fri Dec 6 17:11:42 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Fri Dec 6 17:11:42 2013 +0000

----------------------------------------------------------------------
 ForgeImporters/forgeimporters/base.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/40622275/ForgeImporters/forgeimporters/base.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/base.py b/ForgeImporters/forgeimporters/base.py
index 412ff3d..066719b 100644
--- a/ForgeImporters/forgeimporters/base.py
+++ b/ForgeImporters/forgeimporters/base.py
@@ -64,7 +64,7 @@ class ProjectImportForm(schema.Schema):
         self.add_field('project_shortname', provider.shortname_validator)
         self.allow_extra_fields = True
 
-    neighborhood = fev.PlainText(not_empty=True)
+    neighborhood = fev.NotEmpty()
     project_name = fev.UnicodeString(not_empty=True, max=40)
 
 


[24/45] git commit: [#6831] Added API controller for ForgeActivity

Posted by tv...@apache.org.
[#6831] Added API controller for ForgeActivity

Signed-off-by: Cory Johns <ad...@users.sf.net>


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

Branch: refs/heads/tv/6942
Commit: 0302ba5e704a743dd2772eea54d4657d190075fd
Parents: da7f34a
Author: Cory Johns <ad...@users.sf.net>
Authored: Tue Dec 10 20:42:50 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 05:54:18 2013 +0000

----------------------------------------------------------------------
 ForgeActivity/forgeactivity/main.py | 43 ++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/0302ba5e/ForgeActivity/forgeactivity/main.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/main.py b/ForgeActivity/forgeactivity/main.py
index 3d1e62f..daeb1ce 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(self)
+        self.api_root = ForgeActivityRestController(self)
 
     def main_menu(self): # pragma no cover
         return []
@@ -132,3 +133,45 @@ class ForgeActivityController(BaseController):
             success=True,
             message=W.follow_toggle.success_message(follow),
             following=follow)
+
+
+class ForgeActivityRestController(BaseController):
+    def __init__(self, app, *args, **kw):
+        super(ForgeActivityRestController, self).__init__(*args, **kw)
+        self.app = app
+
+    @expose('json:')
+    def index(self, **kw):
+        activity_enabled = config.get('activitystream.enabled', False)
+        activity_enabled = request.cookies.get('activitystream.enabled', activity_enabled)
+        activity_enabled = asbool(activity_enabled)
+        if not activity_enabled:
+            raise exc.HTTPNotFound()
+
+        c.follow_toggle = W.follow_toggle
+        if c.project.is_user_project:
+            followee = c.project.user_project_of
+            actor_only = followee != c.user
+        else:
+            followee = c.project
+            actor_only = False
+
+        following = g.director.is_connected(c.user, followee)
+        timeline = g.director.get_timeline(followee, page=kw.get('page', 0),
+                limit=kw.get('limit', 100), actor_only=actor_only,
+                filter_func=perm_check(c.user))
+        return {
+                'following': following,
+                'followee': {
+                    'activity_name': followee.shortname,
+                    'activity_url': followee.url(),
+                    'activity_extras': {},
+                },
+                'timeline': [{
+                        'published': '%s UTC' % a.published,
+                        'actor': a.actor._deinstrument(),
+                        'verb': a.verb,
+                        'obj': a.obj._deinstrument(),
+                        'target': a.target._deinstrument(),
+                    } for a in timeline],
+            }


[18/45] git commit: [#6381] ticket:491 fixed reply error

Posted by tv...@apache.org.
[#6381] ticket:491 fixed reply error

If a reply violates the antispam protection (e.g. form had been open > 24hr)
then previously the index method would "handle" the error and mark the parent
message as edited.  This prevents that.


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

Branch: refs/heads/tv/6942
Commit: fcf2e465939e947bfee9a9b85811e32f14161527
Parents: 9a0faf0
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Sun Dec 1 01:06:20 2013 +0400
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Tue Dec 10 18:20:22 2013 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/discuss.py | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/fcf2e465/Allura/allura/controllers/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/discuss.py b/Allura/allura/controllers/discuss.py
index 74879ad..b80b4e9 100644
--- a/Allura/allura/controllers/discuss.py
+++ b/Allura/allura/controllers/discuss.py
@@ -186,10 +186,13 @@ class ThreadController(BaseController, FeedController):
                     limit=int(limit),
                     show_moderate=kw.get('show_moderate'))
 
+    def error_handler(self, *args, **kwargs):
+        redirect(request.referer)
+
     @h.vardec
     @expose()
     @require_post()
-    @validate(pass_validator, error_handler=index)
+    @validate(pass_validator, error_handler=error_handler)
     @utils.AntiSpam.validate('Spambot protection engaged')
     def post(self, **kw):
         require_access(self.thread, 'post')
@@ -310,10 +313,13 @@ class PostController(BaseController):
             return dict(discussion=self.post.discussion,
                         post=post)
 
+    def error_handler(self, *args, **kwargs):
+        redirect(request.referer)
+
     @h.vardec
     @expose()
     @require_post()
-    @validate(pass_validator, error_handler=index)
+    @validate(pass_validator, error_handler=error_handler)
     @utils.AntiSpam.validate('Spambot protection engaged')
     @require_post(redir='.')
     def reply(self, file_info=None, **kw):
@@ -326,7 +332,7 @@ class PostController(BaseController):
     @h.vardec
     @expose()
     @require_post()
-    @validate(pass_validator, error_handler=index)
+    @validate(pass_validator, error_handler=error_handler)
     def moderate(self, **kw):
         require_access(self.post.thread, 'moderate')
         if kw.pop('delete', None):
@@ -342,7 +348,7 @@ class PostController(BaseController):
     @h.vardec
     @expose()
     @require_post()
-    @validate(pass_validator, error_handler=index)
+    @validate(pass_validator, error_handler=error_handler)
     def flag(self, **kw):
         self.W.flag_post.to_python(kw, None)
         if c.user._id not in self.post.flagged_by:


[15/45] 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/d20a1de8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/d20a1de8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/d20a1de8

Branch: refs/heads/tv/6942
Commit: d20a1de8573fec99593848dc9648f2d26d12822c
Parents: 633b107
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Wed Dec 4 22:01:58 2013 +0000
Committer: Cory Johns <ad...@users.sf.net>
Committed: Mon Dec 9 15:52:11 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, 95 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d20a1de8/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/d20a1de8/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/d20a1de8/Allura/allura/model/repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repo.py b/Allura/allura/model/repo.py
index 8918b02..d9a4a10 100644
--- a/Allura/allura/model/repo.py
+++ b/Allura/allura/model/repo.py
@@ -186,6 +186,8 @@ class Commit(RepoObject, ActivityObject):
 
     def has_activity_access(self, perm, user, activity):
         """
+        Check access against the original app.
+
         Commits have no ACLs and are therefore always viewable by any user, if
         they have access to the tool.
         """

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d20a1de8/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/d20a1de8/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/d20a1de8/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/d20a1de8/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/d20a1de8/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/d20a1de8/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__(),


[27/45] git commit: [#6888] ticket:495 Store option in preferences, don't use extra field on User

Posted by tv...@apache.org.
[#6888] ticket:495 Store option in preferences, don't use extra field on User


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

Branch: refs/heads/tv/6942
Commit: 55e2b11be8a89482282a611606481adb533cb759
Parents: 19b00b3
Author: Igor Bondarenko <je...@gmail.com>
Authored: Thu Nov 28 11:57:28 2013 +0000
Committer: Cory Johns <ad...@users.sf.net>
Committed: Thu Dec 12 15:41:40 2013 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/auth.py                        |  4 ++--
 Allura/allura/ext/user_profile/templates/user_index.html |  2 +-
 Allura/allura/ext/user_profile/user_main.py              |  4 ++--
 Allura/allura/lib/plugin.py                              |  3 +++
 Allura/allura/model/auth.py                              |  4 ++--
 Allura/allura/templates/user_prefs.html                  |  4 ++--
 Allura/allura/tests/functional/test_auth.py              |  8 ++++----
 Allura/allura/tests/functional/test_user_profile.py      | 11 +++--------
 8 files changed, 19 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/55e2b11b/Allura/allura/controllers/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/auth.py b/Allura/allura/controllers/auth.py
index 7a58eda..6116570 100644
--- a/Allura/allura/controllers/auth.py
+++ b/Allura/allura/controllers/auth.py
@@ -509,8 +509,8 @@ class PreferencesController(BaseController):
 
     @expose()
     @require_post()
-    def user_message(self, allow_user_message=None):
-        c.user.allow_user_message = allow_user_message is not None
+    def user_message(self, allow_user_messages=None):
+        c.user.set_pref('allow_user_messages', allow_user_messages is not None)
         redirect(request.referer)
 
 class UserInfoController(BaseController):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/55e2b11b/Allura/allura/ext/user_profile/templates/user_index.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/user_profile/templates/user_index.html b/Allura/allura/ext/user_profile/templates/user_index.html
index f3639d1..6052f75 100644
--- a/Allura/allura/ext/user_profile/templates/user_index.html
+++ b/Allura/allura/ext/user_profile/templates/user_index.html
@@ -229,7 +229,7 @@
       </div>
     {% endif %}
 
-    {% if user.get_pref('email_address') and c.user.get_pref('email_address') and user.allow_user_message %}
+    {% if user.get_pref('email_address') and c.user.get_pref('email_address') and user.get_pref('allow_user_messages') %}
     <div class="grid-24">
       <b><a href="send_message">Send me a message</a></b>
     </div>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/55e2b11b/Allura/allura/ext/user_profile/user_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/user_profile/user_main.py b/Allura/allura/ext/user_profile/user_main.py
index c57fb60..b6342f8 100644
--- a/Allura/allura/ext/user_profile/user_main.py
+++ b/Allura/allura/ext/user_profile/user_main.py
@@ -107,8 +107,8 @@ class UserProfileController(BaseController, FeedController):
                     'an email address associated with their account.', 'info')
             redirect(request.referer)
 
-        if not to_user.allow_user_message:
-            flash('This user has disabled user message', 'info')
+        if not to_user.get_pref('allow_user_messages'):
+            flash('This user has disabled direct email messages', 'info')
             redirect(request.referer)
 
     @expose('jinja:allura.ext.user_profile:templates/user_index.html')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/55e2b11b/Allura/allura/lib/plugin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index 0c6c3b1..955b741 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -949,6 +949,9 @@ class LocalUserPreferencesProvider(UserPreferencesProvider):
 
     def get_pref(self, user, pref_name):
         if pref_name in user.preferences:
+            if pref_name == 'allow_user_messages' and user.preferences[pref_name] is None:
+                # allow_user_messages should be True by default
+                user.preferences[pref_name] = True
             return user.preferences[pref_name]
         else:
             return getattr(user, pref_name)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/55e2b11b/Allura/allura/model/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index f7a8705..6d5972e 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -319,7 +319,8 @@ class User(MappedClass, ActivityNode, ActivityObject):
     preferences=FieldProperty(dict(
             results_per_page=int,
             email_address=str,
-            email_format=str))
+            email_format=str,
+            allow_user_messages=bool))
 
     #Personal data
     sex=FieldProperty(
@@ -353,7 +354,6 @@ class User(MappedClass, ActivityNode, ActivityObject):
 
     #Statistics
     stats_id = FieldProperty(S.ObjectId, if_missing=None)
-    allow_user_message = FieldProperty(bool, if_missing=True)
 
     def can_send_user_message(self):
         """Return true if User is permitted to send a mesage to another user.

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/55e2b11b/Allura/allura/templates/user_prefs.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/user_prefs.html b/Allura/allura/templates/user_prefs.html
index 6f9e155..185712f 100644
--- a/Allura/allura/templates/user_prefs.html
+++ b/Allura/allura/templates/user_prefs.html
@@ -162,8 +162,8 @@
     <h2>User Messages</h2>
     <form method="POST" action="user_message">
     <div class="grid-19">
-        <input type="checkbox" id="allow_user_message" name="allow_user_message" {% if c.user.allow_user_message %} checked {% endif %}>
-        <label for="allow_user_message">Allow user messages</label>
+        <input type="checkbox" id="allow_user_messages" name="allow_user_messages" {% if c.user.get_pref('allow_user_messages') %} checked {% endif %}>
+        <label for="allow_user_messages">Allow another user to send me direct email messages</label>
     </div>
     <label class="grid-4">&nbsp;</label>
     <div class="grid-19">

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/55e2b11b/Allura/allura/tests/functional/test_auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_auth.py b/Allura/allura/tests/functional/test_auth.py
index cad16dd..242d31b 100644
--- a/Allura/allura/tests/functional/test_auth.py
+++ b/Allura/allura/tests/functional/test_auth.py
@@ -714,11 +714,11 @@ class TestPreferences(TestController):
 
     @td.with_user_project('test-admin')
     def test_user_message(self):
-        assert M.User.query.get(username='test-admin').allow_user_message
+        assert M.User.query.get(username='test-admin').get_pref('allow_user_messages')
         self.app.post('/auth/preferences/user_message')
-        assert not M.User.query.get(username='test-admin').allow_user_message
-        self.app.post('/auth/preferences/user_message', params={'allow_user_message': 'on'})
-        assert M.User.query.get(username='test-admin').allow_user_message
+        assert not M.User.query.get(username='test-admin').get_pref('allow_user_messages')
+        self.app.post('/auth/preferences/user_message', params={'allow_user_messages': 'on'})
+        assert M.User.query.get(username='test-admin').get_pref('allow_user_messages')
 
 
 class TestPasswordReset(TestController):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/55e2b11b/Allura/allura/tests/functional/test_user_profile.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_user_profile.py b/Allura/allura/tests/functional/test_user_profile.py
index fae35e5..cc90e2b 100644
--- a/Allura/allura/tests/functional/test_user_profile.py
+++ b/Allura/allura/tests/functional/test_user_profile.py
@@ -134,17 +134,12 @@ class TestUserProfile(TestController):
         assert '<a href="send_message">Send me a message</a>' not in r
 
     @td.with_user_project('test-user')
-    def test_allow_user_message(self):
+    def test_allow_user_messages(self):
         User.by_username('test-admin').set_pref('email_address', 'admin@example.com')
         test_user = User.by_username('test-user')
         test_user.set_pref('email_address', 'user@example.com')
-        test_user.allow_user_message = False
+        test_user.set_pref('allow_user_messages', False)
         r = self.app.get('/u/test-user/profile')
         assert '<a href="send_message">Send me a message</a>' not in r
         r = self.app.get('/u/test-user/profile/send_message', status=302)
-        assert 'This user has disabled user message' in self.webflash(r)
-
-
-
-
-
+        assert 'This user has disabled direct email messages' in self.webflash(r)


[32/45] git commit: [#6830] New entry point handling for allura tools

Posted by tv...@apache.org.
[#6830] New entry point handling for allura tools

New logic allows multiple EPs with the same name in the [allura] (tools)
section, as long as one of the EPs is a subclass of the other(s), in
which case the subclass will be the EP that is used, and the others with
the same name ignored.

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/26209f4c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/26209f4c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/26209f4c

Branch: refs/heads/tv/6942
Commit: 26209f4ca9d992bef3ab202c95752851a8e6bc41
Parents: 3dc1bd6
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Mon Dec 9 22:03:43 2013 +0000
Committer: Cory Johns <ad...@users.sf.net>
Committed: Thu Dec 12 17:55:08 2013 +0000

----------------------------------------------------------------------
 Allura/allura/lib/helpers.py        | 44 +++++++++++++++++++++++++++-----
 Allura/allura/tests/test_helpers.py | 44 ++++++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/26209f4c/Allura/allura/lib/helpers.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/helpers.py b/Allura/allura/lib/helpers.py
index a987a3e..0b4e2dc 100644
--- a/Allura/allura/lib/helpers.py
+++ b/Allura/allura/lib/helpers.py
@@ -1000,13 +1000,43 @@ def plain2markdown(text, preserve_multiple_spaces=False, has_html_entities=False
 
 
 def iter_entry_points(group, *a, **kw):
-    '''
-    yield entry points that have not been disabled in the config
-    '''
-    disabled = aslist(tg.config.get('disable_entry_points.' + group), sep=',')
-    for ep in pkg_resources.iter_entry_points(group, *a, **kw):
-        if ep.name not in disabled:
-            yield ep
+    """Yields entry points that have not been disabled in the config.
+
+    If ``group`` is "allura" (Allura tool entry points), this function also
+    checks for multiple entry points with the same name. If there are
+    multiple entry points with the same name, and one of them is a subclass
+    of the other(s), it will be yielded, and the other entry points with that
+    name will be ignored. If a subclass is not found, an ImportError will be
+    raised.
+
+    This treatment of "allura" entry points allows tool authors to subclass
+    another tool while reusing the original entry point name.
+
+    """
+    def active_eps():
+        disabled = aslist(tg.config.get('disable_entry_points.' + group), sep=',')
+        return [ep for ep in pkg_resources.iter_entry_points(group, *a, **kw)
+                if ep.name not in disabled]
+    def unique_eps(entry_points):
+        by_name = defaultdict(list)
+        for ep in entry_points:
+            by_name[ep.name].append(ep)
+        for name, eps in by_name.iteritems():
+            ep_count = len(eps)
+            if ep_count == 1:
+                yield eps[0]
+            else:
+                yield subclass(eps)
+    def subclass(entry_points):
+        loaded = dict((ep, ep.load()) for ep in entry_points)
+        for ep, cls in loaded.iteritems():
+            others = loaded.values()[:]
+            others.remove(cls)
+            if all([issubclass(cls, other) for other in others]):
+                return ep
+        raise ImportError('Ambiguous [allura] entry points detected. ' +
+                'Multiple entry points with name "%s".' % entry_points[0].name)
+    return iter(unique_eps(active_eps()) if group == 'allura' else active_eps())
 
 
 # http://stackoverflow.com/a/1060330/79697

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/26209f4c/Allura/allura/tests/test_helpers.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_helpers.py b/Allura/allura/tests/test_helpers.py
index bdd3cea..e00231f 100644
--- a/Allura/allura/tests/test_helpers.py
+++ b/Allura/allura/tests/test_helpers.py
@@ -22,6 +22,7 @@ from os import path
 from datetime import datetime
 
 from mock import Mock, patch
+import tg
 from pylons import tmpl_context as c
 from nose.tools import eq_, assert_equals
 from IPython.testing.decorators import skipif, module_not_available
@@ -444,3 +445,46 @@ def test_login_overlay():
     with td.raises(HTTPUnauthorized):
         with h.login_overlay(exceptions=['foobar']):
             raise HTTPUnauthorized()
+
+class TestIterEntryPoints(TestCase):
+    def _make_ep(self, name, cls):
+        m = Mock()
+        m.name = name
+        m.load.return_value = cls
+        return m
+
+    @patch('allura.lib.helpers.pkg_resources')
+    @patch.dict(h.tg.config, {'disable_entry_points.allura': 'myapp'})
+    def test_disabled(self, pkg_resources):
+        pkg_resources.iter_entry_points.return_value = [
+                self._make_ep('myapp', object)]
+        self.assertEqual([], list(h.iter_entry_points('allura')))
+
+    @patch('allura.lib.helpers.pkg_resources')
+    def test_subclassed_ep(self, pkg_resources):
+        class App(object): pass
+        class BetterApp(App): pass
+
+        pkg_resources.iter_entry_points.return_value = [
+                self._make_ep('myapp', App),
+                self._make_ep('myapp', BetterApp)]
+
+        eps = list(h.iter_entry_points('allura'))
+        self.assertEqual(len(eps), 1)
+        self.assertEqual(BetterApp, eps[0].load())
+
+    @patch('allura.lib.helpers.pkg_resources')
+    def test_ambiguous_eps(self, pkg_resources):
+        class App(object): pass
+        class BetterApp(App): pass
+        class BestApp(object): pass
+
+        pkg_resources.iter_entry_points.return_value = [
+                self._make_ep('myapp', App),
+                self._make_ep('myapp', BetterApp),
+                self._make_ep('myapp', BestApp)]
+
+        self.assertRaisesRegexp(ImportError,
+                'Ambiguous \[allura\] entry points detected. '
+                'Multiple entry points with name "myapp".',
+                list, h.iter_entry_points('allura'))


[39/45] git commit: [#6942] Allow tools to supply their own icons for nav

Posted by tv...@apache.org.
[#6942] Allow tools to supply their own icons for nav

This change causes the icons to be fetched via the tool's icon_url()
rather than via the theme css

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/1082505c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/1082505c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/1082505c

Branch: refs/heads/tv/6942
Commit: 1082505ce938623e4fb1cf219a2e53080a6a68f6
Parents: b988a93
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Tue Dec 3 21:21:10 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 21:57:59 2013 +0000

----------------------------------------------------------------------
 Allura/allura/templates/jinja_master/top_nav.html   | 3 ++-
 Allura/allura/tests/functional/test_neighborhood.py | 6 +++---
 2 files changed, 5 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1082505c/Allura/allura/templates/jinja_master/top_nav.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/top_nav.html b/Allura/allura/templates/jinja_master/top_nav.html
index 8ef4621..90e1d9e 100644
--- a/Allura/allura/templates/jinja_master/top_nav.html
+++ b/Allura/allura/templates/jinja_master/top_nav.html
@@ -20,7 +20,8 @@
 <ul class="dropdown">
   {% for s in c.project.grouped_navbar_entries() %}
     <li class="{% if s.matches_url(request) %}selected{% endif %}">
-        <a href="{{s.url}}" class="ui-icon-{{s.ui_icon or 'admin'}}">
+        <a href="{{s.url}}"
+          style="background-repeat: no-repeat; background-image: url({{ g.theme.app_icon_url((s.tool_name or 'admin').lower(), 32) }});">
             {{s.label}}
         </a>
         {% set grouped_tool_count = s.matching_urls|length %}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1082505c/Allura/allura/tests/functional/test_neighborhood.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_neighborhood.py b/Allura/allura/tests/functional/test_neighborhood.py
index c9dc1fe..2b165a3 100644
--- a/Allura/allura/tests/functional/test_neighborhood.py
+++ b/Allura/allura/tests/functional/test_neighborhood.py
@@ -731,8 +731,8 @@ class TestNeighborhood(TestController):
             antispam=True,
             extra_environ=dict(username='root'))
         r = self.app.get('/adobe/testtemp/admin/tools')
-        assert '<a href="/adobe/testtemp/wiki/" class="ui-icon-tool-wiki">' in r
-        assert '<a href="/adobe/testtemp/admin/" class="ui-icon-tool-admin">' in r
+        assert r.html.find('div', id='top_nav').find('a', href='/adobe/testtemp/wiki/'), r.html
+        assert r.html.find('div', id='top_nav').find('a', href='/adobe/testtemp/admin/'), r.html
 
     def test_name_suggest(self):
         r = self.app.get('/p/suggest_name?project_name=My+Moz')
@@ -824,7 +824,7 @@ class TestNeighborhood(TestController):
     @td.with_user_project('test-user')
     def test_profile_topnav_menu(self):
         r = self.app.get('/u/test-user/', extra_environ=dict(username='test-user')).follow()
-        assert '<a href="/u/test-user/profile/" class="ui-icon-tool-profile">' in r, r
+        assert r.html.find('div', id='top_nav').find('a', href='/u/test-user/profile/'), r.html
 
     def test_user_project_creates_on_demand(self):
         M.User.register(dict(username='donald-duck'), make_project=False)


[35/45] git commit: [#6970] Make user icons on activity page larger and fix alignment in Firefox

Posted by tv...@apache.org.
[#6970] Make user icons on activity page larger and fix alignment in Firefox

Signed-off-by: Cory Johns <ad...@users.sf.net>


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

Branch: refs/heads/tv/6942
Commit: e569faa6955710d34caf5e0693b195ffb55286ae
Parents: 4aeceac
Author: Cory Johns <ad...@users.sf.net>
Authored: Thu Dec 12 19:01:41 2013 +0000
Committer: Cory Johns <ad...@users.sf.net>
Committed: Thu Dec 12 19:02:00 2013 +0000

----------------------------------------------------------------------
 ForgeActivity/forgeactivity/nf/activity/css/activity.css | 6 +++---
 ForgeActivity/forgeactivity/templates/index.html         | 6 ++++--
 2 files changed, 7 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/e569faa6/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 ca6ea59..dc71608 100644
--- a/ForgeActivity/forgeactivity/nf/activity/css/activity.css
+++ b/ForgeActivity/forgeactivity/nf/activity/css/activity.css
@@ -42,7 +42,7 @@
   vertical-align: top;
   font-size: 14px;
 }
-.activity ul.timeline li p .avatar {
-  display: inline-block;
-  margin: 0 8px 8px 0;
+.activity ul.timeline li .avatar {
+  float: left;
+  margin: 10px 10px 0 0;
 }

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/e569faa6/ForgeActivity/forgeactivity/templates/index.html
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/templates/index.html b/ForgeActivity/forgeactivity/templates/index.html
index f430c64..8293763 100644
--- a/ForgeActivity/forgeactivity/templates/index.html
+++ b/ForgeActivity/forgeactivity/templates/index.html
@@ -60,10 +60,12 @@
         {% for a in timeline %}
         <li>
           <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>
+          <h1>
+              {{ icon(a.actor, 32, 'avatar') }}
+              {{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 %}


[41/45] git commit: [#6942] Remove icon images from css

Posted by tv...@apache.org.
[#6942] Remove icon images from css

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/571b2377
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/571b2377
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/571b2377

Branch: refs/heads/tv/6942
Commit: 571b2377ea7f6f2f1ec6f7ccb876ab723436955e
Parents: b2c2be9
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Thu Dec 12 14:24:19 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Thu Dec 12 21:57:59 2013 +0000

----------------------------------------------------------------------
 Allura/allura/nf/allura/css/allura.css     | 150 ------------------------
 Allura/allura/nf/allura/css/site_style.css |  57 +--------
 2 files changed, 4 insertions(+), 203 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/571b2377/Allura/allura/nf/allura/css/allura.css
----------------------------------------------------------------------
diff --git a/Allura/allura/nf/allura/css/allura.css b/Allura/allura/nf/allura/css/allura.css
index 38404f7..628fe61 100644
--- a/Allura/allura/nf/allura/css/allura.css
+++ b/Allura/allura/nf/allura/css/allura.css
@@ -55,156 +55,6 @@ b.ico.ico-vote-up { background-image: url('../images/vote_up.png'); }
 b.ico.ico-vote-down { background-image: url('../images/vote_down.png'); }
 
 
-.ui-icon-tool-home, .ui-icon-tool-profile {
-  background-image: url("../images/home_24.png");
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-wiki {
-  background-image: url("../images/wiki_24.png");
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-git,
-.ui-icon-tool-svn,
-.ui-icon-tool-hg,
-.ui-icon-tool-cvs,
-.ui-icon-tool-bzr {
-  background-image: url("../images/code_24.png");
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-stats {
-  background-image: url("../images/stats_24.png");
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-userstats {
-  background-image: url("../images/stats_24.png");
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-admin, .ui-icon-admin {
-  background-image: url("../images/admin_24.png");
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-discussion {
-  background-image: url("../images/forums_24.png");
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-tickets {
-  background-image: url("../images/tickets_24.png");
-  background-repeat: no-repeat;
-}
-
-/* TODO: Move to forge-classic per PT#53 */
-.ui-icon-tool-summary {
-  background-image: url("../images/blog_24.png");
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-link {
-  background-image: url("../images/ext_24.png");
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-blog {
-  background-image: url("../images/blog_24.png");
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-chat {
-  background-image: url("../images/chat_24.png");
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-hosted_apps {
-  background-image: url("../images/admin_24.png");
-  background-repeat: no-repeat;
-}
-
-#top_nav .ui-icon-tool-home, #top_nav .ui-icon-tool-profile {
-  background-image: url("../images/home_32.png");
-}
-#top_nav .ui-icon-tool-wiki {
-  background-image: url("../images/wiki_32.png");
-}
-#top_nav .ui-icon-tool-git,
-#top_nav .ui-icon-tool-svn,
-#top_nav .ui-icon-tool-hg,
-#top_nav .ui-icon-tool-cvs,
-#top_nav .ui-icon-tool-bzr
-{
-  background-image: url("../images/code_32.png");
-}
-#top_nav .ui-icon-tool-stats {
-  background-image: url("../images/stats_32.png");
-}
-#top_nav .ui-icon-tool-userstats {
-  background-image: url("../images/stats_32.png");
-}
-
-#top_nav .ui-icon-tool-admin, #top_nav .ui-icon-admin {
-  background-image: url("../images/admin_32.png");
-}
-#top_nav .ui-icon-tool-discussion {
-  background-image: url("../images/forums_32.png");
-}
-#top_nav .ui-icon-tool-tickets {
-  background-image: url("../images/tickets_32.png");
-}
-#top_nav .ui-icon-tool-link {
-  background-image: url("../images/ext_32.png");
-}
-#top_nav .ui-icon-tool-shorturl {
-  background-image: url("../images/ext_32.png");
-}
-#top_nav .ui-icon-tool-blog {
-  background-image: url("../images/blog_32.png");
-}
-#top_nav .ui-icon-tool-chat {
-  background-image: url("../images/chat_32.png");
-}
-
-.big_icon.ui-icon-tool-home, .big_icon.ui-icon-tool-profile {
-  background-image: url("../images/home_48.png");
-}
-.big_icon.ui-icon-tool-wiki {
-  background-image: url("../images/wiki_48.png");
-}
-.big_icon.ui-icon-tool-git, .big_icon.ui-icon-tool-svn, .big_icon.ui-icon-tool-hg {
-  background-image: url("../images/code_48.png");
-}
-.big_icon.ui-icon-tool-stats {
-  background-image: url("../images/stats_48.png");
-}
-.big_icon.ui-icon-tool-userstats {
-  background-image: url("../images/stats_48.png");
-}
-
-.big_icon.ui-icon-tool-admin, .big_icon.ui-icon-admin {
-  background-image: url("../images/admin_48.png");
-}
-.big_icon.ui-icon-tool-discussion {
-  background-image: url("../images/forums_48.png");
-}
-.big_icon.ui-icon-tool-tickets {
-  background-image: url("../images/tickets_48.png");
-}
-.big_icon.ui-icon-tool-link {
-  background-image: url("../images/ext_48.png");
-}
-.big_icon.ui-icon-tool-shorturl {
-  background-image: url("../images/ext_48.png");
-}
-.big_icon.ui-icon-tool-blog {
-  background-image: url("../images/blog_48.png");
-}
-.big_icon.ui-icon-tool-chat {
-  background-image: url("../images/chat_48.png");
-}
 #ticket_search_results_holder{
     overflow: auto;
 }

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/571b2377/Allura/allura/nf/allura/css/site_style.css
----------------------------------------------------------------------
diff --git a/Allura/allura/nf/allura/css/site_style.css b/Allura/allura/nf/allura/css/site_style.css
index 4cee523..ebb0b92 100644
--- a/Allura/allura/nf/allura/css/site_style.css
+++ b/Allura/allura/nf/allura/css/site_style.css
@@ -2345,55 +2345,6 @@ div.attachment_thumb .file_type span {
   color: #666;
 }
 
-/* forge tool icons */
-.ui-icon-tool-home, .ui-icon-tool-profile {
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-wiki {
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-git, .ui-icon-tool-svn, .ui-icon-tool-hg {
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-stats {
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-admin, .ui-icon-admin {
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-discussion {
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-tickets {
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-link {
-  background-repeat: no-repeat;
-}
-.ui-icon-tool-shorturl {
-  background-repeat: no-repeat;
-}
-
-
-.ui-icon-tool-blog {
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-chat {
-  background-repeat: no-repeat;
-}
-
-.ui-icon-tool-hosted_apps {
-  background-repeat: no-repeat;
-}
-
 /* Cards */
 .installable_tool {
   margin-top: 10px;
@@ -2665,7 +2616,7 @@ div.attachment_thumb .file_type span {
 #ticket_search_results_holder {
   overflow: auto;
 }
-/* headers should never force a column to be too wide */ 
+/* headers should never force a column to be too wide */
 #ticket_search_results_holder th {
     overflow: hidden;
     max-width: 1em;
@@ -2709,7 +2660,7 @@ div.attachment_thumb .file_type span {
 
 #stats-viz .xaxis {
   text-align: center;
-} 
+}
 #stats-viz .yaxis {
   -webkit-transform: rotate(270deg);  -moz-transform: rotate(270deg);
   -ms-transform: rotate(270deg);
@@ -2717,11 +2668,11 @@ div.attachment_thumb .file_type span {
   transform: rotate(270deg);
   max-width: 1em;
 }
-  
+
 #project_stats_holder {
   width: 600px;
   height: 350px;
-} 
+}
 #project_stats_holder div.legend table {
   width: auto;
 }