Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (16.9 kB)

1 84f6149c Giorgos Korfiatis
# Copyright 2012, 2013, 2014 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 ef1fb98b Giorgos Korfiatis
from datetime import datetime
36 e7cb4085 Kostas Papadimitriou
37 df48dd1b Giorgos Verigakis
from optparse import make_option
38 df48dd1b Giorgos Verigakis
39 9eb2c9a6 Kostas Papadimitriou
from django.core import management
40 a3e3917f Giorgos Korfiatis
from django.db import transaction
41 df48dd1b Giorgos Verigakis
from django.core.management.base import BaseCommand, CommandError
42 c0b26605 Sofia Papagiannaki
from django.contrib.auth.models import Group
43 0a569195 Sofia Papagiannaki
from django.core.exceptions import ValidationError
44 9eb2c9a6 Kostas Papadimitriou
from django.core.validators import validate_email
45 df48dd1b Giorgos Verigakis
46 44f510e1 Giorgos Korfiatis
from synnefo.util import units
47 45112d5a Giorgos Korfiatis
from astakos.im.models import AstakosUser, Resource
48 764d99c4 Giorgos Korfiatis
from astakos.im import quotas
49 e7cb4085 Kostas Papadimitriou
from astakos.im import activation_backends
50 44f510e1 Giorgos Korfiatis
from ._common import (remove_user_permission, add_user_permission, is_uuid,
51 44f510e1 Giorgos Korfiatis
                      show_resource_value)
52 e7cb4085 Kostas Papadimitriou
53 e7cb4085 Kostas Papadimitriou
activation_backend = activation_backends.get_backend()
54 df48dd1b Giorgos Verigakis
55 5ce3ce4f Sofia Papagiannaki
56 df48dd1b Giorgos Verigakis
class Command(BaseCommand):
57 45112d5a Giorgos Korfiatis
    args = "<user ID> (or --all)"
58 df48dd1b Giorgos Verigakis
    help = "Modify a user's attributes"
