Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / user-show.py @ 398a9604

History | View | Annotate | Download (7.3 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 398a9604 Giorgos Korfiatis
from astakos.im.models import AstakosUser, get_latest_terms, Chain
38 91eca048 Giorgos Korfiatis
from astakos.im.quotas import list_user_quotas
39 21fabaad Sofia Papagiannaki
40 a3c6203c Giorgos Korfiatis
from synnefo.lib.ordereddict import OrderedDict
41 a0699ee4 Sofia Papagiannaki
from synnefo.webproject.management.commands import SynnefoCommand
42 a0699ee4 Sofia Papagiannaki
from synnefo.webproject.management import utils
43 df48dd1b Giorgos Verigakis
44 91eca048 Giorgos Korfiatis
from ._common import format, show_quotas
45 df48dd1b Giorgos Verigakis
46 094c0768 Sofia Papagiannaki
import uuid
47 df48dd1b Giorgos Verigakis
48 865849d7 Giorgos Korfiatis
49 a0699ee4 Sofia Papagiannaki
class Command(SynnefoCommand):
50 a0699ee4 Sofia Papagiannaki
    args = "<user ID or email or uuid>"
51 df48dd1b Giorgos Verigakis
    help = "Show user info"
52 5ce3ce4f Sofia Papagiannaki
53 91eca048 Giorgos Korfiatis
    option_list = SynnefoCommand.option_list + (
54 075b91de Giorgos Korfiatis
        make_option('--quota',
55 91eca048 Giorgos Korfiatis
                    action='store_true',
56 91eca048 Giorgos Korfiatis
                    dest='list_quotas',
57 91eca048 Giorgos Korfiatis
                    default=False,
58 075b91de Giorgos Korfiatis
                    help="Also list user quota"),
59 398a9604 Giorgos Korfiatis
        make_option('--projects',
60 398a9604 Giorgos Korfiatis
                    action='store_true',
61 398a9604 Giorgos Korfiatis
                    dest='list_projects',
62 398a9604 Giorgos Korfiatis
                    default=False,
63 398a9604 Giorgos Korfiatis
                    help="Also list project memberships"),
64 91eca048 Giorgos Korfiatis
    )
65 91eca048 Giorgos Korfiatis
66 df48dd1b Giorgos Verigakis
    def handle(self, *args, **options):
67 df48dd1b Giorgos Verigakis
        if len(args) != 1:
68 ebd369d0 Sofia Papagiannaki
            raise CommandError("Please provide a user ID or email")
69 5ce3ce4f Sofia Papagiannaki
70 094c0768 Sofia Papagiannaki
        identifier = args[0]
71 094c0768 Sofia Papagiannaki
        if identifier.isdigit():
72 094c0768 Sofia Papagiannaki
            users = AstakosUser.objects.filter(id=int(identifier))
73 0a569195 Sofia Papagiannaki
        else:
74 094c0768 Sofia Papagiannaki
            try:
75 094c0768 Sofia Papagiannaki
                uuid.UUID(identifier)
76 094c0768 Sofia Papagiannaki
            except:
77 094c0768 Sofia Papagiannaki
                users = AstakosUser.objects.filter(email__iexact=identifier)
78 094c0768 Sofia Papagiannaki
            else:
79 094c0768 Sofia Papagiannaki
                users = AstakosUser.objects.filter(uuid=identifier)
80 0a569195 Sofia Papagiannaki
        if users.count() == 0:
81 094c0768 Sofia Papagiannaki
            field = 'id' if identifier.isdigit() else 'email'
82 094c0768 Sofia Papagiannaki
            msg = "Unknown user with %s '%s'" % (field, identifier)
83 df48dd1b Giorgos Verigakis
            raise CommandError(msg)
84 5ce3ce4f Sofia Papagiannaki
85 0a569195 Sofia Papagiannaki
        for user in users:
86 a3c6203c Giorgos Korfiatis
            kv = OrderedDict(
87 a3c6203c Giorgos Korfiatis
                [
88 a3c6203c Giorgos Korfiatis
                    ('id', user.id),
89 a3c6203c Giorgos Korfiatis
                    ('uuid', user.uuid),
90 25769d1b Kostas Papadimitriou
                    ('status', user.status_display),
91 a3c6203c Giorgos Korfiatis
                    ('email', user.email),
92 a3c6203c Giorgos Korfiatis
                    ('first name', user.first_name),
93 a3c6203c Giorgos Korfiatis
                    ('last name', user.last_name),
94 a3c6203c Giorgos Korfiatis
                    ('active', user.is_active),
95 a3c6203c Giorgos Korfiatis
                    ('admin', user.is_superuser),
96 a3c6203c Giorgos Korfiatis
                    ('last login', user.last_login),
97 a3c6203c Giorgos Korfiatis
                    ('date joined', user.date_joined),
98 a3c6203c Giorgos Korfiatis
                    ('last update', user.updated),
99 a3c6203c Giorgos Korfiatis
                    #('token', user.auth_token),
100 a3c6203c Giorgos Korfiatis
                    ('token expiration', user.auth_token_expires),
101 a3c6203c Giorgos Korfiatis
                    ('invitations', user.invitations),
102 a3c6203c Giorgos Korfiatis
                    ('invitation level', user.level),
103 a3c6203c Giorgos Korfiatis
                    ('providers', user.auth_providers_display),
104 a3c6203c Giorgos Korfiatis
                    ('verified', user.is_verified),
105 21fabaad Sofia Papagiannaki
                    ('has credits', format(user.has_credits)),
106 a3c6203c Giorgos Korfiatis
                    ('groups', [elem.name for elem in user.groups.all()]),
107 a3c6203c Giorgos Korfiatis
                    ('permissions', [elem.codename
108 a3c6203c Giorgos Korfiatis
                                     for elem in user.user_permissions.all()]),
109 21fabaad Sofia Papagiannaki
                    ('group permissions', user.get_group_permissions()),
110 21fabaad Sofia Papagiannaki
                    ('email verified', user.email_verified),
111 a3c6203c Giorgos Korfiatis
                    ('username', user.username),
112 a3c6203c Giorgos Korfiatis
                    ('activation_sent_date', user.activation_sent),
113 a3c6203c Giorgos Korfiatis
                ])
114 a3c6203c Giorgos Korfiatis
115 3362d142 Sofia Papagiannaki
            if get_latest_terms():
116 fcf90160 Sofia Papagiannaki
                has_signed_terms = user.signed_terms
117 437c0052 Sofia Papagiannaki
                kv['has_signed_terms'] = has_signed_terms
118 3362d142 Sofia Papagiannaki
                if has_signed_terms:
119 437c0052 Sofia Papagiannaki
                    kv['date_signed_terms'] = user.date_signed_terms
120 5ce3ce4f Sofia Papagiannaki
121 a0699ee4 Sofia Papagiannaki
            utils.pprint_table(self.stdout, [kv.values()], kv.keys(),
122 a0699ee4 Sofia Papagiannaki
                               options["output_format"], vertical=True)
123 91eca048 Giorgos Korfiatis
124 91eca048 Giorgos Korfiatis
            if options["list_quotas"]:
125 91eca048 Giorgos Korfiatis
                self.stdout.write("\n")
126 de292e89 Giorgos Korfiatis
                quotas, initial = list_user_quotas([user])
127 91eca048 Giorgos Korfiatis
                print_data, labels = show_quotas(quotas, initial)
128 91eca048 Giorgos Korfiatis
                utils.pprint_table(self.stdout, print_data, labels,
129 91eca048 Giorgos Korfiatis
                                   options["output_format"])
130 398a9604 Giorgos Korfiatis
131 398a9604 Giorgos Korfiatis
            if options["list_projects"]:
132 398a9604 Giorgos Korfiatis
                print_data, labels = ownerships(user)
133 398a9604 Giorgos Korfiatis
                if print_data:
134 398a9604 Giorgos Korfiatis
                    self.stdout.write("\n")
135 398a9604 Giorgos Korfiatis
                    utils.pprint_table(self.stdout, print_data, labels,
136 398a9604 Giorgos Korfiatis
                                       options["output_format"],
137 398a9604 Giorgos Korfiatis
                                       title="Owned Projects")
138 398a9604 Giorgos Korfiatis
139 398a9604 Giorgos Korfiatis
                print_data, labels = memberships(user)
140 398a9604 Giorgos Korfiatis
                if print_data:
141 398a9604 Giorgos Korfiatis
                    self.stdout.write("\n")
142 398a9604 Giorgos Korfiatis
                    utils.pprint_table(self.stdout, print_data, labels,
143 398a9604 Giorgos Korfiatis
                                       options["output_format"],
144 398a9604 Giorgos Korfiatis
                                       title="Project Memberships")
145 398a9604 Giorgos Korfiatis
146 398a9604 Giorgos Korfiatis
147 398a9604 Giorgos Korfiatis
def memberships(user):
148 398a9604 Giorgos Korfiatis
    ms = user.projectmembership_set.all()
149 398a9604 Giorgos Korfiatis
    print_data = []
150 398a9604 Giorgos Korfiatis
    labels = ('project id', 'project name', 'status')
151 398a9604 Giorgos Korfiatis
152 398a9604 Giorgos Korfiatis
    for m in ms:
153 398a9604 Giorgos Korfiatis
        project = m.project
154 398a9604 Giorgos Korfiatis
        print_data.append((project.id,
155 398a9604 Giorgos Korfiatis
                           project.application.name,
156 398a9604 Giorgos Korfiatis
                           m.state_display(),
157 398a9604 Giorgos Korfiatis
                           ))
158 398a9604 Giorgos Korfiatis
    return print_data, labels
159 398a9604 Giorgos Korfiatis
160 398a9604 Giorgos Korfiatis
161 398a9604 Giorgos Korfiatis
def ownerships(user):
162 398a9604 Giorgos Korfiatis
    chain_dict = Chain.objects.all_full_state()
163 398a9604 Giorgos Korfiatis
    chain_dict = filter_by(is_owner(user), chain_dict)
164 398a9604 Giorgos Korfiatis
    return chain_info(chain_dict)
165 398a9604 Giorgos Korfiatis
166 398a9604 Giorgos Korfiatis
167 398a9604 Giorgos Korfiatis
def is_owner(user):
168 398a9604 Giorgos Korfiatis
    def f(state, project, app):
169 398a9604 Giorgos Korfiatis
        return user == app.owner
170 398a9604 Giorgos Korfiatis
    return f
171 398a9604 Giorgos Korfiatis
172 398a9604 Giorgos Korfiatis
173 398a9604 Giorgos Korfiatis
def filter_by(f, chain_dict):
174 398a9604 Giorgos Korfiatis
    d = {}
175 398a9604 Giorgos Korfiatis
    for chain, tpl in chain_dict.iteritems():
176 398a9604 Giorgos Korfiatis
        if f(*tpl):
177 398a9604 Giorgos Korfiatis
            d[chain] = tpl
178 398a9604 Giorgos Korfiatis
    return d
179 398a9604 Giorgos Korfiatis
180 398a9604 Giorgos Korfiatis
181 398a9604 Giorgos Korfiatis
def chain_info(chain_dict):
182 398a9604 Giorgos Korfiatis
    labels = ('project id', 'project name', 'status', 'pending app id')
183 398a9604 Giorgos Korfiatis
    l = []
184 398a9604 Giorgos Korfiatis
    for chain, (state, project, app) in chain_dict.iteritems():
185 398a9604 Giorgos Korfiatis
        status = Chain.state_display(state)
186 398a9604 Giorgos Korfiatis
        if state in Chain.PENDING_STATES:
187 398a9604 Giorgos Korfiatis
            appid = str(app.id)
188 398a9604 Giorgos Korfiatis
        else:
189 398a9604 Giorgos Korfiatis
            appid = ""
190 398a9604 Giorgos Korfiatis
191 398a9604 Giorgos Korfiatis
        t = (chain,
192 398a9604 Giorgos Korfiatis
             project.application.name if project else app.name,
193 398a9604 Giorgos Korfiatis
             status,
194 398a9604 Giorgos Korfiatis
             appid,
195 398a9604 Giorgos Korfiatis
             )
196 398a9604 Giorgos Korfiatis
        l.append(t)
197 398a9604 Giorgos Korfiatis
    return l, labels