Statistics
| Branch: | Tag: | Revision:

root / snf-quotaholder-app / quotaholder_django / quotaholder_app / callpoint.py @ 4eb170f3

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