Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / _common.py @ 44f510e1

History | View | Annotate | Download (8.7 kB)

1 a3c6203c Giorgos Korfiatis
# Copyright 2012, 2013 GRNET S.A. All rights reserved.
2 397d5cbe Giorgos Verigakis
#
3 397d5cbe Giorgos Verigakis
# Redistribution and use in source and binary forms, with or
4 397d5cbe Giorgos Verigakis
# without modification, are permitted provided that the following
5 397d5cbe Giorgos Verigakis
# conditions are met:
6 397d5cbe Giorgos Verigakis
#
7 397d5cbe Giorgos Verigakis
#   1. Redistributions of source code must retain the above
8 397d5cbe Giorgos Verigakis
#      copyright notice, this list of conditions and the following
9 397d5cbe Giorgos Verigakis
#      disclaimer.
10 397d5cbe Giorgos Verigakis
#
11 397d5cbe Giorgos Verigakis
#   2. Redistributions in binary form must reproduce the above
12 397d5cbe Giorgos Verigakis
#      copyright notice, this list of conditions and the following
13 397d5cbe Giorgos Verigakis
#      disclaimer in the documentation and/or other materials
14 397d5cbe Giorgos Verigakis
#      provided with the distribution.
15 397d5cbe Giorgos Verigakis
#
16 397d5cbe Giorgos Verigakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 397d5cbe Giorgos Verigakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 397d5cbe Giorgos Verigakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 397d5cbe Giorgos Verigakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 397d5cbe Giorgos Verigakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 397d5cbe Giorgos Verigakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 397d5cbe Giorgos Verigakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 397d5cbe Giorgos Verigakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 397d5cbe Giorgos Verigakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 397d5cbe Giorgos Verigakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 397d5cbe Giorgos Verigakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 397d5cbe Giorgos Verigakis
# POSSIBILITY OF SUCH DAMAGE.
28 397d5cbe Giorgos Verigakis
#
29 397d5cbe Giorgos Verigakis
# The views and conclusions contained in the software and
30 397d5cbe Giorgos Verigakis
# documentation are those of the authors and should not be
31 397d5cbe Giorgos Verigakis
# interpreted as representing official policies, either expressed
32 397d5cbe Giorgos Verigakis
# or implied, of GRNET S.A.
33 397d5cbe Giorgos Verigakis
34 397d5cbe Giorgos Verigakis
from datetime import datetime
35 db8cfc97 Giorgos Korfiatis
import uuid
36 397d5cbe Giorgos Verigakis
37 db8cfc97 Giorgos Korfiatis
from django.core.validators import validate_email
38 397d5cbe Giorgos Verigakis
from django.utils.timesince import timesince, timeuntil
39 30dc8c1a Sofia Papagiannaki
from django.contrib.auth.models import Permission
40 30dc8c1a Sofia Papagiannaki
from django.contrib.contenttypes.models import ContentType
41 56b9989a Giorgos Korfiatis
from django.core.exceptions import FieldError
42 56b9989a Giorgos Korfiatis
from django.core.management import CommandError
43 397d5cbe Giorgos Verigakis
44 44f510e1 Giorgos Korfiatis
from synnefo.util import units
45 a3c6203c Giorgos Korfiatis
from synnefo.lib.ordereddict import OrderedDict
46 397d5cbe Giorgos Verigakis
from astakos.im.models import AstakosUser
47 44f510e1 Giorgos Korfiatis
from astakos.im.resources import get_resources
48 397d5cbe Giorgos Verigakis
49 9a06d96f Olga Brani
DEFAULT_CONTENT_TYPE = None
50 397d5cbe Giorgos Verigakis
51 5ce3ce4f Sofia Papagiannaki
52 0a569195 Sofia Papagiannaki
def get_user(email_or_id, **kwargs):
53 397d5cbe Giorgos Verigakis
    try:
54 397d5cbe Giorgos Verigakis
        if email_or_id.isdigit():
55 397d5cbe Giorgos Verigakis
            return AstakosUser.objects.get(id=int(email_or_id))
56 397d5cbe Giorgos Verigakis
        else:
57 789a5951 Sofia Papagiannaki
            return AstakosUser.objects.get(email__iexact=email_or_id, **kwargs)
