Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / templatetags / filters.py @ 6795eb09

History | View | Annotate | Download (6 kB)

1 ebd369d0 Sofia Papagiannaki
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 ebd369d0 Sofia Papagiannaki
#
3 ebd369d0 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
4 ebd369d0 Sofia Papagiannaki
# without modification, are permitted provided that the following
5 ebd369d0 Sofia Papagiannaki
# conditions are met:
6 ebd369d0 Sofia Papagiannaki
#
7 ebd369d0 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
8 ebd369d0 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
9 ebd369d0 Sofia Papagiannaki
#      disclaimer.
10 ebd369d0 Sofia Papagiannaki
#
11 ebd369d0 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
12 ebd369d0 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
13 ebd369d0 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
14 ebd369d0 Sofia Papagiannaki
#      provided with the distribution.
15 ebd369d0 Sofia Papagiannaki
#
16 ebd369d0 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 ebd369d0 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 ebd369d0 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 ebd369d0 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 ebd369d0 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 ebd369d0 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 ebd369d0 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 ebd369d0 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 ebd369d0 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 ebd369d0 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 ebd369d0 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 ebd369d0 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
28 ebd369d0 Sofia Papagiannaki
#
29 ebd369d0 Sofia Papagiannaki
# The views and conclusions contained in the software and
30 ebd369d0 Sofia Papagiannaki
# documentation are those of the authors and should not be
31 ebd369d0 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
32 ebd369d0 Sofia Papagiannaki
# or implied, of GRNET S.A.
33 ebd369d0 Sofia Papagiannaki
34 5056da3d Olga Brani
import calendar
35 5056da3d Olga Brani
import datetime
36 5841646f Olga Brani
import math
37 ebd369d0 Sofia Papagiannaki
38 dfdc64d2 Sofia Papagiannaki
from collections import defaultdict
39 dfdc64d2 Sofia Papagiannaki
40 d220292f Sofia Papagiannaki
from django import template
41 25b51727 Sofia Papagiannaki
from django.core.paginator import Paginator, EmptyPage
42 2c4b2a96 Sofia Papagiannaki
from django.db.models.query import QuerySet
43 d220292f Sofia Papagiannaki
44 5841646f Olga Brani
45 172ce682 Sofia Papagiannaki
from astakos.im.settings import PAGINATE_BY, RESOURCES_PRESENTATION_DATA
46 8327782d Sofia Papagiannaki
from astakos.im.models import RESOURCE_SEPARATOR
47 5841646f Olga Brani
48 ebd369d0 Sofia Papagiannaki
register = template.Library()
49 ebd369d0 Sofia Papagiannaki
50 661c4479 Sofia Papagiannaki
DELIM = ','
51 661c4479 Sofia Papagiannaki
52 5056da3d Olga Brani
@register.filter
53 5056da3d Olga Brani
def monthssince(joined_date):
54 5056da3d Olga Brani
    now = datetime.datetime.now()
55 9a06d96f Olga Brani
    date = datetime.datetime(
56 9a06d96f Olga Brani
        year=joined_date.year, month=joined_date.month, day=1)
57 5056da3d Olga Brani
    months = []
58 9a06d96f Olga Brani
59 5056da3d Olga Brani
    month = date.month
60 5056da3d Olga Brani
    year = date.year
61 9a06d96f Olga Brani
    timestamp = calendar.timegm(date.utctimetuple())
62 9a06d96f Olga Brani
63 5056da3d Olga Brani
    while date < now:
64 5056da3d Olga Brani
        months.append((year, month, timestamp))
65 9a06d96f Olga Brani
66 5056da3d Olga Brani
        if date.month < 12:
67 5056da3d Olga Brani
            month = date.month + 1
68 5056da3d Olga Brani
            year = date.year
69 5056da3d Olga Brani
        else:
70 5056da3d Olga Brani
            month = 1
71 5056da3d Olga Brani
            year = date.year + 1
72 9a06d96f Olga Brani
73 5056da3d Olga Brani
        date = datetime.datetime(year=year, month=month, day=1)
74 9a06d96f Olga Brani
        timestamp = calendar.timegm(date.utctimetuple())
75 9a06d96f Olga Brani
76 5056da3d Olga Brani
    return months
77 9a06d96f Olga Brani
78 e8fd06f6 Sofia Papagiannaki
@register.filter
79 e8fd06f6 Sofia Papagiannaki
def to_unicode(s):
80 e8fd06f6 Sofia Papagiannaki
    return unicode(s)
81 e8fd06f6 Sofia Papagiannaki
82 e8fd06f6 Sofia Papagiannaki
@register.filter
83 e8fd06f6 Sofia Papagiannaki
def to_string(s):
84 e8fd06f6 Sofia Papagiannaki
    return str(s)
85 9a06d96f Olga Brani
86 ebd369d0 Sofia Papagiannaki
@register.filter
87 ebd369d0 Sofia Papagiannaki
def lookup(d, key):
88 6556e514 Sofia Papagiannaki
    try:
