Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / user-modify.py @ a3e3917f

History | View | Annotate | Download (14.4 kB)

1 ca96a346 Giorgos Verigakis
# Copyright 2012 GRNET S.A. All rights reserved.
2 df48dd1b Giorgos Verigakis
#
3 df48dd1b Giorgos Verigakis
# Redistribution and use in source and binary forms, with or
4 df48dd1b Giorgos Verigakis
# without modification, are permitted provided that the following
5 df48dd1b Giorgos Verigakis
# conditions are met:
6 df48dd1b Giorgos Verigakis
#
7 df48dd1b Giorgos Verigakis
#   1. Redistributions of source code must retain the above
8 df48dd1b Giorgos Verigakis
#      copyright notice, this list of conditions and the following
9 df48dd1b Giorgos Verigakis
#      disclaimer.
10 df48dd1b Giorgos Verigakis
#
11 df48dd1b Giorgos Verigakis
#   2. Redistributions in binary form must reproduce the above
12 df48dd1b Giorgos Verigakis
#      copyright notice, this list of conditions and the following
13 df48dd1b Giorgos Verigakis
#      disclaimer in the documentation and/or other materials
14 df48dd1b Giorgos Verigakis
#      provided with the distribution.
15 df48dd1b Giorgos Verigakis
#
16 df48dd1b Giorgos Verigakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 df48dd1b Giorgos Verigakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 df48dd1b Giorgos Verigakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 df48dd1b Giorgos Verigakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 df48dd1b Giorgos Verigakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 df48dd1b Giorgos Verigakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 df48dd1b Giorgos Verigakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 df48dd1b Giorgos Verigakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 df48dd1b Giorgos Verigakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 df48dd1b Giorgos Verigakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 df48dd1b Giorgos Verigakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 df48dd1b Giorgos Verigakis
# POSSIBILITY OF SUCH DAMAGE.
28 df48dd1b Giorgos Verigakis
#
29 df48dd1b Giorgos Verigakis
# The views and conclusions contained in the software and
30 df48dd1b Giorgos Verigakis
# documentation are those of the authors and should not be
31 df48dd1b Giorgos Verigakis
# interpreted as representing official policies, either expressed
32 df48dd1b Giorgos Verigakis
# or implied, of GRNET S.A.
33 df48dd1b Giorgos Verigakis
34 e7cb4085 Kostas Papadimitriou
import string
35 e7cb4085 Kostas Papadimitriou
36 df48dd1b Giorgos Verigakis
from optparse import make_option
37 df48dd1b Giorgos Verigakis
38 9eb2c9a6 Kostas Papadimitriou
from django.core import management
39 a3e3917f Giorgos Korfiatis
from django.db import transaction
40 df48dd1b Giorgos Verigakis
from django.core.management.base import BaseCommand, CommandError
41 c0b26605 Sofia Papagiannaki
from django.contrib.auth.models import Group
42 0a569195 Sofia Papagiannaki
from django.core.exceptions import ValidationError
43 9eb2c9a6 Kostas Papadimitriou
from django.core.validators import validate_email
44 df48dd1b Giorgos Verigakis
45 44f510e1 Giorgos Korfiatis
from synnefo.util import units
46 8998f09a Sofia Papagiannaki
from astakos.im.models import AstakosUser, Resource
47 764d99c4 Giorgos Korfiatis
from astakos.im import quotas
48 e7cb4085 Kostas Papadimitriou
from astakos.im import activation_backends
49 44f510e1 Giorgos Korfiatis
from ._common import (remove_user_permission, add_user_permission, is_uuid,
50 44f510e1 Giorgos Korfiatis
                      show_resource_value)
51 e7cb4085 Kostas Papadimitriou
52 e7cb4085 Kostas Papadimitriou
activation_backend = activation_backends.get_backend()
53 df48dd1b Giorgos Verigakis
54 5ce3ce4f Sofia Papagiannaki
55 df48dd1b Giorgos Verigakis
class Command(BaseCommand):
56 0a569195 Sofia Papagiannaki
    args = "<user ID>"
