Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (8.3 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 a0699ee4 Sofia Papagiannaki
from django.core.management.base import CommandError
36 c2837d72 Sofia Papagiannaki
37 cb6b8c79 Giorgos Korfiatis
from synnefo.lib.ordereddict import OrderedDict
38 7cfc0cef Christos Stavrakakis
from snf_django.management.commands import SynnefoCommand
39 d758784b Christos Stavrakakis
from snf_django.management import utils
40 6d583e07 Giorgos Korfiatis
from astakos.im.models import ProjectApplication, Project
41 44f510e1 Giorgos Korfiatis
from ._common import show_resource_value, style_options, check_style
42 c2837d72 Sofia Papagiannaki
43 c2837d72 Sofia Papagiannaki
44 a0699ee4 Sofia Papagiannaki
class Command(SynnefoCommand):
45 398a9604 Giorgos Korfiatis
    args = "<id>"
46 398a9604 Giorgos Korfiatis
    help = "Show details for project (or application) <id>"
47 cb6b8c79 Giorgos Korfiatis
48 a0699ee4 Sofia Papagiannaki
    option_list = SynnefoCommand.option_list + (
49 09f54ceb Giorgos Korfiatis
        make_option('--app',
50 09f54ceb Giorgos Korfiatis
                    action='store_true',
51 09f54ceb Giorgos Korfiatis
                    dest='app',
52 09f54ceb Giorgos Korfiatis
                    default=False,
53 5ed5f9e6 Giorgos Korfiatis
                    help="Show details of applications instead of projects"
54 5ed5f9e6 Giorgos Korfiatis
                    ),
55 47fbfc1c Giorgos Korfiatis
        make_option('--pending',
56 cb6b8c79 Giorgos Korfiatis
                    action='store_true',
57 47fbfc1c Giorgos Korfiatis
                    dest='pending',
58 cb6b8c79 Giorgos Korfiatis
                    default=False,
59 398a9604 Giorgos Korfiatis
                    help=("For a given project, show also pending "
60 398a9604 Giorgos Korfiatis
                          "modifications (applications), if any")
61 398a9604 Giorgos Korfiatis
                    ),
62 398a9604 Giorgos Korfiatis
        make_option('--members',
63 398a9604 Giorgos Korfiatis
                    action='store_true',
64 398a9604 Giorgos Korfiatis
                    dest='members',
65 398a9604 Giorgos Korfiatis
                    default=False,
66 398a9604 Giorgos Korfiatis
                    help=("Show a list of project memberships")
67 5ed5f9e6 Giorgos Korfiatis
                    ),
68 44f510e1 Giorgos Korfiatis
        make_option('--unit-style',
69 44f510e1 Giorgos Korfiatis
                    default='mb',
70 44f510e1 Giorgos Korfiatis
                    help=("Specify display unit for resource values "
71 44f510e1 Giorgos Korfiatis
                          "(one of %s); defaults to mb") % style_options),
72 a0699ee4 Sofia Papagiannaki
    )
73 c2837d72 Sofia Papagiannaki
74 c2837d72 Sofia Papagiannaki
    def handle(self, *args, **options):
75 c2837d72 Sofia Papagiannaki
        if len(args) != 1:
76 47fbfc1c Giorgos Korfiatis
            raise CommandError("Please provide project ID or name")
77 47fbfc1c Giorgos Korfiatis
78 44f510e1 Giorgos Korfiatis
        self.unit_style = options['unit_style']
79 44f510e1 Giorgos Korfiatis
        check_style(self.unit_style)
80 44f510e1 Giorgos Korfiatis
81 47fbfc1c Giorgos Korfiatis
        show_pending = bool(options['pending'])
82 398a9604 Giorgos Korfiatis
        show_members = bool(options['members'])
83 a0699ee4 Sofia Papagiannaki
        search_apps = options['app']
84 398a9604 Giorgos Korfiatis
        self.output_format = options['output_format']
85 c2837d72 Sofia Papagiannaki
86 398a9604 Giorgos Korfiatis
        id_ = args[0]
87 398a9604 Giorgos Korfiatis
        try:
88 398a9604 Giorgos Korfiatis
            id_ = int(id_)
89 398a9604 Giorgos Korfiatis
        except ValueError:
90 398a9604 Giorgos Korfiatis
            raise CommandError("id should be an integer value.")
91 cb6b8c79 Giorgos Korfiatis
92 09f54ceb Giorgos Korfiatis
        if search_apps:
93 44f510e1 Giorgos Korfiatis
            app = get_app(id_)
94 44f510e1 Giorgos Korfiatis
            self.print_app(app)
95 09f54ceb Giorgos Korfiatis
        else:
96 6d583e07 Giorgos Korfiatis
            project, pending_app = get_chain_state(id_)
97 6d583e07 Giorgos Korfiatis
            self.print_project(project, pending_app)
98 398a9604 Giorgos Korfiatis
            if show_members and project is not None:
99 415c4a56 Giorgos Korfiatis
                self.stdout.write("\n")
100 398a9604 Giorgos Korfiatis
                fields, labels = members_fields(project)
101 44f510e1 Giorgos Korfiatis
                self.pprint_table(fields, labels, title="Members")
102 6d583e07 Giorgos Korfiatis
            if show_pending and pending_app is not None:
103 398a9604 Giorgos Korfiatis
                self.stdout.write("\n")
104 6d583e07 Giorgos Korfiatis
                self.print_app(pending_app)
105 cb6b8c79 Giorgos Korfiatis
106 398a9604 Giorgos Korfiatis
    def pprint_dict(self, d, vertical=True):
107 398a9604 Giorgos Korfiatis
        utils.pprint_table(self.stdout, [d.values()], d.keys(),
108 398a9604 Giorgos Korfiatis
                           self.output_format, vertical=vertical)
109 09f54ceb Giorgos Korfiatis
110 44f510e1 Giorgos Korfiatis
    def pprint_table(self, tbl, labels, title=None):
111 398a9604 Giorgos Korfiatis
        utils.pprint_table(self.stdout, tbl, labels,
112 44f510e1 Giorgos Korfiatis
                           self.output_format, title=title)
113 44f510e1 Giorgos Korfiatis
114 44f510e1 Giorgos Korfiatis
    def print_app(self, app):
115 44f510e1 Giorgos Korfiatis
        app_info = app_fields(app)
116 44f510e1 Giorgos Korfiatis
        self.pprint_dict(app_info)
117 44f510e1 Giorgos Korfiatis
        self.print_resources(app)
118 44f510e1 Giorgos Korfiatis
119 6d583e07 Giorgos Korfiatis
    def print_project(self, project, app):
120 44f510e1 Giorgos Korfiatis
        if project is None:
121 44f510e1 Giorgos Korfiatis
            self.print_app(app)
122 44f510e1 Giorgos Korfiatis
        else:
123 6d583e07 Giorgos Korfiatis
            self.pprint_dict(project_fields(project, app))
124 44f510e1 Giorgos Korfiatis
            self.print_resources(project.application)
125 44f510e1 Giorgos Korfiatis
126 44f510e1 Giorgos Korfiatis
    def print_resources(self, app):
127 44f510e1 Giorgos Korfiatis
        fields, labels = resource_fields(app, self.unit_style)
128 44f510e1 Giorgos Korfiatis
        if fields:
129 44f510e1 Giorgos Korfiatis
            self.stdout.write("\n")
130 44f510e1 Giorgos Korfiatis
            self.pprint_table(fields, labels, title="Resource limits")
131 a0699ee4 Sofia Papagiannaki
132 47fbfc1c Giorgos Korfiatis
133 44f510e1 Giorgos Korfiatis
def get_app(app_id):
134 398a9604 Giorgos Korfiatis
    try:
135 44f510e1 Giorgos Korfiatis
        return ProjectApplication.objects.get(id=app_id)
136 398a9604 Giorgos Korfiatis
    except ProjectApplication.DoesNotExist:
137 398a9604 Giorgos Korfiatis
        raise CommandError("Application with id %s not found." % app_id)
138 a0699ee4 Sofia Papagiannaki
139 47fbfc1c Giorgos Korfiatis
140 398a9604 Giorgos Korfiatis
def get_chain_state(project_id):
141 398a9604 Giorgos Korfiatis
    try:
142 6d583e07 Giorgos Korfiatis
        chain = Project.objects.get(id=project_id)
143 6d583e07 Giorgos Korfiatis
        return chain, chain.last_pending_application()
144 6d583e07 Giorgos Korfiatis
    except Project.DoesNotExist:
145 398a9604 Giorgos Korfiatis
        raise CommandError("Project with id %s not found." % project_id)
146 47fbfc1c Giorgos Korfiatis
147 a0699ee4 Sofia Papagiannaki
148 44f510e1 Giorgos Korfiatis
def resource_fields(app, style):
149 44f510e1 Giorgos Korfiatis
    labels = ('name', 'description', 'max per member')
150 44f510e1 Giorgos Korfiatis
    policies = app.projectresourcegrant_set.all()
151 44f510e1 Giorgos Korfiatis
    collect = []
152 44f510e1 Giorgos Korfiatis
    for policy in policies:
153 44f510e1 Giorgos Korfiatis
        name = policy.resource.name
154 44f510e1 Giorgos Korfiatis
        desc = policy.resource.desc
155 44f510e1 Giorgos Korfiatis
        capacity = policy.member_capacity
156 44f510e1 Giorgos Korfiatis
        collect.append((name, desc,
157 44f510e1 Giorgos Korfiatis
                        show_resource_value(capacity, name, style)))
158 44f510e1 Giorgos Korfiatis
    return collect, labels
159 44f510e1 Giorgos Korfiatis
160 44f510e1 Giorgos Korfiatis
161 cb6b8c79 Giorgos Korfiatis
def app_fields(app):
162 e0a30018 Giorgos Korfiatis
    mem_limit = app.limit_on_members_number
163 e0a30018 Giorgos Korfiatis
    mem_limit_show = mem_limit if mem_limit is not None else "unlimited"
164 e0a30018 Giorgos Korfiatis
165 cb6b8c79 Giorgos Korfiatis
    d = OrderedDict([
166 6d583e07 Giorgos Korfiatis
        ('project id', app.chain_id),
167 a0699ee4 Sofia Papagiannaki
        ('application id', app.id),
168 a0699ee4 Sofia Papagiannaki
        ('name', app.name),
169 a0699ee4 Sofia Papagiannaki
        ('status', app.state_display()),
170 a0699ee4 Sofia Papagiannaki
        ('owner', app.owner),
171 a0699ee4 Sofia Papagiannaki
        ('applicant', app.applicant),
172 a0699ee4 Sofia Papagiannaki
        ('homepage', app.homepage),
173 a0699ee4 Sofia Papagiannaki
        ('description', app.description),
174 a0699ee4 Sofia Papagiannaki
        ('comments for review', app.comments),
175 a0699ee4 Sofia Papagiannaki
        ('request issue date', app.issue_date),
176 a0699ee4 Sofia Papagiannaki
        ('request start date', app.start_date),
177 a0699ee4 Sofia Papagiannaki
        ('request end date', app.end_date),
178 a0699ee4 Sofia Papagiannaki
        ('join policy', app.member_join_policy_display),
179 a0699ee4 Sofia Papagiannaki
        ('leave policy', app.member_leave_policy_display),
180 a0699ee4 Sofia Papagiannaki
        ('max members', mem_limit_show),
181 a0699ee4 Sofia Papagiannaki
    ])
182 cb6b8c79 Giorgos Korfiatis
183 cb6b8c79 Giorgos Korfiatis
    return d
184 cb6b8c79 Giorgos Korfiatis
185 cb6b8c79 Giorgos Korfiatis
186 6d583e07 Giorgos Korfiatis
def project_fields(project, pending_app):
187 cb6b8c79 Giorgos Korfiatis
    app = project.application
188 47fbfc1c Giorgos Korfiatis
189 cb6b8c79 Giorgos Korfiatis
    d = OrderedDict([
190 a0699ee4 Sofia Papagiannaki
        ('project id', project.id),
191 a0699ee4 Sofia Papagiannaki
        ('application id', app.id),
192 a0699ee4 Sofia Papagiannaki
        ('name', app.name),
193 6d583e07 Giorgos Korfiatis
        ('status', project.state_display()),
194 a0699ee4 Sofia Papagiannaki
    ])
195 6d583e07 Giorgos Korfiatis
    if pending_app is not None:
196 6d583e07 Giorgos Korfiatis
        d.update([('pending application', pending_app.id)])
197 47fbfc1c Giorgos Korfiatis
198 47fbfc1c Giorgos Korfiatis
    d.update([('owner', app.owner),
199 cd1915aa Giorgos Korfiatis
              ('applicant', app.applicant),
200 47fbfc1c Giorgos Korfiatis
              ('homepage', app.homepage),
201 47fbfc1c Giorgos Korfiatis
              ('description', app.description),
202 47fbfc1c Giorgos Korfiatis
              ('comments for review', app.comments),
203 cb261eef Sofia Papagiannaki
              ('request issue date', app.issue_date),
204 cb261eef Sofia Papagiannaki
              ('request start date', app.start_date),
205 cb261eef Sofia Papagiannaki
              ('creation date', project.creation_date),
206 cb261eef Sofia Papagiannaki
              ('request end date', app.end_date),
207 47fbfc1c Giorgos Korfiatis
              ])
208 47fbfc1c Giorgos Korfiatis
209 cb6b8c79 Giorgos Korfiatis
    deact_date = project.deactivation_date
210 cb6b8c79 Giorgos Korfiatis
    if deact_date is not None:
211 cb261eef Sofia Papagiannaki
        d['deactivation date'] = deact_date
212 cb6b8c79 Giorgos Korfiatis
213 e0a30018 Giorgos Korfiatis
    mem_limit = app.limit_on_members_number
214 e0a30018 Giorgos Korfiatis
    mem_limit_show = mem_limit if mem_limit is not None else "unlimited"
215 e0a30018 Giorgos Korfiatis
216 cb6b8c79 Giorgos Korfiatis
    d.update([
217 cb6b8c79 Giorgos Korfiatis
            ('join policy', app.member_join_policy_display),
218 cb6b8c79 Giorgos Korfiatis
            ('leave policy', app.member_leave_policy_display),
219 e0a30018 Giorgos Korfiatis
            ('max members', mem_limit_show),
220 cb6b8c79 Giorgos Korfiatis
            ('total members', project.members_count()),
221 a0699ee4 Sofia Papagiannaki
    ])
222 cb6b8c79 Giorgos Korfiatis
223 398a9604 Giorgos Korfiatis
    return d
224 cb6b8c79 Giorgos Korfiatis
225 cb6b8c79 Giorgos Korfiatis
226 398a9604 Giorgos Korfiatis
def members_fields(project):
227 398a9604 Giorgos Korfiatis
    labels = ('member uuid', 'email', 'status')
228 398a9604 Giorgos Korfiatis
    objs = project.projectmembership_set.select_related('person')
229 398a9604 Giorgos Korfiatis
    memberships = objs.all().order_by('state', 'person__email')
230 398a9604 Giorgos Korfiatis
    collect = []
231 398a9604 Giorgos Korfiatis
    for m in memberships:
232 398a9604 Giorgos Korfiatis
        user = m.person
233 398a9604 Giorgos Korfiatis
        collect.append((user.uuid,
234 398a9604 Giorgos Korfiatis
                       user.email,
235 398a9604 Giorgos Korfiatis
                       m.state_display()))
236 cb6b8c79 Giorgos Korfiatis
237 398a9604 Giorgos Korfiatis
    return collect, labels