89 6556e514 Sofia Papagiannaki
        return d.get(key)
90 6556e514 Sofia Papagiannaki
    except:
91 6556e514 Sofia Papagiannaki
        return
92 d68590fd Sofia Papagiannaki
93 bdc1c103 Olga Brani
@register.filter
94 bdc1c103 Olga Brani
def lookup_uni(d, key):
95 bdc1c103 Olga Brani
    return d.get(unicode(key))
96 bdc1c103 Olga Brani
97 5ce3ce4f Sofia Papagiannaki
98 d68590fd Sofia Papagiannaki
@register.filter
99 d68590fd Sofia Papagiannaki
def dkeys(d):
100 b27c104d Olga Brani
    return d.keys()
101 b27c104d Olga Brani
102 5ce3ce4f Sofia Papagiannaki
103 b27c104d Olga Brani
@register.filter
104 5056da3d Olga Brani
def month_name(month_number):
105 5056da3d Olga Brani
    return calendar.month_name[month_number]
106 9a06d96f Olga Brani
107 5056da3d Olga Brani
108 5056da3d Olga Brani
@register.filter
109 9a06d96f Olga Brani
def todate(value, arg=''):
110 5056da3d Olga Brani
    secs = int(value) / 1000
111 789bcaf9 Sofia Papagiannaki
    return datetime.datetime.fromtimestamp(secs)
112 789bcaf9 Sofia Papagiannaki
113 789bcaf9 Sofia Papagiannaki
114 caf70869 Sofia Papagiannaki
# @register.filter
115 caf70869 Sofia Papagiannaki
# def rcut(value, chars='/'):
116 caf70869 Sofia Papagiannaki
#     return value.rstrip(chars)
117 661c4479 Sofia Papagiannaki
118 9a06d96f Olga Brani
119 f2a4ce70 Sofia Papagiannaki
@register.filter
120 f2a4ce70 Sofia Papagiannaki
def paginate(l, args):
121 c0b26605 Sofia Papagiannaki
    l = l or []
122 c0b26605 Sofia Papagiannaki
    page, delim, sorting = args.partition(DELIM)
123 c0b26605 Sofia Papagiannaki
    if sorting:
124 c0b26605 Sofia Papagiannaki
        if isinstance(l, QuerySet):
125 c0b26605 Sofia Papagiannaki
            l = l.order_by(sorting)
126 c0b26605 Sofia Papagiannaki
        elif isinstance(l, list):
127 c0b26605 Sofia Papagiannaki
            default = ''
128 c0b26605 Sofia Papagiannaki
            if sorting.endswith('_date'):
129 c0b26605 Sofia Papagiannaki
                default = datetime.datetime.utcfromtimestamp(0)
130 c0b26605 Sofia Papagiannaki
            l.sort(key=lambda i: getattr(i, sorting)
131 c0b26605 Sofia Papagiannaki
                   if getattr(i, sorting) else default)
132 c0b26605 Sofia Papagiannaki
    paginator = Paginator(l, PAGINATE_BY)
133 c0b26605 Sofia Papagiannaki
    try:
134 c0b26605 Sofia Papagiannaki
        paginator.len
135 c0b26605 Sofia Papagiannaki
    except AttributeError:
136 c0b26605 Sofia Papagiannaki
        paginator._count = len(list(l))
137 6795eb09 Kostas Papadimitriou
138 c0b26605 Sofia Papagiannaki
    try:
139 c0b26605 Sofia Papagiannaki
        page_number = int(page)
140 c0b26605 Sofia Papagiannaki
    except ValueError:
141 c0b26605 Sofia Papagiannaki
        if page == 'last':
142 c0b26605 Sofia Papagiannaki
            page_number = paginator.num_pages
143 c0b26605 Sofia Papagiannaki
        else:
144 c0b26605 Sofia Papagiannaki
            page_number = 1
145 c0b26605 Sofia Papagiannaki
    try:
146 c0b26605 Sofia Papagiannaki
        page = paginator.page(page_number)
147 c0b26605 Sofia Papagiannaki
    except EmptyPage:
148 c0b26605 Sofia Papagiannaki
        page = paginator.page(1)
149 c0b26605 Sofia Papagiannaki
    return page
150 661c4479 Sofia Papagiannaki
151 9a06d96f Olga Brani
152 661c4479 Sofia Papagiannaki
@register.filter
153 661c4479 Sofia Papagiannaki
def concat(str1, str2):
154 661c4479 Sofia Papagiannaki
    if not str2:
155 661c4479 Sofia Papagiannaki
        return str(str1)
156 dfdc64d2 Sofia Papagiannaki
    return '%s%s%s' % (str1, DELIM, str2)
157 dfdc64d2 Sofia Papagiannaki
158 9a06d96f Olga Brani
159 dfdc64d2 Sofia Papagiannaki
@register.filter
160 dfdc64d2 Sofia Papagiannaki
def items(d):
161 dfdc64d2 Sofia Papagiannaki
    if isinstance(d, defaultdict):
