from .models import Constants # Collects all in-round information to be processed after the round is over class BookKeeper: offers = {} ticker = {} accepted = {} tenant_balance = None total_offers_made = None contract_negotiated = False initialized = False def init(self, records): self.offers.clear() self.ticker.clear() self.accepted.clear() self.total_offers_made = 0 self.tenant_balance = Constants.tenant_budget self.initialized = True for record_id in records: self.offers[record_id] = {} self.ticker[record_id] = 0 def validate_record(self, record_id, caller_id): if not self.offers.__contains__(record_id): raise Exception("Missing record: " + record_id + " Caller: " + caller_id) def check_initialization(self): if not self.initialized: raise Exception('Object not initialized') def make_offer(self, record_id, amount): self.check_initialization() self.validate_record(record_id, 'make_offer') self.total_offers_made += 1 offer_receipt = self.create_offer_receipt(record_id) self.offers[record_id][offer_receipt]['Amount'] = int(amount) self.offers[record_id][offer_receipt]['Reply'] = Constants.unaccepted_offer def acknowledge_offer(self, record_id, reply): self.check_initialization() self.validate_record(record_id, 'acknowledge_offer') offer_receipt = self.ticker[record_id] self.offers[record_id][offer_receipt]['Reply'] = reply if reply == Constants.accept_offer: self.accepted[record_id] = self.offers[record_id][offer_receipt]['Amount'] self.contract_negotiated = len(self.accepted) == 3 def create_offer_receipt(self, record_id): self.ticker[record_id] += 1 self.offers[record_id][self.ticker[record_id]] = {} return self.ticker[record_id] def offers_made_to(self, record_id): self.check_initialization() self.validate_record(record_id, 'offer_made_to') return len(self.offers[record_id]) def get_total_offers_made(self): self.check_initialization() return self.total_offers_made def get_tenant_balance(self): self.check_initialization() return self.tenant_balance def contract_was_negotiated(self): self.check_initialization() return self.contract_negotiated def get_accepted_offers(self): self.check_initialization() return self.accepted