Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / user-show.py @ 9b3081a6

History | View | Annotate | Download (7.5 kB)

1 a3c6203c Giorgos Korfiatis
# Copyright 2012, 2013 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 a0699ee4 Sofia Papagiannaki
from django.core.management.base import CommandError
35 91eca048 Giorgos Korfiatis
from optparse import make_option
36 df48dd1b Giorgos Verigakis
37 6d583e07 Giorgos Korfiatis
from django.db.models import Q
38 6d583e07 Giorgos Korfiatis
from astakos.im.models import AstakosUser, get_latest_terms, Project
39 91eca048 Giorgos Korfiatis
from astakos.im.quotas import list_user_quotas
40 21fabaad Sofia Papagiannaki
41 a3c6203c Giorgos Korfiatis
from synnefo.lib.ordereddict import OrderedDict
42 7cfc0cef Christos Stavrakakis
from snf_django.management.commands import SynnefoCommand
43 d758784b Christos Stavrakakis
from snf_django.management import utils
44 df48dd1b Giorgos Verigakis
45 5a0f9d6c Giorgos Korfiatis
from ._common import show_user_quotas, style_options, check_style
46 df48dd1b Giorgos Verigakis
47 094c0768 Sofia Papagiannaki
import uuid
48 df48dd1b Giorgos Verigakis
49 865849d7 Giorgos Korfiatis
50 a0699ee4 Sofia Papagiannaki
class Command(SynnefoCommand):
51 a0699ee4 Sofia Papagiannaki
    args = "<user ID or email or uuid>"
52 df48dd1b Giorgos Verigakis
    help = "Show user info"
53 5ce3ce4f Sofia Papagiannaki
54 91eca048 Giorgos Korfiatis
    option_list = SynnefoCommand.option_list + (
55 075b91de Giorgos Korfiatis
        make_option('--quota',
56 91eca048 Giorgos Korfiatis
                    action='store_true',
57 91eca048 Giorgos Korfiatis
                    dest='list_quotas',
58 91eca048 Giorgos Korfiatis
                    default=False,
59 075b91de Giorgos Korfiatis
                    help="Also list user quota"),
60 44f510e1 Giorgos Korfiatis
        make_option('--unit-style',
61 44f510e1 Giorgos Korfiatis
                    default='mb',
62 44f510e1 Giorgos Korfiatis
                    help=("Specify display unit for resource values "
63 44f510e1 Giorgos Korfiatis
                          "(one of %s); defaults to mb") % style_options),
64 398a9604 Giorgos Korfiatis
        make_option('--projects',
65 398a9604 Giorgos Korfiatis
                    action='store_true',
66 398a9604 Giorgos Korfiatis
                    dest='list_projects',
67 398a9604 Giorgos Korfiatis
                    default=False,
68 398a9604 Giorgos Korfiatis
                    help="Also list project memberships"),
69 91eca048 Giorgos Korfiatis
    )
70 91eca048 Giorgos Korfiatis
71 df48dd1b Giorgos Verigakis
    def handle(self, *args, **options):
72 df48dd1b Giorgos Verigakis
        if len(args) != 1:
73 ebd369d0 Sofia Papagiannaki
            raise CommandError("Please provide a user ID or email")
74 5ce3ce4f Sofia Papagiannaki
75 094c0768 Sofia Papagiannaki
        identifier = args[0]
76 094c0768 Sofia Papagiannaki
        if identifier.isdigit():
77 094c0768 Sofia Papagiannaki
            users = AstakosUser.objects.filter(id=int(identifier))
78 0a569195 Sofia Papagiannaki
        else:
79 094c0768 Sofia Papagiannaki
            try:
80 094c0768 Sofia Papagiannaki
                uuid.UUID(identifier)
81 094c0768 Sofia Papagiannaki
            except:
82 094c0768 Sofia Papagiannaki
                users = AstakosUser.objects.filter(email__iexact=identifier)
83 094c0768 Sofia Papagiannaki
            else:
84 094c0768 Sofia Papagiannaki
                users = AstakosUser.objects.filter(uuid=identifier)
85 0a569195 Sofia Papagiannaki
        if users.count() == 0:
