Statistics
| Branch: | Tag: | Revision:

root / snf-quotaholder-app / quotaholder_django / quotaholder_app / callpoint.py @ 5d996aea

History | View | Annotate | Download (29.8 kB)

1 3e5941c1 Giorgos Korfiatis
# Copyright 2012 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 833abd3c Giorgos Korfiatis
from synnefo.lib.quotaholder.api import (
35 833abd3c Giorgos Korfiatis
                            QuotaholderAPI,
36 fac1de87 Georgios D. Tsoukalas
                            InvalidKeyError, NoEntityError,
37 3a7732f5 Georgios D. Tsoukalas
                            NoQuantityError, NoCapacityError,
38 6afede3f Giorgos Korfiatis
                            ExportLimitError, ImportLimitError,
39 6afede3f Giorgos Korfiatis
                            DuplicateError)
40 fac1de87 Georgios D. Tsoukalas
41 f54beeea Giorgos Korfiatis
from synnefo.lib.commissioning import \
42 f54beeea Giorgos Korfiatis
    Callpoint, CorruptedError, InvalidDataError
43 f54beeea Giorgos Korfiatis
from synnefo.lib.commissioning.utils.newname import newname
44 f54beeea Giorgos Korfiatis
45 7fcfeb5d Giorgos Korfiatis
from django.db.models import Q
46 0a24e225 Sofia Papagiannaki
from django.db import transaction, IntegrityError
47 f590f930 Georgios D. Tsoukalas
from .models import (Holder, Entity, Policy, Holding,
48 5d996aea Giorgos Korfiatis
                     Commission, Provision, ProvisionLog, now,
49 5d996aea Giorgos Korfiatis
                     db_get_entity, db_get_holding, db_get_policy,
50 5d996aea Giorgos Korfiatis
                     db_get_commission, db_filter_provision)
51 fac1de87 Georgios D. Tsoukalas
52 fac1de87 Georgios D. Tsoukalas
53 fac1de87 Georgios D. Tsoukalas
class QuotaholderDjangoDBCallpoint(Callpoint):
54 fac1de87 Georgios D. Tsoukalas
55 fac1de87 Georgios D. Tsoukalas
    api_spec = QuotaholderAPI()
56 fac1de87 Georgios D. Tsoukalas
57 fac1de87 Georgios D. Tsoukalas
    http_exc_lookup = {
58 fac1de87 Georgios D. Tsoukalas
        CorruptedError:   550,
59 fac1de87 Georgios D. Tsoukalas
        InvalidDataError: 400,
60 fac1de87 Georgios D. Tsoukalas
        InvalidKeyError:  401,
61 fac1de87 Georgios D. Tsoukalas
        NoEntityError:    404,
62 fac1de87 Georgios D. Tsoukalas
        NoQuantityError:  413,
63 fac1de87 Georgios D. Tsoukalas
        NoCapacityError:  413,
64 fac1de87 Georgios D. Tsoukalas
    }
65 fac1de87 Georgios D. Tsoukalas
66 fac1de87 Georgios D. Tsoukalas
    def init_connection(self, connection):
67 fac1de87 Georgios D. Tsoukalas
        if connection is not None:
68 fac1de87 Georgios D. Tsoukalas
            raise ValueError("Cannot specify connection args with %s" %
69 fac1de87 Georgios D. Tsoukalas
                             type(self).__name__)
70 fac1de87 Georgios D. Tsoukalas
        pass
71 fac1de87 Georgios D. Tsoukalas
72 fac1de87 Georgios D. Tsoukalas
    def commit(self):
73 fac1de87 Georgios D. Tsoukalas
        transaction.commit()
74 fac1de87 Georgios D. Tsoukalas
75 fac1de87 Georgios D. Tsoukalas
    def rollback(self):
76 fac1de87 Georgios D. Tsoukalas
        transaction.rollback()
77 fac1de87 Georgios D. Tsoukalas
78 fac1de87 Georgios D. Tsoukalas
    def do_make_call(self, call_name, data):
79 fac1de87 Georgios D. Tsoukalas
        call_fn = getattr(self, call_name, None)
80 fac1de87 Georgios D. Tsoukalas
        if not call_fn:
81 fac1de87 Georgios D. Tsoukalas
            m = "cannot find call '%s'" % (call_name,)
82 fac1de87 Georgios D. Tsoukalas
            raise CorruptedError(m)
83 fac1de87 Georgios D. Tsoukalas
84 fac1de87 Georgios D. Tsoukalas
        return call_fn(**data)
85 fac1de87 Georgios D. Tsoukalas
86 fac1de87 Georgios D. Tsoukalas
    def create_entity(self, context={}, create_entity=()):
87 fac1de87 Georgios D. Tsoukalas
        rejected = []
88 fac1de87 Georgios D. Tsoukalas
        append = rejected.append
89 fac1de87 Georgios D. Tsoukalas
90 d793e5c4 Giorgos Korfiatis
        for idx, (entity, owner, key, ownerkey) in enumerate(create_entity):
91 fac1de87 Georgios D. Tsoukalas
            try:
92 fac1de87 Georgios D. Tsoukalas
                owner = Entity.objects.get(entity=owner, key=ownerkey)
93 fac1de87 Georgios D. Tsoukalas
            except Entity.DoesNotExist:
94 d793e5c4 Giorgos Korfiatis
                append(idx)
95 635c115c Sofia Papagiannaki
                continue
96 fac1de87 Georgios D. Tsoukalas
97 0a24e225 Sofia Papagiannaki
            try:
98 d793e5c4 Giorgos Korfiatis
                e = Entity.objects.get(entity=entity)
99 d793e5c4 Giorgos Korfiatis
                append(idx)
100 a3959e74 Georgios D. Tsoukalas
            except Entity.DoesNotExist:
101 a2db0eb5 root
                e = Entity.objects.create(entity=entity,
102 a2db0eb5 root
                                          owner=owner,
103 a2db0eb5 root
                                          key=key)
104 fac1de87 Georgios D. Tsoukalas
        return rejected
105 fac1de87 Georgios D. Tsoukalas
106 1dedc367 Georgios D. Tsoukalas
    def set_entity_key(self, context={}, set_entity_key=()):
107 1dedc367 Georgios D. Tsoukalas
        rejected = []
108 1dedc367 Georgios D. Tsoukalas
        append = rejected.append
109 1dedc367 Georgios D. Tsoukalas
110 1dedc367 Georgios D. Tsoukalas
        for entity, key, newkey in set_entity_key:
111 1dedc367 Georgios D. Tsoukalas
            try:
112 5d996aea Giorgos Korfiatis
                e = db_get_entity(entity=entity, key=key, for_update=True)
113 1dedc367 Georgios D. Tsoukalas
            except Entity.DoesNotExist:
114 1dedc367 Georgios D. Tsoukalas
                append(entity)
115 2546e0cc Georgios D. Tsoukalas
                continue
116 1dedc367 Georgios D. Tsoukalas
117 1dedc367 Georgios D. Tsoukalas
            e.key = newkey
118 1dedc367 Georgios D. Tsoukalas
            e.save()
119 1dedc367 Georgios D. Tsoukalas
120 1dedc367 Georgios D. Tsoukalas
        return rejected
121 1dedc367 Georgios D. Tsoukalas
122 fac1de87 Georgios D. Tsoukalas
    def list_entities(self, context={}, entity=None, key=None):
123 fac1de87 Georgios D. Tsoukalas
        try:
124 fac1de87 Georgios D. Tsoukalas
            e = Entity.objects.get(entity=entity, key=key)
