Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (8.1 kB)

1 ca96a346 Giorgos Verigakis
# Copyright 2012 GRNET S.A. All rights reserved.
2 df48dd1b Giorgos Verigakis
#
3 df48dd1b Giorgos Verigakis
# Redistribution and use in source and binary forms, with or
4 df48dd1b Giorgos Verigakis
# without modification, are permitted provided that the following
5 df48dd1b Giorgos Verigakis
# conditions are met:
6 df48dd1b Giorgos Verigakis
#
7 df48dd1b Giorgos Verigakis
#   1. Redistributions of source code must retain the above
8 df48dd1b Giorgos Verigakis
#      copyright notice, this list of conditions and the following
9 df48dd1b Giorgos Verigakis
#      disclaimer.
10 df48dd1b Giorgos Verigakis
#
11 df48dd1b Giorgos Verigakis
#   2. Redistributions in binary form must reproduce the above
12 df48dd1b Giorgos Verigakis
#      copyright notice, this list of conditions and the following
13 df48dd1b Giorgos Verigakis
#      disclaimer in the documentation and/or other materials
14 df48dd1b Giorgos Verigakis
#      provided with the distribution.
15 df48dd1b Giorgos Verigakis
#
16 df48dd1b Giorgos Verigakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 df48dd1b Giorgos Verigakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 df48dd1b Giorgos Verigakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 df48dd1b Giorgos Verigakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 df48dd1b Giorgos Verigakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 df48dd1b Giorgos Verigakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 df48dd1b Giorgos Verigakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 df48dd1b Giorgos Verigakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 df48dd1b Giorgos Verigakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 df48dd1b Giorgos Verigakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 df48dd1b Giorgos Verigakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 df48dd1b Giorgos Verigakis
# POSSIBILITY OF SUCH DAMAGE.
28 df48dd1b Giorgos Verigakis
#
29 df48dd1b Giorgos Verigakis
# The views and conclusions contained in the software and
30 df48dd1b Giorgos Verigakis
# documentation are those of the authors and should not be
31 df48dd1b Giorgos Verigakis
# interpreted as representing official policies, either expressed
32 df48dd1b Giorgos Verigakis
# or implied, of GRNET S.A.
33 df48dd1b Giorgos Verigakis
34 df48dd1b Giorgos Verigakis
from optparse import make_option
35 304acb60 Olga Brani
from datetime import datetime
36 df48dd1b Giorgos Verigakis
37 df48dd1b Giorgos Verigakis
from django.core.management.base import BaseCommand, CommandError
38 0a569195 Sofia Papagiannaki
from django.core.exceptions import ValidationError
39 304acb60 Olga Brani
from django.db.utils import IntegrityError
40 df48dd1b Giorgos Verigakis
41 304acb60 Olga Brani
from astakos.im.models import AstakosUser, AstakosGroup, Membership
42 fc1e2f02 Sofia Papagiannaki
from astakos.im.endpoints.aquarium.producer import report_user_credits_event
43 30dc8c1a Sofia Papagiannaki
from ._common import remove_user_permission, add_user_permission
44 df48dd1b Giorgos Verigakis
45 df48dd1b Giorgos Verigakis
class Command(BaseCommand):
46 0a569195 Sofia Papagiannaki
    args = "<user ID>"
47 df48dd1b Giorgos Verigakis
    help = "Modify a user's attributes"
48 df48dd1b Giorgos Verigakis
    
