Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (8.8 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 9d7ace6f Sofia Papagiannaki
from datetime import datetime
36 df48dd1b Giorgos Verigakis
37 c7c0ec58 Giorgos Korfiatis
from django.utils.translation import ugettext as _
38 df48dd1b Giorgos Verigakis
from django.core.management.base import BaseCommand, CommandError
39 c0b26605 Sofia Papagiannaki
from django.contrib.auth.models import Group
40 0a569195 Sofia Papagiannaki
from django.core.exceptions import ValidationError
41 df48dd1b Giorgos Verigakis
42 9a06d96f Olga Brani
from astakos.im.models import AstakosUser
43 c7c0ec58 Giorgos Korfiatis
from astakos.im.functions import (activate, deactivate,
44 c7c0ec58 Giorgos Korfiatis
                                  set_pending_application_limit,
45 c7c0ec58 Giorgos Korfiatis
                                  unset_pending_application_limit)
46 30dc8c1a Sofia Papagiannaki
from ._common import remove_user_permission, add_user_permission
47 b830f774 Giorgos Korfiatis
from snf_django.lib.db.transaction import commit_on_success_strict
48 df48dd1b Giorgos Verigakis
49 5ce3ce4f Sofia Papagiannaki
50 df48dd1b Giorgos Verigakis
class Command(BaseCommand):
51 0a569195 Sofia Papagiannaki
    args = "<user ID>"
52 df48dd1b Giorgos Verigakis
    help = "Modify a user's attributes"
53 5ce3ce4f Sofia Papagiannaki
54 9a06d96f Olga Brani
    option_list = BaseCommand.option_list + (
55 df48dd1b Giorgos Verigakis
        make_option('--invitations',
56 5ce3ce4f Sofia Papagiannaki
                    dest='invitations',
57 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
58 5ce3ce4f Sofia Papagiannaki
                    help="Update user's invitations"),
59 ebd369d0 Sofia Papagiannaki
        make_option('--level',
60 5ce3ce4f Sofia Papagiannaki
                    dest='level',
61 5ce3ce4f Sofia Papagiannaki
                    metavar='NUM',
62 5ce3ce4f Sofia Papagiannaki
                    help="Update user's level"),
63 df48dd1b Giorgos Verigakis
        make_option('--password',
64 5ce3ce4f Sofia Papagiannaki
                    dest='password',
65 5ce3ce4f Sofia Papagiannaki
                    metavar='PASSWORD',
66 5ce3ce4f Sofia Papagiannaki
                    help="Set user's password"),
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 21e0fdad Giorgos Korfiatis
                    help="Change user's state to active"),
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 cdd30404 Giorgos Korfiatis
        make_option('--max-pending-projects',
110 c7c0ec58 Giorgos Korfiatis
                    dest='pending',
111 c7c0ec58 Giorgos Korfiatis
                    metavar='INT',
112 c7c0ec58 Giorgos Korfiatis
                    help=("Set limit on user's maximum pending "
113 c7c0ec58 Giorgos Korfiatis
                          "project applications")),
114 cdd30404 Giorgos Korfiatis
        make_option('--reset-max-pending-projects',
115 c7c0ec58 Giorgos Korfiatis
                    dest='unset_pending',
116 c7c0ec58 Giorgos Korfiatis
                    action='store_true',
117 c7c0ec58 Giorgos Korfiatis
                    default=False,
118 c7c0ec58 Giorgos Korfiatis
                    help=("Restore default limit of user's maximum pending "
119 c7c0ec58 Giorgos Korfiatis
                          "project applications")),
120 9a06d96f Olga Brani
    )
121 9a06d96f Olga Brani
122 200b37fb Giorgos Korfiatis
    @commit_on_success_strict()
123 df48dd1b Giorgos Verigakis
    def handle(self, *args, **options):
124 df48dd1b Giorgos Verigakis
        if len(args) != 1:
125 0a569195 Sofia Papagiannaki
            raise CommandError("Please provide a user ID")
