Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / createuser.py @ 27e26a41

History | View | Annotate | Download (3.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 18ffbee1 Sofia Papagiannaki
import socket
35 18ffbee1 Sofia Papagiannaki
36 df48dd1b Giorgos Verigakis
from optparse import make_option
37 df48dd1b Giorgos Verigakis
from random import choice
38 df48dd1b Giorgos Verigakis
from string import digits, lowercase, uppercase
39 df48dd1b Giorgos Verigakis
from uuid import uuid4
40 df48dd1b Giorgos Verigakis
41 df48dd1b Giorgos Verigakis
from django.core.management.base import BaseCommand, CommandError
42 b9b71797 Sofia Papagiannaki
from django.core.validators import validate_email
43 b9b71797 Sofia Papagiannaki
from django.core.exceptions import ValidationError
44 df48dd1b Giorgos Verigakis
45 df48dd1b Giorgos Verigakis
from astakos.im.models import AstakosUser
46 0a569195 Sofia Papagiannaki
from astakos.im.util import reserved_email
47 df48dd1b Giorgos Verigakis
48 df48dd1b Giorgos Verigakis
class Command(BaseCommand):
49 df48dd1b Giorgos Verigakis
    args = "<email> <first name> <last name> <affiliation>"
50 d01e7b22 Antony Chazapis
    help = "Create a user"
51 df48dd1b Giorgos Verigakis
    
52 df48dd1b Giorgos Verigakis
    option_list = BaseCommand.option_list + (
53 df48dd1b Giorgos Verigakis
        make_option('--active',
54 df48dd1b Giorgos Verigakis
            action='store_true',
55 df48dd1b Giorgos Verigakis
            dest='active',
56 df48dd1b Giorgos Verigakis
            default=False,
57 df48dd1b Giorgos Verigakis
            help="Activate user"),
58 df48dd1b Giorgos Verigakis
        make_option('--admin',
59 df48dd1b Giorgos Verigakis
            action='store_true',
60 df48dd1b Giorgos Verigakis
            dest='admin',
61 df48dd1b Giorgos Verigakis
            default=False,
62 df48dd1b Giorgos Verigakis
            help="Give user admin rights"),
63 df48dd1b Giorgos Verigakis
        make_option('--password',
64 df48dd1b Giorgos Verigakis
            dest='password',
65 df48dd1b Giorgos Verigakis
            metavar='PASSWORD',
66 df48dd1b Giorgos Verigakis
            help="Set user's password")
67 df48dd1b Giorgos Verigakis
        )
68 df48dd1b Giorgos Verigakis
    
69 df48dd1b Giorgos Verigakis
    def handle(self, *args, **options):
70 df48dd1b Giorgos Verigakis
        if len(args) != 4:
71 df48dd1b Giorgos Verigakis
            raise CommandError("Invalid number of arguments")
72 df48dd1b Giorgos Verigakis
        
73 df48dd1b Giorgos Verigakis
        args = [a.decode('utf8') for a in args]
74 df48dd1b Giorgos Verigakis
        email, first, last, affiliation = args
75 df48dd1b Giorgos Verigakis
        
76 b9b71797 Sofia Papagiannaki
        try:
77 b9b71797 Sofia Papagiannaki
            validate_email( email )
78 b9b71797 Sofia Papagiannaki
        except ValidationError:
79 b9b71797 Sofia Papagiannaki
            raise CommandError("Invalid email")
80 b9b71797 Sofia Papagiannaki
        
81 df48dd1b Giorgos Verigakis
        username =  uuid4().hex[:30]
82 df48dd1b Giorgos Verigakis
        password = options.get('password')
83 df48dd1b Giorgos Verigakis
        if password is None:
84 8f5a3a06 Sofia Papagiannaki
            password = AstakosUser.objects.make_random_password()
85 df48dd1b Giorgos Verigakis
        
86 0a569195 Sofia Papagiannaki
        if reserved_email(email):
87 397d5cbe Giorgos Verigakis
            raise CommandError("A user with this email already exists")
88 397d5cbe Giorgos Verigakis
        
89 df48dd1b Giorgos Verigakis
        user = AstakosUser(username=username, first_name=first, last_name=last,
90 df48dd1b Giorgos Verigakis
                           email=email, affiliation=affiliation,
91 df48dd1b Giorgos Verigakis
                           provider='local')
92 df48dd1b Giorgos Verigakis
        user.set_password(password)
93 df48dd1b Giorgos Verigakis
        user.renew_token()
94 df48dd1b Giorgos Verigakis
        
95 df48dd1b Giorgos Verigakis
        if options['active']:
96 df48dd1b Giorgos Verigakis
            user.is_active = True
97 df48dd1b Giorgos Verigakis
        if options['admin']:
98 df48dd1b Giorgos Verigakis
            user.is_admin = True
99 df48dd1b Giorgos Verigakis
        
100 18ffbee1 Sofia Papagiannaki
        try:
101 18ffbee1 Sofia Papagiannaki
            user.save()
102 18ffbee1 Sofia Papagiannaki
        except socket.error, e:
103 18ffbee1 Sofia Papagiannaki
            raise CommandError(e)
104 27e26a41 Sofia Papagiannaki
        except ValidationError, e:
105 27e26a41 Sofia Papagiannaki
            raise CommandError(e)
106 18ffbee1 Sofia Papagiannaki
        else:
107 18ffbee1 Sofia Papagiannaki
            msg = "Created user id %d" % (user.id,)
108 18ffbee1 Sofia Papagiannaki
            if options['password'] is None:
109 18ffbee1 Sofia Papagiannaki
                msg += " with password '%s'" % (password,)
110 18ffbee1 Sofia Papagiannaki
            self.stdout.write(msg + '\n')