86 094c0768 Sofia Papagiannaki
            field = 'id' if identifier.isdigit() else 'email'
87 094c0768 Sofia Papagiannaki
            msg = "Unknown user with %s '%s'" % (field, identifier)
88 df48dd1b Giorgos Verigakis
            raise CommandError(msg)
89 5ce3ce4f Sofia Papagiannaki
90 0a569195 Sofia Papagiannaki
        for user in users:
91 a3c6203c Giorgos Korfiatis
            kv = OrderedDict(
92 a3c6203c Giorgos Korfiatis
                [
93 a3c6203c Giorgos Korfiatis
                    ('id', user.id),
94 a3c6203c Giorgos Korfiatis
                    ('uuid', user.uuid),
95 25769d1b Kostas Papadimitriou
                    ('status', user.status_display),
96 a3c6203c Giorgos Korfiatis
                    ('email', user.email),
97 a3c6203c Giorgos Korfiatis
                    ('first name', user.first_name),
98 a3c6203c Giorgos Korfiatis
                    ('last name', user.last_name),
99 a3c6203c Giorgos Korfiatis
                    ('active', user.is_active),
100 a3c6203c Giorgos Korfiatis
                    ('admin', user.is_superuser),
101 a3c6203c Giorgos Korfiatis
                    ('last login', user.last_login),
102 a3c6203c Giorgos Korfiatis
                    ('date joined', user.date_joined),
103 a3c6203c Giorgos Korfiatis
                    ('last update', user.updated),
104 a3c6203c Giorgos Korfiatis
                    #('token', user.auth_token),
105 a3c6203c Giorgos Korfiatis
                    ('token expiration', user.auth_token_expires),
106 a3c6203c Giorgos Korfiatis
                    ('providers', user.auth_providers_display),
107 a3c6203c Giorgos Korfiatis
                    ('verified', user.is_verified),
108 a3c6203c Giorgos Korfiatis
                    ('groups', [elem.name for elem in user.groups.all()]),
109 a3c6203c Giorgos Korfiatis
                    ('permissions', [elem.codename
110 a3c6203c Giorgos Korfiatis
                                     for elem in user.user_permissions.all()]),
111 21fabaad Sofia Papagiannaki
                    ('group permissions', user.get_group_permissions()),
112 21fabaad Sofia Papagiannaki
                    ('email verified', user.email_verified),
113 a3c6203c Giorgos Korfiatis
                    ('username', user.username),
114 a3c6203c Giorgos Korfiatis
                    ('activation_sent_date', user.activation_sent),
115 a3c6203c Giorgos Korfiatis
                ])
116 a3c6203c Giorgos Korfiatis
117 3362d142 Sofia Papagiannaki
            if get_latest_terms():
118 fcf90160 Sofia Papagiannaki
                has_signed_terms = user.signed_terms
119 437c0052 Sofia Papagiannaki
                kv['has_signed_terms'] = has_signed_terms
120 3362d142 Sofia Papagiannaki
                if has_signed_terms:
121 437c0052 Sofia Papagiannaki
                    kv['date_signed_terms'] = user.date_signed_terms
122 5ce3ce4f Sofia Papagiannaki
123 a0699ee4 Sofia Papagiannaki
            utils.pprint_table(self.stdout, [kv.values()], kv.keys(),
124 a0699ee4 Sofia Papagiannaki
                               options["output_format"], vertical=True)
125 91eca048 Giorgos Korfiatis
126 9b3081a6 Giorgos Korfiatis
            if options["list_quotas"] and user.is_accepted():
127 44f510e1 Giorgos Korfiatis
                unit_style = options["unit_style"]
128 44f510e1 Giorgos Korfiatis
                check_style(unit_style)
129 44f510e1 Giorgos Korfiatis
130 de292e89 Giorgos Korfiatis
                quotas, initial = list_user_quotas([user])
131 5a0f9d6c Giorgos Korfiatis
                h_quotas = quotas[user.uuid]
132 5a0f9d6c Giorgos Korfiatis
                h_initial = initial[user.uuid]
133 7820534a Giorgos Korfiatis
                if quotas:
134 7820534a Giorgos Korfiatis
                    self.stdout.write("\n")
