Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.9 kB)

1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from optparse import make_option
35
from random import choice
36
from string import digits, lowercase, uppercase
37
from uuid import uuid4
38

    
39
from django.core.management.base import BaseCommand, CommandError
40
from django.core.validators import validate_email
41
from django.core.exceptions import ValidationError
42

    
43
from astakos.im.models import AstakosUser
44

    
45

    
46
def generate_password():
47
    pool = lowercase + uppercase + digits
48
    return ''.join(choice(pool) for i in range(10))
49

    
50

    
51
class Command(BaseCommand):
52
    args = "<email> <first name> <last name> <affiliation>"
53
    help = "Create a user"
54
    
55
    option_list = BaseCommand.option_list + (
56
        make_option('--active',
57
            action='store_true',
58
            dest='active',
59
            default=False,
60
            help="Activate user"),
61
        make_option('--admin',
62
            action='store_true',
63
            dest='admin',
64
            default=False,
65
            help="Give user admin rights"),
66
        make_option('--password',
67
            dest='password',
68
            metavar='PASSWORD',
69
            help="Set user's password")
70
        )
71
    
72
    def handle(self, *args, **options):
73
        if len(args) != 4:
74
            raise CommandError("Invalid number of arguments")
75
        
76
        args = [a.decode('utf8') for a in args]
77
        email, first, last, affiliation = args
78
        
79
        try:
80
            validate_email( email )
81
        except ValidationError:
82
            raise CommandError("Invalid email")
83
        
84
        username =  uuid4().hex[:30]
85
        password = options.get('password')
86
        if password is None:
87
            password = generate_password()
88
        
89
        try:
90
            AstakosUser.objects.get(email=email)
91
            raise CommandError("A user with this email already exists")
92
        except AstakosUser.DoesNotExist:
93
            pass
94
        
95
        user = AstakosUser(username=username, first_name=first, last_name=last,
96
                           email=email, affiliation=affiliation,
97
                           provider='local')
98
        user.set_password(password)
99
        user.renew_token()
100
        
101
        if options['active']:
102
            user.is_active = True
103
        if options['admin']:
104
            user.is_admin = True
105
        
106
        user.save()
107
        
108
        msg = "Created user id %d" % (user.id,)
109
        if options['password'] is None:
110
            msg += " with password '%s'" % (password,)
111
        self.stdout.write(msg + '\n')