Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6 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 ffb5cca1 Sofia Papagiannaki
from astakos.im.models import Chain, Project
37 ffb5cca1 Sofia Papagiannaki
from synnefo.webproject.management.commands import ListCommand
38 ccab6eb5 Sofia Papagiannaki
39 7eabbd72 Giorgos Korfiatis
40 ffb5cca1 Sofia Papagiannaki
def get_name(chain):
41 ffb5cca1 Sofia Papagiannaki
    try:
42 ffb5cca1 Sofia Papagiannaki
        p = Project.objects.get(pk=chain.pk)
43 ffb5cca1 Sofia Papagiannaki
    except Project.DoesNotExist:
44 ffb5cca1 Sofia Papagiannaki
        app = chain.last_application()
45 ffb5cca1 Sofia Papagiannaki
        return app.name
46 ffb5cca1 Sofia Papagiannaki
    else:
47 ffb5cca1 Sofia Papagiannaki
        return p.name
48 ccab6eb5 Sofia Papagiannaki
49 ffb5cca1 Sofia Papagiannaki
50 ffb5cca1 Sofia Papagiannaki
def get_owner_name(chain):
51 ffb5cca1 Sofia Papagiannaki
    return chain.last_application().owner.realname
52 ffb5cca1 Sofia Papagiannaki
53 ffb5cca1 Sofia Papagiannaki
54 ffb5cca1 Sofia Papagiannaki
def get_owner_email(chain):
55 ffb5cca1 Sofia Papagiannaki
    return chain.last_application().owner.email
56 ffb5cca1 Sofia Papagiannaki
57 ffb5cca1 Sofia Papagiannaki
58 ffb5cca1 Sofia Papagiannaki
def get_state(chain):
59 ffb5cca1 Sofia Papagiannaki
    try:
60 ffb5cca1 Sofia Papagiannaki
        p = Project.objects.get(pk=chain.pk)
61 ffb5cca1 Sofia Papagiannaki
    except Project.DoesNotExist:
62 ffb5cca1 Sofia Papagiannaki
        p = None
63 ffb5cca1 Sofia Papagiannaki
    app = chain.last_application()
64 ffb5cca1 Sofia Papagiannaki
    return chain.get_state(p, app)[0]
65 ffb5cca1 Sofia Papagiannaki
66 ffb5cca1 Sofia Papagiannaki
67 ffb5cca1 Sofia Papagiannaki
def get_state_display(chain):
68 ffb5cca1 Sofia Papagiannaki
    return Chain.state_display(get_state(chain))
69 ffb5cca1 Sofia Papagiannaki
70 ffb5cca1 Sofia Papagiannaki
71 ffb5cca1 Sofia Papagiannaki
def get_appid(chain):
72 ffb5cca1 Sofia Papagiannaki
    try:
73 ffb5cca1 Sofia Papagiannaki
        p = Project.objects.get(pk=chain.pk)
74 ffb5cca1 Sofia Papagiannaki
    except Project.DoesNotExist:
75 ffb5cca1 Sofia Papagiannaki
        p = None
76 ffb5cca1 Sofia Papagiannaki
    app = chain.last_application()
77 ffb5cca1 Sofia Papagiannaki
    state = chain.get_state(p, app)[0]
78 ffb5cca1 Sofia Papagiannaki
    if state in Chain.PENDING_STATES:
79 ffb5cca1 Sofia Papagiannaki
        return str(app.id)
80 ffb5cca1 Sofia Papagiannaki
    else:
81 ffb5cca1 Sofia Papagiannaki
        return ""
82 ffb5cca1 Sofia Papagiannaki
83 ffb5cca1 Sofia Papagiannaki
84 ffb5cca1 Sofia Papagiannaki
class Command(ListCommand):
85 5ed5f9e6 Giorgos Korfiatis
    help = """
86 5ed5f9e6 Giorgos Korfiatis
    List projects and project status.
87 5ed5f9e6 Giorgos Korfiatis

88 5ed5f9e6 Giorgos Korfiatis
    Project status can be one of:
89 5ed5f9e6 Giorgos Korfiatis
      Pending              an application <AppId> for a new project
90 5ed5f9e6 Giorgos Korfiatis

91 5ed5f9e6 Giorgos Korfiatis
      Active               an active project
92 5ed5f9e6 Giorgos Korfiatis

93 5ed5f9e6 Giorgos Korfiatis
      Active - Pending     an active project with
94 5ed5f9e6 Giorgos Korfiatis
                           a pending modification <AppId>
95 5ed5f9e6 Giorgos Korfiatis

96 5ed5f9e6 Giorgos Korfiatis
      Denied               an application for a new project,
97 5ed5f9e6 Giorgos Korfiatis
                           denied by the admin
98 5ed5f9e6 Giorgos Korfiatis

99 5ed5f9e6 Giorgos Korfiatis
      Dismissed            a denied project, dismissed by the applicant
100 5ed5f9e6 Giorgos Korfiatis

101 5ed5f9e6 Giorgos Korfiatis
      Cancelled            an application for a new project,
102 5ed5f9e6 Giorgos Korfiatis
                           cancelled by the applicant
103 5ed5f9e6 Giorgos Korfiatis

104 5ed5f9e6 Giorgos Korfiatis
      Suspended            a project suspended by the admin;
105 5ed5f9e6 Giorgos Korfiatis
                           it can later be resumed
106 5ed5f9e6 Giorgos Korfiatis

107 5ed5f9e6 Giorgos Korfiatis
      Suspended - Pending  a suspended project with
108 5ed5f9e6 Giorgos Korfiatis
                           a pending modification <AppId>
109 5ed5f9e6 Giorgos Korfiatis

110 5ed5f9e6 Giorgos Korfiatis
      Terminated           a terminated project; its name can be claimed
111 5ed5f9e6 Giorgos Korfiatis
                           by a new project
112 5ed5f9e6 Giorgos Korfiatis
"""
113 ccab6eb5 Sofia Papagiannaki
114 ffb5cca1 Sofia Papagiannaki
    object_class = Chain