57 df48dd1b Giorgos Verigakis
    help = "Modify a user's attributes"
58 5ce3ce4f Sofia Papagiannaki
59 9a06d96f Olga Brani
    option_list = BaseCommand.option_list + (
60 df48dd1b Giorgos Verigakis
        make_option('--invitations',
61 5ce3ce4f Sofia Papagiannaki
                    dest='invitations',
62 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
63 5ce3ce4f Sofia Papagiannaki
                    help="Update user's invitations"),
64 ebd369d0 Sofia Papagiannaki
        make_option('--level',
65 5ce3ce4f Sofia Papagiannaki
                    dest='level',
66 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
67 5ce3ce4f Sofia Papagiannaki
                    help="Update user's level"),
68 df48dd1b Giorgos Verigakis
        make_option('--password',
69 5ce3ce4f Sofia Papagiannaki
                    dest='password',
70 5ce3ce4f Sofia Papagiannaki
                    metavar='PASSWORD',
71 5ce3ce4f Sofia Papagiannaki
                    help="Set user's password"),
72 df48dd1b Giorgos Verigakis
        make_option('--renew-token',
73 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
74 5ce3ce4f Sofia Papagiannaki
                    dest='renew_token',
75 5ce3ce4f Sofia Papagiannaki
                    default=False,
76 5ce3ce4f Sofia Papagiannaki
                    help="Renew the user's token"),
77 cfb15117 Sofia Papagiannaki
        make_option('--renew-password',
78 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
79 5ce3ce4f Sofia Papagiannaki
                    dest='renew_password',
80 5ce3ce4f Sofia Papagiannaki
                    default=False,
81 5ce3ce4f Sofia Papagiannaki
                    help="Renew the user's password"),
82 df48dd1b Giorgos Verigakis
        make_option('--set-admin',
83 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
84 5ce3ce4f Sofia Papagiannaki
                    dest='admin',
85 5ce3ce4f Sofia Papagiannaki
                    default=False,
86 5ce3ce4f Sofia Papagiannaki
                    help="Give user admin rights"),
87 df48dd1b Giorgos Verigakis
        make_option('--set-noadmin',
88 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
89 5ce3ce4f Sofia Papagiannaki
                    dest='noadmin',
90 5ce3ce4f Sofia Papagiannaki
                    default=False,
91 5ce3ce4f Sofia Papagiannaki
                    help="Revoke user's admin rights"),
92 ebd369d0 Sofia Papagiannaki
        make_option('--set-active',
93 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
94 5ce3ce4f Sofia Papagiannaki
                    dest='active',
95 5ce3ce4f Sofia Papagiannaki
                    default=False,
96 21e0fdad Giorgos Korfiatis
                    help="Change user's state to active"),
97 ebd369d0 Sofia Papagiannaki
        make_option('--set-inactive',
98 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
99 5ce3ce4f Sofia Papagiannaki
                    dest='inactive',
100 5ce3ce4f Sofia Papagiannaki
                    default=False,
101 5ce3ce4f Sofia Papagiannaki
                    help="Change user's state to inactive"),
102 e7cb4085 Kostas Papadimitriou
        make_option('--inactive-reason',
103 e7cb4085 Kostas Papadimitriou
                    dest='inactive_reason',
104 e7cb4085 Kostas Papadimitriou
                    help="Reason user got inactive"),
105 4e30244e Sofia Papagiannaki
        make_option('--add-group',
106 5ce3ce4f Sofia Papagiannaki
                    dest='add-group',
107 5ce3ce4f Sofia Papagiannaki
                    help="Add user group"),
108 4e30244e Sofia Papagiannaki
        make_option('--delete-group',
109 5ce3ce4f Sofia Papagiannaki
                    dest='delete-group',
110 5ce3ce4f Sofia Papagiannaki
                    help="Delete user group"),
111 30dc8c1a Sofia Papagiannaki
        make_option('--add-permission',
112 5ce3ce4f Sofia Papagiannaki
                    dest='add-permission',
113 5ce3ce4f Sofia Papagiannaki
                    help="Add user permission"),
114 30dc8c1a Sofia Papagiannaki
        make_option('--delete-permission',
115 5ce3ce4f Sofia Papagiannaki
                    dest='delete-permission',
116 5ce3ce4f Sofia Papagiannaki
                    help="Delete user permission"),
117 e7cb4085 Kostas Papadimitriou
        make_option('--accept',
118 e7cb4085 Kostas Papadimitriou
                    dest='accept',
119 e7cb4085 Kostas Papadimitriou
                    action='store_true',
120 e7cb4085 Kostas Papadimitriou
                    help="Accept user"),
121 abf57c77 Kostas Papadimitriou
        make_option('--verify',
122 abf57c77 Kostas Papadimitriou
                    dest='verify',
123 abf57c77 Kostas Papadimitriou
                    action='store_true',
124 abf57c77 Kostas Papadimitriou
                    help="Verify user email"),
125 e7cb4085 Kostas Papadimitriou
        make_option('--reject',
126 e7cb4085 Kostas Papadimitriou
                    dest='reject',
127 e7cb4085 Kostas Papadimitriou
                    action='store_true',
128 e7cb4085 Kostas Papadimitriou
                    help="Reject user"),
129 e7cb4085 Kostas Papadimitriou
        make_option('--reject-reason',
130 e7cb4085 Kostas Papadimitriou
                    dest='reject_reason',
131 e7cb4085 Kostas Papadimitriou
                    help="Reason user got rejected"),
132 764d99c4 Giorgos Korfiatis
        make_option('--set-base-quota',
133 764d99c4 Giorgos Korfiatis
                    dest='set_base_quota',
134 764d99c4 Giorgos Korfiatis
                    metavar='<resource> <capacity>',
135 764d99c4 Giorgos Korfiatis
                    nargs=2,
136 764d99c4 Giorgos Korfiatis
                    help=("Set base quota for a specified resource. "
137 764d99c4 Giorgos Korfiatis
                          "The special value 'default' sets the user base "
138 764d99c4 Giorgos Korfiatis
                          "quota to the default value.")
139 764d99c4 Giorgos Korfiatis
                    ),
140 df456124 Giorgos Korfiatis
        make_option('-f', '--no-confirm',
141 df456124 Giorgos Korfiatis
                    action='store_true',
142 df456124 Giorgos Korfiatis
                    default=False,
143 df456124 Giorgos Korfiatis
                    dest='force',
144 df456124 Giorgos Korfiatis
                    help="Do not ask for confirmation"),
145 9eb2c9a6 Kostas Papadimitriou
        make_option('--set-email',
146 9eb2c9a6 Kostas Papadimitriou
                    dest='set-email',
147 9eb2c9a6 Kostas Papadimitriou
                    help="Change user's email"),
148 9eb2c9a6 Kostas Papadimitriou
        make_option('--delete',
149 9eb2c9a6 Kostas Papadimitriou
                    dest='delete',
150 9eb2c9a6 Kostas Papadimitriou
                    action='store_true',
151 9eb2c9a6 Kostas Papadimitriou
                    help="Delete user"),
152 9a06d96f Olga Brani
    )
