Statistics
| Branch: | Tag: | Revision:

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