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