Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (13.5 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 a6d167c1 Giorgos Korfiatis
from snf_django.management.commands import SynnefoCommand, 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 64a43a9a Giorgos Korfiatis
from astakos.im.models import AstakosUser
47 e7cb4085 Kostas Papadimitriou
from astakos.im import activation_backends
48 64a43a9a Giorgos Korfiatis
from ._common import (remove_user_permission, add_user_permission, is_uuid)
49 e7cb4085 Kostas Papadimitriou
50 e7cb4085 Kostas Papadimitriou
activation_backend = activation_backends.get_backend()
51 df48dd1b Giorgos Verigakis
52 5ce3ce4f Sofia Papagiannaki
53 a6d167c1 Giorgos Korfiatis
class Command(SynnefoCommand):
54 45112d5a Giorgos Korfiatis
    args = "<user ID> (or --all)"
55 df48dd1b Giorgos Verigakis
    help = "Modify a user's attributes"
56 5ce3ce4f Sofia Papagiannaki
57 a6d167c1 Giorgos Korfiatis
    option_list = SynnefoCommand.option_list + (
58 45112d5a Giorgos Korfiatis
        make_option('--all',
59 45112d5a Giorgos Korfiatis
                    action='store_true',
60 45112d5a Giorgos Korfiatis
                    default=False,
61 45112d5a Giorgos Korfiatis
                    help=("Operate on all users. Currently only setting "
62 45112d5a Giorgos Korfiatis
                          "base quota is supported in this mode. Can be "
63 45112d5a Giorgos Korfiatis
                          "combined with `--exclude'.")),
64 45112d5a Giorgos Korfiatis
        make_option('--exclude',
65 45112d5a Giorgos Korfiatis
                    help=("If `--all' is given, exclude users given as a "
66 45112d5a Giorgos Korfiatis
                          "list of uuids: uuid1,uuid2,uuid3")),
67 df48dd1b Giorgos Verigakis
        make_option('--invitations',
68 5ce3ce4f Sofia Papagiannaki
                    dest='invitations',
69 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
70 5ce3ce4f Sofia Papagiannaki
                    help="Update user's invitations"),
71 ebd369d0 Sofia Papagiannaki
        make_option('--level',
72 5ce3ce4f Sofia Papagiannaki
                    dest='level',
73 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
74 5ce3ce4f Sofia Papagiannaki
                    help="Update user's level"),
75 df48dd1b Giorgos Verigakis
        make_option('--password',
76 5ce3ce4f Sofia Papagiannaki
                    dest='password',
77 5ce3ce4f Sofia Papagiannaki
                    metavar='PASSWORD',
78 5ce3ce4f Sofia Papagiannaki
                    help="Set user's password"),
79 df48dd1b Giorgos Verigakis
        make_option('--renew-token',
80 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
81 5ce3ce4f Sofia Papagiannaki
                    dest='renew_token',
82 5ce3ce4f Sofia Papagiannaki
                    default=False,
83 5ce3ce4f Sofia Papagiannaki
                    help="Renew the user's token"),
84 cfb15117 Sofia Papagiannaki
        make_option('--renew-password',
85 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
86 5ce3ce4f Sofia Papagiannaki
                    dest='renew_password',
87 5ce3ce4f Sofia Papagiannaki
                    default=False,
88 5ce3ce4f Sofia Papagiannaki
                    help="Renew the user's password"),
89 df48dd1b Giorgos Verigakis
        make_option('--set-admin',
90 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
91 5ce3ce4f Sofia Papagiannaki
                    dest='admin',
92 5ce3ce4f Sofia Papagiannaki
                    default=False,
93 5ce3ce4f Sofia Papagiannaki
                    help="Give user admin rights"),
94 df48dd1b Giorgos Verigakis
        make_option('--set-noadmin',
95 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
96 5ce3ce4f Sofia Papagiannaki
                    dest='noadmin',
97 5ce3ce4f Sofia Papagiannaki
                    default=False,
98 5ce3ce4f Sofia Papagiannaki
                    help="Revoke user's admin rights"),
99 ebd369d0 Sofia Papagiannaki
        make_option('--set-active',
100 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
101 5ce3ce4f Sofia Papagiannaki
                    dest='active',
102 5ce3ce4f Sofia Papagiannaki
                    default=False,
103 21e0fdad Giorgos Korfiatis
                    help="Change user's state to active"),
104 ebd369d0 Sofia Papagiannaki
        make_option('--set-inactive',
105 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
106 5ce3ce4f Sofia Papagiannaki
                    dest='inactive',
107 5ce3ce4f Sofia Papagiannaki
                    default=False,
108 5ce3ce4f Sofia Papagiannaki
                    help="Change user's state to inactive"),
109 e7cb4085 Kostas Papadimitriou
        make_option('--inactive-reason',
110 e7cb4085 Kostas Papadimitriou
                    dest='inactive_reason',
111 e7cb4085 Kostas Papadimitriou
                    help="Reason user got inactive"),
112 4e30244e Sofia Papagiannaki
        make_option('--add-group',
113 5ce3ce4f Sofia Papagiannaki
                    dest='add-group',
114 5ce3ce4f Sofia Papagiannaki
                    help="Add user group"),
115 4e30244e Sofia Papagiannaki
        make_option('--delete-group',
116 5ce3ce4f Sofia Papagiannaki
                    dest='delete-group',
117 5ce3ce4f Sofia Papagiannaki
                    help="Delete user group"),
118 30dc8c1a Sofia Papagiannaki
        make_option('--add-permission',
119 5ce3ce4f Sofia Papagiannaki
                    dest='add-permission',
120 5ce3ce4f Sofia Papagiannaki
                    help="Add user permission"),
121 30dc8c1a Sofia Papagiannaki
        make_option('--delete-permission',
122 5ce3ce4f Sofia Papagiannaki
                    dest='delete-permission',
123 5ce3ce4f Sofia Papagiannaki
                    help="Delete user permission"),
124 e7cb4085 Kostas Papadimitriou
        make_option('--accept',
125 e7cb4085 Kostas Papadimitriou
                    dest='accept',
126 e7cb4085 Kostas Papadimitriou
                    action='store_true',
127 e7cb4085 Kostas Papadimitriou
                    help="Accept user"),
128 abf57c77 Kostas Papadimitriou
        make_option('--verify',
129 abf57c77 Kostas Papadimitriou
                    dest='verify',
130 abf57c77 Kostas Papadimitriou
                    action='store_true',
131 abf57c77 Kostas Papadimitriou
                    help="Verify user email"),
132 e7cb4085 Kostas Papadimitriou
        make_option('--reject',
133 e7cb4085 Kostas Papadimitriou
                    dest='reject',
134 e7cb4085 Kostas Papadimitriou
                    action='store_true',
135 e7cb4085 Kostas Papadimitriou
                    help="Reject user"),
136 e7cb4085 Kostas Papadimitriou
        make_option('--reject-reason',
137 e7cb4085 Kostas Papadimitriou
                    dest='reject_reason',
138 e7cb4085 Kostas Papadimitriou
                    help="Reason user got rejected"),
139 ef1fb98b Giorgos Korfiatis
        make_option('--sign-terms',
140 ef1fb98b Giorgos Korfiatis
                    default=False,
141 ef1fb98b Giorgos Korfiatis
                    action='store_true',
142 ef1fb98b Giorgos Korfiatis
                    help="Sign terms"),
143 df456124 Giorgos Korfiatis
        make_option('-f', '--no-confirm',
144 df456124 Giorgos Korfiatis
                    action='store_true',
145 df456124 Giorgos Korfiatis
                    default=False,
146 df456124 Giorgos Korfiatis
                    dest='force',
147 df456124 Giorgos Korfiatis
                    help="Do not ask for confirmation"),
148 9eb2c9a6 Kostas Papadimitriou
        make_option('--set-email',
149 9eb2c9a6 Kostas Papadimitriou
                    dest='set-email',
150 9eb2c9a6 Kostas Papadimitriou
                    help="Change user's email"),
151 9eb2c9a6 Kostas Papadimitriou
        make_option('--delete',
152 9eb2c9a6 Kostas Papadimitriou
                    dest='delete',
153 9eb2c9a6 Kostas Papadimitriou
                    action='store_true',
154 84f6149c Giorgos Korfiatis
                    help="Delete a non-accepted user"),
155 9a06d96f Olga Brani
    )
156 9a06d96f Olga Brani
157 a3e3917f Giorgos Korfiatis
    @transaction.commit_on_success
158 df48dd1b Giorgos Verigakis
    def handle(self, *args, **options):
159 45112d5a Giorgos Korfiatis
        if options['all']:
160 45112d5a Giorgos Korfiatis
            if not args:
161 45112d5a Giorgos Korfiatis
                return self.handle_all_users(*args, **options)
162 45112d5a Giorgos Korfiatis
            else:
163 45112d5a Giorgos Korfiatis
                raise CommandError("Please provide a user ID or --all")
164 45112d5a Giorgos Korfiatis
165 df48dd1b Giorgos Verigakis
        if len(args) != 1:
166 45112d5a Giorgos Korfiatis
            raise CommandError("Please provide a user ID or --all")
167 45112d5a Giorgos Korfiatis
168 45112d5a Giorgos Korfiatis
        if options["exclude"] is not None:
169 45112d5a Giorgos Korfiatis
            m = "Option --exclude is meaningful only combined with --all."
170 45112d5a Giorgos Korfiatis
            raise CommandError(m)
171 5ce3ce4f Sofia Papagiannaki
172 0a569195 Sofia Papagiannaki
        if args[0].isdigit():
173 92359537 Sofia Papagiannaki
            try:
174 45112d5a Giorgos Korfiatis
                user = AstakosUser.objects.select_for_update().\
175 45112d5a Giorgos Korfiatis
                    get(id=int(args[0]))
176 92359537 Sofia Papagiannaki
            except AstakosUser.DoesNotExist:
177 92359537 Sofia Papagiannaki
                raise CommandError("Invalid user ID")
178 92359537 Sofia Papagiannaki
        elif is_uuid(args[0]):
179 92359537 Sofia Papagiannaki
            try:
180 92359537 Sofia Papagiannaki
                user = AstakosUser.objects.get(uuid=args[0])
181 92359537 Sofia Papagiannaki
            except AstakosUser.DoesNotExist:
182 92359537 Sofia Papagiannaki
                raise CommandError("Invalid user UUID")
183 0a569195 Sofia Papagiannaki
        else:
184 92359537 Sofia Papagiannaki
            raise CommandError(("Invalid user identification: "
185 92359537 Sofia Papagiannaki
                                "you should provide a valid user ID "
186 92359537 Sofia Papagiannaki
                                "or a valid user UUID"))
187 5ce3ce4f Sofia Papagiannaki
188 df48dd1b Giorgos Verigakis
        if options.get('admin'):
189 df48dd1b Giorgos Verigakis
            user.is_superuser = True
190 df48dd1b Giorgos Verigakis
        elif options.get('noadmin'):
191 df48dd1b Giorgos Verigakis
            user.is_superuser = False
192 5ce3ce4f Sofia Papagiannaki
193 e7cb4085 Kostas Papadimitriou
        if options.get('reject'):
194 e7cb4085 Kostas Papadimitriou
            reject_reason = options.get('reject_reason', None)
195 e7cb4085 Kostas Papadimitriou
            res = activation_backend.handle_moderation(
196 e7cb4085 Kostas Papadimitriou
                user,
197 e7cb4085 Kostas Papadimitriou
                accept=False,
198 e7cb4085 Kostas Papadimitriou
                reject_reason=reject_reason)
199 e7cb4085 Kostas Papadimitriou
            activation_backend.send_result_notifications(res, user)
200 e7cb4085 Kostas Papadimitriou
            if res.is_error():
201 e7cb4085 Kostas Papadimitriou
                print "Failed to reject.", res.message
202 e7cb4085 Kostas Papadimitriou
            else:
203 e7cb4085 Kostas Papadimitriou
                print "Account rejected"
204 e7cb4085 Kostas Papadimitriou
205 abf57c77 Kostas Papadimitriou
        if options.get('verify'):
206 abf57c77 Kostas Papadimitriou
            res = activation_backend.handle_verification(
207 abf57c77 Kostas Papadimitriou
                user,
208 abf57c77 Kostas Papadimitriou
                user.verification_code)
209 abf57c77 Kostas Papadimitriou
            #activation_backend.send_result_notifications(res, user)
210 abf57c77 Kostas Papadimitriou
            if res.is_error():
211 abf57c77 Kostas Papadimitriou
                print "Failed to verify.", res.message
212 abf57c77 Kostas Papadimitriou
            else:
213 abf57c77 Kostas Papadimitriou
                print "Account verified (%s)" % res.status_display()
214 abf57c77 Kostas Papadimitriou
215 e7cb4085 Kostas Papadimitriou
        if options.get('accept'):
216 e7cb4085 Kostas Papadimitriou
            res = activation_backend.handle_moderation(user, accept=True)
217 e7cb4085 Kostas Papadimitriou
            activation_backend.send_result_notifications(res, user)
218 e7cb4085 Kostas Papadimitriou
            if res.is_error():
219 e7cb4085 Kostas Papadimitriou
                print "Failed to accept.", res.message
220 e7cb4085 Kostas Papadimitriou
            else:
221 e7cb4085 Kostas Papadimitriou
                print "Account accepted and activated"
222 e7cb4085 Kostas Papadimitriou
223 ebd369d0 Sofia Papagiannaki
        if options.get('active'):
224 e7cb4085 Kostas Papadimitriou
            res = activation_backend.activate_user(user)
225 e7cb4085 Kostas Papadimitriou
            if res.is_error():
226 e7cb4085 Kostas Papadimitriou
                print "Failed to activate.", res.message
227 e7cb4085 Kostas Papadimitriou
            else:
228 e7cb4085 Kostas Papadimitriou
                print "Account %s activated" % user.username
229 e7cb4085 Kostas Papadimitriou
230 ebd369d0 Sofia Papagiannaki
        elif options.get('inactive'):
231 e7cb4085 Kostas Papadimitriou
            res = activation_backend.deactivate_user(
232 e7cb4085 Kostas Papadimitriou
                user,
233 e7cb4085 Kostas Papadimitriou
                reason=options.get('inactive_reason', None))
234 e7cb4085 Kostas Papadimitriou
            if res.is_error():
235 e7cb4085 Kostas Papadimitriou
                print "Failed to deactivate,", res.message
236 e7cb4085 Kostas Papadimitriou
            else:
237 e7cb4085 Kostas Papadimitriou
                print "Account %s deactivated" % user.username
238 5ce3ce4f Sofia Papagiannaki
239 df48dd1b Giorgos Verigakis
        invitations = options.get('invitations')
240 df48dd1b Giorgos Verigakis
        if invitations is not None:
241 df48dd1b Giorgos Verigakis
            user.invitations = int(invitations)
242 5ce3ce4f Sofia Papagiannaki
243 4e30244e Sofia Papagiannaki
        groupname = options.get('add-group')
244 18ffbee1 Sofia Papagiannaki
        if groupname is not None:
245 18ffbee1 Sofia Papagiannaki
            try:
246 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
247 9a06d96f Olga Brani
                user.groups.add(group)
248 9a06d96f Olga Brani
            except Group.DoesNotExist, e:
249 d9a7f0bb Giorgos Korfiatis
                self.stderr.write(
250 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
251 5ce3ce4f Sofia Papagiannaki
252 4e30244e Sofia Papagiannaki
        groupname = options.get('delete-group')
253 4e30244e Sofia Papagiannaki
        if groupname is not None:
254 4e30244e Sofia Papagiannaki
            try:
255 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
256 9a06d96f Olga Brani
                user.groups.remove(group)
257 9a06d96f Olga Brani
            except Group.DoesNotExist, e:
258 d9a7f0bb Giorgos Korfiatis
                self.stderr.write(
259 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
260 5ce3ce4f Sofia Papagiannaki
261 30dc8c1a Sofia Papagiannaki
        pname = options.get('add-permission')
262 30dc8c1a Sofia Papagiannaki
        if pname is not None:
263 30dc8c1a Sofia Papagiannaki
            try:
264 30dc8c1a Sofia Papagiannaki
                r, created = add_user_permission(user, pname)
265 30dc8c1a Sofia Papagiannaki
                if created:
266 d9a7f0bb Giorgos Korfiatis
                    self.stderr.write(
267 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s created successfully\n' % pname)
268 30dc8c1a Sofia Papagiannaki
                if r > 0:
269 d9a7f0bb Giorgos Korfiatis
                    self.stderr.write(
270 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s added successfully\n' % pname)
271 5ce3ce4f Sofia Papagiannaki
                elif r == 0:
272 d9a7f0bb Giorgos Korfiatis
                    self.stderr.write(
273 5ce3ce4f Sofia Papagiannaki
                        'User has already permission: %s\n' % pname)
274 30dc8c1a Sofia Papagiannaki
            except Exception, e:
275 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
276 5ce3ce4f Sofia Papagiannaki
277 5ce3ce4f Sofia Papagiannaki
        pname = options.get('delete-permission')
278 30dc8c1a Sofia Papagiannaki
        if pname is not None and not user.has_perm(pname):
279 30dc8c1a Sofia Papagiannaki
            try:
280 30dc8c1a Sofia Papagiannaki
                r = remove_user_permission(user, pname)
281 30dc8c1a Sofia Papagiannaki
                if r < 0:
282 d9a7f0bb Giorgos Korfiatis
                    self.stderr.write(
283 5ce3ce4f Sofia Papagiannaki
                        'Invalid permission codename: %s\n' % pname)
284 30dc8c1a Sofia Papagiannaki
                elif r == 0:
285 d9a7f0bb Giorgos Korfiatis
                    self.stderr.write('User has not permission: %s\n' % pname)
286 30dc8c1a Sofia Papagiannaki
                elif r > 0:
287 d9a7f0bb Giorgos Korfiatis
                    self.stderr.write(
288 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s removed successfully\n' % pname)
289 30dc8c1a Sofia Papagiannaki
            except Exception, e:
290 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
291 5ce3ce4f Sofia Papagiannaki
292 ebd369d0 Sofia Papagiannaki
        level = options.get('level')
293 ebd369d0 Sofia Papagiannaki
        if level is not None:
294 ebd369d0 Sofia Papagiannaki
            user.level = int(level)
295 5ce3ce4f Sofia Papagiannaki
296 df48dd1b Giorgos Verigakis
        password = options.get('password')
297 df48dd1b Giorgos Verigakis
        if password is not None:
298 df48dd1b Giorgos Verigakis
            user.set_password(password)
299 5ce3ce4f Sofia Papagiannaki
300 cfb15117 Sofia Papagiannaki
        password = None
301 cfb15117 Sofia Papagiannaki
        if options['renew_password']:
302 cfb15117 Sofia Papagiannaki
            password = AstakosUser.objects.make_random_password()
303 cfb15117 Sofia Papagiannaki
            user.set_password(password)
304 5ce3ce4f Sofia Papagiannaki
305 df48dd1b Giorgos Verigakis
        if options['renew_token']:
306 df48dd1b Giorgos Verigakis
            user.renew_token()
307 5ce3ce4f Sofia Papagiannaki
308 ef1fb98b Giorgos Korfiatis
        if options['sign_terms']:
309 ef1fb98b Giorgos Korfiatis
            user.has_signed_terms = True
310 ef1fb98b Giorgos Korfiatis
            user.date_signed_terms = datetime.now()
311 ef1fb98b Giorgos Korfiatis
312 0a569195 Sofia Papagiannaki
        try:
313 0a569195 Sofia Papagiannaki
            user.save()
314 0a569195 Sofia Papagiannaki
        except ValidationError, e:
315 27e26a41 Sofia Papagiannaki
            raise CommandError(e)
316 5ce3ce4f Sofia Papagiannaki
317 cfb15117 Sofia Papagiannaki
        if password:
318 cfb15117 Sofia Papagiannaki
            self.stdout.write('User\'s new password: %s\n' % password)
319 764d99c4 Giorgos Korfiatis
320 9eb2c9a6 Kostas Papadimitriou
        delete = options.get('delete')
321 9eb2c9a6 Kostas Papadimitriou
        if delete:
322 84f6149c Giorgos Korfiatis
            if user.is_accepted():
323 84f6149c Giorgos Korfiatis
                m = "Cannot delete. User %s is accepted." % user
324 84f6149c Giorgos Korfiatis
                raise CommandError(m)
325 9eb2c9a6 Kostas Papadimitriou
            management.call_command('user-show', str(user.pk),
326 9eb2c9a6 Kostas Papadimitriou
                                    list_quotas=True)
327 9eb2c9a6 Kostas Papadimitriou
328 d56fa78c Giorgos Korfiatis
            if not force:
329 d56fa78c Giorgos Korfiatis
                self.stdout.write("About to delete user %s. " % user.uuid)
330 d56fa78c Giorgos Korfiatis
                self.confirm()
331 d56fa78c Giorgos Korfiatis
            user.delete()
332 9eb2c9a6 Kostas Papadimitriou
333 9eb2c9a6 Kostas Papadimitriou
        # Change users email address
334 9eb2c9a6 Kostas Papadimitriou
        newemail = options.get('set-email', None)
335 9eb2c9a6 Kostas Papadimitriou
        if newemail is not None:
336 9eb2c9a6 Kostas Papadimitriou
            newemail = newemail.strip()
337 9eb2c9a6 Kostas Papadimitriou
            try:
338 9eb2c9a6 Kostas Papadimitriou
                validate_email(newemail)
339 9eb2c9a6 Kostas Papadimitriou
            except ValidationError:
340 9eb2c9a6 Kostas Papadimitriou
                m = "Invalid email address."
341 9eb2c9a6 Kostas Papadimitriou
                raise CommandError(m)
342 9eb2c9a6 Kostas Papadimitriou
343 9eb2c9a6 Kostas Papadimitriou
            if AstakosUser.objects.user_exists(newemail):
344 9eb2c9a6 Kostas Papadimitriou
                m = "A user with this email address already exists."
345 9eb2c9a6 Kostas Papadimitriou
                raise CommandError(m)
346 9eb2c9a6 Kostas Papadimitriou
347 1808f7bc Giorgos Korfiatis
            user.set_email(newemail)
348 9eb2c9a6 Kostas Papadimitriou
            user.save()
349 9eb2c9a6 Kostas Papadimitriou
350 45112d5a Giorgos Korfiatis
    def confirm(self):
351 45112d5a Giorgos Korfiatis
        self.stdout.write("Confirm? [y/N] ")
352 d56fa78c Giorgos Korfiatis
        try:
353 d56fa78c Giorgos Korfiatis
            response = raw_input()
354 d56fa78c Giorgos Korfiatis
        except EOFError:
355 d56fa78c Giorgos Korfiatis
            response = "ABORT"
356 45112d5a Giorgos Korfiatis
        if string.lower(response) not in ['y', 'yes']:
357 d9a7f0bb Giorgos Korfiatis
            self.stderr.write("Aborted.\n")
358 45112d5a Giorgos Korfiatis
            exit()
359 45112d5a Giorgos Korfiatis
360 45112d5a Giorgos Korfiatis
    def handle_all_users(self, *args, **options):
361 64a43a9a Giorgos Korfiatis
        pass