59 5ce3ce4f Sofia Papagiannaki
60 9a06d96f Olga Brani
    option_list = BaseCommand.option_list + (
61 45112d5a Giorgos Korfiatis
        make_option('--all',
62 45112d5a Giorgos Korfiatis
                    action='store_true',
63 45112d5a Giorgos Korfiatis
                    default=False,
64 45112d5a Giorgos Korfiatis
                    help=("Operate on all users. Currently only setting "
65 45112d5a Giorgos Korfiatis
                          "base quota is supported in this mode. Can be "
66 45112d5a Giorgos Korfiatis
                          "combined with `--exclude'.")),
67 45112d5a Giorgos Korfiatis
        make_option('--exclude',
68 45112d5a Giorgos Korfiatis
                    help=("If `--all' is given, exclude users given as a "
69 45112d5a Giorgos Korfiatis
                          "list of uuids: uuid1,uuid2,uuid3")),
70 df48dd1b Giorgos Verigakis
        make_option('--invitations',
71 5ce3ce4f Sofia Papagiannaki
                    dest='invitations',
72 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
73 5ce3ce4f Sofia Papagiannaki
                    help="Update user's invitations"),
74 ebd369d0 Sofia Papagiannaki
        make_option('--level',
75 5ce3ce4f Sofia Papagiannaki
                    dest='level',
76 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
77 5ce3ce4f Sofia Papagiannaki
                    help="Update user's level"),
78 df48dd1b Giorgos Verigakis
        make_option('--password',
79 5ce3ce4f Sofia Papagiannaki
                    dest='password',
80 5ce3ce4f Sofia Papagiannaki
                    metavar='PASSWORD',
81 5ce3ce4f Sofia Papagiannaki
                    help="Set user's password"),
82 df48dd1b Giorgos Verigakis
        make_option('--renew-token',
83 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
84 5ce3ce4f Sofia Papagiannaki
                    dest='renew_token',
85 5ce3ce4f Sofia Papagiannaki
                    default=False,
86 5ce3ce4f Sofia Papagiannaki
                    help="Renew the user's token"),
87 cfb15117 Sofia Papagiannaki
        make_option('--renew-password',
88 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
89 5ce3ce4f Sofia Papagiannaki
                    dest='renew_password',
90 5ce3ce4f Sofia Papagiannaki
                    default=False,
91 5ce3ce4f Sofia Papagiannaki
                    help="Renew the user's password"),
92 df48dd1b Giorgos Verigakis
        make_option('--set-admin',
93 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
94 5ce3ce4f Sofia Papagiannaki
                    dest='admin',
95 5ce3ce4f Sofia Papagiannaki
                    default=False,
96 5ce3ce4f Sofia Papagiannaki
                    help="Give user admin rights"),
97 df48dd1b Giorgos Verigakis
        make_option('--set-noadmin',
98 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
99 5ce3ce4f Sofia Papagiannaki
                    dest='noadmin',
100 5ce3ce4f Sofia Papagiannaki
                    default=False,
101 5ce3ce4f Sofia Papagiannaki
                    help="Revoke user's admin rights"),
102 ebd369d0 Sofia Papagiannaki
        make_option('--set-active',
103 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
104 5ce3ce4f Sofia Papagiannaki
                    dest='active',
105 5ce3ce4f Sofia Papagiannaki
                    default=False,
106 21e0fdad Giorgos Korfiatis
                    help="Change user's state to active"),
107 ebd369d0 Sofia Papagiannaki
        make_option('--set-inactive',
108 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
109 5ce3ce4f Sofia Papagiannaki
                    dest='inactive',
110 5ce3ce4f Sofia Papagiannaki
                    default=False,
111 5ce3ce4f Sofia Papagiannaki
                    help="Change user's state to inactive"),
112 e7cb4085 Kostas Papadimitriou
        make_option('--inactive-reason',
113 e7cb4085 Kostas Papadimitriou
                    dest='inactive_reason',
114 e7cb4085 Kostas Papadimitriou
                    help="Reason user got inactive"),
115 4e30244e Sofia Papagiannaki
        make_option('--add-group',
116 5ce3ce4f Sofia Papagiannaki
                    dest='add-group',
117 5ce3ce4f Sofia Papagiannaki
                    help="Add user group"),
118 4e30244e Sofia Papagiannaki
        make_option('--delete-group',
119 5ce3ce4f Sofia Papagiannaki
                    dest='delete-group',
120 5ce3ce4f Sofia Papagiannaki
                    help="Delete user group"),
121 30dc8c1a Sofia Papagiannaki
        make_option('--add-permission',
122 5ce3ce4f Sofia Papagiannaki
                    dest='add-permission',
123 5ce3ce4f Sofia Papagiannaki
                    help="Add user permission"),
124 30dc8c1a Sofia Papagiannaki
        make_option('--delete-permission',
125 5ce3ce4f Sofia Papagiannaki
                    dest='delete-permission',
126 5ce3ce4f Sofia Papagiannaki
                    help="Delete user permission"),
127 e7cb4085 Kostas Papadimitriou
        make_option('--accept',
128 e7cb4085 Kostas Papadimitriou
                    dest='accept',
129 e7cb4085 Kostas Papadimitriou
                    action='store_true',
130 e7cb4085 Kostas Papadimitriou
                    help="Accept user"),
131 abf57c77 Kostas Papadimitriou
        make_option('--verify',
132 abf57c77 Kostas Papadimitriou
                    dest='verify',
133 abf57c77 Kostas Papadimitriou
                    action='store_true',
134 abf57c77 Kostas Papadimitriou
                    help="Verify user email"),
135 e7cb4085 Kostas Papadimitriou
        make_option('--reject',
136 e7cb4085 Kostas Papadimitriou
                    dest='reject',
137 e7cb4085 Kostas Papadimitriou
                    action='store_true',
138 e7cb4085 Kostas Papadimitriou
                    help="Reject user"),
139 e7cb4085 Kostas Papadimitriou
        make_option('--reject-reason',
140 e7cb4085 Kostas Papadimitriou
                    dest='reject_reason',
141 e7cb4085 Kostas Papadimitriou
                    help="Reason user got rejected"),
142 ef1fb98b Giorgos Korfiatis
        make_option('--sign-terms',
143 ef1fb98b Giorgos Korfiatis
                    default=False,
144 ef1fb98b Giorgos Korfiatis
                    action='store_true',
145 ef1fb98b Giorgos Korfiatis
                    help="Sign terms"),
146 45112d5a Giorgos Korfiatis
        make_option('--base-quota',
147 764d99c4 Giorgos Korfiatis
                    dest='set_base_quota',
148 764d99c4 Giorgos Korfiatis
                    metavar='<resource> <capacity>',
149 764d99c4 Giorgos Korfiatis
                    nargs=2,
150 764d99c4 Giorgos Korfiatis
                    help=("Set base quota for a specified resource. "
151 764d99c4 Giorgos Korfiatis
                          "The special value 'default' sets the user base "
152 764d99c4 Giorgos Korfiatis
                          "quota to the default value.")
153 764d99c4 Giorgos Korfiatis
                    ),
154 df456124 Giorgos Korfiatis
        make_option('-f', '--no-confirm',
155 df456124 Giorgos Korfiatis
                    action='store_true',
156 df456124 Giorgos Korfiatis
                    default=False,
157 df456124 Giorgos Korfiatis
                    dest='force',
158 df456124 Giorgos Korfiatis
                    help="Do not ask for confirmation"),
159 9eb2c9a6 Kostas Papadimitriou
        make_option('--set-email',
160 9eb2c9a6 Kostas Papadimitriou
                    dest='set-email',
161 9eb2c9a6 Kostas Papadimitriou
                    help="Change user's email"),
162 9eb2c9a6 Kostas Papadimitriou
        make_option('--delete',
163 9eb2c9a6 Kostas Papadimitriou
                    dest='delete',
164 9eb2c9a6 Kostas Papadimitriou
                    action='store_true',
165 84f6149c Giorgos Korfiatis
                    help="Delete a non-accepted user"),
166 9a06d96f Olga Brani
    )
167 9a06d96f Olga Brani
168 a3e3917f Giorgos Korfiatis
    @transaction.commit_on_success
169 df48dd1b Giorgos Verigakis
    def handle(self, *args, **options):
170 45112d5a Giorgos Korfiatis
        if options['all']:
171 45112d5a Giorgos Korfiatis
            if not args:
172 45112d5a Giorgos Korfiatis
                return self.handle_all_users(*args, **options)
173 45112d5a Giorgos Korfiatis
            else:
174 45112d5a Giorgos Korfiatis
                raise CommandError("Please provide a user ID or --all")
175 45112d5a Giorgos Korfiatis
176 df48dd1b Giorgos Verigakis
        if len(args) != 1:
177 45112d5a Giorgos Korfiatis
            raise CommandError("Please provide a user ID or --all")
178 45112d5a Giorgos Korfiatis
179 45112d5a Giorgos Korfiatis
        if options["exclude"] is not None:
180 45112d5a Giorgos Korfiatis
            m = "Option --exclude is meaningful only combined with --all."
181 45112d5a Giorgos Korfiatis
            raise CommandError(m)
182 5ce3ce4f Sofia Papagiannaki
183 0a569195 Sofia Papagiannaki
        if args[0].isdigit():
184 92359537 Sofia Papagiannaki
            try:
185 45112d5a Giorgos Korfiatis
                user = AstakosUser.objects.select_for_update().\
186 45112d5a Giorgos Korfiatis
                    get(id=int(args[0]))
187 92359537 Sofia Papagiannaki
            except AstakosUser.DoesNotExist:
188 92359537 Sofia Papagiannaki
                raise CommandError("Invalid user ID")
