from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from . import models from .models import Constants, Item import random import time def vars_for_all_templates(self): return { 'round_num': self.subsession.round_number-1, 'num_of_rounds': Constants.num_rounds-1, # no of periods } class IntroWp(WaitPage): group_by_arrival_time = True def is_displayed(self): return self.subsession.round_number == 1 def get_players_for_group(self, waiting_players): if len(waiting_players) >= self.subsession.num_sellers + self.subsession.num_buyers: return waiting_players class GeneratingInitialsWP(WaitPage): def after_all_players_arrive(self): c = Constants g = self.group for s in g.get_sellers(): # we create slots for both sellers and buyers, but for sellers we fill them with items # and also pregenerate costs. For buyers they are initially empty for i in range(c.units_per_seller): slot = s.slots.create(cost=c.cost_value[s.id_in_group-1][i],unit=i) item = Item(slot=slot, quantity=Constants.initial_quantity) item.save() for b in g.get_buyers(): for i in range(Constants.units_per_buyer): b.endowment = c.endowment b.slots.create(value=c.cost_value[b.id_in_group-1][i]) class Welcome(Page): def is_displayed(self): return self.subsession.round_number == 1 class Role(Page): def is_displayed(self): return self.subsession.round_number == 1 def vars_for_template(self): c = self.player.get_form_context() c['repository'] = self.player.get_repo_context() return c class BeforePracticeRound(Page): def is_displayed(self): return self.subsession.round_number == 1 class OrderWaitPage(WaitPage): def after_all_players_arrive(self): self.group.time_started = time.time() class BeforeFormalRounds(Page): def is_displayed(self): return self.subsession.round_number == 2 class Market(Page): timeout_seconds = Constants.time_per_round def vars_for_template(self): time_left= max(0,120 - (time.time() - self.group.time_started)) last_bid_ts=-1 if any([p.get_bids().count() > 0 for p in self.group.get_buyers()]) and not any( [q.get_asks().count() > 0 for q in self.group.get_sellers()]): time_left=max(0,min(120 - (time.time() - self.group.time_started), 20 - (time.time() - self.group.get_bids().order_by('created_at').last().created_at.timestamp()))) last_bid_ts = self.group.get_bids().order_by('created_at').last().created_at.timestamp() elif not any([p.get_bids().count() > 0 for p in self.group.get_buyers()]) and any( [q.get_asks().count() > 0 for q in self.group.get_sellers()]): time_left=max(0,min(120 - (time.time() - self.group.time_started), 20 - (time.time() - self.group.get_asks().order_by('created_at').last().created_at.timestamp()))) last_bid_ts = self.group.get_asks().order_by('created_at').last().created_at.timestamp() elif any([p.get_bids().count() > 0 for p in self.group.get_buyers()]) and any( [q.get_asks().count() > 0 for q in self.group.get_sellers()]): time_left=max(0,min(120 - (time.time() - self.group.time_started), 20 - (time.time() - max(self.group.get_bids().order_by('created_at').last().created_at.timestamp(), self.group.get_asks().order_by('created_at').last().created_at.timestamp())))) last_bid_ts = max(self.group.get_bids().order_by('created_at').last().created_at.timestamp(), self.group.get_asks().order_by('created_at').last().created_at.timestamp()) c = self.player.get_form_context() c['asks'] = self.group.get_asks() c['bids'] = self.group.get_bids() c['repository'] = self.player.get_repo_context() c['contracts'] = self.group.get_contracts() c['best_bids'] = self.group.get_best_bids() c['best_asks'] = self.group.get_best_asks() c['time_started'] = self.group.time_started c['last_bid_ts'] = last_bid_ts c['time_left']=time_left return c class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): pass class ProceedToNextRound(Page): timeout_seconds = 3 pass class Results(Page): pass class Final_Results(Page): def is_displayed(self): return self.subsession.round_number == Constants.num_rounds def vars_for_template(self): return { 'payout_round': self.session.vars['paying_round'] -1, 'final_payout':self.player.in_round(self.session.vars['paying_round']).payoff, 'final_payoff': self.player.in_round(self.session.vars['paying_round']).payoff + 5 } class Survey(Page): form_model = 'player' form_fields = ['age', 'gender', 'marriage', 'student', 'year', 'homecountry', 'language', 'employment', 'income', 'experimentexperience','ethnicity'] def is_displayed(self): return self.subsession.round_number == Constants.num_rounds class Finish(Page): def is_displayed(self): return self.subsession.round_number == Constants.num_rounds page_sequence = [ IntroWp, GeneratingInitialsWP, Welcome, Role, BeforePracticeRound, BeforeFormalRounds, OrderWaitPage, Market, ProceedToNextRound, #ResultsWaitPage, #Results, Final_Results, Survey, Finish ]