Statistics
| Branch: | Tag: | Revision:

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

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