189 92359537 Sofia Papagiannaki
        elif is_uuid(args[0]):
190 92359537 Sofia Papagiannaki
            try:
191 92359537 Sofia Papagiannaki
                user = AstakosUser.objects.get(uuid=args[0])
192 92359537 Sofia Papagiannaki
            except AstakosUser.DoesNotExist:
193 92359537 Sofia Papagiannaki
                raise CommandError("Invalid user UUID")
194 0a569195 Sofia Papagiannaki
        else:
195 92359537 Sofia Papagiannaki
            raise CommandError(("Invalid user identification: "
196 92359537 Sofia Papagiannaki
                                "you should provide a valid user ID "
197 92359537 Sofia Papagiannaki
                                "or a valid user UUID"))
198 5ce3ce4f Sofia Papagiannaki
199 df48dd1b Giorgos Verigakis
        if options.get('admin'):
200 df48dd1b Giorgos Verigakis
            user.is_superuser = True
201 df48dd1b Giorgos Verigakis
        elif options.get('noadmin'):
202 df48dd1b Giorgos Verigakis
            user.is_superuser = False
203 5ce3ce4f Sofia Papagiannaki
204 e7cb4085 Kostas Papadimitriou
        if options.get('reject'):
205 e7cb4085 Kostas Papadimitriou
            reject_reason = options.get('reject_reason', None)
206 e7cb4085 Kostas Papadimitriou
            res = activation_backend.handle_moderation(
207 e7cb4085 Kostas Papadimitriou
                user,
208 e7cb4085 Kostas Papadimitriou
                accept=False,
209 e7cb4085 Kostas Papadimitriou
                reject_reason=reject_reason)
210 e7cb4085 Kostas Papadimitriou
            activation_backend.send_result_notifications(res, user)
211 e7cb4085 Kostas Papadimitriou
            if res.is_error():
212 e7cb4085 Kostas Papadimitriou
                print "Failed to reject.", res.message
213 e7cb4085 Kostas Papadimitriou
            else:
214 e7cb4085 Kostas Papadimitriou
                print "Account rejected"
215 e7cb4085 Kostas Papadimitriou
216 abf57c77 Kostas Papadimitriou
        if options.get('verify'):
217 abf57c77 Kostas Papadimitriou
            res = activation_backend.handle_verification(
218 abf57c77 Kostas Papadimitriou
                user,
219 abf57c77 Kostas Papadimitriou
                user.verification_code)
220 abf57c77 Kostas Papadimitriou
            #activation_backend.send_result_notifications(res, user)
221 abf57c77 Kostas Papadimitriou
            if res.is_error():
222 abf57c77 Kostas Papadimitriou
                print "Failed to verify.", res.message
223 abf57c77 Kostas Papadimitriou
            else:
224 abf57c77 Kostas Papadimitriou
                print "Account verified (%s)" % res.status_display()
225 abf57c77 Kostas Papadimitriou
226 e7cb4085 Kostas Papadimitriou
        if options.get('accept'):
227 e7cb4085 Kostas Papadimitriou
            res = activation_backend.handle_moderation(user, accept=True)
228 e7cb4085 Kostas Papadimitriou
            activation_backend.send_result_notifications(res, user)
229 e7cb4085 Kostas Papadimitriou
            if res.is_error():
230 e7cb4085 Kostas Papadimitriou
                print "Failed to accept.", res.message
231 e7cb4085 Kostas Papadimitriou
            else:
232 e7cb4085 Kostas Papadimitriou
                print "Account accepted and activated"
233 e7cb4085 Kostas Papadimitriou
234 ebd369d0 Sofia Papagiannaki
        if options.get('active'):
235 e7cb4085 Kostas Papadimitriou
            res = activation_backend.activate_user(user)
236 e7cb4085 Kostas Papadimitriou
            if res.is_error():
237 e7cb4085 Kostas Papadimitriou
                print "Failed to activate.", res.message
238 e7cb4085 Kostas Papadimitriou
            else:
239 e7cb4085 Kostas Papadimitriou
                print "Account %s activated" % user.username
240 e7cb4085 Kostas Papadimitriou
241 ebd369d0 Sofia Papagiannaki
        elif options.get('inactive'):
242 e7cb4085 Kostas Papadimitriou
            res = activation_backend.deactivate_user(
243 e7cb4085 Kostas Papadimitriou
                user,
244 e7cb4085 Kostas Papadimitriou
                reason=options.get('inactive_reason', None))
245 e7cb4085 Kostas Papadimitriou
            if res.is_error():
246 e7cb4085 Kostas Papadimitriou
                print "Failed to deactivate,", res.message
247 e7cb4085 Kostas Papadimitriou
            else:
248 e7cb4085 Kostas Papadimitriou
                print "Account %s deactivated" % user.username
249 5ce3ce4f Sofia Papagiannaki
250 df48dd1b Giorgos Verigakis
        invitations = options.get('invitations')
251 df48dd1b Giorgos Verigakis
        if invitations is not None:
252 df48dd1b Giorgos Verigakis
            user.invitations = int(invitations)
253 5ce3ce4f Sofia Papagiannaki
254 4e30244e Sofia Papagiannaki
        groupname = options.get('add-group')
255 18ffbee1 Sofia Papagiannaki
        if groupname is not None:
256 18ffbee1 Sofia Papagiannaki
            try:
257 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
258 9a06d96f Olga Brani
                user.groups.add(group)
259 9a06d96f Olga Brani
            except Group.DoesNotExist, e:
260 4220c336 Giorgos Korfiatis
                self.stderr.write(
261 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
262 5ce3ce4f Sofia Papagiannaki
263 4e30244e Sofia Papagiannaki
        groupname = options.get('delete-group')
264 4e30244e Sofia Papagiannaki
        if groupname is not None:
265 4e30244e Sofia Papagiannaki
            try:
266 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
267 9a06d96f Olga Brani
                user.groups.remove(group)
268 9a06d96f Olga Brani
            except Group.DoesNotExist, e:
269 4220c336 Giorgos Korfiatis
                self.stderr.write(
270 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
271 5ce3ce4f Sofia Papagiannaki
272 30dc8c1a Sofia Papagiannaki
        pname = options.get('add-permission')
273 30dc8c1a Sofia Papagiannaki
        if pname is not None:
274 30dc8c1a Sofia Papagiannaki
            try:
275 30dc8c1a Sofia Papagiannaki
                r, created = add_user_permission(user, pname)
276 30dc8c1a Sofia Papagiannaki
                if created:
277 4220c336 Giorgos Korfiatis
                    self.stderr.write(
278 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s created successfully\n' % pname)
279 30dc8c1a Sofia Papagiannaki
                if r > 0:
280 4220c336 Giorgos Korfiatis
                    self.stderr.write(
281 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s added successfully\n' % pname)
282 5ce3ce4f Sofia Papagiannaki
                elif r == 0:
283 4220c336 Giorgos Korfiatis
                    self.stderr.write(
284 5ce3ce4f Sofia Papagiannaki
                        'User has already permission: %s\n' % pname)
285 30dc8c1a Sofia Papagiannaki
            except Exception, e:
286 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
287 5ce3ce4f Sofia Papagiannaki
288 5ce3ce4f Sofia Papagiannaki
        pname = options.get('delete-permission')
289 30dc8c1a Sofia Papagiannaki
        if pname is not None and not user.has_perm(pname):
290 30dc8c1a Sofia Papagiannaki
            try:
291 30dc8c1a Sofia Papagiannaki
                r = remove_user_permission(user, pname)
292 30dc8c1a Sofia Papagiannaki
                if r < 0:
293 4220c336 Giorgos Korfiatis
                    self.stderr.write(
294 5ce3ce4f Sofia Papagiannaki
                        'Invalid permission codename: %s\n' % pname)
295 30dc8c1a Sofia Papagiannaki
                elif r == 0:
296 4220c336 Giorgos Korfiatis
                    self.stderr.write('User has not permission: %s\n' % pname)
297 30dc8c1a Sofia Papagiannaki
                elif r > 0:
298 4220c336 Giorgos Korfiatis
                    self.stderr.write(
299 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s removed successfully\n' % pname)
300 30dc8c1a Sofia Papagiannaki
            except Exception, e:
301 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
302 5ce3ce4f Sofia Papagiannaki
303 ebd369d0 Sofia Papagiannaki
        level = options.get('level')
304 ebd369d0 Sofia Papagiannaki
        if level is not None:
305 ebd369d0 Sofia Papagiannaki
            user.level = int(level)
306 5ce3ce4f Sofia Papagiannaki
307 df48dd1b Giorgos Verigakis
        password = options.get('password')
308 df48dd1b Giorgos Verigakis
        if password is not None:
309 df48dd1b Giorgos Verigakis
            user.set_password(password)
310 5ce3ce4f Sofia Papagiannaki
311 cfb15117 Sofia Papagiannaki
        password = None
312 cfb15117 Sofia Papagiannaki
        if options['renew_password']:
313 cfb15117 Sofia Papagiannaki
            password = AstakosUser.objects.make_random_password()
314 cfb15117 Sofia Papagiannaki
            user.set_password(password)
315 5ce3ce4f Sofia Papagiannaki
316 df48dd1b Giorgos Verigakis
        if options['renew_token']:
317 df48dd1b Giorgos Verigakis
            user.renew_token()
318 5ce3ce4f Sofia Papagiannaki
319 ef1fb98b Giorgos Korfiatis
        if options['sign_terms']:
320 ef1fb98b Giorgos Korfiatis
            user.has_signed_terms = True
321 ef1fb98b Giorgos Korfiatis
            user.date_signed_terms = datetime.now()
322 ef1fb98b Giorgos Korfiatis
323 0a569195 Sofia Papagiannaki
        try:
324 0a569195 Sofia Papagiannaki
            user.save()
325 0a569195 Sofia Papagiannaki
        except ValidationError, e:
326 27e26a41 Sofia Papagiannaki
            raise CommandError(e)
327 5ce3ce4f Sofia Papagiannaki
328 cfb15117 Sofia Papagiannaki
        if password:
329 cfb15117 Sofia Papagiannaki
            self.stdout.write('User\'s new password: %s\n' % password)
330 764d99c4 Giorgos Korfiatis
331 df456124 Giorgos Korfiatis
        force = options['force']
332 df456124 Giorgos Korfiatis
333 764d99c4 Giorgos Korfiatis
        set_base_quota = options.get('set_base_quota')
334 764d99c4 Giorgos Korfiatis
        if set_base_quota is not None:
335 733f013d Giorgos Korfiatis
            if not user.is_accepted():
336 733f013d Giorgos Korfiatis
                m = "%s is not an accepted user." % user
337 733f013d Giorgos Korfiatis
                raise CommandError(m)
338 764d99c4 Giorgos Korfiatis
            resource, capacity = set_base_quota
339 45112d5a Giorgos Korfiatis
            self.set_limits([user], resource, capacity, force)
340 764d99c4 Giorgos Korfiatis
341 9eb2c9a6 Kostas Papadimitriou
        delete = options.get('delete')
342 9eb2c9a6 Kostas Papadimitriou
        if delete:
343 84f6149c Giorgos Korfiatis
            if user.is_accepted():
344 84f6149c Giorgos Korfiatis
                m = "Cannot delete. User %s is accepted." % user
345 84f6149c Giorgos Korfiatis
                raise CommandError(m)
346 9eb2c9a6 Kostas Papadimitriou
            management.call_command('user-show', str(user.pk),
347 9eb2c9a6 Kostas Papadimitriou
                                    list_quotas=True)
348 9eb2c9a6 Kostas Papadimitriou
            m = "Are you sure you want to permanently delete the user " \
349 9eb2c9a6 Kostas Papadimitriou
                "(yes/no) ? "
350 9eb2c9a6 Kostas Papadimitriou
351 9eb2c9a6 Kostas Papadimitriou
            self.stdout.write("\n")
352 9eb2c9a6 Kostas Papadimitriou
            confirm = raw_input(m)
353 9eb2c9a6 Kostas Papadimitriou
            if confirm == "yes":
354 9eb2c9a6 Kostas Papadimitriou
                user.delete()
355 9eb2c9a6 Kostas Papadimitriou
356 9eb2c9a6 Kostas Papadimitriou
        # Change users email address
357 9eb2c9a6 Kostas Papadimitriou
        newemail = options.get('set-email', None)
358 9eb2c9a6 Kostas Papadimitriou
        if newemail is not None:
359 9eb2c9a6 Kostas Papadimitriou
            newemail = newemail.strip()
360 9eb2c9a6 Kostas Papadimitriou
            try:
361 9eb2c9a6 Kostas Papadimitriou
                validate_email(newemail)
362 9eb2c9a6 Kostas Papadimitriou
            except ValidationError:
363 9eb2c9a6 Kostas Papadimitriou
                m = "Invalid email address."
364 9eb2c9a6 Kostas Papadimitriou
                raise CommandError(m)
365 9eb2c9a6 Kostas Papadimitriou
366 9eb2c9a6 Kostas Papadimitriou
            if AstakosUser.objects.user_exists(newemail):
367 9eb2c9a6 Kostas Papadimitriou
                m = "A user with this email address already exists."
368 9eb2c9a6 Kostas Papadimitriou
                raise CommandError(m)
369 9eb2c9a6 Kostas Papadimitriou
370 1808f7bc Giorgos Korfiatis
            user.set_email(newemail)
371 9eb2c9a6 Kostas Papadimitriou
            user.save()
372 9eb2c9a6 Kostas Papadimitriou
373 45112d5a Giorgos Korfiatis
    def confirm(self):
374 45112d5a Giorgos Korfiatis
        self.stdout.write("Confirm? [y/N] ")
375 45112d5a Giorgos Korfiatis
        response = raw_input()
376 45112d5a Giorgos Korfiatis
        if string.lower(response) not in ['y', 'yes']:
377 4220c336 Giorgos Korfiatis
            self.stderr.write("Aborted.\n")
378 45112d5a Giorgos Korfiatis
            exit()
379 45112d5a Giorgos Korfiatis
380 45112d5a Giorgos Korfiatis
    def handle_limits_user(self, user, res, capacity, style):
381 45112d5a Giorgos Korfiatis
        default_capacity = res.uplimit
382 45112d5a Giorgos Korfiatis
        resource = res.name
383 45112d5a Giorgos Korfiatis
        quota = user.get_resource_policy(resource)
384 45112d5a Giorgos Korfiatis
        s_default = show_resource_value(default_capacity, resource, style)
385 45112d5a Giorgos Korfiatis
        s_current = show_resource_value(quota.capacity, resource, style)
386 45112d5a Giorgos Korfiatis
        s_capacity = (show_resource_value(capacity, resource, style)
387 45112d5a Giorgos Korfiatis
                      if capacity != 'default' else capacity)
388 45112d5a Giorgos Korfiatis
        self.stdout.write("user: %s (%s)\n" % (user.uuid, user.username))
389 45112d5a Giorgos Korfiatis
        self.stdout.write("default capacity: %s\n" % s_default)
390 45112d5a Giorgos Korfiatis
        self.stdout.write("current capacity: %s\n" % s_current)
391 45112d5a Giorgos Korfiatis
        self.stdout.write("new capacity: %s\n" % s_capacity)
392 45112d5a Giorgos Korfiatis
        self.confirm()
393 45112d5a Giorgos Korfiatis
394 45112d5a Giorgos Korfiatis
    def handle_limits_all(self, res, capacity, exclude, style):
395 45112d5a Giorgos Korfiatis
        m = "This will set base quota for all users"
396 45112d5a Giorgos Korfiatis
        app = (" except %s" % ", ".join(exclude)) if exclude else ""
397 45112d5a Giorgos Korfiatis
        self.stdout.write(m+app+".\n")
398 45112d5a Giorgos Korfiatis
        resource = res.name
399 45112d5a Giorgos Korfiatis
        self.stdout.write("resource: %s\n" % resource)
400 45112d5a Giorgos Korfiatis
        s_capacity = (show_resource_value(capacity, resource, style)
401 45112d5a Giorgos Korfiatis
                      if capacity != 'default' else capacity)
402 45112d5a Giorgos Korfiatis
        self.stdout.write("capacity: %s\n" % s_capacity)
403 45112d5a Giorgos Korfiatis
        self.confirm()
404 45112d5a Giorgos Korfiatis
405 45112d5a Giorgos Korfiatis
    def set_limits(self, users, resource, capacity, force=False, exclude=None):
406 45112d5a Giorgos Korfiatis
        try:
407 45112d5a Giorgos Korfiatis
            r = Resource.objects.get(name=resource)
408 45112d5a Giorgos Korfiatis
        except Resource.DoesNotExist:
409 45112d5a Giorgos Korfiatis
            raise CommandError("No such resource '%s'." % resource)
410 45112d5a Giorgos Korfiatis
411 44f510e1 Giorgos Korfiatis
        style = None
412 45112d5a Giorgos Korfiatis
        if capacity != "default":
413 764d99c4 Giorgos Korfiatis
            try:
414 44f510e1 Giorgos Korfiatis
                capacity, style = units.parse_with_style(capacity)
415 44f510e1 Giorgos Korfiatis
            except:
416 45112d5a Giorgos Korfiatis
                m = ("Please specify capacity as a decimal integer or "
417 45112d5a Giorgos Korfiatis
                     "'default'")
418 764d99c4 Giorgos Korfiatis
                raise CommandError(m)
419 764d99c4 Giorgos Korfiatis
420 764d99c4 Giorgos Korfiatis
        if not force:
421 45112d5a Giorgos Korfiatis
            if len(users) == 1:
422 45112d5a Giorgos Korfiatis
                self.handle_limits_user(users[0], r, capacity, style)
423 45112d5a Giorgos Korfiatis
            else:
424 45112d5a Giorgos Korfiatis
                self.handle_limits_all(r, capacity, exclude, style)
425 45112d5a Giorgos Korfiatis
426 45112d5a Giorgos Korfiatis
        if capacity == "default":
427 45112d5a Giorgos Korfiatis
            capacity = r.uplimit
428 45112d5a Giorgos Korfiatis
        quotas.update_base_quota(users, resource, capacity)
429 45112d5a Giorgos Korfiatis
430 45112d5a Giorgos Korfiatis
    def handle_all_users(self, *args, **options):
431 45112d5a Giorgos Korfiatis
        force = options["force"]
432 45112d5a Giorgos Korfiatis
        exclude = options["exclude"]
433 45112d5a Giorgos Korfiatis
        if exclude is not None:
434 45112d5a Giorgos Korfiatis
            exclude = exclude.split(',')
435 45112d5a Giorgos Korfiatis
436 45112d5a Giorgos Korfiatis
        set_base_quota = options.get('set_base_quota')
437 45112d5a Giorgos Korfiatis
        if set_base_quota is not None:
438 45112d5a Giorgos Korfiatis
            users = AstakosUser.objects.accepted().select_for_update()
439 45112d5a Giorgos Korfiatis
            if exclude:
440 45112d5a Giorgos Korfiatis
                users = users.exclude(uuid__in=exclude)
441 45112d5a Giorgos Korfiatis
            resource, capacity = set_base_quota
442 45112d5a Giorgos Korfiatis
            self.set_limits(users, resource, capacity, force, exclude)