Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / project-control.py @ 4220c336

History | View | Annotate | Download (5.6 kB)

1 f557d10a Giorgos Korfiatis
# Copyright 2012, 2013 GRNET S.A. All rights reserved.
2 7eadc230 Giorgos Korfiatis
#
3 7eadc230 Giorgos Korfiatis
# Redistribution and use in source and binary forms, with or
4 7eadc230 Giorgos Korfiatis
# without modification, are permitted provided that the following
5 7eadc230 Giorgos Korfiatis
# conditions are met:
6 7eadc230 Giorgos Korfiatis
#
7 7eadc230 Giorgos Korfiatis
#   1. Redistributions of source code must retain the above
8 7eadc230 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
9 7eadc230 Giorgos Korfiatis
#      disclaimer.
10 7eadc230 Giorgos Korfiatis
#
11 7eadc230 Giorgos Korfiatis
#   2. Redistributions in binary form must reproduce the above
12 7eadc230 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
13 7eadc230 Giorgos Korfiatis
#      disclaimer in the documentation and/or other materials
14 7eadc230 Giorgos Korfiatis
#      provided with the distribution.
15 7eadc230 Giorgos Korfiatis
#
16 7eadc230 Giorgos Korfiatis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 7eadc230 Giorgos Korfiatis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 7eadc230 Giorgos Korfiatis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 7eadc230 Giorgos Korfiatis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 7eadc230 Giorgos Korfiatis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 7eadc230 Giorgos Korfiatis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 7eadc230 Giorgos Korfiatis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 7eadc230 Giorgos Korfiatis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 7eadc230 Giorgos Korfiatis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 7eadc230 Giorgos Korfiatis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 7eadc230 Giorgos Korfiatis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 7eadc230 Giorgos Korfiatis
# POSSIBILITY OF SUCH DAMAGE.
28 7eadc230 Giorgos Korfiatis
#
29 7eadc230 Giorgos Korfiatis
# The views and conclusions contained in the software and
30 7eadc230 Giorgos Korfiatis
# documentation are those of the authors and should not be
31 7eadc230 Giorgos Korfiatis
# interpreted as representing official policies, either expressed
32 7eadc230 Giorgos Korfiatis
# or implied, of GRNET S.A.
33 7eadc230 Giorgos Korfiatis
34 7eadc230 Giorgos Korfiatis
from optparse import make_option
35 7eadc230 Giorgos Korfiatis
36 a3e3917f Giorgos Korfiatis
from django.db import transaction
37 f557d10a Giorgos Korfiatis
from django.core.management.base import BaseCommand, CommandError
38 e872c133 Giorgos Korfiatis
from astakos.im.functions import (terminate, suspend, unsuspend,
39 e872c133 Giorgos Korfiatis
                                  reinstate, check_expiration,
40 f557d10a Giorgos Korfiatis
                                  approve_application, deny_application)
41 7eadc230 Giorgos Korfiatis
42 f557d10a Giorgos Korfiatis
43 7eadc230 Giorgos Korfiatis
class Command(BaseCommand):
44 f557d10a Giorgos Korfiatis
    help = "Manage projects and applications"
45 7eadc230 Giorgos Korfiatis
46 7eadc230 Giorgos Korfiatis
    option_list = BaseCommand.option_list + (
47 f557d10a Giorgos Korfiatis
        make_option('--approve',
48 f557d10a Giorgos Korfiatis
                    dest='approve',
49 f557d10a Giorgos Korfiatis
                    metavar='<application id>',
50 f557d10a Giorgos Korfiatis
                    help="Approve a project application"),
51 f557d10a Giorgos Korfiatis
        make_option('--deny',
52 f557d10a Giorgos Korfiatis
                    dest='deny',
53 f557d10a Giorgos Korfiatis
                    metavar='<application id>',
54 f557d10a Giorgos Korfiatis
                    help="Deny a project application"),
55 f557d10a Giorgos Korfiatis
        make_option('--terminate',
56 f557d10a Giorgos Korfiatis
                    dest='terminate',
57 f557d10a Giorgos Korfiatis
                    metavar='<project id>',
58 f557d10a Giorgos Korfiatis
                    help="Terminate a project"),
59 f557d10a Giorgos Korfiatis
        make_option('--suspend',
60 f557d10a Giorgos Korfiatis
                    dest='suspend',
61 f557d10a Giorgos Korfiatis
                    metavar='<project id>',
62 f557d10a Giorgos Korfiatis
                    help="Suspend a project"),
63 f557d10a Giorgos Korfiatis
        make_option('--unsuspend',
64 e872c133 Giorgos Korfiatis
                    dest='unsuspend',
65 f557d10a Giorgos Korfiatis
                    metavar='<project id>',
66 f557d10a Giorgos Korfiatis
                    help="Resume a suspended project"),
67 e872c133 Giorgos Korfiatis
        make_option('--reinstate',
68 e872c133 Giorgos Korfiatis
                    dest='reinstate',
69 e872c133 Giorgos Korfiatis
                    metavar='<project id>',
70 e872c133 Giorgos Korfiatis
                    help=("Resume a terminated project; this will fail if its "
71 e872c133 Giorgos Korfiatis
                          "name has been reserved by another project")),
72 c69462a4 Giorgos Korfiatis
        make_option('--check-expired',
73 7eadc230 Giorgos Korfiatis
                    action='store_true',
74 f557d10a Giorgos Korfiatis
                    dest='check_expired',
75 7eadc230 Giorgos Korfiatis
                    default=False,
76 7eadc230 Giorgos Korfiatis
                    help="Check projects for expiration"),
77 f557d10a Giorgos Korfiatis
        make_option('--terminate-expired',
78 7eadc230 Giorgos Korfiatis
                    action='store_true',
79 f557d10a Giorgos Korfiatis
                    dest='terminate_expired',
80 7eadc230 Giorgos Korfiatis
                    default=False,
81 f557d10a Giorgos Korfiatis
                    help="Terminate all expired projects"),
82 2b745492 Giorgos Korfiatis
        make_option('--message', '-m',
83 2b745492 Giorgos Korfiatis
                    dest='message',
84 2b745492 Giorgos Korfiatis
                    metavar='<msg>',
85 2b745492 Giorgos Korfiatis
                    help=("Specify reason of action, "
86 2b745492 Giorgos Korfiatis
                          "e.g. when denying a project")),
87 7eadc230 Giorgos Korfiatis
    )
