Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (13.1 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 df456124 Giorgos Korfiatis
        make_option('-f', '--no-confirm',
139 df456124 Giorgos Korfiatis
                    action='store_true',
140 df456124 Giorgos Korfiatis
                    default=False,
141 df456124 Giorgos Korfiatis
                    dest='force',
142 df456124 Giorgos Korfiatis
                    help="Do not ask for confirmation"),
143 9a06d96f Olga Brani
    )
144 9a06d96f Olga Brani
145 200b37fb Giorgos Korfiatis
    @commit_on_success_strict()
146 df48dd1b Giorgos Verigakis
    def handle(self, *args, **options):
147 df48dd1b Giorgos Verigakis
        if len(args) != 1:
148 0a569195 Sofia Papagiannaki
            raise CommandError("Please provide a user ID")
149 5ce3ce4f Sofia Papagiannaki
150 0a569195 Sofia Papagiannaki
        if args[0].isdigit():
151 92359537 Sofia Papagiannaki
            try:
152 92359537 Sofia Papagiannaki
                user = AstakosUser.objects.get(id=int(args[0]))
153 92359537 Sofia Papagiannaki
            except AstakosUser.DoesNotExist:
154 92359537 Sofia Papagiannaki
                raise CommandError("Invalid user ID")
155 92359537 Sofia Papagiannaki
        elif is_uuid(args[0]):
156 92359537 Sofia Papagiannaki
            try:
157 92359537 Sofia Papagiannaki
                user = AstakosUser.objects.get(uuid=args[0])
158 92359537 Sofia Papagiannaki
            except AstakosUser.DoesNotExist:
159 92359537 Sofia Papagiannaki
                raise CommandError("Invalid user UUID")
160 0a569195 Sofia Papagiannaki
        else:
161 92359537 Sofia Papagiannaki
            raise CommandError(("Invalid user identification: "
162 92359537 Sofia Papagiannaki
                                "you should provide a valid user ID "
163 92359537 Sofia Papagiannaki
                                "or a valid user UUID"))
164 5ce3ce4f Sofia Papagiannaki
165 df48dd1b Giorgos Verigakis
        if options.get('admin'):
166 df48dd1b Giorgos Verigakis
            user.is_superuser = True
167 df48dd1b Giorgos Verigakis
        elif options.get('noadmin'):
168 df48dd1b Giorgos Verigakis
            user.is_superuser = False
169 5ce3ce4f Sofia Papagiannaki
170 e7cb4085 Kostas Papadimitriou
        if options.get('reject'):
171 e7cb4085 Kostas Papadimitriou
            reject_reason = options.get('reject_reason', None)
172 e7cb4085 Kostas Papadimitriou
            res = activation_backend.handle_moderation(
173 e7cb4085 Kostas Papadimitriou
                user,
174 e7cb4085 Kostas Papadimitriou
                accept=False,
175 e7cb4085 Kostas Papadimitriou
                reject_reason=reject_reason)
176 e7cb4085 Kostas Papadimitriou
            activation_backend.send_result_notifications(res, user)
177 e7cb4085 Kostas Papadimitriou
            if res.is_error():
178 e7cb4085 Kostas Papadimitriou
                print "Failed to reject.", res.message
179 e7cb4085 Kostas Papadimitriou
            else:
180 e7cb4085 Kostas Papadimitriou
                print "Account rejected"
181 e7cb4085 Kostas Papadimitriou
182 abf57c77 Kostas Papadimitriou
        if options.get('verify'):
183 abf57c77 Kostas Papadimitriou
            res = activation_backend.handle_verification(
184 abf57c77 Kostas Papadimitriou
                user,
185 abf57c77 Kostas Papadimitriou
                user.verification_code)
186 abf57c77 Kostas Papadimitriou
            #activation_backend.send_result_notifications(res, user)
187 abf57c77 Kostas Papadimitriou
            if res.is_error():
188 abf57c77 Kostas Papadimitriou
                print "Failed to verify.", res.message
189 abf57c77 Kostas Papadimitriou
            else:
190 abf57c77 Kostas Papadimitriou
                print "Account verified (%s)" % res.status_display()
191 abf57c77 Kostas Papadimitriou
192 e7cb4085 Kostas Papadimitriou
        if options.get('accept'):
193 e7cb4085 Kostas Papadimitriou
            res = activation_backend.handle_moderation(user, accept=True)
194 e7cb4085 Kostas Papadimitriou
            activation_backend.send_result_notifications(res, user)
195 e7cb4085 Kostas Papadimitriou
            if res.is_error():
196 e7cb4085 Kostas Papadimitriou
                print "Failed to accept.", res.message
197 e7cb4085 Kostas Papadimitriou
            else:
198 e7cb4085 Kostas Papadimitriou
                print "Account accepted and activated"
199 e7cb4085 Kostas Papadimitriou
200 ebd369d0 Sofia Papagiannaki
        if options.get('active'):
201 e7cb4085 Kostas Papadimitriou
            res = activation_backend.activate_user(user)
