Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / project-list.py @ c94dcec3

History | View | Annotate | Download (5.9 kB)

1 47fbfc1c Giorgos Korfiatis
# Copyright 2012-2013 GRNET S.A. All rights reserved.
2 2a965273 Sofia Papagiannaki
#
3 2a965273 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
4 2a965273 Sofia Papagiannaki
# without modification, are permitted provided that the following
5 2a965273 Sofia Papagiannaki
# conditions are met:
6 2a965273 Sofia Papagiannaki
#
7 2a965273 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
8 2a965273 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
9 2a965273 Sofia Papagiannaki
#      disclaimer.
10 2a965273 Sofia Papagiannaki
#
11 2a965273 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
12 2a965273 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
13 2a965273 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
14 2a965273 Sofia Papagiannaki
#      provided with the distribution.
15 2a965273 Sofia Papagiannaki
#
16 2a965273 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 2a965273 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 2a965273 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 2a965273 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 2a965273 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 2a965273 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 2a965273 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 2a965273 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 2a965273 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 2a965273 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 2a965273 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 2a965273 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
28 2a965273 Sofia Papagiannaki
#
29 2a965273 Sofia Papagiannaki
# The views and conclusions contained in the software and
30 2a965273 Sofia Papagiannaki
# documentation are those of the authors and should not be
31 2a965273 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
32 2a965273 Sofia Papagiannaki
# or implied, of GRNET S.A.
33 2a965273 Sofia Papagiannaki
34 2a965273 Sofia Papagiannaki
from optparse import make_option
35 2a965273 Sofia Papagiannaki
36 7cfc0cef Christos Stavrakakis
from snf_django.management.commands import SynnefoCommand, CommandError
37 ccab6eb5 Sofia Papagiannaki
38 6d583e07 Giorgos Korfiatis
from astakos.im.models import Project
39 6d583e07 Giorgos Korfiatis
from django.db.models import Q
40 d758784b Christos Stavrakakis
from snf_django.management import utils
41 67cf14bf Giorgos Korfiatis
from ._common import is_uuid, is_email
42 7eabbd72 Giorgos Korfiatis
43 ccab6eb5 Sofia Papagiannaki
44 67cf14bf Giorgos Korfiatis
class Command(SynnefoCommand):
45 44aa52fd Giorgos Korfiatis
    help = """List projects and project status.
46 5ed5f9e6 Giorgos Korfiatis

47 5ed5f9e6 Giorgos Korfiatis
    Project status can be one of:
48 44aa52fd Giorgos Korfiatis
      Pending              an uninitialized project, pending review
49 5ed5f9e6 Giorgos Korfiatis

50 5ed5f9e6 Giorgos Korfiatis
      Active               an active project
51 5ed5f9e6 Giorgos Korfiatis

52 44aa52fd Giorgos Korfiatis
      Denied               an uninitialized project, denied by the admin
53 5ed5f9e6 Giorgos Korfiatis

54 5ed5f9e6 Giorgos Korfiatis
      Dismissed            a denied project, dismissed by the applicant
55 5ed5f9e6 Giorgos Korfiatis

56 44aa52fd Giorgos Korfiatis
      Cancelled            an uninitialized project, cancelled by the applicant
57 5ed5f9e6 Giorgos Korfiatis

58 5ed5f9e6 Giorgos Korfiatis
      Suspended            a project suspended by the admin;
59 5ed5f9e6 Giorgos Korfiatis
                           it can later be resumed
60 5ed5f9e6 Giorgos Korfiatis

61 5ed5f9e6 Giorgos Korfiatis
      Terminated           a terminated project; its name can be claimed
62 44aa52fd Giorgos Korfiatis
                           by a new project"""
