Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / _common.py @ 398a9604

History | View | Annotate | Download (7.8 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 a3c6203c Giorgos Korfiatis
from synnefo.lib.ordereddict import OrderedDict
45 397d5cbe Giorgos Verigakis
from astakos.im.models import AstakosUser
46 397d5cbe Giorgos Verigakis
47 9a06d96f Olga Brani
DEFAULT_CONTENT_TYPE = None
48 397d5cbe Giorgos Verigakis
49 5ce3ce4f Sofia Papagiannaki
50 0a569195 Sofia Papagiannaki
def get_user(email_or_id, **kwargs):
51 397d5cbe Giorgos Verigakis
    try:
52 397d5cbe Giorgos Verigakis
        if email_or_id.isdigit():
53 397d5cbe Giorgos Verigakis
            return AstakosUser.objects.get(id=int(email_or_id))
54 397d5cbe Giorgos Verigakis
        else:
55 789a5951 Sofia Papagiannaki
            return AstakosUser.objects.get(email__iexact=email_or_id, **kwargs)
56 0a569195 Sofia Papagiannaki
    except AstakosUser.DoesNotExist, AstakosUser.MultipleObjectsReturned:
57 397d5cbe Giorgos Verigakis
        return None
58 397d5cbe Giorgos Verigakis
59 5ce3ce4f Sofia Papagiannaki
60 397d5cbe Giorgos Verigakis
def format_bool(b):
61 397d5cbe Giorgos Verigakis
    return 'YES' if b else 'NO'
62 397d5cbe Giorgos Verigakis
63 397d5cbe Giorgos Verigakis
64 397d5cbe Giorgos Verigakis
def format_date(d):
65 397d5cbe Giorgos Verigakis
    if not d:
66 397d5cbe Giorgos Verigakis
        return ''
67 397d5cbe Giorgos Verigakis
68 397d5cbe Giorgos Verigakis
    if d < datetime.now():
69 397d5cbe Giorgos Verigakis
        return timesince(d) + ' ago'
70 397d5cbe Giorgos Verigakis
    else:
71 397d5cbe Giorgos Verigakis
        return 'in ' + timeuntil(d)
72 30dc8c1a Sofia Papagiannaki
73 865849d7 Giorgos Korfiatis
74 437c0052 Sofia Papagiannaki
def format_dict(d, level=1, ident=22):
75 a3c6203c Giorgos Korfiatis
    iteritems = d.iteritems()
76 a3c6203c Giorgos Korfiatis
    if not isinstance(d, OrderedDict):
77 a3c6203c Giorgos Korfiatis
        iteritems = sorted(iteritems)
78 a3c6203c Giorgos Korfiatis
79 a3c6203c Giorgos Korfiatis
    l = ['%s: %s\n' % (k.rjust(level*ident), format(v, level+1))
80 a3c6203c Giorgos Korfiatis
         for k, v in iteritems]
81 437c0052 Sofia Papagiannaki
    l.insert(0, '\n')
82 437c0052 Sofia Papagiannaki
    return ''.join(l)
83 437c0052 Sofia Papagiannaki
84 865849d7 Giorgos Korfiatis
85 437c0052 Sofia Papagiannaki
def format_set(s):
86 437c0052 Sofia Papagiannaki
    return list(s)
87 437c0052 Sofia Papagiannaki
88 865849d7 Giorgos Korfiatis
89 437c0052 Sofia Papagiannaki
def format(obj, level=1, ident=22):
90 437c0052 Sofia Papagiannaki
    if isinstance(obj, bool):
91 437c0052 Sofia Papagiannaki
        return format_bool(obj)
92 437c0052 Sofia Papagiannaki
    elif isinstance(obj, datetime):
93 437c0052 Sofia Papagiannaki
        return format_date(obj)
94 437c0052 Sofia Papagiannaki
    elif isinstance(obj, dict):
95 437c0052 Sofia Papagiannaki
        return format_dict(obj, level, ident)
96 437c0052 Sofia Papagiannaki
    elif isinstance(obj, set):
97 437c0052 Sofia Papagiannaki
        return format_set(obj)
98 437c0052 Sofia Papagiannaki
    else:
99 437c0052 Sofia Papagiannaki
        return obj
100 5ce3ce4f Sofia Papagiannaki
101 865849d7 Giorgos Korfiatis
102 30dc8c1a Sofia Papagiannaki
def get_astakosuser_content_type():
103 30dc8c1a Sofia Papagiannaki
    try:
104 30dc8c1a Sofia Papagiannaki
        return ContentType.objects.get(app_label='im',
105 30dc8c1a Sofia Papagiannaki
                                       model='astakosuser')
106 30dc8c1a Sofia Papagiannaki
    except:
107 9a06d96f Olga Brani
        return DEFAULT_CONTENT_TYPE
108 5ce3ce4f Sofia Papagiannaki
109 5ce3ce4f Sofia Papagiannaki
110 30dc8c1a Sofia Papagiannaki
def add_user_permission(user, pname):
111 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
112 30dc8c1a Sofia Papagiannaki
    if user.has_perm(pname):
113 30dc8c1a Sofia Papagiannaki
        return 0, None
114 30dc8c1a Sofia Papagiannaki
    p, created = Permission.objects.get_or_create(codename=pname,
115 30dc8c1a Sofia Papagiannaki
                                                  name=pname.capitalize(),
116 30dc8c1a Sofia Papagiannaki
                                                  content_type=content_type)
117 30dc8c1a Sofia Papagiannaki
    user.user_permissions.add(p)
118 30dc8c1a Sofia Papagiannaki
    return 1, created
119 30dc8c1a Sofia Papagiannaki
120 5ce3ce4f Sofia Papagiannaki
121 30dc8c1a Sofia Papagiannaki
def add_group_permission(group, pname):
122 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
123 30dc8c1a Sofia Papagiannaki
    if pname in [p.codename for p in group.permissions.all()]:
124 30dc8c1a Sofia Papagiannaki
        return 0, None
125 30dc8c1a Sofia Papagiannaki
    content_type = ContentType.objects.get(app_label='im',
126 30dc8c1a Sofia Papagiannaki
                                           model='astakosuser')
127 30dc8c1a Sofia Papagiannaki
    p, created = Permission.objects.get_or_create(codename=pname,
128 30dc8c1a Sofia Papagiannaki
                                                  name=pname.capitalize(),
129 30dc8c1a Sofia Papagiannaki
                                                  content_type=content_type)
130 30dc8c1a Sofia Papagiannaki
    group.permissions.add(p)
131 30dc8c1a Sofia Papagiannaki
    return 1, created
132 30dc8c1a Sofia Papagiannaki
133 5ce3ce4f Sofia Papagiannaki
134 30dc8c1a Sofia Papagiannaki
def remove_user_permission(user, pname):
135 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
136 30dc8c1a Sofia Papagiannaki
    if user.has_perm(pname):
137 30dc8c1a Sofia Papagiannaki
        return 0
138 30dc8c1a Sofia Papagiannaki
    try:
139 30dc8c1a Sofia Papagiannaki
        p = Permission.objects.get(codename=pname,
140 5ce3ce4f Sofia Papagiannaki
                                   content_type=content_type)
141 30dc8c1a Sofia Papagiannaki
        user.user_permissions.remove(p)
142 30dc8c1a Sofia Papagiannaki
        return 1
143 aab4d540 Sofia Papagiannaki
    except Permission.DoesNotExist:
144 30dc8c1a Sofia Papagiannaki
        return -1
145 30dc8c1a Sofia Papagiannaki
146 5ce3ce4f Sofia Papagiannaki
147 30dc8c1a Sofia Papagiannaki
def remove_group_permission(group, pname):
148 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
149 30dc8c1a Sofia Papagiannaki
    if pname not in [p.codename for p in group.permissions.all()]:
150 30dc8c1a Sofia Papagiannaki
        return 0
151 30dc8c1a Sofia Papagiannaki
    try:
152 30dc8c1a Sofia Papagiannaki
        p = Permission.objects.get(codename=pname,
153 5ce3ce4f Sofia Papagiannaki
                                   content_type=content_type)
154 30dc8c1a Sofia Papagiannaki
        group.permissions.remove(p)
155 30dc8c1a Sofia Papagiannaki
        return 1
156 aab4d540 Sofia Papagiannaki
    except Permission.DoesNotExist:
157 5ce3ce4f Sofia Papagiannaki
        return -1
158 7eabbd72 Giorgos Korfiatis
159 865849d7 Giorgos Korfiatis
160 7eabbd72 Giorgos Korfiatis
def shortened(s, limit, suffix=True):
161 7eabbd72 Giorgos Korfiatis
    length = len(s)
162 7eabbd72 Giorgos Korfiatis
    if length <= limit:
163 7eabbd72 Giorgos Korfiatis
        return s
164 7eabbd72 Giorgos Korfiatis
    else:
165 7eabbd72 Giorgos Korfiatis
        display = limit - 2
166 7eabbd72 Giorgos Korfiatis
        if suffix:
167 7eabbd72 Giorgos Korfiatis
            return '..' + s[-display:]
168 7eabbd72 Giorgos Korfiatis
        else:
169 7eabbd72 Giorgos Korfiatis
            return s[:display] + '..'
170 56b9989a Giorgos Korfiatis
171 56b9989a Giorgos Korfiatis
172 56b9989a Giorgos Korfiatis
# Copied from snf-cyclades-app/synnefo/management/common.py
173 56b9989a Giorgos Korfiatis
# It could be moved to snf-common
174 56b9989a Giorgos Korfiatis
def filter_results(objects, filter_by):
175 56b9989a Giorgos Korfiatis
    filter_list = filter_by.split(",")
176 56b9989a Giorgos Korfiatis
    filter_dict = {}
177 56b9989a Giorgos Korfiatis
    exclude_dict = {}
178 56b9989a Giorgos Korfiatis
179 56b9989a Giorgos Korfiatis
    def map_field_type(query):
180 56b9989a Giorgos Korfiatis
        def fix_bool(val):
181 56b9989a Giorgos Korfiatis
            if val.lower() in ("yes", "true", "t"):
182 56b9989a Giorgos Korfiatis
                return True
183 56b9989a Giorgos Korfiatis
            if val.lower() in ("no", "false", "f"):
184 56b9989a Giorgos Korfiatis
                return False
185 56b9989a Giorgos Korfiatis
            return val
186 56b9989a Giorgos Korfiatis
187 56b9989a Giorgos Korfiatis
        if "!=" in query:
188 56b9989a Giorgos Korfiatis
            key, val = query.split("!=")
189 56b9989a Giorgos Korfiatis
            exclude_dict[key] = fix_bool(val)
190 56b9989a Giorgos Korfiatis
            return
191 56b9989a Giorgos Korfiatis
        OP_MAP = {
192 56b9989a Giorgos Korfiatis
            ">=": "__gte",
193 56b9989a Giorgos Korfiatis
            "=>": "__gte",
194 56b9989a Giorgos Korfiatis
            ">":  "__gt",
195 56b9989a Giorgos Korfiatis
            "<=": "__lte",
196 56b9989a Giorgos Korfiatis
            "=<": "__lte",
197 56b9989a Giorgos Korfiatis
            "<":  "__lt",
198 56b9989a Giorgos Korfiatis
            "=":  "",
199 56b9989a Giorgos Korfiatis
        }
200 56b9989a Giorgos Korfiatis
        for op, new_op in OP_MAP.items():
201 56b9989a Giorgos Korfiatis
            if op in query:
202 56b9989a Giorgos Korfiatis
                key, val = query.split(op)
203 56b9989a Giorgos Korfiatis
                filter_dict[key + new_op] = fix_bool(val)
204 56b9989a Giorgos Korfiatis
                return
205 56b9989a Giorgos Korfiatis
206 56b9989a Giorgos Korfiatis
    map(lambda x: map_field_type(x), filter_list)
207 56b9989a Giorgos Korfiatis
208 56b9989a Giorgos Korfiatis
    try:
209 56b9989a Giorgos Korfiatis
        objects = objects.filter(**filter_dict)
210 56b9989a Giorgos Korfiatis
        return objects.exclude(**exclude_dict)
211 56b9989a Giorgos Korfiatis
    except FieldError as e:
212 56b9989a Giorgos Korfiatis
        raise CommandError(e)
213 56b9989a Giorgos Korfiatis
    except Exception as e:
214 56b9989a Giorgos Korfiatis
        raise CommandError("Can not filter results: %s" % e)
215 db8cfc97 Giorgos Korfiatis
216 db8cfc97 Giorgos Korfiatis
217 db8cfc97 Giorgos Korfiatis
def is_uuid(s):
218 db8cfc97 Giorgos Korfiatis
    if s is None:
219 db8cfc97 Giorgos Korfiatis
        return False
220 db8cfc97 Giorgos Korfiatis
    try:
221 db8cfc97 Giorgos Korfiatis
        uuid.UUID(s)
222 db8cfc97 Giorgos Korfiatis
    except ValueError:
223 db8cfc97 Giorgos Korfiatis
        return False
224 db8cfc97 Giorgos Korfiatis
    else:
225 db8cfc97 Giorgos Korfiatis
        return True
226 db8cfc97 Giorgos Korfiatis
227 db8cfc97 Giorgos Korfiatis
228 db8cfc97 Giorgos Korfiatis
def is_email(s):
229 db8cfc97 Giorgos Korfiatis
    if s is None:
230 db8cfc97 Giorgos Korfiatis
        return False
231 db8cfc97 Giorgos Korfiatis
    try:
232 db8cfc97 Giorgos Korfiatis
        validate_email(s)
233 db8cfc97 Giorgos Korfiatis
    except:
234 db8cfc97 Giorgos Korfiatis
        return False
235 db8cfc97 Giorgos Korfiatis
    else:
236 db8cfc97 Giorgos Korfiatis
        return True
237 91eca048 Giorgos Korfiatis
238 91eca048 Giorgos Korfiatis
239 91eca048 Giorgos Korfiatis
def show_quotas(qh_quotas, astakos_initial, info=None):
240 764d99c4 Giorgos Korfiatis
    labels = ('source', 'resource', 'base quota', 'total quota', 'usage')
241 91eca048 Giorgos Korfiatis
    if info is not None:
242 91eca048 Giorgos Korfiatis
        labels = ('uuid', 'email') + labels
243 91eca048 Giorgos Korfiatis
244 91eca048 Giorgos Korfiatis
    print_data = []
245 91eca048 Giorgos Korfiatis
    for holder, holder_quotas in qh_quotas.iteritems():
246 91eca048 Giorgos Korfiatis
        h_initial = astakos_initial.get(holder)
247 91eca048 Giorgos Korfiatis
        if info is not None:
248 91eca048 Giorgos Korfiatis
            email = info.get(holder, "")
249 91eca048 Giorgos Korfiatis
250 91eca048 Giorgos Korfiatis
        for source, source_quotas in holder_quotas.iteritems():
251 91eca048 Giorgos Korfiatis
            s_initial = h_initial.get(source) if h_initial else None
252 91eca048 Giorgos Korfiatis
            for resource, values in source_quotas.iteritems():
253 91eca048 Giorgos Korfiatis
                initial = s_initial.get(resource) if s_initial else None
254 91eca048 Giorgos Korfiatis
                fields = (source, resource, initial,
255 91eca048 Giorgos Korfiatis
                          values['limit'], values['usage'])
256 91eca048 Giorgos Korfiatis
                if info is not None:
257 91eca048 Giorgos Korfiatis
                    fields = (holder, email) + fields
258 91eca048 Giorgos Korfiatis
259 91eca048 Giorgos Korfiatis
                print_data.append(fields)
260 91eca048 Giorgos Korfiatis
    return print_data, labels