Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / _common.py @ 35cbac33

History | View | Annotate | Download (7.3 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 db8cfc97 Giorgos Korfiatis
import uuid
35 397d5cbe Giorgos Verigakis
36 db8cfc97 Giorgos Korfiatis
from django.core.validators import validate_email
37 30dc8c1a Sofia Papagiannaki
from django.contrib.auth.models import Permission
38 30dc8c1a Sofia Papagiannaki
from django.contrib.contenttypes.models import ContentType
39 35cbac33 Giorgos Korfiatis
from snf_django.management.commands import CommandError
40 397d5cbe Giorgos Verigakis
41 44f510e1 Giorgos Korfiatis
from synnefo.util import units
42 397d5cbe Giorgos Verigakis
from astakos.im.models import AstakosUser
43 85ae5a4c Giorgos Korfiatis
from astakos.im import register
44 c25f5ed0 Giorgos Korfiatis
import sys
45 c25f5ed0 Giorgos Korfiatis
46 397d5cbe Giorgos Verigakis
47 9a06d96f Olga Brani
DEFAULT_CONTENT_TYPE = None
48 397d5cbe Giorgos Verigakis
49 5ce3ce4f Sofia Papagiannaki
50 c25f5ed0 Giorgos Korfiatis
def read_from_file(f_name):
51 c25f5ed0 Giorgos Korfiatis
    if f_name == '-':
52 c25f5ed0 Giorgos Korfiatis
        return sys.stdin.read()
53 c25f5ed0 Giorgos Korfiatis
    else:
54 c25f5ed0 Giorgos Korfiatis
        try:
55 c25f5ed0 Giorgos Korfiatis
            with open(f_name) as file_desc:
56 c25f5ed0 Giorgos Korfiatis
                return file_desc.read()
57 c25f5ed0 Giorgos Korfiatis
        except IOError as e:
58 c25f5ed0 Giorgos Korfiatis
            raise CommandError(e)
59 c25f5ed0 Giorgos Korfiatis
60 c25f5ed0 Giorgos Korfiatis
61 0a569195 Sofia Papagiannaki
def get_user(email_or_id, **kwargs):
62 397d5cbe Giorgos Verigakis
    try:
63 397d5cbe Giorgos Verigakis
        if email_or_id.isdigit():
64 397d5cbe Giorgos Verigakis
            return AstakosUser.objects.get(id=int(email_or_id))
65 397d5cbe Giorgos Verigakis
        else:
66 789a5951 Sofia Papagiannaki
            return AstakosUser.objects.get(email__iexact=email_or_id, **kwargs)
67 ea2c0e6f Giorgos Korfiatis
    except (AstakosUser.DoesNotExist, AstakosUser.MultipleObjectsReturned):
68 397d5cbe Giorgos Verigakis
        return None
69 397d5cbe Giorgos Verigakis
70 5ce3ce4f Sofia Papagiannaki
71 a69ad12b Giorgos Korfiatis
def get_accepted_user(user_ident):
72 a69ad12b Giorgos Korfiatis
    if is_uuid(user_ident):
73 a69ad12b Giorgos Korfiatis
        try:
74 a69ad12b Giorgos Korfiatis
            user = AstakosUser.objects.get(uuid=user_ident)
75 a69ad12b Giorgos Korfiatis
        except AstakosUser.DoesNotExist:
76 a69ad12b Giorgos Korfiatis
            raise CommandError('There is no user with uuid: %s' %
77 a69ad12b Giorgos Korfiatis
                               user_ident)
78 a69ad12b Giorgos Korfiatis
    elif is_email(user_ident):
79 a69ad12b Giorgos Korfiatis
        try:
80 a69ad12b Giorgos Korfiatis
            user = AstakosUser.objects.get(username=user_ident)
81 a69ad12b Giorgos Korfiatis
        except AstakosUser.DoesNotExist:
82 a69ad12b Giorgos Korfiatis
            raise CommandError('There is no user with email: %s' %
83 a69ad12b Giorgos Korfiatis
                               user_ident)
84 a69ad12b Giorgos Korfiatis
    else:
85 a69ad12b Giorgos Korfiatis
        raise CommandError('Please specify user by uuid or email')
86 a69ad12b Giorgos Korfiatis
87 a69ad12b Giorgos Korfiatis
    if not user.is_accepted():
88 a69ad12b Giorgos Korfiatis
        raise CommandError('%s is not an accepted user.' % user.uuid)
89 a69ad12b Giorgos Korfiatis
90 a69ad12b Giorgos Korfiatis
    return user
91 a69ad12b Giorgos Korfiatis
92 a69ad12b Giorgos Korfiatis
93 30dc8c1a Sofia Papagiannaki
def get_astakosuser_content_type():
94 30dc8c1a Sofia Papagiannaki
    try:
95 30dc8c1a Sofia Papagiannaki
        return ContentType.objects.get(app_label='im',
96 30dc8c1a Sofia Papagiannaki
                                       model='astakosuser')
97 30dc8c1a Sofia Papagiannaki
    except:
98 9a06d96f Olga Brani
        return DEFAULT_CONTENT_TYPE
99 5ce3ce4f Sofia Papagiannaki
100 5ce3ce4f Sofia Papagiannaki
101 30dc8c1a Sofia Papagiannaki
def add_user_permission(user, pname):
102 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
103 30dc8c1a Sofia Papagiannaki
    if user.has_perm(pname):
104 30dc8c1a Sofia Papagiannaki
        return 0, None
105 30dc8c1a Sofia Papagiannaki
    p, created = Permission.objects.get_or_create(codename=pname,
106 30dc8c1a Sofia Papagiannaki
                                                  name=pname.capitalize(),
107 30dc8c1a Sofia Papagiannaki
                                                  content_type=content_type)
108 30dc8c1a Sofia Papagiannaki
    user.user_permissions.add(p)
109 30dc8c1a Sofia Papagiannaki
    return 1, created
110 30dc8c1a Sofia Papagiannaki
111 5ce3ce4f Sofia Papagiannaki
112 30dc8c1a Sofia Papagiannaki
def add_group_permission(group, pname):
113 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
114 30dc8c1a Sofia Papagiannaki
    if pname in [p.codename for p in group.permissions.all()]:
115 30dc8c1a Sofia Papagiannaki
        return 0, None
116 30dc8c1a Sofia Papagiannaki
    content_type = ContentType.objects.get(app_label='im',
117 30dc8c1a Sofia Papagiannaki
                                           model='astakosuser')
118 30dc8c1a Sofia Papagiannaki
    p, created = Permission.objects.get_or_create(codename=pname,
119 30dc8c1a Sofia Papagiannaki
                                                  name=pname.capitalize(),
120 30dc8c1a Sofia Papagiannaki
                                                  content_type=content_type)
121 30dc8c1a Sofia Papagiannaki
    group.permissions.add(p)
122 30dc8c1a Sofia Papagiannaki
    return 1, created
123 30dc8c1a Sofia Papagiannaki
124 5ce3ce4f Sofia Papagiannaki
125 30dc8c1a Sofia Papagiannaki
def remove_user_permission(user, pname):
126 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
127 30dc8c1a Sofia Papagiannaki
    if user.has_perm(pname):
128 30dc8c1a Sofia Papagiannaki
        return 0
129 30dc8c1a Sofia Papagiannaki
    try:
130 30dc8c1a Sofia Papagiannaki
        p = Permission.objects.get(codename=pname,
131 5ce3ce4f Sofia Papagiannaki
                                   content_type=content_type)
132 30dc8c1a Sofia Papagiannaki
        user.user_permissions.remove(p)
133 30dc8c1a Sofia Papagiannaki
        return 1
134 aab4d540 Sofia Papagiannaki
    except Permission.DoesNotExist:
135 30dc8c1a Sofia Papagiannaki
        return -1
136 30dc8c1a Sofia Papagiannaki
137 5ce3ce4f Sofia Papagiannaki
138 30dc8c1a Sofia Papagiannaki
def remove_group_permission(group, pname):
139 30dc8c1a Sofia Papagiannaki
    content_type = get_astakosuser_content_type()
140 30dc8c1a Sofia Papagiannaki
    if pname not in [p.codename for p in group.permissions.all()]:
141 30dc8c1a Sofia Papagiannaki
        return 0
142 30dc8c1a Sofia Papagiannaki
    try:
143 30dc8c1a Sofia Papagiannaki
        p = Permission.objects.get(codename=pname,
144 5ce3ce4f Sofia Papagiannaki
                                   content_type=content_type)
145 30dc8c1a Sofia Papagiannaki
        group.permissions.remove(p)
146 30dc8c1a Sofia Papagiannaki
        return 1
147 aab4d540 Sofia Papagiannaki
    except Permission.DoesNotExist:
148 5ce3ce4f Sofia Papagiannaki
        return -1
149 7eabbd72 Giorgos Korfiatis
150 865849d7 Giorgos Korfiatis
151 db8cfc97 Giorgos Korfiatis
def is_uuid(s):
152 db8cfc97 Giorgos Korfiatis
    if s is None:
153 db8cfc97 Giorgos Korfiatis
        return False
154 db8cfc97 Giorgos Korfiatis
    try:
155 db8cfc97 Giorgos Korfiatis
        uuid.UUID(s)
156 db8cfc97 Giorgos Korfiatis
    except ValueError:
157 db8cfc97 Giorgos Korfiatis
        return False
158 db8cfc97 Giorgos Korfiatis
    else:
159 db8cfc97 Giorgos Korfiatis
        return True
160 db8cfc97 Giorgos Korfiatis
161 db8cfc97 Giorgos Korfiatis
162 db8cfc97 Giorgos Korfiatis
def is_email(s):
163 db8cfc97 Giorgos Korfiatis
    if s is None:
164 db8cfc97 Giorgos Korfiatis
        return False
165 db8cfc97 Giorgos Korfiatis
    try:
166 db8cfc97 Giorgos Korfiatis
        validate_email(s)
167 db8cfc97 Giorgos Korfiatis
    except:
168 db8cfc97 Giorgos Korfiatis
        return False
169 db8cfc97 Giorgos Korfiatis
    else:
170 db8cfc97 Giorgos Korfiatis
        return True
171 91eca048 Giorgos Korfiatis
172 91eca048 Giorgos Korfiatis
173 44f510e1 Giorgos Korfiatis
style_options = ', '.join(units.STYLES)
174 44f510e1 Giorgos Korfiatis
175 44f510e1 Giorgos Korfiatis
176 44f510e1 Giorgos Korfiatis
def check_style(style):
177 44f510e1 Giorgos Korfiatis
    if style not in units.STYLES:
178 44f510e1 Giorgos Korfiatis
        m = "Invalid unit style. Valid ones are %s." % style_options
179 44f510e1 Giorgos Korfiatis
        raise CommandError(m)
180 44f510e1 Giorgos Korfiatis
181 44f510e1 Giorgos Korfiatis
182 44f510e1 Giorgos Korfiatis
class ResourceDict(object):
183 44f510e1 Giorgos Korfiatis
    _object = None
184 44f510e1 Giorgos Korfiatis
185 44f510e1 Giorgos Korfiatis
    @classmethod
186 44f510e1 Giorgos Korfiatis
    def get(cls):
187 44f510e1 Giorgos Korfiatis
        if cls._object is None:
188 85ae5a4c Giorgos Korfiatis
            rs = register.get_resources()
189 85ae5a4c Giorgos Korfiatis
            cls._object = register.resources_to_dict(rs)
190 44f510e1 Giorgos Korfiatis
        return cls._object
191 44f510e1 Giorgos Korfiatis
192 44f510e1 Giorgos Korfiatis
193 44f510e1 Giorgos Korfiatis
def show_resource_value(number, resource, style):
194 77fd77bf Giorgos Korfiatis
    resources = ResourceDict.get()
195 77fd77bf Giorgos Korfiatis
    resource_dict = resources.get(resource)
196 77fd77bf Giorgos Korfiatis
    unit = resource_dict.get('unit') if resource_dict else None
197 44f510e1 Giorgos Korfiatis
    return units.show(number, unit, style)
198 44f510e1 Giorgos Korfiatis
199 44f510e1 Giorgos Korfiatis
200 a53ec93b Giorgos Korfiatis
def collect_holder_quotas(holder_quotas, style=None):
201 5a0f9d6c Giorgos Korfiatis
    print_data = []
202 5a0f9d6c Giorgos Korfiatis
    for source, source_quotas in holder_quotas.iteritems():
203 5a0f9d6c Giorgos Korfiatis
        for resource, values in source_quotas.iteritems():
204 5a0f9d6c Giorgos Korfiatis
            limit = show_resource_value(values['limit'], resource, style)
205 5a0f9d6c Giorgos Korfiatis
            usage = show_resource_value(values['usage'], resource, style)
206 a53ec93b Giorgos Korfiatis
            fields = (source, resource, limit, usage)
207 5a0f9d6c Giorgos Korfiatis
            print_data.append(fields)
208 5a0f9d6c Giorgos Korfiatis
    return print_data
209 5a0f9d6c Giorgos Korfiatis
210 5a0f9d6c Giorgos Korfiatis
211 a53ec93b Giorgos Korfiatis
def show_user_quotas(holder_quotas, style=None):
212 a53ec93b Giorgos Korfiatis
    labels = ('source', 'resource', 'limit', 'usage')
213 a53ec93b Giorgos Korfiatis
    print_data = collect_holder_quotas(holder_quotas, style=style)
214 5a0f9d6c Giorgos Korfiatis
    return print_data, labels
215 5a0f9d6c Giorgos Korfiatis
216 5a0f9d6c Giorgos Korfiatis
217 a53ec93b Giorgos Korfiatis
def show_quotas(qh_quotas, info=None, style=None):
218 a53ec93b Giorgos Korfiatis
    labels = ('holder', 'source', 'resource', 'limit', 'usage')
219 91eca048 Giorgos Korfiatis
    if info is not None:
220 5a0f9d6c Giorgos Korfiatis
        labels = ('displayname',) + labels
221 91eca048 Giorgos Korfiatis
222 91eca048 Giorgos Korfiatis
    print_data = []
223 91eca048 Giorgos Korfiatis
    for holder, holder_quotas in qh_quotas.iteritems():
224 91eca048 Giorgos Korfiatis
        if info is not None:
225 91eca048 Giorgos Korfiatis
            email = info.get(holder, "")
226 91eca048 Giorgos Korfiatis
227 a53ec93b Giorgos Korfiatis
        h_data = collect_holder_quotas(holder_quotas, style=style)
228 5a0f9d6c Giorgos Korfiatis
        if info is not None:
229 5a0f9d6c Giorgos Korfiatis
            h_data = [(email, holder) + fields for fields in h_data]
230 5a0f9d6c Giorgos Korfiatis
        else:
231 5a0f9d6c Giorgos Korfiatis
            h_data = [(holder,) + fields for fields in h_data]
232 5a0f9d6c Giorgos Korfiatis
        print_data += h_data
233 91eca048 Giorgos Korfiatis
    return print_data, labels