63 ccab6eb5 Sofia Papagiannaki
64 67cf14bf Giorgos Korfiatis
    option_list = SynnefoCommand.option_list + (
65 f557d10a Giorgos Korfiatis
        make_option('--all',
66 ccab6eb5 Sofia Papagiannaki
                    action='store_true',
67 f557d10a Giorgos Korfiatis
                    dest='all',
68 ccab6eb5 Sofia Papagiannaki
                    default=False,
69 f557d10a Giorgos Korfiatis
                    help="List all projects (default)"),
70 f557d10a Giorgos Korfiatis
        make_option('--new',
71 f557d10a Giorgos Korfiatis
                    action='store_true',
72 f557d10a Giorgos Korfiatis
                    dest='new',
73 f557d10a Giorgos Korfiatis
                    default=False,
74 44aa52fd Giorgos Korfiatis
                    help="List only new pending uninitialized projects"),
75 f557d10a Giorgos Korfiatis
        make_option('--modified',
76 f557d10a Giorgos Korfiatis
                    action='store_true',
77 f557d10a Giorgos Korfiatis
                    dest='modified',
78 f557d10a Giorgos Korfiatis
                    default=False,
79 f557d10a Giorgos Korfiatis
                    help="List only projects with pending modification"),
80 f557d10a Giorgos Korfiatis
        make_option('--pending',
81 f557d10a Giorgos Korfiatis
                    action='store_true',
82 f557d10a Giorgos Korfiatis
                    dest='pending',
83 f557d10a Giorgos Korfiatis
                    default=False,
84 f557d10a Giorgos Korfiatis
                    help=("Show only projects with a pending application "
85 f557d10a Giorgos Korfiatis
                          "(equiv. --modified --new)")),
86 47fbfc1c Giorgos Korfiatis
        make_option('--skip',
87 47fbfc1c Giorgos Korfiatis
                    action='store_true',
88 47fbfc1c Giorgos Korfiatis
                    dest='skip',
89 47fbfc1c Giorgos Korfiatis
                    default=False,
90 47fbfc1c Giorgos Korfiatis
                    help="Skip cancelled and terminated projects"),
91 67cf14bf Giorgos Korfiatis
        make_option('--name',
92 67cf14bf Giorgos Korfiatis
                    dest='name',
93 67cf14bf Giorgos Korfiatis
                    help='Filter projects by name'),
94 67cf14bf Giorgos Korfiatis
        make_option('--owner',
95 67cf14bf Giorgos Korfiatis
                    dest='owner',
96 67cf14bf Giorgos Korfiatis
                    help='Filter projects by owner\'s email or uuid'),
97 865849d7 Giorgos Korfiatis
    )
98 ccab6eb5 Sofia Papagiannaki
99 67cf14bf Giorgos Korfiatis
    def handle(self, *args, **options):
100 67cf14bf Giorgos Korfiatis
101 6d583e07 Giorgos Korfiatis
        flt = Q()
102 6d583e07 Giorgos Korfiatis
        owner = options['owner']
103 6d583e07 Giorgos Korfiatis
        if owner:
104 6d583e07 Giorgos Korfiatis
            flt &= filter_by_owner(owner)
105 67cf14bf Giorgos Korfiatis
106 6d583e07 Giorgos Korfiatis
        name = options['name']
107 6d583e07 Giorgos Korfiatis
        if name:
108 6d583e07 Giorgos Korfiatis
            flt &= filter_by_name(name)
109 67cf14bf Giorgos Korfiatis
110 6d583e07 Giorgos Korfiatis
        chains = Project.objects.all_with_pending(flt)
111 67cf14bf Giorgos Korfiatis
112 6d583e07 Giorgos Korfiatis
        if not options['all']:
113 6d583e07 Giorgos Korfiatis
            if options['skip']:
114 6d583e07 Giorgos Korfiatis
                pred = lambda c: (
115 6d583e07 Giorgos Korfiatis
                    c[0].overall_state() not in Project.SKIP_STATES
116 6d583e07 Giorgos Korfiatis
                    or c[1] is not None)
117 6d583e07 Giorgos Korfiatis
                chains = filter_preds([pred], chains)