88 7eadc230 Giorgos Korfiatis
89 a3e3917f Giorgos Korfiatis
    @transaction.commit_on_success
90 f557d10a Giorgos Korfiatis
    def handle(self, *args, **options):
91 f557d10a Giorgos Korfiatis
92 2b745492 Giorgos Korfiatis
        message = options['message']
93 2b745492 Giorgos Korfiatis
94 7bffb44b Giorgos Korfiatis
        actions = {
95 7bffb44b Giorgos Korfiatis
            'terminate': terminate,
96 e872c133 Giorgos Korfiatis
            'reinstate': reinstate,
97 e872c133 Giorgos Korfiatis
            'unsuspend': unsuspend,
98 7bffb44b Giorgos Korfiatis
            'suspend': suspend,
99 7bffb44b Giorgos Korfiatis
            'approve': approve_application,
100 7bffb44b Giorgos Korfiatis
            'deny': lambda a: deny_application(a, reason=message),
101 7bffb44b Giorgos Korfiatis
            'check_expired': lambda _: self.expire(execute=False),
102 7bffb44b Giorgos Korfiatis
            'terminate_expired': lambda _: self.expire(execute=True),
103 7bffb44b Giorgos Korfiatis
        }
104 7bffb44b Giorgos Korfiatis
105 7bffb44b Giorgos Korfiatis
        opts = [(key, value)
106 7bffb44b Giorgos Korfiatis
                for (key, value) in options.items()
107 7bffb44b Giorgos Korfiatis
                if key in actions and value]
108 7bffb44b Giorgos Korfiatis
109 7bffb44b Giorgos Korfiatis
        if len(opts) != 1:
110 7bffb44b Giorgos Korfiatis
            raise CommandError("Specify exactly one operation.")
111 7bffb44b Giorgos Korfiatis
112 7bffb44b Giorgos Korfiatis
        key, value = opts[0]
113 7bffb44b Giorgos Korfiatis
        action = actions[key]
114 7bffb44b Giorgos Korfiatis
        try:
115 7bffb44b Giorgos Korfiatis
            action(value)
116 7bffb44b Giorgos Korfiatis
        except BaseException as e:
117 7bffb44b Giorgos Korfiatis
            raise CommandError(e)
118 7eadc230 Giorgos Korfiatis
119 7eadc230 Giorgos Korfiatis
    def print_expired(self, projects, execute):
120 7eadc230 Giorgos Korfiatis
        length = len(projects)
121 7eadc230 Giorgos Korfiatis
        if length == 0:
122 7eadc230 Giorgos Korfiatis
            s = 'No expired projects.\n'
123 7eadc230 Giorgos Korfiatis
        elif length == 1:
124 7eadc230 Giorgos Korfiatis
            s = '1 expired project:\n'
125 7eadc230 Giorgos Korfiatis
        else:
126 f557d10a Giorgos Korfiatis
            s = '%d expired projects:\n' % (length,)
127 4220c336 Giorgos Korfiatis
        self.stderr.write(s)
128 7eadc230 Giorgos Korfiatis
129 7eadc230 Giorgos Korfiatis
        if length > 0:
130 7eadc230 Giorgos Korfiatis
            labels = ('Project', 'Name', 'Status', 'Expiration date')
131 7eadc230 Giorgos Korfiatis
            columns = (10, 30, 14, 30)
132 7eadc230 Giorgos Korfiatis
133 7eadc230 Giorgos Korfiatis
            line = ' '.join(l.rjust(w) for l, w in zip(labels, columns))
134 4220c336 Giorgos Korfiatis
            self.stderr.write(line + '\n')
135 7eadc230 Giorgos Korfiatis
            sep = '-' * len(line)
136 4220c336 Giorgos Korfiatis
            self.stderr.write(sep + '\n')
137 7eadc230 Giorgos Korfiatis
138 7eadc230 Giorgos Korfiatis
            for project in projects:
139 7eadc230 Giorgos Korfiatis
                line = ' '.join(f.rjust(w) for f, w in zip(project, columns))
140 4220c336 Giorgos Korfiatis
                self.stderr.write(line + '\n')
141 7eadc230 Giorgos Korfiatis
142 7eadc230 Giorgos Korfiatis
            if execute:
143 4220c336 Giorgos Korfiatis
                self.stderr.write('%d projects have been terminated.\n' % (
144 f557d10a Giorgos Korfiatis
                    length,))
145 7eadc230 Giorgos Korfiatis
146 9e812adf Giorgos Korfiatis
    def expire(self, execute=False):
147 7bffb44b Giorgos Korfiatis
        projects = check_expiration(execute=execute)
148 7bffb44b Giorgos Korfiatis
        self.print_expired(projects, execute)