126 5ce3ce4f Sofia Papagiannaki
127 0a569195 Sofia Papagiannaki
        if args[0].isdigit():
128 c7c0ec58 Giorgos Korfiatis
            user_id = int(args[0])
129 c7c0ec58 Giorgos Korfiatis
            user = AstakosUser.objects.get(id=user_id)
130 0a569195 Sofia Papagiannaki
        else:
131 0a569195 Sofia Papagiannaki
            raise CommandError("Invalid ID")
132 5ce3ce4f Sofia Papagiannaki
133 397d5cbe Giorgos Verigakis
        if not user:
134 397d5cbe Giorgos Verigakis
            raise CommandError("Unknown user")
135 5ce3ce4f Sofia Papagiannaki
136 df48dd1b Giorgos Verigakis
        if options.get('admin'):
137 df48dd1b Giorgos Verigakis
            user.is_superuser = True
138 df48dd1b Giorgos Verigakis
        elif options.get('noadmin'):
139 df48dd1b Giorgos Verigakis
            user.is_superuser = False
140 5ce3ce4f Sofia Papagiannaki
141 ebd369d0 Sofia Papagiannaki
        if options.get('active'):
142 21e0fdad Giorgos Korfiatis
            activate(user)
143 ebd369d0 Sofia Papagiannaki
        elif options.get('inactive'):
144 21e0fdad Giorgos Korfiatis
            deactivate(user)
145 5ce3ce4f Sofia Papagiannaki
146 df48dd1b Giorgos Verigakis
        invitations = options.get('invitations')
147 df48dd1b Giorgos Verigakis
        if invitations is not None:
148 df48dd1b Giorgos Verigakis
            user.invitations = int(invitations)
149 5ce3ce4f Sofia Papagiannaki
150 4e30244e Sofia Papagiannaki
        groupname = options.get('add-group')
151 18ffbee1 Sofia Papagiannaki
        if groupname is not None:
152 18ffbee1 Sofia Papagiannaki
            try:
153 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
154 9a06d96f Olga Brani
                user.groups.add(group)
155 9a06d96f Olga Brani
            except Group.DoesNotExist, e:
156 5ce3ce4f Sofia Papagiannaki
                self.stdout.write(
157 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
158 5ce3ce4f Sofia Papagiannaki
159 4e30244e Sofia Papagiannaki
        groupname = options.get('delete-group')
160 4e30244e Sofia Papagiannaki
        if groupname is not None:
161 4e30244e Sofia Papagiannaki
            try:
162 9a06d96f Olga Brani
                group = Group.objects.get(name=groupname)
163 9a06d96f Olga Brani
                user.groups.remove(group)
164 9a06d96f Olga Brani
            except Group.DoesNotExist, e:
165 5ce3ce4f Sofia Papagiannaki
                self.stdout.write(
166 5ce3ce4f Sofia Papagiannaki
                    "Group named %s does not exist\n" % groupname)
167 5ce3ce4f Sofia Papagiannaki
168 30dc8c1a Sofia Papagiannaki
        pname = options.get('add-permission')
169 30dc8c1a Sofia Papagiannaki
        if pname is not None:
170 30dc8c1a Sofia Papagiannaki
            try:
171 30dc8c1a Sofia Papagiannaki
                r, created = add_user_permission(user, pname)
172 30dc8c1a Sofia Papagiannaki
                if created:
173 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
174 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s created successfully\n' % pname)
175 30dc8c1a Sofia Papagiannaki
                if r > 0:
176 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
177 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s added successfully\n' % pname)
178 5ce3ce4f Sofia Papagiannaki
                elif r == 0:
179 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
180 5ce3ce4f Sofia Papagiannaki
                        'User has already permission: %s\n' % pname)
181 30dc8c1a Sofia Papagiannaki
            except Exception, e:
182 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
183 5ce3ce4f Sofia Papagiannaki
184 5ce3ce4f Sofia Papagiannaki
        pname = options.get('delete-permission')