162 dfdc64d2 Sofia Papagiannaki
        return d.iteritems()
163 9a06d96f Olga Brani
    return d
164 ed2f0452 Olga Brani
165 ed2f0452 Olga Brani
166 ed2f0452 Olga Brani
@register.filter
167 ed2f0452 Olga Brani
def get_value_after_dot(value):
168 7c76af95 Olga Brani
    return value.split(".")[1]
169 7c76af95 Olga Brani
170 84d26d62 Sofia Papagiannaki
# @register.filter
171 84d26d62 Sofia Papagiannaki
# def strip_http(value):
172 84d26d62 Sofia Papagiannaki
#     return value.replace('http://','')[:-1]
173 dcd1c383 Olga Brani
174 dcd1c383 Olga Brani
175 dcd1c383 Olga Brani
from math import log
176 bdc1c103 Olga Brani
unit_list = zip(['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], [0, 0, 0, 0, 0, 0])
177 dcd1c383 Olga Brani
178 dcd1c383 Olga Brani
@register.filter
179 dcd1c383 Olga Brani
def sizeof_fmt(num):
180 dcd1c383 Olga Brani
    """Human friendly file size"""
181 172ce682 Sofia Papagiannaki
    try:
182 172ce682 Sofia Papagiannaki
        num = float(num)
183 172ce682 Sofia Papagiannaki
    except:
184 172ce682 Sofia Papagiannaki
        return
185 dcd1c383 Olga Brani
    else:
186 172ce682 Sofia Papagiannaki
        if math.isinf(num):
187 172ce682 Sofia Papagiannaki
            return 'Unlimited'
188 172ce682 Sofia Papagiannaki
        if num > 1:
189 172ce682 Sofia Papagiannaki
            exponent = min(int(log(num, 1024)), len(unit_list) - 1)
190 172ce682 Sofia Papagiannaki
            quotient = float(num) / 1024**exponent
191 172ce682 Sofia Papagiannaki
            unit, num_decimals = unit_list[exponent]
192 172ce682 Sofia Papagiannaki
            format_string = '{0:.%sf} {1}' % (num_decimals)
193 172ce682 Sofia Papagiannaki
            return format_string.format(quotient, unit)
194 172ce682 Sofia Papagiannaki
        if num == 0:
195 172ce682 Sofia Papagiannaki
            return '0 bytes'
196 172ce682 Sofia Papagiannaki
        if num == 1:
197 172ce682 Sofia Papagiannaki
            return '1 byte'
198 172ce682 Sofia Papagiannaki
        else:
199 172ce682 Sofia Papagiannaki
           return '0'
200 6795eb09 Kostas Papadimitriou
201 5841646f Olga Brani
@register.filter
202 5841646f Olga Brani
def isinf(v):
203 5841646f Olga Brani
    if math.isinf(v):
204 5841646f Olga Brani
        return 'Unlimited'
205 5841646f Olga Brani
    else:
206 59728d4e Olga Brani
        return v
207 6795eb09 Kostas Papadimitriou
208 59728d4e Olga Brani
@register.filter
209 6795eb09 Kostas Papadimitriou
def truncatename(v, max=18, append="..."):
210 59728d4e Olga Brani
    length = len(v)
211 59728d4e Olga Brani
    if length>max:
212 6795eb09 Kostas Papadimitriou
        return v[:max] + append
213 59728d4e Olga Brani
    else:
214 6795eb09 Kostas Papadimitriou
        return v
215 8327782d Sofia Papagiannaki
216 8327782d Sofia Papagiannaki
@register.filter
217 8327782d Sofia Papagiannaki
def resource_groups(project_definition):
218 8327782d Sofia Papagiannaki
    try:
219 8327782d Sofia Papagiannaki
        grants = project_definition.projectresourcegrant_set
220 8327782d Sofia Papagiannaki
        return grants.values_list('resource__group', flat=True)
221 8327782d Sofia Papagiannaki
    except:
222 8327782d Sofia Papagiannaki
        return ()
223 8327782d Sofia Papagiannaki
224 8327782d Sofia Papagiannaki
@register.filter
225 8327782d Sofia Papagiannaki
def resource_grants(project_definition):
226 8327782d Sofia Papagiannaki
    try:
227 8327782d Sofia Papagiannaki
        grants = project_definition.projectresourcegrant_set
228 8327782d Sofia Papagiannaki
        grants = grants.values_list(
229 8327782d Sofia Papagiannaki
            'resource__name',
230 8327782d Sofia Papagiannaki
            'resource__service__name',
231 73fbaec4 Sofia Papagiannaki
            'member_capacity'
232 8327782d Sofia Papagiannaki
        )
233 8327782d Sofia Papagiannaki
        return dict((RESOURCE_SEPARATOR.join([e[1], e[0]]), e[2]) for e in grants)
234 8327782d Sofia Papagiannaki
    except:
235 172ce682 Sofia Papagiannaki
        return {}