Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (27.3 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 cceadca8 Giorgos Korfiatis
    def _check_pending(self, entity, resource):
295 cceadca8 Giorgos Korfiatis
        cs = Commission.objects.filter(entity=entity)
296 cceadca8 Giorgos Korfiatis
        cs = [c for c in cs if c.provisions.filter(resource=resource)]
297 cceadca8 Giorgos Korfiatis
        as_target = [c.serial for c in cs]
298 8dc7c13b Giorgos Korfiatis
299 cceadca8 Giorgos Korfiatis
        ps = Provision.objects.filter(entity=entity, resource=resource)
300 cceadca8 Giorgos Korfiatis
        as_source = [p.serial.serial for p in ps]
301 cceadca8 Giorgos Korfiatis
302 cceadca8 Giorgos Korfiatis
        return as_target + as_source
303 8dc7c13b Giorgos Korfiatis
304 8dc7c13b Giorgos Korfiatis
    def _actual_quantity(self, holding):
305 8dc7c13b Giorgos Korfiatis
        hp = holding.policy
306 8dc7c13b Giorgos Korfiatis
        return hp.quantity + (holding.imported + holding.returned -
307 8dc7c13b Giorgos Korfiatis
                              holding.exported - holding.released)
308 8dc7c13b Giorgos Korfiatis
309 8dc7c13b Giorgos Korfiatis
    def _new_policy_name(self):
310 8dc7c13b Giorgos Korfiatis
        return newname('policy_')
311 8dc7c13b Giorgos Korfiatis
312 8dc7c13b Giorgos Korfiatis
    def _increase_resource(self, entity, resource, amount):
313 8dc7c13b Giorgos Korfiatis
        try:
314 8dc7c13b Giorgos Korfiatis
            h = Holding.objects.get(entity=entity, resource=resource)
315 8dc7c13b Giorgos Korfiatis
        except Holding.DoesNotExist:
316 8dc7c13b Giorgos Korfiatis
            h = Holding(entity=entity, resource=resource)
317 8dc7c13b Giorgos Korfiatis
            p = Policy.objects.create(policy=self._new_policy_name(),
318 8dc7c13b Giorgos Korfiatis
                                      quantity=0)
319 8dc7c13b Giorgos Korfiatis
            h.policy = p
320 8dc7c13b Giorgos Korfiatis
        h.imported += amount
321 8dc7c13b Giorgos Korfiatis
        h.save()
322 8dc7c13b Giorgos Korfiatis
323 8dc7c13b Giorgos Korfiatis
    def release_holding(self, context={}, release_holding=()):
324 8dc7c13b Giorgos Korfiatis
        rejected = []
325 8dc7c13b Giorgos Korfiatis
        append = rejected.append
326 8dc7c13b Giorgos Korfiatis
327 8dc7c13b Giorgos Korfiatis
        for idx, (entity, resource, key) in enumerate(release_holding):
328 8dc7c13b Giorgos Korfiatis
            try:
329 8dc7c13b Giorgos Korfiatis
                h = Holding.objects.get(entity=entity, resource=resource)
330 8dc7c13b Giorgos Korfiatis
            except Holding.DoesNotExist:
331 8dc7c13b Giorgos Korfiatis
                append(idx)
332 8dc7c13b Giorgos Korfiatis
                continue
333 8dc7c13b Giorgos Korfiatis
334 8dc7c13b Giorgos Korfiatis
            if h.entity.key != key:
335 8dc7c13b Giorgos Korfiatis
                append(idx)
336 8dc7c13b Giorgos Korfiatis
                continue
337 8dc7c13b Giorgos Korfiatis
338 cceadca8 Giorgos Korfiatis
            if self._check_pending(entity, resource):
339 8dc7c13b Giorgos Korfiatis
                append(idx)
340 8dc7c13b Giorgos Korfiatis
                continue
341 8dc7c13b Giorgos Korfiatis
342 8dc7c13b Giorgos Korfiatis
            q = self._actual_quantity(h)
343 32464501 Giorgos Korfiatis
            if q > 0:
344 32464501 Giorgos Korfiatis
                owner = h.entity.owner
345 32464501 Giorgos Korfiatis
                self._increase_resource(owner, resource, q)
346 32464501 Giorgos Korfiatis
347 8dc7c13b Giorgos Korfiatis
            h.delete()
348 8dc7c13b Giorgos Korfiatis
349 8dc7c13b Giorgos Korfiatis
        return rejected
350 8dc7c13b Giorgos Korfiatis
351 fac1de87 Georgios D. Tsoukalas
    def list_resources(self, context={}, entity=None, key=None):
352 fac1de87 Georgios D. Tsoukalas
        try:
353 72c4abd2 root
            e = Entity.objects.get(entity=entity)
354 fac1de87 Georgios D. Tsoukalas
        except Entity.DoesNotExist:
355 fac1de87 Georgios D. Tsoukalas
            m = "No such entity '%s'" % (entity,)
356 fac1de87 Georgios D. Tsoukalas
            raise NoEntityError(m)
357 fac1de87 Georgios D. Tsoukalas
358 fac1de87 Georgios D. Tsoukalas
        if e.key != key:
359 fac1de87 Georgios D. Tsoukalas
            m = "Invalid key for entity '%s'" % (entity,)
360 fac1de87 Georgios D. Tsoukalas
            raise InvalidKeyError(m)
361 fac1de87 Georgios D. Tsoukalas
362 c8ef1fdb Sofia Papagiannaki
        holdings = e.holding_set.filter(entity=entity)
363 fac1de87 Georgios D. Tsoukalas
        resources = [h.resource for h in holdings]
364 fac1de87 Georgios D. Tsoukalas
        return resources
365 fac1de87 Georgios D. Tsoukalas
366 fac1de87 Georgios D. Tsoukalas
    def get_quota(self, context={}, get_quota=()):
367 fac1de87 Georgios D. Tsoukalas
        quotas = []
368 fac1de87 Georgios D. Tsoukalas
        append = quotas.append
369 fac1de87 Georgios D. Tsoukalas
370 fac1de87 Georgios D. Tsoukalas
        for entity, resource, key in get_quota:
371 fac1de87 Georgios D. Tsoukalas
            try:
372 fac1de87 Georgios D. Tsoukalas
                h = Holding.objects.get(entity=entity, resource=resource)
373 fac1de87 Georgios D. Tsoukalas
            except Holding.DoesNotExist:
374 fac1de87 Georgios D. Tsoukalas
                continue
375 fac1de87 Georgios D. Tsoukalas
376 fac1de87 Georgios D. Tsoukalas
            if h.entity.key != key:
377 fac1de87 Georgios D. Tsoukalas
                continue
378 fac1de87 Georgios D. Tsoukalas
379 fac1de87 Georgios D. Tsoukalas
            p = h.policy
380 fac1de87 Georgios D. Tsoukalas
381 fac1de87 Georgios D. Tsoukalas
            append((h.entity.entity, h.resource, p.quantity, p.capacity,
382 fac1de87 Georgios D. Tsoukalas
                    p.import_limit, p.export_limit,
383 b435047b root
                    h.imported, h.exported,
384 d6662f65 root
                    h.returned, h.released,
385 b435047b root
                    h.flags))
386 fac1de87 Georgios D. Tsoukalas
387 fac1de87 Georgios D. Tsoukalas
        return quotas
388 fac1de87 Georgios D. Tsoukalas
389 fac1de87 Georgios D. Tsoukalas
    def set_quota(self, context={}, set_quota=()):
390 fac1de87 Georgios D. Tsoukalas
        rejected = []
391 fac1de87 Georgios D. Tsoukalas
        append = rejected.append
392 fac1de87 Georgios D. Tsoukalas
393 fac1de87 Georgios D. Tsoukalas
        for (   entity, resource, key,
394 fac1de87 Georgios D. Tsoukalas
                quantity, capacity,
395 fac1de87 Georgios D. Tsoukalas
                import_limit, export_limit, flags  ) in set_quota:
396 fac1de87 Georgios D. Tsoukalas
397 eec92c03 Georgios D. Tsoukalas
                p = None
398 eec92c03 Georgios D. Tsoukalas
399 fac1de87 Georgios D. Tsoukalas
                try:
400 fac1de87 Georgios D. Tsoukalas
                    h = Holding.objects.get(entity=entity, resource=resource)
401 fac1de87 Georgios D. Tsoukalas
                    if h.entity.key != key:
402 fac1de87 Georgios D. Tsoukalas
                        append((entity, resource))
403 fac1de87 Georgios D. Tsoukalas
                        continue
404 eec92c03 Georgios D. Tsoukalas
                    p = h.policy
405 eec92c03 Georgios D. Tsoukalas
406 fac1de87 Georgios D. Tsoukalas
                except Holding.DoesNotExist:
407 eec92c03 Georgios D. Tsoukalas
                    try:
408 eec92c03 Georgios D. Tsoukalas
                        e = Entity.objects.get(entity=entity)
409 eec92c03 Georgios D. Tsoukalas
                    except Entity.DoesNotExist:
410 eec92c03 Georgios D. Tsoukalas
                        append((entity, resource))
411 eec92c03 Georgios D. Tsoukalas
                        continue
412 fac1de87 Georgios D. Tsoukalas
413 eec92c03 Georgios D. Tsoukalas
                    if e.key != key:
414 eec92c03 Georgios D. Tsoukalas
                        append((entity, resource))
415 eec92c03 Georgios D. Tsoukalas
                        continue
416 eec92c03 Georgios D. Tsoukalas
417 eec92c03 Georgios D. Tsoukalas
                    h = None
418 eec92c03 Georgios D. Tsoukalas
419 eec92c03 Georgios D. Tsoukalas
                policy = newname('policy_')
420 eec92c03 Georgios D. Tsoukalas
                newp = Policy   (
421 fac1de87 Georgios D. Tsoukalas
                            policy=policy,
422 fac1de87 Georgios D. Tsoukalas
                            quantity=quantity,
423 fac1de87 Georgios D. Tsoukalas
                            capacity=capacity,
424 fac1de87 Georgios D. Tsoukalas
                            import_limit=import_limit,
425 fac1de87 Georgios D. Tsoukalas
                            export_limit=export_limit
426 fac1de87 Georgios D. Tsoukalas
                )
427 fac1de87 Georgios D. Tsoukalas
428 eec92c03 Georgios D. Tsoukalas
                if h is None:
429 443fa939 Sofia Papagiannaki
                    h = Holding(entity=e, resource=resource,
430 eec92c03 Georgios D. Tsoukalas
                                policy=newp, flags=flags)
431 eec92c03 Georgios D. Tsoukalas
                else:
432 eec92c03 Georgios D. Tsoukalas
                    h.policy = newp
433 eec92c03 Georgios D. Tsoukalas
                    h.flags = flags
434 eec92c03 Georgios D. Tsoukalas
435 fac1de87 Georgios D. Tsoukalas
                h.save()
436 eec92c03 Georgios D. Tsoukalas
                newp.save()
437 fac1de87 Georgios D. Tsoukalas
438 c8ef1fdb Sofia Papagiannaki
                if p is not None and p.holding_set.count() == 0:
439 fac1de87 Georgios D. Tsoukalas
                    p.delete()
440 fac1de87 Georgios D. Tsoukalas
441 fac1de87 Georgios D. Tsoukalas
        return rejected
442 fac1de87 Georgios D. Tsoukalas
443 f590f930 Georgios D. Tsoukalas
    def issue_commission(self,  context     =   {},
444 f590f930 Georgios D. Tsoukalas
                                clientkey   =   None,
445 f590f930 Georgios D. Tsoukalas
                                target      =   None,
446 f590f930 Georgios D. Tsoukalas
                                key         =   None,
447 d6662f65 root
                                name        =   None,
448 f590f930 Georgios D. Tsoukalas
                                provisions  =   ()  ):
449 fac1de87 Georgios D. Tsoukalas
450 fac1de87 Georgios D. Tsoukalas
        try:
451 fac1de87 Georgios D. Tsoukalas
            t = Entity.objects.get(entity=target)
452 fac1de87 Georgios D. Tsoukalas
        except Entity.DoesNotExist:
453 7b1891cc Giorgos Korfiatis
            m = "No target entity '%s'" % (target,)
454 7b1891cc Giorgos Korfiatis
            raise NoEntityError(m)
455 fac1de87 Georgios D. Tsoukalas
        else:
456 fac1de87 Georgios D. Tsoukalas
            if t.key != key:
457 fac1de87 Georgios D. Tsoukalas
                m = "Invalid key for target entity '%s'" % (target,)
458 fac1de87 Georgios D. Tsoukalas
                raise InvalidKeyError(m)
459 fac1de87 Georgios D. Tsoukalas
460 c3a709ad root
        create = Commission.objects.create
461 d6662f65 root
        commission = create(entity_id=target, clientkey=clientkey, name=name)
462 fac1de87 Georgios D. Tsoukalas
        serial = commission.serial
463 fac1de87 Georgios D. Tsoukalas
464 6afede3f Giorgos Korfiatis
        checked = []
465 fac1de87 Georgios D. Tsoukalas
        for entity, resource, quantity in provisions:
466 6afede3f Giorgos Korfiatis
467 6afede3f Giorgos Korfiatis
            ent_res = entity, resource
468 6afede3f Giorgos Korfiatis
            if ent_res in checked:
469 6afede3f Giorgos Korfiatis
                m = "Duplicate provision for %s.%s" % ent_res
470 6afede3f Giorgos Korfiatis
                raise DuplicateError(m)
471 6afede3f Giorgos Korfiatis
            checked.append(ent_res)
472 6afede3f Giorgos Korfiatis
473 58c077a9 Giorgos Korfiatis
            try:
474 58c077a9 Giorgos Korfiatis
                e = Entity.objects.get(entity=entity)
475 58c077a9 Giorgos Korfiatis
            except Entity.DoesNotExist:
476 58c077a9 Giorgos Korfiatis
                m = "No source entity '%s'" % (entity,)
477 58c077a9 Giorgos Korfiatis
                raise NoEntityError(m)
478 58c077a9 Giorgos Korfiatis
479 c3a709ad root
            release = 0
480 c3a709ad root
            if quantity < 0:
481 c3a709ad root
                release = 1
482 c3a709ad root
483 fac1de87 Georgios D. Tsoukalas
            try:
484 fac1de87 Georgios D. Tsoukalas
                h = Holding.objects.get(entity=entity, resource=resource)
485 fac1de87 Georgios D. Tsoukalas
            except Holding.DoesNotExist:
486 fac1de87 Georgios D. Tsoukalas
                m = ("There is not enough quantity "
487 fac1de87 Georgios D. Tsoukalas
                     "to allocate from in %s.%s" % (entity, resource))
488 fac1de87 Georgios D. Tsoukalas
                raise NoQuantityError(m)
489 fac1de87 Georgios D. Tsoukalas
490 fac1de87 Georgios D. Tsoukalas
            hp = h.policy
491 fac1de87 Georgios D. Tsoukalas
492 3a7732f5 Georgios D. Tsoukalas
            if (hp.export_limit is not None and
493 3a7732f5 Georgios D. Tsoukalas
                h.exporting + quantity > hp.export_limit):
494 3a7732f5 Georgios D. Tsoukalas
                    m = ("Export limit reached for %s.%s" % (entity, resource))
495 3a7732f5 Georgios D. Tsoukalas
                    raise ExportLimitError(m)
496 3a7732f5 Georgios D. Tsoukalas
497 17d5c7a1 root
            if hp.quantity is not None:
498 d6662f65 root
                available = (+ hp.quantity + h.imported + h.returned
499 17d5c7a1 root
                             - h.exporting - h.releasing)
500 f590f930 Georgios D. Tsoukalas
501 17d5c7a1 root
                if available - quantity < 0:
502 17d5c7a1 root
                    m = ("There is not enough quantity "
503 17d5c7a1 root
                         "to allocate from in %s.%s" % (entity, resource))
504 17d5c7a1 root
                    raise NoQuantityError(m)
505 fac1de87 Georgios D. Tsoukalas
506 fac1de87 Georgios D. Tsoukalas
            try:
507 fac1de87 Georgios D. Tsoukalas
                th = Holding.objects.get(entity=target, resource=resource)
508 fac1de87 Georgios D. Tsoukalas
            except Holding.DoesNotExist:
509 fac1de87 Georgios D. Tsoukalas
                m = ("There is not enough capacity "
510 fac1de87 Georgios D. Tsoukalas
                     "to allocate into in %s.%s" % (target, resource))
511 fac1de87 Georgios D. Tsoukalas
                raise NoCapacityError(m)
512 fac1de87 Georgios D. Tsoukalas
513 fac1de87 Georgios D. Tsoukalas
            tp = th.policy
514 fac1de87 Georgios D. Tsoukalas
515 3a7732f5 Georgios D. Tsoukalas
            if (tp.import_limit is not None and
516 3a7732f5 Georgios D. Tsoukalas
                th.importing + quantity > tp.import_limit):
517 3a7732f5 Georgios D. Tsoukalas
                    m = ("Import limit reached for %s.%s" % (target, resource))
518 3a7732f5 Georgios D. Tsoukalas
                    raise ImportLimitError(m)
519 3a7732f5 Georgios D. Tsoukalas
520 17d5c7a1 root
            if tp.capacity is not None:
521 17d5c7a1 root
                capacity = (+ tp.capacity + th.exported + th.released
522 d6662f65 root
                            - th.importing - th.returning)
523 fac1de87 Georgios D. Tsoukalas
524 17d5c7a1 root
                if capacity - quantity < 0:
525 17d5c7a1 root
                        m = ("There is not enough capacity "
526 17d5c7a1 root
                             "to allocate into in %s.%s" % (target, resource))
527 17d5c7a1 root
                        raise NoCapacityError(m)
528 fac1de87 Georgios D. Tsoukalas
529 d6662f65 root
            Provision.objects.create(   serial      =   commission,
530 58c077a9 Giorgos Korfiatis
                                        entity      =   e,
531 d6662f65 root
                                        resource    =   resource,
532 d6662f65 root
                                        quantity    =   quantity   )
533 f590f930 Georgios D. Tsoukalas
            if release:
534 d6662f65 root
                h.returning -= quantity
535 f590f930 Georgios D. Tsoukalas
                th.releasing -= quantity
536 f590f930 Georgios D. Tsoukalas
            else:
537 f590f930 Georgios D. Tsoukalas
                h.exporting += quantity
538 f590f930 Georgios D. Tsoukalas
                th.importing += quantity
539 fac1de87 Georgios D. Tsoukalas
540 fac1de87 Georgios D. Tsoukalas
            h.save()
541 fac1de87 Georgios D. Tsoukalas
            th.save()
542 fac1de87 Georgios D. Tsoukalas
543 fac1de87 Georgios D. Tsoukalas
        return serial
544 fac1de87 Georgios D. Tsoukalas
545 b435047b root
    def _log_provision(self, commission, s_holding, t_holding,
546 1dedc367 Georgios D. Tsoukalas
                             provision, log_time, reason):
547 1dedc367 Georgios D. Tsoukalas
548 d6662f65 root
        s_entity = s_holding.entity
549 d6662f65 root
        s_policy = s_holding.policy
550 d6662f65 root
        t_entity = t_holding.entity
551 d6662f65 root
        t_policy = t_holding.policy
552 1dedc367 Georgios D. Tsoukalas
553 1dedc367 Georgios D. Tsoukalas
        ProvisionLog.objects.create(
554 b435047b root
                        serial              =   commission.serial,
555 0360f54b root
                        name                =   commission.name,
556 d6662f65 root
                        source              =   s_entity.entity,
557 d6662f65 root
                        target              =   t_entity.entity,
558 1dedc367 Georgios D. Tsoukalas
                        resource            =   provision.resource,
559 d6662f65 root
                        source_quantity     =   s_policy.quantity,
560 d6662f65 root
                        source_capacity     =   s_policy.capacity,
561 d6662f65 root
                        source_import_limit =   s_policy.import_limit,
562 d6662f65 root
                        source_export_limit =   s_policy.export_limit,
563 d6662f65 root
                        source_imported     =   s_holding.imported,
564 d6662f65 root
                        source_exported     =   s_holding.exported,
565 d6662f65 root
                        source_returned     =   s_holding.returned,
566 d6662f65 root
                        source_released     =   s_holding.released,
567 d6662f65 root
                        target_quantity     =   t_policy.quantity,
568 d6662f65 root
                        target_capacity     =   t_policy.capacity,
569 d6662f65 root
                        target_import_limit =   t_policy.import_limit,
570 d6662f65 root
                        target_export_limit =   t_policy.export_limit,
571 d6662f65 root
                        target_imported     =   t_holding.imported,
572 d6662f65 root
                        target_exported     =   t_holding.exported,
573 d6662f65 root
                        target_returned     =   t_holding.returned,
574 d6662f65 root
                        target_released     =   t_holding.released,
575 1dedc367 Georgios D. Tsoukalas
                        delta_quantity      =   provision.quantity,
576 b435047b root
                        issue_time          =   commission.issue_time,
577 1dedc367 Georgios D. Tsoukalas
                        log_time            =   log_time,
578 1dedc367 Georgios D. Tsoukalas
                        reason              =   reason)
579 1dedc367 Georgios D. Tsoukalas
580 f590f930 Georgios D. Tsoukalas
    def accept_commission(self, context={}, clientkey=None,
581 fe6c61fb root
                                serials=(), reason=''):
582 b435047b root
        log_time = now()
583 b435047b root
584 fe6c61fb root
        for serial in serials:
585 fe6c61fb root
            try:
586 fe6c61fb root
                c = Commission.objects.get(clientkey=clientkey, serial=serial)
587 fe6c61fb root
            except Commission.DoesNotExist:
588 fe6c61fb root
                return
589 fac1de87 Georgios D. Tsoukalas
590 fe6c61fb root
            t = c.entity
591 fac1de87 Georgios D. Tsoukalas
592 fe6c61fb root
            provisions = Provision.objects.filter(serial=serial)
593 fe6c61fb root
            for pv in provisions:
594 fe6c61fb root
                try:
595 fe6c61fb root
                    h = Holding.objects.get(entity=pv.entity.entity,
596 fe6c61fb root
                                            resource=pv.resource    )
597 fe6c61fb root
                    th = Holding.objects.get(entity=t, resource=pv.resource)
598 fe6c61fb root
                except Holding.DoesNotExist:
599 fe6c61fb root
                    m = "Corrupted provision"
600 fe6c61fb root
                    raise CorruptedError(m)
601 fac1de87 Georgios D. Tsoukalas
602 fe6c61fb root
                quantity = pv.quantity
603 fe6c61fb root
                release = 0
604 fe6c61fb root
                if quantity < 0:
605 fe6c61fb root
                    release = 1
606 f590f930 Georgios D. Tsoukalas
607 fe6c61fb root
                if release:
608 d6662f65 root
                    h.returned -= quantity
609 fe6c61fb root
                    th.released -= quantity
610 fe6c61fb root
                else:
611 fe6c61fb root
                    h.exported += quantity
612 fe6c61fb root
                    th.imported += quantity
613 f590f930 Georgios D. Tsoukalas
614 fe6c61fb root
                reason = 'ACCEPT:' + reason[-121:]
615 b435047b root
                self._log_provision(c, h, th, pv, log_time, reason)
616 fe6c61fb root
                h.save()
617 fe6c61fb root
                th.save()
618 fe6c61fb root
                pv.delete()
619 7661c43c Christos Stavrakakis
            c.delete()
620 fac1de87 Georgios D. Tsoukalas
621 fac1de87 Georgios D. Tsoukalas
        return
622 fac1de87 Georgios D. Tsoukalas
623 f590f930 Georgios D. Tsoukalas
    def reject_commission(self, context={}, clientkey=None,
624 fe6c61fb root
                                serials=(), reason=''):
625 b435047b root
        log_time = now()
626 b435047b root
627 fe6c61fb root
        for serial in serials:
628 fe6c61fb root
            try:
629 fe6c61fb root
                c = Commission.objects.get(clientkey=clientkey, serial=serial)
630 fe6c61fb root
            except Commission.DoesNotExist:
631 fe6c61fb root
                return
632 fac1de87 Georgios D. Tsoukalas
633 fe6c61fb root
            t = c.entity
634 fac1de87 Georgios D. Tsoukalas
635 fe6c61fb root
            provisions = Provision.objects.filter(serial=serial)
636 fe6c61fb root
            for pv in provisions:
637 fe6c61fb root
                try:
638 fe6c61fb root
                    h = Holding.objects.get(entity=pv.entity.entity,
639 fe6c61fb root
                                            resource=pv.resource)
640 fe6c61fb root
                    th = Holding.objects.get(entity=t, resource=pv.resource)
641 fe6c61fb root
                except Holding.DoesNotExist:
642 fe6c61fb root
                    m = "Corrupted provision"
643 fe6c61fb root
                    raise CorruptedError(m)
644 fac1de87 Georgios D. Tsoukalas
645 fe6c61fb root
                quantity = pv.quantity
646 fe6c61fb root
                release = 0
647 fe6c61fb root
                if quantity < 0:
648 fe6c61fb root
                    release = 1
649 f590f930 Georgios D. Tsoukalas
650 fe6c61fb root
                if release:
651 d6662f65 root
                    h.returning += quantity
652 fe6c61fb root
                    th.releasing += quantity
653 fe6c61fb root
                else:
654 fe6c61fb root
                    h.exporting -= quantity
655 fe6c61fb root
                    th.importing -= quantity
656 fe6c61fb root
657 fe6c61fb root
                reason = 'REJECT:' + reason[-121:]
658 b435047b root
                self._log_provision(c, h, th, pv, log_time, reason)
659 fe6c61fb root
                h.save()
660 fe6c61fb root
                th.save()
661 fe6c61fb root
                pv.delete()
662 7661c43c Christos Stavrakakis
            c.delete()
663 fac1de87 Georgios D. Tsoukalas
664 fac1de87 Georgios D. Tsoukalas
        return
665 fac1de87 Georgios D. Tsoukalas
666 fac1de87 Georgios D. Tsoukalas
    def get_pending_commissions(self, context={}, clientkey=None):
667 4d516a3b Christos Stavrakakis
        pending = Commission.objects.filter(clientkey=clientkey)\
668 4d516a3b Christos Stavrakakis
                                    .values_list('serial', flat=True)
669 fac1de87 Georgios D. Tsoukalas
        return pending
670 fac1de87 Georgios D. Tsoukalas
671 fac1de87 Georgios D. Tsoukalas
    def resolve_pending_commissions(self,   context={}, clientkey=None,
672 fac1de87 Georgios D. Tsoukalas
                                            max_serial=None, accept_set=()  ):
673 fac1de87 Georgios D. Tsoukalas
        accept_set = set(accept_set)
674 ddf2e911 Giorgos Korfiatis
        pending = self.get_pending_commissions(context=context, clientkey=clientkey)
675 fac1de87 Georgios D. Tsoukalas
        pending = sorted(pending)
676 fac1de87 Georgios D. Tsoukalas
677 fac1de87 Georgios D. Tsoukalas
        accept = self.accept_commission
678 fac1de87 Georgios D. Tsoukalas
        reject = self.reject_commission
679 fac1de87 Georgios D. Tsoukalas
680 fac1de87 Georgios D. Tsoukalas
        for serial in pending:
681 fac1de87 Georgios D. Tsoukalas
            if serial > max_serial:
682 fac1de87 Georgios D. Tsoukalas
                break
683 fac1de87 Georgios D. Tsoukalas
684 fac1de87 Georgios D. Tsoukalas
            if serial in accept_set:
685 ddf2e911 Giorgos Korfiatis
                accept(context=context, clientkey=clientkey, serials=[serial])
686 fac1de87 Georgios D. Tsoukalas
            else:
687 ddf2e911 Giorgos Korfiatis
                reject(context=context, clientkey=clientkey, serials=[serial])
688 fac1de87 Georgios D. Tsoukalas
689 fac1de87 Georgios D. Tsoukalas
        return
690 fac1de87 Georgios D. Tsoukalas
691 fac1de87 Georgios D. Tsoukalas
    def release_entity(self, context={}, release_entity=()):
692 fac1de87 Georgios D. Tsoukalas
        rejected = []
693 fac1de87 Georgios D. Tsoukalas
        append = rejected.append
694 fac1de87 Georgios D. Tsoukalas
        for entity, key in release_entity:
695 fac1de87 Georgios D. Tsoukalas
            try:
696 fac1de87 Georgios D. Tsoukalas
                e = Entity.objects.get(entity=entity, key=key)
697 fac1de87 Georgios D. Tsoukalas
            except Entity.DoesNotExist:
698 fac1de87 Georgios D. Tsoukalas
                append(entity)
699 fac1de87 Georgios D. Tsoukalas
                continue
700 fac1de87 Georgios D. Tsoukalas
701 fac1de87 Georgios D. Tsoukalas
            if e.entities.count() != 0:
702 fac1de87 Georgios D. Tsoukalas
                append(entity)
703 fac1de87 Georgios D. Tsoukalas
                continue
704 fac1de87 Georgios D. Tsoukalas
705 492a783b Georgios D. Tsoukalas
            if e.holding_set.count() != 0:
706 fac1de87 Georgios D. Tsoukalas
                append(entity)
707 fac1de87 Georgios D. Tsoukalas
                continue
708 fac1de87 Georgios D. Tsoukalas
709 fac1de87 Georgios D. Tsoukalas
            e.delete()
710 fac1de87 Georgios D. Tsoukalas
711 fac1de87 Georgios D. Tsoukalas
        return rejected
712 fac1de87 Georgios D. Tsoukalas
713 0360f54b root
    def get_timeline(self, context={}, after="", before="Z", get_timeline=()):
714 f590f930 Georgios D. Tsoukalas
        entity_set = set()
715 0360f54b root
        e_add = entity_set.add
716 0360f54b root
        resource_set = set()
717 0360f54b root
        r_add = resource_set.add
718 f590f930 Georgios D. Tsoukalas
719 0360f54b root
        for entity, resource, key in get_timeline:
720 0360f54b root
            if entity not in entity_set:
721 0360f54b root
                try:
722 0360f54b root
                    e = Entity.objects.get(entity=entity, key=key)
723 0360f54b root
                    e_add(entity)
724 0360f54b root
                except Entity.DoesNotExist:
725 0360f54b root
                    continue
726 0360f54b root
727 0360f54b root
            r_add((entity, resource))
728 f590f930 Georgios D. Tsoukalas
729 f590f930 Georgios D. Tsoukalas
        chunk_size = 65536
730 f590f930 Georgios D. Tsoukalas
        nr = 0
731 f590f930 Georgios D. Tsoukalas
        timeline = []
732 0360f54b root
        append = timeline.append
733 1dedc367 Georgios D. Tsoukalas
        filterlogs = ProvisionLog.objects.filter
734 1dedc367 Georgios D. Tsoukalas
        if entity_set:
735 f590f930 Georgios D. Tsoukalas
            q_entity = Q(source__in = entity_set) | Q(target__in = entity_set)
736 1dedc367 Georgios D. Tsoukalas
        else:
737 1dedc367 Georgios D. Tsoukalas
            q_entity = Q()
738 1dedc367 Georgios D. Tsoukalas
739 1dedc367 Georgios D. Tsoukalas
        while 1:
740 1dedc367 Georgios D. Tsoukalas
            logs = filterlogs(  q_entity,
741 1dedc367 Georgios D. Tsoukalas
                                issue_time__gt      =   after,
742 f590f930 Georgios D. Tsoukalas
                                issue_time__lte     =   before,
743 1dedc367 Georgios D. Tsoukalas
                                reason__startswith  =   'ACCEPT:'   )
744 f590f930 Georgios D. Tsoukalas
745 f590f930 Georgios D. Tsoukalas
            logs = logs.order_by('issue_time')
746 d6662f65 root
            #logs = logs.values()
747 f590f930 Georgios D. Tsoukalas
            logs = logs[:chunk_size]
748 f590f930 Georgios D. Tsoukalas
            nr += len(logs)
749 f590f930 Georgios D. Tsoukalas
            if not logs:
750 f590f930 Georgios D. Tsoukalas
                break
751 0360f54b root
            for g in logs:
752 0360f54b root
                if ((g.source, g.resource) not in resource_set
753 0360f54b root
                    or (g.target, g.resource) not in resource_set):
754 0360f54b root
                        continue
755 0360f54b root
756 d6662f65 root
                o = {
757 d6662f65 root
                    'serial'                    :   g.serial,
758 d6662f65 root
                    'source'                    :   g.source,
759 d6662f65 root
                    'target'                    :   g.target,
760 d6662f65 root
                    'resource'                  :   g.resource,
761 d6662f65 root
                    'name'                      :   g.name,
762 d6662f65 root
                    'quantity'                  :   g.delta_quantity,
763 d6662f65 root
                    'source_allocated'          :   g.source_allocated(),
764 d6662f65 root
                    'source_allocated_through'  :   g.source_allocated_through(),
765 d6662f65 root
                    'source_inbound'            :   g.source_inbound(),
766 d6662f65 root
                    'source_inbound_through'    :   g.source_inbound_through(),
767 d6662f65 root
                    'source_outbound'           :   g.source_outbound(),
768 b82eb8c4 root
                    'source_outbound_through'   :   g.source_outbound_through(),
769 d6662f65 root
                    'target_allocated'          :   g.target_allocated(),
770 d6662f65 root
                    'target_allocated_through'  :   g.target_allocated_through(),
771 d6662f65 root
                    'target_inbound'            :   g.target_inbound(),
772 d6662f65 root
                    'target_inbound_through'    :   g.target_inbound_through(),
773 d6662f65 root
                    'target_outbound'           :   g.target_outbound(),
774 d6662f65 root
                    'target_outbound_through'   :   g.target_outbound_through(),
775 d6662f65 root
                    'issue_time'                :   g.issue_time,
776 d6662f65 root
                    'log_time'                  :   g.log_time,
777 d6662f65 root
                    'reason'                    :   g.reason,
778 d6662f65 root
                }
779 d36dcd3d Christos KK Loverdos
780 0360f54b root
                append(o)
781 d6662f65 root
782 d6662f65 root
            after = g.issue_time
783 f590f930 Georgios D. Tsoukalas
            if after >= before:
784 f590f930 Georgios D. Tsoukalas
                break
785 f590f930 Georgios D. Tsoukalas
786 f590f930 Georgios D. Tsoukalas
        return timeline
787 f590f930 Georgios D. Tsoukalas
788 f590f930 Georgios D. Tsoukalas
789 fac1de87 Georgios D. Tsoukalas
API_Callpoint = QuotaholderDjangoDBCallpoint