Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 33687af

Browse files
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‎

Lines changed: 54 additions & 0 deletions
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‎

Lines changed: 29 additions & 7 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /