Statistics
| Branch: | Tag: | Revision:

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

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