Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / project-list.py @ cb14cc6c

History | View | Annotate | Download (6.9 kB)

1 47fbfc1c Giorgos Korfiatis
# Copyright 2012-2013 GRNET S.A. All rights reserved.
2 2a965273 Sofia Papagiannaki
#
3 2a965273 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
4 2a965273 Sofia Papagiannaki
# without modification, are permitted provided that the following
5 2a965273 Sofia Papagiannaki
# conditions are met:
6 2a965273 Sofia Papagiannaki
#
7 2a965273 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
8 2a965273 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
9 2a965273 Sofia Papagiannaki
#      disclaimer.
10 2a965273 Sofia Papagiannaki
#
11 2a965273 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
12 2a965273 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
13 2a965273 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
14 2a965273 Sofia Papagiannaki
#      provided with the distribution.
15 2a965273 Sofia Papagiannaki
#
16 2a965273 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 2a965273 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 2a965273 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 2a965273 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 2a965273 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 2a965273 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 2a965273 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 2a965273 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 2a965273 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 2a965273 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 2a965273 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 2a965273 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
28 2a965273 Sofia Papagiannaki
#
29 2a965273 Sofia Papagiannaki
# The views and conclusions contained in the software and
30 2a965273 Sofia Papagiannaki
# documentation are those of the authors and should not be
31 2a965273 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
32 2a965273 Sofia Papagiannaki
# or implied, of GRNET S.A.
33 2a965273 Sofia Papagiannaki
34 2a965273 Sofia Papagiannaki
from optparse import make_option
35 2a965273 Sofia Papagiannaki
36 ccab6eb5 Sofia Papagiannaki
from django.core.management.base import NoArgsCommand
37 ccab6eb5 Sofia Papagiannaki
38 47fbfc1c Giorgos Korfiatis
from astakos.im.models import Chain
39 cb261eef Sofia Papagiannaki
from ._common import format, shortened
40 7eabbd72 Giorgos Korfiatis
41 ccab6eb5 Sofia Papagiannaki
42 ccab6eb5 Sofia Papagiannaki
class Command(NoArgsCommand):
43 5ed5f9e6 Giorgos Korfiatis
    help = """
44 5ed5f9e6 Giorgos Korfiatis
    List projects and project status.
45 5ed5f9e6 Giorgos Korfiatis

46 5ed5f9e6 Giorgos Korfiatis
    Project status can be one of:
47 5ed5f9e6 Giorgos Korfiatis
      Pending              an application <AppId> for a new project
48 5ed5f9e6 Giorgos Korfiatis

49 5ed5f9e6 Giorgos Korfiatis
      Active               an active project
50 5ed5f9e6 Giorgos Korfiatis

51 5ed5f9e6 Giorgos Korfiatis
      Active - Pending     an active project with
52 5ed5f9e6 Giorgos Korfiatis
                           a pending modification <AppId>
53 5ed5f9e6 Giorgos Korfiatis

54 5ed5f9e6 Giorgos Korfiatis
      Denied               an application for a new project,
55 5ed5f9e6 Giorgos Korfiatis
                           denied by the admin
56 5ed5f9e6 Giorgos Korfiatis

57 5ed5f9e6 Giorgos Korfiatis
      Dismissed            a denied project, dismissed by the applicant
58 5ed5f9e6 Giorgos Korfiatis

59 5ed5f9e6 Giorgos Korfiatis
      Cancelled            an application for a new project,
60 5ed5f9e6 Giorgos Korfiatis
                           cancelled by the applicant
61 5ed5f9e6 Giorgos Korfiatis

62 5ed5f9e6 Giorgos Korfiatis
      Suspended            a project suspended by the admin;
63 5ed5f9e6 Giorgos Korfiatis
                           it can later be resumed
64 5ed5f9e6 Giorgos Korfiatis

65 5ed5f9e6 Giorgos Korfiatis
      Suspended - Pending  a suspended project with
66 5ed5f9e6 Giorgos Korfiatis
                           a pending modification <AppId>
67 5ed5f9e6 Giorgos Korfiatis

68 5ed5f9e6 Giorgos Korfiatis
      Terminated           a terminated project; its name can be claimed
69 5ed5f9e6 Giorgos Korfiatis
                           by a new project
70 5ed5f9e6 Giorgos Korfiatis
"""
71 ccab6eb5 Sofia Papagiannaki
72 ccab6eb5 Sofia Papagiannaki
    option_list = NoArgsCommand.option_list + (
73 f557d10a Giorgos Korfiatis
        make_option('--all',
74 ccab6eb5 Sofia Papagiannaki
                    action='store_true',
75 f557d10a Giorgos Korfiatis
                    dest='all',
76 ccab6eb5 Sofia Papagiannaki
                    default=False,
77 f557d10a Giorgos Korfiatis
                    help="List all projects (default)"),
78 f557d10a Giorgos Korfiatis
        make_option('--new',
79 f557d10a Giorgos Korfiatis
                    action='store_true',
80 f557d10a Giorgos Korfiatis
                    dest='new',
81 f557d10a Giorgos Korfiatis
                    default=False,
82 84a1d7dd Georgios D. Tsoukalas
                    help="List only new project applications"),
83 f557d10a Giorgos Korfiatis
        make_option('--modified',
84 f557d10a Giorgos Korfiatis
                    action='store_true',
85 f557d10a Giorgos Korfiatis
                    dest='modified',
86 f557d10a Giorgos Korfiatis
                    default=False,
87 f557d10a Giorgos Korfiatis
                    help="List only projects with pending modification"),
88 f557d10a Giorgos Korfiatis
        make_option('--pending',
89 f557d10a Giorgos Korfiatis
                    action='store_true',
90 f557d10a Giorgos Korfiatis
                    dest='pending',
91 f557d10a Giorgos Korfiatis
                    default=False,
92 f557d10a Giorgos Korfiatis
                    help=("Show only projects with a pending application "
93 f557d10a Giorgos Korfiatis
                          "(equiv. --modified --new)")),
94 47fbfc1c Giorgos Korfiatis
        make_option('--skip',
95 47fbfc1c Giorgos Korfiatis
                    action='store_true',
96 47fbfc1c Giorgos Korfiatis
                    dest='skip',
97 47fbfc1c Giorgos Korfiatis
                    default=False,
98 47fbfc1c Giorgos Korfiatis
                    help="Skip cancelled and terminated projects"),
99 cd1915aa Giorgos Korfiatis
        make_option('--full',
100 cd1915aa Giorgos Korfiatis
                    action='store_true',
101 cd1915aa Giorgos Korfiatis
                    dest='full',
102 cd1915aa Giorgos Korfiatis
                    default=False,
103 cd1915aa Giorgos Korfiatis
                    help="Do not shorten long names"),
104 f557d10a Giorgos Korfiatis
        make_option('-c',
105 5ed5f9e6 Giorgos Korfiatis
                    action='store_true',
106 f557d10a Giorgos Korfiatis
                    dest='csv',
107 5ed5f9e6 Giorgos Korfiatis
                    default=False,
108 f557d10a Giorgos Korfiatis
                    help="Use pipes to separate values"),
109 865849d7 Giorgos Korfiatis
    )
