from otree.api import * c = cu doc = 'Ky aplikacion përfshin eksperimentin kryesor që përbëhet nga 20 raundet e porositjes dhe reagimeve të shitësve të gazetave.' class C(BaseConstants): NAME_IN_URL = 'Decisions' PLAYERS_PER_GROUP = None NUM_ROUNDS = 20 DEMAND = (138, 126, 101, 72, 135, 61, 100, 76, 63, 115, 96, 125, 118, 136, 113, 80, 133, 101, 56, 63) MIN_DEMAND = 50 MAX_DEMAND = 150 SELLING_PRICE = cu(10) UNIT_PURCHASE_COST = cu(3) class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): session = subsession.session import itertools pressures = itertools.cycle([0, 1, 2]) if subsession.round_number == 1: for player in subsession.get_players(): participant = player.participant participant.positive = next(pressures) class Group(BaseGroup): pass class Player(BasePlayer): order_quantity = models.IntegerField(label='Sa njësi dëshironi të porosisni?', max=C.MAX_DEMAND, min=C.MIN_DEMAND) prev_loss = models.IntegerField(initial=0) def custom_export(players): yield ['participant_code', 'id_in_group', 'positive_treatment'] for p in players: pp = p.participant yield [pp.code, p.id_in_group, pp.positive] class YourOrder(Page): form_model = 'player' form_fields = ['order_quantity'] @staticmethod def vars_for_template(player: Player): if player.round_number > 1: prev_player = player.in_round(player.round_number - 1) prev_order = prev_player.order_quantity PREV_DEMAND = C.DEMAND[player.round_number - 2] prev_cost = C.UNIT_PURCHASE_COST * prev_order prev_round = player.round_number - 1 prev_earn = C.SELLING_PRICE * min(prev_order, PREV_DEMAND) - prev_cost earn = C.SELLING_PRICE - C.UNIT_PURCHASE_COST mean_earn = (C.MAX_DEMAND - C.MIN_DEMAND) * earn next_rounds = (C.NUM_ROUNDS + 1) - player.round_number prev_revenue = C.SELLING_PRICE * min(prev_order, PREV_DEMAND) if PREV_DEMAND > prev_order: prev_loss = earn * (PREV_DEMAND - prev_order) prev_earn2 = C.SELLING_PRICE * min(prev_order, PREV_DEMAND) - prev_cost - prev_loss else: prev_loss = C.UNIT_PURCHASE_COST * (prev_order - PREV_DEMAND) prev_earn2 = C.SELLING_PRICE * min(prev_order, PREV_DEMAND) - prev_cost else: prev_round = None prev_order = None PREV_DEMAND = None prev_cost = None prev_earn = None earn = C.SELLING_PRICE - C.UNIT_PURCHASE_COST mean_earn = (C.MAX_DEMAND - C.MIN_DEMAND) * earn next_rounds = (C.NUM_ROUNDS + 1) - player.round_number prev_revenue = None prev_loss = None prev_earn2 = None return dict( prev_round = prev_round, prev_order = prev_order, PREV_DEMAND = PREV_DEMAND, prev_cost = prev_cost, prev_earn = prev_earn, earn = earn, mean_earn = mean_earn, next_rounds = next_rounds, prev_revenue = prev_revenue, prev_loss = prev_loss, prev_earn2 = prev_earn2 ) @staticmethod def js_vars(player: Player): participant = player.participant if player.round_number > 1: prev_player = player.in_round(player.round_number - 1) prev_order = prev_player.order_quantity PREV_DEMAND = C.DEMAND[player.round_number - 2] prev_cost = C.UNIT_PURCHASE_COST * prev_order prev_round = player.round_number - 1 prev_earn = C.SELLING_PRICE * min(prev_order, PREV_DEMAND) - prev_cost earn = C.SELLING_PRICE - C.UNIT_PURCHASE_COST mean_earn = (C.MAX_DEMAND - C.MIN_DEMAND) * earn next_rounds = (C.NUM_ROUNDS + 1) - player.round_number prev_revenue = C.SELLING_PRICE * min(prev_order, PREV_DEMAND) if PREV_DEMAND > prev_order: prev_loss = earn * (PREV_DEMAND - prev_order) prev_rush = earn * (PREV_DEMAND - prev_order) prev_earn2 = C.SELLING_PRICE * min(prev_order, PREV_DEMAND) - prev_cost - prev_loss else: prev_loss = C.UNIT_PURCHASE_COST * (prev_order - PREV_DEMAND) prev_rush = 0 prev_earn2 = C.SELLING_PRICE * min(prev_order, PREV_DEMAND) - prev_cost else: prev_round = None prev_order = None PREV_DEMAND = None prev_cost = None prev_earn = None earn = C.SELLING_PRICE - C.UNIT_PURCHASE_COST mean_earn = (C.MAX_DEMAND - C.MIN_DEMAND) * earn next_rounds = (C.NUM_ROUNDS + 1) - player.round_number prev_revenue = None prev_loss = None prev_earn2 = None prev_rush = None return dict( round_number = player.round_number, prev_round = prev_round, prev_order = prev_order, PREV_DEMAND = PREV_DEMAND, prev_cost = prev_cost, prev_earn = prev_earn, earn = earn, mean_earn = mean_earn, next_rounds = next_rounds, prev_revenue = prev_revenue, prev_loss = prev_loss, prev_earn2 = prev_earn2, unit_profit = C.SELLING_PRICE - C.UNIT_PURCHASE_COST, unit_purchase_cost = C.UNIT_PURCHASE_COST, unit_selling = C.SELLING_PRICE, positive = participant.positive, prev_rush = prev_rush ) @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant player.payoff = (C.SELLING_PRICE * min(player.order_quantity, C.DEMAND[player.round_number - 1])) - (C.UNIT_PURCHASE_COST * player.order_quantity) if player.in_round(20): if participant.positive == 1: participant.final_order = player.order_quantity else: participant.final_order = player.order_quantity participant.final_loss = player.field_maybe_none("prev_loss") page_sequence = [YourOrder]