58 0a569195 Sofia Papagiannaki
    except AstakosUser.DoesNotExist, AstakosUser.MultipleObjectsReturned:
59 397d5cbe Giorgos Verigakis
        return None
60 397d5cbe Giorgos Verigakis
61 5ce3ce4f Sofia Papagiannaki
62 397d5cbe Giorgos Verigakis
def format_bool(b):
63 397d5cbe Giorgos Verigakis
    return 'YES' if b else 'NO'
64 397d5cbe Giorgos Verigakis
65 397d5cbe Giorgos Verigakis
66 397d5cbe Giorgos Verigakis
def format_date(d):
67 397d5cbe Giorgos Verigakis
    if not d:
68 397d5cbe Giorgos Verigakis
        return ''
69 397d5cbe Giorgos Verigakis
70 397d5cbe Giorgos Verigakis
    if d < datetime.now():
71 397d5cbe Giorgos Verigakis
        return timesince(d) + ' ago'
72 397d5cbe Giorgos Verigakis
    else:
73 397d5cbe Giorgos Verigakis
        return 'in ' + timeuntil(d)
74 30dc8c1a Sofia Papagiannaki
75 865849d7 Giorgos Korfiatis
76 437c0052 Sofia Papagiannaki
def format_dict(d, level=1, ident=22):
77 a3c6203c Giorgos Korfiatis
    iteritems = d.iteritems()
78 a3c6203c Giorgos Korfiatis
    if not isinstance(d, OrderedDict):
79 a3c6203c Giorgos Korfiatis
        iteritems = sorted(iteritems)
80 a3c6203c Giorgos Korfiatis
81 a3c6203c Giorgos Korfiatis
    l = ['%s: %s\n' % (k.rjust(level*ident), format(v, level+1))
82 a3c6203c Giorgos Korfiatis
         for k, v in iteritems]
83 437c0052 Sofia Papagiannaki
    l.insert(0, '\n')
84 437c0052 Sofia Papagiannaki
    return ''.join(l)
85 437c0052 Sofia Papagiannaki
86 865849d7 Giorgos Korfiatis
87 437c0052 Sofia Papagiannaki
def format_set(s):
88 437c0052 Sofia Papagiannaki
    return list(s)
89 437c0052 Sofia Papagiannaki
90 865849d7 Giorgos Korfiatis
91 437c0052 Sofia Papagiannaki
def format(obj, level=1, ident=22):
92 437c0052 Sofia Papagiannaki
    if isinstance(obj, bool):
93 437c0052 Sofia Papagiannaki
        return format_bool(obj)
94 437c0052 Sofia Papagiannaki
    elif isinstance(obj, datetime):
95 437c0052 Sofia Papagiannaki
        return format_date(obj)
96 437c0052 Sofia Papagiannaki
    elif isinstance(obj, dict):
97 437c0052 Sofia Papagiannaki
        return format_dict(obj, level, ident)
98 437c0052 Sofia Papagiannaki
    elif isinstance(obj, set):
99 437c0052 Sofia Papagiannaki
        return format_set(obj)
100 437c0052 Sofia Papagiannaki
    else:
101 437c0052 Sofia Papagiannaki
        return obj
102 5ce3ce4f Sofia Papagiannaki
103 865849d7 Giorgos Korfiatis
104 30dc8c1a Sofia Papagiannaki
def get_astakosuser_content_type():
105 30dc8c1a Sofia Papagiannaki
    try:
106 30dc8c1a Sofia Papagiannaki
        return ContentType.objects.get(app_label='im',
107 30dc8c1a Sofia Papagiannaki
                                       model='astakosuser')
108 30dc8c1a Sofia Papagiannaki
    except:
109 9a06d96f Olga Brani
        return DEFAULT_CONTENT_TYPE
110 5ce3ce4f Sofia Papagiannaki
111 5ce3ce4f Sofia Papagiannaki
112 30dc8c1a Sofia Papagiannaki
def add_user_permission(user, pname):
113 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
114 30dc8c1a Sofia Papagiannaki
    if user.has_perm(pname):
115 30dc8c1a Sofia Papagiannaki
        return 0, None
116 30dc8c1a Sofia Papagiannaki
    p, created = Permission.objects.get_or_create(codename=pname,
117 30dc8c1a Sofia Papagiannaki
                                                  name=pname.capitalize(),
118 30dc8c1a Sofia Papagiannaki
                                                  content_type=content_type)
