Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / user-list.py @ 7856a37a

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