Skip to content

Commit 92dfbbb

Browse files
committed
Added filtering and pagination
Adjust unittest to use empty cgi formfield instead of empty dict committer: Ralf Schlatterbeck <[email protected]>
1 parent 3736b3b commit 92dfbbb

File tree

2 files changed

+56
-15
lines changed

2 files changed

+56
-15
lines changed

roundup/rest.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,13 +178,47 @@ def get_collection(self, class_name, input):
178178

179179
class_obj = self.db.getclass(class_name)
180180
class_path = self.base_path + class_name
181+
182+
# Handle filtering and pagination
183+
filter_props = {}
184+
page = {
185+
'size': None,
186+
'index': None
187+
}
188+
for form_field in input.value:
189+
key = form_field.name
190+
value = form_field.value
191+
if key.startswith("where_"): # serve the filter purpose
192+
key = key[6:]
193+
filter_props[key] = [
194+
getattr(self.db, key).lookup(p)
195+
for p in value.split(",")
196+
]
197+
elif key.startswith("page_"): # serve the paging purpose
198+
key = key[5:]
199+
value = int(value)
200+
page[key] = value
201+
202+
if not filter_props:
203+
obj_list = class_obj.list()
204+
else:
205+
obj_list = class_obj.filter(None, filter_props)
206+
207+
# extract result from data
181208
result = [
182209
{'id': item_id, 'link': class_path + item_id}
183-
for item_id in class_obj.list()
210+
for item_id in obj_list
184211
if self.db.security.hasPermission(
185212
'View', self.db.getuid(), class_name, itemid=item_id
186213
)
187214
]
215+
216+
# pagination
217+
if page['size'] is not None and page['index'] is not None:
218+
page_start = max(page['index'] * page['size'], 0)
219+
page_end = min(page_start + page['size'], len(result))
220+
result = result[page_start:page_end]
221+
188222
self.client.setHeader("X-Count-Total", str(len(result)))
189223
return 200, result
190224

@@ -807,7 +841,7 @@ def dispatch(self, method, uri, input):
807841
)(class_name, item_id, uri_split[2], input)
808842

809843
# Format the content type
810-
if format_output.lower() == "json":
844+
if data_type.lower() == "json":
811845
self.client.setHeader("Content-Type", "application/json")
812846
if pretty_output:
813847
indent = 4

test/test_rest.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def setUp(self):
5757
'TRACKER_NAME': 'rounduptest'
5858
}
5959
self.dummy_client = client.Client(self.instance, None, env, [], None)
60+
self.empty_form = cgi.FieldStorage()
6061

6162
self.server = RestfulInstance(self.dummy_client, self.db)
6263

