Skip to content

Commit 4bfb641

Browse files
authored
Merge pull request #8 from zhangchunlin/master
add apijson get @query parameter support
2 parents 7f1fab5 + bf6c2fd commit 4bfb641

File tree

2 files changed

+94
-71
lines changed

2 files changed

+94
-71
lines changed

demo/apps/apijson_demo/views.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,25 @@ def index():
1414
"label":"Single record query: self user",
1515
"value":'''{
1616
"user":{
17-
"@role":"OWNER"
17+
"@role":"OWNER"
1818
}
1919
}''',
2020
},
2121
{
2222
"label":"Single record query: with id as parameter",
2323
"value":'''{
2424
"user":{
25-
"id":2,
26-
"@role":"ADMIN"
25+
"id":2,
26+
"@role":"ADMIN"
2727
}
2828
}''',
2929
},
3030
{
3131
"label":"Single record query: @column",
3232
"value":'''{
3333
"user":{
34-
"@column": "id,username,email",
35-
"@role":"OWNER"
34+
"@column": "id,username,email",
35+
"@role":"OWNER"
3636
}
3737
}''',
3838
},
@@ -43,23 +43,25 @@ def index():
4343
"@count":2,
4444
"@page":0,
4545
"user":{
46-
"@column":"id,username,nickname,email",
47-
"@order":"id-",
48-
"@role":"ADMIN"
46+
"@column":"id,username,nickname,email",
47+
"@order":"id-",
48+
"@role":"ADMIN"
4949
}
5050
}
5151
}''',
5252
},
5353
{
5454
"label":"Array query: moment",
5555
"value":'''{
56-
"[]":{
57-
"@count":10,
58-
"@page":0,
59-
"moment":{
60-
"@order":"id-"
61-
}
62-
}
56+
"moment[]":{
57+
"@count":10,
58+
"@page":0,
59+
"@query":2,
60+
"moment":{
61+
"@order":"id-"
62+
}
63+
},
64+
"total@":"/moment[]/total"
6365
}''',
6466
},
6567
]

uliweb_apijson/apijson/views.py

Lines changed: 77 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,33 @@ def __begin__(self):
1313
"code":200,
1414
"msg":"success"
1515
}
16+
self.vars = {}
1617

1718
try:
1819
self.request_data = loads(request.data)
1920
except Exception as e:
2021
log.error("try to load json but get exception: '%s', request data: %s"%(e,request.data))
2122
return json({"code":400,"msg":"not json data in the request"})
2223

24+
def apply_vars(self):
25+
for key in self.request_data:
26+
if key[-1]=="@":
27+
k = self.request_data[key]
28+
v = self.vars.get(k)
29+
if v:
30+
self.rdict[key[:-1]] = v
31+
2332
def get(self):
2433
for key in self.request_data:
25-
if key[-2:]=="[]":
34+
if key[-1]=="@":
35+
#vars need to be applied later
36+
pass
37+
elif key[-2:]=="[]":
2638
rsp = self._get_array(key)
2739
else:
2840
rsp = self._get_one(key)
2941
if rsp: return rsp
30-
42+
self.apply_vars()
3143
return json(self.rdict)
3244

3345
def _get_one(self,key):
@@ -95,35 +107,40 @@ def _get_one(self,key):
95107

96108
def _get_array(self,key):
97109
params = self.request_data[key]
98-
query_count = None
99-
query_page = None
100110
modelname = None
101111
model_param = None
102112
model_column_set = None
113+
114+
query_count = params.get("@count")
115+
if query_count:
116+
try:
117+
query_count = int(query_count)
118+
except ValueError as e:
119+
log.error("bad param in '%s': '%s'"%(n,params))
120+
return json({"code":400,"msg":"@count should be an int, now '%s'"%(params[n])})
121+
122+
query_page = params.get("@page")
123+
if query_page:
124+
#@page begin from 0
125+
try:
126+
query_page = int(params[n])
127+
except ValueError as e:
128+
log.error("bad param in '%s': '%s'"%(n,params))
129+
return json({"code":400,"msg":"@page should be an int, now '%s'"%(params[n])})
130+
if query_page<0:
131+
return json({"code":400,"msg":"page should >0, now is '%s'"%(query_page)})
132+
133+
#https://github.com/TommyLemon/APIJSON/blob/master/Document.md#32-%E5%8A%9F%E8%83%BD%E7%AC%A6
134+
query_type = params.get("@query",0)
135+
if query_type not in [0,1,2]:
136+
return json({"code":400,"msg":"bad param 'query': %s"%(query_type)})
137+
103138
for n in params:
104-
if n[0]=="@":
105-
if not query_count and n=="@count":
106-
try:
107-
query_count = int(params[n])
108-
except ValueError as e:
109-
log.error("bad param in '%s': '%s'"%(n,params))
110-
return json({"code":400,"msg":"@count should be an int, now '%s'"%(params[n])})
111-
if query_count<=0:
112-
return json({"code":400,"msg":"count should >0, now is '%s' "%(query_count)})
113-
elif not query_page and n=="@page":
114-
#@page begin from 0
115-
try:
116-
query_page = int(params[n])
117-
except ValueError as e:
118-
log.error("bad param in '%s': '%s'"%(n,params))
119-
return json({"code":400,"msg":"@page should be an int, now '%s'"%(params[n])})
120-
if query_page<0:
121-
return json({"code":400,"msg":"page should >0, now is '%s' "%(query_page)})
122-
123-
# TODO: support join in the future, now only support 1 model
124-
elif not modelname:
139+
if n[0]!="@":
140+
# TODO: support join in the future, now only support 1 model
125141
modelname = n
126-
142+
break
143+
127144
if not modelname:
128145
return json({"code":400,"msg":"no model found in array query"})
129146

@@ -174,37 +191,41 @@ def _get_array(self,key):
174191
if not owner_filtered:
175192
return json({"code":400,"msg":"'%s' cannot filter with owner"%(modelname)})
176193

177-
if query_count:
178-
if query_page:
179-
q = q.offset(query_page*query_count)
180-
q = q.limit(query_count)
181-
if model_order:
182-
for k in model_order.split(","):
183-
if k[-1] == "+":
184-
sort_key = k[:-1]
185-
sort_order = "asc"
186-
elif k[-1] == "-":
187-
sort_key = k[:-1]
188-
sort_order = "desc"
189-
else:
190-
sort_key = k
191-
sort_order = "asc"
192-
column = getattr(model.c,sort_key)
193-
q = q.order_by(getattr(column,sort_order)())
194-
195-
def _get_info(i):
196-
d = i.to_dict()
197-
if secret_fields:
198-
for k in secret_fields:
199-
del d[k]
200-
if model_column_set:
201-
keys = list(d.keys())
202-
for k in keys:
203-
if k not in model_column_set:
194+
if query_type in [1,2]:
195+
self.vars["/%s/total"%(key)] = q.count()
196+
197+
if query_type in [0,2]:
198+
if query_count:
199+
if query_page:
200+
q = q.offset(query_page*query_count)
201+
q = q.limit(query_count)
202+
if model_order:
203+
for k in model_order.split(","):
204+
if k[-1] == "+":
205+
sort_key = k[:-1]
206+
sort_order = "asc"
207+
elif k[-1] == "-":
208+
sort_key = k[:-1]
209+
sort_order = "desc"
210+
else:
211+
sort_key = k
212+
sort_order = "asc"
213+
column = getattr(model.c,sort_key)
214+
q = q.order_by(getattr(column,sort_order)())
215+
216+
def _get_info(i):
217+
d = i.to_dict()
218+
if secret_fields:
219+
for k in secret_fields:
204220
del d[k]
205-
return d
206-
l = [_get_info(i) for i in q]
207-
self.rdict[key] = l
221+
if model_column_set:
222+
keys = list(d.keys())
223+
for k in keys:
224+
if k not in model_column_set:
225+
del d[k]
226+
return d
227+
l = [_get_info(i) for i in q]
228+
self.rdict[key] = l
208229

209230
def _filter_owner(self,model,model_setting,q):
210231
owner_filtered = False

0 commit comments

Comments
 (0)