125 fac1de87 Georgios D. Tsoukalas
        except Entity.DoesNotExist:
126 fac1de87 Georgios D. Tsoukalas
            m = "Entity '%s' does not exist" % (entity,)
127 fac1de87 Georgios D. Tsoukalas
            raise NoEntityError(m)
128 fac1de87 Georgios D. Tsoukalas
129 fac1de87 Georgios D. Tsoukalas
        children = e.entities.all()
130 fac1de87 Georgios D. Tsoukalas
        entities = [e.entity for e in children]
131 fac1de87 Georgios D. Tsoukalas
        return entities
132 fac1de87 Georgios D. Tsoukalas
133 fac1de87 Georgios D. Tsoukalas
    def get_entity(self, context={}, get_entity=()):
134 fac1de87 Georgios D. Tsoukalas
        entities = []
135 fac1de87 Georgios D. Tsoukalas
        append = entities.append
136 fac1de87 Georgios D. Tsoukalas
137 fac1de87 Georgios D. Tsoukalas
        for entity, key in get_entity:
138 fac1de87 Georgios D. Tsoukalas
            try:
139 d69d04e7 Giorgos Korfiatis
                e = Entity.objects.get(entity=entity, key=key)
140 fac1de87 Georgios D. Tsoukalas
            except Entity.DoesNotExist:
141 fac1de87 Georgios D. Tsoukalas
                continue
142 fac1de87 Georgios D. Tsoukalas
143 d69d04e7 Giorgos Korfiatis
            append((entity, e.owner.entity))
144 fac1de87 Georgios D. Tsoukalas
145 fac1de87 Georgios D. Tsoukalas
        return entities
146 fac1de87 Georgios D. Tsoukalas
147 fac1de87 Georgios D. Tsoukalas
    def get_limits(self, context={}, get_limits=()):
148 fac1de87 Georgios D. Tsoukalas
        limits = []
149 fac1de87 Georgios D. Tsoukalas
        append = limits.append
150 fac1de87 Georgios D. Tsoukalas
151 3f84d70e Christos KK Loverdos
        for policy in get_limits:
152 fac1de87 Georgios D. Tsoukalas
            try:
153 a116d82a Giorgos Korfiatis
                p = Policy.objects.get(policy=policy)
154 fac1de87 Georgios D. Tsoukalas
            except Policy.DoesNotExist:
155 fac1de87 Georgios D. Tsoukalas
                continue
156 fac1de87 Georgios D. Tsoukalas
157 a116d82a Giorgos Korfiatis
            append((policy, p.quantity, p.capacity,
158 a116d82a Giorgos Korfiatis
                    p.import_limit, p.export_limit))
159 fac1de87 Georgios D. Tsoukalas
160 fac1de87 Georgios D. Tsoukalas
        return limits
161 fac1de87 Georgios D. Tsoukalas
162 fac1de87 Georgios D. Tsoukalas
    def set_limits(self, context={}, set_limits=()):
163 fac1de87 Georgios D. Tsoukalas
164 fac1de87 Georgios D. Tsoukalas
        for (   policy, quantity, capacity,
165 fac1de87 Georgios D. Tsoukalas
                import_limit, export_limit  ) in set_limits:
166 fac1de87 Georgios D. Tsoukalas
167 72c4abd2 root
                try:
168 5d996aea Giorgos Korfiatis
                    policy = db_get_policy(policy=policy, for_update=True)
169 72c4abd2 root
                except Policy.DoesNotExist:
170 72c4abd2 root
                    Policy.objects.create(  policy=policy,
171 72c4abd2 root
                                            quantity=quantity,
172 72c4abd2 root
                                            capacity=capacity,
173 72c4abd2 root
                                            import_limit=import_limit,
174 72c4abd2 root
                                            export_limit=export_limit   )
175 72c4abd2 root
                else:
176 72c4abd2 root
                    policy.quantity = quantity
177 72c4abd2 root
                    policy.capacity = capacity
178 72c4abd2 root
                    policy.export_limit = export_limit
179 72c4abd2 root
                    policy.import_limit = import_limit
180 72c4abd2 root
                    policy.save()
181 fac1de87 Georgios D. Tsoukalas
182 fac1de87 Georgios D. Tsoukalas
        return ()
183 fac1de87 Georgios D. Tsoukalas
184 fac1de87 Georgios D. Tsoukalas
    def get_holding(self, context={}, get_holding=()):
185 fac1de87 Georgios D. Tsoukalas
        holdings = []
186 fac1de87 Georgios D. Tsoukalas
        append = holdings.append
187 fac1de87 Georgios D. Tsoukalas
188 fac1de87 Georgios D. Tsoukalas
        for entity, resource, key in get_holding:
189 fac1de87 Georgios D. Tsoukalas
            try:
190 fac1de87 Georgios D. Tsoukalas
                h = Holding.objects.get(entity=entity, resource=resource)
191 fac1de87 Georgios D. Tsoukalas
            except Holding.DoesNotExist:
192 fac1de87 Georgios D. Tsoukalas
                continue
193 fac1de87 Georgios D. Tsoukalas
194 fac1de87 Georgios D. Tsoukalas
            if h.entity.key != key:
195 fac1de87 Georgios D. Tsoukalas
                continue
196 fac1de87 Georgios D. Tsoukalas
197 091494d7 Giorgos Korfiatis
            append((h.entity.entity, h.resource, h.policy.policy,
198 b435047b root
                    h.imported, h.exported,
199 d6662f65 root
                    h.returned, h.released, h.flags))
200 fac1de87 Georgios D. Tsoukalas
201 fac1de87 Georgios D. Tsoukalas
        return holdings
202 fac1de87 Georgios D. Tsoukalas
203 8dc7c13b Giorgos Korfiatis
    def _set_holding(self, entity, resource, policy, flags):
204 8dc7c13b Giorgos Korfiatis
        try:
205 5d996aea Giorgos Korfiatis
            h = db_get_holding(entity=entity, resource=resource,
206 5d996aea Giorgos Korfiatis
                               for_update=True)
207 8dc7c13b Giorgos Korfiatis
            h.policy = p
208 8dc7c13b Giorgos Korfiatis
            h.flags = flags
209 8dc7c13b Giorgos Korfiatis
            h.save()
210 8dc7c13b Giorgos Korfiatis
        except Holding.DoesNotExist:
211 8dc7c13b Giorgos Korfiatis
            h = Holding.objects.create( entity=e, resource=resource,
212 8dc7c13b Giorgos Korfiatis
                                        policy=p, flags=flags      )
213 8dc7c13b Giorgos Korfiatis
        return h
214 8dc7c13b Giorgos Korfiatis
215 fac1de87 Georgios D. Tsoukalas
    def set_holding(self, context={}, set_holding=()):
216 fac1de87 Georgios D. Tsoukalas
        rejected = []
217 fac1de87 Georgios D. Tsoukalas
        append = rejected.append
218 fac1de87 Georgios D. Tsoukalas
219 fac1de87 Georgios D. Tsoukalas
        for entity, resource, key, policy, flags in set_holding:
220 fac1de87 Georgios D. Tsoukalas
            try:
221 fac1de87 Georgios D. Tsoukalas
                e = Entity.objects.get(entity=entity, key=key)
222 fac1de87 Georgios D. Tsoukalas
            except Entity.DoesNotExist:
223 fac1de87 Georgios D. Tsoukalas
                append((entity, resource, policy))
224 fac1de87 Georgios D. Tsoukalas
                continue
225 fac1de87 Georgios D. Tsoukalas
226 fac1de87 Georgios D. Tsoukalas
            if e.key != key:
227 fac1de87 Georgios D. Tsoukalas
                append((entity, resource, policy))
228 fac1de87 Georgios D. Tsoukalas
                continue
229 fac1de87 Georgios D. Tsoukalas
230 fac1de87 Georgios D. Tsoukalas
            try:
231 fac1de87 Georgios D. Tsoukalas
                p = Policy.objects.get(policy=policy)
232 fac1de87 Georgios D. Tsoukalas
            except Policy.DoesNotExist:
233 fac1de87 Georgios D. Tsoukalas
                append((entity, resource, policy))
234 fac1de87 Georgios D. Tsoukalas
                continue
235 fac1de87 Georgios D. Tsoukalas
236 fac1de87 Georgios D. Tsoukalas
            try:
237 5d996aea Giorgos Korfiatis
                h = db_get_holding(entity=entity, resource=resource,
238 5d996aea Giorgos Korfiatis
                                   for_update=True)
239 fac1de87 Georgios D. Tsoukalas
                h.policy = p
240 fac1de87 Georgios D. Tsoukalas
                h.flags = flags
241 fac1de87 Georgios D. Tsoukalas
                h.save()
242 fac1de87 Georgios D. Tsoukalas
            except Holding.DoesNotExist:
243 c2260987 Giorgos Korfiatis
                h = Holding.objects.create( entity=e, resource=resource,
244 c2260987 Giorgos Korfiatis
                                            policy=p, flags=flags      )
245 fac1de87 Georgios D. Tsoukalas
246 fac1de87 Georgios D. Tsoukalas
        return rejected
247 fac1de87 Georgios D. Tsoukalas
248 a7cdc223 Giorgos Korfiatis
    def _init_holding(self, entity, resource, policy,
249 5b522bc3 Giorgos Korfiatis
                          imported, exported, returned, released,
250 5b522bc3 Giorgos Korfiatis
                          flags):
251 5b522bc3 Giorgos Korfiatis
        try:
252 5d996aea Giorgos Korfiatis
            h = db_get_holding(entity=entity, resource=resource,
253 5d996aea Giorgos Korfiatis
                               for_update=True)
254 5b522bc3 Giorgos Korfiatis
        except Holding.DoesNotExist:
255 5b522bc3 Giorgos Korfiatis
            h = Holding(entity=entity, resource=resource)
256 5b522bc3 Giorgos Korfiatis
257 5b522bc3 Giorgos Korfiatis
        h.policy = policy
258 5b522bc3 Giorgos Korfiatis
        h.flags = flags
259 5b522bc3 Giorgos Korfiatis
        h.imported=imported
260 5b522bc3 Giorgos Korfiatis
        h.importing=imported
261 5b522bc3 Giorgos Korfiatis
        h.exported=exported
262 5b522bc3 Giorgos Korfiatis
        h.exporting=exported
263 5b522bc3 Giorgos Korfiatis
        h.returned=returned
264 5b522bc3 Giorgos Korfiatis
        h.returning=returned
265 5b522bc3 Giorgos Korfiatis
        h.released=released
266 5b522bc3 Giorgos Korfiatis
        h.releasing=released
267 5b522bc3 Giorgos Korfiatis
        h.save()
268 5b522bc3 Giorgos Korfiatis
269 a7cdc223 Giorgos Korfiatis
    def init_holding(self, context={}, init_holding=()):
270 5b522bc3 Giorgos Korfiatis
        rejected = []
271 5b522bc3 Giorgos Korfiatis
        append = rejected.append
272 5b522bc3 Giorgos Korfiatis
273 a7cdc223 Giorgos Korfiatis
        for idx, sfh in enumerate(init_holding):
274 5b522bc3 Giorgos Korfiatis
            (entity, resource, key, policy,
275 5b522bc3 Giorgos Korfiatis
             imported, exported, returned, released,
276 5b522bc3 Giorgos Korfiatis
             flags) = sfh
277 5b522bc3 Giorgos Korfiatis
            try:
278 5b522bc3 Giorgos Korfiatis
                e = Entity.objects.get(entity=entity, key=key)
279 5b522bc3 Giorgos Korfiatis
            except Entity.DoesNotExist:
280 5b522bc3 Giorgos Korfiatis
                append(idx)
281 5b522bc3 Giorgos Korfiatis
                continue
282 5b522bc3 Giorgos Korfiatis
283 5b522bc3 Giorgos Korfiatis
            if e.key != key:
284 5b522bc3 Giorgos Korfiatis
                append(idx)
285 5b522bc3 Giorgos Korfiatis
                continue
286 5b522bc3 Giorgos Korfiatis
287 5b522bc3 Giorgos Korfiatis
            try:
288 5b522bc3 Giorgos Korfiatis
                p = Policy.objects.get(policy=policy)
289 5b522bc3 Giorgos Korfiatis
            except Policy.DoesNotExist:
290 5b522bc3 Giorgos Korfiatis
                append(idx)
291 5b522bc3 Giorgos Korfiatis
                continue
292 5b522bc3 Giorgos Korfiatis
293 a7cdc223 Giorgos Korfiatis
            self._init_holding(e, resource, p,
294 5b522bc3 Giorgos Korfiatis
                                   imported, exported,
295 5b522bc3 Giorgos Korfiatis
                                   returned, released,
296 5b522bc3 Giorgos Korfiatis
                                   flags)
297 5b522bc3 Giorgos Korfiatis
        return rejected
298 5b522bc3 Giorgos Korfiatis
299 4c00b904 Giorgos Korfiatis
    def reset_holding(self, context={}, reset_holding=()):
300 4c00b904 Giorgos Korfiatis
        rejected = []
301 4c00b904 Giorgos Korfiatis
        append = rejected.append
302 4c00b904 Giorgos Korfiatis
303 4c00b904 Giorgos Korfiatis
        for idx, tpl in enumerate(reset_holding):
304 4c00b904 Giorgos Korfiatis
            (entity, resource, key,
305 4c00b904 Giorgos Korfiatis
             imported, exported, returned, released) = tpl
306 4c00b904 Giorgos Korfiatis
            try:
307 4c00b904 Giorgos Korfiatis
                e = Entity.objects.get(entity=entity, key=key)
308 4c00b904 Giorgos Korfiatis
            except Entity.DoesNotExist:
309 4c00b904 Giorgos Korfiatis
                append(idx)
310 4c00b904 Giorgos Korfiatis
                continue
311 4c00b904 Giorgos Korfiatis
312 4c00b904 Giorgos Korfiatis
            try:
313 5d996aea Giorgos Korfiatis
                h = db_get_holding(entity=entity, resource=resource,
314 5d996aea Giorgos Korfiatis
                                   for_update=True)
315 4c00b904 Giorgos Korfiatis
                h.imported=imported
316 4c00b904 Giorgos Korfiatis
                h.importing=imported
317 4c00b904 Giorgos Korfiatis
                h.exported=exported
318 4c00b904 Giorgos Korfiatis
                h.exporting=exported
319 4c00b904 Giorgos Korfiatis
                h.returned=returned
320 4c00b904 Giorgos Korfiatis
                h.returning=returned
321 4c00b904 Giorgos Korfiatis
                h.released=released
322 4c00b904 Giorgos Korfiatis
                h.releasing=released
323 4c00b904 Giorgos Korfiatis
                h.save()
324 4c00b904 Giorgos Korfiatis
            except Holding.DoesNotExist:
325 4c00b904 Giorgos Korfiatis
                append(idx)
326 4c00b904 Giorgos Korfiatis
                continue
327 4c00b904 Giorgos Korfiatis
328 4c00b904 Giorgos Korfiatis
        return rejected
329 4c00b904 Giorgos Korfiatis
330 cceadca8 Giorgos Korfiatis
    def _check_pending(self, entity, resource):
331 cceadca8 Giorgos Korfiatis
        cs = Commission.objects.filter(entity=entity)
332 cceadca8 Giorgos Korfiatis
        cs = [c for c in cs if c.provisions.filter(resource=resource)]
333 cceadca8 Giorgos Korfiatis
        as_target = [c.serial for c in cs]
334 8dc7c13b Giorgos Korfiatis
335 cceadca8 Giorgos Korfiatis
        ps = Provision.objects.filter(entity=entity, resource=resource)
336 cceadca8 Giorgos Korfiatis
        as_source = [p.serial.serial for p in ps]
337 cceadca8 Giorgos Korfiatis
338 cceadca8 Giorgos Korfiatis
        return as_target + as_source
339 8dc7c13b Giorgos Korfiatis
340 8dc7c13b Giorgos Korfiatis
    def _actual_quantity(self, holding):
341 8dc7c13b Giorgos Korfiatis
        hp = holding.policy
342 8dc7c13b Giorgos Korfiatis
        return hp.quantity + (holding.imported + holding.returned -
343 8dc7c13b Giorgos Korfiatis
                              holding.exported - holding.released)
344 8dc7c13b Giorgos Korfiatis
345 8dc7c13b Giorgos Korfiatis
    def _new_policy_name(self):
346 8dc7c13b Giorgos Korfiatis
        return newname('policy_')
347 8dc7c13b Giorgos Korfiatis
348 8dc7c13b Giorgos Korfiatis
    def _increase_resource(self, entity, resource, amount):
349 8dc7c13b Giorgos Korfiatis
        try:
350 5d996aea Giorgos Korfiatis
            h = db_get_holding(entity=entity, resource=resource,
351 5d996aea Giorgos Korfiatis
                               for_update=True)
352 8dc7c13b Giorgos Korfiatis
        except Holding.DoesNotExist:
353 8dc7c13b Giorgos Korfiatis
            h = Holding(entity=entity, resource=resource)
354 8dc7c13b Giorgos Korfiatis
            p = Policy.objects.create(policy=self._new_policy_name(),
355 8dc7c13b Giorgos Korfiatis
                                      quantity=0)
356 8dc7c13b Giorgos Korfiatis
            h.policy = p
357 8dc7c13b Giorgos Korfiatis
        h.imported += amount
358 8dc7c13b Giorgos Korfiatis
        h.save()
359 8dc7c13b Giorgos Korfiatis
360 8dc7c13b Giorgos Korfiatis
    def release_holding(self, context={}, release_holding=()):
361 8dc7c13b Giorgos Korfiatis
        rejected = []
362 8dc7c13b Giorgos Korfiatis
        append = rejected.append
363 8dc7c13b Giorgos Korfiatis
364 8dc7c13b Giorgos Korfiatis
        for idx, (entity, resource, key) in enumerate(release_holding):
365 8dc7c13b Giorgos Korfiatis
            try:
366 5d996aea Giorgos Korfiatis
                h = db_get_holding(entity=entity, resource=resource,
367 5d996aea Giorgos Korfiatis
                                   for_update=True)
368 8dc7c13b Giorgos Korfiatis
            except Holding.DoesNotExist:
369 8dc7c13b Giorgos Korfiatis
                append(idx)
370 8dc7c13b Giorgos Korfiatis
                continue
371 8dc7c13b Giorgos Korfiatis
372 8dc7c13b Giorgos Korfiatis
            if h.entity.key != key:
373 8dc7c13b Giorgos Korfiatis
                append(idx)
374 8dc7c13b Giorgos Korfiatis
                continue
375 8dc7c13b Giorgos Korfiatis
376 cceadca8 Giorgos Korfiatis
            if self._check_pending(entity, resource):
377 8dc7c13b Giorgos Korfiatis
                append(idx)
378 8dc7c13b Giorgos Korfiatis
                continue
379 8dc7c13b Giorgos Korfiatis
380 8dc7c13b Giorgos Korfiatis
            q = self._actual_quantity(h)
381 32464501 Giorgos Korfiatis
            if q > 0:
382 32464501 Giorgos Korfiatis
                owner = h.entity.owner
383 32464501 Giorgos Korfiatis
                self._increase_resource(owner, resource, q)
384 32464501 Giorgos Korfiatis
385 8dc7c13b Giorgos Korfiatis
            h.delete()
386 8dc7c13b Giorgos Korfiatis
387 8dc7c13b Giorgos Korfiatis
        return rejected
388 8dc7c13b Giorgos Korfiatis
389 fac1de87 Georgios D. Tsoukalas
    def list_resources(self, context={}, entity=None, key=None):
390 fac1de87 Georgios D. Tsoukalas
        try:
391 72c4abd2 root
            e = Entity.objects.get(entity=entity)
392 fac1de87 Georgios D. Tsoukalas
        except Entity.DoesNotExist:
393 fac1de87 Georgios D. Tsoukalas
            m = "No such entity '%s'" % (entity,)
394 fac1de87 Georgios D. Tsoukalas
            raise NoEntityError(m)
395 fac1de87 Georgios D. Tsoukalas
396 fac1de87 Georgios D. Tsoukalas
        if e.key != key:
397 fac1de87 Georgios D. Tsoukalas
            m = "Invalid key for entity '%s'" % (entity,)
398 fac1de87 Georgios D. Tsoukalas
            raise InvalidKeyError(m)
399 fac1de87 Georgios D. Tsoukalas
400 c8ef1fdb Sofia Papagiannaki
        holdings = e.holding_set.filter(entity=entity)
401 fac1de87 Georgios D. Tsoukalas
        resources = [h.resource for h in holdings]
402 fac1de87 Georgios D. Tsoukalas
        return resources
403 fac1de87 Georgios D. Tsoukalas
404 65f214a2 Georgios D. Tsoukalas
    def list_holdings(self, context={}, list_holdings=()):
405 65f214a2 Georgios D. Tsoukalas
        rejected = []
406 65f214a2 Georgios D. Tsoukalas
        reject = rejected.append
407 65f214a2 Georgios D. Tsoukalas
        holdings_list = []
408 65f214a2 Georgios D. Tsoukalas
        append = holdings_list.append
409 65f214a2 Georgios D. Tsoukalas
410 65f214a2 Georgios D. Tsoukalas
        for entity, key in list_holdings:
411 65f214a2 Georgios D. Tsoukalas
            try:
412 65f214a2 Georgios D. Tsoukalas
                e = Entity.objects.get(entity=entity)
413 65f214a2 Georgios D. Tsoukalas
                if e.key != key:
414 65f214a2 Georgios D. Tsoukalas
                    raise Entity.DoesNotExist("wrong key")
415 65f214a2 Georgios D. Tsoukalas
            except Entity.DoesNotExist:
416 65f214a2 Georgios D. Tsoukalas
                reject(entity)
417 65f214a2 Georgios D. Tsoukalas
                continue
418 65f214a2 Georgios D. Tsoukalas
419 65f214a2 Georgios D. Tsoukalas
            holdings = e.holding_set.filter(entity=entity)
420 65f214a2 Georgios D. Tsoukalas
            append([[entity, h.resource,
421 65f214a2 Georgios D. Tsoukalas
                     h.imported, h.exported, h.returned, h.released]
422 65f214a2 Georgios D. Tsoukalas
                        for h in holdings])
