from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'stage1' PLAYERS_PER_GROUP = 12 NUM_ROUNDS = 1 # avatar = 1 -> blue jersey and red hat, 2 -> blue jersey and yellow hat, 3 -> green jersey and red hat, 4 -> green # jersey and yellow hat # 1 means Red hat and blue Jersey, 0 means yellow hat and green Jersey comp = [1, 0] cycle1 = [1,2,3,13,14,15] cycle2 = [4,5,6,16,17,18] cycle3 = [7,8,9,19,20,21] cycle4 = [10,11,12,22,23,24] class Subsession(BaseSubsession): pass class Group(BaseGroup): Blue_or_red = models.IntegerField() def rN(group:BaseGroup): group.Blue_or_red = group.subsession.session.vars.get('R_N') def tshirt(group:BaseGroup): for n in group.get_players(): n.Sum = int(n.q1) + int(n.q2) + int(n.q3) def order(group:BaseGroup): from itertools import cycle from statistics import median help_list = list() ps = group.get_players() for n in group.get_players(): help_list.append(n.Sum) med = median(help_list) comp = cycle(C.comp) for p in ps: if p.Sum < med: p.Jersey = 0 if p.Sum > med: p.Jersey = 1 if p.Sum == med: p.Jersey = next(comp) help_list1 = list() help_list2 = list() for p in ps: if p.Jersey == 0: help_list1.append(p.Sum) if p.Jersey == 1: help_list2.append(p.Sum) while len(help_list1) > len(help_list2): max1 = max(help_list1) for p in ps: if p.Sum == max1: if p.Jersey == 0: p.Jersey = 1 break help_list1 = [] help_list2 = [] for p in ps: if p.Jersey == 0: help_list1.append(p.Sum) if p.Jersey == 1: help_list2.append(p.Sum) while len(help_list1) < len(help_list2): min1 = min(help_list2) for p in ps: if p.Jersey == 1: if p.Sum == min1: if p.Jersey == 1: p.Jersey = 0 break help_list1 = [] help_list2 = [] for p in ps: if p.Jersey == 0: help_list1.append(p.Sum) if p.Jersey == 1: help_list2.append(p.Sum) def hat(group:BaseGroup): for n in group.get_players(): n.Sum_hat = int(n.q4) + int(n.q5) + int(n.q6) #Vyrovnávací mechanismus.. funguje pouze pro sudý počet účastníků! def order_hat(group:BaseGroup): from itertools import cycle from statistics import median help_list = list() ps = group.get_players() for n in group.get_players(): help_list.append(n.Sum_hat) med = median(help_list) comp = cycle(C.comp) for p in ps: if p.Sum_hat < med: p.Hat = 0 if p.Sum_hat > med: p.Hat = 1 if p.Sum_hat == med: p.Hat = next(comp) help_list1 = list() help_list2 = list() help_list3 = list() help_list4 = list() for p in ps: if p.Jersey == 1: if p.Hat == 0: help_list1.append(p.Sum_hat) if p.Hat == 1: help_list2.append(p.Sum_hat) while len(help_list1) > len(help_list2): max1 = max(help_list1) for p in ps: if p.Jersey == 1: if p.Sum_hat == max1: if p.Hat == 0: p.Hat = 1 break help_list1 = [] help_list2 = [] for p in ps: if p.Jersey == 1: if p.Hat == 0: help_list1.append(p.Sum_hat) if p.Hat == 1: help_list2.append(p.Sum_hat) for p in ps: if p.Jersey == 0: if p.Hat == 0: help_list3.append(p.Sum_hat) if p.Hat == 1: help_list4.append(p.Sum_hat) while len(help_list1) < len(help_list2): min1 = min(help_list2) for p in ps: if p.Jersey == 1: if p.Hat == 1: if p.Sum_hat == min1: if p.Hat == 1: p.Hat = 0 break help_list1 = [] help_list2 = [] for p in ps: if p.Jersey == 1: if p.Hat == 0: help_list1.append(p.Sum_hat) if p.Hat == 1: help_list2.append(p.Sum_hat) while len(help_list3) > len(help_list4): max1 = max(help_list3) for p in ps: if p.Jersey == 0: if p.Sum_hat == max1: if p.Hat == 0: p.Hat = 1 break help_list3 = [] help_list4 = [] for p in ps: if p.Jersey == 0: if p.Hat == 0: help_list3.append(p.Sum_hat) if p.Hat == 1: help_list4.append(p.Sum_hat) while len(help_list3) < len(help_list4): min1 = min(help_list4) for p in ps: if p.Jersey == 0: if p.Hat == 1: if p.Sum_hat == min1: if p.Hat == 1: p.Hat = 0 break help_list3 = [] help_list4 = [] for p in ps: if p.Jersey == 0: if p.Hat == 0: help_list3.append(p.Sum_hat) if p.Hat == 1: help_list4.append(p.Sum_hat) for n in ps: if n.Jersey == 1: if n.Hat == 1: n.Avatar = 1 if n.Hat == 0: n.Avatar = 2 if n.Jersey == 0: if n.Hat == 1: n.Avatar = 3 if n.Hat == 0: n.Avatar = 4 for p in ps: p.participant.vars['avatar'] = p.Avatar x = cycle(C.cycle1) y = cycle(C.cycle3) z = cycle(C.cycle2) k = cycle(C.cycle4) for s in ps: if s.Avatar == 1: s.Experiment_number = next(x) if s.Avatar == 2: s.Experiment_number = next(y) if s.Avatar == 3: s.Experiment_number = next(z) if s.Avatar == 4: s.Experiment_number = next(k) for p in ps: p.participant.vars['experiment_number'] = p.Experiment_number for n in ps: if n.Experiment_number == 1: x1 = n.id_in_group if n.Experiment_number == 2: x2 = n.id_in_group if n.Experiment_number == 3: x3 = n.id_in_group if n.Experiment_number == 4: x4 = n.id_in_group if n.Experiment_number == 5: x5 = n.id_in_group if n.Experiment_number == 6: x6 = n.id_in_group if n.Experiment_number == 7: x7 = n.id_in_group if n.Experiment_number == 8: x8 = n.id_in_group if n.Experiment_number == 9: x9 = n.id_in_group if n.Experiment_number == 10: x10 = n.id_in_group if n.Experiment_number == 11: x11 = n.id_in_group if n.Experiment_number == 12: x12 = n.id_in_group if n.Experiment_number == 13: x13 = n.id_in_group if n.Experiment_number == 14: x14 = n.id_in_group if n.Experiment_number == 15: x15 = n.id_in_group if n.Experiment_number == 16: x16 = n.id_in_group if n.Experiment_number == 17: x17 = n.id_in_group if n.Experiment_number == 18: x18 = n.id_in_group if n.Experiment_number == 19: x19 = n.id_in_group if n.Experiment_number == 20: x20 = n.id_in_group if n.Experiment_number == 21: x21 = n.id_in_group if n.Experiment_number == 22: x22 = n.id_in_group if n.Experiment_number == 23: x23 = n.id_in_group if n.Experiment_number == 24: x24 = n.id_in_group if len(group.get_players()) == 12: new_groups = [[x1, x4, x9],[x10, x6, x7], [x5, x3, x11], [x8, x12, x2]] if len(group.get_players()) == 24: new_groups = [[x1, x4, x9], [x10, x6, x7], [x5, x3, x11], [x8, x12, x2], [x13, x16, x21], [x22, x19, x18], [x17, x15, x23], [x20, x24, x14]] if len(group.get_players()) == 12: new_groups2 = [[x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12]] if len(group.get_players()) == 24: new_groups2 = [[x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24]] for v in ps: v.session.vars['new_groups'] = new_groups for p in ps: p.session.vars['new_groups2'] = new_groups2 p.participant.vars['hat'] = p.Hat p.participant.vars['jersey'] = p.Jersey def orderB(group: BaseGroup): from itertools import cycle from statistics import median help_list = list() ps = group.get_players() for n in group.get_players(): help_list.append(n.Sum_hat) med = median(help_list) comp = cycle(C.comp) for p in ps: if p.Sum_hat < med: p.Hat = 0 if p.Sum_hat > med: p.Hat = 1 if p.Sum_hat == med: p.Hat = next(comp) help_list1 = list() help_list2 = list() for p in ps: if p.Hat == 0: help_list1.append(p.Sum_hat) if p.Hat == 1: help_list2.append(p.Sum_hat) while len(help_list1) > len(help_list2): max1 = max(help_list1) for p in ps: if p.Sum_hat == max1: if p.Hat == 0: p.Hat = 1 break help_list1 = [] help_list2 = [] for p in ps: if p.Hat == 0: help_list1.append(p.Sum_hat) if p.Hat == 1: help_list2.append(p.Sum_hat) while len(help_list1) < len(help_list2): min1 = min(help_list2) for p in ps: if p.Hat == 1: if p.Sum_hat == min1: if p.Hat == 1: p.Hat = 0 break help_list1 = [] help_list2 = [] for p in ps: if p.Hat == 0: help_list1.append(p.Sum_hat) if p.Hat == 1: help_list2.append(p.Sum_hat) def order_JerseyB(group:BaseGroup): from itertools import cycle from statistics import median help_list = list() ps = group.get_players() for n in group.get_players(): help_list.append(n.Sum) med = median(help_list) comp = cycle(C.comp) for p in ps: if p.Sum < med: p.Jersey = 0 if p.Sum > med: p.Jersey = 1 if p.Sum == med: p.Jersey = next(comp) help_list1 = list() help_list2 = list() help_list3 = list() help_list4 = list() for p in ps: if p.Hat == 1: if p.Jersey == 0: help_list1.append(p.Sum) if p.Jersey == 1: help_list2.append(p.Sum) while len(help_list1) > len(help_list2): max1 = max(help_list1) for p in ps: if p.Hat == 1: if p.Sum == max1: if p.Jersey == 0: p.Jersey = 1 break help_list1 = [] help_list2 = [] for p in ps: if p.Hat == 1: if p.Jersey == 0: help_list1.append(p.Sum) if p.Jersey == 1: help_list2.append(p.Sum) for p in ps: if p.Hat == 0: if p.Jersey == 0: help_list3.append(p.Sum) if p.Jersey == 1: help_list4.append(p.Sum) while len(help_list1) < len(help_list2): min1 = min(help_list2) for p in ps: if p.Hat == 1: if p.Jersey == 1: if p.Sum == min1: if p.Jersey == 1: p.Jersey = 0 break help_list1 = [] help_list2 = [] for p in ps: if p.Hat == 1: if p.Jersey == 0: help_list1.append(p.Sum) if p.Jersey == 1: help_list2.append(p.Sum) while len(help_list3) > len(help_list4): max1 = max(help_list3) for p in ps: if p.Hat == 0: if p.Sum == max1: if p.Jersey == 0: p.Jersey = 1 break help_list3 = [] help_list4 = [] for p in ps: if p.Hat == 0: if p.Jersey == 0: help_list3.append(p.Sum) if p.Jersey == 1: help_list4.append(p.Sum) while len(help_list3) < len(help_list4): min1 = min(help_list4) for p in ps: if p.Hat == 0: if p.Jersey == 1: if p.Sum == min1: if p.Jersey == 1: p.Jersey = 0 break help_list3 = [] help_list4 = [] for p in ps: if p.Hat == 0: if p.Jersey == 0: help_list3.append(p.Sum) if p.Jersey == 1: help_list4.append(p.Sum) for n in ps: if n.Jersey == 1: if n.Hat == 1: n.Avatar = 1 if n.Hat == 0: n.Avatar = 2 if n.Jersey == 0: if n.Hat == 1: n.Avatar = 3 if n.Hat == 0: n.Avatar = 4 for p in ps: p.participant.vars['avatar'] = p.Avatar x = cycle(C.cycle1) y = cycle(C.cycle3) z = cycle(C.cycle2) k = cycle(C.cycle4) for s in ps: if s.Avatar == 1: s.Experiment_number = next(x) if s.Avatar == 2: s.Experiment_number = next(y) if s.Avatar == 3: s.Experiment_number = next(z) if s.Avatar == 4: s.Experiment_number = next(k) for p in ps: p.participant.vars['experiment_number'] = p.Experiment_number for n in ps: if n.Experiment_number == 1: x1 = n.id_in_group if n.Experiment_number == 2: x2 = n.id_in_group if n.Experiment_number == 3: x3 = n.id_in_group if n.Experiment_number == 4: x4 = n.id_in_group if n.Experiment_number == 5: x5 = n.id_in_group if n.Experiment_number == 6: x6 = n.id_in_group if n.Experiment_number == 7: x7 = n.id_in_group if n.Experiment_number == 8: x8 = n.id_in_group if n.Experiment_number == 9: x9 = n.id_in_group if n.Experiment_number == 10: x10 = n.id_in_group if n.Experiment_number == 11: x11 = n.id_in_group if n.Experiment_number == 12: x12 = n.id_in_group if n.Experiment_number == 13: x13 = n.id_in_group if n.Experiment_number == 14: x14 = n.id_in_group if n.Experiment_number == 15: x15 = n.id_in_group if n.Experiment_number == 16: x16 = n.id_in_group if n.Experiment_number == 17: x17 = n.id_in_group if n.Experiment_number == 18: x18 = n.id_in_group if n.Experiment_number == 19: x19 = n.id_in_group if n.Experiment_number == 20: x20 = n.id_in_group if n.Experiment_number == 21: x21 = n.id_in_group if n.Experiment_number == 22: x22 = n.id_in_group if n.Experiment_number == 23: x23 = n.id_in_group if n.Experiment_number == 24: x24 = n.id_in_group if len(group.get_players()) == 12: new_groups = [[x1, x4, x9],[x10, x6, x7], [x5, x3, x11], [x8, x12, x2]] if len(group.get_players()) == 24: new_groups = [[x1, x4, x9], [x10, x6, x7], [x5, x3, x11], [x8, x12, x2], [x13, x16, x21], [x22, x19, x18], [x17, x15, x23], [x20, x24, x14]] if len(group.get_players()) == 12: new_groups2 = [[x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12]] if len(group.get_players()) == 24: new_groups2 = [[x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24]] for v in ps: v.session.vars['new_groups'] = new_groups for p in ps: p.session.vars['new_groups2'] = new_groups2 p.participant.vars['hat'] = p.Hat p.participant.vars['jersey'] = p.Jersey class Player(BasePlayer): Jersey = models.IntegerField() Hat = models.IntegerField() Sum = models.IntegerField() Sum_hat = models.IntegerField() # avatar = 1 -> blue jersey and red hat, 2 -> blue jersey and yellow hat, 3 -> green jersey and red hat, 4 -> green # jersey and yellow hat Avatar = models.IntegerField() Experiment_number = models.IntegerField() q1 = models.IntegerField( label="If you had to choose, would you say you are a cat or a dog person?", choices=[(0, "dog"), (1, "cat")], ) q2 = models.IntegerField( label="What is your preferred way of traveling? ", choices=[(1, "planned"), (0, "spontaneously")], ) q3 = models.IntegerField( label="If you could choose, what would be your preferred mode of transport for commuting to work/ school? ", choices=[(0, "bike"), (1, "car")], ) q4 = models.IntegerField( label="Do you often use dating apps to meet new people/ or a potential partner?", choices=[(1, "yes"), (0, "no"), ], ) q5 = models.IntegerField( label="Do you feel uncomfortable being the center of attention?", choices=[(0, "yes"), (1, "no")], ) q6 = models.IntegerField( label="Which of these options do you place more importance on when having a discussion? ", choices=[(0, "making people feel comfortable"), (1, "being fully honest")], ) Perceived_Closeness1 = models.IntegerField(label="", widget=widgets.RadioSelectHorizontal, choices=[1, 2, 3, 4, 5, 6, 7] ) Perceived_Closeness2 = models.IntegerField(label="", widget=widgets.RadioSelectHorizontal, choices=[1, 2, 3, 4, 5, 6, 7] ) # PAGES class Ins1(Page): pass class ResultsWaitPage(WaitPage): def after_all_players_arrive(group: Group): if group.Blue_or_red == 1: group.tshirt() if group.Blue_or_red == 2: group.hat() class ResultsWaitPage2(WaitPage): def after_all_players_arrive(group: Group): if group.Blue_or_red == 1: group.order() if group.Blue_or_red == 2: group.orderB() class Questions(Page): form_model = 'player' form_fields = ['q1', 'q2', 'q3'] def is_displayed(player: Player): return player.group.Blue_or_red == 1 class QuestionsB(Page): form_model = 'player' form_fields = ['q4', 'q5', 'q6'] def is_displayed(player: Player): return player.group.Blue_or_red == 2 class RedYellowB(Page): def is_displayed(player: Player): return player.group.Blue_or_red == 2 def vars_for_template(player: Player): return dict( hat=player.Hat, ) class BlueGreen(Page): def vars_for_template(player: Player): return dict( jersey=player.Jersey, ) def is_displayed(player: Player): return player.group.Blue_or_red == 1 class PC1(Page): form_model = 'player' form_fields = ['Perceived_Closeness1'] def vars_for_template(player: Player): return dict( Blue_or_red=player.group.Blue_or_red, ) class Questions2(Page): form_model = 'player' form_fields = ['q4', 'q5', 'q6'] def is_displayed(player: Player): return player.group.Blue_or_red == 1 class QuestionsB2(Page): form_model = 'player' form_fields = ['q1', 'q2', 'q3'] def is_displayed(player: Player): return player.group.Blue_or_red == 2 class HatWaitPage1(WaitPage): def after_all_players_arrive(group: Group): if group.Blue_or_red == 1: group.hat() if group.Blue_or_red == 2: group.tshirt() class HatWaitPage2(WaitPage): def after_all_players_arrive(group: Group): if group.Blue_or_red == 1: group.order_hat() if group.Blue_or_red == 2: group.order_JerseyB() class BlueGreenB(Page): def vars_for_template(player: Player): return dict( jersey=player.Jersey, ) def is_displayed(player: Player): return player.group.Blue_or_red == 2 class RedYellow(Page): def vars_for_template(player: Player): return dict( hat=player.Hat, ) def is_displayed(player: Player): return player.group.Blue_or_red == 1 class PC2(Page): form_model = 'player' form_fields = ['Perceived_Closeness2'] def vars_for_template(player: Player): return dict( Blue_or_red=player.group.Blue_or_red, ) class Info(Page): pass class AvatarPage(Page): def vars_for_template(player: Player): return dict( avatar=player.Avatar ) class HWP(WaitPage): def after_all_players_arrive(group: Group): group.rN() page_sequence = [HWP, Ins1, Questions, QuestionsB, ResultsWaitPage, ResultsWaitPage2, RedYellowB, BlueGreen, PC1, Questions2, QuestionsB2, HatWaitPage1, HatWaitPage2, BlueGreenB, RedYellow, PC2, Info, AvatarPage]