Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / user_add.py @ aa4109d4

History | View | Annotate | Download (5.3 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
import socket
35

    
36
from optparse import make_option
37
from random import choice
38
from string import digits, lowercase, uppercase
39
from uuid import uuid4
40
from datetime import datetime
41

    
42
from django.core.management.base import BaseCommand, CommandError
43
from django.core.validators import validate_email
44
from django.core.exceptions import ValidationError
45

    
46
from astakos.im.models import AstakosUser, AstakosGroup, Membership
47
from astakos.im.util import reserved_email
48

    
49
from ._common import add_user_permission
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
        make_option('--add-group',
71
            dest='add-group',
72
            help="Add user group"),
73
        make_option('--add-permission',
74
            dest='add-permission',
75
            help="Add user permission")
76
        )
77
    
78
    def handle(self, *args, **options):
79
        if len(args) != 4:
80
            raise CommandError("Invalid number of arguments")
81
        
82
        args = [a.decode('utf8') for a in args]
83
        email, first, last, affiliation = args
84
        
85
        try:
86
            validate_email( email )
87
        except ValidationError:
88
            raise CommandError("Invalid email")
89
        
90
        username =  uuid4().hex[:30]
91
        password = options.get('password')
92
        if password is None:
93
            password = AstakosUser.objects.make_random_password()
94
        
95
        if reserved_email(email):
96
            raise CommandError("A user with this email already exists")
97
        
98
        user = AstakosUser(username=username, first_name=first, last_name=last,
99
                           email=email, affiliation=affiliation,
100
                           provider='local')
101
        user.set_password(password)
102
        user.renew_token()
103
        
104
        if options['active']:
105
            user.is_active = True
106
        if options['admin']:
107
            user.is_superuser = True
108
        
109
        try:
110
            user.save()
111
        except socket.error, e:
112
            raise CommandError(e)
113
        except ValidationError, e:
114
            raise CommandError(e)
115
        else:
116
            msg = "Created user id %d" % (user.id,)
117
            if options['password'] is None:
118
                msg += " with password '%s'" % (password,)
119
            self.stdout.write(msg + '\n')
120
            
121
            groupname = options.get('add-group')
122
            if groupname is not None:
123
                try:
124
                    group = AstakosGroup.objects.get(name=groupname)
125
                    Membership(group=group, person=user, date_joined=datetime.now()).save()
126
                    self.stdout.write('Group: %s added successfully\n' % groupname)
127
                except AstakosGroup.DoesNotExist, e:
128
                    self.stdout.write('Group named %s does not exist\n' % groupname)
129
            
130
            pname = options.get('add-permission')
131
            if pname is not None:
132
                try:
133
                    r, created = add_user_permission(user, pname)
134
                    if created:
135
                        self.stdout.write('Permission: %s created successfully\n' % pname)
136
                    if r > 0:
137
                        self.stdout.write('Permission: %s added successfully\n' % pname)
138
                    elif r==0:
139
                        self.stdout.write('User has already permission: %s\n' % pname)
140
                except Exception, e:
141
                    raise CommandError(e)