202 e7cb4085 Kostas Papadimitriou
            if res.is_error():
203 e7cb4085 Kostas Papadimitriou
                print "Failed to activate.", res.message
204 e7cb4085 Kostas Papadimitriou
            else:
205 e7cb4085 Kostas Papadimitriou
                print "Account %s activated" % user.username
206 e7cb4085 Kostas Papadimitriou
207 ebd369d0 Sofia Papagiannaki
        elif options.get('inactive'):
208 e7cb4085 Kostas Papadimitriou
            res = activation_backend.deactivate_user(
209 e7cb4085 Kostas Papadimitriou
                user,
210 e7cb4085 Kostas Papadimitriou
                reason=options.get('inactive_reason', None))
211 e7cb4085 Kostas Papadimitriou
            if res.is_error():
212 e7cb4085 Kostas Papadimitriou
                print "Failed to deactivate,", res.message
213 e7cb4085 Kostas Papadimitriou
            else:
214 e7cb4085 Kostas Papadimitriou
                print "Account %s deactivated" % user.username
215 5ce3ce4f Sofia Papagiannaki
216 df48dd1b Giorgos Verigakis
        invitations = options.get('invitations')
217 df48dd1b Giorgos Verigakis
        if invitations is not None:
218 df48dd1b Giorgos Verigakis
            user.invitations = int(invitations)
219 5ce3ce4f Sofia Papagiannaki
220 4e30244e Sofia Papagiannaki
        groupname = options.get('add-group')
221 18ffbee1 Sofia Papagiannaki
        if groupname is not None:
222 18ffbee1 Sofia Papagiannaki
            try:
223 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
224 9a06d96f Olga Brani
                user.groups.add(group)
225 9a06d96f Olga Brani
            except Group.DoesNotExist, e:
226 5ce3ce4f Sofia Papagiannaki
                self.stdout.write(
227 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
228 5ce3ce4f Sofia Papagiannaki
229 4e30244e Sofia Papagiannaki
        groupname = options.get('delete-group')
230 4e30244e Sofia Papagiannaki
        if groupname is not None:
231 4e30244e Sofia Papagiannaki
            try:
232 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
233 9a06d96f Olga Brani
                user.groups.remove(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 30dc8c1a Sofia Papagiannaki
        pname = options.get('add-permission')
239 30dc8c1a Sofia Papagiannaki
        if pname is not None:
240 30dc8c1a Sofia Papagiannaki
            try:
241 30dc8c1a Sofia Papagiannaki
                r, created = add_user_permission(user, pname)
242 30dc8c1a Sofia Papagiannaki
                if created:
243 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
244 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s created successfully\n' % pname)
245 30dc8c1a Sofia Papagiannaki
                if r > 0:
246 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
247 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s added successfully\n' % pname)
248 5ce3ce4f Sofia Papagiannaki
                elif r == 0:
249 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
250 5ce3ce4f Sofia Papagiannaki
                        'User has already permission: %s\n' % pname)
251 30dc8c1a Sofia Papagiannaki
            except Exception, e:
252 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
253 5ce3ce4f Sofia Papagiannaki
254 5ce3ce4f Sofia Papagiannaki
        pname = options.get('delete-permission')
255 30dc8c1a Sofia Papagiannaki
        if pname is not None and not user.has_perm(pname):
256 30dc8c1a Sofia Papagiannaki
            try:
257 30dc8c1a Sofia Papagiannaki
                r = remove_user_permission(user, pname)
258 30dc8c1a Sofia Papagiannaki
                if r < 0:
259 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
260 5ce3ce4f Sofia Papagiannaki
                        'Invalid permission codename: %s\n' % pname)
261 30dc8c1a Sofia Papagiannaki
                elif r == 0:
262 30dc8c1a Sofia Papagiannaki
                    self.stdout.write('User has not permission: %s\n' % pname)
263 30dc8c1a Sofia Papagiannaki
                elif r > 0:
264 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
265 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s removed successfully\n' % pname)
266 30dc8c1a Sofia Papagiannaki
            except Exception, e:
267 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
268 5ce3ce4f Sofia Papagiannaki
269 ebd369d0 Sofia Papagiannaki
        level = options.get('level')
270 ebd369d0 Sofia Papagiannaki
        if level is not None:
271 ebd369d0 Sofia Papagiannaki
            user.level = int(level)
272 5ce3ce4f Sofia Papagiannaki
273 df48dd1b Giorgos Verigakis
        password = options.get('password')
274 df48dd1b Giorgos Verigakis
        if password is not None:
275 df48dd1b Giorgos Verigakis
            user.set_password(password)
276 5ce3ce4f Sofia Papagiannaki
277 cfb15117 Sofia Papagiannaki
        password = None
278 cfb15117 Sofia Papagiannaki
        if options['renew_password']:
279 cfb15117 Sofia Papagiannaki
            password = AstakosUser.objects.make_random_password()
280 cfb15117 Sofia Papagiannaki
            user.set_password(password)
