Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / user-update.py @ 66c90acd

History | View | Annotate | Download (7.4 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

    
36
from django.core.management.base import BaseCommand, CommandError
37
from django.contrib.auth.models import Group, Permission
38
from django.contrib.contenttypes.models import ContentType
39
from django.core.exceptions import ValidationError
40

    
41
from astakos.im.models import AstakosUser
42
from ._common import remove_user_permission, add_user_permission
43

    
44
class Command(BaseCommand):
45
    args = "<user ID>"
46
    help = "Modify a user's attributes"
47
    
48
    option_list = BaseCommand.option_list + (
49
        make_option('--invitations',
50
            dest='invitations',
51
            metavar='NUM',
52
            help="Update user's invitations"),
53
        make_option('--level',
54
            dest='level',
55
            metavar='NUM',
56
            help="Update user's level"),
57
        make_option('--password',
58
            dest='password',
59
            metavar='PASSWORD',
60
            help="Set user's password"),
61
        make_option('--provider',
62
            dest='provider',
63
            metavar='PROVIDER',
64
            help="Set user's provider"),
65
        make_option('--renew-token',
66
            action='store_true',
67
            dest='renew_token',
68
            default=False,
69
            help="Renew the user's token"),
70
        make_option('--renew-password',
71
            action='store_true',
72
            dest='renew_password',
73
            default=False,
74
            help="Renew the user's password"),
75
        make_option('--set-admin',
76
            action='store_true',
77
            dest='admin',
78
            default=False,
79
            help="Give user admin rights"),
80
        make_option('--set-noadmin',
81
            action='store_true',
82
            dest='noadmin',
83
            default=False,
84
            help="Revoke user's admin rights"),
85
        make_option('--set-active',
86
            action='store_true',
87
            dest='active',
88
            default=False,
89
            help="Change user's state to inactive"),
90
        make_option('--set-inactive',
91
            action='store_true',
92
            dest='inactive',
93
            default=False,
94
            help="Change user's state to inactive"),
95
        make_option('--add-group',
96
            dest='add-group',
97
            help="Add user group"),
98
        make_option('--delete-group',
99
            dest='delete-group',
100
            help="Delete user group"),
101
        make_option('--add-permission',
102
            dest='add-permission',
103
            help="Add user permission"),
104
        make_option('--delete-permission',
105
            dest='delete-permission',
106
            help="Delete user permission"),
107
        )
108
    
109
    def handle(self, *args, **options):
110
        if len(args) != 1:
111
            raise CommandError("Please provide a user ID")
112
        
113
        if args[0].isdigit():
114
            user = AstakosUser.objects.get(id=int( args[0]))
115
        else:
116
            raise CommandError("Invalid ID")
117
        
118
        if not user:
119
            raise CommandError("Unknown user")
120
        
121
        if options.get('admin'):
122
            user.is_superuser = True
123
        elif options.get('noadmin'):
124
            user.is_superuser = False
125
        
126
        if options.get('active'):
127
            user.is_active = True
128
        elif options.get('inactive'):
129
            user.is_active = False
130
        
131
        invitations = options.get('invitations')
132
        if invitations is not None:
133
            user.invitations = int(invitations)
134
        
135
        groupname = options.get('add-group')
136
        if groupname is not None:
137
            try:
138
                group = Group.objects.get(name=groupname)
139
                user.groups.add(group)
140
            except Group.DoesNotExist, e:
141
                self.stdout.write("Group named %s does not exist\n" % groupname)
142
        
143
        groupname = options.get('delete-group')
144
        if groupname is not None:
145
            try:
146
                group = Group.objects.get(name=groupname)
147
                user.groups.remove(group)
148
            except Group.DoesNotExist, e:
149
                self.stdout.write("Group named %s does not exist\n" % groupname)
150
        
151
        pname = options.get('add-permission')
152
        if pname is not None:
153
            try:
154
                r, created = add_user_permission(user, pname)
155
                if created:
156
                    self.stdout.write('Permission: %s created successfully\n' % pname)
157
                if r > 0:
158
                    self.stdout.write('Permission: %s added successfully\n' % pname)
159
                elif r==0:
160
                    self.stdout.write('User has already permission: %s\n' % pname)
161
            except Exception, e:
162
                raise CommandError(e)
163
        
164
        pname  = options.get('delete-permission')
165
        if pname is not None and not user.has_perm(pname):
166
            try:
167
                r = remove_user_permission(user, pname)
168
                if r < 0:
169
                    self.stdout.write('Invalid permission codename: %s\n' % pname)
170
                elif r == 0:
171
                    self.stdout.write('User has not permission: %s\n' % pname)
172
                elif r > 0:
173
                    self.stdout.write('Permission: %s removed successfully\n' % pname)
174
            except Exception, e:
175
                raise CommandError(e)
176
        
177
        level = options.get('level')
178
        if level is not None:
179
            user.level = int(level)
180
        
181
        password = options.get('password')
182
        if password is not None:
183
            user.set_password(password)
184
        
185
        provider = options.get('provider')
186
        if provider is not None:
187
            user.provider = provider
188
        
189
        
190
        password = None
191
        if options['renew_password']:
192
            password = AstakosUser.objects.make_random_password()
193
            user.set_password(password)
194
        
195
        if options['renew_token']:
196
            user.renew_token()
197
        
198
        try:
199
            user.save()
200
        except ValidationError, e:
201
            raise CommandError(e)
202
        
203
        if password:
204
            self.stdout.write('User\'s new password: %s\n' % password)