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 bf6c2fd

Browse files
add apijson get @query parameter support
1 parent 89702f0 commit bf6c2fd

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)

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