423 65f214a2 Georgios D. Tsoukalas
424 65f214a2 Georgios D. Tsoukalas
        return holdings_list, rejected
425 65f214a2 Georgios D. Tsoukalas
426 fac1de87 Georgios D. Tsoukalas
    def get_quota(self, context={}, get_quota=()):
427 fac1de87 Georgios D. Tsoukalas
        quotas = []
428 fac1de87 Georgios D. Tsoukalas
        append = quotas.append
429 fac1de87 Georgios D. Tsoukalas
430 fac1de87 Georgios D. Tsoukalas
        for entity, resource, key in get_quota:
431 fac1de87 Georgios D. Tsoukalas
            try:
432 fac1de87 Georgios D. Tsoukalas
                h = Holding.objects.get(entity=entity, resource=resource)
433 fac1de87 Georgios D. Tsoukalas
            except Holding.DoesNotExist:
434 fac1de87 Georgios D. Tsoukalas
                continue
435 fac1de87 Georgios D. Tsoukalas
436 fac1de87 Georgios D. Tsoukalas
            if h.entity.key != key:
437 fac1de87 Georgios D. Tsoukalas
                continue
438 fac1de87 Georgios D. Tsoukalas
439 fac1de87 Georgios D. Tsoukalas
            p = h.policy
440 fac1de87 Georgios D. Tsoukalas
441 fac1de87 Georgios D. Tsoukalas
            append((h.entity.entity, h.resource, p.quantity, p.capacity,
442 fac1de87 Georgios D. Tsoukalas
                    p.import_limit, p.export_limit,
443 b435047b root
                    h.imported, h.exported,
444 d6662f65 root
                    h.returned, h.released,
445 b435047b root
                    h.flags))
446 fac1de87 Georgios D. Tsoukalas
447 fac1de87 Georgios D. Tsoukalas
        return quotas
448 fac1de87 Georgios D. Tsoukalas
449 fac1de87 Georgios D. Tsoukalas
    def set_quota(self, context={}, set_quota=()):
450 fac1de87 Georgios D. Tsoukalas
        rejected = []
451 fac1de87 Georgios D. Tsoukalas
        append = rejected.append
452 fac1de87 Georgios D. Tsoukalas
453 fac1de87 Georgios D. Tsoukalas
        for (   entity, resource, key,
454 fac1de87 Georgios D. Tsoukalas
                quantity, capacity,
455 fac1de87 Georgios D. Tsoukalas
                import_limit, export_limit, flags  ) in set_quota:
456 fac1de87 Georgios D. Tsoukalas
457 fac1de87 Georgios D. Tsoukalas
                try:
458 e36a8c21 Giorgos Korfiatis
                    e = Entity.objects.get(entity=entity, key=key)
459 e36a8c21 Giorgos Korfiatis
                except Entity.DoesNotExist:
460 e36a8c21 Giorgos Korfiatis
                    append((entity, resource))
461 e36a8c21 Giorgos Korfiatis
                    continue
462 eec92c03 Georgios D. Tsoukalas
463 eec92c03 Georgios D. Tsoukalas
                policy = newname('policy_')
464 eec92c03 Georgios D. Tsoukalas
                newp = Policy   (
465 fac1de87 Georgios D. Tsoukalas
                            policy=policy,
466 fac1de87 Georgios D. Tsoukalas
                            quantity=quantity,
467 fac1de87 Georgios D. Tsoukalas
                            capacity=capacity,
468 fac1de87 Georgios D. Tsoukalas
                            import_limit=import_limit,
469 fac1de87 Georgios D. Tsoukalas
                            export_limit=export_limit
470 fac1de87 Georgios D. Tsoukalas
                )
471 fac1de87 Georgios D. Tsoukalas
472 e36a8c21 Giorgos Korfiatis
                try:
473 5d996aea Giorgos Korfiatis
                    h = db_get_holding(entity=entity, resource=resource,
474 5d996aea Giorgos Korfiatis
                                       for_update=True)
475 e36a8c21 Giorgos Korfiatis
                    p = h.policy
476 eec92c03 Georgios D. Tsoukalas
                    h.policy = newp
477 eec92c03 Georgios D. Tsoukalas
                    h.flags = flags
478 e36a8c21 Giorgos Korfiatis
                except Holding.DoesNotExist:
479 e36a8c21 Giorgos Korfiatis
                    h = Holding(entity=e, resource=resource,
480 e36a8c21 Giorgos Korfiatis
                                policy=newp, flags=flags)
481 e36a8c21 Giorgos Korfiatis
                    p = None
482 eec92c03 Georgios D. Tsoukalas
483 39cefb25 Georgios D. Tsoukalas
                # the order is intentionally reversed so that it
484 39cefb25 Georgios D. Tsoukalas
                # would break if we are not within a transaction.
485 39cefb25 Georgios D. Tsoukalas
                # Has helped before.
486 fac1de87 Georgios D. Tsoukalas
                h.save()
487 eec92c03 Georgios D. Tsoukalas
                newp.save()
488 fac1de87 Georgios D. Tsoukalas
489 c8ef1fdb Sofia Papagiannaki
                if p is not None and p.holding_set.count() == 0:
490 fac1de87 Georgios D. Tsoukalas
                    p.delete()
491 fac1de87 Georgios D. Tsoukalas
492 fac1de87 Georgios D. Tsoukalas
        return rejected
493 fac1de87 Georgios D. Tsoukalas
494 f590f930 Georgios D. Tsoukalas
    def issue_commission(self,  context     =   {},
495 f590f930 Georgios D. Tsoukalas
                                clientkey   =   None,
496 f590f930 Georgios D. Tsoukalas
                                target      =   None,
497 f590f930 Georgios D. Tsoukalas
                                key         =   None,
498 d6662f65 root
                                name        =   None,
499 f590f930 Georgios D. Tsoukalas
                                provisions  =   ()  ):
500 fac1de87 Georgios D. Tsoukalas
501 fac1de87 Georgios D. Tsoukalas
        try:
502 fac1de87 Georgios D. Tsoukalas
            t = Entity.objects.get(entity=target)
503 fac1de87 Georgios D. Tsoukalas
        except Entity.DoesNotExist:
504 7b1891cc Giorgos Korfiatis
            m = "No target entity '%s'" % (target,)
505 7b1891cc Giorgos Korfiatis
            raise NoEntityError(m)
506 fac1de87 Georgios D. Tsoukalas
        else:
507 fac1de87 Georgios D. Tsoukalas
            if t.key != key:
508 fac1de87 Georgios D. Tsoukalas
                m = "Invalid key for target entity '%s'" % (target,)
509 fac1de87 Georgios D. Tsoukalas
                raise InvalidKeyError(m)
510 fac1de87 Georgios D. Tsoukalas
511 c3a709ad root
        create = Commission.objects.create
512 d6662f65 root
        commission = create(entity_id=target, clientkey=clientkey, name=name)
513 fac1de87 Georgios D. Tsoukalas
        serial = commission.serial
514 fac1de87 Georgios D. Tsoukalas
515 6afede3f Giorgos Korfiatis
        checked = []
516 fac1de87 Georgios D. Tsoukalas
        for entity, resource, quantity in provisions:
517 6afede3f Giorgos Korfiatis
518 4eb170f3 Giorgos Korfiatis
            if entity == target:
519 4eb170f3 Giorgos Korfiatis
                m = "Cannot issue commission from an entity to itself (%s)" % (
520 4eb170f3 Giorgos Korfiatis
                    entity,)
521 4eb170f3 Giorgos Korfiatis
                raise InvalidDataError(m)