153 9a06d96f Olga Brani
154 a3e3917f Giorgos Korfiatis
    @transaction.commit_on_success
155 df48dd1b Giorgos Verigakis
    def handle(self, *args, **options):
156 df48dd1b Giorgos Verigakis
        if len(args) != 1:
157 0a569195 Sofia Papagiannaki
            raise CommandError("Please provide a user ID")
158 5ce3ce4f Sofia Papagiannaki
159 0a569195 Sofia Papagiannaki
        if args[0].isdigit():
160 92359537 Sofia Papagiannaki
            try:
161 92359537 Sofia Papagiannaki
                user = AstakosUser.objects.get(id=int(args[0]))
162 92359537 Sofia Papagiannaki
            except AstakosUser.DoesNotExist:
163 92359537 Sofia Papagiannaki
                raise CommandError("Invalid user ID")
164 92359537 Sofia Papagiannaki
        elif is_uuid(args[0]):
165 92359537 Sofia Papagiannaki
            try:
166 92359537 Sofia Papagiannaki
                user = AstakosUser.objects.get(uuid=args[0])
167 92359537 Sofia Papagiannaki
            except AstakosUser.DoesNotExist:
168 92359537 Sofia Papagiannaki
                raise CommandError("Invalid user UUID")
169 0a569195 Sofia Papagiannaki
        else:
