""" Helpers for coding in a more MVC-fashion using Controller classes as opposed to views. """ from django.shortcuts import get_object_or_404 from django.contrib.auth.decorators import login_required def view(path=None, name=None): def decorator(func): func.view = True func.name = name if name is not None else func.__name__ func.path = path if path is not None else '^%s/$' % func.name return func return decorator class ControllerMetaclass(type): @property def _meta(self): return self.Meta def urls(self, path_prefix=''): return [ (path_prefix + view.path, self.get_handler(view), {}, self._meta.url_prefix + view.name) for view in (getattr(self, name) for name in dir(self)) if getattr(view, 'view', False)] class Controller(object): __metaclass__ = ControllerMetaclass def __init__(self, request, *args, **kwargs): self.request = request @classmethod def get_view(cls, view, request, *args, **kwargs): return view(cls(request), *args, **kwargs) @classmethod def get_handler(cls, view): def inner(request, *args, **kwargs): return cls.get_view(view, request, *args, **kwargs) return reduce(lambda func, dec: dec(func), cls._meta.decorators, inner) class Meta(object): url_prefix = '' decorators = []