135 5a0f9d6c Giorgos Korfiatis
                    print_data, labels = show_user_quotas(h_quotas, h_initial,
136 5a0f9d6c Giorgos Korfiatis
                                                          style=unit_style)
137 7820534a Giorgos Korfiatis
                    utils.pprint_table(self.stdout, print_data, labels,
138 7820534a Giorgos Korfiatis
                                       options["output_format"],
139 7820534a Giorgos Korfiatis
                                       title="User Quota")
140 398a9604 Giorgos Korfiatis
141 398a9604 Giorgos Korfiatis
            if options["list_projects"]:
142 398a9604 Giorgos Korfiatis
                print_data, labels = ownerships(user)
143 398a9604 Giorgos Korfiatis
                if print_data:
144 398a9604 Giorgos Korfiatis
                    self.stdout.write("\n")
145 398a9604 Giorgos Korfiatis
                    utils.pprint_table(self.stdout, print_data, labels,
146 398a9604 Giorgos Korfiatis
                                       options["output_format"],
147 398a9604 Giorgos Korfiatis
                                       title="Owned Projects")
148 398a9604 Giorgos Korfiatis
149 398a9604 Giorgos Korfiatis
                print_data, labels = memberships(user)
150 398a9604 Giorgos Korfiatis
                if print_data:
151 398a9604 Giorgos Korfiatis
                    self.stdout.write("\n")
152 398a9604 Giorgos Korfiatis
                    utils.pprint_table(self.stdout, print_data, labels,
153 398a9604 Giorgos Korfiatis
                                       options["output_format"],
154 398a9604 Giorgos Korfiatis
                                       title="Project Memberships")
155 398a9604 Giorgos Korfiatis
156 398a9604 Giorgos Korfiatis
157 398a9604 Giorgos Korfiatis
def memberships(user):
158 398a9604 Giorgos Korfiatis
    ms = user.projectmembership_set.all()
159 398a9604 Giorgos Korfiatis
    print_data = []
160 398a9604 Giorgos Korfiatis
    labels = ('project id', 'project name', 'status')
161 398a9604 Giorgos Korfiatis
162 398a9604 Giorgos Korfiatis
    for m in ms:
163 398a9604 Giorgos Korfiatis
        project = m.project
164 398a9604 Giorgos Korfiatis
        print_data.append((project.id,
165 398a9604 Giorgos Korfiatis
                           project.application.name,
166 398a9604 Giorgos Korfiatis
                           m.state_display(),
167 398a9604 Giorgos Korfiatis
                           ))
168 398a9604 Giorgos Korfiatis
    return print_data, labels
169 398a9604 Giorgos Korfiatis
170 398a9604 Giorgos Korfiatis
171 398a9604 Giorgos Korfiatis
def ownerships(user):
172 6d583e07 Giorgos Korfiatis
    chains = Project.objects.all_with_pending(Q(application__owner=user))
173 6d583e07 Giorgos Korfiatis
    return chain_info(chains)
174 398a9604 Giorgos Korfiatis
175 398a9604 Giorgos Korfiatis
176 6d583e07 Giorgos Korfiatis
def chain_info(chains):
177 398a9604 Giorgos Korfiatis
    labels = ('project id', 'project name', 'status', 'pending app id')
178 398a9604 Giorgos Korfiatis
    l = []
179 6d583e07 Giorgos Korfiatis
    for project, pending_app in chains:
180 6d583e07 Giorgos Korfiatis
        status = project.state_display()
181 6d583e07 Giorgos Korfiatis
        pending_appid = pending_app.id if pending_app is not None else ""
182 6d583e07 Giorgos Korfiatis
        application = project.application
183 398a9604 Giorgos Korfiatis
184 6d583e07 Giorgos Korfiatis
        t = (project.pk,
185 6d583e07 Giorgos Korfiatis
             application.name,
186 398a9604 Giorgos Korfiatis
             status,
187 6d583e07 Giorgos Korfiatis
             pending_appid,
188 398a9604 Giorgos Korfiatis
             )
189 398a9604 Giorgos Korfiatis
        l.append(t)
190 398a9604 Giorgos Korfiatis
    return l, labels