170 92359537 Sofia Papagiannaki
            raise CommandError(("Invalid user identification: "
171 92359537 Sofia Papagiannaki
                                "you should provide a valid user ID "
172 92359537 Sofia Papagiannaki
                                "or a valid user UUID"))
173 5ce3ce4f Sofia Papagiannaki
174 df48dd1b Giorgos Verigakis
        if options.get('admin'):
175 df48dd1b Giorgos Verigakis
            user.is_superuser = True
176 df48dd1b Giorgos Verigakis
        elif options.get('noadmin'):
177 df48dd1b Giorgos Verigakis
            user.is_superuser = False
178 5ce3ce4f Sofia Papagiannaki
179 e7cb4085 Kostas Papadimitriou
        if options.get('reject'):
180 e7cb4085 Kostas Papadimitriou
            reject_reason = options.get('reject_reason', None)
181 e7cb4085 Kostas Papadimitriou
            res = activation_backend.handle_moderation(
182 e7cb4085 Kostas Papadimitriou
                user,
183 e7cb4085 Kostas Papadimitriou
                accept=False,
184 e7cb4085 Kostas Papadimitriou
                reject_reason=reject_reason)
185 e7cb4085 Kostas Papadimitriou
            activation_backend.send_result_notifications(res, user)
186 e7cb4085 Kostas Papadimitriou
            if res.is_error():
187 e7cb4085 Kostas Papadimitriou
                print "Failed to reject.", res.message
188 e7cb4085 Kostas Papadimitriou
            else:
189 e7cb4085 Kostas Papadimitriou
                print "Account rejected"
190 e7cb4085 Kostas Papadimitriou
191 abf57c77 Kostas Papadimitriou
        if options.get('verify'):
192 abf57c77 Kostas Papadimitriou
            res = activation_backend.handle_verification(
193 abf57c77 Kostas Papadimitriou
                user,
194 abf57c77 Kostas Papadimitriou
                user.verification_code)
195 abf57c77 Kostas Papadimitriou
            #activation_backend.send_result_notifications(res, user)
196 abf57c77 Kostas Papadimitriou
            if res.is_error():
197 abf57c77 Kostas Papadimitriou
                print "Failed to verify.", res.message
198 abf57c77 Kostas Papadimitriou
            else:
199 abf57c77 Kostas Papadimitriou
                print "Account verified (%s)" % res.status_display()
200 abf57c77 Kostas Papadimitriou
201 e7cb4085 Kostas Papadimitriou
        if options.get('accept'):
202 e7cb4085 Kostas Papadimitriou
            res = activation_backend.handle_moderation(user, accept=True)
203 e7cb4085 Kostas Papadimitriou
            activation_backend.send_result_notifications(res, user)
204 e7cb4085 Kostas Papadimitriou
            if res.is_error():
205 e7cb4085 Kostas Papadimitriou
                print "Failed to accept.", res.message
206 e7cb4085 Kostas Papadimitriou
            else:
207 e7cb4085 Kostas Papadimitriou
                print "Account accepted and activated"
208 e7cb4085 Kostas Papadimitriou
209 ebd369d0 Sofia Papagiannaki
        if options.get('active'):
210 e7cb4085 Kostas Papadimitriou
            res = activation_backend.activate_user(user)
211 e7cb4085 Kostas Papadimitriou
            if res.is_error():
212 e7cb4085 Kostas Papadimitriou
                print "Failed to activate.", res.message
213 e7cb4085 Kostas Papadimitriou
            else:
214 e7cb4085 Kostas Papadimitriou
                print "Account %s activated" % user.username
215 e7cb4085 Kostas Papadimitriou
216 ebd369d0 Sofia Papagiannaki
        elif options.get('inactive'):
