Package hm :: Package app :: Package lib :: Module json_utils
[hide private]
[frames] | no frames]

Source Code for Module hm.app.lib.json_utils

  1  from django.contrib.contenttypes.models import ContentType 
  2  from django.utils import simplejson 
  3  #from django.core import serializers 
  4  from django.core.serializers.json import DjangoJSONEncoder 
  5  from django.db import models 
  6   
  7   
  8  ###########     
  9  ## UTILS ## 
 10  ########### 
 11   
12 -def get_item(item_id, item_type):
13 if isinstance(item_type, (int, long)): 14 item_type = ContentType.objects.get(id=item_type) 15 if isinstance(item_type, ContentType): 16 item_type = item_type.model_class() 17 return item_type.objects.get(id=item_id)
18
19 -def get_type(item):
20 if isinstance(item, (int, long)): 21 return ContentType.objects.get(id=item); 22 else: 23 return ContentType.objects.get_for_model(item)
24 25
26 -def get_params(dict, *args, **kwargs):
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
41 -def default_fields(obj):
42 if isinstance(obj, models.Model): 43 return [f.attname for f in obj._meta.fields] 44 return []
45
46 -def get_field(obj, path):
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 #elif isinstance(p, (slice)): 62 # ret = list(ret.__iter__(field)) 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 #if isinstance(ret, models.Model): 76 # ret = dict([(f.attname, f.value_from_object(ret)) for f in ret._meta.fields]) 77 #elif not isinstance(ret, (int, long, str, unicode, dict, list)): 78 # raise RuntimeError("Path leads to non-json object! %s => <%s> %s" % (".".join(path), ret.__class__, ret)) 79 80 return ret
81
82 -def get_data(obj, fields=None):
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 #handle double-array, which denotes an iterable object 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: #guarantees not empty string or list 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
123 -def get_json(obj, fields=None):
124 return simplejson.dumps(get_data(obj, fields), cls=DjangoJSONEncoder)
125
126 -def to_json(obj):
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
134 -def JSON_API(definition):
135 return DjangoStructureDefinition(definition)
136
137 -def make_json_api(definition):
138 return DjangoStructureDefinition(definition)
139
140 -def json_api(definition):
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
163 -def json_response(data):
164 if not isinstance(data, (str, unicode)): 165 data = to_json(data) 166 return HttpResponse(data, mimetype="text/javascript")
167