115 ffb5cca1 Sofia Papagiannaki
116 ffb5cca1 Sofia Papagiannaki
    FIELDS = {
117 ffb5cca1 Sofia Papagiannaki
        'ProjID': ('pk', 'The id of the project'),
118 ffb5cca1 Sofia Papagiannaki
        'Name': (get_name, 'The name of the project'),
119 ffb5cca1 Sofia Papagiannaki
        'Owner': (get_owner_name, 'The name of the project owner'),
120 ffb5cca1 Sofia Papagiannaki
        'Email': (get_owner_email, 'The email of the project owner'),
121 ffb5cca1 Sofia Papagiannaki
        'Status': (get_state_display, 'The status of the project'),
122 ffb5cca1 Sofia Papagiannaki
        'AppID': (get_appid, 'The project application identification'),
123 ffb5cca1 Sofia Papagiannaki
    }
124 ffb5cca1 Sofia Papagiannaki
125 ffb5cca1 Sofia Papagiannaki
    fields = ['ProjID', 'Name', 'Owner', 'Email', 'Status', 'AppID']
126 ffb5cca1 Sofia Papagiannaki
127 ffb5cca1 Sofia Papagiannaki
    option_list = ListCommand.option_list + (
128 f557d10a Giorgos Korfiatis
        make_option('--all',
129 ccab6eb5 Sofia Papagiannaki
                    action='store_true',
130 f557d10a Giorgos Korfiatis
                    dest='all',
131 ccab6eb5 Sofia Papagiannaki
                    default=False,
132 f557d10a Giorgos Korfiatis
                    help="List all projects (default)"),
133 f557d10a Giorgos Korfiatis
        make_option('--new',
134 f557d10a Giorgos Korfiatis
                    action='store_true',
135 f557d10a Giorgos Korfiatis
                    dest='new',
136 f557d10a Giorgos Korfiatis
                    default=False,
137 84a1d7dd Georgios D. Tsoukalas
                    help="List only new project applications"),
138 f557d10a Giorgos Korfiatis
        make_option('--modified',
139 f557d10a Giorgos Korfiatis
                    action='store_true',
140 f557d10a Giorgos Korfiatis
                    dest='modified',
141 f557d10a Giorgos Korfiatis
                    default=False,
142 f557d10a Giorgos Korfiatis
                    help="List only projects with pending modification"),
143 f557d10a Giorgos Korfiatis
        make_option('--pending',
144 f557d10a Giorgos Korfiatis
                    action='store_true',
145 f557d10a Giorgos Korfiatis
                    dest='pending',
146 f557d10a Giorgos Korfiatis
                    default=False,
147 f557d10a Giorgos Korfiatis
                    help=("Show only projects with a pending application "
148 f557d10a Giorgos Korfiatis
                          "(equiv. --modified --new)")),
149 47fbfc1c Giorgos Korfiatis
        make_option('--skip',
150 47fbfc1c Giorgos Korfiatis
                    action='store_true',
151 47fbfc1c Giorgos Korfiatis
                    dest='skip',
152 47fbfc1c Giorgos Korfiatis
                    default=False,
153 47fbfc1c Giorgos Korfiatis
                    help="Skip cancelled and terminated projects"),
154 cd1915aa Giorgos Korfiatis
        make_option('--full',
155 cd1915aa Giorgos Korfiatis
                    action='store_true',
156 cd1915aa Giorgos Korfiatis
                    dest='full',
157 cd1915aa Giorgos Korfiatis
                    default=False,
158 cd1915aa Giorgos Korfiatis
                    help="Do not shorten long names"),
159 865849d7 Giorgos Korfiatis
    )
160 ccab6eb5 Sofia Papagiannaki
161 ffb5cca1 Sofia Papagiannaki
    def handle_db_objects(self, objects, **options):
162 ffb5cca1 Sofia Papagiannaki
        if options['all']:
163 ffb5cca1 Sofia Papagiannaki
            return
164 ffb5cca1 Sofia Papagiannaki
165 ffb5cca1 Sofia Papagiannaki
        f_states = []
166 ffb5cca1 Sofia Papagiannaki
        if options['new']:
167 ffb5cca1 Sofia Papagiannaki
            f_states.append(Chain.PENDING)
168 ffb5cca1 Sofia Papagiannaki
        if options['modified']:
169 ffb5cca1 Sofia Papagiannaki
            f_states += Chain.MODIFICATION_STATES
170 ffb5cca1 Sofia Papagiannaki
        if options['pending']:
171 ffb5cca1 Sofia Papagiannaki
            f_states.append(Chain.PENDING)
172 ffb5cca1 Sofia Papagiannaki
            f_states += Chain.MODIFICATION_STATES
173 ffb5cca1 Sofia Papagiannaki
        if options['skip']:
174 ffb5cca1 Sofia Papagiannaki
            if not f_states:
175 f557d10a Giorgos Korfiatis
                    f_states = Chain.RELEVANT_STATES
176 f557d10a Giorgos Korfiatis
177 ffb5cca1 Sofia Papagiannaki
        if f_states:
178 ffb5cca1 Sofia Papagiannaki
            map(objects.remove,
179 ffb5cca1 Sofia Papagiannaki
                filter(lambda o: get_state(o) not in f_states, objects))