Skip to content

Commit 5a0fbc8

Browse files
committed
fix multiple condition problem; convert datetime in conditions
1 parent d275e12 commit 5a0fbc8

File tree

2 files changed

+82
-6
lines changed

2 files changed

+82
-6
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: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
from uliweb import expose, functions, models, UliwebError
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)
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy