Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6.3 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 67cf14bf Giorgos Korfiatis
from synnefo.webproject.management.commands import SynnefoCommand, CommandError
37 ccab6eb5 Sofia Papagiannaki
38 67cf14bf Giorgos Korfiatis
from astakos.im.models import Chain
39 67cf14bf Giorgos Korfiatis
from synnefo.webproject.management import utils
40 67cf14bf Giorgos Korfiatis
from ._common import is_uuid, is_email
41 7eabbd72 Giorgos Korfiatis
42 ccab6eb5 Sofia Papagiannaki
43 67cf14bf Giorgos Korfiatis
class Command(SynnefoCommand):
44 5ed5f9e6 Giorgos Korfiatis
    help = """
45 5ed5f9e6 Giorgos Korfiatis
    List projects and project status.
46 5ed5f9e6 Giorgos Korfiatis

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

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

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

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

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

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

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

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

69 5ed5f9e6 Giorgos Korfiatis
      Terminated           a terminated project; its name can be claimed
70 5ed5f9e6 Giorgos Korfiatis
                           by a new project
71 5ed5f9e6 Giorgos Korfiatis
"""
72 ccab6eb5 Sofia Papagiannaki
73 67cf14bf Giorgos Korfiatis
    option_list = SynnefoCommand.option_list + (
74 f557d10a Giorgos Korfiatis
        make_option('--all',
75 ccab6eb5 Sofia Papagiannaki
                    action='store_true',
76 f557d10a Giorgos Korfiatis
                    dest='all',
77 ccab6eb5 Sofia Papagiannaki
                    default=False,
78 f557d10a Giorgos Korfiatis
                    help="List all projects (default)"),
79 f557d10a Giorgos Korfiatis
        make_option('--new',
80 f557d10a Giorgos Korfiatis
                    action='store_true',
81 f557d10a Giorgos Korfiatis
                    dest='new',
82 f557d10a Giorgos Korfiatis
                    default=False,
83 84a1d7dd Georgios D. Tsoukalas
                    help="List only new project applications"),
84 f557d10a Giorgos Korfiatis
        make_option('--modified',
85 f557d10a Giorgos Korfiatis
                    action='store_true',
86 f557d10a Giorgos Korfiatis
                    dest='modified',
87 f557d10a Giorgos Korfiatis
                    default=False,
88 f557d10a Giorgos Korfiatis
                    help="List only projects with pending modification"),
89 f557d10a Giorgos Korfiatis
        make_option('--pending',
90 f557d10a Giorgos Korfiatis
                    action='store_true',
91 f557d10a Giorgos Korfiatis
                    dest='pending',
92 f557d10a Giorgos Korfiatis
                    default=False,
93 f557d10a Giorgos Korfiatis
                    help=("Show only projects with a pending application "
94 f557d10a Giorgos Korfiatis
                          "(equiv. --modified --new)")),
95 47fbfc1c Giorgos Korfiatis
        make_option('--skip',
96 47fbfc1c Giorgos Korfiatis
                    action='store_true',
97 47fbfc1c Giorgos Korfiatis
                    dest='skip',
98 47fbfc1c Giorgos Korfiatis
                    default=False,
99 47fbfc1c Giorgos Korfiatis
                    help="Skip cancelled and terminated projects"),
100 67cf14bf Giorgos Korfiatis
        make_option('--name',
101 67cf14bf Giorgos Korfiatis
                    dest='name',
102 67cf14bf Giorgos Korfiatis
                    help='Filter projects by name'),
103 67cf14bf Giorgos Korfiatis
        make_option('--owner',
104 67cf14bf Giorgos Korfiatis
                    dest='owner',
105 67cf14bf Giorgos Korfiatis
                    help='Filter projects by owner\'s email or uuid'),
106 865849d7 Giorgos Korfiatis
    )
107 ccab6eb5 Sofia Papagiannaki
108 67cf14bf Giorgos Korfiatis
    def handle(self, *args, **options):
109 67cf14bf Giorgos Korfiatis
110 67cf14bf Giorgos Korfiatis
        chain_dict = Chain.objects.all_full_state()
111 67cf14bf Giorgos Korfiatis
112 67cf14bf Giorgos Korfiatis
        if not options['all']:
113 67cf14bf Giorgos Korfiatis
            f_states = []
114 67cf14bf Giorgos Korfiatis
            if options['new']:
115 67cf14bf Giorgos Korfiatis
                f_states.append(Chain.PENDING)
116 67cf14bf Giorgos Korfiatis
            if options['modified']:
117 67cf14bf Giorgos Korfiatis
                f_states += Chain.MODIFICATION_STATES
118 67cf14bf Giorgos Korfiatis
            if options['pending']:
119 67cf14bf Giorgos Korfiatis
                f_states.append(Chain.PENDING)
120 67cf14bf Giorgos Korfiatis
                f_states += Chain.MODIFICATION_STATES
121 67cf14bf Giorgos Korfiatis
            if options['skip']:
122 67cf14bf Giorgos Korfiatis
                if not f_states:
123 f557d10a Giorgos Korfiatis
                    f_states = Chain.RELEVANT_STATES
124 f557d10a Giorgos Korfiatis
125 67cf14bf Giorgos Korfiatis
            if f_states:
126 67cf14bf Giorgos Korfiatis
                chain_dict = filter_by(in_states(f_states), chain_dict)
127 67cf14bf Giorgos Korfiatis
128 67cf14bf Giorgos Korfiatis
            name = options['name']
129 67cf14bf Giorgos Korfiatis
            if name:
130 67cf14bf Giorgos Korfiatis
                chain_dict = filter_by(is_name(name), chain_dict)
131 67cf14bf Giorgos Korfiatis
132 67cf14bf Giorgos Korfiatis
            owner = options['owner']
133 67cf14bf Giorgos Korfiatis
            if owner:
134 67cf14bf Giorgos Korfiatis
                chain_dict = filter_by(is_owner(owner), chain_dict)
135 67cf14bf Giorgos Korfiatis
136 67cf14bf Giorgos Korfiatis
        labels = ('ProjID', 'Name', 'Owner', 'Email', 'Status', 'AppID')
137 67cf14bf Giorgos Korfiatis
138 67cf14bf Giorgos Korfiatis
        info = chain_info(chain_dict)
139 67cf14bf Giorgos Korfiatis
        utils.pprint_table(self.stdout, info, labels,
140 67cf14bf Giorgos Korfiatis
                           options["output_format"])
141 67cf14bf Giorgos Korfiatis
142 67cf14bf Giorgos Korfiatis
143 67cf14bf Giorgos Korfiatis
def is_name(name):
144 67cf14bf Giorgos Korfiatis
    def f(state, project, app):
145 67cf14bf Giorgos Korfiatis
        n = project.application.name if project else app.name
146 67cf14bf Giorgos Korfiatis
        return name == n
147 67cf14bf Giorgos Korfiatis
    return f
148 67cf14bf Giorgos Korfiatis
149 67cf14bf Giorgos Korfiatis
150 67cf14bf Giorgos Korfiatis
def in_states(states):
151 67cf14bf Giorgos Korfiatis
    def f(state, project, app):
152 67cf14bf Giorgos Korfiatis
        return state in states
153 67cf14bf Giorgos Korfiatis
    return f
154 67cf14bf Giorgos Korfiatis
155 67cf14bf Giorgos Korfiatis
156 67cf14bf Giorgos Korfiatis
def is_owner(s):
157 67cf14bf Giorgos Korfiatis
    def f(state, project, app):
158 67cf14bf Giorgos Korfiatis
        owner = app.owner
159 67cf14bf Giorgos Korfiatis
        if is_email(s):
160 67cf14bf Giorgos Korfiatis
            return owner.email == s
161 67cf14bf Giorgos Korfiatis
        if is_uuid(s):
162 67cf14bf Giorgos Korfiatis
            return owner.uuid == s
163 67cf14bf Giorgos Korfiatis
        raise CommandError("Expecting either email or uuid.")
164 67cf14bf Giorgos Korfiatis
    return f
165 67cf14bf Giorgos Korfiatis
166 67cf14bf Giorgos Korfiatis
167 67cf14bf Giorgos Korfiatis
def filter_by(f, chain_dict):
168 67cf14bf Giorgos Korfiatis
    d = {}
169 67cf14bf Giorgos Korfiatis
    for chain, tpl in chain_dict.iteritems():
170 67cf14bf Giorgos Korfiatis
        if f(*tpl):
171 67cf14bf Giorgos Korfiatis
            d[chain] = tpl
172 67cf14bf Giorgos Korfiatis
    return d
173 67cf14bf Giorgos Korfiatis
174 67cf14bf Giorgos Korfiatis
175 67cf14bf Giorgos Korfiatis
def chain_info(chain_dict):
176 67cf14bf Giorgos Korfiatis
    l = []
177 67cf14bf Giorgos Korfiatis
    for chain, (state, project, app) in chain_dict.iteritems():
178 67cf14bf Giorgos Korfiatis
        status = Chain.state_display(state)
179 67cf14bf Giorgos Korfiatis
        if state in Chain.PENDING_STATES:
180 67cf14bf Giorgos Korfiatis
            appid = str(app.id)
181 67cf14bf Giorgos Korfiatis
        else:
182 67cf14bf Giorgos Korfiatis
            appid = ""
183 67cf14bf Giorgos Korfiatis
184 67cf14bf Giorgos Korfiatis
        t = (chain,
185 67cf14bf Giorgos Korfiatis
             project.application.name if project else app.name,
186 67cf14bf Giorgos Korfiatis
             app.owner.realname,
187 67cf14bf Giorgos Korfiatis
             app.owner.email,
188 67cf14bf Giorgos Korfiatis
             status,
189 67cf14bf Giorgos Korfiatis
             appid,
190 67cf14bf Giorgos Korfiatis
             )
191 67cf14bf Giorgos Korfiatis
        l.append(t)
192 67cf14bf Giorgos Korfiatis
    return l