Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / user-add.py @ 4bdd7e3d

History | View | Annotate | Download (4.4 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
38 d8934b9a Sofia Papagiannaki
from django.core.management.base import BaseCommand, CommandError
39 d8934b9a Sofia Papagiannaki
from django.core.validators import validate_email
40 d8934b9a Sofia Papagiannaki
from django.core.exceptions import ValidationError
41 d8934b9a Sofia Papagiannaki
42 9a06d96f Olga Brani
from astakos.im.models import AstakosUser
43 3b99d2d6 Sofia Papagiannaki
from astakos.im.api.callpoint import AstakosCallpoint
44 d8934b9a Sofia Papagiannaki
45 9a06d96f Olga Brani
def filter_custom_options(options):
46 9a06d96f Olga Brani
    base_dests = list(
47 9a06d96f Olga Brani
        getattr(o, 'dest', None) for o in BaseCommand.option_list)
48 9a06d96f Olga Brani
    return dict((k, v) for k, v in options.iteritems() if k not in base_dests)
49 9a06d96f Olga Brani
50 9a06d96f Olga Brani
51 d8934b9a Sofia Papagiannaki
class Command(BaseCommand):
52 07a1f977 Sofia Papagiannaki
    args = "<email> <first name> <last name>"
53 d8934b9a Sofia Papagiannaki
    help = "Create a user"
54 5ce3ce4f Sofia Papagiannaki
55 d8934b9a Sofia Papagiannaki
    option_list = BaseCommand.option_list + (
56 9a06d96f Olga Brani
        make_option('--affiliation',
57 9a06d96f Olga Brani
                    dest='affiliation',
58 9a06d96f Olga Brani
                    metavar='AFFILIATION',
59 9a06d96f Olga Brani
                    help="Set user's affiliation"),
60 9a06d96f Olga Brani
        make_option('--password',
61 9a06d96f Olga Brani
                    dest='password',
62 9a06d96f Olga Brani
                    metavar='PASSWORD',
63 9a06d96f Olga Brani
                    help="Set user's password"),
64 d8934b9a Sofia Papagiannaki
        make_option('--active',
65 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
66 9a06d96f Olga Brani
                    dest='is_active',
67 5ce3ce4f Sofia Papagiannaki
                    default=False,
68 5ce3ce4f Sofia Papagiannaki
                    help="Activate user"),
69 d8934b9a Sofia Papagiannaki
        make_option('--admin',
70 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
71 9a06d96f Olga Brani
                    dest='is_superuser',
72 5ce3ce4f Sofia Papagiannaki
                    default=False,
73 5ce3ce4f Sofia Papagiannaki
                    help="Give user admin rights"),
74 9a06d96f Olga Brani
        make_option('-g',
75 9a06d96f Olga Brani
                    action='append',
76 9a06d96f Olga Brani
                    dest='groups',
77 9a06d96f Olga Brani
                    help="Add user group (may be used multiple times)"),
78 9a06d96f Olga Brani
        make_option('-p',
79 9a06d96f Olga Brani
                    action='append',
80 9a06d96f Olga Brani
                    dest='permissions',
81 9a06d96f Olga Brani
                    help="Add user permission (may be used multiple times)")
82 5ce3ce4f Sofia Papagiannaki
    )
83 5ce3ce4f Sofia Papagiannaki
84 d8934b9a Sofia Papagiannaki
    def handle(self, *args, **options):
85 07a1f977 Sofia Papagiannaki
        if len(args) != 3:
86 d8934b9a Sofia Papagiannaki
            raise CommandError("Invalid number of arguments")
87 5ce3ce4f Sofia Papagiannaki
88 07a1f977 Sofia Papagiannaki
        email, first_name, last_name = (args[i].decode('utf8') for i in range(3))
89 07a1f977 Sofia Papagiannaki
        
90 9a06d96f Olga Brani
        try:
91 9a06d96f Olga Brani
            validate_email(email)
92 9a06d96f Olga Brani
        except ValidationError:
93 9a06d96f Olga Brani
            raise CommandError("Invalid email")
94 5ce3ce4f Sofia Papagiannaki
95 07a1f977 Sofia Papagiannaki
        u = {'email': email,
96 07a1f977 Sofia Papagiannaki
             'first_name':first_name,
97 07a1f977 Sofia Papagiannaki
             'last_name':last_name
98 07a1f977 Sofia Papagiannaki
        }
99 9a06d96f Olga Brani
        u.update(filter_custom_options(options))
100 9a06d96f Olga Brani
        if not u.get('password'):
101 9a06d96f Olga Brani
            u['password'] = AstakosUser.objects.make_random_password()
102 5ce3ce4f Sofia Papagiannaki
103 d8934b9a Sofia Papagiannaki
        try:
104 3b99d2d6 Sofia Papagiannaki
            c = AstakosCallpoint()
105 07a1f977 Sofia Papagiannaki
            r = c.create_users((u,)).next()
106 d8934b9a Sofia Papagiannaki
        except socket.error, e:
107 d8934b9a Sofia Papagiannaki
            raise CommandError(e)
108 d8934b9a Sofia Papagiannaki
        except ValidationError, e:
109 3b99d2d6 Sofia Papagiannaki
            raise CommandError(e)
110 3b99d2d6 Sofia Papagiannaki
        else:
111 07a1f977 Sofia Papagiannaki
            if not r.is_success:
112 07a1f977 Sofia Papagiannaki
                raise CommandError(r.reason)
113 07a1f977 Sofia Papagiannaki
            else:
114 07a1f977 Sofia Papagiannaki
                self.stdout.write('User created successfully ')
115 07a1f977 Sofia Papagiannaki
                if not options.get('password'):
116 07a1f977 Sofia Papagiannaki
                    self.stdout.write('with password: %s\n' % u['password'])
117 07a1f977 Sofia Papagiannaki
                else:
118 07a1f977 Sofia Papagiannaki
                    self.stdout.write('\n')