49 df48dd1b Giorgos Verigakis
    option_list = BaseCommand.option_list + (
50 df48dd1b Giorgos Verigakis
        make_option('--invitations',
51 df48dd1b Giorgos Verigakis
            dest='invitations',
52 df48dd1b Giorgos Verigakis
            metavar='NUM',
53 df48dd1b Giorgos Verigakis
            help="Update user's invitations"),
54 ebd369d0 Sofia Papagiannaki
        make_option('--level',
55 ebd369d0 Sofia Papagiannaki
            dest='level',
56 ebd369d0 Sofia Papagiannaki
            metavar='NUM',
57 ebd369d0 Sofia Papagiannaki
            help="Update user's level"),
58 df48dd1b Giorgos Verigakis
        make_option('--password',
59 df48dd1b Giorgos Verigakis
            dest='password',
60 df48dd1b Giorgos Verigakis
            metavar='PASSWORD',
61 df48dd1b Giorgos Verigakis
            help="Set user's password"),
62 cfb15117 Sofia Papagiannaki
        make_option('--provider',
63 cfb15117 Sofia Papagiannaki
            dest='provider',
64 cfb15117 Sofia Papagiannaki
            metavar='PROVIDER',
65 cfb15117 Sofia Papagiannaki
            help="Set user's provider"),
66 df48dd1b Giorgos Verigakis
        make_option('--renew-token',
67 df48dd1b Giorgos Verigakis
            action='store_true',
68 df48dd1b Giorgos Verigakis
            dest='renew_token',
69 df48dd1b Giorgos Verigakis
            default=False,
70 df48dd1b Giorgos Verigakis
            help="Renew the user's token"),
71 cfb15117 Sofia Papagiannaki
        make_option('--renew-password',
72 cfb15117 Sofia Papagiannaki
            action='store_true',
73 cfb15117 Sofia Papagiannaki
            dest='renew_password',
74 cfb15117 Sofia Papagiannaki
            default=False,
75 cfb15117 Sofia Papagiannaki
            help="Renew the user's password"),
76 df48dd1b Giorgos Verigakis
        make_option('--set-admin',
77 df48dd1b Giorgos Verigakis
            action='store_true',
78 df48dd1b Giorgos Verigakis
            dest='admin',
79 df48dd1b Giorgos Verigakis
            default=False,
80 df48dd1b Giorgos Verigakis
            help="Give user admin rights"),
81 df48dd1b Giorgos Verigakis
        make_option('--set-noadmin',
82 df48dd1b Giorgos Verigakis
            action='store_true',
83 df48dd1b Giorgos Verigakis
            dest='noadmin',
84 df48dd1b Giorgos Verigakis
            default=False,
85 df48dd1b Giorgos Verigakis
            help="Revoke user's admin rights"),
86 ebd369d0 Sofia Papagiannaki
        make_option('--set-active',
87 ebd369d0 Sofia Papagiannaki
            action='store_true',
88 ebd369d0 Sofia Papagiannaki
            dest='active',
89 ebd369d0 Sofia Papagiannaki
            default=False,
90 ebd369d0 Sofia Papagiannaki
            help="Change user's state to inactive"),
91 ebd369d0 Sofia Papagiannaki
        make_option('--set-inactive',
92 fc28d013 Sofia Papagiannaki
            action='store_true',
93 fc28d013 Sofia Papagiannaki
            dest='inactive',
94 fc28d013 Sofia Papagiannaki
            default=False,
95 fc28d013 Sofia Papagiannaki
            help="Change user's state to inactive"),
96 4e30244e Sofia Papagiannaki
        make_option('--add-group',
97 4e30244e Sofia Papagiannaki
            dest='add-group',
98 4e30244e Sofia Papagiannaki
            help="Add user group"),
99 4e30244e Sofia Papagiannaki
        make_option('--delete-group',
100 4e30244e Sofia Papagiannaki
            dest='delete-group',
101 4e30244e Sofia Papagiannaki
            help="Delete user group"),
102 30dc8c1a Sofia Papagiannaki
        make_option('--add-permission',
103 30dc8c1a Sofia Papagiannaki
            dest='add-permission',
104 30dc8c1a Sofia Papagiannaki
            help="Add user permission"),
105 30dc8c1a Sofia Papagiannaki
        make_option('--delete-permission',
106 30dc8c1a Sofia Papagiannaki
            dest='delete-permission',
107 30dc8c1a Sofia Papagiannaki
            help="Delete user permission"),
108 fc1e2f02 Sofia Papagiannaki
        make_option('--refill-credits',
109 fc1e2f02 Sofia Papagiannaki
            action='store_true',
110 fc1e2f02 Sofia Papagiannaki
            dest='refill',
111 fc1e2f02 Sofia Papagiannaki
            default=False,
112 fc1e2f02 Sofia Papagiannaki
            help="Refill user credits"),
113 df48dd1b Giorgos Verigakis
        )