119 30dc8c1a Sofia Papagiannaki
    user.user_permissions.add(p)
120 30dc8c1a Sofia Papagiannaki
    return 1, created
121 30dc8c1a Sofia Papagiannaki
122 5ce3ce4f Sofia Papagiannaki
123 30dc8c1a Sofia Papagiannaki
def add_group_permission(group, pname):
124 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
125 30dc8c1a Sofia Papagiannaki
    if pname in [p.codename for p in group.permissions.all()]:
126 30dc8c1a Sofia Papagiannaki
        return 0, None
127 30dc8c1a Sofia Papagiannaki
    content_type = ContentType.objects.get(app_label='im',
128 30dc8c1a Sofia Papagiannaki
                                           model='astakosuser')
129 30dc8c1a Sofia Papagiannaki
    p, created = Permission.objects.get_or_create(codename=pname,
130 30dc8c1a Sofia Papagiannaki
                                                  name=pname.capitalize(),
131 30dc8c1a Sofia Papagiannaki
                                                  content_type=content_type)
132 30dc8c1a Sofia Papagiannaki
    group.permissions.add(p)
133 30dc8c1a Sofia Papagiannaki
    return 1, created
134 30dc8c1a Sofia Papagiannaki
135 5ce3ce4f Sofia Papagiannaki
136 30dc8c1a Sofia Papagiannaki
def remove_user_permission(user, pname):
137 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
138 30dc8c1a Sofia Papagiannaki
    if user.has_perm(pname):
139 30dc8c1a Sofia Papagiannaki
        return 0
140 30dc8c1a Sofia Papagiannaki
    try:
141 30dc8c1a Sofia Papagiannaki
        p = Permission.objects.get(codename=pname,
142 5ce3ce4f Sofia Papagiannaki
                                   content_type=content_type)
143 30dc8c1a Sofia Papagiannaki
        user.user_permissions.remove(p)
144 30dc8c1a Sofia Papagiannaki
        return 1
145 aab4d540 Sofia Papagiannaki
    except Permission.DoesNotExist:
146 30dc8c1a Sofia Papagiannaki
        return -1
147 30dc8c1a Sofia Papagiannaki
148 5ce3ce4f Sofia Papagiannaki
149 30dc8c1a Sofia Papagiannaki
def remove_group_permission(group, pname):
150 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
151 30dc8c1a Sofia Papagiannaki
    if pname not in [p.codename for p in group.permissions.all()]:
152 30dc8c1a Sofia Papagiannaki
        return 0
153 30dc8c1a Sofia Papagiannaki
    try:
154 30dc8c1a Sofia Papagiannaki
        p = Permission.objects.get(codename=pname,
155 5ce3ce4f Sofia Papagiannaki
                                   content_type=content_type)
156 30dc8c1a Sofia Papagiannaki
        group.permissions.remove(p)
157 30dc8c1a Sofia Papagiannaki
        return 1
158 aab4d540 Sofia Papagiannaki
    except Permission.DoesNotExist:
159 5ce3ce4f Sofia Papagiannaki
        return -1
160 7eabbd72 Giorgos Korfiatis
161 865849d7 Giorgos Korfiatis
162 7eabbd72 Giorgos Korfiatis
def shortened(s, limit, suffix=True):
163 7eabbd72 Giorgos Korfiatis
    length = len(s)
164 7eabbd72 Giorgos Korfiatis
    if length <= limit:
165 7eabbd72 Giorgos Korfiatis
        return s
166 7eabbd72 Giorgos Korfiatis
    else:
167 7eabbd72 Giorgos Korfiatis
        display = limit - 2
168 7eabbd72 Giorgos Korfiatis
        if suffix:
169 7eabbd72 Giorgos Korfiatis
            return '..' + s[-display:]
170 7eabbd72 Giorgos Korfiatis
        else:
171 7eabbd72 Giorgos Korfiatis
            return s[:display] + '..'
