root / snf-astakos-app / astakos / im / management / commands / project-modify.py @ a6d167c1
History | View | Annotate | Download (6.8 kB)
1 | 5dc97d69 | Giorgos Korfiatis | # Copyright 2013 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 5dc97d69 | Giorgos Korfiatis | #
|
3 | 5dc97d69 | Giorgos Korfiatis | # Redistribution and use in source and binary forms, with or
|
4 | 5dc97d69 | Giorgos Korfiatis | # without modification, are permitted provided that the following
|
5 | 5dc97d69 | Giorgos Korfiatis | # conditions are met:
|
6 | 5dc97d69 | Giorgos Korfiatis | #
|
7 | 5dc97d69 | Giorgos Korfiatis | # 1. Redistributions of source code must retain the above
|
8 | 5dc97d69 | Giorgos Korfiatis | # copyright notice, this list of conditions and the following
|
9 | 5dc97d69 | Giorgos Korfiatis | # disclaimer.
|
10 | 5dc97d69 | Giorgos Korfiatis | #
|
11 | 5dc97d69 | Giorgos Korfiatis | # 2. Redistributions in binary form must reproduce the above
|
12 | 5dc97d69 | Giorgos Korfiatis | # copyright notice, this list of conditions and the following
|
13 | 5dc97d69 | Giorgos Korfiatis | # disclaimer in the documentation and/or other materials
|
14 | 5dc97d69 | Giorgos Korfiatis | # provided with the distribution.
|
15 | 5dc97d69 | Giorgos Korfiatis | #
|
16 | 5dc97d69 | Giorgos Korfiatis | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 5dc97d69 | Giorgos Korfiatis | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 5dc97d69 | Giorgos Korfiatis | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 5dc97d69 | Giorgos Korfiatis | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 5dc97d69 | Giorgos Korfiatis | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 5dc97d69 | Giorgos Korfiatis | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 5dc97d69 | Giorgos Korfiatis | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 5dc97d69 | Giorgos Korfiatis | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 5dc97d69 | Giorgos Korfiatis | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 5dc97d69 | Giorgos Korfiatis | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 5dc97d69 | Giorgos Korfiatis | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 5dc97d69 | Giorgos Korfiatis | # POSSIBILITY OF SUCH DAMAGE.
|
28 | 5dc97d69 | Giorgos Korfiatis | #
|
29 | 5dc97d69 | Giorgos Korfiatis | # The views and conclusions contained in the software and
|
30 | 5dc97d69 | Giorgos Korfiatis | # documentation are those of the authors and should not be
|
31 | 5dc97d69 | Giorgos Korfiatis | # interpreted as representing official policies, either expressed
|
32 | 5dc97d69 | Giorgos Korfiatis | # or implied, of GRNET S.A.
|
33 | 5dc97d69 | Giorgos Korfiatis | |
34 | 5dc97d69 | Giorgos Korfiatis | from optparse import make_option |
35 | 5dc97d69 | Giorgos Korfiatis | |
36 | 5dc97d69 | Giorgos Korfiatis | from django.db.models import Q |
37 | a6d167c1 | Giorgos Korfiatis | from snf_django.management.commands import SynnefoCommand, CommandError |
38 | 5dc97d69 | Giorgos Korfiatis | from django.db import transaction |
39 | 5dc97d69 | Giorgos Korfiatis | from synnefo.util import units |
40 | 5dc97d69 | Giorgos Korfiatis | from astakos.im import functions |
41 | 5dc97d69 | Giorgos Korfiatis | from astakos.im import models |
42 | 5dc97d69 | Giorgos Korfiatis | import astakos.api.projects as api |
43 | 5dc97d69 | Giorgos Korfiatis | import synnefo.util.date as date_util |
44 | 5dc97d69 | Giorgos Korfiatis | from snf_django.management import utils |
45 | 5dc97d69 | Giorgos Korfiatis | from astakos.im.management.commands import _common |
46 | 5dc97d69 | Giorgos Korfiatis | |
47 | 5dc97d69 | Giorgos Korfiatis | |
48 | 5dc97d69 | Giorgos Korfiatis | def make_policies(limits): |
49 | 5dc97d69 | Giorgos Korfiatis | policies = {} |
50 | 5dc97d69 | Giorgos Korfiatis | for (name, member_capacity, project_capacity) in limits: |
51 | 5dc97d69 | Giorgos Korfiatis | try:
|
52 | 5dc97d69 | Giorgos Korfiatis | member_capacity = units.parse(member_capacity) |
53 | 5dc97d69 | Giorgos Korfiatis | project_capacity = units.parse(project_capacity) |
54 | 5dc97d69 | Giorgos Korfiatis | except units.ParseError:
|
55 | 5dc97d69 | Giorgos Korfiatis | m = "Please specify capacity as a decimal integer"
|
56 | 5dc97d69 | Giorgos Korfiatis | raise CommandError(m)
|
57 | 5dc97d69 | Giorgos Korfiatis | policies[name] = {"member_capacity": member_capacity,
|
58 | 5dc97d69 | Giorgos Korfiatis | "project_capacity": project_capacity}
|
59 | 5dc97d69 | Giorgos Korfiatis | return policies
|
60 | 5dc97d69 | Giorgos Korfiatis | |
61 | 5dc97d69 | Giorgos Korfiatis | Simple = type('Simple', (), {}) |
62 | 5dc97d69 | Giorgos Korfiatis | |
63 | 5dc97d69 | Giorgos Korfiatis | |
64 | 5dc97d69 | Giorgos Korfiatis | class Param(object): |
65 | 5dc97d69 | Giorgos Korfiatis | def __init__(self, key=Simple, mod=Simple, action=Simple, nargs=Simple, |
66 | 5dc97d69 | Giorgos Korfiatis | is_main=False, help=""): |
67 | 5dc97d69 | Giorgos Korfiatis | self.key = key
|
68 | 5dc97d69 | Giorgos Korfiatis | self.mod = mod
|
69 | 5dc97d69 | Giorgos Korfiatis | self.action = action
|
70 | 5dc97d69 | Giorgos Korfiatis | self.nargs = nargs
|
71 | 5dc97d69 | Giorgos Korfiatis | self.is_main = is_main
|
72 | 5dc97d69 | Giorgos Korfiatis | self.help = help
|
73 | 5dc97d69 | Giorgos Korfiatis | |
74 | 5dc97d69 | Giorgos Korfiatis | |
75 | 5dc97d69 | Giorgos Korfiatis | PARAMS = { |
76 | 5dc97d69 | Giorgos Korfiatis | "name": Param(key="realname", help="Set project name"), |
77 | 5dc97d69 | Giorgos Korfiatis | "owner": Param(mod=_common.get_accepted_user, help="Set project owner"), |
78 | 5dc97d69 | Giorgos Korfiatis | "homepage": Param(help="Set project homepage"), |
79 | 5dc97d69 | Giorgos Korfiatis | "description": Param(help="Set project description"), |
80 | 5dc97d69 | Giorgos Korfiatis | "end_date": Param(mod=date_util.isoparse, is_main=True, |
81 | 5dc97d69 | Giorgos Korfiatis | help=("Set project end date in ISO format "
|
82 | 5dc97d69 | Giorgos Korfiatis | "(e.g. 2014-01-01T00:00Z)")),
|
83 | 5dc97d69 | Giorgos Korfiatis | "join_policy": Param(key="member_join_policy", is_main=True, |
84 | 5dc97d69 | Giorgos Korfiatis | mod=(lambda x: api.MEMBERSHIP_POLICY[x]),
|
85 | 5dc97d69 | Giorgos Korfiatis | help="Set join policy (auto, moderated, or closed)"),
|
86 | 5dc97d69 | Giorgos Korfiatis | "leave_policy": Param(key="member_leave_policy", is_main=True, |
87 | 5dc97d69 | Giorgos Korfiatis | mod=(lambda x: api.MEMBERSHIP_POLICY[x]),
|
88 | 5dc97d69 | Giorgos Korfiatis | help=("Set leave policy "
|
89 | 5dc97d69 | Giorgos Korfiatis | "(auto, moderated, or closed)")),
|
90 | 5dc97d69 | Giorgos Korfiatis | "max_members": Param(key="limit_on_members_number", mod=int, is_main=True, |
91 | 5dc97d69 | Giorgos Korfiatis | help="Set maximum members limit"),
|
92 | 5dc97d69 | Giorgos Korfiatis | "private": Param(mod=utils.parse_bool, is_main=True, |
93 | 5dc97d69 | Giorgos Korfiatis | help="Set project private"),
|
94 | 5dc97d69 | Giorgos Korfiatis | "limit": Param(key="resources", mod=make_policies, is_main=True, |
95 | 5dc97d69 | Giorgos Korfiatis | nargs=3, action="append", |
96 | 5dc97d69 | Giorgos Korfiatis | help=("Set resource limits: "
|
97 | 5dc97d69 | Giorgos Korfiatis | "resource_name member_capacity project_capacity")),
|
98 | 5dc97d69 | Giorgos Korfiatis | } |
99 | 5dc97d69 | Giorgos Korfiatis | |
100 | 5dc97d69 | Giorgos Korfiatis | |
101 | 5dc97d69 | Giorgos Korfiatis | def make_options(): |
102 | 5dc97d69 | Giorgos Korfiatis | options = [] |
103 | 5dc97d69 | Giorgos Korfiatis | for key, param in PARAMS.iteritems(): |
104 | 5dc97d69 | Giorgos Korfiatis | opt = "--" + key.replace('_', '-') |
105 | 5dc97d69 | Giorgos Korfiatis | kwargs = {} |
106 | 5dc97d69 | Giorgos Korfiatis | if param.action is not Simple: |
107 | 5dc97d69 | Giorgos Korfiatis | kwargs["action"] = param.action
|
108 | 5dc97d69 | Giorgos Korfiatis | if param.nargs is not Simple: |
109 | 5dc97d69 | Giorgos Korfiatis | kwargs["nargs"] = param.nargs
|
110 | 5dc97d69 | Giorgos Korfiatis | kwargs["help"] = param.help
|
111 | 5dc97d69 | Giorgos Korfiatis | options.append(make_option(opt, **kwargs)) |
112 | 5dc97d69 | Giorgos Korfiatis | return tuple(options) |
113 | 5dc97d69 | Giorgos Korfiatis | |
114 | 5dc97d69 | Giorgos Korfiatis | |
115 | a6d167c1 | Giorgos Korfiatis | class Command(SynnefoCommand): |
116 | 5dc97d69 | Giorgos Korfiatis | args = "<project id> (or --all-base-projects)"
|
117 | 5dc97d69 | Giorgos Korfiatis | help = "Modify an already initialized project"
|
118 | a6d167c1 | Giorgos Korfiatis | option_list = SynnefoCommand.option_list + make_options() + ( |
119 | 5dc97d69 | Giorgos Korfiatis | make_option('--all-base-projects',
|
120 | 5dc97d69 | Giorgos Korfiatis | action='store_true',
|
121 | 5dc97d69 | Giorgos Korfiatis | default=False,
|
122 | 5dc97d69 | Giorgos Korfiatis | help="Modify in bulk all initialized base projects"),
|
123 | 5dc97d69 | Giorgos Korfiatis | make_option('--exclude',
|
124 | 5dc97d69 | Giorgos Korfiatis | help=("If `--all-base-projects' is given, exclude projects"
|
125 | 5dc97d69 | Giorgos Korfiatis | " given as a list of uuids: uuid1,uuid2,uuid3")),
|
126 | 5dc97d69 | Giorgos Korfiatis | ) |
127 | 5dc97d69 | Giorgos Korfiatis | |
128 | 5dc97d69 | Giorgos Korfiatis | def check_args(self, args, all_base, exclude): |
129 | 5dc97d69 | Giorgos Korfiatis | if all_base and args or not all_base and len(args) != 1: |
130 | 5dc97d69 | Giorgos Korfiatis | m = "Please provide a project ID or --all-base-projects"
|
131 | 5dc97d69 | Giorgos Korfiatis | raise CommandError(m)
|
132 | 5dc97d69 | Giorgos Korfiatis | if not all_base and exclude: |
133 | 5dc97d69 | Giorgos Korfiatis | m = ("Option --exclude is meaningful only combined with "
|
134 | 5dc97d69 | Giorgos Korfiatis | " --all-base-projects.")
|
135 | 5dc97d69 | Giorgos Korfiatis | raise CommandError(m)
|
136 | 5dc97d69 | Giorgos Korfiatis | |
137 | 5dc97d69 | Giorgos Korfiatis | def mk_all_base_filter(self, all_base, exclude): |
138 | 5dc97d69 | Giorgos Korfiatis | flt = Q(state__in=models.Project.INITIALIZED_STATES, is_base=True)
|
139 | 5dc97d69 | Giorgos Korfiatis | if exclude:
|
140 | 5dc97d69 | Giorgos Korfiatis | exclude = exclude.split(',')
|
141 | 5dc97d69 | Giorgos Korfiatis | flt &= ~Q(uuid__in=exclude) |
142 | 5dc97d69 | Giorgos Korfiatis | return flt
|
143 | 5dc97d69 | Giorgos Korfiatis | |
144 | 5dc97d69 | Giorgos Korfiatis | @transaction.commit_on_success
|
145 | 5dc97d69 | Giorgos Korfiatis | def handle(self, *args, **options): |
146 | 5dc97d69 | Giorgos Korfiatis | all_base = options["all_base_projects"]
|
147 | 5dc97d69 | Giorgos Korfiatis | exclude = options["exclude"]
|
148 | 5dc97d69 | Giorgos Korfiatis | self.check_args(args, all_base, exclude)
|
149 | 5dc97d69 | Giorgos Korfiatis | |
150 | 5dc97d69 | Giorgos Korfiatis | try:
|
151 | 5dc97d69 | Giorgos Korfiatis | changes = {} |
152 | 5dc97d69 | Giorgos Korfiatis | for key, value in options.iteritems(): |
153 | 5dc97d69 | Giorgos Korfiatis | param = PARAMS.get(key) |
154 | 5dc97d69 | Giorgos Korfiatis | if param is None or value is None: |
155 | 5dc97d69 | Giorgos Korfiatis | continue
|
156 | 5dc97d69 | Giorgos Korfiatis | if all_base and not param.is_main: |
157 | 5dc97d69 | Giorgos Korfiatis | m = "Cannot modify field '%s' in bulk" % key
|
158 | 5dc97d69 | Giorgos Korfiatis | raise CommandError(m)
|
159 | 5dc97d69 | Giorgos Korfiatis | k = key if param.key is Simple else param.key |
160 | 5dc97d69 | Giorgos Korfiatis | v = value if param.mod is Simple else param.mod(value) |
161 | 5dc97d69 | Giorgos Korfiatis | changes[k] = v |
162 | 5dc97d69 | Giorgos Korfiatis | |
163 | 5dc97d69 | Giorgos Korfiatis | if all_base:
|
164 | 5dc97d69 | Giorgos Korfiatis | flt = self.mk_all_base_filter(all_base, exclude)
|
165 | 5dc97d69 | Giorgos Korfiatis | functions.modify_projects_in_bulk(flt, changes) |
166 | 5dc97d69 | Giorgos Korfiatis | else:
|
167 | 5dc97d69 | Giorgos Korfiatis | functions.modify_project(args[0], changes)
|
168 | 5dc97d69 | Giorgos Korfiatis | except BaseException as e: |
169 | 5dc97d69 | Giorgos Korfiatis | raise CommandError(e) |