from otree.api import * from otree import settings from . import helper doc = """ Um Dinge direkt auszuprobieren ohne ein ganzes Programm durchführen zu müssen, gerne die pages einfahc in der Page reinfolge ersetzen """ class C(BaseConstants): NAME_IN_URL = 'proof_of_concept' PLAYERS_PER_GROUP = None NUM_ROUNDS = 5 GROUP_CHOICE = [1, 2, 3] GROUP_CHOICE_LETTER = [[1, 'X'], [2, 'Y'], [3, 'Z']] class Subsession(BaseSubsession): pass class Group(BaseGroup): seller_first = models.IntegerField(initial=-1) seller_second = models.IntegerField(initial=-1) seller_third = models.IntegerField(initial=-1) class Player(BasePlayer): market_interaction_choice_1 = models.IntegerField(label="Präferenz 1:", initial=1 if settings.DEBUG else 0, choices=C.GROUP_CHOICE_LETTER) market_interaction_choice_3 = models.IntegerField(label="Präferenz 3:", initial=3 if settings.DEBUG else 0, choices=C.GROUP_CHOICE_LETTER) market_interaction_choice_2 = models.IntegerField(label="Präferenz 2:", initial=2 if settings.DEBUG else 0, choices=C.GROUP_CHOICE_LETTER) rating = models.FloatField(initial=0, choices=[1, 2, 3, 4, 5]) rating_received = models.FloatField(initial=0, choices=[1, 2, 3, 4, 5]) avg_rating = models.FloatField(initial=0) match = models.IntegerField(initial=-1) matched_pref = models.IntegerField(initial=-1, doc="Präferiertes Match") match_letter = models.StringField(initial="A", doc="Präferiertes Match") matched_index = models.IntegerField(initial=-1, doc="bekommenes Matching (index), vermutlich nicht benutzt") top = models.BooleanField(initial=False) customer = models.IntegerField(initial=-1) play_together = models.BooleanField(initial=False) # PAGES class MyPage(Page): @staticmethod def is_displayed(player): return player.round_number == 1 class Waitpage(WaitPage): @staticmethod def after_all_players_arrive(group: Group): for i,p in enumerate(group.get_players()): p.customer = 1 if i%2==0: p.customer = 0 group.seller_first, group.seller_second, group.seller_third = helper.create_group_seller_order(group) class Choosing(Page): form_model = 'player' form_fields = ['market_interaction_choice_1', 'market_interaction_choice_2', 'market_interaction_choice_3'] @staticmethod def vars_for_template(player): (first, second, third), min_score, max_score, performance = helper.get_market_interaction_data(player.group, player.round_number) return dict( round_display=player.round_number, ### falls du die Spieler da anzeigen willst seller_1=first.avg_rating, seller_2=second.avg_rating, seller_3=third.avg_rating, seller_1_label="X", seller_2_label="Y", seller_3_label="Z", group_average=performance # ) @staticmethod def is_displayed(player): return player.customer @staticmethod def before_next_page(player, timeout_happened): input_customer = [player.market_interaction_choice_1, player.market_interaction_choice_2, player.market_interaction_choice_3] input_x = ( player.market_interaction_choice_1, player.market_interaction_choice_2, player.market_interaction_choice_3) if settings.DEBUG and input_x == (-1, -1, -1): input_x = (1, 2, 3) if set(input_customer) != set([1, 2, 3]): return "Ihre Präferenzangaben sind fehlerhaft. Bitte weisen Sie jedem Anbieter genau einen Präferenzrang zu." class ChoosingWait(WaitPage): wait_for_all_groups = True @staticmethod def after_all_players_arrive(subsession): helper.one_to_one_matching_after_vote( subsession ) class Result(Page): form_model = 'player' form_fields = ['play_together'] @staticmethod def is_displayed(player): return player.customer @staticmethod def vars_for_template(player): return dict( anbieter_match=player.match_letter, preference=player.matched_pref, round_display=player.round_number ) @staticmethod def before_next_page(player, timeout_happened): # if settings.DEBUG: # player.play_together = random.choice([True,False]) player.group.get_player_by_id(player.match).play_together = player.play_together class Results(Page): pass page_sequence = [Waitpage, Choosing, ChoosingWait, Result]