You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2013/04/11 00:27:30 UTC

[1/3] git commit: [#5465] ticket:310 Ticket's labels autocompletion

Updated Branches:
  refs/heads/master 06a70ab32 -> e62d190be


[#5465] ticket:310 Ticket's labels autocompletion

Added query to retrieve labels for tracker sorted by usage frequency
and filtered by user input using mongo aggregation framework.

Needs further performance testing, second '$match' clause won't touch the index
(because it uses case insensitive regex match and takes place after '$unwind'),
but it's best I can do with such data layout.

Also simplified the test, because mim doesn't support aggregation queries.


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

Branch: refs/heads/master
Commit: e62d190beca2cdfa213a4edd283fcbf016953b34
Parents: 828b29f
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed Apr 10 16:06:19 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Apr 10 22:00:17 2013 +0000

----------------------------------------------------------------------
 .../forgetracker/tests/functional/test_root.py     |    9 +----
 ForgeTracker/forgetracker/tracker_main.py          |   28 ++++++++++++--
 2 files changed, 26 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/e62d190b/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 917b064..ed03410 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1441,13 +1441,8 @@ class TestFunctionalController(TrackerTestController):
         self.new_ticket(summary='a', labels='tag1,tag2')
         self.new_ticket(summary='b', labels='tag2')
         self.new_ticket(summary='c', labels='42cc,test')
-        r = self.app.get('/p/test/bugs/tags?term=t')
-        assert_equal(json.loads(r.body), ['tag2', 'tag1', 'test'])
-        r = self.app.get('/p/test/bugs/tags?term=ta')
-        assert_equal(json.loads(r.body), ['tag2', 'tag1'])
-        r = self.app.get('/p/test/bugs/tags?term=te')
-        assert_equal(json.loads(r.body), ['test'])
-        r = self.app.get('/p/test/bugs/tags?term=nope')
+        # Testing only empty 'term', because mim doesn't support aggregation calls
+        r = self.app.get('/p/test/bugs/tags')
         assert_equal(json.loads(r.body), [])
         r = self.app.get('/p/test/bugs/tags?term=')
         assert_equal(json.loads(r.body), [])

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/e62d190b/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index e615b17..f62ae03 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -6,7 +6,7 @@ from urllib import urlencode, unquote
 from urllib2 import urlopen
 from webob import exc
 import json
-from itertools import ifilter
+from itertools import ifilter, imap
 
 # Non-stdlib imports
 import pkg_resources
@@ -17,6 +17,7 @@ from pylons import tmpl_context as c, app_globals as g
 from pylons import request, response
 from formencode import validators
 from bson import ObjectId
+from bson.son import SON
 from bson.errors import InvalidId
 from webhelpers import feedgenerator as FG
 
@@ -482,9 +483,28 @@ class RootController(BaseController):
         return {'milestone_counts': milestone_counts}
 
     @expose('json:')
-    def tags(self, term, **kw):
-        tags = ['sad', 'happy']
-        return json.dumps(tags)
+    def tags(self, term=None, **kw):
+        if not term:
+            return json.dumps([])
+        db = M.session.project_doc_session.db
+        tickets = db[TM.Ticket.__mongometa__.name]
+        tags = tickets.aggregate([
+            {
+                '$match': {
+                    'app_config_id': c.app.config._id,
+                    'labels': {
+                        '$exists': True,
+                        '$ne': [],
+                    }
+                }
+            },
+            {'$project': {'labels': 1}},
+            {'$unwind': '$labels'},
+            {'$match': {'labels': {'$regex': '^%s' % term, '$options': 'i'}}},
+            {'$group': { '_id': '$labels', 'count': {'$sum': 1}}},
+            {'$sort': SON([('count', -1), ('_id', 1)])}
+        ])
+        return json.dumps([tag['_id'] for tag in tags.get('result', [])])
 
     @with_trailing_slash
     @h.vardec


[2/3] git commit: [#5465] ticket:310 Test for label autocompletion data provider

Posted by jo...@apache.org.
[#5465] ticket:310 Test for label autocompletion data provider


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

Branch: refs/heads/master
Commit: 828b29fc85aff2757cd088c333bcbfff24950603
Parents: b970ea6
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed Apr 10 14:24:25 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Apr 10 22:00:17 2013 +0000

----------------------------------------------------------------------
 .../forgetracker/tests/functional/test_root.py     |   17 +++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/828b29fc/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 b2fd554..917b064 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1435,6 +1435,23 @@ class TestFunctionalController(TrackerTestController):
         assert_equal(r.request.path, '/p/test/dummy/1/')
         assert_in('I am comment', r)
 
+    def test_tags(self):
+        p = M.Project.query.get(shortname='test')
+        tracker = p.app_instance('bugs')
+        self.new_ticket(summary='a', labels='tag1,tag2')
+        self.new_ticket(summary='b', labels='tag2')
+        self.new_ticket(summary='c', labels='42cc,test')
+        r = self.app.get('/p/test/bugs/tags?term=t')
+        assert_equal(json.loads(r.body), ['tag2', 'tag1', 'test'])
+        r = self.app.get('/p/test/bugs/tags?term=ta')
+        assert_equal(json.loads(r.body), ['tag2', 'tag1'])
+        r = self.app.get('/p/test/bugs/tags?term=te')
+        assert_equal(json.loads(r.body), ['test'])
+        r = self.app.get('/p/test/bugs/tags?term=nope')
+        assert_equal(json.loads(r.body), [])
+        r = self.app.get('/p/test/bugs/tags?term=')
+        assert_equal(json.loads(r.body), [])
+
 
 class TestMilestoneAdmin(TrackerTestController):
     def _post(self, params, **kw):


[3/3] git commit: [#5465] ticket:310 Add autocompletion for labels (placeholder data)

Posted by jo...@apache.org.
[#5465] ticket:310 Add autocompletion for labels (placeholder data)


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

Branch: refs/heads/master
Commit: b970ea62edb287531b53b57f4fc126248d693f81
Parents: 06a70ab
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed Apr 10 12:49:13 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Apr 10 22:00:17 2013 +0000

----------------------------------------------------------------------
 Allura/allura/lib/widgets/form_fields.py  |    7 ++++---
 ForgeTracker/forgetracker/tracker_main.py |    5 +++++
 2 files changed, 9 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b970ea62/Allura/allura/lib/widgets/form_fields.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/form_fields.py b/Allura/allura/lib/widgets/form_fields.py
index 67ea947..f8a4b06 100644
--- a/Allura/allura/lib/widgets/form_fields.py
+++ b/Allura/allura/lib/widgets/form_fields.py
@@ -51,10 +51,11 @@ class LabelEdit(ew.InputField):
         yield ew.CSSLink('css/jquery.tagsinput.css')
         yield onready('''
           $('input.label_edit').tagsInput({
-              'height':'100%',
-              'width':'100%'
+              'height':'100%%',
+              'width':'100%%',
+              'autocomplete_url':'%(url)stags'
           });
-        ''')
+        ''' % dict(url=c.app.url))
 
 class ProjectUserSelect(ew.InputField):
     template='jinja:allura:templates/widgets/project_user_select.html'

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/b970ea62/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index dc14459..e615b17 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -481,6 +481,11 @@ class RootController(BaseController):
                 milestone_counts.append({'name': name, 'count': count})
         return {'milestone_counts': milestone_counts}
 
+    @expose('json:')
+    def tags(self, term, **kw):
+        tags = ['sad', 'happy']
+        return json.dumps(tags)
+
     @with_trailing_slash
     @h.vardec
     @expose('jinja:forgetracker:templates/tracker/index.html')