from django.conf.urls.defaults import url from django.utils.decorators import wraps def func_to_view(f): @wraps(f) def _dec(request, *a, **kw): kwargs = dict(kw) for k, v in request.REQUEST.items(): kwargs[str(k)] = v return f(request, *a, **kwargs) return _dec class AjaxAPI(object): def url_patterns(self, prefix=''): attrs = ((name, getattr(self, name)) for name in dir(self) if not name.startswith('__')) methods = ((name, method) for (name, method) in attrs if callable(method)) res = [] for name, method in methods: exported = getattr(method, 'exported', False) if not exported: continue if isinstance(exported, basestring): export_name = exported else: export_name = name # Default to exporting by function name res.append(url('^%s%s/$' % (prefix, export_name), func_to_view(method))) return res @staticmethod def export(f, name=True): f.exported = name return f