Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.3 kB)

1 d8934b9a Sofia Papagiannaki
# Copyright 2012 GRNET S.A. All rights reserved.
2 d8934b9a Sofia Papagiannaki
#
3 d8934b9a Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
4 d8934b9a Sofia Papagiannaki
# without modification, are permitted provided that the following
5 d8934b9a Sofia Papagiannaki
# conditions are met:
6 d8934b9a Sofia Papagiannaki
#
7 d8934b9a Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
8 d8934b9a Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
9 d8934b9a Sofia Papagiannaki
#      disclaimer.
10 d8934b9a Sofia Papagiannaki
#
11 d8934b9a Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
12 d8934b9a Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
13 d8934b9a Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
14 d8934b9a Sofia Papagiannaki
#      provided with the distribution.
15 d8934b9a Sofia Papagiannaki
#
16 d8934b9a Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 d8934b9a Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 d8934b9a Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 d8934b9a Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 d8934b9a Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 d8934b9a Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 d8934b9a Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 d8934b9a Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 d8934b9a Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 d8934b9a Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 d8934b9a Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 d8934b9a Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
28 d8934b9a Sofia Papagiannaki
#
29 d8934b9a Sofia Papagiannaki
# The views and conclusions contained in the software and
30 d8934b9a Sofia Papagiannaki
# documentation are those of the authors and should not be
31 d8934b9a Sofia Papagiannaki
# interpreted as representing official policies, either expressed
32 d8934b9a Sofia Papagiannaki
# or implied, of GRNET S.A.
33 d8934b9a Sofia Papagiannaki
34 d8934b9a Sofia Papagiannaki
import socket
35 d8934b9a Sofia Papagiannaki
36 d8934b9a Sofia Papagiannaki
from optparse import make_option
37 d8934b9a Sofia Papagiannaki
from random import choice
38 d8934b9a Sofia Papagiannaki
from string import digits, lowercase, uppercase
39 d8934b9a Sofia Papagiannaki
from uuid import uuid4
40 d8934b9a Sofia Papagiannaki
41 d8934b9a Sofia Papagiannaki
from django.core.management.base import BaseCommand, CommandError
42 d8934b9a Sofia Papagiannaki
from django.core.validators import validate_email
43 d8934b9a Sofia Papagiannaki
from django.core.exceptions import ValidationError
44 d8934b9a Sofia Papagiannaki
45 304acb60 Olga Brani
from astakos.im.models import AstakosUser, AstakosGroup
46 d8934b9a Sofia Papagiannaki
from astakos.im.util import reserved_email
47 d8934b9a Sofia Papagiannaki
48 d8934b9a Sofia Papagiannaki
from ._common import add_user_permission
49 d8934b9a Sofia Papagiannaki
50 d8934b9a Sofia Papagiannaki
class Command(BaseCommand):
51 d8934b9a Sofia Papagiannaki
    args = "<email> <first name> <last name> <affiliation>"
52 d8934b9a Sofia Papagiannaki
    help = "Create a user"
53 d8934b9a Sofia Papagiannaki
    
54 d8934b9a Sofia Papagiannaki
    option_list = BaseCommand.option_list + (
55 d8934b9a Sofia Papagiannaki
        make_option('--active',
56 d8934b9a Sofia Papagiannaki
            action='store_true',
57 d8934b9a Sofia Papagiannaki
            dest='active',
58 d8934b9a Sofia Papagiannaki
            default=False,
59 d8934b9a Sofia Papagiannaki
            help="Activate user"),
60 d8934b9a Sofia Papagiannaki
        make_option('--admin',
61 d8934b9a Sofia Papagiannaki
            action='store_true',
62 d8934b9a Sofia Papagiannaki
            dest='admin',
63 d8934b9a Sofia Papagiannaki
            default=False,
64 d8934b9a Sofia Papagiannaki
            help="Give user admin rights"),
65 d8934b9a Sofia Papagiannaki
        make_option('--password',
66 d8934b9a Sofia Papagiannaki
            dest='password',
67 d8934b9a Sofia Papagiannaki
            metavar='PASSWORD',
68 d8934b9a Sofia Papagiannaki
            help="Set user's password"),
69 d8934b9a Sofia Papagiannaki
        make_option('--add-group',
70 d8934b9a Sofia Papagiannaki
            dest='add-group',
71 d8934b9a Sofia Papagiannaki
            help="Add user group"),
72 d8934b9a Sofia Papagiannaki
        make_option('--add-permission',
73 d8934b9a Sofia Papagiannaki
            dest='add-permission',
74 d8934b9a Sofia Papagiannaki
            help="Add user permission")
75 d8934b9a Sofia Papagiannaki
        )
76 d8934b9a Sofia Papagiannaki
    
77 d8934b9a Sofia Papagiannaki
    def handle(self, *args, **options):
78 d8934b9a Sofia Papagiannaki
        if len(args) != 4:
79 d8934b9a Sofia Papagiannaki
            raise CommandError("Invalid number of arguments")
80 d8934b9a Sofia Papagiannaki
        
81 d8934b9a Sofia Papagiannaki
        args = [a.decode('utf8') for a in args]
82 d8934b9a Sofia Papagiannaki
        email, first, last, affiliation = args
83 d8934b9a Sofia Papagiannaki
        
84 d8934b9a Sofia Papagiannaki
        try:
85 d8934b9a Sofia Papagiannaki
            validate_email( email )
86 d8934b9a Sofia Papagiannaki
        except ValidationError:
87 d8934b9a Sofia Papagiannaki
            raise CommandError("Invalid email")
88 d8934b9a Sofia Papagiannaki
        
89 d8934b9a Sofia Papagiannaki
        username =  uuid4().hex[:30]
90 d8934b9a Sofia Papagiannaki
        password = options.get('password')
91 d8934b9a Sofia Papagiannaki
        if password is None:
92 d8934b9a Sofia Papagiannaki
            password = AstakosUser.objects.make_random_password()
93 d8934b9a Sofia Papagiannaki
        
94 d8934b9a Sofia Papagiannaki
        if reserved_email(email):
95 d8934b9a Sofia Papagiannaki
            raise CommandError("A user with this email already exists")
96 d8934b9a Sofia Papagiannaki
        
97 d8934b9a Sofia Papagiannaki
        user = AstakosUser(username=username, first_name=first, last_name=last,
98 d8934b9a Sofia Papagiannaki
                           email=email, affiliation=affiliation,
99 d8934b9a Sofia Papagiannaki
                           provider='local')
100 d8934b9a Sofia Papagiannaki
        user.set_password(password)
101 d8934b9a Sofia Papagiannaki
        user.renew_token()
102 d8934b9a Sofia Papagiannaki
        
103 d8934b9a Sofia Papagiannaki
        if options['active']:
104 d8934b9a Sofia Papagiannaki
            user.is_active = True
105 d8934b9a Sofia Papagiannaki
        if options['admin']:
106 d8934b9a Sofia Papagiannaki
            user.is_admin = True
107 d8934b9a Sofia Papagiannaki
        
108 d8934b9a Sofia Papagiannaki
        try:
109 d8934b9a Sofia Papagiannaki
            user.save()
110 d8934b9a Sofia Papagiannaki
        except socket.error, e:
111 d8934b9a Sofia Papagiannaki
            raise CommandError(e)
112 d8934b9a Sofia Papagiannaki
        except ValidationError, e:
113 d8934b9a Sofia Papagiannaki
            raise CommandError(e)
114 d8934b9a Sofia Papagiannaki
        else:
115 d8934b9a Sofia Papagiannaki
            msg = "Created user id %d" % (user.id,)
116 d8934b9a Sofia Papagiannaki
            if options['password'] is None:
117 d8934b9a Sofia Papagiannaki
                msg += " with password '%s'" % (password,)
118 d8934b9a Sofia Papagiannaki
            self.stdout.write(msg + '\n')
119 d8934b9a Sofia Papagiannaki
            
120 d8934b9a Sofia Papagiannaki
            groupname = options.get('add-group')
121 d8934b9a Sofia Papagiannaki
            if groupname is not None:
122 d8934b9a Sofia Papagiannaki
                try:
123 304acb60 Olga Brani
                    group = AstakosGroup.objects.get(name=groupname)
124 304acb60 Olga Brani
                    user.astakos_groups.add(group)
125 d8934b9a Sofia Papagiannaki
                    self.stdout.write('Group: %s added successfully\n' % groupname)
126 304acb60 Olga Brani
                except AstakosGroup.DoesNotExist, e:
127 d8934b9a Sofia Papagiannaki
                    self.stdout.write('Group named %s does not exist\n' % groupname)
128 d8934b9a Sofia Papagiannaki
            
129 d8934b9a Sofia Papagiannaki
            pname = options.get('add-permission')
130 d8934b9a Sofia Papagiannaki
            if pname is not None:
131 d8934b9a Sofia Papagiannaki
                try:
132 d8934b9a Sofia Papagiannaki
                    r, created = add_user_permission(user, pname)
133 d8934b9a Sofia Papagiannaki
                    if created:
134 d8934b9a Sofia Papagiannaki
                        self.stdout.write('Permission: %s created successfully\n' % pname)
135 d8934b9a Sofia Papagiannaki
                    if r > 0:
136 d8934b9a Sofia Papagiannaki
                        self.stdout.write('Permission: %s added successfully\n' % pname)
137 d8934b9a Sofia Papagiannaki
                    elif r==0:
138 d8934b9a Sofia Papagiannaki
                        self.stdout.write('User has already permission: %s\n' % pname)
139 d8934b9a Sofia Papagiannaki
                except Exception, e:
140 d8934b9a Sofia Papagiannaki
                    raise CommandError(e)