522 4eb170f3 Giorgos Korfiatis
523 6afede3f Giorgos Korfiatis
            ent_res = entity, resource
524 6afede3f Giorgos Korfiatis
            if ent_res in checked:
525 6afede3f Giorgos Korfiatis
                m = "Duplicate provision for %s.%s" % ent_res
526 6afede3f Giorgos Korfiatis
                raise DuplicateError(m)
527 6afede3f Giorgos Korfiatis
            checked.append(ent_res)
528 6afede3f Giorgos Korfiatis
529 58c077a9 Giorgos Korfiatis
            try:
530 58c077a9 Giorgos Korfiatis
                e = Entity.objects.get(entity=entity)
531 58c077a9 Giorgos Korfiatis
            except Entity.DoesNotExist:
532 58c077a9 Giorgos Korfiatis
                m = "No source entity '%s'" % (entity,)
533 58c077a9 Giorgos Korfiatis
                raise NoEntityError(m)
534 58c077a9 Giorgos Korfiatis
535 c3a709ad root
            release = 0
536 c3a709ad root
            if quantity < 0:
537 c3a709ad root
                release = 1
538 c3a709ad root
539 fac1de87 Georgios D. Tsoukalas
            try:
540 5d996aea Giorgos Korfiatis
                h = db_get_holding(entity=entity, resource=resource,
541 5d996aea Giorgos Korfiatis
                                   for_update=True)
542 fac1de87 Georgios D. Tsoukalas
            except Holding.DoesNotExist:
543 fac1de87 Georgios D. Tsoukalas
                m = ("There is not enough quantity "
544 fac1de87 Georgios D. Tsoukalas
                     "to allocate from in %s.%s" % (entity, resource))
545 fac1de87 Georgios D. Tsoukalas
                raise NoQuantityError(m)
546 fac1de87 Georgios D. Tsoukalas
547 fac1de87 Georgios D. Tsoukalas
            hp = h.policy
548 fac1de87 Georgios D. Tsoukalas
549 3a7732f5 Georgios D. Tsoukalas
            if (hp.export_limit is not None and
550 3a7732f5 Georgios D. Tsoukalas
                h.exporting + quantity > hp.export_limit):
551 3a7732f5 Georgios D. Tsoukalas
                    m = ("Export limit reached for %s.%s" % (entity, resource))
552 3a7732f5 Georgios D. Tsoukalas
                    raise ExportLimitError(m)
553 3a7732f5 Georgios D. Tsoukalas
554 17d5c7a1 root
            if hp.quantity is not None:
555 d6662f65 root
                available = (+ hp.quantity + h.imported + h.returned
556 17d5c7a1 root
                             - h.exporting - h.releasing)
557 f590f930 Georgios D. Tsoukalas
558 17d5c7a1 root
                if available - quantity < 0:
559 17d5c7a1 root
                    m = ("There is not enough quantity "
560 17d5c7a1 root
                         "to allocate from in %s.%s" % (entity, resource))
561 17d5c7a1 root
                    raise NoQuantityError(m)
562 fac1de87 Georgios D. Tsoukalas
563 fac1de87 Georgios D. Tsoukalas
            try:
564 5d996aea Giorgos Korfiatis
                th = db_get_holding(entity=target, resource=resource,
565 5d996aea Giorgos Korfiatis
                                    for_update=True)
566 fac1de87 Georgios D. Tsoukalas
            except Holding.DoesNotExist:
567 fac1de87 Georgios D. Tsoukalas
                m = ("There is not enough capacity "
568 fac1de87 Georgios D. Tsoukalas
                     "to allocate into in %s.%s" % (target, resource))
569 fac1de87 Georgios D. Tsoukalas
                raise NoCapacityError(m)
570 fac1de87 Georgios D. Tsoukalas
571 fac1de87 Georgios D. Tsoukalas
            tp = th.policy
572 fac1de87 Georgios D. Tsoukalas
573 3a7732f5 Georgios D. Tsoukalas
            if (tp.import_limit is not None and
574 3a7732f5 Georgios D. Tsoukalas
                th.importing + quantity > tp.import_limit):
575 3a7732f5 Georgios D. Tsoukalas
                    m = ("Import limit reached for %s.%s" % (target, resource))
576 3a7732f5 Georgios D. Tsoukalas
                    raise ImportLimitError(m)
577 3a7732f5 Georgios D. Tsoukalas
578 17d5c7a1 root
            if tp.capacity is not None:
579 17d5c7a1 root
                capacity = (+ tp.capacity + th.exported + th.released
580 d6662f65 root
                            - th.importing - th.returning)
581 fac1de87 Georgios D. Tsoukalas
582 17d5c7a1 root
                if capacity - quantity < 0:
583 17d5c7a1 root
                        m = ("There is not enough capacity "
584 17d5c7a1 root
                             "to allocate into in %s.%s" % (target, resource))
585 17d5c7a1 root
                        raise NoCapacityError(m)
586 fac1de87 Georgios D. Tsoukalas
587 d6662f65 root
            Provision.objects.create(   serial      =   commission,
588 58c077a9 Giorgos Korfiatis
                                        entity      =   e,
589 d6662f65 root
                                        resource    =   resource,
590 d6662f65 root
                                        quantity    =   quantity   )
591 f590f930 Georgios D. Tsoukalas
            if release:
592 d6662f65 root
                h.returning -= quantity
593 f590f930 Georgios D. Tsoukalas
                th.releasing -= quantity
594 f590f930 Georgios D. Tsoukalas
            else:
595 f590f930 Georgios D. Tsoukalas
                h.exporting += quantity
596 f590f930 Georgios D. Tsoukalas
                th.importing += quantity
597 fac1de87 Georgios D. Tsoukalas
598 fac1de87 Georgios D. Tsoukalas
            h.save()
599 fac1de87 Georgios D. Tsoukalas
            th.save()
600 fac1de87 Georgios D. Tsoukalas
601 fac1de87 Georgios D. Tsoukalas
        return serial
602 fac1de87 Georgios D. Tsoukalas
603 b435047b root
    def _log_provision(self, commission, s_holding, t_holding,
604 1dedc367 Georgios D. Tsoukalas
                             provision, log_time, reason):
605 1dedc367 Georgios D. Tsoukalas
606 d6662f65 root
        s_entity = s_holding.entity
607 d6662f65 root
        s_policy = s_holding.policy
608 d6662f65 root
        t_entity = t_holding.entity
609 d6662f65 root
        t_policy = t_holding.policy
610 1dedc367 Georgios D. Tsoukalas
611 1dedc367 Georgios D. Tsoukalas
        ProvisionLog.objects.create(
612 b435047b root
                        serial              =   commission.serial,
613 0360f54b root
                        name                =   commission.name,
614 d6662f65 root
                        source              =   s_entity.entity,
615 d6662f65 root
                        target              =   t_entity.entity,
616 1dedc367 Georgios D. Tsoukalas
                        resource            =   provision.resource,
617 d6662f65 root
                        source_quantity     =   s_policy.quantity,
618 d6662f65 root
                        source_capacity     =   s_policy.capacity,
619 d6662f65 root
                        source_import_limit =   s_policy.import_limit,
620 d6662f65 root
                        source_export_limit =   s_policy.export_limit,
621 d6662f65 root
                        source_imported     =   s_holding.imported,
622 d6662f65 root
                        source_exported     =   s_holding.exported,
623 d6662f65 root
                        source_returned     =   s_holding.returned,
624 d6662f65 root
                        source_released     =   s_holding.released,
625 d6662f65 root
                        target_quantity     =   t_policy.quantity,
626 d6662f65 root
                        target_capacity     =   t_policy.capacity,
627 d6662f65 root
                        target_import_limit =   t_policy.import_limit,
628 d6662f65 root
                        target_export_limit =   t_policy.export_limit,
629 d6662f65 root
                        target_imported     =   t_holding.imported,
630 d6662f65 root
                        target_exported     =   t_holding.exported,
631 d6662f65 root
                        target_returned     =   t_holding.returned,
632 d6662f65 root
                        target_released     =   t_holding.released,
633 1dedc367 Georgios D. Tsoukalas
                        delta_quantity      =   provision.quantity,
634 b435047b root
                        issue_time          =   commission.issue_time,
635 1dedc367 Georgios D. Tsoukalas
                        log_time            =   log_time,
636 1dedc367 Georgios D. Tsoukalas
                        reason              =   reason)
