Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / user-list.py @ 9d20fe23

History | View | Annotate | Download (6.3 kB)

1 2a6fc999 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 df48dd1b Giorgos Verigakis
from optparse import make_option
35 df48dd1b Giorgos Verigakis
36 c0b26605 Sofia Papagiannaki
from django.core.management.base import NoArgsCommand
37 df48dd1b Giorgos Verigakis
38 9d20fe23 Kostas Papadimitriou
from astakos.im.models import AstakosUser, AstakosUserAuthProvider, Group
39 df48dd1b Giorgos Verigakis
40 56b9989a Giorgos Korfiatis
from ._common import format, filter_results
41 397d5cbe Giorgos Verigakis
42 df48dd1b Giorgos Verigakis
43 c0b26605 Sofia Papagiannaki
class Command(NoArgsCommand):
44 df48dd1b Giorgos Verigakis
    help = "List users"
45 5ce3ce4f Sofia Papagiannaki
46 56b9989a Giorgos Korfiatis
    FIELDS = AstakosUser._meta.get_all_field_names()
47 56b9989a Giorgos Korfiatis
48 c0b26605 Sofia Papagiannaki
    option_list = NoArgsCommand.option_list + (
49 df48dd1b Giorgos Verigakis
        make_option('-c',
50 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
51 5ce3ce4f Sofia Papagiannaki
                    dest='csv',
52 5ce3ce4f Sofia Papagiannaki
                    default=False,
53 5ce3ce4f Sofia Papagiannaki
                    help="Use pipes to separate values"),
54 df48dd1b Giorgos Verigakis
        make_option('-p',
55 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
56 5ce3ce4f Sofia Papagiannaki
                    dest='pending',
57 5ce3ce4f Sofia Papagiannaki
                    default=False,
58 5ce3ce4f Sofia Papagiannaki
                    help="List only users pending activation"),
59 9d20fe23 Kostas Papadimitriou
        make_option('--auth-providers',
60 9d20fe23 Kostas Papadimitriou
                    action='store_true',
61 9d20fe23 Kostas Papadimitriou
                    dest='auth_providers',
62 9d20fe23 Kostas Papadimitriou
                    default=False,
63 9d20fe23 Kostas Papadimitriou
                    help="Display user authentication providers"),
64 9d20fe23 Kostas Papadimitriou
        make_option('--group',
65 9d20fe23 Kostas Papadimitriou
                    action='append',
66 9d20fe23 Kostas Papadimitriou
                    dest='groups',
67 9d20fe23 Kostas Papadimitriou
                    default=None,
68 9d20fe23 Kostas Papadimitriou
                    help="Only show users that belong to the specified goups"),
69 751d24cf Sofia Papagiannaki
        make_option('-n',
70 5ce3ce4f Sofia Papagiannaki
                    action='store_true',
71 5ce3ce4f Sofia Papagiannaki
                    dest='pending_send_mail',
72 5ce3ce4f Sofia Papagiannaki
                    default=False,
73 5ce3ce4f Sofia Papagiannaki
                    help="List only users who have not received activation"),
74 56b9989a Giorgos Korfiatis
        make_option('--uuid',
75 56b9989a Giorgos Korfiatis
                    action='store_true',
76 56b9989a Giorgos Korfiatis
                    dest='only_uuid',
77 56b9989a Giorgos Korfiatis
                    default=False,
78 56b9989a Giorgos Korfiatis
                    help="Only display user uuid (default)"),
79 56b9989a Giorgos Korfiatis
        make_option('--displayname',
80 56b9989a Giorgos Korfiatis
                    action='store_true',
81 56b9989a Giorgos Korfiatis
                    dest='displayname',
82 56b9989a Giorgos Korfiatis
                    default=False,
83 56b9989a Giorgos Korfiatis
                    help="Display both uuid and display name"),
84 56b9989a Giorgos Korfiatis
        make_option('--active',
85 56b9989a Giorgos Korfiatis
                    action='store_true',
86 56b9989a Giorgos Korfiatis
                    dest='active',
87 56b9989a Giorgos Korfiatis
                    default=False,
88 56b9989a Giorgos Korfiatis
                    help="Display only active users"),
89 56b9989a Giorgos Korfiatis
        make_option('--filter-by',
90 56b9989a Giorgos Korfiatis
                    dest='filter_by',
91 56b9989a Giorgos Korfiatis
                    help="Filter results. Comma seperated list of key `cond`"
92 56b9989a Giorgos Korfiatis
                    " val pairs that displayed entries must satisfy. e.g."
93 56b9989a Giorgos Korfiatis
                    " --filter-by \"is_active=True,email_verified=True\"."
94 56b9989a Giorgos Korfiatis
                    " Available keys are: %s" % ", ".join(FIELDS)),
95 56b9989a Giorgos Korfiatis
96 5ce3ce4f Sofia Papagiannaki
    )
97 5ce3ce4f Sofia Papagiannaki
98 c0b26605 Sofia Papagiannaki
    def handle_noargs(self, **options):
99 8d15756a Sofia Papagiannaki
        users = AstakosUser.objects.all().order_by('id')
100 df48dd1b Giorgos Verigakis
        if options['pending']:
101 df48dd1b Giorgos Verigakis
            users = users.filter(is_active=False)
102 751d24cf Sofia Papagiannaki
        elif options['pending_send_mail']:
103 751d24cf Sofia Papagiannaki
            users = users.filter(is_active=False, activation_sent=None)
104 5ce3ce4f Sofia Papagiannaki
105 56b9989a Giorgos Korfiatis
        active_only = options['active']
106 56b9989a Giorgos Korfiatis
        if active_only:
107 56b9989a Giorgos Korfiatis
            users = filter_results(users, "is_active=True")
108 56b9989a Giorgos Korfiatis
109 56b9989a Giorgos Korfiatis
        filter_by = options['filter_by']
110 56b9989a Giorgos Korfiatis
        if filter_by:
111 56b9989a Giorgos Korfiatis
            users = filter_results(users, filter_by)
112 56b9989a Giorgos Korfiatis
113 56b9989a Giorgos Korfiatis
        displayname = options['displayname']
114 56b9989a Giorgos Korfiatis
115 2a6fc999 Giorgos Korfiatis
        ids = [user.id for user in users]
116 2a6fc999 Giorgos Korfiatis
        auths = AstakosUserAuthProvider.objects.filter(
117 2a6fc999 Giorgos Korfiatis
            user__in=ids, active=True)
118 2a6fc999 Giorgos Korfiatis
119 2a6fc999 Giorgos Korfiatis
        all_auth = partition_by(lambda a: a.user_id, auths)
120 2a6fc999 Giorgos Korfiatis
121 56b9989a Giorgos Korfiatis
        labels = filter(lambda x: x is not Omit,
122 56b9989a Giorgos Korfiatis
                        [('id', 3),
123 56b9989a Giorgos Korfiatis
                         ('display name', 24) if displayname else Omit,
124 56b9989a Giorgos Korfiatis
                         ('real name', 24),
125 56b9989a Giorgos Korfiatis
                         ('active', 6),
126 56b9989a Giorgos Korfiatis
                         ('admin', 5),
127 56b9989a Giorgos Korfiatis
                         ('uuid', 36),
128 56b9989a Giorgos Korfiatis
                         ('providers', 24),
129 56b9989a Giorgos Korfiatis
                         ])
130 56b9989a Giorgos Korfiatis
131 56b9989a Giorgos Korfiatis
        columns = [c for (l, c) in labels]
132 5ce3ce4f Sofia Papagiannaki
133 df48dd1b Giorgos Verigakis
        if not options['csv']:
134 56b9989a Giorgos Korfiatis
            line = ' '.join(l.rjust(w) for l, w in labels)
135 df48dd1b Giorgos Verigakis
            self.stdout.write(line + '\n')
136 df48dd1b Giorgos Verigakis
            sep = '-' * len(line)
137 df48dd1b Giorgos Verigakis
            self.stdout.write(sep + '\n')
138 5ce3ce4f Sofia Papagiannaki
139 df48dd1b Giorgos Verigakis
        for user in users:
140 df48dd1b Giorgos Verigakis
            id = str(user.id)
141 cb261eef Sofia Papagiannaki
            active = user.is_active
142 cb261eef Sofia Papagiannaki
            admin = user.is_superuser
143 094c0768 Sofia Papagiannaki
            uuid = user.uuid or ''
144 2a6fc999 Giorgos Korfiatis
            auths = all_auth[user.id]
145 2a6fc999 Giorgos Korfiatis
            auth_display = ",".join(unicode(auth) for auth in auths)
146 56b9989a Giorgos Korfiatis
147 56b9989a Giorgos Korfiatis
            elems = filter(lambda x: x is not Omit,
148 56b9989a Giorgos Korfiatis
                           [id,
149 56b9989a Giorgos Korfiatis
                            user.username if displayname else Omit,
150 cb261eef Sofia Papagiannaki
                            user.realname,
151 cb261eef Sofia Papagiannaki
                            active, admin, uuid,
152 7856a37a Stratos Psomadakis
                            auth_display,
153 56b9989a Giorgos Korfiatis
                            ])
154 56b9989a Giorgos Korfiatis
            fields = (format(elem) for elem in elems)
155 5ce3ce4f Sofia Papagiannaki
156 df48dd1b Giorgos Verigakis
            if options['csv']:
157 df48dd1b Giorgos Verigakis
                line = '|'.join(fields)
158 df48dd1b Giorgos Verigakis
            else:
159 df48dd1b Giorgos Verigakis
                line = ' '.join(f.rjust(w) for f, w in zip(fields, columns))
160 5ce3ce4f Sofia Papagiannaki
161 06d7c286 Sofia Papagiannaki
            self.stdout.write(line + '\n')
162 2a6fc999 Giorgos Korfiatis
163 2a6fc999 Giorgos Korfiatis
164 56b9989a Giorgos Korfiatis
class Omit(object):
165 56b9989a Giorgos Korfiatis
    pass
166 56b9989a Giorgos Korfiatis
167 56b9989a Giorgos Korfiatis
168 2a6fc999 Giorgos Korfiatis
def partition_by(f, l):
169 2a6fc999 Giorgos Korfiatis
    d = {}
170 2a6fc999 Giorgos Korfiatis
    for x in l:
171 2a6fc999 Giorgos Korfiatis
        group = f(x)
172 2a6fc999 Giorgos Korfiatis
        group_l = d.get(group, [])
173 2a6fc999 Giorgos Korfiatis
        group_l.append(x)
174 2a6fc999 Giorgos Korfiatis
        d[group] = group_l
175 2a6fc999 Giorgos Korfiatis
    return d