172 56b9989a Giorgos Korfiatis
173 56b9989a Giorgos Korfiatis
174 56b9989a Giorgos Korfiatis
# Copied from snf-cyclades-app/synnefo/management/common.py
175 56b9989a Giorgos Korfiatis
# It could be moved to snf-common
176 56b9989a Giorgos Korfiatis
def filter_results(objects, filter_by):
177 56b9989a Giorgos Korfiatis
    filter_list = filter_by.split(",")
178 56b9989a Giorgos Korfiatis
    filter_dict = {}
179 56b9989a Giorgos Korfiatis
    exclude_dict = {}
180 56b9989a Giorgos Korfiatis
181 56b9989a Giorgos Korfiatis
    def map_field_type(query):
182 56b9989a Giorgos Korfiatis
        def fix_bool(val):
183 56b9989a Giorgos Korfiatis
            if val.lower() in ("yes", "true", "t"):
184 56b9989a Giorgos Korfiatis
                return True
185 56b9989a Giorgos Korfiatis
            if val.lower() in ("no", "false", "f"):
186 56b9989a Giorgos Korfiatis
                return False
187 56b9989a Giorgos Korfiatis
            return val
188 56b9989a Giorgos Korfiatis
189 56b9989a Giorgos Korfiatis
        if "!=" in query:
190 56b9989a Giorgos Korfiatis
            key, val = query.split("!=")
191 56b9989a Giorgos Korfiatis
            exclude_dict[key] = fix_bool(val)
192 56b9989a Giorgos Korfiatis
            return
193 56b9989a Giorgos Korfiatis
        OP_MAP = {
194 56b9989a Giorgos Korfiatis
            ">=": "__gte",
195 56b9989a Giorgos Korfiatis
            "=>": "__gte",
196 56b9989a Giorgos Korfiatis
            ">":  "__gt",
197 56b9989a Giorgos Korfiatis
            "<=": "__lte",
198 56b9989a Giorgos Korfiatis
            "=<": "__lte",
199 56b9989a Giorgos Korfiatis
            "<":  "__lt",
200 56b9989a Giorgos Korfiatis
            "=":  "",
201 56b9989a Giorgos Korfiatis
        }
202 56b9989a Giorgos Korfiatis
        for op, new_op in OP_MAP.items():
203 56b9989a Giorgos Korfiatis
            if op in query:
204 56b9989a Giorgos Korfiatis
                key, val = query.split(op)
205 56b9989a Giorgos Korfiatis
                filter_dict[key + new_op] = fix_bool(val)
206 56b9989a Giorgos Korfiatis
                return
207 56b9989a Giorgos Korfiatis
208 56b9989a Giorgos Korfiatis
    map(lambda x: map_field_type(x), filter_list)
209 56b9989a Giorgos Korfiatis
210 56b9989a Giorgos Korfiatis
    try:
211 56b9989a Giorgos Korfiatis
        objects = objects.filter(**filter_dict)
212 56b9989a Giorgos Korfiatis
        return objects.exclude(**exclude_dict)
213 56b9989a Giorgos Korfiatis
    except FieldError as e:
214 56b9989a Giorgos Korfiatis
        raise CommandError(e)
215 56b9989a Giorgos Korfiatis
    except Exception as e:
216 56b9989a Giorgos Korfiatis
        raise CommandError("Can not filter results: %s" % e)
217 db8cfc97 Giorgos Korfiatis
218 db8cfc97 Giorgos Korfiatis
219 db8cfc97 Giorgos Korfiatis
def is_uuid(s):
220 db8cfc97 Giorgos Korfiatis
    if s is None:
221 db8cfc97 Giorgos Korfiatis
        return False
222 db8cfc97 Giorgos Korfiatis
    try:
223 db8cfc97 Giorgos Korfiatis
        uuid.UUID(s)
224 db8cfc97 Giorgos Korfiatis
    except ValueError:
225 db8cfc97 Giorgos Korfiatis
        return False
226 db8cfc97 Giorgos Korfiatis
    else:
227 db8cfc97 Giorgos Korfiatis
        return True
228 db8cfc97 Giorgos Korfiatis
229 db8cfc97 Giorgos Korfiatis
230 db8cfc97 Giorgos Korfiatis
def is_email(s):
231 db8cfc97 Giorgos Korfiatis
    if s is None:
232 db8cfc97 Giorgos Korfiatis
        return False
233 db8cfc97 Giorgos Korfiatis
    try:
