From c4c6b8ac9b669785880562745303b1e5aecaf51b Mon Sep 17 00:00:00 2001 From: NamPNQ Date: Mon, 31 Mar 2014 14:57:02 +0700 Subject: [PATCH 1/3] Update __init__.py Add rescure with depth --- tailbone/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tailbone/__init__.py b/tailbone/__init__.py index 334f199..9c18c15 100644 --- a/tailbone/__init__.py +++ b/tailbone/__init__.py @@ -95,7 +95,8 @@ def json_extras(obj): return {"lat": obj.lat, "lon": obj.lon} if isinstance(obj, ndb.Key): r = webapp2.get_request() - if r.get("recurse", default_value=False): + if r.get("recurse", default_value=False) and recurse_depth > recurse_excute: + recurse_excute += 1 item = obj.get() if item == None: return obj.urlsafe() @@ -111,6 +112,9 @@ def as_json(func): """Returns json when callback in url""" @functools.wraps(func) def wrapper(self, *args, **kwargs): + global recurse_excute, recurse_depth + recurse_depth = int(self.request.get("depth", default_value=2)) + recurse_excute = 0 self.response.headers["Content-Type"] = "application/json" if DEBUG: self.response.headers["Access-Control-Allow-Origin"] = "*" From 344bc0dde64782823d4c39b430d2a354eac138e2 Mon Sep 17 00:00:00 2001 From: NamPNQ Date: Tue, 1 Apr 2014 03:35:42 +0700 Subject: [PATCH 2/3] Update __init__.py Fix calc depth --- tailbone/__init__.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/tailbone/__init__.py b/tailbone/__init__.py index 9c18c15..0fc7dea 100644 --- a/tailbone/__init__.py +++ b/tailbone/__init__.py @@ -95,13 +95,24 @@ def json_extras(obj): return {"lat": obj.lat, "lon": obj.lon} if isinstance(obj, ndb.Key): r = webapp2.get_request() - if r.get("recurse", default_value=False) and recurse_depth > recurse_excute: - recurse_excute += 1 + if r.get("recurse", default_value=False): item = obj.get() - if item == None: + current_level = [key for key in recurse_class.keys() if obj.kind() in recurse_class[key]] or 1 + current_level = current_level[0] if current_level != 1 else 1 + if current_level > recurse_depth: + return obj.urlsafe() + if item is None: return obj.urlsafe() item = item.to_dict() + item["Id"] = obj.urlsafe() item["$class"] = obj.kind() + recurse_class[current_level].add(item["$class"]) + for key in item.keys(): + if isinstance(item[key], ndb.Key) or (type(item[key]) == list and len(item[key]) > 0 and isinstance(item[key][0], ndb.Key)): + child_class = item[key].kind() if isinstance(item[key], ndb.Key) else item[key][0].kind() + if not current_level+1 in recurse_class.keys(): + recurse_class.update({current_level+1: set()}) + recurse_class[current_level+1].add(child_class) return item return obj.urlsafe() return None @@ -114,7 +125,7 @@ def as_json(func): def wrapper(self, *args, **kwargs): global recurse_excute, recurse_depth recurse_depth = int(self.request.get("depth", default_value=2)) - recurse_excute = 0 + recurse_class = {1: set()} self.response.headers["Content-Type"] = "application/json" if DEBUG: self.response.headers["Access-Control-Allow-Origin"] = "*" From a14aa80d3a35a50a87efed0b059847057d5d9803 Mon Sep 17 00:00:00 2001 From: NamPNQ Date: Tue, 1 Apr 2014 03:39:45 +0700 Subject: [PATCH 3/3] Update __init__.py --- tailbone/__init__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tailbone/__init__.py b/tailbone/__init__.py index 0fc7dea..e78951b 100644 --- a/tailbone/__init__.py +++ b/tailbone/__init__.py @@ -95,12 +95,10 @@ def json_extras(obj): return {"lat": obj.lat, "lon": obj.lon} if isinstance(obj, ndb.Key): r = webapp2.get_request() - if r.get("recurse", default_value=False): + current_level = [key for key in recurse_class.keys() if obj.kind() in recurse_class[key]] or 1 + current_level = current_level[0] if current_level != 1 else 1 + if r.get("recurse", default_value=False) and current_level <= recurse_depth: item = obj.get() - current_level = [key for key in recurse_class.keys() if obj.kind() in recurse_class[key]] or 1 - current_level = current_level[0] if current_level != 1 else 1 - if current_level > recurse_depth: - return obj.urlsafe() if item is None: return obj.urlsafe() item = item.to_dict()