from otree.api import * import random import math doc = """ Your app description """ def make_field7(label): return models.IntegerField( choices=[[1, ''], [2, ''], [3, ''], [4, ''], [5, ''], [6, ''], [7, '']], label=label, widget=widgets.RadioSelectHorizontal, blank=False, #initial=1, #zum testen ) class C(BaseConstants): NAME_IN_URL = 'PGG' PLAYERS_PER_GROUP = None NUM_ROUNDS = 10 INITIAL_CENTS = 25 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass def beitrag_bot(player): round = player.round_number if round == 1: return 12 elif round in [6]: return 1 elif round in [7, 8, 9, 10]: return 0 else: return player.in_round(round - 1).beitrag def payoff_topf(player, beitrag_bot): beitrag_player = player.beitrag beitrag_bot = beitrag_bot beitrag_total = beitrag_player + beitrag_bot payoff = (beitrag_total * 1.5) / 2 return payoff class Player(BasePlayer): beitrag = models.IntegerField( min=0, max=C.INITIAL_CENTS, ) bestrafung = models.BooleanField( blank=True, initial=False, ) bestrafung_bot = models.BooleanField( blank=True, initial=False, ) vertrauen0 = make_field7('Vertrauen') freude0 = make_field7('Freude') stolz0 = make_field7('Stolz') aerger0 = make_field7('Ärger') scham0 = make_field7('Scham') enttaeuschung0 = make_field7('Enttäuschung') angst0 = make_field7('Angst/Furcht') verachtung0 = make_field7('Verachtung') vertrauen = make_field7('Vertrauen') freude = make_field7('Freude') stolz = make_field7('Stolz') aerger = make_field7('Ärger') scham = make_field7('Scham') enttaeuschung = make_field7('Enttäuschung') angst = make_field7('Angst/Furcht') verachtung = make_field7('Verachtung') name = models.StringField( label='Vor- und Nachname', blank=True, ) iban = models.StringField( label='IBAN', blank=True, ) def vars_for_template(player: Player): return dict( round=player.round_number, mobile=player.participant.mobile, ) # PAGES class Instructions(Page): form_model = 'player' form_fields = [] @staticmethod def live_method(player, data): player.participant.mobile = data @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Emotions(Page): form_model = 'player' form_fields = [] @staticmethod def get_form_fields(player: Player): return [ 'vertrauen0', 'freude0', 'stolz0', 'aerger0', 'scham0', 'enttaeuschung0', 'angst0', 'verachtung0' ] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Waiting(Page): timeout_seconds = 9 @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Game(Page): form_model = 'player' @staticmethod def get_form_fields(player: Player): return [ 'beitrag', ] @staticmethod def vars_for_template(player: Player): context = vars_for_template(player) context.update( ) return context class Waiting2(Page): timeout_seconds = random.randint(0, 8) class Result(Page): form_model = 'player' @staticmethod def get_form_fields(player: Player): return [ 'vertrauen', 'freude', 'stolz', 'aerger', 'scham', 'enttaeuschung', 'angst', 'verachtung' ] @staticmethod def vars_for_template(player: Player): total_beitrag = player.beitrag + beitrag_bot(player) payoff1 = C.INITIAL_CENTS - player.beitrag payoff2 = math.ceil(payoff_topf(player, beitrag_bot(player))) payoff_player = payoff1 + payoff2 context = vars_for_template(player) context.update( beitrag=player.beitrag, beitrag_bot=beitrag_bot(player), total_beitrag=total_beitrag, payoff_topf=payoff2, payoff1=payoff1, payoff_player=payoff_player, ) return context @staticmethod def js_vars(player: Player): return dict( mobile=player.participant.mobile, ) class Result1(Page): form_model = 'player' @staticmethod def get_form_fields(player: Player): return [ 'bestrafung' ] @staticmethod def vars_for_template(player: Player): total_beitrag = player.beitrag + beitrag_bot(player) payoff1 = C.INITIAL_CENTS - player.beitrag payoff2 = math.ceil(payoff_topf(player, beitrag_bot(player))) payoff_player = payoff1 + payoff2 context = vars_for_template(player) context.update( beitrag=player.beitrag, beitrag_bot=beitrag_bot(player), total_beitrag=total_beitrag, payoff_topf=payoff2, payoff1=payoff1, payoff_player=payoff_player, ) return context @staticmethod def before_next_page(player: Player, timeout_happened): if player.beitrag <= 0.5 * beitrag_bot(player): player.bestrafung_bot = True else: player.bestrafung_bot = False player.payoff = \ ((C.INITIAL_CENTS - player.beitrag) + math.ceil(payoff_topf(player, beitrag_bot(player))) - player.bestrafung * 5 - player.bestrafung_bot * 5) / 100 class Result2(Page): form_model = 'player' @staticmethod def get_form_fields(player: Player): return [ ] @staticmethod def vars_for_template(player: Player): total_beitrag = player.beitrag + beitrag_bot(player) payoff1 = C.INITIAL_CENTS - player.beitrag payoff2 = math.ceil(payoff_topf(player, beitrag_bot(player))) payoff_bestrafung = player.bestrafung_bot*5 + player.bestrafung*5 payoff_player = payoff1 + payoff2 - payoff_bestrafung context = vars_for_template(player) context.update( beitrag=player.beitrag, beitrag_bot=beitrag_bot(player), total_beitrag=total_beitrag, payoff_topf=payoff2, payoff1=payoff1, payoff_bestrafung=payoff_bestrafung, payoff_player=payoff_player, bestrafung=player.bestrafung, bestrafung_bot=player.bestrafung_bot, ) return context @staticmethod def js_vars(player: Player): return dict( mobile=player.participant.mobile, ) class Summary(Page): form_model = 'player' form_fields = ['name', 'iban'] @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS @staticmethod def vars_for_template(player: Player): total_payoff = sum([p.payoff for p in player.in_all_rounds()]) context = vars_for_template(player) context.update( payoffs=[p.payoff for p in player.in_all_rounds()], total_payoff=total_payoff ) return context class Ende(Page): @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS page_sequence = [Instructions, Emotions, Waiting, Game, Waiting2, Result, Result1, Result2, Summary, Ende]