root / snf-astakos-app / astakos / im / quotas.py @ 56bbece7
History | View | Annotate | Download (9.9 kB)
1 | dc9da5b9 | Giorgos Korfiatis | # Copyright 2013 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | dc9da5b9 | Giorgos Korfiatis | #
|
3 | dc9da5b9 | Giorgos Korfiatis | # Redistribution and use in source and binary forms, with or
|
4 | dc9da5b9 | Giorgos Korfiatis | # without modification, are permitted provided that the following
|
5 | dc9da5b9 | Giorgos Korfiatis | # conditions are met:
|
6 | dc9da5b9 | Giorgos Korfiatis | #
|
7 | dc9da5b9 | Giorgos Korfiatis | # 1. Redistributions of source code must retain the above
|
8 | dc9da5b9 | Giorgos Korfiatis | # copyright notice, this list of conditions and the following
|
9 | dc9da5b9 | Giorgos Korfiatis | # disclaimer.
|
10 | dc9da5b9 | Giorgos Korfiatis | #
|
11 | dc9da5b9 | Giorgos Korfiatis | # 2. Redistributions in binary form must reproduce the above
|
12 | dc9da5b9 | Giorgos Korfiatis | # copyright notice, this list of conditions and the following
|
13 | dc9da5b9 | Giorgos Korfiatis | # disclaimer in the documentation and/or other materials
|
14 | dc9da5b9 | Giorgos Korfiatis | # provided with the distribution.
|
15 | dc9da5b9 | Giorgos Korfiatis | #
|
16 | dc9da5b9 | Giorgos Korfiatis | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | dc9da5b9 | Giorgos Korfiatis | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | dc9da5b9 | Giorgos Korfiatis | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | dc9da5b9 | Giorgos Korfiatis | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | dc9da5b9 | Giorgos Korfiatis | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | dc9da5b9 | Giorgos Korfiatis | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | dc9da5b9 | Giorgos Korfiatis | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | dc9da5b9 | Giorgos Korfiatis | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | dc9da5b9 | Giorgos Korfiatis | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | dc9da5b9 | Giorgos Korfiatis | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | dc9da5b9 | Giorgos Korfiatis | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | dc9da5b9 | Giorgos Korfiatis | # POSSIBILITY OF SUCH DAMAGE.
|
28 | dc9da5b9 | Giorgos Korfiatis | #
|
29 | dc9da5b9 | Giorgos Korfiatis | # The views and conclusions contained in the software and
|
30 | dc9da5b9 | Giorgos Korfiatis | # documentation are those of the authors and should not be
|
31 | dc9da5b9 | Giorgos Korfiatis | # interpreted as representing official policies, either expressed
|
32 | dc9da5b9 | Giorgos Korfiatis | # or implied, of GRNET S.A.
|
33 | dc9da5b9 | Giorgos Korfiatis | |
34 | 2e46be99 | Giorgos Korfiatis | from synnefo.util import units |
35 | aa27f246 | Giorgos Korfiatis | from astakos.im.models import ( |
36 | bea584e1 | Giorgos Korfiatis | Resource, AstakosUserQuota, AstakosUser, Service, |
37 | aa27f246 | Giorgos Korfiatis | Project, ProjectMembership, ProjectResourceGrant, ProjectApplication) |
38 | ec5e00aa | Giorgos Korfiatis | import astakos.quotaholder_app.callpoint as qh |
39 | 2e7924de | Giorgos Korfiatis | from astakos.quotaholder_app.exception import NoCapacityError |
40 | ae16bcad | Giorgos Korfiatis | from django.db.models import Q |
41 | dc9da5b9 | Giorgos Korfiatis | |
42 | dc9da5b9 | Giorgos Korfiatis | |
43 | dc9da5b9 | Giorgos Korfiatis | def from_holding(holding): |
44 | 68b991bc | Giorgos Korfiatis | limit, usage_min, usage_max = holding |
45 | dc9da5b9 | Giorgos Korfiatis | body = {'limit': limit,
|
46 | 68b991bc | Giorgos Korfiatis | 'usage': usage_max,
|
47 | 68b991bc | Giorgos Korfiatis | 'pending': usage_max-usage_min,
|
48 | dc9da5b9 | Giorgos Korfiatis | } |
49 | dc9da5b9 | Giorgos Korfiatis | return body
|
50 | dc9da5b9 | Giorgos Korfiatis | |
51 | dc9da5b9 | Giorgos Korfiatis | |
52 | dc9da5b9 | Giorgos Korfiatis | def limits_only(holding): |
53 | 68b991bc | Giorgos Korfiatis | limit, usage_min, usage_max = holding |
54 | dc9da5b9 | Giorgos Korfiatis | return limit
|
55 | dc9da5b9 | Giorgos Korfiatis | |
56 | dc9da5b9 | Giorgos Korfiatis | |
57 | dc9da5b9 | Giorgos Korfiatis | def transform_data(holdings, func=None): |
58 | dc9da5b9 | Giorgos Korfiatis | if func is None: |
59 | dc9da5b9 | Giorgos Korfiatis | func = from_holding |
60 | dc9da5b9 | Giorgos Korfiatis | |
61 | dc9da5b9 | Giorgos Korfiatis | quota = {} |
62 | dc9da5b9 | Giorgos Korfiatis | for (holder, source, resource), value in holdings.iteritems(): |
63 | dc9da5b9 | Giorgos Korfiatis | holder_quota = quota.get(holder, {}) |
64 | dc9da5b9 | Giorgos Korfiatis | source_quota = holder_quota.get(source, {}) |
65 | dc9da5b9 | Giorgos Korfiatis | body = func(value) |
66 | dc9da5b9 | Giorgos Korfiatis | source_quota[resource] = body |
67 | dc9da5b9 | Giorgos Korfiatis | holder_quota[source] = source_quota |
68 | dc9da5b9 | Giorgos Korfiatis | quota[holder] = holder_quota |
69 | dc9da5b9 | Giorgos Korfiatis | return quota
|
70 | dc9da5b9 | Giorgos Korfiatis | |
71 | dc9da5b9 | Giorgos Korfiatis | |
72 | 5a0f9d6c | Giorgos Korfiatis | def get_counters(users, resources=None, sources=None, flt=None): |
73 | dc9da5b9 | Giorgos Korfiatis | uuids = [user.uuid for user in users] |
74 | dc9da5b9 | Giorgos Korfiatis | |
75 | 5afce44d | Giorgos Korfiatis | counters = qh.get_quota(holders=uuids, |
76 | 5afce44d | Giorgos Korfiatis | resources=resources, |
77 | 5a0f9d6c | Giorgos Korfiatis | sources=sources, |
78 | 5a0f9d6c | Giorgos Korfiatis | flt=flt) |
79 | dc9da5b9 | Giorgos Korfiatis | return counters
|
80 | dc9da5b9 | Giorgos Korfiatis | |
81 | dc9da5b9 | Giorgos Korfiatis | |
82 | 5a0f9d6c | Giorgos Korfiatis | def get_users_quotas(users, resources=None, sources=None, flt=None): |
83 | 5a0f9d6c | Giorgos Korfiatis | counters = get_counters(users, resources, sources, flt=flt) |
84 | dc9da5b9 | Giorgos Korfiatis | quotas = transform_data(counters) |
85 | dc9da5b9 | Giorgos Korfiatis | return quotas
|
86 | dc9da5b9 | Giorgos Korfiatis | |
87 | dc9da5b9 | Giorgos Korfiatis | |
88 | e336910f | Giorgos Korfiatis | def get_users_quota_limits(users, resources=None, sources=None): |
89 | dc9da5b9 | Giorgos Korfiatis | counters = get_counters(users, resources, sources) |
90 | dc9da5b9 | Giorgos Korfiatis | limits = transform_data(counters, limits_only) |
91 | e336910f | Giorgos Korfiatis | return limits
|
92 | dc9da5b9 | Giorgos Korfiatis | |
93 | dc9da5b9 | Giorgos Korfiatis | |
94 | dc9da5b9 | Giorgos Korfiatis | def get_user_quotas(user, resources=None, sources=None): |
95 | dc9da5b9 | Giorgos Korfiatis | quotas = get_users_quotas([user], resources, sources) |
96 | 1e361a6d | Giorgos Korfiatis | return quotas.get(user.uuid, {})
|
97 | dc9da5b9 | Giorgos Korfiatis | |
98 | dc9da5b9 | Giorgos Korfiatis | |
99 | bea584e1 | Giorgos Korfiatis | def service_get_quotas(component, users=None): |
100 | 0e08e08e | Giorgos Korfiatis | name_values = Service.objects.filter( |
101 | 0e08e08e | Giorgos Korfiatis | component=component).values_list('name')
|
102 | 0e08e08e | Giorgos Korfiatis | service_names = [t for (t,) in name_values] |
103 | 0e08e08e | Giorgos Korfiatis | resources = Resource.objects.filter(service_origin__in=service_names) |
104 | bb005bc2 | Giorgos Korfiatis | resource_names = [r.name for r in resources] |
105 | 5afce44d | Giorgos Korfiatis | counters = qh.get_quota(holders=users, resources=resource_names) |
106 | bb005bc2 | Giorgos Korfiatis | return transform_data(counters)
|
107 | bb005bc2 | Giorgos Korfiatis | |
108 | bb005bc2 | Giorgos Korfiatis | |
109 | 9b126f13 | Giorgos Korfiatis | def _level_quota_dict(quotas): |
110 | 9b126f13 | Giorgos Korfiatis | lst = [] |
111 | 9b126f13 | Giorgos Korfiatis | for holder, holder_quota in quotas.iteritems(): |
112 | 9b126f13 | Giorgos Korfiatis | for source, source_quota in holder_quota.iteritems(): |
113 | 9b126f13 | Giorgos Korfiatis | for resource, limit in source_quota.iteritems(): |
114 | 9b126f13 | Giorgos Korfiatis | key = (holder, source, resource) |
115 | 9b126f13 | Giorgos Korfiatis | lst.append((key, limit)) |
116 | 9b126f13 | Giorgos Korfiatis | return lst
|
117 | 9b126f13 | Giorgos Korfiatis | |
118 | 9b126f13 | Giorgos Korfiatis | |
119 | 548938f6 | Giorgos Korfiatis | def _set_user_quota(quotas, resource=None): |
120 | 9b126f13 | Giorgos Korfiatis | q = _level_quota_dict(quotas) |
121 | 548938f6 | Giorgos Korfiatis | qh.set_quota(q, resource=resource) |
122 | aa27f246 | Giorgos Korfiatis | |
123 | aa27f246 | Giorgos Korfiatis | |
124 | aa27f246 | Giorgos Korfiatis | SYSTEM = 'system'
|
125 | 3c22bad0 | Giorgos Korfiatis | PENDING_APP_RESOURCE = 'astakos.pending_app'
|
126 | aa27f246 | Giorgos Korfiatis | |
127 | aa27f246 | Giorgos Korfiatis | |
128 | 3c22bad0 | Giorgos Korfiatis | def register_pending_apps(user, quantity, force=False): |
129 | 3c22bad0 | Giorgos Korfiatis | provision = (user.uuid, SYSTEM, PENDING_APP_RESOURCE), quantity |
130 | 9e3af524 | Giorgos Korfiatis | try:
|
131 | 9e3af524 | Giorgos Korfiatis | s = qh.issue_commission(clientkey='astakos',
|
132 | 9e3af524 | Giorgos Korfiatis | force=force, |
133 | 9e3af524 | Giorgos Korfiatis | provisions=[provision]) |
134 | 9e3af524 | Giorgos Korfiatis | except NoCapacityError as e: |
135 | 9e3af524 | Giorgos Korfiatis | limit = e.data['limit']
|
136 | 9e3af524 | Giorgos Korfiatis | return False, limit |
137 | 3c22bad0 | Giorgos Korfiatis | qh.resolve_pending_commission('astakos', s)
|
138 | 9e3af524 | Giorgos Korfiatis | return True, None |
139 | 9770ba6c | Giorgos Korfiatis | |
140 | 9770ba6c | Giorgos Korfiatis | |
141 | 3c22bad0 | Giorgos Korfiatis | def get_pending_app_quota(user): |
142 | 3c22bad0 | Giorgos Korfiatis | quota = get_user_quotas(user) |
143 | 3c22bad0 | Giorgos Korfiatis | return quota[SYSTEM][PENDING_APP_RESOURCE]
|
144 | 3c22bad0 | Giorgos Korfiatis | |
145 | 3c22bad0 | Giorgos Korfiatis | |
146 | 45112d5a | Giorgos Korfiatis | def update_base_quota(users, resource, value): |
147 | 45112d5a | Giorgos Korfiatis | userids = [user.pk for user in users] |
148 | 45112d5a | Giorgos Korfiatis | AstakosUserQuota.objects.\ |
149 | 45112d5a | Giorgos Korfiatis | filter(resource__name=resource, user__pk__in=userids).\ |
150 | 45112d5a | Giorgos Korfiatis | update(capacity=value) |
151 | 548938f6 | Giorgos Korfiatis | qh_sync_locked_users(users, resource=resource) |
152 | 764d99c4 | Giorgos Korfiatis | |
153 | 5a0f9d6c | Giorgos Korfiatis | |
154 | 46b6a8b4 | Giorgos Korfiatis | def _partition_by(f, l): |
155 | 46b6a8b4 | Giorgos Korfiatis | d = {} |
156 | 46b6a8b4 | Giorgos Korfiatis | for x in l: |
157 | 46b6a8b4 | Giorgos Korfiatis | group = f(x) |
158 | 46b6a8b4 | Giorgos Korfiatis | group_l = d.get(group, []) |
159 | 46b6a8b4 | Giorgos Korfiatis | group_l.append(x) |
160 | 46b6a8b4 | Giorgos Korfiatis | d[group] = group_l |
161 | 46b6a8b4 | Giorgos Korfiatis | return d
|
162 | 46b6a8b4 | Giorgos Korfiatis | |
163 | 46b6a8b4 | Giorgos Korfiatis | |
164 | 5a0f9d6c | Giorgos Korfiatis | def initial_quotas(users, flt=None): |
165 | 5a0f9d6c | Giorgos Korfiatis | if flt is None: |
166 | 5a0f9d6c | Giorgos Korfiatis | flt = Q() |
167 | 5a0f9d6c | Giorgos Korfiatis | |
168 | b22da62e | Giorgos Korfiatis | userids = [user.pk for user in users] |
169 | 46b6a8b4 | Giorgos Korfiatis | objs = AstakosUserQuota.objects.select_related('resource')
|
170 | 5a0f9d6c | Giorgos Korfiatis | orig_quotas = objs.filter(user__pk__in=userids).filter(flt) |
171 | 46b6a8b4 | Giorgos Korfiatis | orig_quotas = _partition_by(lambda q: q.user_id, orig_quotas)
|
172 | aa27f246 | Giorgos Korfiatis | |
173 | 46b6a8b4 | Giorgos Korfiatis | initial = {} |
174 | 46b6a8b4 | Giorgos Korfiatis | for user in users: |
175 | 46b6a8b4 | Giorgos Korfiatis | qs = {} |
176 | 46b6a8b4 | Giorgos Korfiatis | for q in orig_quotas.get(user.pk, []): |
177 | 46b6a8b4 | Giorgos Korfiatis | qs[q.resource.name] = q.capacity |
178 | 46b6a8b4 | Giorgos Korfiatis | initial[user.uuid] = {SYSTEM: qs} |
179 | aa27f246 | Giorgos Korfiatis | return initial
|
180 | aa27f246 | Giorgos Korfiatis | |
181 | aa27f246 | Giorgos Korfiatis | |
182 | aa27f246 | Giorgos Korfiatis | def get_grant_source(grant): |
183 | aa27f246 | Giorgos Korfiatis | return SYSTEM
|
184 | aa27f246 | Giorgos Korfiatis | |
185 | aa27f246 | Giorgos Korfiatis | |
186 | 2e46be99 | Giorgos Korfiatis | def add_limits(x, y): |
187 | 2e46be99 | Giorgos Korfiatis | return min(x+y, units.PRACTICALLY_INFINITE) |
188 | 2e46be99 | Giorgos Korfiatis | |
189 | 2e46be99 | Giorgos Korfiatis | |
190 | 548938f6 | Giorgos Korfiatis | def astakos_users_quotas(users, resource=None): |
191 | 103086a4 | Giorgos Korfiatis | users = list(users)
|
192 | 548938f6 | Giorgos Korfiatis | flt = Q(resource__name=resource) if resource is not None else Q() |
193 | 548938f6 | Giorgos Korfiatis | quotas = initial_quotas(users, flt=flt) |
194 | aa27f246 | Giorgos Korfiatis | |
195 | b22da62e | Giorgos Korfiatis | userids = [user.pk for user in users] |
196 | aa27f246 | Giorgos Korfiatis | ACTUALLY_ACCEPTED = ProjectMembership.ACTUALLY_ACCEPTED |
197 | 6d583e07 | Giorgos Korfiatis | objs = ProjectMembership.objects.select_related( |
198 | 6d583e07 | Giorgos Korfiatis | 'project', 'person', 'project__application') |
199 | 6d583e07 | Giorgos Korfiatis | memberships = objs.filter( |
200 | b22da62e | Giorgos Korfiatis | person__pk__in=userids, |
201 | 6d583e07 | Giorgos Korfiatis | state__in=ACTUALLY_ACCEPTED, |
202 | 6d583e07 | Giorgos Korfiatis | project__state=Project.NORMAL, |
203 | 6d583e07 | Giorgos Korfiatis | project__application__state=ProjectApplication.APPROVED) |
204 | aa27f246 | Giorgos Korfiatis | |
205 | 6d583e07 | Giorgos Korfiatis | apps = set(m.project.application_id for m in memberships) |
206 | aa27f246 | Giorgos Korfiatis | |
207 | aa27f246 | Giorgos Korfiatis | objs = ProjectResourceGrant.objects.select_related() |
208 | 548938f6 | Giorgos Korfiatis | grants = objs.filter(project_application__in=apps).filter(flt) |
209 | aa27f246 | Giorgos Korfiatis | |
210 | aa27f246 | Giorgos Korfiatis | for membership in memberships: |
211 | aa27f246 | Giorgos Korfiatis | uuid = membership.person.uuid |
212 | aa27f246 | Giorgos Korfiatis | userquotas = quotas.get(uuid, {}) |
213 | aa27f246 | Giorgos Korfiatis | |
214 | 6d583e07 | Giorgos Korfiatis | application = membership.project.application |
215 | aa27f246 | Giorgos Korfiatis | |
216 | aa27f246 | Giorgos Korfiatis | for grant in grants: |
217 | aa27f246 | Giorgos Korfiatis | if grant.project_application_id != application.id:
|
218 | aa27f246 | Giorgos Korfiatis | continue
|
219 | aa27f246 | Giorgos Korfiatis | |
220 | aa27f246 | Giorgos Korfiatis | source = get_grant_source(grant) |
221 | aa27f246 | Giorgos Korfiatis | source_quotas = userquotas.get(source, {}) |
222 | aa27f246 | Giorgos Korfiatis | |
223 | aa27f246 | Giorgos Korfiatis | resource = grant.resource.full_name() |
224 | aa27f246 | Giorgos Korfiatis | prev = source_quotas.get(resource, 0)
|
225 | 2e46be99 | Giorgos Korfiatis | new = add_limits(prev, grant.member_capacity) |
226 | aa27f246 | Giorgos Korfiatis | source_quotas[resource] = new |
227 | aa27f246 | Giorgos Korfiatis | userquotas[source] = source_quotas |
228 | aa27f246 | Giorgos Korfiatis | quotas[uuid] = userquotas |
229 | aa27f246 | Giorgos Korfiatis | |
230 | aa27f246 | Giorgos Korfiatis | return quotas
|
231 | aa27f246 | Giorgos Korfiatis | |
232 | aa27f246 | Giorgos Korfiatis | |
233 | 5a0f9d6c | Giorgos Korfiatis | def list_user_quotas(users, qhflt=None, initflt=None): |
234 | 5a0f9d6c | Giorgos Korfiatis | qh_quotas = get_users_quotas(users, flt=qhflt) |
235 | 5a0f9d6c | Giorgos Korfiatis | astakos_initial = initial_quotas(users, flt=initflt) |
236 | e336910f | Giorgos Korfiatis | return qh_quotas, astakos_initial
|
237 | e336910f | Giorgos Korfiatis | |
238 | e336910f | Giorgos Korfiatis | |
239 | e336910f | Giorgos Korfiatis | # Syncing to quotaholder
|
240 | e336910f | Giorgos Korfiatis | |
241 | 3c22bad0 | Giorgos Korfiatis | def get_users_for_update(user_ids): |
242 | 3c22bad0 | Giorgos Korfiatis | uids = sorted(user_ids)
|
243 | c7e03d20 | Giorgos Korfiatis | objs = AstakosUser.objects |
244 | 3c22bad0 | Giorgos Korfiatis | return list(objs.filter(id__in=uids).order_by('id').select_for_update()) |
245 | 3c22bad0 | Giorgos Korfiatis | |
246 | 3c22bad0 | Giorgos Korfiatis | |
247 | 3c22bad0 | Giorgos Korfiatis | def get_user_for_update(user_id): |
248 | 3c22bad0 | Giorgos Korfiatis | return get_users_for_update([user_id])[0] |
249 | 3c22bad0 | Giorgos Korfiatis | |
250 | 3c22bad0 | Giorgos Korfiatis | |
251 | 548938f6 | Giorgos Korfiatis | def qh_sync_locked_users(users, resource=None): |
252 | 548938f6 | Giorgos Korfiatis | astakos_quotas = astakos_users_quotas(users, resource=resource) |
253 | 548938f6 | Giorgos Korfiatis | _set_user_quota(astakos_quotas, resource=resource) |
254 | 3c22bad0 | Giorgos Korfiatis | |
255 | 3c22bad0 | Giorgos Korfiatis | |
256 | 548938f6 | Giorgos Korfiatis | def qh_sync_users(users, resource=None): |
257 | 3c22bad0 | Giorgos Korfiatis | uids = [user.id for user in users] |
258 | 3c22bad0 | Giorgos Korfiatis | users = get_users_for_update(uids) |
259 | 548938f6 | Giorgos Korfiatis | qh_sync_locked_users(users, resource=resource) |
260 | 3c22bad0 | Giorgos Korfiatis | |
261 | 3c22bad0 | Giorgos Korfiatis | |
262 | 3c22bad0 | Giorgos Korfiatis | def qh_sync_users_diffs(users, sync=True): |
263 | e336910f | Giorgos Korfiatis | uids = [user.id for user in users] |
264 | e336910f | Giorgos Korfiatis | if sync:
|
265 | 3c22bad0 | Giorgos Korfiatis | users = get_users_for_update(uids) |
266 | e336910f | Giorgos Korfiatis | |
267 | cb14cc6c | Giorgos Korfiatis | astakos_quotas = astakos_users_quotas(users) |
268 | 3c22bad0 | Giorgos Korfiatis | qh_limits = get_users_quota_limits(users) |
269 | 3c22bad0 | Giorgos Korfiatis | diff_quotas = {} |
270 | 3c22bad0 | Giorgos Korfiatis | for holder, local in astakos_quotas.iteritems(): |
271 | 3c22bad0 | Giorgos Korfiatis | registered = qh_limits.get(holder, None)
|
272 | 3c22bad0 | Giorgos Korfiatis | if local != registered:
|
273 | 3c22bad0 | Giorgos Korfiatis | diff_quotas[holder] = dict(local)
|
274 | 3c22bad0 | Giorgos Korfiatis | |
275 | 3c22bad0 | Giorgos Korfiatis | if sync:
|
276 | 3c22bad0 | Giorgos Korfiatis | _set_user_quota(diff_quotas) |
277 | 3c22bad0 | Giorgos Korfiatis | return qh_limits, diff_quotas
|
278 | 3adbd562 | Giorgos Korfiatis | |
279 | 3c22bad0 | Giorgos Korfiatis | |
280 | 3c22bad0 | Giorgos Korfiatis | def qh_sync_locked_user(user): |
281 | 3c22bad0 | Giorgos Korfiatis | qh_sync_locked_users([user]) |
282 | 3adbd562 | Giorgos Korfiatis | |
283 | e336910f | Giorgos Korfiatis | |
284 | e336910f | Giorgos Korfiatis | def qh_sync_user(user): |
285 | e336910f | Giorgos Korfiatis | qh_sync_users([user]) |
286 | e336910f | Giorgos Korfiatis | |
287 | e336910f | Giorgos Korfiatis | |
288 | f72ba65d | Giorgos Korfiatis | def qh_sync_new_users(users): |
289 | f72ba65d | Giorgos Korfiatis | entries = [] |
290 | f72ba65d | Giorgos Korfiatis | for resource in Resource.objects.all(): |
291 | f72ba65d | Giorgos Korfiatis | for user in users: |
292 | f72ba65d | Giorgos Korfiatis | entries.append( |
293 | f72ba65d | Giorgos Korfiatis | AstakosUserQuota(user=user, resource=resource, |
294 | f72ba65d | Giorgos Korfiatis | capacity=resource.uplimit)) |
295 | f72ba65d | Giorgos Korfiatis | AstakosUserQuota.objects.bulk_create(entries) |
296 | f72ba65d | Giorgos Korfiatis | qh_sync_users(users) |
297 | f72ba65d | Giorgos Korfiatis | |
298 | f72ba65d | Giorgos Korfiatis | |
299 | f72ba65d | Giorgos Korfiatis | def qh_sync_new_user(user): |
300 | f72ba65d | Giorgos Korfiatis | qh_sync_new_users([user]) |
301 | f72ba65d | Giorgos Korfiatis | |
302 | f72ba65d | Giorgos Korfiatis | |
303 | 3c22bad0 | Giorgos Korfiatis | def members_to_sync(project): |
304 | 3c22bad0 | Giorgos Korfiatis | objs = ProjectMembership.objects.select_related('person')
|
305 | 3c22bad0 | Giorgos Korfiatis | memberships = objs.filter(project=project, |
306 | 3c22bad0 | Giorgos Korfiatis | state__in=ProjectMembership.ACTUALLY_ACCEPTED) |
307 | 3c22bad0 | Giorgos Korfiatis | return set(m.person for m in memberships) |
308 | e336910f | Giorgos Korfiatis | |
309 | e336910f | Giorgos Korfiatis | |
310 | e336910f | Giorgos Korfiatis | def qh_sync_project(project): |
311 | 3c22bad0 | Giorgos Korfiatis | users = members_to_sync(project) |
312 | 3c22bad0 | Giorgos Korfiatis | qh_sync_users(users) |
313 | 9747707e | Giorgos Korfiatis | |
314 | 9747707e | Giorgos Korfiatis | |
315 | 2e46be99 | Giorgos Korfiatis | def qh_sync_new_resource(resource): |
316 | c7e03d20 | Giorgos Korfiatis | users = AstakosUser.objects.filter( |
317 | 3848b521 | Giorgos Korfiatis | moderated=True, is_rejected=False).order_by('id').select_for_update() |
318 | 9747707e | Giorgos Korfiatis | |
319 | f72ba65d | Giorgos Korfiatis | entries = [] |
320 | 9747707e | Giorgos Korfiatis | for user in users: |
321 | f72ba65d | Giorgos Korfiatis | entries.append( |
322 | f72ba65d | Giorgos Korfiatis | AstakosUserQuota(user=user, resource=resource, |
323 | f72ba65d | Giorgos Korfiatis | capacity=resource.uplimit)) |
324 | f72ba65d | Giorgos Korfiatis | AstakosUserQuota.objects.bulk_create(entries) |
325 | 548938f6 | Giorgos Korfiatis | qh_sync_users(users, resource=resource.name) |