Decorate every view in a url tree

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
'''
Author: Stephen J. Zabel
License: BSD

This module exposed a helper function for
wrapping views at the urls.py/resolver level

My personal little itch as an example...

urlpatterns += required(
    login_required,
    patterns('',
        (r'^api/', 
            include(api.urls)),
    )
)
'''


def required(wrapping_functions,patterns_rslt):
    '''
    Used to require 1..n decorators in any view returned by a url tree

    Usage:
      urlpatterns = required(func,patterns(...))
      urlpatterns = required((func,func,func),patterns(...))

    Note:
      Use functools.partial to pass keyword params to the required 
      decorators. If you need to pass args you will have to write a 
      wrapper function.

    Example:
      from functools import partial

      urlpatterns = required(
          partial(login_required,login_url='/accounts/login/'),
          patterns(...)
      )
    '''
    if not hasattr(wrapping_functions,'__iter__'): 
        wrapping_functions = (wrapping_functions,)

    return [
        _wrap_instance__resolve(wrapping_functions,instance)
        for instance in patterns_rslt
    ]

def _wrap_instance__resolve(wrapping_functions,instance):
    if not hasattr(instance,'resolve'): return instance
    resolve = getattr(instance,'resolve')

    def _wrap_func_in_returned_resolver_match(*args,**kwargs):
        rslt = resolve(*args,**kwargs)

        if not hasattr(rslt,'func'):return rslt
        f = getattr(rslt,'func')

        for _f in reversed(wrapping_functions):
            # @decorate the function from inner to outter
            f = _f(f)

        setattr(rslt,'func',f)

        return rslt

    setattr(instance,'resolve',_wrap_func_in_returned_resolver_match)

    return instance

More like this

  1. is_staff decorator by munhitsu 5 years, 8 months ago
  2. Require Login Middleware by mattgrayson 5 years, 5 months ago
  3. Decorating urlpatterns by miracle2k 6 years, 3 months ago
  4. View Redirect Decorators by bryanpieper 3 years, 9 months ago
  5. A action decorator for URLs by Batiste 6 years ago

Comments

sjzabel (on November 18, 2011):

also available at https://gist.github.com/1378003

#

(Forgotten your password?)