Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7.4 kB)

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

48 5ed5f9e6 Giorgos Korfiatis
    Command comes in two forms:
49 5ed5f9e6 Giorgos Korfiatis
        project-show <id>    Look up project by id
50 5ed5f9e6 Giorgos Korfiatis

51 5ed5f9e6 Giorgos Korfiatis
        project-show <name>  Look up all projects whose name
52 5ed5f9e6 Giorgos Korfiatis
                             contains the given string
53 5ed5f9e6 Giorgos Korfiatis
"""
54 cb6b8c79 Giorgos Korfiatis
55 cb6b8c79 Giorgos Korfiatis
    option_list = BaseCommand.option_list + (
56 09f54ceb Giorgos Korfiatis
        make_option('--app',
57 09f54ceb Giorgos Korfiatis
                    action='store_true',
58 09f54ceb Giorgos Korfiatis
                    dest='app',
59 09f54ceb Giorgos Korfiatis
                    default=False,
60 5ed5f9e6 Giorgos Korfiatis
                    help="Show details of applications instead of projects"
61 5ed5f9e6 Giorgos Korfiatis
                    ),
62 47fbfc1c Giorgos Korfiatis
        make_option('--pending',
63 cb6b8c79 Giorgos Korfiatis
                    action='store_true',
64 47fbfc1c Giorgos Korfiatis
                    dest='pending',
65 cb6b8c79 Giorgos Korfiatis
                    default=False,
66 5ed5f9e6 Giorgos Korfiatis
                    help=("For a given project, show also pending modifications "
67 5ed5f9e6 Giorgos Korfiatis
                          "(applications), if any")
68 5ed5f9e6 Giorgos Korfiatis
                    ),
69 5ed5f9e6 Giorgos Korfiatis
        )
70 c2837d72 Sofia Papagiannaki
71 c2837d72 Sofia Papagiannaki
    def handle(self, *args, **options):
72 c2837d72 Sofia Papagiannaki
        if len(args) != 1:
73 47fbfc1c Giorgos Korfiatis
            raise CommandError("Please provide project ID or name")
74 47fbfc1c Giorgos Korfiatis
75 47fbfc1c Giorgos Korfiatis
        show_pending = bool(options['pending'])
76 09f54ceb Giorgos Korfiatis
        search_apps  = options['app']
77 c2837d72 Sofia Papagiannaki
78 c2837d72 Sofia Papagiannaki
        name_or_id = args[0]
79 cb6b8c79 Giorgos Korfiatis
        is_id = name_or_id.isdigit()
80 cb6b8c79 Giorgos Korfiatis
        if is_id:
81 cb6b8c79 Giorgos Korfiatis
            name_or_id = int(name_or_id)
82 cb6b8c79 Giorgos Korfiatis
83 09f54ceb Giorgos Korfiatis
        if search_apps:
84 09f54ceb Giorgos Korfiatis
            infolist = app_info(name_or_id, is_id)
85 09f54ceb Giorgos Korfiatis
        else:
86 09f54ceb Giorgos Korfiatis
            chains = get_chains(name_or_id, is_id)
87 09f54ceb Giorgos Korfiatis
            infolist = collect_info(chains, show_pending)
88 cb6b8c79 Giorgos Korfiatis
89 09f54ceb Giorgos Korfiatis
        if not infolist:
90 09f54ceb Giorgos Korfiatis
            kind = 'project application' if search_apps else 'project'
91 09f54ceb Giorgos Korfiatis
            field = 'id' if is_id else 'name'
92 09f54ceb Giorgos Korfiatis
            msg = "Unknown %s with %s '%s'" % (kind, field, name_or_id)
93 09f54ceb Giorgos Korfiatis
            raise CommandError(msg)
94 720e6adf Sofia Papagiannaki
95 cb6b8c79 Giorgos Korfiatis
        for info in infolist:
96 cb6b8c79 Giorgos Korfiatis
            self.show_info(info)
97 cb6b8c79 Giorgos Korfiatis
98 cb6b8c79 Giorgos Korfiatis
    def show_info(self, info):
99 cb6b8c79 Giorgos Korfiatis
        for key, val in info.items():
100 cb261eef Sofia Papagiannaki
            line = '%s: %s\n' % (key.rjust(22), format(val))
101 06d7c286 Sofia Papagiannaki
            self.stdout.write(line)
102 cb6b8c79 Giorgos Korfiatis
        self.stdout.write('\n')
103 cb6b8c79 Giorgos Korfiatis
104 cb6b8c79 Giorgos Korfiatis
105 09f54ceb Giorgos Korfiatis
def app_info(name_or_id, is_id):
106 09f54ceb Giorgos Korfiatis
    try:
107 09f54ceb Giorgos Korfiatis
        apps = ([ProjectApplication.objects.get(id=name_or_id)]
108 09f54ceb Giorgos Korfiatis
                if is_id
109 09f54ceb Giorgos Korfiatis
                else ProjectApplication.objects.search_by_name(name_or_id))
110 09f54ceb Giorgos Korfiatis
        return [app_fields(app) for app in apps]
111 09f54ceb Giorgos Korfiatis
    except ProjectApplication.DoesNotExist:
112 09f54ceb Giorgos Korfiatis
            return []
113 09f54ceb Giorgos Korfiatis
114 47fbfc1c Giorgos Korfiatis
def get_chains(name_or_id, is_id):
115 47fbfc1c Giorgos Korfiatis
    if is_id:
116 47fbfc1c Giorgos Korfiatis
        try:
117 47fbfc1c Giorgos Korfiatis
            return [Chain.objects.get(chain=name_or_id)]
118 47fbfc1c Giorgos Korfiatis
        except Chain.DoesNotExist:
119 47fbfc1c Giorgos Korfiatis
            return []
120 47fbfc1c Giorgos Korfiatis
    else:
121 47fbfc1c Giorgos Korfiatis
        return Chain.objects.search_by_name(name_or_id)
122 47fbfc1c Giorgos Korfiatis
123 47fbfc1c Giorgos Korfiatis
def collect_info(chains, pending):
124 47fbfc1c Giorgos Korfiatis
    states = [chain.full_state() for chain in chains]
125 47fbfc1c Giorgos Korfiatis
126 47fbfc1c Giorgos Korfiatis
    infolist = []
127 47fbfc1c Giorgos Korfiatis
    for state in states:
128 47fbfc1c Giorgos Korfiatis
        infolist += (chain_fields(state, pending))
129 47fbfc1c Giorgos Korfiatis
    return infolist
130 47fbfc1c Giorgos Korfiatis
131 47fbfc1c Giorgos Korfiatis
def chain_fields((s, project, app), request=False):
132 47fbfc1c Giorgos Korfiatis
    l = []
133 47fbfc1c Giorgos Korfiatis
    if project:
134 47fbfc1c Giorgos Korfiatis
        l = [project_fields(s, project, app)]
135 47fbfc1c Giorgos Korfiatis
        if request and s in Chain.PENDING_STATES:
136 47fbfc1c Giorgos Korfiatis
            l.append(app_fields(app))
137 47fbfc1c Giorgos Korfiatis
    else:
138 47fbfc1c Giorgos Korfiatis
        l = [app_fields(app)]
139 47fbfc1c Giorgos Korfiatis
    return l
140 47fbfc1c Giorgos Korfiatis
141 cb6b8c79 Giorgos Korfiatis
def app_fields(app):
142 e0a30018 Giorgos Korfiatis
    mem_limit = app.limit_on_members_number
143 e0a30018 Giorgos Korfiatis
    mem_limit_show = mem_limit if mem_limit is not None else "unlimited"
144 e0a30018 Giorgos Korfiatis
145 cb6b8c79 Giorgos Korfiatis
    d = OrderedDict([
146 cb6b8c79 Giorgos Korfiatis
            ('project id', app.chain),
147 47fbfc1c Giorgos Korfiatis
            ('application id', app.id),
148 cb6b8c79 Giorgos Korfiatis
            ('name', app.name),
149 cb6b8c79 Giorgos Korfiatis
            ('status', app.state_display()),
150 47fbfc1c Giorgos Korfiatis
            ('owner', app.owner),
151 cd1915aa Giorgos Korfiatis
            ('applicant', app.applicant),
152 cb6b8c79 Giorgos Korfiatis
            ('homepage', app.homepage),
153 cb6b8c79 Giorgos Korfiatis
            ('description', app.description),
154 47fbfc1c Giorgos Korfiatis
            ('comments for review', app.comments),
155 cb261eef Sofia Papagiannaki
            ('request issue date', app.issue_date),
156 cb261eef Sofia Papagiannaki
            ('request start date', app.start_date),
157 cb261eef Sofia Papagiannaki
            ('request end date', app.end_date),
158 cb6b8c79 Giorgos Korfiatis
            ('resources', app.resource_policies),
159 cb6b8c79 Giorgos Korfiatis
            ('join policy', app.member_join_policy_display),
160 cb6b8c79 Giorgos Korfiatis
            ('leave policy', app.member_leave_policy_display),
161 e0a30018 Giorgos Korfiatis
            ('max members', mem_limit_show),
162 cb6b8c79 Giorgos Korfiatis
            ])
163 cb6b8c79 Giorgos Korfiatis
164 cb6b8c79 Giorgos Korfiatis
    return d
165 cb6b8c79 Giorgos Korfiatis
166 cb6b8c79 Giorgos Korfiatis
167 47fbfc1c Giorgos Korfiatis
def project_fields(s, project, last_app):
168 cb6b8c79 Giorgos Korfiatis
    app = project.application
169 47fbfc1c Giorgos Korfiatis
170 cb6b8c79 Giorgos Korfiatis
    d = OrderedDict([
171 cb6b8c79 Giorgos Korfiatis
            ('project id', project.id),
172 cb6b8c79 Giorgos Korfiatis
            ('application id', app.id),
173 882ade00 Giorgos Korfiatis
            ('name', app.name),
174 47fbfc1c Giorgos Korfiatis
            ('status', Chain.state_display(s)),
175 cb6b8c79 Giorgos Korfiatis
            ])
176 47fbfc1c Giorgos Korfiatis
    if s in Chain.PENDING_STATES:
177 47fbfc1c Giorgos Korfiatis
        d.update([('pending application', last_app.id)])
178 47fbfc1c Giorgos Korfiatis
179 47fbfc1c Giorgos Korfiatis
    d.update([('owner', app.owner),
180 cd1915aa Giorgos Korfiatis
              ('applicant', app.applicant),
181 47fbfc1c Giorgos Korfiatis
              ('homepage', app.homepage),
182 47fbfc1c Giorgos Korfiatis
              ('description', app.description),
183 47fbfc1c Giorgos Korfiatis
              ('comments for review', app.comments),
184 cb261eef Sofia Papagiannaki
              ('request issue date', app.issue_date),
185 cb261eef Sofia Papagiannaki
              ('request start date', app.start_date),
186 cb261eef Sofia Papagiannaki
              ('creation date', project.creation_date),
187 cb261eef Sofia Papagiannaki
              ('request end date', app.end_date),
188 47fbfc1c Giorgos Korfiatis
              ])
189 47fbfc1c Giorgos Korfiatis
190 cb6b8c79 Giorgos Korfiatis
    deact_date = project.deactivation_date
191 cb6b8c79 Giorgos Korfiatis
    if deact_date is not None:
192 cb261eef Sofia Papagiannaki
        d['deactivation date'] = deact_date
193 cb6b8c79 Giorgos Korfiatis
194 e0a30018 Giorgos Korfiatis
    mem_limit = app.limit_on_members_number
195 e0a30018 Giorgos Korfiatis
    mem_limit_show = mem_limit if mem_limit is not None else "unlimited"
196 e0a30018 Giorgos Korfiatis
197 cb6b8c79 Giorgos Korfiatis
    d.update([
198 cb6b8c79 Giorgos Korfiatis
            ('resources', app.resource_policies),
199 cb6b8c79 Giorgos Korfiatis
            ('join policy', app.member_join_policy_display),
200 cb6b8c79 Giorgos Korfiatis
            ('leave policy', app.member_leave_policy_display),
201 e0a30018 Giorgos Korfiatis
            ('max members', mem_limit_show),
202 cb6b8c79 Giorgos Korfiatis
            ('total members', project.members_count()),
203 cb6b8c79 Giorgos Korfiatis
            ])
204 cb6b8c79 Giorgos Korfiatis
205 cb6b8c79 Giorgos Korfiatis
    memberships = project.projectmembership_set
206 cb6b8c79 Giorgos Korfiatis
    accepted  = [str(m.person) for m in memberships.any_accepted()]
207 cb6b8c79 Giorgos Korfiatis
    requested = [str(m.person) for m in memberships.requested()]
208 cb6b8c79 Giorgos Korfiatis
    suspended = [str(m.person) for m in memberships.suspended()]
209 cb6b8c79 Giorgos Korfiatis
210 cb6b8c79 Giorgos Korfiatis
    if accepted:
211 cb6b8c79 Giorgos Korfiatis
        d['accepted members'] = ', '.join(accepted)
212 cb6b8c79 Giorgos Korfiatis
213 cb6b8c79 Giorgos Korfiatis
    if suspended:
214 cb6b8c79 Giorgos Korfiatis
        d['suspended members'] = ', '.join(suspended)
215 cb6b8c79 Giorgos Korfiatis
216 cb6b8c79 Giorgos Korfiatis
    if requested:
217 cb6b8c79 Giorgos Korfiatis
        d['membership requests'] = ', '.join(requested)
218 cb6b8c79 Giorgos Korfiatis
219 cb6b8c79 Giorgos Korfiatis
    return d