Merge branch 'master' into newstyles
[astakos] / snf-astakos-app / astakos / im / management / commands / modifyuser.py
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)