from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random import utils author = 'Tommaso Batistoni - t.batistoni@ucl.ac.uk' doc = """ Sliders Task as described in e.g. [CHOOSE REFERENCE] """ class Constants(BaseConstants): name_in_url = 'taskcmpt' players_per_group = 2 num_rounds = 1 num_sliders = 48 sliders_max = 100 sliders_min = 0 slider_columns = 3 max_seconds_waiting_for_partners = 1000 * 20 * 1 bonus_winner = c(0.50) bonus_loser = c(0.00) bonus_fix = c(0.20) time_for_task = 2 option_a = 'Option A : 0.20 credit for each correctly positioned slider ' option_b = 'Option B : 0.50 credit for each correctly positioned slider if my number is greater than the number of the other participant. If my number is lower, I get nothing.' class Subsession(BaseSubsession): # Match players and identify the relevant partner identity treatment def set_partner_based_on_identity(self, still_waiting_for_task, task, num_players): return utils.set_partner_based_on_identity(still_waiting_for_task, task, num_players) def _chunks(self, l, n): for i in range(0, len(l), n): yield l[i:i + n] def creating_session(self): offsets = [random.randint(0, 10) for _ in range(Constants.num_sliders//Constants.slider_columns)] starting_values = [ random.randint(Constants.sliders_min, Constants.sliders_max) for _ in range(Constants.num_sliders)] self.session.vars['sliders_for_task'] = list(zip(self._chunks(starting_values, Constants.slider_columns), offsets)) class Group(BaseGroup): pass class Player(BasePlayer): compete_partner = models.StringField() compete_partner_name = models.StringField() compete_decision = models.BooleanField( label='Which option do you prefer?', choices=[ (0, Constants.option_a), (1, Constants.option_b)], widget=widgets.RadioSelect() ) timeout = models.BooleanField() centered_sliders = models.PositiveIntegerField() def set_payoff(self): if self.compete_decision == 0: self.payoff = self.centered_sliders * Constants.bonus_fix else: if self.participant.vars.get('unmatched'): self.participant.vars['other_sliders'] = random.randint(0, 48) other_centered_sliders = self.participant.vars['other_sliders'] else: other = self.get_others_in_group()[0] other_centered_sliders = other.centered_sliders if self.centered_sliders > other_centered_sliders: self.payoff = self.centered_sliders * Constants.bonus_winner else: self.payoff = self.centered_sliders * Constants.bonus_loser