234 db8cfc97 Giorgos Korfiatis
        validate_email(s)
235 db8cfc97 Giorgos Korfiatis
    except:
236 db8cfc97 Giorgos Korfiatis
        return False
237 db8cfc97 Giorgos Korfiatis
    else:
238 db8cfc97 Giorgos Korfiatis
        return True
239 91eca048 Giorgos Korfiatis
240 91eca048 Giorgos Korfiatis
241 44f510e1 Giorgos Korfiatis
style_options = ', '.join(units.STYLES)
242 44f510e1 Giorgos Korfiatis
243 44f510e1 Giorgos Korfiatis
244 44f510e1 Giorgos Korfiatis
def check_style(style):
245 44f510e1 Giorgos Korfiatis
    if style not in units.STYLES:
246 44f510e1 Giorgos Korfiatis
        m = "Invalid unit style. Valid ones are %s." % style_options
247 44f510e1 Giorgos Korfiatis
        raise CommandError(m)
248 44f510e1 Giorgos Korfiatis
249 44f510e1 Giorgos Korfiatis
250 44f510e1 Giorgos Korfiatis
class ResourceDict(object):
251 44f510e1 Giorgos Korfiatis
    _object = None
252 44f510e1 Giorgos Korfiatis
253 44f510e1 Giorgos Korfiatis
    @classmethod
254 44f510e1 Giorgos Korfiatis
    def get(cls):
255 44f510e1 Giorgos Korfiatis
        if cls._object is None:
256 44f510e1 Giorgos Korfiatis
            cls._object = get_resources()
257 44f510e1 Giorgos Korfiatis
        return cls._object
258 44f510e1 Giorgos Korfiatis
259 44f510e1 Giorgos Korfiatis
260 44f510e1 Giorgos Korfiatis
def show_resource_value(number, resource, style):
261 44f510e1 Giorgos Korfiatis
    resource_dict = ResourceDict.get()
262 44f510e1 Giorgos Korfiatis
    unit = resource_dict[resource]['unit']
263 44f510e1 Giorgos Korfiatis
    return units.show(number, unit, style)
264 44f510e1 Giorgos Korfiatis
265 44f510e1 Giorgos Korfiatis
266 44f510e1 Giorgos Korfiatis
def show_quotas(qh_quotas, astakos_initial, info=None, style=None):
267 764d99c4 Giorgos Korfiatis
    labels = ('source', 'resource', 'base quota', 'total quota', 'usage')
268 91eca048 Giorgos Korfiatis
    if info is not None:
269 91eca048 Giorgos Korfiatis
        labels = ('uuid', 'email') + labels
270 91eca048 Giorgos Korfiatis
271 91eca048 Giorgos Korfiatis
    print_data = []
272 91eca048 Giorgos Korfiatis
    for holder, holder_quotas in qh_quotas.iteritems():
273 91eca048 Giorgos Korfiatis
        h_initial = astakos_initial.get(holder)
274 91eca048 Giorgos Korfiatis
        if info is not None:
275 91eca048 Giorgos Korfiatis
            email = info.get(holder, "")
276 91eca048 Giorgos Korfiatis
277 91eca048 Giorgos Korfiatis
        for source, source_quotas in holder_quotas.iteritems():
278 91eca048 Giorgos Korfiatis
            s_initial = h_initial.get(source) if h_initial else None
279 91eca048 Giorgos Korfiatis
            for resource, values in source_quotas.iteritems():
280 91eca048 Giorgos Korfiatis
                initial = s_initial.get(resource) if s_initial else None
281 44f510e1 Giorgos Korfiatis
                initial = show_resource_value(initial, resource, style)
282 44f510e1 Giorgos Korfiatis
                limit = show_resource_value(values['limit'], resource, style)
283 44f510e1 Giorgos Korfiatis
                usage = show_resource_value(values['usage'], resource, style)
284 44f510e1 Giorgos Korfiatis
                fields = (source, resource, initial, limit, usage)
285 91eca048 Giorgos Korfiatis
                if info is not None:
286 91eca048 Giorgos Korfiatis
                    fields = (holder, email) + fields
287 91eca048 Giorgos Korfiatis
288 91eca048 Giorgos Korfiatis
                print_data.append(fields)
289 91eca048 Giorgos Korfiatis
    return print_data, labels