@@ -74,19 +75,20 @@ def testGet(self):
7475
obtain data for 'joe'
7576
"""
7677
# Retrieve all three users.
77-
results = self.server.get_collection('user', {})
78+
results = self.server.get_collection('user', self.empty_form)
7879
self.assertEqual(self.dummy_client.response_code, 200)
7980
self.assertEqual(len(results['data']), 3)
8081

8182
# Obtain data for 'joe'.
82-
results = self.server.get_element('user', self.joeid, {})['data']
83+
results = self.server.get_element('user', self.joeid, self.empty_form)
84+
results = results['data']
8385
self.assertEqual(self.dummy_client.response_code, 200)
8486
self.assertEqual(results['attributes']['username'], 'joe')
8587
self.assertEqual(results['attributes']['realname'], 'Joe Random')
8688

8789
# Obtain data for 'joe'.
8890
results = self.server.get_attribute(
89-
'user', self.joeid, 'username', {}
91+
'user', self.joeid, 'username', self.empty_form
9092
)
9193
self.assertEqual(self.dummy_client.response_code, 200)
9294
self.assertEqual(results['data']['data'], 'joe')
@@ -105,7 +107,7 @@ def testPut(self):
105107
'user', self.joeid, 'realname', form
106108
)
107109
results = self.server.get_attribute(
108-
'user', self.joeid, 'realname', {}
110+
'user', self.joeid, 'realname', self.empty_form
109111
)
110112
self.assertEqual(self.dummy_client.response_code, 200)
111113
self.assertEqual(results['data']['data'], 'Joe Doe Doe')
@@ -116,7 +118,7 @@ def testPut(self):
116118
cgi.MiniFieldStorage('realname', 'Joe Doe')
117119
]
118120
results = self.server.put_element('user', self.joeid, form)
119-
results = self.server.get_element('user', self.joeid, {})
121+
results = self.server.get_element('user', self.joeid, self.empty_form)
120122
self.assertEqual(self.dummy_client.response_code, 200)
121123
self.assertEqual(results['data']['attributes']['realname'], 'Joe Doe')
122124

@@ -137,7 +139,7 @@ def testPost(self):
137139
results = self.server.post_collection('issue', form)
138140
self.assertEqual(self.dummy_client.response_code, 201)
139141
issueid = results['data']['id']
140-
results = self.server.get_element('issue', issueid, {})
142+
results = self.server.get_element('issue', issueid, self.empty_form)
141143
self.assertEqual(self.dummy_client.response_code, 200)
142144
self.assertEqual(results['data']['attributes']['title'], 'foo')
143145
self.assertEqual(self.db.issue.get(issueid, "tx_Source"), 'web')
@@ -154,7 +156,8 @@ def testPostFile(self):
154156
results = self.server.post_collection('file', form)
155157
self.assertEqual(self.dummy_client.response_code, 201)
156158
fileid = results['data']['id']
157-
results = self.server.get_element('file', fileid, {})['data']
159+
results = self.server.get_element('file', fileid, self.empty_form)
160+
results = results['data']
158161
self.assertEqual(self.dummy_client.response_code, 200)
159162
self.assertEqual(results['attributes']['content'], 'hello\r\nthere')
160163

@@ -224,17 +227,18 @@ def testDeleteAttributeUri(self):
224227

225228
# remove the title and nosy
226229
results = self.server.delete_attribute(
227-
'issue', issue_id, 'title', {}
230+
'issue', issue_id, 'title', self.empty_form
228231
)
229232
self.assertEqual(self.dummy_client.response_code, 200)
230233

231234
results = self.server.delete_attribute(
232-
'issue', issue_id, 'nosy', {}
235+
'issue', issue_id, 'nosy', self.empty_form
233236
)
234237
self.assertEqual(self.dummy_client.response_code, 200)
235238

236239
# verify the result
237-
results = self.server.get_element('issue', issue_id, {})['data']
240+
results = self.server.get_element('issue', issue_id, self.empty_form)
241+
results = results['data']
238242
self.assertEqual(self.dummy_client.response_code, 200)
239243
self.assertEqual(len(results['attributes']['nosy']), 0)
240244
self.assertListEqual(results['attributes']['nosy'], [])
@@ -257,7 +261,8 @@ def testPatchAdd(self):
257261
self.assertEqual(self.dummy_client.response_code, 200)
258262

259263
# verify the result
260-
results = self.server.get_element('issue', issue_id, {})['data']
264+
results = self.server.get_element('issue', issue_id, self.empty_form)
265+
results = results['data']
261266
self.assertEqual(self.dummy_client.response_code, 200)
262267
self.assertEqual(len(results['attributes']['nosy']), 2)
263268
self.assertListEqual(results['attributes']['nosy'], ['1', '2'])
@@ -280,7 +285,8 @@ def testPatchReplace(self):
280285
self.assertEqual(self.dummy_client.response_code, 200)
281286

282287
# verify the result
283-
results = self.server.get_element('issue', issue_id, {})['data']
288+
results = self.server.get_element('issue', issue_id, self.empty_form)
289+
results = results['data']
284290
self.assertEqual(self.dummy_client.response_code, 200)
285291
self.assertEqual(results['attributes']['status'], '3')
286292
self.assertEqual(len(results['attributes']['nosy']), 1)
@@ -304,7 +310,8 @@ def testPatchRemoveAll(self):
304310
self.assertEqual(self.dummy_client.response_code, 200)
305311

306312
# verify the result
307-
results = self.server.get_element('issue', issue_id, {})['data']
313+
results = self.server.get_element('issue', issue_id, self.empty_form)
314+
results = results['data']
308315
self.assertEqual(self.dummy_client.response_code, 200)
309316
self.assertEqual(results['attributes']['title'], None)
310317
self.assertEqual(len(results['attributes']['nosy']), 0)

0 commit comments

Comments
 (0)