185 30dc8c1a Sofia Papagiannaki
        if pname is not None and not user.has_perm(pname):
186 30dc8c1a Sofia Papagiannaki
            try:
187 30dc8c1a Sofia Papagiannaki
                r = remove_user_permission(user, pname)
188 30dc8c1a Sofia Papagiannaki
                if r < 0:
189 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
190 5ce3ce4f Sofia Papagiannaki
                        'Invalid permission codename: %s\n' % pname)
191 30dc8c1a Sofia Papagiannaki
                elif r == 0:
192 30dc8c1a Sofia Papagiannaki
                    self.stdout.write('User has not permission: %s\n' % pname)
193 30dc8c1a Sofia Papagiannaki
                elif r > 0:
194 5ce3ce4f Sofia Papagiannaki
                    self.stdout.write(
195 5ce3ce4f Sofia Papagiannaki
                        'Permission: %s removed successfully\n' % pname)
196 30dc8c1a Sofia Papagiannaki
            except Exception, e:
197 30dc8c1a Sofia Papagiannaki
                raise CommandError(e)
198 5ce3ce4f Sofia Papagiannaki
199 ebd369d0 Sofia Papagiannaki
        level = options.get('level')
200 ebd369d0 Sofia Papagiannaki
        if level is not None:
201 ebd369d0 Sofia Papagiannaki
            user.level = int(level)
202 5ce3ce4f Sofia Papagiannaki
203 df48dd1b Giorgos Verigakis
        password = options.get('password')
204 df48dd1b Giorgos Verigakis
        if password is not None:
205 df48dd1b Giorgos Verigakis
            user.set_password(password)
206 5ce3ce4f Sofia Papagiannaki
207 cfb15117 Sofia Papagiannaki
        password = None
208 cfb15117 Sofia Papagiannaki
        if options['renew_password']:
209 cfb15117 Sofia Papagiannaki
            password = AstakosUser.objects.make_random_password()
210 cfb15117 Sofia Papagiannaki
            user.set_password(password)
211 5ce3ce4f Sofia Papagiannaki
212 df48dd1b Giorgos Verigakis
        if options['renew_token']:
213 df48dd1b Giorgos Verigakis
            user.renew_token()
214 5ce3ce4f Sofia Papagiannaki
215 0a569195 Sofia Papagiannaki
        try:
216 0a569195 Sofia Papagiannaki
            user.save()
217 0a569195 Sofia Papagiannaki
        except ValidationError, e:
218 27e26a41 Sofia Papagiannaki
            raise CommandError(e)
219 5ce3ce4f Sofia Papagiannaki
220 cfb15117 Sofia Papagiannaki
        if password:
221 cfb15117 Sofia Papagiannaki
            self.stdout.write('User\'s new password: %s\n' % password)
222 c7c0ec58 Giorgos Korfiatis
223 c7c0ec58 Giorgos Korfiatis
        pending = options.get('pending')
224 c7c0ec58 Giorgos Korfiatis
        if pending:
225 c7c0ec58 Giorgos Korfiatis
            try:
226 c7c0ec58 Giorgos Korfiatis
                pending = int(pending)
227 c7c0ec58 Giorgos Korfiatis
            except ValueError as e:
228 c7c0ec58 Giorgos Korfiatis
                m = _("Expected integer argument")
229 c7c0ec58 Giorgos Korfiatis
                raise CommandError(m)
230 c7c0ec58 Giorgos Korfiatis
            else:
231 c7c0ec58 Giorgos Korfiatis
                set_pending_application_limit(user_id, pending)
232 c7c0ec58 Giorgos Korfiatis
233 c7c0ec58 Giorgos Korfiatis
        unset_pending = options.get('unset_pending')
234 c7c0ec58 Giorgos Korfiatis
        if unset_pending:
235 c7c0ec58 Giorgos Korfiatis
            unset_pending_application_limit(user_id)