Statistics
| Branch: | Tag: | Revision:

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

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 0de7c5a7 Giorgos Korfiatis
from snf_django.management.commands import ListCommand
37 ccab6eb5 Sofia Papagiannaki
38 362dadaa Giorgos Korfiatis
from astakos.im.models import Project, ProjectApplication
39 0de7c5a7 Giorgos Korfiatis
from ._common import is_uuid
40 7eabbd72 Giorgos Korfiatis
41 ccab6eb5 Sofia Papagiannaki
42 0de7c5a7 Giorgos Korfiatis
class Command(ListCommand):
43 44aa52fd Giorgos Korfiatis
    help = """List projects and project status.
44 5ed5f9e6 Giorgos Korfiatis

45 5ed5f9e6 Giorgos Korfiatis
    Project status can be one of:
46 362dadaa Giorgos Korfiatis
      Uninitialized        an uninitialized project,
47 362dadaa Giorgos Korfiatis
                           with no pending application
48 362dadaa Giorgos Korfiatis

49 44aa52fd Giorgos Korfiatis
      Pending              an uninitialized project, pending review
50 5ed5f9e6 Giorgos Korfiatis

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

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

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

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

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

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

65 362dadaa Giorgos Korfiatis
      Deleted              an uninitialized, deleted project"""
66 ccab6eb5 Sofia Papagiannaki
67 0de7c5a7 Giorgos Korfiatis
    object_class = Project
68 0de7c5a7 Giorgos Korfiatis
    select_related = ["last_application", "owner"]
69 0de7c5a7 Giorgos Korfiatis
70 0de7c5a7 Giorgos Korfiatis
    option_list = ListCommand.option_list + (
71 f557d10a Giorgos Korfiatis
        make_option('--new',
72 f557d10a Giorgos Korfiatis
                    action='store_true',
73 f557d10a Giorgos Korfiatis
                    dest='new',
74 f557d10a Giorgos Korfiatis
                    default=False,
75 44aa52fd Giorgos Korfiatis
                    help="List only new pending uninitialized projects"),
76 f557d10a Giorgos Korfiatis
        make_option('--modified',
77 f557d10a Giorgos Korfiatis
                    action='store_true',
78 f557d10a Giorgos Korfiatis
                    dest='modified',
79 f557d10a Giorgos Korfiatis
                    default=False,
80 f557d10a Giorgos Korfiatis
                    help="List only projects with pending modification"),
81 f557d10a Giorgos Korfiatis
        make_option('--pending',
82 f557d10a Giorgos Korfiatis
                    action='store_true',
83 f557d10a Giorgos Korfiatis
                    dest='pending',
84 f557d10a Giorgos Korfiatis
                    default=False,
85 f557d10a Giorgos Korfiatis
                    help=("Show only projects with a pending application "
86 f557d10a Giorgos Korfiatis
                          "(equiv. --modified --new)")),
87 362dadaa Giorgos Korfiatis
        make_option('--deleted',
88 47fbfc1c Giorgos Korfiatis
                    action='store_true',
89 362dadaa Giorgos Korfiatis
                    dest='deleted',
90 47fbfc1c Giorgos Korfiatis
                    default=False,
91 c2a78208 Giorgos Korfiatis
                    help="Also show cancelled/terminated projects"),
92 c2a78208 Giorgos Korfiatis
        make_option('--base-projects',
93 c2a78208 Giorgos Korfiatis
                    action='store_true',
94 c2a78208 Giorgos Korfiatis
                    default=False,
95 c2a78208 Giorgos Korfiatis
                    help="Also show base projects"),
96 865849d7 Giorgos Korfiatis
    )
97 ccab6eb5 Sofia Papagiannaki
98 0de7c5a7 Giorgos Korfiatis
    def get_owner(project):
99 0de7c5a7 Giorgos Korfiatis
        return project.owner.email if project.owner else None
100 67cf14bf Giorgos Korfiatis
101 0de7c5a7 Giorgos Korfiatis
    def get_status(project):
102 0de7c5a7 Giorgos Korfiatis
        return project.state_display()
