root / snf-astakos-app / astakos / quotaholder / callpoint.py @ 3adbfafa
History | View | Annotate | Download (27.3 kB)
1 | 1d734153 | Giorgos Korfiatis | # Copyright 2012, 2013 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 3e5941c1 | Giorgos Korfiatis | #
|
3 | 3e5941c1 | Giorgos Korfiatis | # Redistribution and use in source and binary forms, with or
|
4 | 3e5941c1 | Giorgos Korfiatis | # without modification, are permitted provided that the following
|
5 | 3e5941c1 | Giorgos Korfiatis | # conditions are met:
|
6 | 3e5941c1 | Giorgos Korfiatis | #
|
7 | 3e5941c1 | Giorgos Korfiatis | # 1. Redistributions of source code must retain the above
|
8 | 3e5941c1 | Giorgos Korfiatis | # copyright notice, this list of conditions and the following
|
9 | 3e5941c1 | Giorgos Korfiatis | # disclaimer.
|
10 | 3e5941c1 | Giorgos Korfiatis | #
|
11 | 3e5941c1 | Giorgos Korfiatis | # 2. Redistributions in binary form must reproduce the above
|
12 | 3e5941c1 | Giorgos Korfiatis | # copyright notice, this list of conditions and the following
|
13 | 3e5941c1 | Giorgos Korfiatis | # disclaimer in the documentation and/or other materials
|
14 | 3e5941c1 | Giorgos Korfiatis | # provided with the distribution.
|
15 | 3e5941c1 | Giorgos Korfiatis | #
|
16 | 3e5941c1 | Giorgos Korfiatis | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 3e5941c1 | Giorgos Korfiatis | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 3e5941c1 | Giorgos Korfiatis | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 3e5941c1 | Giorgos Korfiatis | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 3e5941c1 | Giorgos Korfiatis | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 3e5941c1 | Giorgos Korfiatis | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 3e5941c1 | Giorgos Korfiatis | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 3e5941c1 | Giorgos Korfiatis | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 3e5941c1 | Giorgos Korfiatis | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 3e5941c1 | Giorgos Korfiatis | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 3e5941c1 | Giorgos Korfiatis | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 3e5941c1 | Giorgos Korfiatis | # POSSIBILITY OF SUCH DAMAGE.
|
28 | 3e5941c1 | Giorgos Korfiatis | #
|
29 | 3e5941c1 | Giorgos Korfiatis | # The views and conclusions contained in the software and
|
30 | 3e5941c1 | Giorgos Korfiatis | # documentation are those of the authors and should not be
|
31 | 3e5941c1 | Giorgos Korfiatis | # interpreted as representing official policies, either expressed
|
32 | 3e5941c1 | Giorgos Korfiatis | # or implied, of GRNET S.A.
|
33 | 3e5941c1 | Giorgos Korfiatis | |
34 | b0727daf | Giorgos Korfiatis | from astakos.quotaholder.exception import ( |
35 | b0727daf | Giorgos Korfiatis | QuotaholderError, |
36 | b0727daf | Giorgos Korfiatis | CorruptedError, InvalidDataError, |
37 | 1d734153 | Giorgos Korfiatis | NoQuantityError, NoCapacityError, |
38 | 1d734153 | Giorgos Korfiatis | DuplicateError) |
39 | fac1de87 | Georgios D. Tsoukalas | |
40 | b0727daf | Giorgos Korfiatis | from astakos.quotaholder.utils.newname import newname |
41 | b0727daf | Giorgos Korfiatis | from astakos.quotaholder.api import QH_PRACTICALLY_INFINITE |
42 | f54beeea | Giorgos Korfiatis | |
43 | 2a3f6a3e | Giorgos Korfiatis | from django.db.models import Q, Count |
44 | 1d2b20aa | Giorgos Korfiatis | from django.db.models import Q |
45 | 1d2b20aa | Giorgos Korfiatis | from .models import (Policy, Holding, |
46 | 8cff5e41 | Giorgos Korfiatis | Commission, Provision, ProvisionLog, |
47 | 789d202d | Giorgos Korfiatis | now, |
48 | 1d2b20aa | Giorgos Korfiatis | db_get_holding, db_get_policy, |
49 | 8cff5e41 | Giorgos Korfiatis | db_get_commission, db_filter_provision) |
50 | fac1de87 | Georgios D. Tsoukalas | |
51 | e5a2e942 | Georgios D. Tsoukalas | |
52 | b0727daf | Giorgos Korfiatis | class QuotaholderDjangoDBCallpoint(object): |
53 | fac1de87 | Georgios D. Tsoukalas | |
54 | e3685916 | Giorgos Korfiatis | def get_limits(self, context=None, get_limits=()): |
55 | fac1de87 | Georgios D. Tsoukalas | limits = [] |
56 | fac1de87 | Georgios D. Tsoukalas | append = limits.append |
57 | fac1de87 | Georgios D. Tsoukalas | |
58 | 3f84d70e | Christos KK Loverdos | for policy in get_limits: |
59 | fac1de87 | Georgios D. Tsoukalas | try:
|
60 | a116d82a | Giorgos Korfiatis | p = Policy.objects.get(policy=policy) |
61 | fac1de87 | Georgios D. Tsoukalas | except Policy.DoesNotExist:
|
62 | fac1de87 | Georgios D. Tsoukalas | continue
|
63 | fac1de87 | Georgios D. Tsoukalas | |
64 | 3adbfafa | Giorgos Korfiatis | append((policy, p.quantity, p.capacity)) |
65 | fac1de87 | Georgios D. Tsoukalas | |
66 | fac1de87 | Georgios D. Tsoukalas | return limits
|
67 | fac1de87 | Georgios D. Tsoukalas | |
68 | e3685916 | Giorgos Korfiatis | def set_limits(self, context=None, set_limits=()): |
69 | fac1de87 | Georgios D. Tsoukalas | |
70 | 3adbfafa | Giorgos Korfiatis | for (policy, quantity, capacity) in set_limits: |
71 | fac1de87 | Georgios D. Tsoukalas | |
72 | e5a2e942 | Georgios D. Tsoukalas | try:
|
73 | e5a2e942 | Georgios D. Tsoukalas | policy = db_get_policy(policy=policy, for_update=True)
|
74 | e5a2e942 | Georgios D. Tsoukalas | except Policy.DoesNotExist:
|
75 | e5a2e942 | Georgios D. Tsoukalas | Policy.objects.create(policy=policy, |
76 | e5a2e942 | Georgios D. Tsoukalas | quantity=quantity, |
77 | e5a2e942 | Georgios D. Tsoukalas | capacity=capacity, |
78 | 3adbfafa | Giorgos Korfiatis | ) |
79 | e5a2e942 | Georgios D. Tsoukalas | else:
|
80 | e5a2e942 | Georgios D. Tsoukalas | policy.quantity = quantity |
81 | e5a2e942 | Georgios D. Tsoukalas | policy.capacity = capacity |
82 | e5a2e942 | Georgios D. Tsoukalas | policy.save() |
83 | fac1de87 | Georgios D. Tsoukalas | |
84 | fac1de87 | Georgios D. Tsoukalas | return ()
|
85 | fac1de87 | Georgios D. Tsoukalas | |
86 | e3685916 | Giorgos Korfiatis | def get_holding(self, context=None, get_holding=()): |
87 | fac1de87 | Georgios D. Tsoukalas | holdings = [] |
88 | fac1de87 | Georgios D. Tsoukalas | append = holdings.append |
89 | fac1de87 | Georgios D. Tsoukalas | |
90 | 8b54001e | Giorgos Korfiatis | for holder, resource in get_holding: |
91 | fac1de87 | Georgios D. Tsoukalas | try:
|
92 | 8b54001e | Giorgos Korfiatis | h = Holding.objects.get(holder=holder, resource=resource) |
93 | fac1de87 | Georgios D. Tsoukalas | except Holding.DoesNotExist:
|
94 | fac1de87 | Georgios D. Tsoukalas | continue
|
95 | fac1de87 | Georgios D. Tsoukalas | |
96 | 8b54001e | Giorgos Korfiatis | append((h.holder, h.resource, h.policy.policy, |
97 | b435047b | root | h.imported, h.exported, |
98 | d6662f65 | root | h.returned, h.released, h.flags)) |
99 | fac1de87 | Georgios D. Tsoukalas | |
100 | fac1de87 | Georgios D. Tsoukalas | return holdings
|
101 | fac1de87 | Georgios D. Tsoukalas | |
102 | e3685916 | Giorgos Korfiatis | def set_holding(self, context=None, set_holding=()): |
103 | fac1de87 | Georgios D. Tsoukalas | rejected = [] |
104 | fac1de87 | Georgios D. Tsoukalas | append = rejected.append |
105 | fac1de87 | Georgios D. Tsoukalas | |
106 | 8b54001e | Giorgos Korfiatis | for holder, resource, policy, flags in set_holding: |
107 | fac1de87 | Georgios D. Tsoukalas | try:
|
108 | fac1de87 | Georgios D. Tsoukalas | p = Policy.objects.get(policy=policy) |
109 | fac1de87 | Georgios D. Tsoukalas | except Policy.DoesNotExist:
|
110 | 8b54001e | Giorgos Korfiatis | append((holder, resource, policy)) |
111 | fac1de87 | Georgios D. Tsoukalas | continue
|
112 | fac1de87 | Georgios D. Tsoukalas | |
113 | fac1de87 | Georgios D. Tsoukalas | try:
|
114 | 8b54001e | Giorgos Korfiatis | h = db_get_holding(holder=holder, resource=resource, |
115 | 5d996aea | Giorgos Korfiatis | for_update=True)
|
116 | fac1de87 | Georgios D. Tsoukalas | h.policy = p |
117 | fac1de87 | Georgios D. Tsoukalas | h.flags = flags |
118 | fac1de87 | Georgios D. Tsoukalas | h.save() |
119 | fac1de87 | Georgios D. Tsoukalas | except Holding.DoesNotExist:
|
120 | 8b54001e | Giorgos Korfiatis | h = Holding.objects.create(holder=holder, resource=resource, |
121 | e5a2e942 | Georgios D. Tsoukalas | policy=p, flags=flags) |
122 | fac1de87 | Georgios D. Tsoukalas | |
123 | eeba67ab | Giorgos Korfiatis | if rejected:
|
124 | b0727daf | Giorgos Korfiatis | raise QuotaholderError(rejected)
|
125 | fac1de87 | Georgios D. Tsoukalas | return rejected
|
126 | fac1de87 | Georgios D. Tsoukalas | |
127 | 1d734153 | Giorgos Korfiatis | def _init_holding(self, |
128 | 8b54001e | Giorgos Korfiatis | holder, resource, policy, |
129 | 1d734153 | Giorgos Korfiatis | imported, exported, returned, released, |
130 | 1d734153 | Giorgos Korfiatis | flags): |
131 | 5b522bc3 | Giorgos Korfiatis | try:
|
132 | 8b54001e | Giorgos Korfiatis | h = db_get_holding(holder=holder, resource=resource, |
133 | 5d996aea | Giorgos Korfiatis | for_update=True)
|
134 | 5b522bc3 | Giorgos Korfiatis | except Holding.DoesNotExist:
|
135 | 8b54001e | Giorgos Korfiatis | h = Holding(holder=holder, resource=resource) |
136 | 5b522bc3 | Giorgos Korfiatis | |
137 | 5b522bc3 | Giorgos Korfiatis | h.policy = policy |
138 | 5b522bc3 | Giorgos Korfiatis | h.flags = flags |
139 | 1d734153 | Giorgos Korfiatis | h.imported = imported |
140 | e5a2e942 | Georgios D. Tsoukalas | h.importing = imported |
141 | 1d734153 | Giorgos Korfiatis | h.exported = exported |
142 | e5a2e942 | Georgios D. Tsoukalas | h.exporting = exported |
143 | 1d734153 | Giorgos Korfiatis | h.returned = returned |
144 | e5a2e942 | Georgios D. Tsoukalas | h.returning = returned |
145 | 1d734153 | Giorgos Korfiatis | h.released = released |
146 | e5a2e942 | Georgios D. Tsoukalas | h.releasing = released |
147 | 5b522bc3 | Giorgos Korfiatis | h.save() |
148 | 5b522bc3 | Giorgos Korfiatis | |
149 | e3685916 | Giorgos Korfiatis | def init_holding(self, context=None, init_holding=()): |
150 | 5b522bc3 | Giorgos Korfiatis | rejected = [] |
151 | 5b522bc3 | Giorgos Korfiatis | append = rejected.append |
152 | 5b522bc3 | Giorgos Korfiatis | |
153 | a7cdc223 | Giorgos Korfiatis | for idx, sfh in enumerate(init_holding): |
154 | 8b54001e | Giorgos Korfiatis | (holder, resource, policy, |
155 | 5b522bc3 | Giorgos Korfiatis | imported, exported, returned, released, |
156 | 5b522bc3 | Giorgos Korfiatis | flags) = sfh |
157 | 5b522bc3 | Giorgos Korfiatis | |
158 | 5b522bc3 | Giorgos Korfiatis | try:
|
159 | 5b522bc3 | Giorgos Korfiatis | p = Policy.objects.get(policy=policy) |
160 | 5b522bc3 | Giorgos Korfiatis | except Policy.DoesNotExist:
|
161 | 5b522bc3 | Giorgos Korfiatis | append(idx) |
162 | 5b522bc3 | Giorgos Korfiatis | continue
|
163 | 5b522bc3 | Giorgos Korfiatis | |
164 | 8b54001e | Giorgos Korfiatis | self._init_holding(holder, resource, p,
|
165 | e5a2e942 | Georgios D. Tsoukalas | imported, exported, |
166 | e5a2e942 | Georgios D. Tsoukalas | returned, released, |
167 | e5a2e942 | Georgios D. Tsoukalas | flags) |
168 | eeba67ab | Giorgos Korfiatis | if rejected:
|
169 | b0727daf | Giorgos Korfiatis | raise QuotaholderError(rejected)
|
170 | 5b522bc3 | Giorgos Korfiatis | return rejected
|
171 | 5b522bc3 | Giorgos Korfiatis | |
172 | e3685916 | Giorgos Korfiatis | def reset_holding(self, context=None, reset_holding=()): |
173 | 4c00b904 | Giorgos Korfiatis | rejected = [] |
174 | 4c00b904 | Giorgos Korfiatis | append = rejected.append |
175 | 4c00b904 | Giorgos Korfiatis | |
176 | 4c00b904 | Giorgos Korfiatis | for idx, tpl in enumerate(reset_holding): |
177 | 8b54001e | Giorgos Korfiatis | (holder, resource, |
178 | 4c00b904 | Giorgos Korfiatis | imported, exported, returned, released) = tpl |
179 | 4c00b904 | Giorgos Korfiatis | |
180 | 4c00b904 | Giorgos Korfiatis | try:
|
181 | 8b54001e | Giorgos Korfiatis | h = db_get_holding(holder=holder, resource=resource, |
182 | 5d996aea | Giorgos Korfiatis | for_update=True)
|
183 | 1d734153 | Giorgos Korfiatis | h.imported = imported |
184 | e5a2e942 | Georgios D. Tsoukalas | h.importing = imported |
185 | 1d734153 | Giorgos Korfiatis | h.exported = exported |
186 | e5a2e942 | Georgios D. Tsoukalas | h.exporting = exported |
187 | 1d734153 | Giorgos Korfiatis | h.returned = returned |
188 | e5a2e942 | Georgios D. Tsoukalas | h.returning = returned |
189 | 1d734153 | Giorgos Korfiatis | h.released = released |
190 | e5a2e942 | Georgios D. Tsoukalas | h.releasing = released |
191 | 4c00b904 | Giorgos Korfiatis | h.save() |
192 | 4c00b904 | Giorgos Korfiatis | except Holding.DoesNotExist:
|
193 | 4c00b904 | Giorgos Korfiatis | append(idx) |
194 | 4c00b904 | Giorgos Korfiatis | continue
|
195 | 4c00b904 | Giorgos Korfiatis | |
196 | eeba67ab | Giorgos Korfiatis | if rejected:
|
197 | b0727daf | Giorgos Korfiatis | raise QuotaholderError(rejected)
|
198 | 4c00b904 | Giorgos Korfiatis | return rejected
|
199 | 4c00b904 | Giorgos Korfiatis | |
200 | 8b54001e | Giorgos Korfiatis | def _check_pending(self, holder, resource): |
201 | 8b54001e | Giorgos Korfiatis | cs = Commission.objects.filter(holder=holder) |
202 | cceadca8 | Giorgos Korfiatis | cs = [c for c in cs if c.provisions.filter(resource=resource)] |
203 | cceadca8 | Giorgos Korfiatis | as_target = [c.serial for c in cs] |
204 | 8dc7c13b | Giorgos Korfiatis | |
205 | 8b54001e | Giorgos Korfiatis | ps = Provision.objects.filter(holder=holder, resource=resource) |
206 | cceadca8 | Giorgos Korfiatis | as_source = [p.serial.serial for p in ps] |
207 | cceadca8 | Giorgos Korfiatis | |
208 | cceadca8 | Giorgos Korfiatis | return as_target + as_source
|
209 | 8dc7c13b | Giorgos Korfiatis | |
210 | 8dc7c13b | Giorgos Korfiatis | def _actual_quantity(self, holding): |
211 | 8dc7c13b | Giorgos Korfiatis | hp = holding.policy |
212 | 8dc7c13b | Giorgos Korfiatis | return hp.quantity + (holding.imported + holding.returned -
|
213 | 8dc7c13b | Giorgos Korfiatis | holding.exported - holding.released) |
214 | 8dc7c13b | Giorgos Korfiatis | |
215 | e3685916 | Giorgos Korfiatis | def release_holding(self, context=None, release_holding=()): |
216 | 8dc7c13b | Giorgos Korfiatis | rejected = [] |
217 | 8dc7c13b | Giorgos Korfiatis | append = rejected.append |
218 | 8dc7c13b | Giorgos Korfiatis | |
219 | 8b54001e | Giorgos Korfiatis | for idx, (holder, resource) in enumerate(release_holding): |
220 | 8dc7c13b | Giorgos Korfiatis | try:
|
221 | 8b54001e | Giorgos Korfiatis | h = db_get_holding(holder=holder, resource=resource, |
222 | 5d996aea | Giorgos Korfiatis | for_update=True)
|
223 | 8dc7c13b | Giorgos Korfiatis | except Holding.DoesNotExist:
|
224 | 8dc7c13b | Giorgos Korfiatis | append(idx) |
225 | 8dc7c13b | Giorgos Korfiatis | continue
|
226 | 8dc7c13b | Giorgos Korfiatis | |
227 | 8b54001e | Giorgos Korfiatis | if self._check_pending(holder, resource): |
228 | 8dc7c13b | Giorgos Korfiatis | append(idx) |
229 | 8dc7c13b | Giorgos Korfiatis | continue
|
230 | 8dc7c13b | Giorgos Korfiatis | |
231 | 8dc7c13b | Giorgos Korfiatis | q = self._actual_quantity(h)
|
232 | 32464501 | Giorgos Korfiatis | if q > 0: |
233 | 1d2b20aa | Giorgos Korfiatis | append(idx) |
234 | 1d2b20aa | Giorgos Korfiatis | continue
|
235 | 32464501 | Giorgos Korfiatis | |
236 | 8dc7c13b | Giorgos Korfiatis | h.delete() |
237 | 8dc7c13b | Giorgos Korfiatis | |
238 | eeba67ab | Giorgos Korfiatis | if rejected:
|
239 | b0727daf | Giorgos Korfiatis | raise QuotaholderError(rejected)
|
240 | 8dc7c13b | Giorgos Korfiatis | return rejected
|
241 | 8dc7c13b | Giorgos Korfiatis | |
242 | 8b54001e | Giorgos Korfiatis | def list_resources(self, context=None, holder=None): |
243 | 8b54001e | Giorgos Korfiatis | holdings = Holding.objects.filter(holder=holder) |
244 | fac1de87 | Georgios D. Tsoukalas | resources = [h.resource for h in holdings] |
245 | fac1de87 | Georgios D. Tsoukalas | return resources
|
246 | fac1de87 | Georgios D. Tsoukalas | |
247 | e3685916 | Giorgos Korfiatis | def list_holdings(self, context=None, list_holdings=()): |
248 | 65f214a2 | Georgios D. Tsoukalas | rejected = [] |
249 | 65f214a2 | Georgios D. Tsoukalas | reject = rejected.append |
250 | 65f214a2 | Georgios D. Tsoukalas | holdings_list = [] |
251 | 65f214a2 | Georgios D. Tsoukalas | append = holdings_list.append |
252 | 65f214a2 | Georgios D. Tsoukalas | |
253 | 8b54001e | Giorgos Korfiatis | for holder in list_holdings: |
254 | 8b54001e | Giorgos Korfiatis | holdings = list(Holding.objects.filter(holder=holder))
|
255 | 1d2b20aa | Giorgos Korfiatis | if not holdings: |
256 | 8b54001e | Giorgos Korfiatis | reject(holder) |
257 | 65f214a2 | Georgios D. Tsoukalas | continue
|
258 | 65f214a2 | Georgios D. Tsoukalas | |
259 | 588d107d | Giorgos Korfiatis | append([(holder, h.resource, |
260 | 588d107d | Giorgos Korfiatis | h.imported, h.exported, h.returned, h.released) |
261 | 1d734153 | Giorgos Korfiatis | for h in holdings]) |
262 | 65f214a2 | Georgios D. Tsoukalas | |
263 | 65f214a2 | Georgios D. Tsoukalas | return holdings_list, rejected
|
264 | 65f214a2 | Georgios D. Tsoukalas | |
265 | e3685916 | Giorgos Korfiatis | def get_quota(self, context=None, get_quota=()): |
266 | fac1de87 | Georgios D. Tsoukalas | quotas = [] |
267 | fac1de87 | Georgios D. Tsoukalas | append = quotas.append |
268 | fac1de87 | Georgios D. Tsoukalas | |
269 | 8b54001e | Giorgos Korfiatis | holders = set(holder for holder, r in get_quota) |
270 | 8b54001e | Giorgos Korfiatis | hs = Holding.objects.select_related().filter(holder__in=holders) |
271 | 8acd9708 | Giorgos Korfiatis | holdings = {} |
272 | 8acd9708 | Giorgos Korfiatis | for h in hs: |
273 | 8b54001e | Giorgos Korfiatis | holdings[(h.holder, h.resource)] = h |
274 | 8acd9708 | Giorgos Korfiatis | |
275 | 8b54001e | Giorgos Korfiatis | for holder, resource in get_quota: |
276 | fac1de87 | Georgios D. Tsoukalas | try:
|
277 | 8b54001e | Giorgos Korfiatis | h = holdings[(holder, resource)] |
278 | 8acd9708 | Giorgos Korfiatis | except:
|
279 | fac1de87 | Georgios D. Tsoukalas | continue
|
280 | fac1de87 | Georgios D. Tsoukalas | |
281 | fac1de87 | Georgios D. Tsoukalas | p = h.policy |
282 | fac1de87 | Georgios D. Tsoukalas | |
283 | 8b54001e | Giorgos Korfiatis | append((h.holder, h.resource, p.quantity, p.capacity, |
284 | b435047b | root | h.imported, h.exported, |
285 | d6662f65 | root | h.returned, h.released, |
286 | b435047b | root | h.flags)) |
287 | fac1de87 | Georgios D. Tsoukalas | |
288 | fac1de87 | Georgios D. Tsoukalas | return quotas
|
289 | fac1de87 | Georgios D. Tsoukalas | |
290 | e3685916 | Giorgos Korfiatis | def set_quota(self, context=None, set_quota=()): |
291 | fac1de87 | Georgios D. Tsoukalas | rejected = [] |
292 | fac1de87 | Georgios D. Tsoukalas | append = rejected.append |
293 | fac1de87 | Georgios D. Tsoukalas | |
294 | 2a3f6a3e | Giorgos Korfiatis | q_holdings = Q() |
295 | 8b54001e | Giorgos Korfiatis | holders = [] |
296 | 3adbfafa | Giorgos Korfiatis | for (holder, resource, _, _, _) in set_quota: |
297 | 8b54001e | Giorgos Korfiatis | holders.append(holder) |
298 | 2a3f6a3e | Giorgos Korfiatis | |
299 | 8b54001e | Giorgos Korfiatis | hs = Holding.objects.filter(holder__in=holders).select_for_update() |
300 | 2a3f6a3e | Giorgos Korfiatis | holdings = {} |
301 | 2a3f6a3e | Giorgos Korfiatis | for h in hs: |
302 | 8b54001e | Giorgos Korfiatis | holdings[(h.holder, h.resource)] = h |
303 | 2a3f6a3e | Giorgos Korfiatis | |
304 | 2a3f6a3e | Giorgos Korfiatis | old_policies = [] |
305 | 2a3f6a3e | Giorgos Korfiatis | |
306 | 8b54001e | Giorgos Korfiatis | for (holder, resource,
|
307 | e5a2e942 | Georgios D. Tsoukalas | quantity, capacity, |
308 | 3adbfafa | Giorgos Korfiatis | flags) in set_quota:
|
309 | fac1de87 | Georgios D. Tsoukalas | |
310 | e5a2e942 | Georgios D. Tsoukalas | policy = newname('policy_')
|
311 | 1d734153 | Giorgos Korfiatis | newp = Policy(policy=policy, |
312 | 1d734153 | Giorgos Korfiatis | quantity=quantity, |
313 | 1d734153 | Giorgos Korfiatis | capacity=capacity, |
314 | 3adbfafa | Giorgos Korfiatis | ) |
315 | fac1de87 | Georgios D. Tsoukalas | |
316 | e5a2e942 | Georgios D. Tsoukalas | try:
|
317 | 8b54001e | Giorgos Korfiatis | h = holdings[(holder, resource)] |
318 | 2a3f6a3e | Giorgos Korfiatis | old_policies.append(h.policy_id) |
319 | e5a2e942 | Georgios D. Tsoukalas | h.policy = newp |
320 | e5a2e942 | Georgios D. Tsoukalas | h.flags = flags |
321 | 2a3f6a3e | Giorgos Korfiatis | except KeyError: |
322 | 8b54001e | Giorgos Korfiatis | h = Holding(holder=holder, resource=resource, |
323 | e5a2e942 | Georgios D. Tsoukalas | policy=newp, flags=flags) |
324 | eec92c03 | Georgios D. Tsoukalas | |
325 | e5a2e942 | Georgios D. Tsoukalas | # the order is intentionally reversed so that it
|
326 | e5a2e942 | Georgios D. Tsoukalas | # would break if we are not within a transaction.
|
327 | e5a2e942 | Georgios D. Tsoukalas | # Has helped before.
|
328 | e5a2e942 | Georgios D. Tsoukalas | h.save() |
329 | e5a2e942 | Georgios D. Tsoukalas | newp.save() |
330 | 8b54001e | Giorgos Korfiatis | holdings[(holder, resource)] = h |
331 | fac1de87 | Georgios D. Tsoukalas | |
332 | 2a3f6a3e | Giorgos Korfiatis | objs = Policy.objects.annotate(refs=Count('holding'))
|
333 | 2a3f6a3e | Giorgos Korfiatis | objs.filter(policy__in=old_policies, refs=0).delete()
|
334 | fac1de87 | Georgios D. Tsoukalas | |
335 | eeba67ab | Giorgos Korfiatis | if rejected:
|
336 | b0727daf | Giorgos Korfiatis | raise QuotaholderError(rejected)
|
337 | fac1de87 | Georgios D. Tsoukalas | return rejected
|
338 | fac1de87 | Georgios D. Tsoukalas | |
339 | 1d734153 | Giorgos Korfiatis | def add_quota(self, |
340 | 8cff5e41 | Giorgos Korfiatis | context=None,
|
341 | 1d734153 | Giorgos Korfiatis | sub_quota=(), add_quota=()): |
342 | 4ec8c043 | Giorgos Korfiatis | rejected = [] |
343 | 4ec8c043 | Giorgos Korfiatis | append = rejected.append |
344 | 4ec8c043 | Giorgos Korfiatis | |
345 | 2a3f6a3e | Giorgos Korfiatis | sources = sub_quota + add_quota |
346 | 2a3f6a3e | Giorgos Korfiatis | q_holdings = Q() |
347 | 8b54001e | Giorgos Korfiatis | holders = [] |
348 | 3adbfafa | Giorgos Korfiatis | for (holder, resource, _, _) in sources: |
349 | 8b54001e | Giorgos Korfiatis | holders.append(holder) |
350 | 2a3f6a3e | Giorgos Korfiatis | |
351 | 8b54001e | Giorgos Korfiatis | hs = Holding.objects.filter(holder__in=holders).select_for_update() |
352 | 2a3f6a3e | Giorgos Korfiatis | holdings = {} |
353 | 2a3f6a3e | Giorgos Korfiatis | for h in hs: |
354 | 8b54001e | Giorgos Korfiatis | holdings[(h.holder, h.resource)] = h |
355 | 2a3f6a3e | Giorgos Korfiatis | |
356 | 2a3f6a3e | Giorgos Korfiatis | pids = [h.policy_id for h in hs] |
357 | 2a3f6a3e | Giorgos Korfiatis | policies = Policy.objects.in_bulk(pids) |
358 | 2a3f6a3e | Giorgos Korfiatis | |
359 | 2a3f6a3e | Giorgos Korfiatis | old_policies = [] |
360 | 2a3f6a3e | Giorgos Korfiatis | |
361 | d2b32360 | Giorgos Korfiatis | for removing, source in [(True, sub_quota), (False, add_quota)]: |
362 | 8b54001e | Giorgos Korfiatis | for (holder, resource,
|
363 | e5a2e942 | Georgios D. Tsoukalas | quantity, capacity, |
364 | 3adbfafa | Giorgos Korfiatis | ) in source:
|
365 | 4ec8c043 | Giorgos Korfiatis | |
366 | e5a2e942 | Georgios D. Tsoukalas | try:
|
367 | 8b54001e | Giorgos Korfiatis | h = holdings[(holder, resource)] |
368 | 2a3f6a3e | Giorgos Korfiatis | old_policies.append(h.policy_id) |
369 | 2a3f6a3e | Giorgos Korfiatis | try:
|
370 | 2a3f6a3e | Giorgos Korfiatis | p = policies[h.policy_id] |
371 | 2a3f6a3e | Giorgos Korfiatis | except KeyError: |
372 | 2a3f6a3e | Giorgos Korfiatis | raise AssertionError("no policy %s" % h.policy_id) |
373 | 2a3f6a3e | Giorgos Korfiatis | except KeyError: |
374 | e5a2e942 | Georgios D. Tsoukalas | if removing:
|
375 | 8b54001e | Giorgos Korfiatis | append((holder, resource)) |
376 | d2b32360 | Giorgos Korfiatis | continue
|
377 | 1d2b20aa | Giorgos Korfiatis | |
378 | 8b54001e | Giorgos Korfiatis | h = Holding(holder=holder, resource=resource, flags=0)
|
379 | e5a2e942 | Georgios D. Tsoukalas | p = None
|
380 | e5a2e942 | Georgios D. Tsoukalas | |
381 | e5a2e942 | Georgios D. Tsoukalas | policy = newname('policy_')
|
382 | e5a2e942 | Georgios D. Tsoukalas | newp = Policy(policy=policy) |
383 | e5a2e942 | Georgios D. Tsoukalas | |
384 | e5a2e942 | Georgios D. Tsoukalas | newp.quantity = _add(p.quantity if p else 0, quantity, |
385 | e5a2e942 | Georgios D. Tsoukalas | invert=removing) |
386 | e5a2e942 | Georgios D. Tsoukalas | newp.capacity = _add(p.capacity if p else 0, capacity, |
387 | e5a2e942 | Georgios D. Tsoukalas | invert=removing) |
388 | 3adbfafa | Giorgos Korfiatis | |
389 | 3adbfafa | Giorgos Korfiatis | if _isneg(newp.capacity):
|
390 | 8b54001e | Giorgos Korfiatis | append((holder, resource)) |
391 | e5a2e942 | Georgios D. Tsoukalas | continue
|
392 | 4ec8c043 | Giorgos Korfiatis | |
393 | e5a2e942 | Georgios D. Tsoukalas | h.policy = newp |
394 | 4ec8c043 | Giorgos Korfiatis | |
395 | e5a2e942 | Georgios D. Tsoukalas | # the order is intentionally reversed so that it
|
396 | e5a2e942 | Georgios D. Tsoukalas | # would break if we are not within a transaction.
|
397 | e5a2e942 | Georgios D. Tsoukalas | # Has helped before.
|
398 | e5a2e942 | Georgios D. Tsoukalas | h.save() |
399 | e5a2e942 | Georgios D. Tsoukalas | newp.save() |
400 | 2a3f6a3e | Giorgos Korfiatis | policies[policy] = newp |
401 | 8b54001e | Giorgos Korfiatis | holdings[(holder, resource)] = h |
402 | 4ec8c043 | Giorgos Korfiatis | |
403 | 2a3f6a3e | Giorgos Korfiatis | objs = Policy.objects.annotate(refs=Count('holding'))
|
404 | 2a3f6a3e | Giorgos Korfiatis | objs.filter(policy__in=old_policies, refs=0).delete()
|
405 | 4ec8c043 | Giorgos Korfiatis | |
406 | 4ec8c043 | Giorgos Korfiatis | if rejected:
|
407 | b0727daf | Giorgos Korfiatis | raise QuotaholderError(rejected)
|
408 | 789d202d | Giorgos Korfiatis | |
409 | 4ec8c043 | Giorgos Korfiatis | return rejected
|
410 | 4ec8c043 | Giorgos Korfiatis | |
411 | 1d734153 | Giorgos Korfiatis | def issue_commission(self, |
412 | e3685916 | Giorgos Korfiatis | context=None,
|
413 | 1d734153 | Giorgos Korfiatis | clientkey=None,
|
414 | 1d734153 | Giorgos Korfiatis | target=None,
|
415 | 1d734153 | Giorgos Korfiatis | name=None,
|
416 | 1d734153 | Giorgos Korfiatis | provisions=()): |
417 | fac1de87 | Georgios D. Tsoukalas | |
418 | c3a709ad | root | create = Commission.objects.create |
419 | 8b54001e | Giorgos Korfiatis | commission = create(holder=target, clientkey=clientkey, name=name) |
420 | fac1de87 | Georgios D. Tsoukalas | serial = commission.serial |
421 | fac1de87 | Georgios D. Tsoukalas | |
422 | 6afede3f | Giorgos Korfiatis | checked = [] |
423 | 8b54001e | Giorgos Korfiatis | for holder, resource, quantity in provisions: |
424 | 6afede3f | Giorgos Korfiatis | |
425 | 8b54001e | Giorgos Korfiatis | if holder == target:
|
426 | 8b54001e | Giorgos Korfiatis | m = "Cannot issue commission from an holder to itself (%s)" % (
|
427 | 8b54001e | Giorgos Korfiatis | holder,) |
428 | 4eb170f3 | Giorgos Korfiatis | raise InvalidDataError(m)
|
429 | 4eb170f3 | Giorgos Korfiatis | |
430 | 8b54001e | Giorgos Korfiatis | ent_res = holder, resource |
431 | 6afede3f | Giorgos Korfiatis | if ent_res in checked: |
432 | 6afede3f | Giorgos Korfiatis | m = "Duplicate provision for %s.%s" % ent_res
|
433 | 6afede3f | Giorgos Korfiatis | raise DuplicateError(m)
|
434 | 6afede3f | Giorgos Korfiatis | checked.append(ent_res) |
435 | 6afede3f | Giorgos Korfiatis | |
436 | c3a709ad | root | release = 0
|
437 | c3a709ad | root | if quantity < 0: |
438 | c3a709ad | root | release = 1
|
439 | c3a709ad | root | |
440 | f631150c | Giorgos Korfiatis | # Source limits checks
|
441 | fac1de87 | Georgios D. Tsoukalas | try:
|
442 | 8b54001e | Giorgos Korfiatis | h = db_get_holding(holder=holder, resource=resource, |
443 | 5d996aea | Giorgos Korfiatis | for_update=True)
|
444 | fac1de87 | Georgios D. Tsoukalas | except Holding.DoesNotExist:
|
445 | d551c841 | Georgios D. Tsoukalas | m = ("There is no quantity "
|
446 | 8b54001e | Giorgos Korfiatis | "to allocate from in %s.%s" % (holder, resource))
|
447 | f631150c | Giorgos Korfiatis | raise NoQuantityError(m,
|
448 | 8b54001e | Giorgos Korfiatis | source=holder, target=target, |
449 | f631150c | Giorgos Korfiatis | resource=resource, requested=quantity, |
450 | f631150c | Giorgos Korfiatis | current=0, limit=0) |
451 | fac1de87 | Georgios D. Tsoukalas | |
452 | fac1de87 | Georgios D. Tsoukalas | hp = h.policy |
453 | fac1de87 | Georgios D. Tsoukalas | |
454 | d551c841 | Georgios D. Tsoukalas | if not release: |
455 | d551c841 | Georgios D. Tsoukalas | limit = hp.quantity + h.imported - h.releasing |
456 | d551c841 | Georgios D. Tsoukalas | unavailable = h.exporting - h.returned |
457 | d551c841 | Georgios D. Tsoukalas | available = limit - unavailable |
458 | d551c841 | Georgios D. Tsoukalas | |
459 | d551c841 | Georgios D. Tsoukalas | if quantity > available:
|
460 | d551c841 | Georgios D. Tsoukalas | m = ("There is not enough quantity "
|
461 | 8b54001e | Giorgos Korfiatis | "to allocate from in %s.%s" % (holder, resource))
|
462 | d551c841 | Georgios D. Tsoukalas | raise NoQuantityError(m,
|
463 | 8b54001e | Giorgos Korfiatis | source=holder, |
464 | e5a2e942 | Georgios D. Tsoukalas | target=target, |
465 | e5a2e942 | Georgios D. Tsoukalas | resource=resource, |
466 | e5a2e942 | Georgios D. Tsoukalas | requested=quantity, |
467 | e5a2e942 | Georgios D. Tsoukalas | current=unavailable, |
468 | e5a2e942 | Georgios D. Tsoukalas | limit=limit) |
469 | d551c841 | Georgios D. Tsoukalas | else:
|
470 | d551c841 | Georgios D. Tsoukalas | current = (+ h.importing + h.returning |
471 | 1d734153 | Giorgos Korfiatis | - h.exported - h.returned) |
472 | d551c841 | Georgios D. Tsoukalas | limit = hp.capacity |
473 | d551c841 | Georgios D. Tsoukalas | if current - quantity > limit:
|
474 | d551c841 | Georgios D. Tsoukalas | m = ("There is not enough capacity "
|
475 | 8b54001e | Giorgos Korfiatis | "to release to in %s.%s" % (holder, resource))
|
476 | d551c841 | Georgios D. Tsoukalas | raise NoQuantityError(m,
|
477 | 8b54001e | Giorgos Korfiatis | source=holder, |
478 | e5a2e942 | Georgios D. Tsoukalas | target=target, |
479 | e5a2e942 | Georgios D. Tsoukalas | resource=resource, |
480 | e5a2e942 | Georgios D. Tsoukalas | requested=quantity, |
481 | e5a2e942 | Georgios D. Tsoukalas | current=current, |
482 | e5a2e942 | Georgios D. Tsoukalas | limit=limit) |
483 | fac1de87 | Georgios D. Tsoukalas | |
484 | f631150c | Giorgos Korfiatis | # Target limits checks
|
485 | fac1de87 | Georgios D. Tsoukalas | try:
|
486 | 8b54001e | Giorgos Korfiatis | th = db_get_holding(holder=target, resource=resource, |
487 | 5d996aea | Giorgos Korfiatis | for_update=True)
|
488 | fac1de87 | Georgios D. Tsoukalas | except Holding.DoesNotExist:
|
489 | ea818d33 | Georgios D. Tsoukalas | m = ("There is no capacity "
|
490 | fac1de87 | Georgios D. Tsoukalas | "to allocate into in %s.%s" % (target, resource))
|
491 | f631150c | Giorgos Korfiatis | raise NoCapacityError(m,
|
492 | 8b54001e | Giorgos Korfiatis | source=holder, |
493 | e5a2e942 | Georgios D. Tsoukalas | target=target, |
494 | e5a2e942 | Georgios D. Tsoukalas | resource=resource, |
495 | e5a2e942 | Georgios D. Tsoukalas | requested=quantity, |
496 | e5a2e942 | Georgios D. Tsoukalas | current=0,
|
497 | e5a2e942 | Georgios D. Tsoukalas | limit=0)
|
498 | fac1de87 | Georgios D. Tsoukalas | |
499 | fac1de87 | Georgios D. Tsoukalas | tp = th.policy |
500 | fac1de87 | Georgios D. Tsoukalas | |
501 | d551c841 | Georgios D. Tsoukalas | if not release: |
502 | 6e4e100b | Giorgos Korfiatis | limit = tp.quantity + tp.capacity |
503 | 6e4e100b | Giorgos Korfiatis | current = (+ th.importing + th.returning + tp.quantity |
504 | d551c841 | Georgios D. Tsoukalas | - th.exported - th.released) |
505 | 08ce0e6f | Giorgos Korfiatis | |
506 | 6e4e100b | Giorgos Korfiatis | if current + quantity > limit:
|
507 | 08ce0e6f | Giorgos Korfiatis | m = ("There is not enough capacity "
|
508 | 08ce0e6f | Giorgos Korfiatis | "to allocate into in %s.%s" % (target, resource))
|
509 | 08ce0e6f | Giorgos Korfiatis | raise NoCapacityError(m,
|
510 | 8b54001e | Giorgos Korfiatis | source=holder, |
511 | e5a2e942 | Georgios D. Tsoukalas | target=target, |
512 | e5a2e942 | Georgios D. Tsoukalas | resource=resource, |
513 | e5a2e942 | Georgios D. Tsoukalas | requested=quantity, |
514 | e5a2e942 | Georgios D. Tsoukalas | current=current, |
515 | e5a2e942 | Georgios D. Tsoukalas | limit=limit) |
516 | d551c841 | Georgios D. Tsoukalas | else:
|
517 | d551c841 | Georgios D. Tsoukalas | limit = tp.quantity + th.imported - th.releasing |
518 | d551c841 | Georgios D. Tsoukalas | unavailable = th.exporting - th.returned |
519 | d551c841 | Georgios D. Tsoukalas | available = limit - unavailable |
520 | d551c841 | Georgios D. Tsoukalas | |
521 | d551c841 | Georgios D. Tsoukalas | if available + quantity < 0: |
522 | d551c841 | Georgios D. Tsoukalas | m = ("There is not enough quantity "
|
523 | d551c841 | Georgios D. Tsoukalas | "to release from in %s.%s" % (target, resource))
|
524 | d551c841 | Georgios D. Tsoukalas | raise NoCapacityError(m,
|
525 | 8b54001e | Giorgos Korfiatis | source=holder, |
526 | e5a2e942 | Georgios D. Tsoukalas | target=target, |
527 | e5a2e942 | Georgios D. Tsoukalas | resource=resource, |
528 | e5a2e942 | Georgios D. Tsoukalas | requested=quantity, |
529 | e5a2e942 | Georgios D. Tsoukalas | current=unavailable, |
530 | e5a2e942 | Georgios D. Tsoukalas | limit=limit) |
531 | e5a2e942 | Georgios D. Tsoukalas | |
532 | 1d734153 | Giorgos Korfiatis | Provision.objects.create(serial=commission, |
533 | 8b54001e | Giorgos Korfiatis | holder=holder, |
534 | 1d734153 | Giorgos Korfiatis | resource=resource, |
535 | 1d734153 | Giorgos Korfiatis | quantity=quantity) |
536 | f590f930 | Georgios D. Tsoukalas | if release:
|
537 | d6662f65 | root | h.returning -= quantity |
538 | f590f930 | Georgios D. Tsoukalas | th.releasing -= quantity |
539 | f590f930 | Georgios D. Tsoukalas | else:
|
540 | f590f930 | Georgios D. Tsoukalas | h.exporting += quantity |
541 | f590f930 | Georgios D. Tsoukalas | th.importing += quantity |
542 | fac1de87 | Georgios D. Tsoukalas | |
543 | fac1de87 | Georgios D. Tsoukalas | h.save() |
544 | fac1de87 | Georgios D. Tsoukalas | th.save() |
545 | fac1de87 | Georgios D. Tsoukalas | |
546 | fac1de87 | Georgios D. Tsoukalas | return serial
|
547 | fac1de87 | Georgios D. Tsoukalas | |
548 | 1d734153 | Giorgos Korfiatis | def _log_provision(self, |
549 | 1d734153 | Giorgos Korfiatis | commission, s_holding, t_holding, |
550 | 1d734153 | Giorgos Korfiatis | provision, log_time, reason): |
551 | 1dedc367 | Georgios D. Tsoukalas | |
552 | 8b54001e | Giorgos Korfiatis | s_holder = s_holding.holder |
553 | d6662f65 | root | s_policy = s_holding.policy |
554 | 8b54001e | Giorgos Korfiatis | t_holder = t_holding.holder |
555 | d6662f65 | root | t_policy = t_holding.policy |
556 | 1dedc367 | Georgios D. Tsoukalas | |
557 | 1d734153 | Giorgos Korfiatis | kwargs = { |
558 | 1d734153 | Giorgos Korfiatis | 'serial': commission.serial,
|
559 | 1d734153 | Giorgos Korfiatis | 'name': commission.name,
|
560 | 8b54001e | Giorgos Korfiatis | 'source': s_holder,
|
561 | 8b54001e | Giorgos Korfiatis | 'target': t_holder,
|
562 | 1d734153 | Giorgos Korfiatis | 'resource': provision.resource,
|
563 | 1d734153 | Giorgos Korfiatis | 'source_quantity': s_policy.quantity,
|
564 | 1d734153 | Giorgos Korfiatis | 'source_capacity': s_policy.capacity,
|
565 | 1d734153 | Giorgos Korfiatis | 'source_imported': s_holding.imported,
|
566 | 1d734153 | Giorgos Korfiatis | 'source_exported': s_holding.exported,
|
567 | 1d734153 | Giorgos Korfiatis | 'source_returned': s_holding.returned,
|
568 | 1d734153 | Giorgos Korfiatis | 'source_released': s_holding.released,
|
569 | 1d734153 | Giorgos Korfiatis | 'target_quantity': t_policy.quantity,
|
570 | 1d734153 | Giorgos Korfiatis | 'target_capacity': t_policy.capacity,
|
571 | 1d734153 | Giorgos Korfiatis | 'target_imported': t_holding.imported,
|
572 | 1d734153 | Giorgos Korfiatis | 'target_exported': t_holding.exported,
|
573 | 1d734153 | Giorgos Korfiatis | 'target_returned': t_holding.returned,
|
574 | 1d734153 | Giorgos Korfiatis | 'target_released': t_holding.released,
|
575 | 1d734153 | Giorgos Korfiatis | 'delta_quantity': provision.quantity,
|
576 | 1d734153 | Giorgos Korfiatis | 'issue_time': commission.issue_time,
|
577 | 1d734153 | Giorgos Korfiatis | 'log_time': log_time,
|
578 | 1d734153 | Giorgos Korfiatis | 'reason': reason,
|
579 | 1d734153 | Giorgos Korfiatis | } |
580 | 1d734153 | Giorgos Korfiatis | |
581 | 1d734153 | Giorgos Korfiatis | ProvisionLog.objects.create(**kwargs) |
582 | 1d734153 | Giorgos Korfiatis | |
583 | 1d734153 | Giorgos Korfiatis | def accept_commission(self, |
584 | e3685916 | Giorgos Korfiatis | context=None, clientkey=None, |
585 | 1d734153 | Giorgos Korfiatis | serials=(), reason=''):
|
586 | b435047b | root | log_time = now() |
587 | b435047b | root | |
588 | fe6c61fb | root | for serial in serials: |
589 | fe6c61fb | root | try:
|
590 | 5d996aea | Giorgos Korfiatis | c = db_get_commission(clientkey=clientkey, serial=serial, |
591 | 5d996aea | Giorgos Korfiatis | for_update=True)
|
592 | fe6c61fb | root | except Commission.DoesNotExist:
|
593 | fe6c61fb | root | return
|
594 | fac1de87 | Georgios D. Tsoukalas | |
595 | 8b54001e | Giorgos Korfiatis | t = c.holder |
596 | fac1de87 | Georgios D. Tsoukalas | |
597 | 5d996aea | Giorgos Korfiatis | provisions = db_filter_provision(serial=serial, for_update=True)
|
598 | fe6c61fb | root | for pv in provisions: |
599 | fe6c61fb | root | try:
|
600 | 8b54001e | Giorgos Korfiatis | h = db_get_holding(holder=pv.holder, |
601 | 5d996aea | Giorgos Korfiatis | resource=pv.resource, for_update=True)
|
602 | 8b54001e | Giorgos Korfiatis | th = db_get_holding(holder=t, resource=pv.resource, |
603 | 5d996aea | Giorgos Korfiatis | for_update=True)
|
604 | fe6c61fb | root | except Holding.DoesNotExist:
|
605 | fe6c61fb | root | m = "Corrupted provision"
|
606 | fe6c61fb | root | raise CorruptedError(m)
|
607 | fac1de87 | Georgios D. Tsoukalas | |
608 | fe6c61fb | root | quantity = pv.quantity |
609 | fe6c61fb | root | release = 0
|
610 | fe6c61fb | root | if quantity < 0: |
611 | fe6c61fb | root | release = 1
|
612 | f590f930 | Georgios D. Tsoukalas | |
613 | fe6c61fb | root | if release:
|
614 | d6662f65 | root | h.returned -= quantity |
615 | fe6c61fb | root | th.released -= quantity |
616 | fe6c61fb | root | else:
|
617 | fe6c61fb | root | h.exported += quantity |
618 | fe6c61fb | root | th.imported += quantity |
619 | f590f930 | Georgios D. Tsoukalas | |
620 | fe6c61fb | root | reason = 'ACCEPT:' + reason[-121:] |
621 | b435047b | root | self._log_provision(c, h, th, pv, log_time, reason)
|
622 | fe6c61fb | root | h.save() |
623 | fe6c61fb | root | th.save() |
624 | fe6c61fb | root | pv.delete() |
625 | 7661c43c | Christos Stavrakakis | c.delete() |
626 | fac1de87 | Georgios D. Tsoukalas | |
627 | fac1de87 | Georgios D. Tsoukalas | return
|
628 | fac1de87 | Georgios D. Tsoukalas | |
629 | 1d734153 | Giorgos Korfiatis | def reject_commission(self, |
630 | e3685916 | Giorgos Korfiatis | context=None, clientkey=None, |
631 | 1d734153 | Giorgos Korfiatis | serials=(), reason=''):
|
632 | b435047b | root | log_time = now() |
633 | b435047b | root | |
634 | fe6c61fb | root | for serial in serials: |
635 | fe6c61fb | root | try:
|
636 | 5d996aea | Giorgos Korfiatis | c = db_get_commission(clientkey=clientkey, serial=serial, |
637 | 5d996aea | Giorgos Korfiatis | for_update=True)
|
638 | fe6c61fb | root | except Commission.DoesNotExist:
|
639 | fe6c61fb | root | return
|
640 | fac1de87 | Georgios D. Tsoukalas | |
641 | 8b54001e | Giorgos Korfiatis | t = c.holder |
642 | fac1de87 | Georgios D. Tsoukalas | |
643 | 5d996aea | Giorgos Korfiatis | provisions = db_filter_provision(serial=serial, for_update=True)
|
644 | fe6c61fb | root | for pv in provisions: |
645 | fe6c61fb | root | try:
|
646 | 8b54001e | Giorgos Korfiatis | h = db_get_holding(holder=pv.holder, |
647 | 5d996aea | Giorgos Korfiatis | resource=pv.resource, for_update=True)
|
648 | 8b54001e | Giorgos Korfiatis | th = db_get_holding(holder=t, resource=pv.resource, |
649 | 5d996aea | Giorgos Korfiatis | for_update=True)
|
650 | fe6c61fb | root | except Holding.DoesNotExist:
|
651 | fe6c61fb | root | m = "Corrupted provision"
|
652 | fe6c61fb | root | raise CorruptedError(m)
|
653 | fac1de87 | Georgios D. Tsoukalas | |
654 | fe6c61fb | root | quantity = pv.quantity |
655 | fe6c61fb | root | release = 0
|
656 | fe6c61fb | root | if quantity < 0: |
657 | fe6c61fb | root | release = 1
|
658 | f590f930 | Georgios D. Tsoukalas | |
659 | fe6c61fb | root | if release:
|
660 | d6662f65 | root | h.returning += quantity |
661 | fe6c61fb | root | th.releasing += quantity |
662 | fe6c61fb | root | else:
|
663 | fe6c61fb | root | h.exporting -= quantity |
664 | fe6c61fb | root | th.importing -= quantity |
665 | fe6c61fb | root | |
666 | fe6c61fb | root | reason = 'REJECT:' + reason[-121:] |
667 | b435047b | root | self._log_provision(c, h, th, pv, log_time, reason)
|
668 | fe6c61fb | root | h.save() |
669 | fe6c61fb | root | th.save() |
670 | fe6c61fb | root | pv.delete() |
671 | 7661c43c | Christos Stavrakakis | c.delete() |
672 | fac1de87 | Georgios D. Tsoukalas | |
673 | fac1de87 | Georgios D. Tsoukalas | return
|
674 | fac1de87 | Georgios D. Tsoukalas | |
675 | e3685916 | Giorgos Korfiatis | def get_pending_commissions(self, context=None, clientkey=None): |
676 | e5a2e942 | Georgios D. Tsoukalas | pending = Commission.objects.filter(clientkey=clientkey) |
677 | e5a2e942 | Georgios D. Tsoukalas | pending_list = pending.values_list('serial', flat=True) |
678 | e5a2e942 | Georgios D. Tsoukalas | return pending_list
|
679 | fac1de87 | Georgios D. Tsoukalas | |
680 | 1d734153 | Giorgos Korfiatis | def resolve_pending_commissions(self, |
681 | e3685916 | Giorgos Korfiatis | context=None, clientkey=None, |
682 | 1d734153 | Giorgos Korfiatis | max_serial=None, accept_set=()):
|
683 | fac1de87 | Georgios D. Tsoukalas | accept_set = set(accept_set)
|
684 | e5a2e942 | Georgios D. Tsoukalas | pending = self.get_pending_commissions(context=context,
|
685 | e5a2e942 | Georgios D. Tsoukalas | clientkey=clientkey) |
686 | fac1de87 | Georgios D. Tsoukalas | pending = sorted(pending)
|
687 | fac1de87 | Georgios D. Tsoukalas | |
688 | fac1de87 | Georgios D. Tsoukalas | accept = self.accept_commission
|
689 | fac1de87 | Georgios D. Tsoukalas | reject = self.reject_commission
|
690 | fac1de87 | Georgios D. Tsoukalas | |
691 | fac1de87 | Georgios D. Tsoukalas | for serial in pending: |
692 | fac1de87 | Georgios D. Tsoukalas | if serial > max_serial:
|
693 | fac1de87 | Georgios D. Tsoukalas | break
|
694 | fac1de87 | Georgios D. Tsoukalas | |
695 | fac1de87 | Georgios D. Tsoukalas | if serial in accept_set: |
696 | ddf2e911 | Giorgos Korfiatis | accept(context=context, clientkey=clientkey, serials=[serial]) |
697 | fac1de87 | Georgios D. Tsoukalas | else:
|
698 | ddf2e911 | Giorgos Korfiatis | reject(context=context, clientkey=clientkey, serials=[serial]) |
699 | fac1de87 | Georgios D. Tsoukalas | |
700 | fac1de87 | Georgios D. Tsoukalas | return
|
701 | fac1de87 | Georgios D. Tsoukalas | |
702 | e3685916 | Giorgos Korfiatis | def get_timeline(self, context=None, after="", before="Z", get_timeline=()): |
703 | 8b54001e | Giorgos Korfiatis | holder_set = set()
|
704 | 8b54001e | Giorgos Korfiatis | e_add = holder_set.add |
705 | 0360f54b | root | resource_set = set()
|
706 | 0360f54b | root | r_add = resource_set.add |
707 | f590f930 | Georgios D. Tsoukalas | |
708 | 8b54001e | Giorgos Korfiatis | for holder, resource in get_timeline: |
709 | 8b54001e | Giorgos Korfiatis | if holder not in holder_set: |
710 | 8b54001e | Giorgos Korfiatis | e_add(holder) |
711 | 0360f54b | root | |
712 | 8b54001e | Giorgos Korfiatis | r_add((holder, resource)) |
713 | f590f930 | Georgios D. Tsoukalas | |
714 | f590f930 | Georgios D. Tsoukalas | chunk_size = 65536
|
715 | f590f930 | Georgios D. Tsoukalas | nr = 0
|
716 | f590f930 | Georgios D. Tsoukalas | timeline = [] |
717 | 0360f54b | root | append = timeline.append |
718 | 1dedc367 | Georgios D. Tsoukalas | filterlogs = ProvisionLog.objects.filter |
719 | 8b54001e | Giorgos Korfiatis | if holder_set:
|
720 | 8b54001e | Giorgos Korfiatis | q_holder = Q(source__in=holder_set) | Q(target__in=holder_set) |
721 | 1dedc367 | Georgios D. Tsoukalas | else:
|
722 | 8b54001e | Giorgos Korfiatis | q_holder = Q() |
723 | 1dedc367 | Georgios D. Tsoukalas | |
724 | 1dedc367 | Georgios D. Tsoukalas | while 1: |
725 | 8b54001e | Giorgos Korfiatis | logs = filterlogs(q_holder, |
726 | 1d734153 | Giorgos Korfiatis | issue_time__gt=after, |
727 | 1d734153 | Giorgos Korfiatis | issue_time__lte=before, |
728 | 1d734153 | Giorgos Korfiatis | reason__startswith='ACCEPT:')
|
729 | f590f930 | Georgios D. Tsoukalas | |
730 | f590f930 | Georgios D. Tsoukalas | logs = logs.order_by('issue_time')
|
731 | d6662f65 | root | #logs = logs.values()
|
732 | f590f930 | Georgios D. Tsoukalas | logs = logs[:chunk_size] |
733 | f590f930 | Georgios D. Tsoukalas | nr += len(logs)
|
734 | f590f930 | Georgios D. Tsoukalas | if not logs: |
735 | f590f930 | Georgios D. Tsoukalas | break
|
736 | 0360f54b | root | for g in logs: |
737 | 0360f54b | root | if ((g.source, g.resource) not in resource_set |
738 | 0360f54b | root | or (g.target, g.resource) not in resource_set): |
739 | e5a2e942 | Georgios D. Tsoukalas | continue
|
740 | 0360f54b | root | |
741 | d6662f65 | root | o = { |
742 | 1d734153 | Giorgos Korfiatis | 'serial': g.serial,
|
743 | 1d734153 | Giorgos Korfiatis | 'source': g.source,
|
744 | 1d734153 | Giorgos Korfiatis | 'target': g.target,
|
745 | 1d734153 | Giorgos Korfiatis | 'resource': g.resource,
|
746 | 1d734153 | Giorgos Korfiatis | 'name': g.name,
|
747 | 1d734153 | Giorgos Korfiatis | 'quantity': g.delta_quantity,
|
748 | 1d734153 | Giorgos Korfiatis | 'source_allocated': g.source_allocated(),
|
749 | 1d734153 | Giorgos Korfiatis | 'source_allocated_through': g.source_allocated_through(),
|
750 | 1d734153 | Giorgos Korfiatis | 'source_inbound': g.source_inbound(),
|
751 | 1d734153 | Giorgos Korfiatis | 'source_inbound_through': g.source_inbound_through(),
|
752 | 1d734153 | Giorgos Korfiatis | 'source_outbound': g.source_outbound(),
|
753 | 1d734153 | Giorgos Korfiatis | 'source_outbound_through': g.source_outbound_through(),
|
754 | 1d734153 | Giorgos Korfiatis | 'target_allocated': g.target_allocated(),
|
755 | 1d734153 | Giorgos Korfiatis | 'target_allocated_through': g.target_allocated_through(),
|
756 | 1d734153 | Giorgos Korfiatis | 'target_inbound': g.target_inbound(),
|
757 | 1d734153 | Giorgos Korfiatis | 'target_inbound_through': g.target_inbound_through(),
|
758 | 1d734153 | Giorgos Korfiatis | 'target_outbound': g.target_outbound(),
|
759 | 1d734153 | Giorgos Korfiatis | 'target_outbound_through': g.target_outbound_through(),
|
760 | 1d734153 | Giorgos Korfiatis | 'issue_time': g.issue_time,
|
761 | 1d734153 | Giorgos Korfiatis | 'log_time': g.log_time,
|
762 | 1d734153 | Giorgos Korfiatis | 'reason': g.reason,
|
763 | d6662f65 | root | } |
764 | d36dcd3d | Christos KK Loverdos | |
765 | 0360f54b | root | append(o) |
766 | d6662f65 | root | |
767 | d6662f65 | root | after = g.issue_time |
768 | f590f930 | Georgios D. Tsoukalas | if after >= before:
|
769 | f590f930 | Georgios D. Tsoukalas | break
|
770 | f590f930 | Georgios D. Tsoukalas | |
771 | f590f930 | Georgios D. Tsoukalas | return timeline
|
772 | f590f930 | Georgios D. Tsoukalas | |
773 | e5a2e942 | Georgios D. Tsoukalas | |
774 | d2b32360 | Giorgos Korfiatis | def _add(x, y, invert=False): |
775 | d2b32360 | Giorgos Korfiatis | return x + y if not invert else x - y |
776 | 4ec8c043 | Giorgos Korfiatis | |
777 | e5a2e942 | Georgios D. Tsoukalas | |
778 | 4ec8c043 | Giorgos Korfiatis | def _isneg(x): |
779 | 4ec8c043 | Giorgos Korfiatis | return x < 0 |
780 | f590f930 | Georgios D. Tsoukalas | |
781 | e5a2e942 | Georgios D. Tsoukalas | |
782 | fac1de87 | Georgios D. Tsoukalas | API_Callpoint = QuotaholderDjangoDBCallpoint |