2016-10-06 04:58:34 +02:00
|
|
|
from decimal import Decimal
|
2016-09-27 19:52:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
class Offer(object):
|
|
|
|
"""
|
|
|
|
A rate offer to download blobs from a host
|
|
|
|
"""
|
|
|
|
|
2016-09-30 06:12:17 +02:00
|
|
|
RATE_ACCEPTED = "RATE_ACCEPTED"
|
|
|
|
RATE_TOO_LOW = "RATE_TOO_LOW"
|
|
|
|
RATE_UNSET = "RATE_UNSET"
|
|
|
|
|
2016-09-27 19:52:44 +02:00
|
|
|
def __init__(self, offer):
|
|
|
|
self._state = None
|
|
|
|
self.rate = None
|
2016-10-06 04:58:34 +02:00
|
|
|
if isinstance(offer, Decimal):
|
2016-09-27 19:52:44 +02:00
|
|
|
self.rate = round(offer, 5)
|
2016-10-06 04:58:34 +02:00
|
|
|
elif isinstance(offer, float):
|
|
|
|
self.rate = round(Decimal(offer), 5)
|
|
|
|
if self.rate is None or self.rate < Decimal(0.0):
|
2016-10-03 08:44:58 +02:00
|
|
|
self.unset()
|
2016-09-27 19:52:44 +02:00
|
|
|
|
|
|
|
@property
|
|
|
|
def accepted(self):
|
2016-09-30 06:12:17 +02:00
|
|
|
return self._state is Offer.RATE_ACCEPTED
|
2016-09-27 19:52:44 +02:00
|
|
|
|
|
|
|
@property
|
|
|
|
def too_low(self):
|
2016-09-30 06:12:17 +02:00
|
|
|
return self._state is Offer.RATE_TOO_LOW
|
2016-09-27 19:52:44 +02:00
|
|
|
|
2016-10-03 08:44:58 +02:00
|
|
|
@property
|
|
|
|
def is_unset(self):
|
|
|
|
return self._state is Offer.RATE_UNSET
|
|
|
|
|
2016-09-27 19:52:44 +02:00
|
|
|
@property
|
|
|
|
def message(self):
|
|
|
|
if self.accepted:
|
2016-09-30 06:12:17 +02:00
|
|
|
return Offer.RATE_ACCEPTED
|
2016-09-27 19:52:44 +02:00
|
|
|
elif self.too_low:
|
2016-09-30 06:12:17 +02:00
|
|
|
return Offer.RATE_TOO_LOW
|
2016-10-03 08:44:58 +02:00
|
|
|
elif self.is_unset:
|
2016-09-30 06:12:17 +02:00
|
|
|
return Offer.RATE_UNSET
|
2016-10-03 08:44:58 +02:00
|
|
|
return None
|
2016-09-27 19:52:44 +02:00
|
|
|
|
|
|
|
def accept(self):
|
2016-10-06 04:58:34 +02:00
|
|
|
if self.is_unset or self._state is None:
|
2016-09-30 06:12:17 +02:00
|
|
|
self._state = Offer.RATE_ACCEPTED
|
2016-09-27 19:52:44 +02:00
|
|
|
|
|
|
|
def reject(self):
|
2016-10-06 04:58:34 +02:00
|
|
|
if self.is_unset or self._state is None:
|
2016-09-30 06:12:17 +02:00
|
|
|
self._state = Offer.RATE_TOO_LOW
|
2016-10-03 08:44:58 +02:00
|
|
|
|
|
|
|
def unset(self):
|
2016-10-06 04:58:34 +02:00
|
|
|
self._state = Offer.RATE_UNSET
|
|
|
|
|
|
|
|
def handle(self, reply_message):
|
|
|
|
if reply_message == Offer.RATE_TOO_LOW:
|
|
|
|
self.reject()
|
|
|
|
elif reply_message == Offer.RATE_ACCEPTED:
|
|
|
|
self.accept()
|
|
|
|
elif reply_message == Offer.RATE_UNSET:
|
|
|
|
self.unset()
|
|
|
|
else:
|
|
|
|
raise Exception("Unknown offer reply %s" % str(reply_message))
|