from otree.api import * doc = """ Live volunteer's dilemma (first player to click moves everyone forward). """ class C(BaseConstants): NAME_IN_URL = 'personuppgifter' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 REWARD = cu(100) VOLUNTEER_COST = cu(40) NUM_ROUNDS = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): has_volunteer = models.BooleanField(initial=False) class Player(BasePlayer): is_volunteer = models.BooleanField() volunteer_id = models.IntegerField() age = models.IntegerField(label='Hur gammal är du?', min=18, max=65) gender = models.StringField( choices=[['Man', 'Man'], ['Kvinna', 'Kvinna']], label='Är du man eller kvinna?', widget=widgets.RadioSelect, ) tel= models.IntegerField(label="Telefonnummer", blank=True) # PAGES class playersinfo(Page): form_model='player' form_fields=['gender','age', 'tel'] class MyPage(Page): @staticmethod def is_displayed(player: Player): group = player.group return not group.has_volunteer @staticmethod def live_method(player: Player, data): group = player.group # print('data is', data) if group.has_volunteer: return if data.get('volunteer'): group.has_volunteer = True # mark all other players as non-volunteers for p in player.get_others_in_group(): p.payoff = C.REWARD p.is_volunteer = False # mark myself as a volunteer player.is_volunteer = True player.payoff = C.REWARD - C.VOLUNTEER_COST # broadcast to the group that the game is finished. return {0: dict(finished=True)} # @staticmethod # def error_message(player: Player, values): # """Prevent users from proceeding before someone has volunteered.""" # group = player.group # if not group.has_volunteer: # return "Can't move forward" class waitpage(WaitPage): pass class Results(Page): pass class Introduction(Page): pass class Decision(Page): pass class ShuffleWaitPage(WaitPage): wait_for_all_groups = True @staticmethod def after_all_players_arrive(subsession): subsession.group_randomly() page_sequence = [playersinfo]