from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'IQ_Test_4' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 ADMIN_REPORT_TEMPLATE = 'IQ_Test_4/admin_report.html' class Subsession(BaseSubsession): num_players = models.IntegerField(initial=0) average = models.FloatField() total_answers = models.FloatField() ungeradeSpieler = models.IntegerField(initial=0) realPlayers = models.IntegerField(initial=0) a = models.IntegerField(initial=0) b = models.IntegerField() def total_average_old(subsession: Subsession): session = subsession.session players = subsession.get_players() subsession.num_players = len(players) answers = [player.correct_answers for player in players] subsession.total_answers = sum(answers) subsession.average = sum(answers) / len(players) for p in subsession.get_players(): import random a = random.uniform(0, 1) p.correct_answers += a p.participant.vars["points"] = p.correct_answers p.participant.vars["average"] = p.subsession.average players = sorted(subsession.get_players(), key=lambda p: p.correct_answers, reverse=True) for (i, p) in enumerate(players, start=1): p.rank = i def transfer(subsession: Subsession): session = subsession.session players = subsession.get_players() for p in players: p.participant.vars["points"] = p.correct_answers p.participant.vars["rank"] = p.rank session.vars["average"] = p.subsession.average p.participant.vars["ungerade"] = p.ungerade session.vars["real_number_players"] = subsession.realPlayers def test_odd_number(subsession: Subsession): session = subsession.session if (subsession.realPlayers % 2) == 1: subsession.ungeradeSpieler = 1 activePlayerIDs = [] players = subsession.get_players() for p in players: if p.participant.vars["Dropout"] == False: activePlayerIDs.append(p.id_in_group) import random n = len(activePlayerIDs) subsession.a = random.randint(0, n - 1) subsession.b = activePlayerIDs[subsession.a] for p in players: if p.id_in_group == subsession.b: p.ungerade = 1 subsession.realPlayers -= 1 def total_average(subsession: Subsession): session = subsession.session players = subsession.get_players() for p in players: if p.participant.vars["Dropout"] == True or p.ungerade == 1: p.correct_answers = 0 answers = [player.correct_answers for player in players] subsession.total_answers = sum(answers) subsession.average = sum(answers) / subsession.realPlayers for p in players: import random if p.participant.vars["Dropout"] == False and p.ungerade == 0: a = random.uniform(0, 1) p.correct_answers += a p.participant.vars["points"] = p.correct_answers p.participant.vars["average"] = p.subsession.average players = sorted(subsession.get_players(), key=lambda p: p.correct_answers, reverse=True) for p in players: for (i, p) in enumerate(players, start=1): if p.participant.vars["Dropout"] == False and p.ungerade == 0: p.rank = i def calculatePlayers(subsession: Subsession): session = subsession.session players = subsession.get_players() subsession.num_players = len(players) for player in players: if player.participant.vars["Dropout"] == False: player.subsession.realPlayers += 1 Subsession.total_average_old = total_average_old Subsession.transfer = transfer Subsession.test_odd_number = test_odd_number Subsession.total_average = total_average Subsession.calculatePlayers = calculatePlayers class Group(BaseGroup): pass class Player(BasePlayer): Test1 = models.StringField(choices=[['A', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz1 = models.StringField(choices=[['A', 'A'], ['True', 'B'], ['C', 'C'], ['D', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz2 = models.StringField(choices=[['A', 'A'], ['True', 'B'], ['C', 'C'], ['D', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz3 = models.StringField(choices=[['A', 'A'], ['B', 'B'], ['True', 'C'], ['D', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz4 = models.StringField(choices=[['A', 'A'], ['B', 'B'], ['C', 'C'], ['True', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz5 = models.StringField(choices=[['True', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz6 = models.StringField(choices=[['A', 'A'], ['B', 'B'], ['C', 'C'], ['True', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz7 = models.StringField(choices=[['A', 'A'], ['True', 'B'], ['C', 'C'], ['D', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz8 = models.StringField(choices=[['A', 'A'], ['B', 'B'], ['C', 'C'], ['True', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz9 = models.StringField(choices=[['True', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz10 = models.StringField(choices=[['A', 'A'], ['True', 'B'], ['C', 'C'], ['D', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz11 = models.StringField(choices=[['A', 'A'], ['B', 'B'], ['C', 'C'], ['True', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz12 = models.StringField(choices=[['True', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz13 = models.StringField(choices=[['True', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz14 = models.StringField(choices=[['A', 'A'], ['B', 'B'], ['True', 'C'], ['D', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) Quiz15 = models.StringField(choices=[['A', 'A'], ['B', 'B'], ['C', 'C'], ['True', 'D']], label='Which piece is the right complement?', widget=widgets.RadioSelect) correct_answers = models.FloatField(initial=0) rank = models.IntegerField() versuche = models.IntegerField() stillActive = models.BooleanField(blank=True, choices=[[True, 'Yes'], [False, 'No']], label='Please click "Yes" and " Continue" within 60 seconds if you still actively participate in the experiment.', widget=widgets.RadioSelect) ungerade = models.IntegerField(initial=0) def random_number(player: Player): import random return random.randrange(10, 50, 10) Player.random_number = random_number class MyWaitPage2(WaitPage): pass class Quiz_Explanation(Page): form_model = 'player' @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant player.versuche = participant.vars["versuche"] class Test(Page): form_model = 'player' form_fields = ['Test1'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): player.Test1 = "A" class Test_Result(Page): form_model = 'player' class MyWaitPage4(WaitPage): pass class Weiter(Page): form_model = 'player' class Quiz1(Page): form_model = 'player' form_fields = ['Quiz1'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz1 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz2(Page): form_model = 'player' form_fields = ['Quiz2'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz2 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz3(Page): form_model = 'player' form_fields = ['Quiz3'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz3 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz4(Page): form_model = 'player' form_fields = ['Quiz4'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz4 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz5(Page): form_model = 'player' form_fields = ['Quiz5'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz5 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz6(Page): form_model = 'player' form_fields = ['Quiz6'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz6 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz7(Page): form_model = 'player' form_fields = ['Quiz7'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz7 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz8(Page): form_model = 'player' form_fields = ['Quiz8'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz8 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz9(Page): form_model = 'player' form_fields = ['Quiz9'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz9 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz10(Page): form_model = 'player' form_fields = ['Quiz10'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz10 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz11(Page): form_model = 'player' form_fields = ['Quiz11'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz11 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz12(Page): form_model = 'player' form_fields = ['Quiz12'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz12 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz13(Page): form_model = 'player' form_fields = ['Quiz13'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz13 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz14(Page): form_model = 'player' form_fields = ['Quiz14'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz14 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class Quiz15(Page): form_model = 'player' form_fields = ['Quiz15'] timeout_seconds = 30 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.Quiz15 == 'True': participant.payoff += player.random_number() player.correct_answers += 1 class MyWaitPage(WaitPage): wait_for_all_groups = True class ConfirmActive(Page): form_model = 'player' form_fields = ['stillActive'] timeout_seconds = 60 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.stillActive != True: participant.vars["Dropout"] = True class CalculatePlayers(WaitPage): wait_for_all_groups = True after_all_players_arrive = calculatePlayers class Test_odd_player(WaitPage): wait_for_all_groups = True after_all_players_arrive = test_odd_number class GetRank(WaitPage): wait_for_all_groups = True after_all_players_arrive = total_average class Transfer(WaitPage): wait_for_all_groups = True after_all_players_arrive = transfer class UngeraderPlayer(Page): form_model = 'player' timeout_seconds = 20 @staticmethod def is_displayed(player: Player): if player.ungerade == 1: return True @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant participant.vars["allesAusgefüllt"] = True @staticmethod def app_after_this_page(player: Player, upcoming_apps): return "getID" class DropoutIQ(Page): form_model = 'player' timeout_seconds = 1 @staticmethod def is_displayed(player: Player): participant = player.participant if participant.vars["Dropout"]: return True @staticmethod def app_after_this_page(player: Player, upcoming_apps): participant = player.participant if participant.vars["Dropout"]: return "Dropout" page_sequence = [MyWaitPage2, Quiz_Explanation, Test, Test_Result, MyWaitPage4, Weiter, Quiz1, Quiz2, Quiz3, Quiz4, Quiz5, Quiz6, Quiz7, Quiz8, Quiz9, Quiz10, Quiz11, Quiz12, Quiz13, Quiz14, Quiz15, MyWaitPage, ConfirmActive, CalculatePlayers, Test_odd_player, GetRank, Transfer, UngeraderPlayer, DropoutIQ]