Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / user_update.py @ aab4d540

History | View | Annotate | Download (7.8 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 datetime import datetime
36

    
37
from django.core.management.base import BaseCommand, CommandError
38
from django.core.exceptions import ValidationError
39
from django.db.utils import IntegrityError
40

    
41
from astakos.im.models import AstakosUser, AstakosGroup, Membership
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 = AstakosGroup.objects.get(name=groupname)
139
                m = Membership(person=user, group=group, date_joined=datetime.now())
140
                m.save()
141
            except AstakosGroup.DoesNotExist, e:
142
                self.stdout.write("Group named %s does not exist\n" % groupname)
143
            except IntegrityError, e:
144
                self.stdout.write("User is already member of %s\n" % groupname)
145
        
146
        groupname = options.get('delete-group')
147
        if groupname is not None:
148
            try:
149
                group = AstakosGroup.objects.get(name=groupname)
150
                m = Membership.objects.get(person=user, group=group)
151
                m.delete()
152
            except AstakosGroup.DoesNotExist, e:
153
                self.stdout.write("Group named %s does not exist\n" % groupname)
154
            except Membership.DoesNotExist, e:
155
                self.stdout.write("User is not a member of %s\n" % groupname)
156
        
157
        pname = options.get('add-permission')
158
        if pname is not None:
159
            try:
160
                r, created = add_user_permission(user, pname)
161
                if created:
162
                    self.stdout.write('Permission: %s created successfully\n' % pname)
163
                if r > 0:
164
                    self.stdout.write('Permission: %s added successfully\n' % pname)
165
                elif r==0:
166
                    self.stdout.write('User has already permission: %s\n' % pname)
167
            except Exception, e:
168
                raise CommandError(e)
169
        
170
        pname  = options.get('delete-permission')
171
        if pname is not None and not user.has_perm(pname):
172
            try:
173
                r = remove_user_permission(user, pname)
174
                if r < 0:
175
                    self.stdout.write('Invalid permission codename: %s\n' % pname)
176
                elif r == 0:
177
                    self.stdout.write('User has not permission: %s\n' % pname)
178
                elif r > 0:
179
                    self.stdout.write('Permission: %s removed successfully\n' % pname)
180
            except Exception, e:
181
                raise CommandError(e)
182
        
183
        level = options.get('level')
184
        if level is not None:
185
            user.level = int(level)
186
        
187
        password = options.get('password')
188
        if password is not None:
189
            user.set_password(password)
190
        
191
        provider = options.get('provider')
192
        if provider is not None:
193
            user.provider = provider
194
        
195
        
196
        password = None
197
        if options['renew_password']:
198
            password = AstakosUser.objects.make_random_password()
199
            user.set_password(password)
200
        
201
        if options['renew_token']:
202
            user.renew_token()
203
        
204
        try:
205
            user.save()
206
        except ValidationError, e:
207
            raise CommandError(e)
208
        
209
        if password:
210
            self.stdout.write('User\'s new password: %s\n' % password)