|
Package hm ::
Package app ::
Package lib ::
Module json_utils
|
|
1 from django.contrib.contenttypes.models import ContentType
2 from django.utils import simplejson
3
4 from django.core.serializers.json import DjangoJSONEncoder
5 from django.db import models
6
7
8
9
10
11
18
24
25
27 """
28 @summary: Tries to extract parameters from the provided dict for each keyword.
29 If a parameter isn't found, the keyword's value is returned.
30 """
31 ret = []
32 for k in args:
33 if isinstance(k, (tuple, list)):
34 if k[0] in dict: ret.append(dict[k])
35 else: ret.append(k[1])
36 else:
37 ret.append(dict[k])
38 return ret
39
40
42 if isinstance(obj, models.Model):
43 return [f.attname for f in obj._meta.fields]
44 return []
45
47 if not isinstance(path, (list, tuple)):
48 path = [path]
49
50 ret = obj
51 for p in path:
52 if isinstance(ret, models.Model):
53 if isinstance(p, str):
54 ret = getattr(ret, p)
55 else:
56 raise RuntimeError("Invalid path: %s" % (".".join(path),))
57
58 elif isinstance(ret, models.query.QuerySet):
59 if isinstance(p, (int, long)):
60 ret = ret[p]
61
62
63 else:
64 raise RuntimeError("Invalid path: %s" % (".".join(path),))
65
66 elif isinstance(ret, dict):
67 try:
68 ret = ret[p]
69 except:
70 raise RuntimeError("%s %s %s" % (ret, ret.__class__, str(path)))
71
72 else:
73 raise RuntimeError("Invalid path: %s" % (".".join(path),))
74
75
76
77
78
79
80 return ret
81
83 """
84 @summary:
85 Given an object and a structured list of fields, returns a dict, list, int, or str.
86 """
87 if fields is None:
88 return obj
89 elif not isinstance(fields, (tuple, list)):
90 return get_field(obj, fields)
91 else:
92 if len(fields) == 0 or fields[0] == '*':
93 fields = default_fields(obj) + fields[1:]
94 fields = list(fields)
95
96
97 if len(fields) == 1 and isinstance(fields[0], list):
98 return [get_data(o, fields[0]) for o in obj]
99
100 ret = {}
101 for f in fields:
102 if not f:
103 continue
104 elif isinstance(f, str):
105 ret[f] = get_field(obj, f)
106 elif isinstance(f, list) and isinstance(f[0], str):
107 name = f[0]
108 path = subfields = None
109
110 if isinstance(f[1], str): path = f[1].split(".")
111 else: path = [name]
112 if isinstance(f[-1], list): subfields = f[-1]
113 else: subfields = None
114
115 if subfields is None:
116 ret[name] = get_field(obj, path)
117 else:
118 ret[name] = get_data(get_field(obj, path), subfields)
119 else:
120 raise RuntimeError("Invalid field: %s" % str(f))
121 return ret
122
124 return simplejson.dumps(get_data(obj, fields), cls=DjangoJSONEncoder)
125
127 return simplejson.dumps(obj, cls=DjangoJSONEncoder)
128
129
130
131 from django.http import Http404, HttpResponseRedirect, HttpResponse
132 from structures import StructureDefinition, DjangoStructureDefinition
133
136
139
141 if isinstance(definition, StructureDefinition):
142 struct = definition
143 else:
144 struct = DjangoStructureDefinition(definition)
145
146 def decorator(func):
147 def inner(*args, **kwargs):
148 response = func(*args, **kwargs)
149 if isinstance(response, (Http404, HttpResponseRedirect, HttpResponse)):
150 return response
151 else:
152 data = struct.render(response)
153 json = to_json(data)
154 return HttpResponse(json, mimetype="text/javascript")
155 inner.__name__ = func.__name__
156 inner.__doc__ = func.__doc__
157 inner.__dict__.update(func.__dict__)
158 return inner
159
160 return decorator
161
162
164 if not isinstance(data, (str, unicode)):
165 data = to_json(data)
166 return HttpResponse(data, mimetype="text/javascript")
167