Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7.2 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 a0699ee4 Sofia Papagiannaki
from synnefo.webproject.management.commands import SynnefoCommand
39 a0699ee4 Sofia Papagiannaki
from synnefo.webproject.management import utils
40 09f54ceb Giorgos Korfiatis
from astakos.im.models import Chain, ProjectApplication
41 c2837d72 Sofia Papagiannaki
42 c2837d72 Sofia Papagiannaki
43 a0699ee4 Sofia Papagiannaki
class Command(SynnefoCommand):
44 398a9604 Giorgos Korfiatis
    args = "<id>"
45 398a9604 Giorgos Korfiatis
    help = "Show details for project (or application) <id>"
46 cb6b8c79 Giorgos Korfiatis
47 a0699ee4 Sofia Papagiannaki
    option_list = SynnefoCommand.option_list + (
48 09f54ceb Giorgos Korfiatis
        make_option('--app',
49 09f54ceb Giorgos Korfiatis
                    action='store_true',
50 09f54ceb Giorgos Korfiatis
                    dest='app',
51 09f54ceb Giorgos Korfiatis
                    default=False,
52 5ed5f9e6 Giorgos Korfiatis
                    help="Show details of applications instead of projects"
53 5ed5f9e6 Giorgos Korfiatis
                    ),
54 47fbfc1c Giorgos Korfiatis
        make_option('--pending',
55 cb6b8c79 Giorgos Korfiatis
                    action='store_true',
56 47fbfc1c Giorgos Korfiatis
                    dest='pending',
57 cb6b8c79 Giorgos Korfiatis
                    default=False,
58 398a9604 Giorgos Korfiatis
                    help=("For a given project, show also pending "
59 398a9604 Giorgos Korfiatis
                          "modifications (applications), if any")
60 398a9604 Giorgos Korfiatis
                    ),
61 398a9604 Giorgos Korfiatis
        make_option('--members',
62 398a9604 Giorgos Korfiatis
                    action='store_true',
63 398a9604 Giorgos Korfiatis
                    dest='members',
64 398a9604 Giorgos Korfiatis
                    default=False,
65 398a9604 Giorgos Korfiatis
                    help=("Show a list of project memberships")
66 5ed5f9e6 Giorgos Korfiatis
                    ),
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 47fbfc1c Giorgos Korfiatis
        show_pending = bool(options['pending'])
74 398a9604 Giorgos Korfiatis
        show_members = bool(options['members'])
75 a0699ee4 Sofia Papagiannaki
        search_apps = options['app']
76 398a9604 Giorgos Korfiatis
        self.output_format = options['output_format']
77 c2837d72 Sofia Papagiannaki
78 398a9604 Giorgos Korfiatis
        id_ = args[0]
79 398a9604 Giorgos Korfiatis
        try:
80 398a9604 Giorgos Korfiatis
            id_ = int(id_)
81 398a9604 Giorgos Korfiatis
        except ValueError:
82 398a9604 Giorgos Korfiatis
            raise CommandError("id should be an integer value.")
83 cb6b8c79 Giorgos Korfiatis
84 09f54ceb Giorgos Korfiatis
        if search_apps:
85 398a9604 Giorgos Korfiatis
            self.pprint_dict(app_info(id_))
86 09f54ceb Giorgos Korfiatis
        else:
87 398a9604 Giorgos Korfiatis
            state, project, app = get_chain_state(id_)
88 398a9604 Giorgos Korfiatis
            self.pprint_dict(chain_fields(state, project, app))
89 398a9604 Giorgos Korfiatis
            if show_members and project is not None:
90 415c4a56 Giorgos Korfiatis
                self.stdout.write("\n")
91 398a9604 Giorgos Korfiatis
                fields, labels = members_fields(project)
92 398a9604 Giorgos Korfiatis
                self.pprint_table(fields, labels)
93 398a9604 Giorgos Korfiatis
            if show_pending and state in Chain.PENDING_STATES:
94 398a9604 Giorgos Korfiatis
                self.stdout.write("\n")
95 398a9604 Giorgos Korfiatis
                self.pprint_dict(app_fields(app))
96 cb6b8c79 Giorgos Korfiatis
97 398a9604 Giorgos Korfiatis
    def pprint_dict(self, d, vertical=True):
98 398a9604 Giorgos Korfiatis
        utils.pprint_table(self.stdout, [d.values()], d.keys(),
99 398a9604 Giorgos Korfiatis
                           self.output_format, vertical=vertical)
100 09f54ceb Giorgos Korfiatis
101 398a9604 Giorgos Korfiatis
    def pprint_table(self, tbl, labels):
102 398a9604 Giorgos Korfiatis
        utils.pprint_table(self.stdout, tbl, labels,
103 398a9604 Giorgos Korfiatis
                           self.output_format)
104 a0699ee4 Sofia Papagiannaki
105 47fbfc1c Giorgos Korfiatis
106 398a9604 Giorgos Korfiatis
def app_info(app_id):
107 398a9604 Giorgos Korfiatis
    try:
108 398a9604 Giorgos Korfiatis
        app = ProjectApplication.objects.get(id=app_id)
109 398a9604 Giorgos Korfiatis
        return app_fields(app)
110 398a9604 Giorgos Korfiatis
    except ProjectApplication.DoesNotExist:
111 398a9604 Giorgos Korfiatis
        raise CommandError("Application with id %s not found." % app_id)
112 a0699ee4 Sofia Papagiannaki
113 47fbfc1c Giorgos Korfiatis
114 398a9604 Giorgos Korfiatis
def get_chain_state(project_id):
115 398a9604 Giorgos Korfiatis
    try:
116 398a9604 Giorgos Korfiatis
        chain = Chain.objects.get(chain=project_id)
117 398a9604 Giorgos Korfiatis
        return chain.full_state()
118 398a9604 Giorgos Korfiatis
    except Chain.DoesNotExist:
119 398a9604 Giorgos Korfiatis
        raise CommandError("Project with id %s not found." % project_id)
120 47fbfc1c Giorgos Korfiatis
121 a0699ee4 Sofia Papagiannaki
122 398a9604 Giorgos Korfiatis
def chain_fields(state, project, app):
123 398a9604 Giorgos Korfiatis
    if project is not None:
124 398a9604 Giorgos Korfiatis
        return project_fields(state, project, app)
125 47fbfc1c Giorgos Korfiatis
    else:
126 398a9604 Giorgos Korfiatis
        return app_fields(app)
127 47fbfc1c Giorgos Korfiatis
128 a0699ee4 Sofia Papagiannaki
129 cb6b8c79 Giorgos Korfiatis
def app_fields(app):
130 e0a30018 Giorgos Korfiatis
    mem_limit = app.limit_on_members_number
131 e0a30018 Giorgos Korfiatis
    mem_limit_show = mem_limit if mem_limit is not None else "unlimited"
132 e0a30018 Giorgos Korfiatis
133 cb6b8c79 Giorgos Korfiatis
    d = OrderedDict([
134 a0699ee4 Sofia Papagiannaki
        ('project id', app.chain),
135 a0699ee4 Sofia Papagiannaki
        ('application id', app.id),
136 a0699ee4 Sofia Papagiannaki
        ('name', app.name),
137 a0699ee4 Sofia Papagiannaki
        ('status', app.state_display()),
138 a0699ee4 Sofia Papagiannaki
        ('owner', app.owner),
139 a0699ee4 Sofia Papagiannaki
        ('applicant', app.applicant),
140 a0699ee4 Sofia Papagiannaki
        ('homepage', app.homepage),
141 a0699ee4 Sofia Papagiannaki
        ('description', app.description),
142 a0699ee4 Sofia Papagiannaki
        ('comments for review', app.comments),
143 a0699ee4 Sofia Papagiannaki
        ('request issue date', app.issue_date),
144 a0699ee4 Sofia Papagiannaki
        ('request start date', app.start_date),
145 a0699ee4 Sofia Papagiannaki
        ('request end date', app.end_date),
146 a0699ee4 Sofia Papagiannaki
        ('resources', app.resource_policies),
147 a0699ee4 Sofia Papagiannaki
        ('join policy', app.member_join_policy_display),
148 a0699ee4 Sofia Papagiannaki
        ('leave policy', app.member_leave_policy_display),
149 a0699ee4 Sofia Papagiannaki
        ('max members', mem_limit_show),
150 a0699ee4 Sofia Papagiannaki
    ])
151 cb6b8c79 Giorgos Korfiatis
152 cb6b8c79 Giorgos Korfiatis
    return d
153 cb6b8c79 Giorgos Korfiatis
154 cb6b8c79 Giorgos Korfiatis
155 47fbfc1c Giorgos Korfiatis
def project_fields(s, project, last_app):
156 cb6b8c79 Giorgos Korfiatis
    app = project.application
157 47fbfc1c Giorgos Korfiatis
158 cb6b8c79 Giorgos Korfiatis
    d = OrderedDict([
159 a0699ee4 Sofia Papagiannaki
        ('project id', project.id),
160 a0699ee4 Sofia Papagiannaki
        ('application id', app.id),
161 a0699ee4 Sofia Papagiannaki
        ('name', app.name),
162 a0699ee4 Sofia Papagiannaki
        ('status', Chain.state_display(s)),
163 a0699ee4 Sofia Papagiannaki
    ])
164 47fbfc1c Giorgos Korfiatis
    if s in Chain.PENDING_STATES:
165 47fbfc1c Giorgos Korfiatis
        d.update([('pending application', last_app.id)])
166 47fbfc1c Giorgos Korfiatis
167 47fbfc1c Giorgos Korfiatis
    d.update([('owner', app.owner),
168 cd1915aa Giorgos Korfiatis
              ('applicant', app.applicant),
169 47fbfc1c Giorgos Korfiatis
              ('homepage', app.homepage),
170 47fbfc1c Giorgos Korfiatis
              ('description', app.description),
171 47fbfc1c Giorgos Korfiatis
              ('comments for review', app.comments),
172 cb261eef Sofia Papagiannaki
              ('request issue date', app.issue_date),
173 cb261eef Sofia Papagiannaki
              ('request start date', app.start_date),
174 cb261eef Sofia Papagiannaki
              ('creation date', project.creation_date),
175 cb261eef Sofia Papagiannaki
              ('request end date', app.end_date),
176 47fbfc1c Giorgos Korfiatis
              ])
177 47fbfc1c Giorgos Korfiatis
178 cb6b8c79 Giorgos Korfiatis
    deact_date = project.deactivation_date
179 cb6b8c79 Giorgos Korfiatis
    if deact_date is not None:
180 cb261eef Sofia Papagiannaki
        d['deactivation date'] = deact_date
181 cb6b8c79 Giorgos Korfiatis
182 e0a30018 Giorgos Korfiatis
    mem_limit = app.limit_on_members_number
183 e0a30018 Giorgos Korfiatis
    mem_limit_show = mem_limit if mem_limit is not None else "unlimited"
184 e0a30018 Giorgos Korfiatis
185 cb6b8c79 Giorgos Korfiatis
    d.update([
186 cb6b8c79 Giorgos Korfiatis
            ('resources', app.resource_policies),
187 cb6b8c79 Giorgos Korfiatis
            ('join policy', app.member_join_policy_display),
188 cb6b8c79 Giorgos Korfiatis
            ('leave policy', app.member_leave_policy_display),
189 e0a30018 Giorgos Korfiatis
            ('max members', mem_limit_show),
190 cb6b8c79 Giorgos Korfiatis
            ('total members', project.members_count()),
191 a0699ee4 Sofia Papagiannaki
    ])
192 cb6b8c79 Giorgos Korfiatis
193 398a9604 Giorgos Korfiatis
    return d
194 cb6b8c79 Giorgos Korfiatis
195 cb6b8c79 Giorgos Korfiatis
196 398a9604 Giorgos Korfiatis
def members_fields(project):
197 398a9604 Giorgos Korfiatis
    labels = ('member uuid', 'email', 'status')
198 398a9604 Giorgos Korfiatis
    objs = project.projectmembership_set.select_related('person')
199 398a9604 Giorgos Korfiatis
    memberships = objs.all().order_by('state', 'person__email')
200 398a9604 Giorgos Korfiatis
    collect = []
201 398a9604 Giorgos Korfiatis
    for m in memberships:
202 398a9604 Giorgos Korfiatis
        user = m.person
203 398a9604 Giorgos Korfiatis
        collect.append((user.uuid,
204 398a9604 Giorgos Korfiatis
                       user.email,
205 398a9604 Giorgos Korfiatis
                       m.state_display()))
206 cb6b8c79 Giorgos Korfiatis
207 398a9604 Giorgos Korfiatis
    return collect, labels