Skip to content

Commit

Permalink
[#1431] Add "since_id" and "since_time" to revision_list so that you …
Browse files Browse the repository at this point in the history
…can page through revisions.
  • Loading branch information
David Read committed Jul 6, 2015
1 parent 8e343eb commit 0ae0573
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 2 deletions.
23 changes: 21 additions & 2 deletions ckan/logic/action/get.py
Expand Up @@ -192,11 +192,30 @@ def revision_list(context, data_dict):
'''
model = context['model']
since_id = data_dict.get('since_id')
since_time_str = data_dict.get('since_time')
PAGE_LIMIT = 50

_check_access('revision_list', context, data_dict)

revs = model.Session.query(model.Revision).all()
return [rev.id for rev in revs]
since_time = None
if since_id:
rev = model.Session.query(model.Revision).get(since_id)
if rev is None:
raise NotFound
since_time = rev.timestamp
elif since_time_str:
try:
from ckan.lib import helpers as h
since_time = h.date_str_to_datetime(since_time_str)
except ValueError:
raise logic.ValidationError('Timestamp did not parse')
revs = model.Session.query(model.Revision)
if since_time:
revs = revs.filter(model.Revision.timestamp > since_time)
revs = revs.order_by(model.Revision.timestamp) \
.limit(PAGE_LIMIT)
return [rev_.id for rev_ in revs]


def package_revision_list(context, data_dict):
Expand Down
68 changes: 68 additions & 0 deletions ckan/tests/logic/action/test_get.py
Expand Up @@ -1642,3 +1642,71 @@ def test_tag_list_vocab_not_found(self):
nose.tools.assert_raises(
logic.NotFound,
helpers.call_action, 'tag_list', vocabulary_id='does-not-exist')


class TestRevisionList(helpers.FunctionalTestBase):

@classmethod
def setup_class(cls):
super(TestRevisionList, cls).setup_class()
helpers.reset_db()

# Error cases

def test_date_instead_of_revision(self):
nose.tools.assert_raises(
logic.NotFound,
helpers.call_action,
'revision_list',
since_id='2010-01-01T00:00:00')

def test_date_invalid(self):
nose.tools.assert_raises(
logic.ValidationError,
helpers.call_action,
'revision_list',
since_time='2010-02-31T00:00:00')

def test_revision_doesnt_exist(self):
nose.tools.assert_raises(
logic.NotFound,
helpers.call_action,
'revision_list',
since_id='1234')

# Normal usage

@classmethod
def _create_revisions(cls, num_revisions):
from ckan import model
rev_ids = []
for i in xrange(num_revisions):
rev = model.repo.new_revision()
rev.id = unicode(i)
model.Session.commit()
rev_ids.append(rev.id)
return rev_ids

def test_all_revisions(self):
rev_ids = self._create_revisions(2)
revs = helpers.call_action('revision_list')
eq(revs[-len(rev_ids):], rev_ids)

def test_revisions_since_id(self):
rev_ids = self._create_revisions(4)
revs = helpers.call_action('revision_list', since_id=rev_ids[1])
eq(revs, rev_ids[2:])

def test_revisions_since_time(self):
from ckan import model
rev_ids = self._create_revisions(4)

rev1 = model.Session.query(model.Revision).get(rev_ids[1])
revs = helpers.call_action('revision_list',
since_time=rev1.timestamp.isoformat())
eq(revs, rev_ids[2:])

def test_revisions_returned_are_limited(self):
rev_ids = self._create_revisions(55)
revs = helpers.call_action('revision_list', since_id=rev_ids[1])
eq(revs, rev_ids[2:52]) # i.e. limited to 50

0 comments on commit 0ae0573

Please sign in to comment.