106 |
106 |
if serial:
|
107 |
107 |
serial_info = {"serial": serial}
|
108 |
108 |
if auto_accept:
|
|
109 |
serial_info["pending"] = False
|
109 |
110 |
serial_info["accept"] = True
|
110 |
111 |
serial_info["resolved"] = True
|
111 |
112 |
return QuotaHolderSerial.objects.create(**serial_info)
|
... | ... | |
114 |
115 |
|
115 |
116 |
|
116 |
117 |
def accept_serial(serial, strict=True):
|
|
118 |
assert serial.pending or serial.accept
|
117 |
119 |
response = resolve_commissions(accept=[serial.serial], strict=strict)
|
|
120 |
serial.pending = False
|
118 |
121 |
serial.accept = True
|
119 |
122 |
serial.resolved = True
|
120 |
123 |
serial.save()
|
... | ... | |
122 |
125 |
|
123 |
126 |
|
124 |
127 |
def reject_serial(serial, strict=True):
|
|
128 |
assert serial.pending or not serial.accept
|
125 |
129 |
response = resolve_commissions(reject=[serial.serial], strict=strict)
|
126 |
|
serial.reject = True
|
|
130 |
serial.pending = False
|
|
131 |
serial.accept = False
|
127 |
132 |
serial.resolved = True
|
128 |
133 |
serial.save()
|
129 |
134 |
return response
|
... | ... | |
238 |
243 |
7) COMMIT!
|
239 |
244 |
|
240 |
245 |
"""
|
241 |
|
previous_serial = resource.serial
|
242 |
|
if previous_serial is not None and not previous_serial.resolved:
|
243 |
|
if previous_serial.pending:
|
244 |
|
msg = "Issuing commission for resource '%s' while previous serial"\
|
245 |
|
" '%s' is still pending." % (resource, previous_serial)
|
246 |
|
raise Exception(msg)
|
247 |
|
elif previous_serial.accept:
|
248 |
|
accept_serial(previous_serial, strict=False)
|
249 |
|
else:
|
250 |
|
reject_serial(previous_serial, strict=False)
|
|
246 |
resolve_commission(resource.serial)
|
251 |
247 |
|
252 |
248 |
try:
|
253 |
249 |
# Convert resources in the format expected by Quotaholder
|
... | ... | |
363 |
359 |
|
364 |
360 |
"""
|
365 |
361 |
# Try to resolve previous serial
|
366 |
|
resolve_commission(resource.serial)
|
|
362 |
resolve_commission(resource.serial, force=force)
|
367 |
363 |
|
368 |
364 |
# Check if action is quotable and issue the corresponding commission
|
369 |
365 |
serial = None
|
... | ... | |
382 |
378 |
resource.serial = serial
|
383 |
379 |
|
384 |
380 |
|
385 |
|
def resolve_commission(serial):
|
|
381 |
class ResolveError(Exception):
|
|
382 |
pass
|
|
383 |
|
|
384 |
|
|
385 |
def resolve_commission(serial, force=False):
|
386 |
386 |
if serial is None or serial.resolved:
|
387 |
387 |
return
|
|
388 |
if serial.pending and not force:
|
|
389 |
m = "Could not resolve commission: serial %s is undecided" % serial
|
|
390 |
raise ResolveError(m)
|
388 |
391 |
log.warning("Resolving pending commission: %s", serial)
|
389 |
392 |
if not serial.pending and serial.accept:
|
390 |
393 |
accept_serial(serial)
|