Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.5 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 362dadaa Giorgos Korfiatis
from astakos.im.models import Project, ProjectApplication
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 362dadaa Giorgos Korfiatis
      Uninitialized        an uninitialized project,
49 362dadaa Giorgos Korfiatis
                           with no pending application
50 362dadaa Giorgos Korfiatis

51 44aa52fd Giorgos Korfiatis
      Pending              an uninitialized project, pending review
52 5ed5f9e6 Giorgos Korfiatis

53 5ed5f9e6 Giorgos Korfiatis
      Active               an active project
54 5ed5f9e6 Giorgos Korfiatis

55 44aa52fd Giorgos Korfiatis
      Denied               an uninitialized project, denied by the admin
56 5ed5f9e6 Giorgos Korfiatis

57 5ed5f9e6 Giorgos Korfiatis
      Dismissed            a denied project, dismissed by the applicant
58 5ed5f9e6 Giorgos Korfiatis

59 44aa52fd Giorgos Korfiatis
      Cancelled            an uninitialized project, cancelled by the applicant
60 5ed5f9e6 Giorgos Korfiatis

61 5ed5f9e6 Giorgos Korfiatis
      Suspended            a project suspended by the admin;
62 5ed5f9e6 Giorgos Korfiatis
                           it can later be resumed
63 5ed5f9e6 Giorgos Korfiatis

64 5ed5f9e6 Giorgos Korfiatis
      Terminated           a terminated project; its name can be claimed
65 362dadaa Giorgos Korfiatis
                           by a new project
66 362dadaa Giorgos Korfiatis

67 362dadaa Giorgos Korfiatis
      Deleted              an uninitialized, deleted project"""
68 ccab6eb5 Sofia Papagiannaki
69 67cf14bf Giorgos Korfiatis
    option_list = SynnefoCommand.option_list + (
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 362dadaa Giorgos Korfiatis
        make_option('--deleted',
87 47fbfc1c Giorgos Korfiatis
                    action='store_true',
88 362dadaa Giorgos Korfiatis
                    dest='deleted',
89 47fbfc1c Giorgos Korfiatis
                    default=False,
90 362dadaa Giorgos Korfiatis
                    help="Also so cancelled/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 362dadaa Giorgos Korfiatis
            flt &= Q(realname=name)
109 67cf14bf Giorgos Korfiatis
110 362dadaa Giorgos Korfiatis
        if not options['deleted']:
111 362dadaa Giorgos Korfiatis
            flt &= ~Q(state__in=Project.SKIP_STATES)
112 67cf14bf Giorgos Korfiatis
113 362dadaa Giorgos Korfiatis
        pending = Q(last_application__isnull=False,
114 362dadaa Giorgos Korfiatis
                    last_application__state=ProjectApplication.PENDING)
115 6d583e07 Giorgos Korfiatis
116 362dadaa Giorgos Korfiatis
        if options['pending']:
117 362dadaa Giorgos Korfiatis
            flt &= pending
118 362dadaa Giorgos Korfiatis
        else:
119 362dadaa Giorgos Korfiatis
            if options['new']:
120 362dadaa Giorgos Korfiatis
                flt &= pending & Q(state=Project.UNINITIALIZED)
121 362dadaa Giorgos Korfiatis
            if options['modified']:
122 362dadaa Giorgos Korfiatis
                flt &= pending & Q(state__in=Project.INITIALIZED_STATES)
123 6d583e07 Giorgos Korfiatis
124 362dadaa Giorgos Korfiatis
        projects = Project.objects.\
125 362dadaa Giorgos Korfiatis
            select_related("last_application", "owner").filter(flt)
126 6d583e07 Giorgos Korfiatis
127 88f5242e Giorgos Korfiatis
        labels = ('ProjID', 'Name', 'Owner', 'Status', 'Pending AppID')
128 6d583e07 Giorgos Korfiatis
129 362dadaa Giorgos Korfiatis
        info = project_info(projects)
130 67cf14bf Giorgos Korfiatis
        utils.pprint_table(self.stdout, info, labels,
131 67cf14bf Giorgos Korfiatis
                           options["output_format"])
132 67cf14bf Giorgos Korfiatis
133 67cf14bf Giorgos Korfiatis
134 6d583e07 Giorgos Korfiatis
def filter_by_owner(s):
135 6d583e07 Giorgos Korfiatis
    if is_email(s):
136 362dadaa Giorgos Korfiatis
        return Q(owner__email=s)
137 6d583e07 Giorgos Korfiatis
    if is_uuid(s):
138 362dadaa Giorgos Korfiatis
        return Q(owner__uuid=s)
139 6d583e07 Giorgos Korfiatis
    raise CommandError("Expecting either email or uuid.")
140 67cf14bf Giorgos Korfiatis
141 67cf14bf Giorgos Korfiatis
142 362dadaa Giorgos Korfiatis
def project_info(projects):
143 67cf14bf Giorgos Korfiatis
    l = []
144 362dadaa Giorgos Korfiatis
    for project in projects:
145 6d583e07 Giorgos Korfiatis
        status = project.state_display()
146 362dadaa Giorgos Korfiatis
        app = project.last_application
147 362dadaa Giorgos Korfiatis
        pending_appid = app.id if app and app.state == app.PENDING else ""
148 6d583e07 Giorgos Korfiatis
149 88f5242e Giorgos Korfiatis
        t = (project.uuid,
150 362dadaa Giorgos Korfiatis
             project.realname,
151 362dadaa Giorgos Korfiatis
             project.owner.email if project.owner else None,
152 67cf14bf Giorgos Korfiatis
             status,
153 6d583e07 Giorgos Korfiatis
             pending_appid,
154 67cf14bf Giorgos Korfiatis
             )
155 67cf14bf Giorgos Korfiatis
        l.append(t)
156 67cf14bf Giorgos Korfiatis
    return l