You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2016/01/27 18:42:49 UTC
[2/8] allura git commit: [#8044] ticket:889 Added rest api for
get_site_notification
[#8044] ticket:889 Added rest api for get_site_notification
* Added RestController.notification, SiteNotification.__json__
* Changed ThemeProvider.get_site_notification
* Added new tests
Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/e8e7b93a
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/e8e7b93a
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/e8e7b93a
Branch: refs/heads/master
Commit: e8e7b93ae4d9a11f4cfc652c9532a6609bf25019
Parents: 3ccbb5d
Author: Denis Kotov <de...@gmail.com>
Authored: Tue Jan 19 23:11:25 2016 +0200
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Wed Jan 27 12:37:37 2016 -0500
----------------------------------------------------------------------
Allura/allura/controllers/rest.py | 10 +++++++
Allura/allura/lib/plugin.py | 14 ++++++++--
Allura/allura/model/__init__.py | 4 +--
Allura/allura/model/notification.py | 11 ++++++++
Allura/allura/tests/functional/test_rest.py | 13 +++++++++
Allura/allura/tests/model/test_notification.py | 31 +++++++++++++++++++++
Allura/allura/tests/test_plugin.py | 31 +++++++++++++++++++++
7 files changed, 109 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/allura/blob/e8e7b93a/Allura/allura/controllers/rest.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/rest.py b/Allura/allura/controllers/rest.py
index a8a98fd..c091874 100644
--- a/Allura/allura/controllers/rest.py
+++ b/Allura/allura/controllers/rest.py
@@ -89,6 +89,16 @@ class RestController(object):
summary['site_stats'] = stats
return summary
+ @expose('json:')
+ def notification(self, cookie=None):
+ c.api_token = self._authenticate_request()
+ if c.api_token:
+ c.user = c.api_token.user
+ r = g.theme.get_site_notification(is_api=True, api_cookie=cookie)
+ if r:
+ return dict(notification=r[0], cookie=r[1])
+ return {}
+
@expose()
def _lookup(self, name, *remainder):
c.api_token = self._authenticate_request()
http://git-wip-us.apache.org/repos/asf/allura/blob/e8e7b93a/Allura/allura/lib/plugin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index cf833c1..e1653d9 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -1310,7 +1310,7 @@ class ThemeProvider(object):
else:
return app.icon_url(size)
- def get_site_notification(self):
+ def get_site_notification(self, is_api=None, api_cookie=None):
from pylons import request, response
from allura.model.notification import SiteNotification
note = SiteNotification.current()
@@ -1328,7 +1328,11 @@ class ThemeProvider(object):
if note.page_tool_type and (c.app is None or c.app.config.tool_name.lower() != note.page_tool_type.lower()):
return None
- cookie = request.cookies.get('site-notification', '').split('-')
+ cookie = api_cookie
+ if not cookie:
+ cookie = request.cookies.get('site-notification', '')
+ cookie = cookie.split('-')
+
if len(cookie) == 3 and cookie[0] == str(note._id):
views = asint(cookie[1]) + 1
closed = asbool(cookie[2])
@@ -1337,9 +1341,13 @@ class ThemeProvider(object):
closed = False
if closed or note.impressions > 0 and views > note.impressions:
return None
+
+ set_cookie = '-'.join(map(str, [note._id, views, closed]))
+ if is_api:
+ return note, set_cookie
response.set_cookie(
'site-notification',
- '-'.join(map(str, [note._id, views, closed])),
+ set_cookie,
max_age=timedelta(days=365))
return note
http://git-wip-us.apache.org/repos/asf/allura/blob/e8e7b93a/Allura/allura/model/__init__.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/__init__.py b/Allura/allura/model/__init__.py
index cb817b4..a69e7c9 100644
--- a/Allura/allura/model/__init__.py
+++ b/Allura/allura/model/__init__.py
@@ -29,7 +29,7 @@ from .attachments import BaseAttachment
from .auth import AuthGlobals, User, ProjectRole, EmailAddress, OldProjectRole
from .auth import AuditLog, audit_log, AlluraUserProperty
from .filesystem import File
-from .notification import Notification, Mailbox
+from .notification import Notification, Mailbox, SiteNotification
from .repository import Repository, RepositoryImplementation
from .repository import MergeRequest, GitLikeTree
from .stats import Stats
@@ -60,4 +60,4 @@ __all__ = [
'OAuthRequestToken', 'OAuthAccessToken', 'MonQTask', 'Webhook', 'ACE', 'ACL', 'EVERYONE', 'ALL_PERMISSIONS',
'DENY_ALL', 'MarkdownCache', 'main_doc_session', 'main_orm_session', 'project_doc_session', 'project_orm_session',
'artifact_orm_session', 'repository_orm_session', 'task_orm_session', 'ArtifactSessionExtension', 'repository',
- 'repo_refresh', ]
+ 'repo_refresh', 'SiteNotification']
http://git-wip-us.apache.org/repos/asf/allura/blob/e8e7b93a/Allura/allura/model/notification.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/notification.py b/Allura/allura/model/notification.py
index dfde847..a513795 100644
--- a/Allura/allura/model/notification.py
+++ b/Allura/allura/model/notification.py
@@ -720,6 +720,17 @@ class SiteNotification(MappedClass):
page_regex = FieldProperty(str, if_missing=None)
page_tool_type = FieldProperty(str, if_missing=None)
+ def __json__(self):
+ return dict(
+ _id=str(self._id),
+ content=self.content,
+ active=self.active,
+ impressions=self.impressions,
+ user_role=self.user_role if self.user_role else '',
+ page_regex=self.page_regex if self.page_regex else '',
+ page_tool_type=self.page_tool_type if self.page_tool_type else ''
+ )
+
@classmethod
def current(cls):
note = cls.query.find({'active': True}).sort('_id', -1).limit(1).first()
http://git-wip-us.apache.org/repos/asf/allura/blob/e8e7b93a/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 90b71ed..6f95c05 100644
--- a/Allura/allura/tests/functional/test_rest.py
+++ b/Allura/allura/tests/functional/test_rest.py
@@ -385,6 +385,19 @@ class TestRestHome(TestRestApiBase):
self.app.post('/rest/p/test/wiki/NewPage', headers={'Origin': 'http://bad.com/'},
status=401)
+ @mock.patch('allura.lib.plugin.ThemeProvider.get_site_notification')
+ def test_notification(self, get_site_notification):
+ note = M.SiteNotification()
+ cookie = '{}-1-False'.format(note._id)
+ g.theme.get_site_notification = mock.Mock(return_value=(note, cookie))
+
+ r = self.app.get('/rest/notification')
+
+ assert r.status_int == 200
+ assert r.json['cookie'] == cookie
+ assert r.json['notification'] == note.__json__()
+
+
class TestDoap(TestRestApiBase):
validate_skip = True
http://git-wip-us.apache.org/repos/asf/allura/blob/e8e7b93a/Allura/allura/tests/model/test_notification.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/model/test_notification.py b/Allura/allura/tests/model/test_notification.py
index ac7ca3e..869a704 100644
--- a/Allura/allura/tests/model/test_notification.py
+++ b/Allura/allura/tests/model/test_notification.py
@@ -475,6 +475,37 @@ class TestSubscriptionTypes(unittest.TestCase):
assert_equal(count, 1)
+class TestSiteNotification(unittest.TestCase):
+ def setUp(self):
+ self.note = M.SiteNotification(
+ active=True,
+ impressions=0,
+ content='test',
+ page_regex='',
+ page_tool_type='',
+ user_role=''
+ )
+
+ def test_json_type(self):
+ note_json = self.note.__json__()
+ assert isinstance(note_json, dict)
+
+ def test_json_keys(self):
+ keys = self.note.__json__().keys()
+ assert 'active' in keys
+ assert 'impressions' in keys
+ assert 'content' in keys
+ assert 'page_regex' in keys
+ assert 'page_tool_type' in keys
+ assert 'user_role' in keys
+
+ def test_json_values_if_missing(self):
+ note_json = self.note.__json__()
+ assert note_json['page_regex'] is ''
+ assert note_json['page_tool_type'] is ''
+ assert note_json['user_role'] is ''
+
+
def _clear_subscriptions():
M.Mailbox.query.remove({})
http://git-wip-us.apache.org/repos/asf/allura/blob/e8e7b93a/Allura/allura/tests/test_plugin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_plugin.py b/Allura/allura/tests/test_plugin.py
index 0441f18..4f65c23 100644
--- a/Allura/allura/tests/test_plugin.py
+++ b/Allura/allura/tests/test_plugin.py
@@ -489,6 +489,37 @@ class TestThemeProvider(object):
request.path_qs = 'ttt'
assert_is(ThemeProvider().get_site_notification(), None)
+ @patch('allura.model.notification.SiteNotification')
+ def test_get_site_notification_with_is_api(self, SiteNotification):
+ note = SiteNotification.current.return_value
+ note._id = 'test_id'
+ note.user_role = None
+ note.page_regex = None
+ note.page_tool_type = None
+ get_note = ThemeProvider().get_site_notification(is_api=True)
+
+ assert isinstance(get_note, tuple)
+ assert len(get_note) is 2
+ assert get_note[0] is note
+ assert get_note[1] == 'test_id-1-False'
+
+ @patch('allura.model.notification.SiteNotification')
+ @patch('pylons.request')
+ def test_get_site_notifications_with_api_cookie(self, request, SiteNotification):
+ note = SiteNotification.current.return_value
+ note._id = 'test_id'
+ note.user_role = None
+ note.page_regex = None
+ note.page_tool_type = None
+ request.cookies = {}
+ get_note = ThemeProvider().get_site_notification(
+ is_api=True,
+ api_cookie='test_id-1-False'
+ )
+
+ assert get_note[0] is note
+ assert get_note[1] == 'test_id-2-False'
+
class TestLocalAuthenticationProvider(object):