637 1dedc367 Georgios D. Tsoukalas
638 f590f930 Georgios D. Tsoukalas
    def accept_commission(self, context={}, clientkey=None,
639 fe6c61fb root
                                serials=(), reason=''):
640 b435047b root
        log_time = now()
641 b435047b root
642 fe6c61fb root
        for serial in serials:
643 fe6c61fb root
            try:
644 5d996aea Giorgos Korfiatis
                c = db_get_commission(clientkey=clientkey, serial=serial,
645 5d996aea Giorgos Korfiatis
                                      for_update=True)
646 fe6c61fb root
            except Commission.DoesNotExist:
647 fe6c61fb root
                return
648 fac1de87 Georgios D. Tsoukalas
649 fe6c61fb root
            t = c.entity
650 fac1de87 Georgios D. Tsoukalas
651 5d996aea Giorgos Korfiatis
            provisions = db_filter_provision(serial=serial, for_update=True)
652 fe6c61fb root
            for pv in provisions:
653 fe6c61fb root
                try:
654 5d996aea Giorgos Korfiatis
                    h = db_get_holding(entity=pv.entity.entity,
655 5d996aea Giorgos Korfiatis
                                       resource=pv.resource, for_update=True)
656 5d996aea Giorgos Korfiatis
                    th = db_get_holding(entity=t, resource=pv.resource,
657 5d996aea Giorgos Korfiatis
                                        for_update=True)
658 fe6c61fb root
                except Holding.DoesNotExist:
659 fe6c61fb root
                    m = "Corrupted provision"
660 fe6c61fb root
                    raise CorruptedError(m)
661 fac1de87 Georgios D. Tsoukalas
662 fe6c61fb root
                quantity = pv.quantity
663 fe6c61fb root
                release = 0
664 fe6c61fb root
                if quantity < 0:
665 fe6c61fb root
                    release = 1
666 f590f930 Georgios D. Tsoukalas
667 fe6c61fb root
                if release:
668 d6662f65 root
                    h.returned -= quantity
669 fe6c61fb root
                    th.released -= quantity
670 fe6c61fb root
                else:
671 fe6c61fb root
                    h.exported += quantity
672 fe6c61fb root
                    th.imported += quantity
673 f590f930 Georgios D. Tsoukalas
674 fe6c61fb root
                reason = 'ACCEPT:' + reason[-121:]
675 b435047b root
                self._log_provision(c, h, th, pv, log_time, reason)
676 fe6c61fb root
                h.save()
677 fe6c61fb root
                th.save()
678 fe6c61fb root
                pv.delete()
679 7661c43c Christos Stavrakakis
            c.delete()
680 fac1de87 Georgios D. Tsoukalas
681 fac1de87 Georgios D. Tsoukalas
        return
682 fac1de87 Georgios D. Tsoukalas
683 f590f930 Georgios D. Tsoukalas
    def reject_commission(self, context={}, clientkey=None,
684 fe6c61fb root
                                serials=(), reason=''):
685 b435047b root
        log_time = now()
686 b435047b root
687 fe6c61fb root
        for serial in serials:
688 fe6c61fb root
            try:
689 5d996aea Giorgos Korfiatis
                c = db_get_commission(clientkey=clientkey, serial=serial,
690 5d996aea Giorgos Korfiatis
                                      for_update=True)
691 fe6c61fb root
            except Commission.DoesNotExist:
692 fe6c61fb root
                return
693 fac1de87 Georgios D. Tsoukalas
694 fe6c61fb root
            t = c.entity
695 fac1de87 Georgios D. Tsoukalas
696 5d996aea Giorgos Korfiatis
            provisions = db_filter_provision(serial=serial, for_update=True)
697 fe6c61fb root
            for pv in provisions:
698 fe6c61fb root
                try:
699 5d996aea Giorgos Korfiatis
                    h = db_get_holding(entity=pv.entity.entity,
700 5d996aea Giorgos Korfiatis
                                       resource=pv.resource, for_update=True)
701 5d996aea Giorgos Korfiatis
                    th = db_get_holding(entity=t, resource=pv.resource,
702 5d996aea Giorgos Korfiatis
                                        for_update=True)
703 fe6c61fb root
                except Holding.DoesNotExist:
704 fe6c61fb root
                    m = "Corrupted provision"
705 fe6c61fb root
                    raise CorruptedError(m)
706 fac1de87 Georgios D. Tsoukalas
707 fe6c61fb root
                quantity = pv.quantity
708 fe6c61fb root
                release = 0
709 fe6c61fb root
                if quantity < 0:
710 fe6c61fb root
                    release = 1
711 f590f930 Georgios D. Tsoukalas
712 fe6c61fb root
                if release:
713 d6662f65 root
                    h.returning += quantity
714 fe6c61fb root
                    th.releasing += quantity
715 fe6c61fb root
                else:
716 fe6c61fb root
                    h.exporting -= quantity
717 fe6c61fb root
                    th.importing -= quantity
718 fe6c61fb root
719 fe6c61fb root
                reason = 'REJECT:' + reason[-121:]
720 b435047b root
                self._log_provision(c, h, th, pv, log_time, reason)
721 fe6c61fb root
                h.save()
722 fe6c61fb root
                th.save()
723 fe6c61fb root
                pv.delete()
724 7661c43c Christos Stavrakakis
            c.delete()
725 fac1de87 Georgios D. Tsoukalas
726 fac1de87 Georgios D. Tsoukalas
        return
727 fac1de87 Georgios D. Tsoukalas
728 fac1de87 Georgios D. Tsoukalas
    def get_pending_commissions(self, context={}, clientkey=None):
729 4d516a3b Christos Stavrakakis
        pending = Commission.objects.filter(clientkey=clientkey)\
730 4d516a3b Christos Stavrakakis
                                    .values_list('serial', flat=True)
731 fac1de87 Georgios D. Tsoukalas
        return pending
732 fac1de87 Georgios D. Tsoukalas
733 fac1de87 Georgios D. Tsoukalas
    def resolve_pending_commissions(self,   context={}, clientkey=None,
734 fac1de87 Georgios D. Tsoukalas
                                            max_serial=None, accept_set=()  ):
735 fac1de87 Georgios D. Tsoukalas
        accept_set = set(accept_set)
736 ddf2e911 Giorgos Korfiatis
        pending = self.get_pending_commissions(context=context, clientkey=clientkey)
737 fac1de87 Georgios D. Tsoukalas
        pending = sorted(pending)
738 fac1de87 Georgios D. Tsoukalas
739 fac1de87 Georgios D. Tsoukalas
        accept = self.accept_commission
740 fac1de87 Georgios D. Tsoukalas
        reject = self.reject_commission
741 fac1de87 Georgios D. Tsoukalas
742 fac1de87 Georgios D. Tsoukalas
        for serial in pending:
743 fac1de87 Georgios D. Tsoukalas
            if serial > max_serial:
744 fac1de87 Georgios D. Tsoukalas
                break
745 fac1de87 Georgios D. Tsoukalas
746 fac1de87 Georgios D. Tsoukalas
            if serial in accept_set:
747 ddf2e911 Giorgos Korfiatis
                accept(context=context, clientkey=clientkey, serials=[serial])
748 fac1de87 Georgios D. Tsoukalas
            else:
749 ddf2e911 Giorgos Korfiatis
                reject(context=context, clientkey=clientkey, serials=[serial])
750 fac1de87 Georgios D. Tsoukalas
751 fac1de87 Georgios D. Tsoukalas
        return
752 fac1de87 Georgios D. Tsoukalas
753 fac1de87 Georgios D. Tsoukalas
    def release_entity(self, context={}, release_entity=()):
754 fac1de87 Georgios D. Tsoukalas
        rejected = []
755 fac1de87 Georgios D. Tsoukalas
        append = rejected.append
756 fac1de87 Georgios D. Tsoukalas
        for entity, key in release_entity:
757 fac1de87 Georgios D. Tsoukalas
            try:
758 5d996aea Giorgos Korfiatis
                e = db_get_entity(entity=entity, key=key, for_update=True)
759 fac1de87 Georgios D. Tsoukalas
            except Entity.DoesNotExist:
760 fac1de87 Georgios D. Tsoukalas
                append(entity)
761 fac1de87 Georgios D. Tsoukalas
                continue
762 fac1de87 Georgios D. Tsoukalas
763 fac1de87 Georgios D. Tsoukalas
            if e.entities.count() != 0:
764 fac1de87 Georgios D. Tsoukalas
                append(entity)
765 fac1de87 Georgios D. Tsoukalas
                continue
766 fac1de87 Georgios D. Tsoukalas
767 492a783b Georgios D. Tsoukalas
            if e.holding_set.count() != 0:
768 fac1de87 Georgios D. Tsoukalas
                append(entity)
769 fac1de87 Georgios D. Tsoukalas
                continue
770 fac1de87 Georgios D. Tsoukalas
771 fac1de87 Georgios D. Tsoukalas
            e.delete()
772 fac1de87 Georgios D. Tsoukalas
773 fac1de87 Georgios D. Tsoukalas
        return rejected
774 fac1de87 Georgios D. Tsoukalas
775 0360f54b root
    def get_timeline(self, context={}, after="", before="Z", get_timeline=()):
776 f590f930 Georgios D. Tsoukalas
        entity_set = set()
777 0360f54b root
        e_add = entity_set.add
778 0360f54b root
        resource_set = set()
779 0360f54b root
        r_add = resource_set.add
780 f590f930 Georgios D. Tsoukalas
781 0360f54b root
        for entity, resource, key in get_timeline:
782 0360f54b root
            if entity not in entity_set:
783 0360f54b root
                try:
784 0360f54b root
                    e = Entity.objects.get(entity=entity, key=key)
785 0360f54b root
                    e_add(entity)
786 0360f54b root
                except Entity.DoesNotExist:
787 0360f54b root
                    continue
788 0360f54b root
789 0360f54b root
            r_add((entity, resource))
790 f590f930 Georgios D. Tsoukalas
791 f590f930 Georgios D. Tsoukalas
        chunk_size = 65536
792 f590f930 Georgios D. Tsoukalas
        nr = 0
793 f590f930 Georgios D. Tsoukalas
        timeline = []
794 0360f54b root
        append = timeline.append
795 1dedc367 Georgios D. Tsoukalas
        filterlogs = ProvisionLog.objects.filter
796 1dedc367 Georgios D. Tsoukalas
        if entity_set:
797 f590f930 Georgios D. Tsoukalas
            q_entity = Q(source__in = entity_set) | Q(target__in = entity_set)
798 1dedc367 Georgios D. Tsoukalas
        else:
799 1dedc367 Georgios D. Tsoukalas
            q_entity = Q()
800 1dedc367 Georgios D. Tsoukalas
801 1dedc367 Georgios D. Tsoukalas
        while 1:
802 1dedc367 Georgios D. Tsoukalas
            logs = filterlogs(  q_entity,
803 1dedc367 Georgios D. Tsoukalas
                                issue_time__gt      =   after,
804 f590f930 Georgios D. Tsoukalas
                                issue_time__lte     =   before,
805 1dedc367 Georgios D. Tsoukalas
                                reason__startswith  =   'ACCEPT:'   )
806 f590f930 Georgios D. Tsoukalas
807 f590f930 Georgios D. Tsoukalas
            logs = logs.order_by('issue_time')
808 d6662f65 root
            #logs = logs.values()
809 f590f930 Georgios D. Tsoukalas
            logs = logs[:chunk_size]
810 f590f930 Georgios D. Tsoukalas
            nr += len(logs)
811 f590f930 Georgios D. Tsoukalas
            if not logs:
812 f590f930 Georgios D. Tsoukalas
                break
813 0360f54b root
            for g in logs:
814 0360f54b root
                if ((g.source, g.resource) not in resource_set
815 0360f54b root
                    or (g.target, g.resource) not in resource_set):
816 0360f54b root
                        continue
817 0360f54b root
818 d6662f65 root
                o = {
819 d6662f65 root
                    'serial'                    :   g.serial,
820 d6662f65 root
                    'source'                    :   g.source,
821 d6662f65 root
                    'target'                    :   g.target,
822 d6662f65 root
                    'resource'                  :   g.resource,
823 d6662f65 root
                    'name'                      :   g.name,
824 d6662f65 root
                    'quantity'                  :   g.delta_quantity,
825 d6662f65 root
                    'source_allocated'          :   g.source_allocated(),
826 d6662f65 root
                    'source_allocated_through'  :   g.source_allocated_through(),
827 d6662f65 root
                    'source_inbound'            :   g.source_inbound(),
828 d6662f65 root
                    'source_inbound_through'    :   g.source_inbound_through(),
829 d6662f65 root
                    'source_outbound'           :   g.source_outbound(),
830 b82eb8c4 root
                    'source_outbound_through'   :   g.source_outbound_through(),
831 d6662f65 root
                    'target_allocated'          :   g.target_allocated(),
832 d6662f65 root
                    'target_allocated_through'  :   g.target_allocated_through(),
833 d6662f65 root
                    'target_inbound'            :   g.target_inbound(),
834 d6662f65 root
                    'target_inbound_through'    :   g.target_inbound_through(),
835 d6662f65 root
                    'target_outbound'           :   g.target_outbound(),
836 d6662f65 root
                    'target_outbound_through'   :   g.target_outbound_through(),
837 d6662f65 root
                    'issue_time'                :   g.issue_time,
838 d6662f65 root
                    'log_time'                  :   g.log_time,
839 d6662f65 root
                    'reason'                    :   g.reason,
840 d6662f65 root
                }
841 d36dcd3d Christos KK Loverdos
842 0360f54b root
                append(o)
843 d6662f65 root
844 d6662f65 root
            after = g.issue_time
845 f590f930 Georgios D. Tsoukalas
            if after >= before:
846 f590f930 Georgios D. Tsoukalas
                break
847 f590f930 Georgios D. Tsoukalas
848 f590f930 Georgios D. Tsoukalas
        return timeline
849 f590f930 Georgios D. Tsoukalas
850 f590f930 Georgios D. Tsoukalas
851 fac1de87 Georgios D. Tsoukalas
API_Callpoint = QuotaholderDjangoDBCallpoint