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/05/22 15:36:30 UTC

[04/14] git commit: [#5652] ticket:325 added attachments info for Allura REST API

[#5652]  ticket:325 added attachments info for Allura REST API


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

Branch: refs/heads/cj/5913
Commit: 79e39b3cac09fdeca9af2a456330f367ede7930a
Parents: a211a0d
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Tue May 7 01:44:48 2013 +0400
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Mon May 20 17:22:09 2013 +0000

----------------------------------------------------------------------
 Allura/allura/model/artifact.py                    |    5 ++-
 Allura/allura/model/discuss.py                     |    8 +++-
 ForgeTracker/forgetracker/model/ticket.py          |    5 ++
 .../forgetracker/tests/functional/test_root.py     |   38 +++++++++++++++
 ForgeWiki/forgewiki/tests/functional/test_root.py  |   20 ++++++--
 ForgeWiki/forgewiki/wiki_main.py                   |   13 ++++-
 6 files changed, 81 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/79e39b3c/Allura/allura/model/artifact.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/artifact.py b/Allura/allura/model/artifact.py
index 4a7f2c1..a8f573c 100644
--- a/Allura/allura/model/artifact.py
+++ b/Allura/allura/model/artifact.py
@@ -19,6 +19,8 @@ import logging
 import cPickle as pickle
 from collections import defaultdict
 from datetime import datetime
+from urlparse import urljoin
+from tg import config
 
 import bson
 import pymongo
@@ -96,7 +98,8 @@ class Artifact(MappedClass):
             labels=self.labels,
             related_artifacts=[a.url() for a in self.related_artifacts()],
             discussion_thread=self.discussion_thread,
-            discussion_thread_url=self.discussion_thread.url(),
+            discussion_thread_url=urljoin(config.get('base_url', 'http://sourceforge.net/'),
+                                          '/rest%s' % self.discussion_thread.url()),
         )
 
     def parent_security_context(self):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/79e39b3c/Allura/allura/model/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index 4375077..e1da83c 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -21,6 +21,8 @@ from datetime import datetime
 import pymongo
 from pymongo.errors import DuplicateKeyError
 from pylons import tmpl_context as c, app_globals as g
+from urlparse import urljoin
+from tg import config
 
 from ming import schema
 from ming.orm.base import session
@@ -163,7 +165,11 @@ class Thread(Artifact, ActivityObject):
             _id=self._id,
             discussion_id=str(self.discussion_id),
             subject=self.subject,
-            posts=[dict(slug=p.slug, subject=p.subject)
+            posts=[dict(slug=p.slug,
+                        subject=p.subject,
+                        attachments=[dict(bytes=attach.length,
+                                          url=urljoin(config.get('base_url', 'http://sourceforge.net/'),
+                                                      attach.url())) for attach in p.attachments])
                    for p in self.posts])
 
     @property

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/79e39b3c/ForgeTracker/forgetracker/model/ticket.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/model/ticket.py b/ForgeTracker/forgetracker/model/ticket.py
index 45bef8b..00851bc 100644
--- a/ForgeTracker/forgetracker/model/ticket.py
+++ b/ForgeTracker/forgetracker/model/ticket.py
@@ -25,6 +25,8 @@ import pymongo
 from pymongo.errors import OperationFailure
 from pylons import tmpl_context as c, app_globals as g
 from pprint import pformat
+from urlparse import urljoin
+from tg import config as tg_config
 
 from ming import schema
 from ming.utils import LazyProperty
@@ -734,6 +736,9 @@ class Ticket(VersionedArtifact, ActivityObject, VotableArtifact):
             assigned_to_id=self.assigned_to_id and str(self.assigned_to_id) or None,
             status=self.status,
             private=self.private,
+            attachments=[dict(bytes=attach.length,
+                              url=urljoin(tg_config.get('base_url', 'http://sourceforge.net/'),
+                                          attach.url())) for attach in self.attachments],
             custom_fields=self.custom_fields)
 
     @classmethod

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/79e39b3c/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 6723778..bf498be 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -1694,6 +1694,44 @@ class TestFunctionalController(TrackerTestController):
         r = self.app.get('/p/test/bugs/tags?term=')
         assert_equal(json.loads(r.body), [])
 