118 6d583e07 Giorgos Korfiatis
119 6d583e07 Giorgos Korfiatis
            preds = []
120 6d583e07 Giorgos Korfiatis
            if options['new'] or options['pending']:
121 6d583e07 Giorgos Korfiatis
                preds.append(
122 6d583e07 Giorgos Korfiatis
                    lambda c: c[0].overall_state() == Project.O_PENDING)
123 6d583e07 Giorgos Korfiatis
            if options['modified'] or options['pending']:
124 6d583e07 Giorgos Korfiatis
                preds.append(
125 6d583e07 Giorgos Korfiatis
                    lambda c: c[0].overall_state() != Project.O_PENDING
126 6d583e07 Giorgos Korfiatis
                    and c[1] is not None)
127 6d583e07 Giorgos Korfiatis
128 6d583e07 Giorgos Korfiatis
            if preds:
129 6d583e07 Giorgos Korfiatis
                chains = filter_preds(preds, chains)
130 6d583e07 Giorgos Korfiatis
131 6d583e07 Giorgos Korfiatis
        labels = ('ProjID', 'Name', 'Owner', 'Email', 'Status',
132 6d583e07 Giorgos Korfiatis
                  'Pending AppID')
133 6d583e07 Giorgos Korfiatis
134 6d583e07 Giorgos Korfiatis
        info = chain_info(chains)
135 67cf14bf Giorgos Korfiatis
        utils.pprint_table(self.stdout, info, labels,
136 67cf14bf Giorgos Korfiatis
                           options["output_format"])
137 67cf14bf Giorgos Korfiatis
138 67cf14bf Giorgos Korfiatis
139 6d583e07 Giorgos Korfiatis
def filter_preds(preds, chains):
140 6d583e07 Giorgos Korfiatis
    return [c for c in chains
141 6d583e07 Giorgos Korfiatis
            if any(map(lambda f: f(c), preds))]
142 67cf14bf Giorgos Korfiatis
143 67cf14bf Giorgos Korfiatis
144 6d583e07 Giorgos Korfiatis
def filter_by_name(name):
145 6d583e07 Giorgos Korfiatis
    return Q(application__name=name)
146 67cf14bf Giorgos Korfiatis
147 67cf14bf Giorgos Korfiatis
148 6d583e07 Giorgos Korfiatis
def filter_by_owner(s):
149 6d583e07 Giorgos Korfiatis
    if is_email(s):
150 6d583e07 Giorgos Korfiatis
        return Q(application__owner__email=s)
151 6d583e07 Giorgos Korfiatis
    if is_uuid(s):
152 6d583e07 Giorgos Korfiatis
        return Q(application__owner__uuid=s)
153 6d583e07 Giorgos Korfiatis
    raise CommandError("Expecting either email or uuid.")
154 67cf14bf Giorgos Korfiatis
155 67cf14bf Giorgos Korfiatis
156 6d583e07 Giorgos Korfiatis
def chain_info(chains):
157 67cf14bf Giorgos Korfiatis
    l = []
158 6d583e07 Giorgos Korfiatis
    for project, pending_app in chains:
159 6d583e07 Giorgos Korfiatis
        status = project.state_display()
160 6d583e07 Giorgos Korfiatis
        pending_appid = pending_app.id if pending_app is not None else ""
161 6d583e07 Giorgos Korfiatis
        application = project.application
162 6d583e07 Giorgos Korfiatis
163 6d583e07 Giorgos Korfiatis
        t = (project.pk,
164 6d583e07 Giorgos Korfiatis
             application.name,
165 6d583e07 Giorgos Korfiatis
             application.owner.realname,
166 6d583e07 Giorgos Korfiatis
             application.owner.email,
167 67cf14bf Giorgos Korfiatis
             status,
168 6d583e07 Giorgos Korfiatis
             pending_appid,
169 67cf14bf Giorgos Korfiatis
             )
170 67cf14bf Giorgos Korfiatis
        l.append(t)
171 67cf14bf Giorgos Korfiatis
    return l