103 67cf14bf Giorgos Korfiatis
104 0de7c5a7 Giorgos Korfiatis
    def get_pending_app(project):
105 0de7c5a7 Giorgos Korfiatis
        app = project.last_application
106 0de7c5a7 Giorgos Korfiatis
        return app.id if app and app.state == app.PENDING else ""
107 0de7c5a7 Giorgos Korfiatis
108 0de7c5a7 Giorgos Korfiatis
    FIELDS = {
109 0de7c5a7 Giorgos Korfiatis
        "id": ("uuid", "Project ID"),
110 0de7c5a7 Giorgos Korfiatis
        "name": ("realname", "Project Name"),
111 0de7c5a7 Giorgos Korfiatis
        "owner": (get_owner, "Project Owner"),
112 0de7c5a7 Giorgos Korfiatis
        "status": (get_status, "Project Status"),
113 0de7c5a7 Giorgos Korfiatis
        "pending_app": (get_pending_app,
114 0de7c5a7 Giorgos Korfiatis
                        "An application pending for the project"),
115 0de7c5a7 Giorgos Korfiatis
    }
116 0de7c5a7 Giorgos Korfiatis
117 0de7c5a7 Giorgos Korfiatis
    fields = ["id", "name", "owner", "status", "pending_app"]
118 0de7c5a7 Giorgos Korfiatis
119 0de7c5a7 Giorgos Korfiatis
    def handle_args(self, *args, **options):
120 0de7c5a7 Giorgos Korfiatis
        try:
121 0de7c5a7 Giorgos Korfiatis
            name_filter = self.filters.pop("name")
122 0de7c5a7 Giorgos Korfiatis
            self.filters["realname"] = name_filter
123 0de7c5a7 Giorgos Korfiatis
        except KeyError:
124 0de7c5a7 Giorgos Korfiatis
            pass
125 0de7c5a7 Giorgos Korfiatis
126 0de7c5a7 Giorgos Korfiatis
        try:
127 0de7c5a7 Giorgos Korfiatis
            owner_filter = self.filters.pop("owner")
128 0de7c5a7 Giorgos Korfiatis
            if owner_filter is not None:
129 0de7c5a7 Giorgos Korfiatis
                if is_uuid(owner_filter):
130 0de7c5a7 Giorgos Korfiatis
                    self.filters["owner__uuid"] = owner_filter
131 0de7c5a7 Giorgos Korfiatis
                else:
132 0de7c5a7 Giorgos Korfiatis
                    self.filters["owner__email"] = owner_filter
133 0de7c5a7 Giorgos Korfiatis
        except KeyError:
134 0de7c5a7 Giorgos Korfiatis
            pass
135 67cf14bf Giorgos Korfiatis
136 362dadaa Giorgos Korfiatis
        if not options['deleted']:
137 0de7c5a7 Giorgos Korfiatis
            self.excludes["state__in"] = Project.SKIP_STATES
138 6d583e07 Giorgos Korfiatis
139 c2a78208 Giorgos Korfiatis
        if not options['base_projects']:
140 c2a78208 Giorgos Korfiatis
            self.excludes["is_base"] = True
141 c2a78208 Giorgos Korfiatis
142 0de7c5a7 Giorgos Korfiatis
        if options["pending"]:
143 0de7c5a7 Giorgos Korfiatis
            self.filter_pending()
144 362dadaa Giorgos Korfiatis
        else:
145 362dadaa Giorgos Korfiatis
            if options['new']:
146 0de7c5a7 Giorgos Korfiatis
                self.filter_pending()
147 0de7c5a7 Giorgos Korfiatis
                self.filters["state"] = Project.UNINITIALIZED
148 362dadaa Giorgos Korfiatis
            if options['modified']:
149 0de7c5a7 Giorgos Korfiatis
                self.filter_pending()
150 0de7c5a7 Giorgos Korfiatis
                self.filters["state__in"] = Project.INITIALIZED_STATES
151 6d583e07 Giorgos Korfiatis
152 0de7c5a7 Giorgos Korfiatis
    def filter_pending(self):
153 0de7c5a7 Giorgos Korfiatis
        self.filters["last_application__state"] = ProjectApplication.PENDING