+    def test_rest_tickets(self):
+        ticket_view = self.new_ticket(summary='test').follow()
+        for f in ticket_view.html.findAll('form'):
+            if f.get('action', '').endswith('/post'):
+                break
+        params = dict()
+        inputs = f.findAll('input')
+        for field in inputs:
+            if field.has_key('name'):
+                params[field['name']] = field.has_key('value') and field['value'] or ''
+        params[f.find('textarea')['name']] = 'test comment'
+        self.app.post(f['action'].encode('utf-8'), params=params,
+                          headers={'Referer': '/bugs/1/'.encode("utf-8")})
+        r = self.app.get('/bugs/1/', dict(page=1))
+        post_link = str(r.html.find('div', {'class':'edit_post_form reply'}).find('form')['action'])
+        self.app.post(post_link + 'attach',
+                          upload_files=[('file_info', 'test.txt', 'test attach')])
+        r = self.app.get('/p/test/bugs/1/')
+        discussion_url = r.html.findAll('form')[-1]['action'][:-4]
+        r = self.app.get('/rest/p/test/bugs/1/')
+        r = json.loads(r.body)
+        assert_equal(r['ticket']['discussion_thread_url'],'http://localhost/rest%s' % discussion_url)
+        slug = r['ticket']['discussion_thread']['posts'][0]['slug']
+        assert_equal(r['ticket']['discussion_thread']['posts'][0]['attachments'][0]['url'],
+                     'http://localhost%s%s/attachment/test.txt' % (discussion_url, slug))
+        assert_equal(r['ticket']['discussion_thread']['posts'][0]['attachments'][0]['bytes'], 11)
+
+        file_name = 'test_root.py'
+        file_data = file(__file__).read()
+        upload = ('attachment', file_name, file_data)
+        r = self.app.post('/bugs/1/update_ticket',{
+            'summary':'test rest attach'
+        }, upload_files=[upload]).follow()
+        r = self.app.get('/rest/p/test/bugs/1/')
+        r = json.loads(r.body)
+        assert_equal(r['ticket']['attachments'][0]['url'], 'http://localhost/p/test/bugs/1/attachment/test_root.py')
+
+
 
 class TestMilestoneAdmin(TrackerTestController):
     def _post(self, params, **kw):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/79e39b3c/ForgeWiki/forgewiki/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/tests/functional/test_root.py b/ForgeWiki/forgewiki/tests/functional/test_root.py
index 49a39e8..d943530 100644
--- a/ForgeWiki/forgewiki/tests/functional/test_root.py
+++ b/ForgeWiki/forgewiki/tests/functional/test_root.py
@@ -20,6 +20,7 @@
 import os
 import Image, StringIO
 import allura
+import json
 
 from nose.tools import assert_true, assert_equal, assert_in
 
@@ -216,15 +217,15 @@ class TestRootController(TestController):
         response = self.app.get('/wiki/tést/history')
         assert 'tést' in response
         # two revisions are shown
-        assert '2 by Test Admin (test-admin)' in response
-        assert '1 by Test Admin (test-admin)' in response
+        assert '2 by Test Admin' in response
+        assert '1 by Test Admin' in response
         # you can revert to an old revison, but not the current one
         assert response.html.find('a',{'href':'./revert?version=1'})
         assert not response.html.find('a',{'href':'./revert?version=2'})
         response = self.app.get('/wiki/tést/history', extra_environ=dict(username='*anonymous'))
         # two revisions are shown
-        assert '2 by Test Admin (test-admin)' in response
-        assert '1 by Test Admin (test-admin)' in response
+        assert '2 by Test Admin' in response
+        assert '1 by Test Admin' in response
         # you cannot revert to any revision
         assert not response.html.find('a',{'href':'./revert?version=1'})
         assert not response.html.find('a',{'href':'./revert?version=2'})
@@ -620,3 +621,14 @@ class TestRootController(TestController):
     def test_user_browse_page(self):
         r = self.app.get('/wiki/browse_pages/')
         assert '<td>Test Admin (test-admin)</td>' in r
+
+    def test_rest_wiki(self):
+        r = self.app.get('/p/test/wiki/Home/')
+        discussion_url = r.html.findAll('form')[2]['action'][:-4]
+        content = file(__file__).read()
+        self.app.post('/wiki/Home/attach', upload_files=[('file_info', 'test_root.py', content)])
+        r = self.app.get('/rest/p/test/wiki/Home/')
+        r = json.loads(r.body)
+        assert_equal(r['attachments'][0]['url'], 'http://localhost/p/test/wiki/Home/attachment/test_root.py')
+        assert_equal(r['discussion_thread_url'], 'http://localhost/rest%s' % discussion_url)
+        assert_equal(r['discussion_thread']['_id'], discussion_url.split('/')[-2])

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/79e39b3c/ForgeWiki/forgewiki/wiki_main.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/wiki_main.py b/ForgeWiki/forgewiki/wiki_main.py
index 0f5151e..1dc9e06 100644
--- a/ForgeWiki/forgewiki/wiki_main.py
+++ b/ForgeWiki/forgewiki/wiki_main.py
@@ -22,7 +22,7 @@ from urllib import unquote
 from datetime import datetime
 
 # Non-stdlib imports
-from tg import expose, validate, redirect, response, flash
+from tg import expose, validate, redirect, response, flash, config
 from tg.decorators import with_trailing_slash, without_trailing_slash
 from tg.controllers import RestController
 from pylons import tmpl_context as c, app_globals as g
@@ -30,6 +30,7 @@ from pylons import request
 from formencode import validators
 from webob import exc
 from ming.orm import session
+from urlparse import urljoin
 
 # Pyforge-specific imports
 from allura import model as M
@@ -697,7 +698,15 @@ class RootRestController(RestController):
         if page is None:
             raise exc.HTTPNotFound, title
         require_access(page, 'read')
-        return dict(title=page.title, text=page.text, labels=page.labels)
+        return dict(title=page.title,
+                    text=page.text,
+                    labels=page.labels,
+                    discussion_thread=page.discussion_thread,
+                    discussion_thread_url=urljoin(config.get('base_url', 'http://sourceforge.net/'),
+                                                  '/rest%s' % page.discussion_thread.url()),
+                    attachments=[dict(bytes=attach.length,
+                                      url=urljoin(config.get('base_url', 'http://sourceforge.net/'),
+                                                  attach.url())) for attach in page.attachments])
 
     @h.vardec
     @expose()