~doctormo/erato/trunk

« back to all changes in this revision

Viewing changes to art_website/common/shortcuts.py

  • Committer: Martin Owens
  • Date: 2010-10-20 20:33:00 UTC
  • Revision ID: doctormo@gmail.com-20101020203300-9vsolpbwc2tbcxoc
Manual merge in changes from designhub branch for common directory.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#
2
 
# Copyright 2010, Martin Owens and Adnane Belmadiaf.
3
 
#
4
 
# This program is free software: you can redistribute it and/or modify
5
 
# it under the terms of the GNU Affero General Public License as
6
 
# published by the Free Software Foundation, either version 3 of the
7
 
# License, or (at your option) any later version.
8
 
#
9
 
# This program is distributed in the hope that it will be useful,
10
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
# GNU Affero General Public License for more details.
13
 
#
14
 
# You should have received a copy of the GNU Affero General Public License
15
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
 
#
17
 
 
18
 
"""
19
 
Lifted from Django 1.1.1 for loco-directory
20
 
 
21
 
This module collects helper functions and classes that "span" multiple levels
22
 
of MVC. In other words, these functions/classes introduce controlled coupling
23
 
for convenience's sake.
24
 
"""
25
 
 
26
 
from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
27
 
from django.core import urlresolvers
28
 
 
29
 
def redirect(to, *args, **kwargs):
30
 
    """
31
 
    Returns an HttpResponseRedirect to the apropriate URL for the arguments
32
 
    passed.
33
 
    
34
 
    The arguments could be:
35
 
    
36
 
        * A model: the model's `get_absolute_url()` function will be called.
37
 
    
38
 
        * A view name, possibly with arguments: `urlresolvers.reverse()` will
39
 
          be used to reverse-resolve the name.
40
 
         
41
 
        * A URL, which will be used as-is for the redirect location.
42
 
        
43
 
    By default issues a temporary redirect; pass permanent=True to issue a
44
 
    permanent redirect
45
 
    """
46
 
    if kwargs.pop('permanent', False):
47
 
        redirect_class = HttpResponsePermanentRedirect
48
 
    else:
49
 
        redirect_class = HttpResponseRedirect
50
 
    
51
 
    # If it's a model, use get_absolute_url()
52
 
    if hasattr(to, 'get_absolute_url'):
53
 
        return redirect_class(to.get_absolute_url())
54
 
    
55
 
    # Next try a reverse URL resolution.
56
 
    try:
57
 
        return redirect_class(urlresolvers.reverse(to, args=args, kwargs=kwargs))
58
 
    except urlresolvers.NoReverseMatch:
59
 
        # If this doesn't "feel" like a URL, re-raise.
60
 
        if '/' not in to and '.' not in to:
61
 
            raise
62
 
        
63
 
    # Finally, fall back and assume it's a URL
64
 
    return redirect_class(to)
65
 
 
66
 
 
67
 
def queryset_sum(field, qs):
68
 
    """
69
 
    Returns the summation of the values in the given field of the queryset
70
 
    Work around for missing QuerySet.aggregate() in Django 1.0
71
 
    """
72
 
    sum = 0
73
 
    for r in qs:
74
 
        if hasattr(r, field):
75
 
            f = getattr(r, field)
76
 
            if f is not None and isinstance(f, (int, float, long)):
77
 
                sum = sum + f
78
 
            else:
79
 
                raise TypeError
80
 
        else:
81
 
            raise AttributeError
82
 
    return sum
83
 
 
84
 
def queryset_count(field, qs):
85
 
    """
86
 
    Returns the number of non-null the values in the given field of the queryset
87
 
    Work around for missing QuerySet.aggregate() in Django 1.0
88
 
    """
89
 
    count = 0
90
 
    for r in qs:
91
 
        if hasattr(r, field):
92
 
            f = getattr(r, field)
93
 
            if f is not None:
94
 
                count = count + 1
95
 
            else:
96
 
                raise TypeError
97
 
        else:
98
 
            raise AttributeError
99
 
    return count