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