Statistics
| Branch: | Tag: | Revision:

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

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 c2837d72 Sofia Papagiannaki
36 cb6b8c79 Giorgos Korfiatis
from synnefo.lib.ordereddict import OrderedDict
37 35cbac33 Giorgos Korfiatis
from snf_django.management.commands import SynnefoCommand, CommandError
38 d758784b Christos Stavrakakis
from snf_django.management import utils
39 6d583e07 Giorgos Korfiatis
from astakos.im.models import ProjectApplication, Project
40 a53ec93b Giorgos Korfiatis
from astakos.im import quotas
41 44f510e1 Giorgos Korfiatis
from ._common import show_resource_value, style_options, check_style
42 362dadaa Giorgos Korfiatis
from synnefo.util import units
43 c2837d72 Sofia Papagiannaki
44 c2837d72 Sofia Papagiannaki
45 a0699ee4 Sofia Papagiannaki
class Command(SynnefoCommand):
46 398a9604 Giorgos Korfiatis
    args = "<id>"
47 362dadaa Giorgos Korfiatis
    help = "Show details for project <id>"
48 cb6b8c79 Giorgos Korfiatis
49 a0699ee4 Sofia Papagiannaki
    option_list = SynnefoCommand.option_list + (
50 47fbfc1c Giorgos Korfiatis
        make_option('--pending',
51 cb6b8c79 Giorgos Korfiatis
                    action='store_true',
52 47fbfc1c Giorgos Korfiatis
                    dest='pending',
53 cb6b8c79 Giorgos Korfiatis
                    default=False,
54 398a9604 Giorgos Korfiatis
                    help=("For a given project, show also pending "
55 362dadaa Giorgos Korfiatis
                          "modification, if any")
56 398a9604 Giorgos Korfiatis
                    ),
57 398a9604 Giorgos Korfiatis
        make_option('--members',
58 398a9604 Giorgos Korfiatis
                    action='store_true',
59 398a9604 Giorgos Korfiatis
                    dest='members',
60 398a9604 Giorgos Korfiatis
                    default=False,
61 398a9604 Giorgos Korfiatis
                    help=("Show a list of project memberships")
62 5ed5f9e6 Giorgos Korfiatis
                    ),
63 a53ec93b Giorgos Korfiatis
        make_option('--quota',
64 a53ec93b Giorgos Korfiatis
                    action='store_true',
65 a53ec93b Giorgos Korfiatis
                    dest='list_quotas',
66 a53ec93b Giorgos Korfiatis
                    default=False,
67 a53ec93b Giorgos Korfiatis
                    help="List project quota"),
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 362dadaa Giorgos Korfiatis
        show_quota = bool(options['list_quotas'])
84 398a9604 Giorgos Korfiatis
        self.output_format = options['output_format']
85 c2837d72 Sofia Papagiannaki
86 398a9604 Giorgos Korfiatis
        id_ = args[0]
87 362dadaa Giorgos Korfiatis
        if True:
88 362dadaa Giorgos Korfiatis
            project = get_chain_state(id_)
89 a53ec93b Giorgos Korfiatis
            self.print_project(project, show_quota)
90 398a9604 Giorgos Korfiatis
            if show_members and project is not None:
91 415c4a56 Giorgos Korfiatis
                self.stdout.write("\n")
92 398a9604 Giorgos Korfiatis
                fields, labels = members_fields(project)
93 44f510e1 Giorgos Korfiatis
                self.pprint_table(fields, labels, title="Members")
94 362dadaa Giorgos Korfiatis
            if show_pending:
95 362dadaa Giorgos Korfiatis
                app = project.last_application
96 362dadaa Giorgos Korfiatis
                if app and app.state == ProjectApplication.PENDING:
97 362dadaa Giorgos Korfiatis
                    self.stdout.write("\n")
98 362dadaa Giorgos Korfiatis
                    self.print_app(app)
99 cb6b8c79 Giorgos Korfiatis
100 398a9604 Giorgos Korfiatis
    def pprint_dict(self, d, vertical=True):
101 398a9604 Giorgos Korfiatis
        utils.pprint_table(self.stdout, [d.values()], d.keys(),
102 398a9604 Giorgos Korfiatis
                           self.output_format, vertical=vertical)
103 09f54ceb Giorgos Korfiatis
104 44f510e1 Giorgos Korfiatis
    def pprint_table(self, tbl, labels, title=None):
105 398a9604 Giorgos Korfiatis
        utils.pprint_table(self.stdout, tbl, labels,
106 44f510e1 Giorgos Korfiatis
                           self.output_format, title=title)
107 44f510e1 Giorgos Korfiatis
108 44f510e1 Giorgos Korfiatis
    def print_app(self, app):
109 44f510e1 Giorgos Korfiatis
        app_info = app_fields(app)
110 44f510e1 Giorgos Korfiatis
        self.pprint_dict(app_info)
111 362dadaa Giorgos Korfiatis
        self.print_app_resources(app)
112 44f510e1 Giorgos Korfiatis
113 a53ec93b Giorgos Korfiatis
    def print_project(self, project, show_quota=False):
114 362dadaa Giorgos Korfiatis
        self.pprint_dict(project_fields(project))
115 a53ec93b Giorgos Korfiatis
        quota = (quotas.get_project_quota(project)
116 a53ec93b Giorgos Korfiatis
                 if show_quota else None)
117 a53ec93b Giorgos Korfiatis
        self.print_resources(project, quota=quota)
118 44f510e1 Giorgos Korfiatis
119 a53ec93b Giorgos Korfiatis
    def print_resources(self, project, quota=None):
120 362dadaa Giorgos Korfiatis
        policies = project.projectresourcequota_set.all()
121 a53ec93b Giorgos Korfiatis
        fields, labels = resource_fields(policies, quota, self.unit_style)
122 44f510e1 Giorgos Korfiatis
        if fields:
123 44f510e1 Giorgos Korfiatis
            self.stdout.write("\n")
124 44f510e1 Giorgos Korfiatis
            self.pprint_table(fields, labels, title="Resource limits")
125 a0699ee4 Sofia Papagiannaki
126 362dadaa Giorgos Korfiatis
    def print_app_resources(self, app):
127 362dadaa Giorgos Korfiatis
        policies = app.projectresourcegrant_set.all()
128 362dadaa Giorgos Korfiatis
        fields, labels = resource_fields(policies, None, self.unit_style)
129 362dadaa Giorgos Korfiatis
        if fields:
130 362dadaa Giorgos Korfiatis
            self.stdout.write("\n")
131 362dadaa Giorgos Korfiatis
            self.pprint_table(fields, labels, title="Resource limits")
132 a0699ee4 Sofia Papagiannaki
133 47fbfc1c Giorgos Korfiatis
134 398a9604 Giorgos Korfiatis
def get_chain_state(project_id):
135 398a9604 Giorgos Korfiatis
    try:
136 362dadaa Giorgos Korfiatis
        return Project.objects.get(uuid=project_id)
137 6d583e07 Giorgos Korfiatis
    except Project.DoesNotExist:
138 398a9604 Giorgos Korfiatis
        raise CommandError("Project with id %s not found." % project_id)
139 47fbfc1c Giorgos Korfiatis
140 a0699ee4 Sofia Papagiannaki
141 a53ec93b Giorgos Korfiatis
def resource_fields(policies, quota, style):
142 a53ec93b Giorgos Korfiatis
    labels = ('name', 'max per member', 'max per project')
143 a53ec93b Giorgos Korfiatis
    if quota:
144 a53ec93b Giorgos Korfiatis
        labels += ('usage',)
145 44f510e1 Giorgos Korfiatis
    collect = []
146 44f510e1 Giorgos Korfiatis
    for policy in policies:
147 44f510e1 Giorgos Korfiatis
        name = policy.resource.name
148 44f510e1 Giorgos Korfiatis
        capacity = policy.member_capacity
149 a53ec93b Giorgos Korfiatis
        p_capacity = policy.project_capacity
150 a53ec93b Giorgos Korfiatis
        row = (name,
151 a53ec93b Giorgos Korfiatis
               show_resource_value(capacity, name, style),
152 a53ec93b Giorgos Korfiatis
               show_resource_value(p_capacity, name, style))
153 a53ec93b Giorgos Korfiatis
        if quota:
154 a53ec93b Giorgos Korfiatis
            r_quota = quota.get(name)
155 a53ec93b Giorgos Korfiatis
            usage = r_quota.get('project_usage')
156 a53ec93b Giorgos Korfiatis
            row += (show_resource_value(usage, name, style),)
157 a53ec93b Giorgos Korfiatis
        collect.append(row)
158 44f510e1 Giorgos Korfiatis
    return collect, labels
159 44f510e1 Giorgos Korfiatis
160 44f510e1 Giorgos Korfiatis
161 cb6b8c79 Giorgos Korfiatis
def app_fields(app):
162 cb6b8c79 Giorgos Korfiatis
    d = OrderedDict([
163 88f5242e Giorgos Korfiatis
        ('project id', app.chain.uuid),
164 a0699ee4 Sofia Papagiannaki
        ('application id', app.id),
165 a0699ee4 Sofia Papagiannaki
        ('status', app.state_display()),
166 a0699ee4 Sofia Papagiannaki
        ('applicant', app.applicant),
167 a0699ee4 Sofia Papagiannaki
        ('comments for review', app.comments),
168 a0699ee4 Sofia Papagiannaki
        ('request issue date', app.issue_date),
169 362dadaa Giorgos Korfiatis
        ])
170 362dadaa Giorgos Korfiatis
    if app.name:
171 362dadaa Giorgos Korfiatis
        d['name'] = app.name
172 362dadaa Giorgos Korfiatis
    if app.owner:
173 362dadaa Giorgos Korfiatis
        d['owner'] = app.owner
174 362dadaa Giorgos Korfiatis
    if app.homepage:
175 362dadaa Giorgos Korfiatis
        d['homepage'] = app.homepage
176 362dadaa Giorgos Korfiatis
    if app.description:
177 362dadaa Giorgos Korfiatis
        d['description'] = app.description
178 362dadaa Giorgos Korfiatis
    if app.start_date:
179 362dadaa Giorgos Korfiatis
        d['request start date'] = app.start_date
180 362dadaa Giorgos Korfiatis
    if app.end_date:
181 362dadaa Giorgos Korfiatis
        d['request end date'] = app.end_date
182 362dadaa Giorgos Korfiatis
    if app.member_join_policy:
183 362dadaa Giorgos Korfiatis
        d['join policy'] = app.member_join_policy_display
184 362dadaa Giorgos Korfiatis
    if app.member_leave_policy:
185 362dadaa Giorgos Korfiatis
        d['leave policy'] = app.member_leave_policy_display
186 362dadaa Giorgos Korfiatis
    if app.limit_on_members_number:
187 362dadaa Giorgos Korfiatis
        d['max members'] = units.show(app.limit_on_members_number, None)
188 cb6b8c79 Giorgos Korfiatis
189 cb6b8c79 Giorgos Korfiatis
    return d
190 cb6b8c79 Giorgos Korfiatis
191 cb6b8c79 Giorgos Korfiatis
192 362dadaa Giorgos Korfiatis
def project_fields(project):
193 362dadaa Giorgos Korfiatis
    app = project.last_application
194 47fbfc1c Giorgos Korfiatis
195 cb6b8c79 Giorgos Korfiatis
    d = OrderedDict([
196 88f5242e Giorgos Korfiatis
        ('project id', project.uuid),
197 362dadaa Giorgos Korfiatis
        ('name', project.realname),
198 6d583e07 Giorgos Korfiatis
        ('status', project.state_display()),
199 362dadaa Giorgos Korfiatis
        ('owner', project.owner),
200 362dadaa Giorgos Korfiatis
        ('homepage', project.homepage),
201 362dadaa Giorgos Korfiatis
        ('description', project.description),
202 362dadaa Giorgos Korfiatis
        ('creation date', project.creation_date),
203 362dadaa Giorgos Korfiatis
        ('request end date', project.end_date),
204 362dadaa Giorgos Korfiatis
        ])
205 47fbfc1c Giorgos Korfiatis
206 88beea39 Giorgos Korfiatis
    deact = project.last_deactivation()
207 88beea39 Giorgos Korfiatis
    if deact is not None:
208 88beea39 Giorgos Korfiatis
        d['deactivation date'] = deact.date
209 cb6b8c79 Giorgos Korfiatis
210 cb6b8c79 Giorgos Korfiatis
    d.update([
211 362dadaa Giorgos Korfiatis
            ('join policy', project.member_join_policy_display),
212 362dadaa Giorgos Korfiatis
            ('leave policy', project.member_leave_policy_display),
213 362dadaa Giorgos Korfiatis
            ('max members', units.show(project.limit_on_members_number, None)),
214 cb6b8c79 Giorgos Korfiatis
            ('total members', project.members_count()),
215 a0699ee4 Sofia Papagiannaki
    ])
216 cb6b8c79 Giorgos Korfiatis
217 398a9604 Giorgos Korfiatis
    return d
218 cb6b8c79 Giorgos Korfiatis
219 cb6b8c79 Giorgos Korfiatis
220 398a9604 Giorgos Korfiatis
def members_fields(project):
221 398a9604 Giorgos Korfiatis
    labels = ('member uuid', 'email', 'status')
222 398a9604 Giorgos Korfiatis
    objs = project.projectmembership_set.select_related('person')
223 398a9604 Giorgos Korfiatis
    memberships = objs.all().order_by('state', 'person__email')
224 398a9604 Giorgos Korfiatis
    collect = []
225 398a9604 Giorgos Korfiatis
    for m in memberships:
226 398a9604 Giorgos Korfiatis
        user = m.person
227 398a9604 Giorgos Korfiatis
        collect.append((user.uuid,
228 398a9604 Giorgos Korfiatis
                       user.email,
229 398a9604 Giorgos Korfiatis
                       m.state_display()))
230 cb6b8c79 Giorgos Korfiatis
231 398a9604 Giorgos Korfiatis
    return collect, labels