Skip to content

Commit 33687af

Browse files
authored
Merge pull request #50 from zhangchunlin/master
Sync
2 parents f238e53 + f3e308d commit 33687af

File tree

2 files changed

+83
-7
lines changed

2 files changed

+83
-7
lines changed

tests/test.py

+54
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,45 @@ def test_apijson_get():
867867
>>> print(d)
868868
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}]}
869869
870+
>>> #query array, {} <= with datetime
871+
>>> data ='''{
872+
... "[]":{
873+
... "moment": {
874+
... "date{}": "<='2018-11-02 00:00'"
875+
... }
876+
... }
877+
... }'''
878+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
879+
>>> d = json_loads(r.data)
880+
>>> print(d)
881+
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}, {'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}]}
882+
883+
>>> #query array, {} >= with datetime
884+
>>> data ='''{
885+
... "[]":{
886+
... "moment": {
887+
... "date{}": ">='2018-11-02 00:00'"
888+
... }
889+
... }
890+
... }'''
891+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
892+
>>> d = json_loads(r.data)
893+
>>> print(d)
894+
{'code': 200, 'msg': 'success', '[]': [{'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}, {'moment': {'user_id': 4, 'date': '2018-11-06 00:00:00', 'content': 'test moment from c', 'picture_list': '[]', 'id': 3}}]}
895+
896+
>>> #query array, {} >= with a invalid datetime
897+
>>> data ='''{
898+
... "[]":{
899+
... "moment": {
900+
... "date{}": ">='2018-11-42 00:00'"
901+
... }
902+
... }
903+
... }'''
904+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
905+
>>> d = json_loads(r.data)
906+
>>> print(d)
907+
{'code': 400, 'msg': "''2018-11-42 00:00'' cannot convert to datetime"}
908+
870909
>>> #query array, !{} <
871910
>>> data ='''{
872911
... "[]":{
@@ -951,6 +990,21 @@ def test_apijson_get():
951990
>>> print(d)
952991
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'userb', 'nickname': 'User B', 'id': 3}}, {'user': {'username': 'userc', 'nickname': 'User C', 'id': 4}}]}
953992
993+
>>> #query array, &{} condition list
994+
>>> data ='''{
995+
... "[]":{
996+
... "user": {
997+
... "@role": "ADMIN",
998+
... "date_join&{}": ">='2018-1-1 00:00',<='2018-2-2 00:00'",
999+
... "@column": "username,nickname,id,date_join"
1000+
... }
1001+
... }
1002+
... }'''
1003+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
1004+
>>> d = json_loads(r.data)
1005+
>>> print(d)
1006+
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'admin', 'nickname': 'Administrator', 'date_join': '2018-01-01 00:00:00', 'id': 1}}, {'user': {'username': 'usera', 'nickname': 'User A', 'date_join': '2018-02-02 00:00:00', 'id': 2}}]}
1007+
9541008
>>> #query array, {} multiple condition to a same field
9551009
>>> data ='''{
9561010
... "[]":{

uliweb_apijson/apijson/views.py

+29-7
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
#coding=utf-8
2-
from uliweb import expose, functions, models, UliwebError
2+
from uliweb import expose, functions, models, UliwebError, request
33
from uliweb.orm import ModelNotFound
44
from uliweb.utils._compat import string_types
5+
from uliweb.utils.date import to_datetime
56
from sqlalchemy.sql import and_, or_, not_
67
from json import loads
78
from collections import OrderedDict
89
import logging
910
import traceback
11+
from datetime import datetime
1012
from . import ApiJsonModelQuery
1113

1214
log = logging.getLogger('apijson')
@@ -274,7 +276,7 @@ def _get_filter_condition(self,model,model_param,item,expr=False):
274276
return fcond
275277
elif len(cond_list)>1:
276278
fcond = self._get_filter_condition_from_str(col,cond_list[0])
277-
for c in cond_list:
279+
for c in cond_list[1:]:
278280
fc = self._get_filter_condition_from_str(col,c)
279281
if operator=="&":
280282
fcond = and_(fcond,fc)
@@ -293,20 +295,40 @@ def _get_filter_condition(self,model,model_param,item,expr=False):
293295
def _get_filter_condition_from_str(self,col,cond_str):
294296
cond_str = cond_str.strip()
295297
c1,c2 = cond_str[0],cond_str[1]
298+
v = None
299+
def _conver():
300+
nonlocal v
301+
if v and col.type.python_type==datetime:
302+
_v = v
303+
v = to_datetime(v,tzinfo=getattr(request,"tzinfo",None))
304+
if v==None:
305+
raise UliwebError("'%s' cannot convert to datetime"%(_v))
296306
if c1=='>':
297307
if c2=="=":
298-
return col >= cond_str[2:]
308+
v = cond_str[2:]
309+
_conver()
310+
return col >= v
299311
else:
312+
v = cond_str[1:]
313+
_conver()
300314
return col > cond_str[1:]
301315
elif c1=='<':
302316
if c2=="=":
303-
return col <= cond_str[2:]
317+
v = cond_str[2:]
318+
_conver()
319+
return col <= v
304320
else:
305-
return col < cond_str[1:]
321+
v = cond_str[1:]
322+
_conver()
323+
return col < v
306324
elif c1=="=":
307-
return col == cond_str[1:]
325+
v = cond_str[1:]
326+
_conver()
327+
return col == v
308328
elif c1=="!" and c2=="=":
309-
return col != cond_str[2:]
329+
v = cond_str[2:]
330+
_conver()
331+
return col != v
310332
raise UliwebError("not support '%s'"%(cond_str))
311333

312334
def head(self):

0 commit comments

Comments
 (0)