281 5ce3ce4f Sofia Papagiannaki
282 df48dd1b Giorgos Verigakis
        if options['renew_token']:
283 df48dd1b Giorgos Verigakis
            user.renew_token()
284 5ce3ce4f Sofia Papagiannaki
285 0a569195 Sofia Papagiannaki
        try:
286 0a569195 Sofia Papagiannaki
            user.save()
287 0a569195 Sofia Papagiannaki
        except ValidationError, e:
288 27e26a41 Sofia Papagiannaki
            raise CommandError(e)
289 5ce3ce4f Sofia Papagiannaki
290 cfb15117 Sofia Papagiannaki
        if password:
291 cfb15117 Sofia Papagiannaki
            self.stdout.write('User\'s new password: %s\n' % password)
292 764d99c4 Giorgos Korfiatis
293 df456124 Giorgos Korfiatis
        force = options['force']
294 df456124 Giorgos Korfiatis
295 764d99c4 Giorgos Korfiatis
        set_base_quota = options.get('set_base_quota')
296 764d99c4 Giorgos Korfiatis
        if set_base_quota is not None:
297 764d99c4 Giorgos Korfiatis
            resource, capacity = set_base_quota
298 df456124 Giorgos Korfiatis
            self.set_limit(user, resource, capacity, force)
299 764d99c4 Giorgos Korfiatis
300 764d99c4 Giorgos Korfiatis
    def set_limit(self, user, resource, capacity, force):
301 44f510e1 Giorgos Korfiatis
        style = None
302 764d99c4 Giorgos Korfiatis
        if capacity != 'default':
303 764d99c4 Giorgos Korfiatis
            try:
304 44f510e1 Giorgos Korfiatis
                capacity, style = units.parse_with_style(capacity)
305 44f510e1 Giorgos Korfiatis
            except:
306 764d99c4 Giorgos Korfiatis
                m = "Please specify capacity as a decimal integer or 'default'"
307 764d99c4 Giorgos Korfiatis
                raise CommandError(m)
308 764d99c4 Giorgos Korfiatis
309 764d99c4 Giorgos Korfiatis
        try:
310 764d99c4 Giorgos Korfiatis
            quota, default_capacity = user.get_resource_policy(resource)
311 764d99c4 Giorgos Korfiatis
        except Resource.DoesNotExist:
312 764d99c4 Giorgos Korfiatis
            raise CommandError("No such resource: %s" % resource)
313 764d99c4 Giorgos Korfiatis
314 764d99c4 Giorgos Korfiatis
        if not force:
315 44f510e1 Giorgos Korfiatis
            s_default = show_resource_value(default_capacity, resource, style)
316 44f510e1 Giorgos Korfiatis
            s_current = (show_resource_value(quota.capacity, resource, style)
317 44f510e1 Giorgos Korfiatis
                         if quota is not None else 'default')
318 44f510e1 Giorgos Korfiatis
            s_capacity = (show_resource_value(capacity, resource, style)
319 44f510e1 Giorgos Korfiatis
                          if capacity != 'default' else capacity)
320 764d99c4 Giorgos Korfiatis
            self.stdout.write("user: %s (%s)\n" % (user.uuid, user.username))
321 44f510e1 Giorgos Korfiatis
            self.stdout.write("default capacity: %s\n" % s_default)
322 44f510e1 Giorgos Korfiatis
            self.stdout.write("current capacity: %s\n" % s_current)
323 44f510e1 Giorgos Korfiatis
            self.stdout.write("new capacity: %s\n" % s_capacity)
324 764d99c4 Giorgos Korfiatis
            self.stdout.write("Confirm? (y/n) ")
325 764d99c4 Giorgos Korfiatis
            response = raw_input()
326 764d99c4 Giorgos Korfiatis
            if string.lower(response) not in ['y', 'yes']:
327 764d99c4 Giorgos Korfiatis
                self.stdout.write("Aborted.\n")
328 764d99c4 Giorgos Korfiatis
                return
329 764d99c4 Giorgos Korfiatis
330 764d99c4 Giorgos Korfiatis
        if capacity == 'default':
331 764d99c4 Giorgos Korfiatis
            try:
332 764d99c4 Giorgos Korfiatis
                quotas.remove_base_quota(user, resource)
333 764d99c4 Giorgos Korfiatis
            except Exception as e:
334 764d99c4 Giorgos Korfiatis
                import traceback
335 764d99c4 Giorgos Korfiatis
                traceback.print_exc()
336 764d99c4 Giorgos Korfiatis
                raise CommandError("Failed to remove policy: %s" % e)
337 764d99c4 Giorgos Korfiatis
        else:
338 764d99c4 Giorgos Korfiatis
            try:
339 764d99c4 Giorgos Korfiatis
                quotas.add_base_quota(user, resource, capacity)
340 764d99c4 Giorgos Korfiatis
            except Exception as e:
341 764d99c4 Giorgos Korfiatis
                raise CommandError("Failed to add policy: %s" % e)