114 df48dd1b Giorgos Verigakis
    
115 df48dd1b Giorgos Verigakis
    def handle(self, *args, **options):
116 df48dd1b Giorgos Verigakis
        if len(args) != 1:
117 0a569195 Sofia Papagiannaki
            raise CommandError("Please provide a user ID")
118 0a569195 Sofia Papagiannaki
        
119 0a569195 Sofia Papagiannaki
        if args[0].isdigit():
120 0a569195 Sofia Papagiannaki
            user = AstakosUser.objects.get(id=int( args[0]))
121 0a569195 Sofia Papagiannaki
        else:
122 0a569195 Sofia Papagiannaki
            raise CommandError("Invalid ID")
123 df48dd1b Giorgos Verigakis
        
124 397d5cbe Giorgos Verigakis
        if not user:
125 397d5cbe Giorgos Verigakis
            raise CommandError("Unknown user")
126 df48dd1b Giorgos Verigakis
        
127 df48dd1b Giorgos Verigakis
        if options.get('admin'):
128 df48dd1b Giorgos Verigakis
            user.is_superuser = True
129 df48dd1b Giorgos Verigakis
        elif options.get('noadmin'):
130 df48dd1b Giorgos Verigakis
            user.is_superuser = False
131 df48dd1b Giorgos Verigakis
        
132 ebd369d0 Sofia Papagiannaki
        if options.get('active'):
133 ebd369d0 Sofia Papagiannaki
            user.is_active = True
134 ebd369d0 Sofia Papagiannaki
        elif options.get('inactive'):
135 ebd369d0 Sofia Papagiannaki
            user.is_active = False
136 ebd369d0 Sofia Papagiannaki
        
137 df48dd1b Giorgos Verigakis
        invitations = options.get('invitations')
138 df48dd1b Giorgos Verigakis
        if invitations is not None:
139 df48dd1b Giorgos Verigakis
            user.invitations = int(invitations)
140 df48dd1b Giorgos Verigakis
        
141 4e30244e Sofia Papagiannaki
        groupname = options.get('add-group')
142 18ffbee1 Sofia Papagiannaki
        if groupname is not None:
143 18ffbee1 Sofia Papagiannaki
            try:
144 304acb60 Olga Brani
                group = AstakosGroup.objects.get(name=groupname)
145 304acb60 Olga Brani
                m = Membership(person=user, group=group, date_joined=datetime.now())
146 304acb60 Olga Brani
                m.save()
147 304acb60 Olga Brani
            except AstakosGroup.DoesNotExist, e:
148 30dc8c1a Sofia Papagiannaki
                self.stdout.write("Group named %s does not exist\n" % groupname)
149 304acb60 Olga Brani
            except IntegrityError, e:
150 304acb60 Olga Brani
                self.stdout.write("User is already member of %s\n" % groupname)
151 18ffbee1 Sofia Papagiannaki
        
152 4e30244e Sofia Papagiannaki
        groupname = options.get('delete-group')
153 4e30244e Sofia Papagiannaki
        if groupname is not None:
154 4e30244e Sofia Papagiannaki
            try:
155 304acb60 Olga Brani
                group = AstakosGroup.objects.get(name=groupname)
156 304acb60 Olga Brani
                m = Membership.objects.get(person=user, group=group)
157 304acb60 Olga Brani
                m.delete()
158 304acb60 Olga Brani
            except AstakosGroup.DoesNotExist, e:
159 30dc8c1a Sofia Papagiannaki
                self.stdout.write("Group named %s does not exist\n" % groupname)
160 304acb60 Olga Brani
            except Membership.DoesNotExist, e:
161 304acb60 Olga Brani
                self.stdout.write("User is not a member of %s\n" % groupname)
162 30dc8c1a Sofia Papagiannaki
        
163 30dc8c1a Sofia Papagiannaki
        pname = options.get('add-permission')
164 30dc8c1a Sofia Papagiannaki
        if pname is not None:
165 30dc8c1a Sofia Papagiannaki
            try:
