Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / user-update.py @ 6bdf0aa3

History | View | Annotate | Download (8.5 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 5ce3ce4f Sofia Papagiannaki
46 df48dd1b Giorgos Verigakis
class Command(BaseCommand):
47 0a569195 Sofia Papagiannaki
    args = "<user ID>"
48 df48dd1b Giorgos Verigakis
    help = "Modify a user's attributes"
49 5ce3ce4f Sofia Papagiannaki
50 df48dd1b Giorgos Verigakis
    option_list = BaseCommand.option_list + (
51 df48dd1b Giorgos Verigakis
        make_option('--invitations',
52 5ce3ce4f Sofia Papagiannaki
                    dest='invitations',
53 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
54 5ce3ce4f Sofia Papagiannaki
                    help="Update user's invitations"),
55 ebd369d0 Sofia Papagiannaki
        make_option('--level',
56 5ce3ce4f Sofia Papagiannaki
                    dest='level',
57 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
58 5ce3ce4f Sofia Papagiannaki
                    help="Update user's level"),
59 df48dd1b Giorgos Verigakis
        make_option('--password',
60 5ce3ce4f Sofia Papagiannaki
                    dest='password',
61 5ce3ce4f Sofia Papagiannaki
                    metavar='PASSWORD',
62 5ce3ce4f Sofia Papagiannaki
                    help="Set user's password"),
63 cfb15117 Sofia Papagiannaki
        make_option('--provider',
64 5ce3ce4f Sofia Papagiannaki
                    dest='provider',
65 5ce3ce4f Sofia Papagiannaki
                    metavar='PROVIDER',
66 5ce3ce4f Sofia Papagiannaki
                    help="Set user's provider"),
67 df48dd1b Giorgos Verigakis
        make_option('--renew-token',
68 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
69 5ce3ce4f Sofia Papagiannaki
                    dest='renew_token',
70 5ce3ce4f Sofia Papagiannaki
                    default=False,
71 5ce3ce4f Sofia Papagiannaki
                    help="Renew the user's token"),
72 cfb15117 Sofia Papagiannaki
        make_option('--renew-password',
73 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
74 5ce3ce4f Sofia Papagiannaki
                    dest='renew_password',
75 5ce3ce4f Sofia Papagiannaki
                    default=False,
76 5ce3ce4f Sofia Papagiannaki
                    help="Renew the user's password"),
77 df48dd1b Giorgos Verigakis
        make_option('--set-admin',
78 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
79 5ce3ce4f Sofia Papagiannaki
                    dest='admin',
80 5ce3ce4f Sofia Papagiannaki
                    default=False,
81 5ce3ce4f Sofia Papagiannaki
                    help="Give user admin rights"),
82 df48dd1b Giorgos Verigakis
        make_option('--set-noadmin',
83 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
84 5ce3ce4f Sofia Papagiannaki
                    dest='noadmin',
85 5ce3ce4f Sofia Papagiannaki
                    default=False,
86 5ce3ce4f Sofia Papagiannaki
                    help="Revoke user's admin rights"),
87 ebd369d0 Sofia Papagiannaki
        make_option('--set-active',
88 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
89 5ce3ce4f Sofia Papagiannaki
                    dest='active',
90 5ce3ce4f Sofia Papagiannaki
                    default=False,
91 5ce3ce4f Sofia Papagiannaki
                    help="Change user's state to inactive"),
92 ebd369d0 Sofia Papagiannaki
        make_option('--set-inactive',
93 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
94 5ce3ce4f Sofia Papagiannaki
                    dest='inactive',
95 5ce3ce4f Sofia Papagiannaki
                    default=False,
96 5ce3ce4f Sofia Papagiannaki
                    help="Change user's state to inactive"),
97 4e30244e Sofia Papagiannaki
        make_option('--add-group',
98 5ce3ce4f Sofia Papagiannaki
                    dest='add-group',
99 5ce3ce4f Sofia Papagiannaki
                    help="Add user group"),
100 4e30244e Sofia Papagiannaki
        make_option('--delete-group',
101 5ce3ce4f Sofia Papagiannaki
                    dest='delete-group',
102 5ce3ce4f Sofia Papagiannaki
                    help="Delete user group"),
103 30dc8c1a Sofia Papagiannaki
        make_option('--add-permission',
104 5ce3ce4f Sofia Papagiannaki
                    dest='add-permission',
105 5ce3ce4f Sofia Papagiannaki
                    help="Add user permission"),
106 30dc8c1a Sofia Papagiannaki
        make_option('--delete-permission',
107 5ce3ce4f Sofia Papagiannaki
                    dest='delete-permission',
108 5ce3ce4f Sofia Papagiannaki
                    help="Delete user permission"),
109 fc1e2f02 Sofia Papagiannaki
        make_option('--refill-credits',
110 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
111 5ce3ce4f Sofia Papagiannaki
                    dest='refill',
112 5ce3ce4f Sofia Papagiannaki
                    default=False,
113 5ce3ce4f Sofia Papagiannaki
                    help="Refill user credits"),
114 5ce3ce4f Sofia Papagiannaki
    )
115 5ce3ce4f Sofia Papagiannaki
116 df48dd1b Giorgos Verigakis
    def handle(self, *args, **options):
117 df48dd1b Giorgos Verigakis
        if len(args) != 1:
118 0a569195 Sofia Papagiannaki
            raise CommandError("Please provide a user ID")
119 5ce3ce4f Sofia Papagiannaki
120 0a569195 Sofia Papagiannaki
        if args[0].isdigit():
121 5ce3ce4f Sofia Papagiannaki
            user = AstakosUser.objects.get(id=int(args[0]))
122 0a569195 Sofia Papagiannaki
        else:
123 0a569195 Sofia Papagiannaki
            raise CommandError("Invalid ID")
124 5ce3ce4f Sofia Papagiannaki
125 397d5cbe Giorgos Verigakis
        if not user:
126 397d5cbe Giorgos Verigakis
            raise CommandError("Unknown user")
127 5ce3ce4f Sofia Papagiannaki
128 df48dd1b Giorgos Verigakis
        if options.get('admin'):
129 df48dd1b Giorgos Verigakis
            user.is_superuser = True
130 df48dd1b Giorgos Verigakis
        elif options.get('noadmin'):
131 df48dd1b Giorgos Verigakis
            user.is_superuser = False
132 5ce3ce4f Sofia Papagiannaki
133 ebd369d0 Sofia Papagiannaki
        if options.get('active'):
134 ebd369d0 Sofia Papagiannaki
            user.is_active = True
135 ebd369d0 Sofia Papagiannaki
        elif options.get('inactive'):
136 ebd369d0 Sofia Papagiannaki
            user.is_active = False
137 5ce3ce4f Sofia Papagiannaki
138 df48dd1b Giorgos Verigakis
        invitations = options.get('invitations')
139 df48dd1b Giorgos Verigakis
        if invitations is not None:
140 df48dd1b Giorgos Verigakis
            user.invitations = int(invitations)
141 5ce3ce4f Sofia Papagiannaki
142 4e30244e Sofia Papagiannaki
        groupname = options.get('add-group')
143 18ffbee1 Sofia Papagiannaki
        if groupname is not None:
144 18ffbee1 Sofia Papagiannaki
            try:
145 304acb60 Olga Brani
                group = AstakosGroup.objects.get(name=groupname)
146 5ce3ce4f Sofia Papagiannaki
                m = Membership(
147 5ce3ce4f Sofia Papagiannaki
                    person=user, group=group, date_joined=datetime.now())
148 304acb60 Olga Brani
                m.save()
149 304acb60 Olga Brani
            except AstakosGroup.DoesNotExist, e:
150 5ce3ce4f Sofia Papagiannaki
                self.stdout.write(
151 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
152 304acb60 Olga Brani
            except IntegrityError, e:
153 304acb60 Olga Brani
                self.stdout.write("User is already member of %s\n" % groupname)
154 5ce3ce4f Sofia Papagiannaki
155 4e30244e Sofia Papagiannaki
        groupname = options.get('delete-group')
156 4e30244e Sofia Papagiannaki
        if groupname is not None:
157 4e30244e Sofia Papagiannaki
            try:
158 304acb60 Olga Brani
                group = AstakosGroup.objects.get(name=groupname)
159 304acb60 Olga Brani
                m = Membership.objects.get(person=user, group=group)
160 304acb60 Olga Brani
                m.delete()
161 304acb60 Olga Brani
            except AstakosGroup.DoesNotExist, e:
162 5ce3ce4f Sofia Papagiannaki
                self.stdout.write(
163 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
164 304acb60 Olga Brani
            except Membership.DoesNotExist, e:
165 304acb60 Olga Brani
                self.stdout.write("User is not a member of %s\n" % groupname)
166 5ce3ce4f Sofia Papagiannaki
167 30dc8c1a Sofia Papagiannaki
        pname = options.get('add-permission')
168 30dc8c1a Sofia Papagiannaki
        if pname is not None:
169 30dc8c1a Sofia Papagiannaki
            try:
170 30dc8c1a Sofia Papagiannaki
                r, created = add_user_permission(user, pname)
171 30dc8c1a Sofia Papagiannaki
                if created:
172 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
173 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s created successfully\n' % pname)
174 30dc8c1a Sofia Papagiannaki
                if r > 0:
175 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
176 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s added successfully\n' % pname)
177 5ce3ce4f Sofia Papagiannaki
                elif r == 0:
178 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
179 5ce3ce4f Sofia Papagiannaki
                        'User has already permission: %s\n' % pname)
180 30dc8c1a Sofia Papagiannaki
            except Exception, e:
181 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
182 5ce3ce4f Sofia Papagiannaki
183 5ce3ce4f Sofia Papagiannaki
        pname = options.get('delete-permission')
184 30dc8c1a Sofia Papagiannaki
        if pname is not None and not user.has_perm(pname):
185 30dc8c1a Sofia Papagiannaki
            try:
186 30dc8c1a Sofia Papagiannaki
                r = remove_user_permission(user, pname)
187 30dc8c1a Sofia Papagiannaki
                if r < 0:
188 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
189 5ce3ce4f Sofia Papagiannaki
                        'Invalid permission codename: %s\n' % pname)
190 30dc8c1a Sofia Papagiannaki
                elif r == 0:
191 30dc8c1a Sofia Papagiannaki
                    self.stdout.write('User has not permission: %s\n' % pname)
192 30dc8c1a Sofia Papagiannaki
                elif r > 0:
193 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
194 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s removed successfully\n' % pname)
195 30dc8c1a Sofia Papagiannaki
            except Exception, e:
196 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
197 5ce3ce4f Sofia Papagiannaki
198 ebd369d0 Sofia Papagiannaki
        level = options.get('level')
199 ebd369d0 Sofia Papagiannaki
        if level is not None:
200 ebd369d0 Sofia Papagiannaki
            user.level = int(level)
201 5ce3ce4f Sofia Papagiannaki
202 df48dd1b Giorgos Verigakis
        password = options.get('password')
203 df48dd1b Giorgos Verigakis
        if password is not None:
204 df48dd1b Giorgos Verigakis
            user.set_password(password)
205 5ce3ce4f Sofia Papagiannaki
206 cfb15117 Sofia Papagiannaki
        provider = options.get('provider')
207 cfb15117 Sofia Papagiannaki
        if provider is not None:
208 cfb15117 Sofia Papagiannaki
            user.provider = provider
209 5ce3ce4f Sofia Papagiannaki
210 cfb15117 Sofia Papagiannaki
        password = None
211 cfb15117 Sofia Papagiannaki
        if options['renew_password']:
212 cfb15117 Sofia Papagiannaki
            password = AstakosUser.objects.make_random_password()
213 cfb15117 Sofia Papagiannaki
            user.set_password(password)
214 5ce3ce4f Sofia Papagiannaki
215 df48dd1b Giorgos Verigakis
        if options['renew_token']:
216 df48dd1b Giorgos Verigakis
            user.renew_token()
217 5ce3ce4f Sofia Papagiannaki
218 fc1e2f02 Sofia Papagiannaki
        if options['refill']:
219 fc1e2f02 Sofia Papagiannaki
            report_user_credits_event(user)
220 5ce3ce4f Sofia Papagiannaki
221 0a569195 Sofia Papagiannaki
        try:
222 0a569195 Sofia Papagiannaki
            user.save()
223 0a569195 Sofia Papagiannaki
        except ValidationError, e:
224 27e26a41 Sofia Papagiannaki
            raise CommandError(e)
225 5ce3ce4f Sofia Papagiannaki
226 cfb15117 Sofia Papagiannaki
        if password:
227 cfb15117 Sofia Papagiannaki
            self.stdout.write('User\'s new password: %s\n' % password)