Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.8 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
from django.core.management.base import BaseCommand, CommandError
36 c2837d72 Sofia Papagiannaki
37 cb6b8c79 Giorgos Korfiatis
from synnefo.lib.ordereddict import OrderedDict
38 c2837d72 Sofia Papagiannaki
from astakos.im.models import ProjectApplication, Project
39 c2837d72 Sofia Papagiannaki
40 c2837d72 Sofia Papagiannaki
from ._common import format_bool, format_date
41 c2837d72 Sofia Papagiannaki
42 c2837d72 Sofia Papagiannaki
43 c2837d72 Sofia Papagiannaki
class Command(BaseCommand):
44 cb6b8c79 Giorgos Korfiatis
    args = "<id or name>"
45 cb6b8c79 Giorgos Korfiatis
    help = "Show project details"
46 cb6b8c79 Giorgos Korfiatis
47 cb6b8c79 Giorgos Korfiatis
    option_list = BaseCommand.option_list + (
48 cb6b8c79 Giorgos Korfiatis
        make_option('--app',
49 cb6b8c79 Giorgos Korfiatis
                    action='store_true',
50 cb6b8c79 Giorgos Korfiatis
                    dest='app',
51 cb6b8c79 Giorgos Korfiatis
                    default=False,
52 cb6b8c79 Giorgos Korfiatis
                    help="Show application details instead"),
53 cb6b8c79 Giorgos Korfiatis
    )
54 c2837d72 Sofia Papagiannaki
55 c2837d72 Sofia Papagiannaki
    def handle(self, *args, **options):
56 c2837d72 Sofia Papagiannaki
        if len(args) != 1:
57 cb6b8c79 Giorgos Korfiatis
            raise CommandError("Please provide ID or name")
58 c2837d72 Sofia Papagiannaki
59 c2837d72 Sofia Papagiannaki
        name_or_id = args[0]
60 cb6b8c79 Giorgos Korfiatis
        is_id = name_or_id.isdigit()
61 cb6b8c79 Giorgos Korfiatis
        if is_id:
62 cb6b8c79 Giorgos Korfiatis
            name_or_id = int(name_or_id)
63 cb6b8c79 Giorgos Korfiatis
64 720e6adf Sofia Papagiannaki
        search_application = True if options['app'] else False
65 720e6adf Sofia Papagiannaki
66 720e6adf Sofia Papagiannaki
        infolist = (app_info(name_or_id, is_id) if search_application
67 cb6b8c79 Giorgos Korfiatis
                    else project_info(name_or_id, is_id))
68 cb6b8c79 Giorgos Korfiatis
69 720e6adf Sofia Papagiannaki
        if not infolist:
70 720e6adf Sofia Papagiannaki
            kind = 'project application' if search_application else 'project'
71 6e212c04 root
            field = 'id' if is_id else 'name'
72 720e6adf Sofia Papagiannaki
            msg = "Unknown %s with %s '%s'" % (kind, field, name_or_id)
73 720e6adf Sofia Papagiannaki
            raise CommandError(msg)
74 720e6adf Sofia Papagiannaki
75 cb6b8c79 Giorgos Korfiatis
        for info in infolist:
76 cb6b8c79 Giorgos Korfiatis
            self.show_info(info)
77 cb6b8c79 Giorgos Korfiatis
78 cb6b8c79 Giorgos Korfiatis
    def show_info(self, info):
79 cb6b8c79 Giorgos Korfiatis
        for key, val in info.items():
80 cb6b8c79 Giorgos Korfiatis
            line = '%s: %s\n' % (key.rjust(22), val)
81 cb6b8c79 Giorgos Korfiatis
            self.stdout.write(line.encode('utf8'))
82 cb6b8c79 Giorgos Korfiatis
        self.stdout.write('\n')
83 cb6b8c79 Giorgos Korfiatis
84 cb6b8c79 Giorgos Korfiatis
85 cb6b8c79 Giorgos Korfiatis
def app_fields(app):
86 cb6b8c79 Giorgos Korfiatis
    d = OrderedDict([
87 cb6b8c79 Giorgos Korfiatis
            ('application id', app.id),
88 cb6b8c79 Giorgos Korfiatis
            ('project id', app.chain),
89 cb6b8c79 Giorgos Korfiatis
            ('name', app.name),
90 cb6b8c79 Giorgos Korfiatis
            ('owner', app.owner),
91 cb6b8c79 Giorgos Korfiatis
            ('status', app.state_display()),
92 cb6b8c79 Giorgos Korfiatis
            ('homepage', app.homepage),
93 cb6b8c79 Giorgos Korfiatis
            ('description', app.description),
94 cb6b8c79 Giorgos Korfiatis
            ('issue date', format_date(app.issue_date)),
95 cb6b8c79 Giorgos Korfiatis
            ('start date', format_date(app.start_date)),
96 cb6b8c79 Giorgos Korfiatis
            ('end date', format_date(app.end_date)),
97 cb6b8c79 Giorgos Korfiatis
            ('comments', app.comments),
98 cb6b8c79 Giorgos Korfiatis
            ('resources', app.resource_policies),
99 cb6b8c79 Giorgos Korfiatis
            ('join policy', app.member_join_policy_display),
100 cb6b8c79 Giorgos Korfiatis
            ('leave policy', app.member_leave_policy_display),
101 cb6b8c79 Giorgos Korfiatis
            ('max members', app.limit_on_members_number),
102 cb6b8c79 Giorgos Korfiatis
            ])
103 cb6b8c79 Giorgos Korfiatis
104 cb6b8c79 Giorgos Korfiatis
    return d
105 cb6b8c79 Giorgos Korfiatis
106 cb6b8c79 Giorgos Korfiatis
107 cb6b8c79 Giorgos Korfiatis
def project_fields(project):
108 cb6b8c79 Giorgos Korfiatis
    app = project.application
109 cb6b8c79 Giorgos Korfiatis
    d = OrderedDict([
110 cb6b8c79 Giorgos Korfiatis
            ('project id', project.id),
111 cb6b8c79 Giorgos Korfiatis
            ('application id', app.id),
112 cb6b8c79 Giorgos Korfiatis
            ('name', project.name),
113 cb6b8c79 Giorgos Korfiatis
            ('owner', app.owner),
114 2a2c6876 Giorgos Korfiatis
            ('status', project.admin_state_display()),
115 cb6b8c79 Giorgos Korfiatis
            ('creation date', format_date(project.creation_date)),
116 cb6b8c79 Giorgos Korfiatis
            ])
117 cb6b8c79 Giorgos Korfiatis
    deact_date = project.deactivation_date
118 cb6b8c79 Giorgos Korfiatis
    if deact_date is not None:
119 cb6b8c79 Giorgos Korfiatis
        d['deactivation date'] = format_date(deact_date)
120 cb6b8c79 Giorgos Korfiatis
121 cb6b8c79 Giorgos Korfiatis
    d.update([
122 cb6b8c79 Giorgos Korfiatis
            ('homepage', app.homepage),
123 cb6b8c79 Giorgos Korfiatis
            ('description', app.description),
124 cb6b8c79 Giorgos Korfiatis
            ('resources', app.resource_policies),
125 cb6b8c79 Giorgos Korfiatis
            ('join policy', app.member_join_policy_display),
126 cb6b8c79 Giorgos Korfiatis
            ('leave policy', app.member_leave_policy_display),
127 cb6b8c79 Giorgos Korfiatis
            ('max members', app.limit_on_members_number),
128 cb6b8c79 Giorgos Korfiatis
            ('total members', project.members_count()),
129 cb6b8c79 Giorgos Korfiatis
            ])
130 cb6b8c79 Giorgos Korfiatis
131 cb6b8c79 Giorgos Korfiatis
    memberships = project.projectmembership_set
132 cb6b8c79 Giorgos Korfiatis
    accepted  = [str(m.person) for m in memberships.any_accepted()]
133 cb6b8c79 Giorgos Korfiatis
    requested = [str(m.person) for m in memberships.requested()]
134 cb6b8c79 Giorgos Korfiatis
    suspended = [str(m.person) for m in memberships.suspended()]
135 cb6b8c79 Giorgos Korfiatis
136 cb6b8c79 Giorgos Korfiatis
    if accepted:
137 cb6b8c79 Giorgos Korfiatis
        d['accepted members'] = ', '.join(accepted)
138 cb6b8c79 Giorgos Korfiatis
139 cb6b8c79 Giorgos Korfiatis
    if suspended:
140 cb6b8c79 Giorgos Korfiatis
        d['suspended members'] = ', '.join(suspended)
141 cb6b8c79 Giorgos Korfiatis
142 cb6b8c79 Giorgos Korfiatis
    if requested:
143 cb6b8c79 Giorgos Korfiatis
        d['membership requests'] = ', '.join(requested)
144 cb6b8c79 Giorgos Korfiatis
145 cb6b8c79 Giorgos Korfiatis
    return d
146 cb6b8c79 Giorgos Korfiatis
147 cb6b8c79 Giorgos Korfiatis
148 cb6b8c79 Giorgos Korfiatis
def app_info(name_or_id, is_id):
149 cb6b8c79 Giorgos Korfiatis
    try:
150 cb6b8c79 Giorgos Korfiatis
        apps = ([ProjectApplication.objects.get(id=name_or_id)]
151 cb6b8c79 Giorgos Korfiatis
                if is_id
152 cb6b8c79 Giorgos Korfiatis
                else ProjectApplication.objects.search_by_name(name_or_id))
153 cb6b8c79 Giorgos Korfiatis
        return [app_fields(app) for app in apps]
154 cb6b8c79 Giorgos Korfiatis
    except ProjectApplication.DoesNotExist:
155 cb6b8c79 Giorgos Korfiatis
            return []
156 cb6b8c79 Giorgos Korfiatis
157 cb6b8c79 Giorgos Korfiatis
158 cb6b8c79 Giorgos Korfiatis
def project_info(name_or_id, is_id):
159 cb6b8c79 Giorgos Korfiatis
    try:
160 cb6b8c79 Giorgos Korfiatis
        projects = ([Project.objects.get(id=name_or_id)]
161 cb6b8c79 Giorgos Korfiatis
                    if is_id
162 cb6b8c79 Giorgos Korfiatis
                    else Project.objects.search_by_name(name_or_id))
163 cb6b8c79 Giorgos Korfiatis
        return [project_fields(project) for project in projects]
164 cb6b8c79 Giorgos Korfiatis
    except Project.DoesNotExist:
165 cb6b8c79 Giorgos Korfiatis
        return []