217 e7cb4085 Kostas Papadimitriou
            res = activation_backend.deactivate_user(
218 e7cb4085 Kostas Papadimitriou
                user,
219 e7cb4085 Kostas Papadimitriou
                reason=options.get('inactive_reason', None))
220 e7cb4085 Kostas Papadimitriou
            if res.is_error():
221 e7cb4085 Kostas Papadimitriou
                print "Failed to deactivate,", res.message
222 e7cb4085 Kostas Papadimitriou
            else:
223 e7cb4085 Kostas Papadimitriou
                print "Account %s deactivated" % user.username
224 5ce3ce4f Sofia Papagiannaki
225 df48dd1b Giorgos Verigakis
        invitations = options.get('invitations')
226 df48dd1b Giorgos Verigakis
        if invitations is not None:
227 df48dd1b Giorgos Verigakis
            user.invitations = int(invitations)
228 5ce3ce4f Sofia Papagiannaki
229 4e30244e Sofia Papagiannaki
        groupname = options.get('add-group')
230 18ffbee1 Sofia Papagiannaki
        if groupname is not None:
231 18ffbee1 Sofia Papagiannaki
            try:
232 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
233 9a06d96f Olga Brani
                user.groups.add(group)
234 9a06d96f Olga Brani
            except Group.DoesNotExist, e:
235 5ce3ce4f Sofia Papagiannaki
                self.stdout.write(
236 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
237 5ce3ce4f Sofia Papagiannaki
238 4e30244e Sofia Papagiannaki
        groupname = options.get('delete-group')
239 4e30244e Sofia Papagiannaki
        if groupname is not None:
240 4e30244e Sofia Papagiannaki
            try:
241 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
242 9a06d96f Olga Brani
                user.groups.remove(group)
243 9a06d96f Olga Brani
            except Group.DoesNotExist, e:
244 5ce3ce4f Sofia Papagiannaki
                self.stdout.write(
245 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
246 5ce3ce4f Sofia Papagiannaki
247 30dc8c1a Sofia Papagiannaki
        pname = options.get('add-permission')
248 30dc8c1a Sofia Papagiannaki
        if pname is not None:
249 30dc8c1a Sofia Papagiannaki
            try:
250 30dc8c1a Sofia Papagiannaki
                r, created = add_user_permission(user, pname)
251 30dc8c1a Sofia Papagiannaki
                if created:
252 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
253 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s created successfully\n' % pname)
254 30dc8c1a Sofia Papagiannaki
                if r > 0:
255 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
256 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s added successfully\n' % pname)
257 5ce3ce4f Sofia Papagiannaki
                elif r == 0:
258 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
259 5ce3ce4f Sofia Papagiannaki
                        'User has already permission: %s\n' % pname)
260 30dc8c1a Sofia Papagiannaki
            except Exception, e:
261 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
262 5ce3ce4f Sofia Papagiannaki
263 5ce3ce4f Sofia Papagiannaki
        pname = options.get('delete-permission')
264 30dc8c1a Sofia Papagiannaki
        if pname is not None and not user.has_perm(pname):
265 30dc8c1a Sofia Papagiannaki
            try:
266 30dc8c1a Sofia Papagiannaki
                r = remove_user_permission(user, pname)
267 30dc8c1a Sofia Papagiannaki
                if r < 0:
268 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
269 5ce3ce4f Sofia Papagiannaki
                        'Invalid permission codename: %s\n' % pname)
270 30dc8c1a Sofia Papagiannaki
                elif r == 0:
271 30dc8c1a Sofia Papagiannaki
                    self.stdout.write('User has not permission: %s\n' % pname)
272 30dc8c1a Sofia Papagiannaki
                elif r > 0:
273 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
274 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s removed successfully\n' % pname)
275 30dc8c1a Sofia Papagiannaki
            except Exception, e:
276 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
277 5ce3ce4f Sofia Papagiannaki
278 ebd369d0 Sofia Papagiannaki
        level = options.get('level')
279 ebd369d0 Sofia Papagiannaki
        if level is not None:
280 ebd369d0 Sofia Papagiannaki
            user.level = int(level)
281 5ce3ce4f Sofia Papagiannaki
282 df48dd1b Giorgos Verigakis
        password = options.get('password')
283 df48dd1b Giorgos Verigakis
        if password is not None:
284 df48dd1b Giorgos Verigakis
            user.set_password(password)
285 5ce3ce4f Sofia Papagiannaki
286 cfb15117 Sofia Papagiannaki
        password = None
287 cfb15117 Sofia Papagiannaki
        if options['renew_password']:
288 cfb15117 Sofia Papagiannaki
            password = AstakosUser.objects.make_random_password()
289 cfb15117 Sofia Papagiannaki
            user.set_password(password)
290 5ce3ce4f Sofia Papagiannaki
291 df48dd1b Giorgos Verigakis
        if options['renew_token']:
292 df48dd1b Giorgos Verigakis
            user.renew_token()
293 5ce3ce4f Sofia Papagiannaki
294 0a569195 Sofia Papagiannaki
        try:
295 0a569195 Sofia Papagiannaki
            user.save()
296 0a569195 Sofia Papagiannaki
        except ValidationError, e:
297 27e26a41 Sofia Papagiannaki
            raise CommandError(e)
298 5ce3ce4f Sofia Papagiannaki
299 cfb15117 Sofia Papagiannaki
        if password:
300 cfb15117 Sofia Papagiannaki
            self.stdout.write('User\'s new password: %s\n' % password)
301 764d99c4 Giorgos Korfiatis
302 df456124 Giorgos Korfiatis
        force = options['force']
303 df456124 Giorgos Korfiatis
304 764d99c4 Giorgos Korfiatis
        set_base_quota = options.get('set_base_quota')
305 764d99c4 Giorgos Korfiatis
        if set_base_quota is not None:
306 764d99c4 Giorgos Korfiatis
            resource, capacity = set_base_quota
307 df456124 Giorgos Korfiatis
            self.set_limit(user, resource, capacity, force)
308 764d99c4 Giorgos Korfiatis
309 9eb2c9a6 Kostas Papadimitriou
        delete = options.get('delete')
310 9eb2c9a6 Kostas Papadimitriou
        if delete:
311 9eb2c9a6 Kostas Papadimitriou
            management.call_command('user-show', str(user.pk),
312 9eb2c9a6 Kostas Papadimitriou
                                    list_quotas=True)
313 9eb2c9a6 Kostas Papadimitriou
            m = "Are you sure you want to permanently delete the user " \
314 9eb2c9a6 Kostas Papadimitriou
                "(yes/no) ? "
315 9eb2c9a6 Kostas Papadimitriou
316 9eb2c9a6 Kostas Papadimitriou
            self.stdout.write("\n")
317 9eb2c9a6 Kostas Papadimitriou
            confirm = raw_input(m)
318 9eb2c9a6 Kostas Papadimitriou
            if confirm == "yes":
319 9eb2c9a6 Kostas Papadimitriou
                user.delete()
320 9eb2c9a6 Kostas Papadimitriou
321 9eb2c9a6 Kostas Papadimitriou
        # Change users email address
322 9eb2c9a6 Kostas Papadimitriou
        newemail = options.get('set-email', None)
323 9eb2c9a6 Kostas Papadimitriou
        if newemail is not None:
324 9eb2c9a6 Kostas Papadimitriou
            newemail = newemail.strip()
325 9eb2c9a6 Kostas Papadimitriou
            try:
326 9eb2c9a6 Kostas Papadimitriou
                validate_email(newemail)
327 9eb2c9a6 Kostas Papadimitriou
            except ValidationError:
328 9eb2c9a6 Kostas Papadimitriou
                m = "Invalid email address."
329 9eb2c9a6 Kostas Papadimitriou
                raise CommandError(m)
330 9eb2c9a6 Kostas Papadimitriou
331 9eb2c9a6 Kostas Papadimitriou
            if AstakosUser.objects.user_exists(newemail):