110 ccab6eb5 Sofia Papagiannaki
111 ccab6eb5 Sofia Papagiannaki
    def handle_noargs(self, **options):
112 f557d10a Giorgos Korfiatis
        allow_shorten = not options['full']
113 f557d10a Giorgos Korfiatis
        csv = options['csv']
114 f557d10a Giorgos Korfiatis
115 f557d10a Giorgos Korfiatis
        chain_dict = Chain.objects.all_full_state()
116 f557d10a Giorgos Korfiatis
117 f557d10a Giorgos Korfiatis
        if not options['all']:
118 f557d10a Giorgos Korfiatis
            f_states = []
119 f557d10a Giorgos Korfiatis
            if options['new']:
120 f557d10a Giorgos Korfiatis
                f_states.append(Chain.PENDING)
121 f557d10a Giorgos Korfiatis
            if options['modified']:
122 f557d10a Giorgos Korfiatis
                f_states += Chain.MODIFICATION_STATES
123 f557d10a Giorgos Korfiatis
            if options['pending']:
124 f557d10a Giorgos Korfiatis
                f_states.append(Chain.PENDING)
125 f557d10a Giorgos Korfiatis
                f_states += Chain.MODIFICATION_STATES
126 f557d10a Giorgos Korfiatis
            if options['skip']:
127 f557d10a Giorgos Korfiatis
                if not f_states:
128 f557d10a Giorgos Korfiatis
                    f_states = Chain.RELEVANT_STATES
129 f557d10a Giorgos Korfiatis
130 f557d10a Giorgos Korfiatis
            if f_states:
131 f557d10a Giorgos Korfiatis
                chain_dict = filter_by_state(chain_dict, f_states)
132 f557d10a Giorgos Korfiatis
133 f557d10a Giorgos Korfiatis
        self.show(csv, allow_shorten, chain_dict)
134 f557d10a Giorgos Korfiatis
135 f557d10a Giorgos Korfiatis
    def show(self, csv, allow_shorten, chain_dict):
136 42732c26 Giorgos Korfiatis
        labels = ('ProjID', 'Name', 'Owner', 'Email', 'Status', 'AppID')
137 cd1915aa Giorgos Korfiatis
        columns = (7, 23, 20, 20, 17, 7)
138 ccab6eb5 Sofia Papagiannaki
139 f557d10a Giorgos Korfiatis
        if not csv:
140 ccab6eb5 Sofia Papagiannaki
            line = ' '.join(l.rjust(w) for l, w in zip(labels, columns))
141 ccab6eb5 Sofia Papagiannaki
            self.stdout.write(line + '\n')
142 ccab6eb5 Sofia Papagiannaki
            sep = '-' * len(line)
143 ccab6eb5 Sofia Papagiannaki
            self.stdout.write(sep + '\n')
144 ccab6eb5 Sofia Papagiannaki
145 47fbfc1c Giorgos Korfiatis
        for info in chain_info(chain_dict):
146 2a71814e Giorgos Korfiatis
147 1cf6e716 Giorgos Korfiatis
            fields = [
148 7eabbd72 Giorgos Korfiatis
                (info['projectid'], False),
149 7eabbd72 Giorgos Korfiatis
                (info['name'], True),
150 42732c26 Giorgos Korfiatis
                (info['owner'], True),
151 cd1915aa Giorgos Korfiatis
                (info['email'], True),
152 7eabbd72 Giorgos Korfiatis
                (info['status'], False),
153 7eabbd72 Giorgos Korfiatis
                (info['appid'], False),
154 865849d7 Giorgos Korfiatis
            ]
155 ccab6eb5 Sofia Papagiannaki
156 5aaed703 Giorgos Korfiatis
            fields = [(format(elem), flag) for (elem, flag) in fields]
157 5aaed703 Giorgos Korfiatis
158 f557d10a Giorgos Korfiatis
            if csv:
159 ccab6eb5 Sofia Papagiannaki
                line = '|'.join(fields)
160 ccab6eb5 Sofia Papagiannaki
            else:
161 7eabbd72 Giorgos Korfiatis
                output = []
162 7eabbd72 Giorgos Korfiatis
                for (field, shorten), width in zip(fields, columns):
163 cd1915aa Giorgos Korfiatis
                    s = (shortened(field, width) if shorten and allow_shorten
164 cd1915aa Giorgos Korfiatis
                         else field)
165 7eabbd72 Giorgos Korfiatis
                    s = s.rjust(width)
166 7eabbd72 Giorgos Korfiatis
                    output.append(s)
167 7eabbd72 Giorgos Korfiatis
168 7eabbd72 Giorgos Korfiatis
                line = ' '.join(output)
169 ccab6eb5 Sofia Papagiannaki
170 06d7c286 Sofia Papagiannaki
            self.stdout.write(line + '\n')
171 47fbfc1c Giorgos Korfiatis
172 865849d7 Giorgos Korfiatis
173 f557d10a Giorgos Korfiatis
def filter_by_state(chain_dict, states):
174 47fbfc1c Giorgos Korfiatis
    d = {}
175 47fbfc1c Giorgos Korfiatis
    for chain, (state, project, app) in chain_dict.iteritems():
176 f557d10a Giorgos Korfiatis
        if state in states:
177 47fbfc1c Giorgos Korfiatis
            d[chain] = (state, project, app)
178 47fbfc1c Giorgos Korfiatis
    return d
179 47fbfc1c Giorgos Korfiatis
180 865849d7 Giorgos Korfiatis
181 47fbfc1c Giorgos Korfiatis
def chain_info(chain_dict):
182 47fbfc1c Giorgos Korfiatis
    l = []
183 47fbfc1c Giorgos Korfiatis
    for chain, (state, project, app) in chain_dict.iteritems():
184 47fbfc1c Giorgos Korfiatis
        status = Chain.state_display(state)
185 47fbfc1c Giorgos Korfiatis
        if state in Chain.PENDING_STATES:
186 7eabbd72 Giorgos Korfiatis
            appid = str(app.id)
187 7eabbd72 Giorgos Korfiatis
        else:
188 7eabbd72 Giorgos Korfiatis
            appid = ""
189 47fbfc1c Giorgos Korfiatis
190 47fbfc1c Giorgos Korfiatis
        d = {
191 865849d7 Giorgos Korfiatis
            'projectid': str(chain),
192 865849d7 Giorgos Korfiatis
            'name': project.application.name if project else app.name,
193 42732c26 Giorgos Korfiatis
            'owner': app.owner.realname,
194 42732c26 Giorgos Korfiatis
            'email': app.owner.email,
195 47fbfc1c Giorgos Korfiatis
            'status': status,
196 865849d7 Giorgos Korfiatis
            'appid': appid,
197 865849d7 Giorgos Korfiatis
        }
198 47fbfc1c Giorgos Korfiatis
        l.append(d)
199 47fbfc1c Giorgos Korfiatis
    return l