ajax is not really required. makes the job simpler.
[worddb.git] / utils.py
blobe1d04e98fb6d0e45e9f29864c11c4bdc1c59b104
1 # imports # {{{
2 from django.utils import simplejson
3 from django.http import HttpResponse, Http404, HttpResponseServerError
4 from django.http import HttpResponseRedirect
5 from django.utils.functional import Promise
6 from django.utils.translation import force_unicode
7 from django.utils.simplejson import JSONEncoder
8 from django.conf import settings
9 # }}}
11 # JSONResponse # {{{
12 class LazyEncoder(simplejson.JSONEncoder):
13 def default(self, o):
14 if isinstance(o, Promise):
15 return force_unicode(o)
16 else:
17 return super(LazyEncoder, self).default(o)
19 class JSONResponse(HttpResponse):
20 def __init__(self, data):
21 print data
22 HttpResponse.__init__(
23 self, content=simplejson.dumps(data, cls=LazyEncoder),
24 #mimetype="text/html",
26 # }}}
28 # ajax_form_handler # {{{
29 def ajax_form_handler(
30 request, form_cls, require_login=True, allow_get=settings.DEBUG
32 if require_login and not request.user.is_authenticated():
33 raise Http404("login required")
34 if not allow_get and request.method != "POST":
35 raise Http404("only post allowed")
36 if isinstance(form_cls, basestring):
37 # can take form_cls of the form: "iwdb.app.forms.FormName"
38 from django.core.urlresolvers import get_mod_func
39 mod_name, form_name = get_mod_func(form_cls)
40 form_cls = getattr(__import__(mod_name, {}, {}, ['']), form_name)
41 form = form_cls(request, request.REQUEST)
42 if form.is_valid():
43 response = form.save()
44 if request.is_ajax():
45 return JSONResponse({ 'success': True, 'response': response })
46 else:
47 return HttpResponseRedirect(request.META.get("HTTP_REFERER", ""))
48 return JSONResponse({ 'success': False, 'errors': form.errors })
49 # }}}
51 # ajax_validator # {{{
52 def ajax_validator(request, form_cls):
53 if isinstance(form_cls, basestring):
54 from django.core.urlresolvers import get_mod_func
55 mod_name, form_name = get_mod_func(form_cls)
56 form_cls = getattr(__import__(mod_name, {}, {}, ['']), form_name)
57 form = form_cls(request.POST)
58 if "field" in request.GET:
59 errors = form.errors.get(request.GET["field"])
60 if errors: errors = errors.as_text()
61 else:
62 errors = form.errors
63 return JSONResponse(
64 { "errors": errors, "valid": not errors }
66 # }}}
68 def wf(form):
69 return "%s%s%s" % (
70 settings.WORD_FORM_DELIMITER, form, settings.WORD_FORM_DELIMITER
73 # AJAXSimpleExceptionResponse www.djangosnippets.org/snippets/650/ # {{{
74 class AJAXSimpleExceptionResponse:
75 def process_exception(self, request, exception):
76 import sys, traceback
77 (exc_type, exc_info, tb) = sys.exc_info()
78 response = "%s\n" % exc_type.__name__
79 response += "%s\n\n" % exc_info
80 response += "TRACEBACK:\n"
81 for tb in traceback.format_tb(tb):
82 response += "%s\n" % tb
83 print response
84 if not settings.DEBUG: return
85 if not request.is_ajax(): return
86 return HttpResponseServerError(response)
87 # }}}