Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (12.9 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 df48dd1b Giorgos Verigakis
from django.core.management.base import BaseCommand, CommandError
39 c0b26605 Sofia Papagiannaki
from django.contrib.auth.models import Group
40 0a569195 Sofia Papagiannaki
from django.core.exceptions import ValidationError
41 df48dd1b Giorgos Verigakis
42 44f510e1 Giorgos Korfiatis
from synnefo.util import units
43 8998f09a Sofia Papagiannaki
from astakos.im.models import AstakosUser, Resource
44 764d99c4 Giorgos Korfiatis
from astakos.im import quotas
45 e7cb4085 Kostas Papadimitriou
from astakos.im import activation_backends
46 44f510e1 Giorgos Korfiatis
from ._common import (remove_user_permission, add_user_permission, is_uuid,
47 44f510e1 Giorgos Korfiatis
                      show_resource_value)
48 b830f774 Giorgos Korfiatis
from snf_django.lib.db.transaction import commit_on_success_strict
49 e7cb4085 Kostas Papadimitriou
50 e7cb4085 Kostas Papadimitriou
activation_backend = activation_backends.get_backend()
51 df48dd1b Giorgos Verigakis
52 5ce3ce4f Sofia Papagiannaki
53 df48dd1b Giorgos Verigakis
class Command(BaseCommand):
54 0a569195 Sofia Papagiannaki
    args = "<user ID>"
55 df48dd1b Giorgos Verigakis
    help = "Modify a user's attributes"
56 5ce3ce4f Sofia Papagiannaki
57 9a06d96f Olga Brani
    option_list = BaseCommand.option_list + (
58 df48dd1b Giorgos Verigakis
        make_option('--invitations',
59 5ce3ce4f Sofia Papagiannaki
                    dest='invitations',
60 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
61 5ce3ce4f Sofia Papagiannaki
                    help="Update user's invitations"),
62 ebd369d0 Sofia Papagiannaki
        make_option('--level',
63 5ce3ce4f Sofia Papagiannaki
                    dest='level',
64 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
65 5ce3ce4f Sofia Papagiannaki
                    help="Update user's level"),
66 df48dd1b Giorgos Verigakis
        make_option('--password',
67 5ce3ce4f Sofia Papagiannaki
                    dest='password',
68 5ce3ce4f Sofia Papagiannaki
                    metavar='PASSWORD',
69 5ce3ce4f Sofia Papagiannaki
                    help="Set user's password"),
70 df48dd1b Giorgos Verigakis
        make_option('--renew-token',
71 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
72 5ce3ce4f Sofia Papagiannaki
                    dest='renew_token',
73 5ce3ce4f Sofia Papagiannaki
                    default=False,
74 5ce3ce4f Sofia Papagiannaki
                    help="Renew the user's token"),
75 cfb15117 Sofia Papagiannaki
        make_option('--renew-password',
76 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
77 5ce3ce4f Sofia Papagiannaki
                    dest='renew_password',
78 5ce3ce4f Sofia Papagiannaki
                    default=False,
79 5ce3ce4f Sofia Papagiannaki
                    help="Renew the user's password"),
80 df48dd1b Giorgos Verigakis
        make_option('--set-admin',
81 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
82 5ce3ce4f Sofia Papagiannaki
                    dest='admin',
83 5ce3ce4f Sofia Papagiannaki
                    default=False,
84 5ce3ce4f Sofia Papagiannaki
                    help="Give user admin rights"),
85 df48dd1b Giorgos Verigakis
        make_option('--set-noadmin',
86 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
87 5ce3ce4f Sofia Papagiannaki
                    dest='noadmin',
88 5ce3ce4f Sofia Papagiannaki
                    default=False,
89 5ce3ce4f Sofia Papagiannaki
                    help="Revoke user's admin rights"),
90 ebd369d0 Sofia Papagiannaki
        make_option('--set-active',
91 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
92 5ce3ce4f Sofia Papagiannaki
                    dest='active',
93 5ce3ce4f Sofia Papagiannaki
                    default=False,
94 21e0fdad Giorgos Korfiatis
                    help="Change user's state to active"),
95 ebd369d0 Sofia Papagiannaki
        make_option('--set-inactive',
96 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
97 5ce3ce4f Sofia Papagiannaki
                    dest='inactive',
98 5ce3ce4f Sofia Papagiannaki
                    default=False,
99 5ce3ce4f Sofia Papagiannaki
                    help="Change user's state to inactive"),
100 e7cb4085 Kostas Papadimitriou
        make_option('--inactive-reason',
101 e7cb4085 Kostas Papadimitriou
                    dest='inactive_reason',
102 e7cb4085 Kostas Papadimitriou
                    help="Reason user got inactive"),
103 4e30244e Sofia Papagiannaki
        make_option('--add-group',
104 5ce3ce4f Sofia Papagiannaki
                    dest='add-group',
105 5ce3ce4f Sofia Papagiannaki
                    help="Add user group"),
106 4e30244e Sofia Papagiannaki
        make_option('--delete-group',
107 5ce3ce4f Sofia Papagiannaki
                    dest='delete-group',
108 5ce3ce4f Sofia Papagiannaki
                    help="Delete user group"),
109 30dc8c1a Sofia Papagiannaki
        make_option('--add-permission',
110 5ce3ce4f Sofia Papagiannaki
                    dest='add-permission',
111 5ce3ce4f Sofia Papagiannaki
                    help="Add user permission"),
112 30dc8c1a Sofia Papagiannaki
        make_option('--delete-permission',
113 5ce3ce4f Sofia Papagiannaki
                    dest='delete-permission',
114 5ce3ce4f Sofia Papagiannaki
                    help="Delete user permission"),
115 e7cb4085 Kostas Papadimitriou
        make_option('--accept',
116 e7cb4085 Kostas Papadimitriou
                    dest='accept',
117 e7cb4085 Kostas Papadimitriou
                    action='store_true',
118 e7cb4085 Kostas Papadimitriou
                    help="Accept user"),
119 abf57c77 Kostas Papadimitriou
        make_option('--verify',
120 abf57c77 Kostas Papadimitriou
                    dest='verify',
121 abf57c77 Kostas Papadimitriou
                    action='store_true',
122 abf57c77 Kostas Papadimitriou
                    help="Verify user email"),
123 e7cb4085 Kostas Papadimitriou
        make_option('--reject',
124 e7cb4085 Kostas Papadimitriou
                    dest='reject',
125 e7cb4085 Kostas Papadimitriou
                    action='store_true',
126 e7cb4085 Kostas Papadimitriou
                    help="Reject user"),
127 e7cb4085 Kostas Papadimitriou
        make_option('--reject-reason',
128 e7cb4085 Kostas Papadimitriou
                    dest='reject_reason',
129 e7cb4085 Kostas Papadimitriou
                    help="Reason user got rejected"),
130 764d99c4 Giorgos Korfiatis
        make_option('--set-base-quota',
131 764d99c4 Giorgos Korfiatis
                    dest='set_base_quota',
132 764d99c4 Giorgos Korfiatis
                    metavar='<resource> <capacity>',
133 764d99c4 Giorgos Korfiatis
                    nargs=2,
134 764d99c4 Giorgos Korfiatis
                    help=("Set base quota for a specified resource. "
135 764d99c4 Giorgos Korfiatis
                          "The special value 'default' sets the user base "
136 764d99c4 Giorgos Korfiatis
                          "quota to the default value.")
137 764d99c4 Giorgos Korfiatis
                    ),
138 764d99c4 Giorgos Korfiatis
139 9a06d96f Olga Brani
    )
140 9a06d96f Olga Brani
141 200b37fb Giorgos Korfiatis
    @commit_on_success_strict()
142 df48dd1b Giorgos Verigakis
    def handle(self, *args, **options):
143 df48dd1b Giorgos Verigakis
        if len(args) != 1:
144 0a569195 Sofia Papagiannaki
            raise CommandError("Please provide a user ID")
145 5ce3ce4f Sofia Papagiannaki
146 0a569195 Sofia Papagiannaki
        if args[0].isdigit():
147 92359537 Sofia Papagiannaki
            try:
148 92359537 Sofia Papagiannaki
                user = AstakosUser.objects.get(id=int(args[0]))
149 92359537 Sofia Papagiannaki
            except AstakosUser.DoesNotExist:
150 92359537 Sofia Papagiannaki
                raise CommandError("Invalid user ID")
151 92359537 Sofia Papagiannaki
        elif is_uuid(args[0]):
152 92359537 Sofia Papagiannaki
            try:
153 92359537 Sofia Papagiannaki
                user = AstakosUser.objects.get(uuid=args[0])
154 92359537 Sofia Papagiannaki
            except AstakosUser.DoesNotExist:
155 92359537 Sofia Papagiannaki
                raise CommandError("Invalid user UUID")
156 0a569195 Sofia Papagiannaki
        else:
157 92359537 Sofia Papagiannaki
            raise CommandError(("Invalid user identification: "
158 92359537 Sofia Papagiannaki
                                "you should provide a valid user ID "
159 92359537 Sofia Papagiannaki
                                "or a valid user UUID"))
160 5ce3ce4f Sofia Papagiannaki
161 df48dd1b Giorgos Verigakis
        if options.get('admin'):
162 df48dd1b Giorgos Verigakis
            user.is_superuser = True
163 df48dd1b Giorgos Verigakis
        elif options.get('noadmin'):
164 df48dd1b Giorgos Verigakis
            user.is_superuser = False
165 5ce3ce4f Sofia Papagiannaki
166 e7cb4085 Kostas Papadimitriou
        if options.get('reject'):
167 e7cb4085 Kostas Papadimitriou
            reject_reason = options.get('reject_reason', None)
168 e7cb4085 Kostas Papadimitriou
            res = activation_backend.handle_moderation(
169 e7cb4085 Kostas Papadimitriou
                user,
170 e7cb4085 Kostas Papadimitriou
                accept=False,
171 e7cb4085 Kostas Papadimitriou
                reject_reason=reject_reason)
172 e7cb4085 Kostas Papadimitriou
            activation_backend.send_result_notifications(res, user)
173 e7cb4085 Kostas Papadimitriou
            if res.is_error():
174 e7cb4085 Kostas Papadimitriou
                print "Failed to reject.", res.message
175 e7cb4085 Kostas Papadimitriou
            else:
176 e7cb4085 Kostas Papadimitriou
                print "Account rejected"
177 e7cb4085 Kostas Papadimitriou
178 abf57c77 Kostas Papadimitriou
        if options.get('verify'):
179 abf57c77 Kostas Papadimitriou
            res = activation_backend.handle_verification(
180 abf57c77 Kostas Papadimitriou
                user,
181 abf57c77 Kostas Papadimitriou
                user.verification_code)
182 abf57c77 Kostas Papadimitriou
            #activation_backend.send_result_notifications(res, user)
183 abf57c77 Kostas Papadimitriou
            if res.is_error():
184 abf57c77 Kostas Papadimitriou
                print "Failed to verify.", res.message
185 abf57c77 Kostas Papadimitriou
            else:
186 abf57c77 Kostas Papadimitriou
                print "Account verified (%s)" % res.status_display()
187 abf57c77 Kostas Papadimitriou
188 e7cb4085 Kostas Papadimitriou
        if options.get('accept'):
189 e7cb4085 Kostas Papadimitriou
            res = activation_backend.handle_moderation(user, accept=True)
190 e7cb4085 Kostas Papadimitriou
            activation_backend.send_result_notifications(res, user)
191 e7cb4085 Kostas Papadimitriou
            if res.is_error():
192 e7cb4085 Kostas Papadimitriou
                print "Failed to accept.", res.message
193 e7cb4085 Kostas Papadimitriou
            else:
194 e7cb4085 Kostas Papadimitriou
                print "Account accepted and activated"
195 e7cb4085 Kostas Papadimitriou
196 ebd369d0 Sofia Papagiannaki
        if options.get('active'):
197 e7cb4085 Kostas Papadimitriou
            res = activation_backend.activate_user(user)
198 e7cb4085 Kostas Papadimitriou
            if res.is_error():
199 e7cb4085 Kostas Papadimitriou
                print "Failed to activate.", res.message
200 e7cb4085 Kostas Papadimitriou
            else:
201 e7cb4085 Kostas Papadimitriou
                print "Account %s activated" % user.username
202 e7cb4085 Kostas Papadimitriou
203 ebd369d0 Sofia Papagiannaki
        elif options.get('inactive'):
204 e7cb4085 Kostas Papadimitriou
            res = activation_backend.deactivate_user(
205 e7cb4085 Kostas Papadimitriou
                user,
206 e7cb4085 Kostas Papadimitriou
                reason=options.get('inactive_reason', None))
207 e7cb4085 Kostas Papadimitriou
            if res.is_error():
208 e7cb4085 Kostas Papadimitriou
                print "Failed to deactivate,", res.message
209 e7cb4085 Kostas Papadimitriou
            else:
210 e7cb4085 Kostas Papadimitriou
                print "Account %s deactivated" % user.username
211 5ce3ce4f Sofia Papagiannaki
212 df48dd1b Giorgos Verigakis
        invitations = options.get('invitations')
213 df48dd1b Giorgos Verigakis
        if invitations is not None:
214 df48dd1b Giorgos Verigakis
            user.invitations = int(invitations)
215 5ce3ce4f Sofia Papagiannaki
216 4e30244e Sofia Papagiannaki
        groupname = options.get('add-group')
217 18ffbee1 Sofia Papagiannaki
        if groupname is not None:
218 18ffbee1 Sofia Papagiannaki
            try:
219 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
220 9a06d96f Olga Brani
                user.groups.add(group)
221 9a06d96f Olga Brani
            except Group.DoesNotExist, e:
222 5ce3ce4f Sofia Papagiannaki
                self.stdout.write(
223 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
224 5ce3ce4f Sofia Papagiannaki
225 4e30244e Sofia Papagiannaki
        groupname = options.get('delete-group')
226 4e30244e Sofia Papagiannaki
        if groupname is not None:
227 4e30244e Sofia Papagiannaki
            try:
228 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
229 9a06d96f Olga Brani
                user.groups.remove(group)
230 9a06d96f Olga Brani
            except Group.DoesNotExist, e:
231 5ce3ce4f Sofia Papagiannaki
                self.stdout.write(
232 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
233 5ce3ce4f Sofia Papagiannaki
234 30dc8c1a Sofia Papagiannaki
        pname = options.get('add-permission')
235 30dc8c1a Sofia Papagiannaki
        if pname is not None:
236 30dc8c1a Sofia Papagiannaki
            try:
237 30dc8c1a Sofia Papagiannaki
                r, created = add_user_permission(user, pname)
238 30dc8c1a Sofia Papagiannaki
                if created:
239 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
240 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s created successfully\n' % pname)
241 30dc8c1a Sofia Papagiannaki
                if r > 0:
242 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
243 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s added successfully\n' % pname)
244 5ce3ce4f Sofia Papagiannaki
                elif r == 0:
245 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
246 5ce3ce4f Sofia Papagiannaki
                        'User has already permission: %s\n' % pname)
247 30dc8c1a Sofia Papagiannaki
            except Exception, e:
248 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
249 5ce3ce4f Sofia Papagiannaki
250 5ce3ce4f Sofia Papagiannaki
        pname = options.get('delete-permission')
251 30dc8c1a Sofia Papagiannaki
        if pname is not None and not user.has_perm(pname):
252 30dc8c1a Sofia Papagiannaki
            try:
253 30dc8c1a Sofia Papagiannaki
                r = remove_user_permission(user, pname)
254 30dc8c1a Sofia Papagiannaki
                if r < 0:
255 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
256 5ce3ce4f Sofia Papagiannaki
                        'Invalid permission codename: %s\n' % pname)
257 30dc8c1a Sofia Papagiannaki
                elif r == 0:
258 30dc8c1a Sofia Papagiannaki
                    self.stdout.write('User has not permission: %s\n' % pname)
259 30dc8c1a Sofia Papagiannaki
                elif r > 0:
260 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
261 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s removed successfully\n' % pname)
262 30dc8c1a Sofia Papagiannaki
            except Exception, e:
263 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
264 5ce3ce4f Sofia Papagiannaki
265 ebd369d0 Sofia Papagiannaki
        level = options.get('level')
266 ebd369d0 Sofia Papagiannaki
        if level is not None:
267 ebd369d0 Sofia Papagiannaki
            user.level = int(level)
268 5ce3ce4f Sofia Papagiannaki
269 df48dd1b Giorgos Verigakis
        password = options.get('password')
270 df48dd1b Giorgos Verigakis
        if password is not None:
271 df48dd1b Giorgos Verigakis
            user.set_password(password)
272 5ce3ce4f Sofia Papagiannaki
273 cfb15117 Sofia Papagiannaki
        password = None
274 cfb15117 Sofia Papagiannaki
        if options['renew_password']:
275 cfb15117 Sofia Papagiannaki
            password = AstakosUser.objects.make_random_password()
276 cfb15117 Sofia Papagiannaki
            user.set_password(password)
277 5ce3ce4f Sofia Papagiannaki
278 df48dd1b Giorgos Verigakis
        if options['renew_token']:
279 df48dd1b Giorgos Verigakis
            user.renew_token()
280 5ce3ce4f Sofia Papagiannaki
281 0a569195 Sofia Papagiannaki
        try:
282 0a569195 Sofia Papagiannaki
            user.save()
283 0a569195 Sofia Papagiannaki
        except ValidationError, e:
284 27e26a41 Sofia Papagiannaki
            raise CommandError(e)
285 5ce3ce4f Sofia Papagiannaki
286 cfb15117 Sofia Papagiannaki
        if password:
287 cfb15117 Sofia Papagiannaki
            self.stdout.write('User\'s new password: %s\n' % password)
288 764d99c4 Giorgos Korfiatis
289 764d99c4 Giorgos Korfiatis
        set_base_quota = options.get('set_base_quota')
290 764d99c4 Giorgos Korfiatis
        if set_base_quota is not None:
291 764d99c4 Giorgos Korfiatis
            resource, capacity = set_base_quota
292 764d99c4 Giorgos Korfiatis
            self.set_limit(user, resource, capacity, False)
293 764d99c4 Giorgos Korfiatis
294 764d99c4 Giorgos Korfiatis
    def set_limit(self, user, resource, capacity, force):
295 44f510e1 Giorgos Korfiatis
        style = None
296 764d99c4 Giorgos Korfiatis
        if capacity != 'default':
297 764d99c4 Giorgos Korfiatis
            try:
298 44f510e1 Giorgos Korfiatis
                capacity, style = units.parse_with_style(capacity)
299 44f510e1 Giorgos Korfiatis
            except:
300 764d99c4 Giorgos Korfiatis
                m = "Please specify capacity as a decimal integer or 'default'"
301 764d99c4 Giorgos Korfiatis
                raise CommandError(m)
302 764d99c4 Giorgos Korfiatis
303 764d99c4 Giorgos Korfiatis
        try:
304 764d99c4 Giorgos Korfiatis
            quota, default_capacity = user.get_resource_policy(resource)
305 764d99c4 Giorgos Korfiatis
        except Resource.DoesNotExist:
306 764d99c4 Giorgos Korfiatis
            raise CommandError("No such resource: %s" % resource)
307 764d99c4 Giorgos Korfiatis
308 764d99c4 Giorgos Korfiatis
        if not force:
309 44f510e1 Giorgos Korfiatis
            s_default = show_resource_value(default_capacity, resource, style)
310 44f510e1 Giorgos Korfiatis
            s_current = (show_resource_value(quota.capacity, resource, style)
311 44f510e1 Giorgos Korfiatis
                         if quota is not None else 'default')
312 44f510e1 Giorgos Korfiatis
            s_capacity = (show_resource_value(capacity, resource, style)
313 44f510e1 Giorgos Korfiatis
                          if capacity != 'default' else capacity)
314 764d99c4 Giorgos Korfiatis
            self.stdout.write("user: %s (%s)\n" % (user.uuid, user.username))
315 44f510e1 Giorgos Korfiatis
            self.stdout.write("default capacity: %s\n" % s_default)
316 44f510e1 Giorgos Korfiatis
            self.stdout.write("current capacity: %s\n" % s_current)
317 44f510e1 Giorgos Korfiatis
            self.stdout.write("new capacity: %s\n" % s_capacity)
318 764d99c4 Giorgos Korfiatis
            self.stdout.write("Confirm? (y/n) ")
319 764d99c4 Giorgos Korfiatis
            response = raw_input()
320 764d99c4 Giorgos Korfiatis
            if string.lower(response) not in ['y', 'yes']:
321 764d99c4 Giorgos Korfiatis
                self.stdout.write("Aborted.\n")
322 764d99c4 Giorgos Korfiatis
                return
323 764d99c4 Giorgos Korfiatis
324 764d99c4 Giorgos Korfiatis
        if capacity == 'default':
325 764d99c4 Giorgos Korfiatis
            try:
326 764d99c4 Giorgos Korfiatis
                quotas.remove_base_quota(user, resource)
327 764d99c4 Giorgos Korfiatis
            except Exception as e:
328 764d99c4 Giorgos Korfiatis
                import traceback
329 764d99c4 Giorgos Korfiatis
                traceback.print_exc()
330 764d99c4 Giorgos Korfiatis
                raise CommandError("Failed to remove policy: %s" % e)
331 764d99c4 Giorgos Korfiatis
        else:
332 764d99c4 Giorgos Korfiatis
            try:
333 764d99c4 Giorgos Korfiatis
                quotas.add_base_quota(user, resource, capacity)
334 764d99c4 Giorgos Korfiatis
            except Exception as e:
335 764d99c4 Giorgos Korfiatis
                raise CommandError("Failed to add policy: %s" % e)