166 30dc8c1a Sofia Papagiannaki
                r, created = add_user_permission(user, pname)
167 30dc8c1a Sofia Papagiannaki
                if created:
168 30dc8c1a Sofia Papagiannaki
                    self.stdout.write('Permission: %s created successfully\n' % pname)
169 30dc8c1a Sofia Papagiannaki
                if r > 0:
170 30dc8c1a Sofia Papagiannaki
                    self.stdout.write('Permission: %s added successfully\n' % pname)
171 30dc8c1a Sofia Papagiannaki
                elif r==0:
172 30dc8c1a Sofia Papagiannaki
                    self.stdout.write('User has already permission: %s\n' % pname)
173 30dc8c1a Sofia Papagiannaki
            except Exception, e:
174 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
175 30dc8c1a Sofia Papagiannaki
        
176 30dc8c1a Sofia Papagiannaki
        pname  = options.get('delete-permission')
177 30dc8c1a Sofia Papagiannaki
        if pname is not None and not user.has_perm(pname):
178 30dc8c1a Sofia Papagiannaki
            try:
179 30dc8c1a Sofia Papagiannaki
                r = remove_user_permission(user, pname)
180 30dc8c1a Sofia Papagiannaki
                if r < 0:
181 30dc8c1a Sofia Papagiannaki
                    self.stdout.write('Invalid permission codename: %s\n' % pname)
182 30dc8c1a Sofia Papagiannaki
                elif r == 0:
183 30dc8c1a Sofia Papagiannaki
                    self.stdout.write('User has not permission: %s\n' % pname)
184 30dc8c1a Sofia Papagiannaki
                elif r > 0:
185 30dc8c1a Sofia Papagiannaki
                    self.stdout.write('Permission: %s removed successfully\n' % pname)
186 30dc8c1a Sofia Papagiannaki
            except Exception, e:
187 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
188 4e30244e Sofia Papagiannaki
        
189 ebd369d0 Sofia Papagiannaki
        level = options.get('level')
190 ebd369d0 Sofia Papagiannaki
        if level is not None:
191 ebd369d0 Sofia Papagiannaki
            user.level = int(level)
192 ebd369d0 Sofia Papagiannaki
        
193 df48dd1b Giorgos Verigakis
        password = options.get('password')
194 df48dd1b Giorgos Verigakis
        if password is not None:
195 df48dd1b Giorgos Verigakis
            user.set_password(password)
196 df48dd1b Giorgos Verigakis
        
197 cfb15117 Sofia Papagiannaki
        provider = options.get('provider')
198 cfb15117 Sofia Papagiannaki
        if provider is not None:
199 cfb15117 Sofia Papagiannaki
            user.provider = provider
200 cfb15117 Sofia Papagiannaki
        
201 cfb15117 Sofia Papagiannaki
        
202 cfb15117 Sofia Papagiannaki
        password = None
203 cfb15117 Sofia Papagiannaki
        if options['renew_password']:
204 cfb15117 Sofia Papagiannaki
            password = AstakosUser.objects.make_random_password()
205 cfb15117 Sofia Papagiannaki
            user.set_password(password)
206 cfb15117 Sofia Papagiannaki
        
207 df48dd1b Giorgos Verigakis
        if options['renew_token']:
208 df48dd1b Giorgos Verigakis
            user.renew_token()
209 df48dd1b Giorgos Verigakis
        
210 fc1e2f02 Sofia Papagiannaki
        if options['refill']:
211 fc1e2f02 Sofia Papagiannaki
            report_user_credits_event(user)
212 fc1e2f02 Sofia Papagiannaki
        
213 0a569195 Sofia Papagiannaki
        try:
214 0a569195 Sofia Papagiannaki
            user.save()
215 0a569195 Sofia Papagiannaki
        except ValidationError, e:
216 27e26a41 Sofia Papagiannaki
            raise CommandError(e)
217 cfb15117 Sofia Papagiannaki
        
218 cfb15117 Sofia Papagiannaki
        if password:
219 cfb15117 Sofia Papagiannaki
            self.stdout.write('User\'s new password: %s\n' % password)