332 9eb2c9a6 Kostas Papadimitriou
                m = "A user with this email address already exists."
333 9eb2c9a6 Kostas Papadimitriou
                raise CommandError(m)
334 9eb2c9a6 Kostas Papadimitriou
335 9eb2c9a6 Kostas Papadimitriou
            user.email = newemail
336 9eb2c9a6 Kostas Papadimitriou
            user.save()
337 9eb2c9a6 Kostas Papadimitriou
338 764d99c4 Giorgos Korfiatis
    def set_limit(self, user, resource, capacity, force):
339 44f510e1 Giorgos Korfiatis
        style = None
340 764d99c4 Giorgos Korfiatis
        if capacity != 'default':
341 764d99c4 Giorgos Korfiatis
            try:
342 44f510e1 Giorgos Korfiatis
                capacity, style = units.parse_with_style(capacity)
343 44f510e1 Giorgos Korfiatis
            except:
344 764d99c4 Giorgos Korfiatis
                m = "Please specify capacity as a decimal integer or 'default'"
345 764d99c4 Giorgos Korfiatis
                raise CommandError(m)
346 764d99c4 Giorgos Korfiatis
347 764d99c4 Giorgos Korfiatis
        try:
348 764d99c4 Giorgos Korfiatis
            quota, default_capacity = user.get_resource_policy(resource)
349 764d99c4 Giorgos Korfiatis
        except Resource.DoesNotExist:
350 764d99c4 Giorgos Korfiatis
            raise CommandError("No such resource: %s" % resource)
351 764d99c4 Giorgos Korfiatis
352 764d99c4 Giorgos Korfiatis
        if not force:
353 44f510e1 Giorgos Korfiatis
            s_default = show_resource_value(default_capacity, resource, style)
354 44f510e1 Giorgos Korfiatis
            s_current = (show_resource_value(quota.capacity, resource, style)
355 44f510e1 Giorgos Korfiatis
                         if quota is not None else 'default')
356 44f510e1 Giorgos Korfiatis
            s_capacity = (show_resource_value(capacity, resource, style)
357 44f510e1 Giorgos Korfiatis
                          if capacity != 'default' else capacity)
358 764d99c4 Giorgos Korfiatis
            self.stdout.write("user: %s (%s)\n" % (user.uuid, user.username))
359 44f510e1 Giorgos Korfiatis
            self.stdout.write("default capacity: %s\n" % s_default)
360 44f510e1 Giorgos Korfiatis
            self.stdout.write("current capacity: %s\n" % s_current)
361 44f510e1 Giorgos Korfiatis
            self.stdout.write("new capacity: %s\n" % s_capacity)
362 764d99c4 Giorgos Korfiatis
            self.stdout.write("Confirm? (y/n) ")
363 764d99c4 Giorgos Korfiatis
            response = raw_input()
364 764d99c4 Giorgos Korfiatis
            if string.lower(response) not in ['y', 'yes']:
365 764d99c4 Giorgos Korfiatis
                self.stdout.write("Aborted.\n")
366 764d99c4 Giorgos Korfiatis
                return
367 764d99c4 Giorgos Korfiatis
368 764d99c4 Giorgos Korfiatis
        if capacity == 'default':
369 764d99c4 Giorgos Korfiatis
            try:
370 764d99c4 Giorgos Korfiatis
                quotas.remove_base_quota(user, resource)
371 764d99c4 Giorgos Korfiatis
            except Exception as e:
372 764d99c4 Giorgos Korfiatis
                import traceback
373 764d99c4 Giorgos Korfiatis
                traceback.print_exc()
374 764d99c4 Giorgos Korfiatis
                raise CommandError("Failed to remove policy: %s" % e)
375 764d99c4 Giorgos Korfiatis
        else:
376 764d99c4 Giorgos Korfiatis
            try:
377 764d99c4 Giorgos Korfiatis
                quotas.add_base_quota(user, resource, capacity)
378 764d99c4 Giorgos Korfiatis
            except Exception as e:
379 764d99c4 Giorgos Korfiatis
                raise CommandError("Failed to add policy: %s" % e)