from otree.api import * from settings import PARTICIPANT_FIELDS doc = """ Ihre App-Beschreibung """ class C(BaseConstants): NAME_IN_URL = 'New_Mystery_Word_deutsch' NUM_ROUNDS = 6 PLAYERS_PER_GROUP = 4 MYSTERY_WORDS = ['Raum','Taube', 'Golf', 'Elektrizitaet', 'Ende', 'Sombrero'] LANGUAGE_CODE = 'de' STEM_WORDS_1 = ['raum', 'raeum'] STEM_WORDS_2 = ['taub', 'taeub'] STEM_WORDS_3 = ['golf'] STEM_WORDS_4 = ['elektr'] STEM_WORDS_5 = ['end'] STEM_WORDS_6 = ['sombrero'] STEM_WORDS = [STEM_WORDS_1, STEM_WORDS_2, STEM_WORDS_3, STEM_WORDS_4, STEM_WORDS_5, STEM_WORDS_6] class Subsession(BaseSubsession): pass class Group(BaseGroup): payoff = models.IntegerField(initial=1000) class Player(BasePlayer): def role(player): if player.round_number % 4 == 1: return {1: 'Ratender', 2: 'Hinweisgebende', 3: 'Hinweisgebende', 4: 'Hinweisgebende'}[player.id_in_group] if player.round_number % 4 == 2: return {1: 'Hinweisgebende', 2: 'Ratender', 3: 'Hinweisgebende', 4: 'Hinweisgebende'}[player.id_in_group] if player.round_number % 4 == 3: return {1: 'Hinweisgebende', 2: 'Hinweisgebende', 3: 'Ratender', 4: 'Hinweisgebende'}[player.id_in_group] if player.round_number % 4 == 0: return {1: 'Hinweisgebende', 2: 'Hinweisgebende', 3: 'Hinweisgebende', 4: 'Ratender'}[player.id_in_group] guess = models.StringField(label="Ihre Vermutung:", initial='') score = models.IntegerField() result = models.StringField() incentive = models.IntegerField() known = models.StringField(choices=[['Ja', 'Ja'], ['Nein', 'Nein']], label='1. Kennen Sie das Spiel "Just One"?', widget=widgets.RadioSelect) role_question = models.StringField(choices=[['Hinweisgebende', 'Hinweisgebende'], ['Ratender', 'Ratender']], label='3. In welcher Rolle haben sie sich wohler gefühlt?', widget=widgets.RadioSelect) understanding = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='2. "Ich habe die Verfahrensweise und die Regeln schnell verstanden."', widget=widgets.RadioSelectHorizontal) comments = models.LongStringField(label="4. Welche Strategie haben sie als Hinweisgebende verfolgt?", initial='', max_length=500, blank=True) comments_2 = models.LongStringField(label="5. Welche Strategie haben sie als Ratender verfolgt?", initial='', max_length=500, blank=True) freda_1 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='1. "In meiner Familie werden Werte und Familienrituale über Generationen weitergegeben."', widget=widgets.RadioSelectHorizontal) freda_2 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='2. "Die Zuneigung und Unterstützung meiner Eltern hängen davon ab, inwiefern ich ihre Erwartungen erfülle."', widget=widgets.RadioSelectHorizontal) freda_3 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='3. "Ich weiß besser, was gut für mein (künftiges) Kind ist, als mein (künftiges) Kind selbst."', widget=widgets.RadioSelectHorizontal) freda_4 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='4. "Ich möchte, dass mein (künftiges) Kind wie ich ist, wenn es erwachsen ist."', widget=widgets.RadioSelectHorizontal) freda_5 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='5. "Es gibt eine gute Übereinstimmung zwischen dem, was mein Job mir bietet, und dem, was ich von einem Job erwarte."', widget=widgets.RadioSelectHorizontal) freda_6 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='6. "In meinem Job lerne ich häufig dazu, indem ich mich zum Beispiel auf den neuesten Stand bringe oder neue Aufgaben praktisch durchführe (“learning by doing”)."', widget=widgets.RadioSelectHorizontal) freda_7 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='7. "Meine Eltern gaben mir immer alle Freiheiten."', widget=widgets.RadioSelectHorizontal) freda_8 = models.StringField(choices=[['stimme voll zu', 'stimme voll zu'], ['stimme eher zu', 'stimme eher zu'], ['weder noch', 'weder noch'], ['stimme eher nicht zu', 'stimme eher nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='8. "Ich versuche, meinem (künftigen) Kind so viele Freiheiten zu geben, wie ich von meinen Eltern erhalten habe."', widget=widgets.RadioSelectHorizontal) understand_1 = models.StringField(choices=[['false', 'Die Hinweispaare werden den Ratenden gezeigt'], ['true', 'Die Hinweispaare werden entfernt, bevor die Ratenden sie sehen'], ['false', 'Die Hinweispaare zählen doppelt'],['false', 'Der Gewinn der Gruppen wird verdoppelt']], label='Frage 1: Was passiert, wenn Gruppen identische Hinweispaare abgeben?', widget=widgets.RadioSelect) understand_2 = models.StringField(choices=[['false', 'Unbegrenzt viele Versuche'],['false', 'Zwei Versuche'],['false', 'Drei Versuche'],['true', 'Nur einen Versuch']], label='Frage 2: Wie viele Versuche hat der Ratende, um das geheime Wort zu erraten?', widget=widgets.RadioSelect) understand_3 = models.StringField(choices=[['false,','Zwei'],['false', 'Drei'],['true', 'Vier'],['false', 'Fünf']], label='Frage 3: Wie viele Spielerinnen und Spieler bilden zusammen eine Gruppe?', widget=widgets.RadioSelect) understand_4 = models.StringField(choices=[['true', '10 Euro fix für die Teilnahme an allen Runden'],['false', '5 Euro fix plus 5 Euro Bonus für die meisten generierten Ideen'],['false', '5 Euro fix plus 5 Euro Bonus für die meisten erratenen geheimen Wörter'],['false','5 Euro fix plus 5 Euro Bonus für die originellsten Hinweispaare, die zur richtigen Erratung des Wortes führen']], label='Frage 4: Wie viel Geld können Sie maximal in diesem Experiment verdienen?', widget=widgets.RadioSelect) understand_5 = models.StringField(choices=[['false', 'Time'], ['false', 'Zeitpunkt'],['false', 'ist Geld'],['false', 'Zeeeit'],['true', 'keiner der oben genannten Hinweise']], label='Frage 5: Welcher der folgenden Hinweise wäre ein gültiger Hinweis in einem Hinweispaar für das geheime Wort "Zeit"?', widget=widgets.RadioSelect) strategy = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='6. "Ich habe ständig nur daran gedacht, welche Hinweise andere Teilnehmende/Gruppen abgeben."', widget=widgets.RadioSelectHorizontal) strategy_2 = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='7. "Erst möglichst viele Ideen aufzuschreiben, hilft mir dabei, später bessere Hinweise zu geben."', widget=widgets.RadioSelectHorizontal) strategy_3 = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='8. "Ich habe versucht, möglichst originelle und einzigartige Hinweise zu geben, damit ich keine identischen Hinweise wie andere Teilnehmende/Gruppen abgebe."', widget=widgets.RadioSelectHorizontal) strategy_4 = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='9. "Ich habe versucht, eindeutige und naheliegende Hinweise zu geben, auch auf die Gefahr hin, dass andere Teilnehmende/Gruppen identische Hinweise abgeben."', widget=widgets.RadioSelectHorizontal) strategy_5 = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='11. "Ein Wettkampf mit anderen Gruppen würde mich motivieren, möglichst gute Hinweise zu geben und das geheime Wort zu erraten."', widget=widgets.RadioSelectHorizontal) strategy_6 = models.StringField(choices=[['stimme vollkommen zu', 'stimme vollkommen zu'], ['stimme zu', 'stimme zu'], ['neutral', 'neutral'], ['stimme nicht zu', 'stimme nicht zu'], ['stimme überhaupt nicht zu', 'stimme überhaupt nicht zu']], label='12. "Eine Bonuszahlung geknüpft an unsere Gruppenperformance würde mich motivieren, möglichst gute Hinweise zu geben und das geheime Wort zu erraten."', widget=widgets.RadioSelectHorizontal) individualism_1 = models.IntegerField(choices=[-3, -2, -1, 0, 1, 2, 3], widget=widgets.RadioSelect) individualism_2 = models.IntegerField(choices=[-3, -2, -1, 0, 1, 2, 3], widget=widgets.RadioSelect) individualism_3 = models.IntegerField(choices=[-3, -2, -1, 0, 1, 2, 3], widget=widgets.RadioSelect) individualism_4 = models.IntegerField(choices=[-3, -2, -1, 0, 1, 2, 3], widget=widgets.RadioSelect) individualism_5 = models.IntegerField(choices=[-3, -2, -1, 0, 1, 2, 3], widget=widgets.RadioSelect) future_1 = models.StringField(choices=[['mindestens einmal täglich', 'mindestens einmal täglich'], ['mindestens einmal wöchentlich', 'mindestens einmal wöchentlich'], ['mindestens einmal monatlich', 'mindestens einmal monatlich'], ['seltener als einmal im Monat', 'seltener als einmal im Monat']], label='6. Wie oft denken Sie darüber nach, wie der Klimawandel Ihre persönliche Zukunft beeinflusst?', widget=widgets.RadioSelect) future_2 = models.StringField(choices=[['mindestens einmal täglich', 'mindestens einmal täglich'], ['mindestens einmal wöchentlich', 'mindestens einmal wöchentlich'], ['mindestens einmal monatlich', 'mindestens einmal monatlich'], ['seltener als einmal im Monat', 'seltener als einmal im Monat']], label='7. Wie oft denken Sie darüber nach, wie der Klimawandel die Zukunft der Gesellschaft beeinflusst?', widget=widgets.RadioSelect) Idea1 = models.StringField(label= '', initial='', blank=True) Idea2 = models.StringField(label= '', initial='', blank=True) Idea3 = models.StringField(label= '', initial='', blank=True) Idea4 = models.StringField(label= '', initial='', blank=True) Idea5 = models.StringField(label= '', initial='', blank=True) Idea6 = models.StringField(label= '', initial='', blank=True) Idea7 = models.StringField(label= '', initial='', blank=True) Idea8 = models.StringField(label= '', initial='', blank=True) Idea9 = models.StringField(label= '', initial='', blank=True) Idea10 = models.StringField(label= '', initial='', blank=True) word1 = models.StringField(label= '', initial='', blank=False) word2 = models.StringField(label= '', initial='', blank=False) word3 = models.StringField(label= '', initial='', blank=False) word4 = models.StringField(label= '', initial='', blank=False) word5 = models.StringField(label= '', initial='', blank=False) word6 = models.StringField(label= '', initial='', blank=False) word7 = models.StringField(label= '', initial='', blank=False) word8 = models.StringField(label= '', initial='', blank=False) word9 = models.StringField(label= '', initial='', blank=False) word10 = models.StringField(label= '', initial='', blank=False) gender = models.IntegerField(choices=[[1, 'Männlich'],[2, 'Weiblich'],[3, 'Divers'],], label='Geschlecht:') age = models.IntegerField(min=18, max=100, label='Alter:') study = models.StringField(choices=[['Geisteswissenschaften', 'Geisteswissenschaften'],['Sport', 'Sport'],['Rechts-, Wirtschafts- und Sozialwissenschaften', 'Rechts-, Wirtschafts- und Sozialwissenschaften'],['Mathematik, Naturwissenschaften', 'Mathematik, Naturwissenschaften'],['Humanmedizin, Gesundheitswissenschaften', 'Humanmedizin, Gesundheitswissenschaften'],['Agrar-, Forst- und Ernährungswissenschaften, Veterinärmedizin', 'Agrar-, Forst- und Ernährungswissenschaften, Veterinärmedizin'], ['Ingenieurwissenschaften', 'Ingenieurwissenschaften'],['Kunst, Kunstwissenschaft', 'Kunst, Kunstwissenschaft'],['Sonstiges', 'Sonstiges'],], label='Studienbereich:', widget=widgets.RadioSelect) identical = models.BooleanField() invalid = models.BooleanField() missing = models.BooleanField() guess_missing = models.BooleanField() quantity = models.IntegerField() invalid_DAT = models.BooleanField() pair1 = models.StringField(initial='') pair2 = models.StringField(initial='') pair3 = models.StringField(initial='') pair4 = models.StringField(initial='') pair5 = models.StringField(initial='') pair1after = models.StringField(initial='') pair2after = models.StringField(initial='') pair3after = models.StringField(initial='') pair4after = models.StringField(initial='') pair5after = models.StringField(initial='') rating_before1 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=[['👍', '👍'],['👎', '👎'],], label='', blank=True, initial='') rating_before2 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=[['👍', '👍'],['👎', '👎'],], label='', blank=True, initial='') rating_before3 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=[['👍', '👍'],['👎', '👎'],], label='', blank=True, initial='') rating_before4 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=[['👍', '👍'],['👎', '👎'],], label='', blank=True, initial='') rating_before5 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=[['👍', '👍'],['👎', '👎'],], label='', blank=True, initial='') rating_before6 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=[['👍', '👍'],['👎', '👎'],], label='', blank=True, initial='') rating_before7 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=[['👍', '👍'],['👎', '👎'],], label='', blank=True, initial='') rating_before8 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=[['👍', '👍'],['👎', '👎'],], label='', blank=True, initial='') rating_before9 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=[['👍', '👍'],['👎', '👎'],], label='', blank=True, initial='') rating_before10 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=[['👍', '👍'],['👎', '👎'],], label='', blank=True, initial='') discussion1 = models.StringField(label= '', initial='', blank=True) discussion2 = models.StringField(label= '', initial='', blank=True) discussion3 = models.StringField(label= '', initial='', blank=True) discussion4 = models.StringField(label= '', initial='', blank=True) discussion5 = models.StringField(label= '', initial='', blank=True) discussion6 = models.StringField(label= '', initial='', blank=True) discussion7 = models.StringField(label= '', initial='', blank=True) discussion8 = models.StringField(label= '', initial='', blank=True) discussion9 = models.StringField(label= '', initial='', blank=True) discussion10 = models.StringField(label= '', initial='', blank=True) other_pairs = models.StringField(label= '', initial='', blank=True) replace_word1 = models.StringField(widget = widgets.RadioSelectHorizontal, choices=[['erste', 'erste Wort durch:'],['zweite', 'zweite Wort durch:'],], label='Ersetze das', blank=True, initial='') replace_word2 = models.StringField(widget = widgets.RadioSelectHorizontal, choices=[['erste', 'erste Wort durch:'],['zweite', 'zweite Wort durch:'],], label='Ersetze das', blank=True, initial='') replace_word3 = models.StringField(widget = widgets.RadioSelectHorizontal, choices=[['erste', 'erste Wort durch:'],['zweite', 'zweite Wort durch:'],], label='Ersetze das', blank=True, initial='') replace_word4 = models.StringField(widget = widgets.RadioSelectHorizontal, choices=[['erste', 'erste Wort durch:'],['zweite', 'zweite Wort durch:'],], label='Ersetze das', blank=True, initial='') replace_word5 = models.StringField(widget = widgets.RadioSelectHorizontal, choices=[['erste', 'erste Wort durch:'],['zweite', 'zweite Wort durch:'],], label='Ersetze das', blank=True, initial='') replace_word6 = models.StringField(widget = widgets.RadioSelectHorizontal, choices=[['erste', 'erste Wort durch:'],['zweite', 'zweite Wort durch:'],], label='Ersetze das', blank=True, initial='') replace_word7 = models.StringField(widget = widgets.RadioSelectHorizontal, choices=[['erste', 'erste Wort durch:'],['zweite', 'zweite Wort durch:'],], label='Ersetze das', blank=True, initial='') replace_word8 = models.StringField(widget = widgets.RadioSelectHorizontal, choices=[['erste', 'erste Wort durch:'],['zweite', 'zweite Wort durch:'],], label='Ersetze das', blank=True, initial='') replace_word9 = models.StringField(widget = widgets.RadioSelectHorizontal, choices=[['erste', 'erste Wort durch:'],['zweite', 'zweite Wort durch:'],], label='Ersetze das', blank=True, initial='') replace_word10 = models.StringField(widget = widgets.RadioSelectHorizontal, choices=[['erste', 'erste Wort durch:'],['zweite', 'zweite Wort durch:'],], label='Ersetze das', blank=True, initial='') pair_feedback1 = models.StringField(label= '', initial='', blank=True) pair_feedback2 = models.StringField(label= '', initial='', blank=True) pair_feedback3 = models.StringField(label= '', initial='', blank=True) pair_feedback4 = models.StringField(label= '', initial='', blank=True) pair_feedback5 = models.StringField(label= '', initial='', blank=True) pair_feedback6 = models.StringField(label= '', initial='', blank=True) pair_feedback7 = models.StringField(label= '', initial='', blank=True) pair_feedback8 = models.StringField(label= '', initial='', blank=True) pair_feedback9 = models.StringField(label= '', initial='', blank=True) pair_feedback10 = models.StringField(label= '', initial='', blank=True) vote = models.StringField(initial='') vote_group = models.StringField(initial='') corrected_votes = models.StringField() pairsafter = models.StringField(label= '', initial='', blank=True) number_pairs = models.IntegerField() group_individual = models.StringField(choices=[['Gruppe', 'Es war produktiv, in der Gruppe zu arbeiten'], ['Individuell', 'Ich hätte lieber alleine Hinweise gegeben']], label='10. Wie haben Sie die Zusammenarbeit in Ihrer Gruppe erlebt?', widget=widgets.RadioSelectHorizontal) before_quantity = models.IntegerField() before_missing = models.BooleanField() before_invalid = models.IntegerField() after_invalid = models.IntegerField() def creating_session(subsession: Subsession): session = subsession.session for player in subsession.get_players(): participant = player.participant participant.vars['treatment'] = session.config['treatment'] player.incentive = participant.vars['treatment'] # PAGES class GroupWaitPage(WaitPage): template_name = 'new_justone_deutsch/GroupWaitPage.html' group_by_arrival_time = True def is_displayed(player): return player.round_number == 1 class Introduction(Page): def is_displayed(player): return player.round_number == 1 class Intro(Page): timeout_seconds = 120 def is_displayed(player): return player.round_number == 1 class Intro2(Page): timeout_seconds = 120 def is_displayed(player): return player.round_number == 1 class Rules(Page): timeout_seconds = 70 def is_displayed(player): return player.round_number == 1 class DAT(Page): timeout_seconds = 270 def is_displayed(player): return player.round_number == C.NUM_ROUNDS form_model = 'player' form_fields = ['word1', 'word2', 'word3', 'word4', 'word5', 'word6', 'word7', 'word8', 'word9', 'word10', 'gender', 'age', 'study'] def before_next_page(player, timeout_happened): if timeout_happened: player.invalid_DAT = True return player.invalid_DAT else: player.invalid_DAT = False return player.invalid_DAT class Instructions(Page): timeout_seconds = 120 def is_displayed(player): return player.round_number == 1 class Instructions_2(Page): timeout_seconds = 120 def is_displayed(player): return player.round_number == 1 class Round(Page): timeout_seconds = 30 def vars_for_template(player): round_number = player.round_number remaining_rounds = C.NUM_ROUNDS - round_number group = player.group # get payoff from last round if round_number > 1: group.payoff = group.in_round(round_number - 1).payoff return dict(round_number = round_number, remaining_rounds = remaining_rounds) class Clue_Page(Page): timeout_seconds = 150 def is_displayed(player): return player.role() == 'Hinweisgebende' form_model = 'player' form_fields = ['Idea1', 'Idea2', 'Idea3', 'Idea4', 'Idea5', 'Idea6', 'Idea7', 'Idea8', 'Idea9', 'Idea10'] def vars_for_template(player): mystery_word = C.MYSTERY_WORDS[player.round_number - 1] feedback1_group = [p.pair_feedback1 for p in player.get_others_in_group()] feedback1_group = list(filter(bool, feedback1_group)) feedback2_group = [p.pair_feedback2 for p in player.get_others_in_group()] feedback2_group = list(filter(bool, feedback2_group)) feedback3_group = [p.pair_feedback3 for p in player.get_others_in_group()] feedback3_group = list(filter(bool, feedback3_group)) feedback4_group = [p.pair_feedback4 for p in player.get_others_in_group()] feedback4_group = list(filter(bool, feedback4_group)) feedback5_group = [p.pair_feedback5 for p in player.get_others_in_group()] feedback5_group = list(filter(bool, feedback5_group)) feedback6_group = [p.pair_feedback6 for p in player.get_others_in_group()] feedback6_group = list(filter(bool, feedback6_group)) feedback7_group = [p.pair_feedback7 for p in player.get_others_in_group()] feedback7_group = list(filter(bool, feedback7_group)) feedback8_group = [p.pair_feedback8 for p in player.get_others_in_group()] feedback8_group = list(filter(bool, feedback8_group)) feedback9_group = [p.pair_feedback9 for p in player.get_others_in_group()] feedback9_group = list(filter(bool, feedback9_group)) feedback10_group = [p.pair_feedback10 for p in player.get_others_in_group()] feedback10_group = list(filter(bool, feedback10_group)) rating_1 = [] replace_1 = [] r_word_1 = [] rating_2 = [] replace_2 = [] r_word_2 = [] rating_3 = [] replace_3 = [] r_word_3 = [] rating_4 = [] replace_4 = [] r_word_4 = [] rating_5 = [] replace_5 = [] r_word_5 = [] all_feedback_groups = [] if feedback1_group != ['', '']: all_feedback_groups = feedback1_group if feedback1_group != ['', ''] and feedback2_group != ['', '']: all_feedback_groups = feedback1_group + feedback2_group if feedback1_group != ['', ''] and feedback2_group != ['', ''] and feedback3_group != ['', '']: all_feedback_groups = feedback1_group + feedback2_group + feedback3_group if feedback1_group != ['', ''] and feedback2_group != ['', ''] and feedback3_group != ['', ''] and feedback4_group != ['', '']: all_feedback_groups = feedback1_group + feedback2_group + feedback3_group + feedback4_group if feedback1_group != ['', ''] and feedback2_group != ['', ''] and feedback3_group != ['', ''] and feedback4_group != ['', ''] and feedback5_group != ['', '']: all_feedback_groups = feedback1_group + feedback2_group + feedback3_group + feedback4_group + feedback5_group if feedback1_group != ['', ''] and feedback2_group != ['', ''] and feedback3_group != ['', ''] and feedback4_group != ['', ''] and feedback5_group != ['', ''] and feedback6_group != ['', '']: all_feedback_groups = feedback1_group + feedback2_group + feedback3_group + feedback4_group + feedback5_group + feedback6_group if feedback1_group != ['', ''] and feedback2_group != ['', ''] and feedback3_group != ['', ''] and feedback4_group != ['', ''] and feedback5_group != ['', ''] and feedback6_group != ['', ''] and feedback7_group != ['', '']: all_feedback_groups = feedback1_group + feedback2_group + feedback3_group + feedback4_group + feedback5_group + feedback6_group + feedback7_group if feedback1_group != ['', ''] and feedback2_group != ['', ''] and feedback3_group != ['', ''] and feedback4_group != ['', ''] and feedback5_group != ['', ''] and feedback6_group != ['', ''] and feedback7_group != ['', ''] and feedback8_group != ['', '']: all_feedback_groups = feedback1_group + feedback2_group + feedback3_group + feedback4_group + feedback5_group + feedback6_group + feedback7_group + feedback8_group if feedback1_group != ['', ''] and feedback2_group != ['', ''] and feedback3_group != ['', ''] and feedback4_group != ['', ''] and feedback5_group != ['', ''] and feedback6_group != ['', ''] and feedback7_group != ['', ''] and feedback8_group != ['', ''] and feedback9_group != ['', '']: all_feedback_groups = feedback1_group + feedback2_group + feedback3_group + feedback4_group + feedback5_group + feedback6_group + feedback7_group + feedback8_group + feedback9_group if feedback1_group != ['', ''] and feedback2_group != ['', ''] and feedback3_group != ['', ''] and feedback4_group != ['', ''] and feedback5_group != ['', ''] and feedback6_group != ['', ''] and feedback7_group != ['', ''] and feedback8_group != ['', ''] and feedback9_group != ['', ''] and feedback10_group != ['', '']: all_feedback_groups = feedback1_group + feedback2_group + feedback3_group + feedback4_group + feedback5_group + feedback6_group + feedback7_group + feedback8_group + feedback9_group + feedback10_group import ast for element in all_feedback_groups: element_list = ast.literal_eval(element) if element_list[0] == player.pair1: rating_1.append(element_list[1]) replace_1.append(element_list[2]) r_word_1.append(element_list[3]) if element_list[0] == player.pair2: rating_2.append(element_list[1]) replace_2.append(element_list[2]) r_word_2.append(element_list[3]) if element_list[0] == player.pair3: rating_3.append(element_list[1]) replace_3.append(element_list[2]) r_word_3.append(element_list[3]) if element_list[0] == player.pair4: rating_4.append(element_list[1]) replace_4.append(element_list[2]) r_word_4.append(element_list[3]) if element_list[0] == player.pair5: rating_5.append(element_list[1]) replace_5.append(element_list[2]) r_word_5.append(element_list[3]) return dict(mystery_word = mystery_word, Rating_1 = rating_1, Replace_1 = replace_1, R_word_1 = r_word_1, Rating_2 = rating_2, Replace_2 = replace_2, R_word_2 = r_word_2, Rating_3 = rating_3, Replace_3 = replace_3, R_word_3 = r_word_3, Rating_4 = rating_4, Replace_4 = replace_4, R_word_4 = r_word_4, Rating_5 = rating_5, Replace_5 = replace_5, R_word_5 = r_word_5, Feedback1 = feedback1_group, Feedback2 = feedback2_group, Feedback3 = feedback3_group, Feedback4 = feedback4_group, Feedback5 = feedback5_group, Feedback6 = feedback6_group, Feedback7 = feedback7_group, Feedback8 = feedback8_group, Feedback9 = feedback9_group, Feedback10 = feedback10_group) def before_next_page(player, timeout_happened): if timeout_happened: mystery_word = C.MYSTERY_WORDS[player.round_number - 1] mystery_word = mystery_word.lower() stem_words = C.STEM_WORDS[player.round_number - 1] ideas = [player.Idea1, player.Idea2, player.Idea3, player.Idea4, player.Idea5, player.Idea6, player.Idea7, player.Idea8, player.Idea9, player.Idea10] import re def has_numbers(s): return bool(re.search(r'\d',s)) with open("wordlist-german.txt", 'r') as file: text = file.read() wordlist= text.split() player.after_invalid = 0 if len(ideas) > 0: for i in range(len(ideas)): if ideas[i] != '': special_char_map = {ord('ä'):'ae', ord('ü'):'ue', ord('ö'):'oe', ord('ß'):'ss'} ideas[i] = ideas[i].translate(special_char_map) ideas[i] = ideas[i].lower() if ' ' in ideas[i]: more = ideas[i].split() if len(more)>1: ideas[i] = 'false' for j in range(len(stem_words)): if stem_words[j] in ideas[i] or ideas[i] in stem_words[j]: ideas[i] = 'false' if re.search("[^a-zA-Z0-9s]", ideas[i]): ideas[i] = 'false' if has_numbers(ideas[i]) == True: ideas[i] = 'false' if ideas[i] not in wordlist: ideas[i] = 'false' if ideas[i] == 'false': player.after_invalid = player.after_invalid + 1 if ((ideas[0] != '' and ideas[0] != 'false') and (ideas[1] != '' and ideas[1] != 'false')): player.pair1after = ideas[0] + ' + ' + ideas[1] else: player.pair1after = 'empty' if ((ideas[2] != '' and ideas[2] != 'false') and (ideas[3] != '' and ideas[3] != 'false')): player.pair2after = ideas[2] + ' + ' + ideas[3] else: player.pair2after = 'empty' if ((ideas[4] != '' and ideas[4] != 'false') and (ideas[5] != '' and ideas[5] != 'false')): player.pair3after = ideas[4] + ' + ' + ideas[5] else: player.pair3after = 'empty' if ((ideas[6] != '' and ideas[6] != 'false') and (ideas[7] != '' and ideas[7] != 'false')): player.pair4after = ideas[6] + ' + ' + ideas[7] else: player.pair4after = 'empty' if ((ideas[8] != '' and ideas[8] != 'false') and (ideas[9] != '' and ideas[9] != 'false')): player.pair5after = ideas[8] + ' + ' + ideas[9] else: player.pair5after = 'empty' else: mystery_word = C.MYSTERY_WORDS[player.round_number - 1] mystery_word = mystery_word.lower() stem_words = C.STEM_WORDS[player.round_number - 1] ideas = [player.Idea1, player.Idea2, player.Idea3, player.Idea4, player.Idea5, player.Idea6, player.Idea7, player.Idea8, player.Idea9, player.Idea10] import re def has_numbers(s): return bool(re.search(r'\d',s)) with open("wordlist-german.txt", 'r') as file: text = file.read() wordlist= text.split() player.after_invalid = 0 if len(ideas) > 0: for i in range(len(ideas)): if ideas[i] != '': special_char_map = {ord('ä'):'ae', ord('ü'):'ue', ord('ö'):'oe', ord('ß'):'ss'} ideas[i] = ideas[i].translate(special_char_map) ideas[i] = ideas[i].lower() if ' ' in ideas[i]: more = ideas[i].split() if len(more)>1: ideas[i] = 'false' for j in range(len(stem_words)): if stem_words[j] in ideas[i] or ideas[i] in stem_words[j]: ideas[i] = 'false' if re.search("[^a-zA-Z0-9s]", ideas[i]): ideas[i] = 'false' if has_numbers(ideas[i]) == True: ideas[i] = 'false' if ideas[i] not in wordlist: ideas[i] = 'false' if ideas[i] == 'false': player.after_invalid = player.after_invalid + 1 if ((ideas[0] != '' and ideas[0] != 'false') and (ideas[1] != '' and ideas[1] != 'false')): player.pair1after = ideas[0] + ' + ' + ideas[1] else: player.pair1after = 'empty' if ((ideas[2] != '' and ideas[2] != 'false') and (ideas[3] != '' and ideas[3] != 'false')): player.pair2after = ideas[2] + ' + ' + ideas[3] else: player.pair2after = 'empty' if ((ideas[4] != '' and ideas[4] != 'false') and (ideas[5] != '' and ideas[5] != 'false')): player.pair3after = ideas[4] + ' + ' + ideas[5] else: player.pair3after = 'empty' if ((ideas[6] != '' and ideas[6] != 'false') and (ideas[7] != '' and ideas[7] != 'false')): player.pair4after = ideas[6] + ' + ' + ideas[7] else: player.pair4after = 'empty' if ((ideas[8] != '' and ideas[8] != 'false') and (ideas[9] != '' and ideas[9] != 'false')): player.pair5after = ideas[8] + ' + ' + ideas[9] else: player.pair5after = 'empty' def wordlength(player, value): value = value.lower() if len(value) > 18: return True def Idea1_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea2_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea3_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea4_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea5_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea6_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea7_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea8_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea9_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea10_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' class VotingResultPage(Page): timeout_seconds = 30 def is_displayed(player): return player.role() == 'Hinweisgebende' def vars_for_template(player): mystery_word = C.MYSTERY_WORDS[player.round_number - 1] mystery_word = mystery_word.lower() stem_words = C.STEM_WORDS[player.round_number - 1] votes = [player.vote] + [p.vote for p in player.get_others_in_group()] while '' in votes: votes.remove('') votes = [vote.replace(' + ', ' ') for vote in votes] if len(votes) > 0: for i in range(len(votes)): words = votes[i].split() if len(words) >= 3: votes[i] = 'false false' words = [word for vote in votes for word in vote.split()] import re def has_numbers(s): return bool(re.search(r'\d',s)) with open("wordlist-german.txt", 'r') as file: text = file.read() wordlist= text.split() if len(words) > 0: for i in range(len(words)): special_char_map = {ord('ä'):'ae', ord('ü'):'ue', ord('ö'):'oe', ord('ß'):'ss'} words[i] = words[i].translate(special_char_map) words[i] = words[i].lower() if re.search("[^a-zA-Z0-9s]", words[i]): words[i] = 'false' if has_numbers(words[i]) == True: words[i] = 'false' for j in range(len(stem_words)): if stem_words[j] in words[i] or words[i] in stem_words[j]: words[i] = 'false' if words[i] not in wordlist: words[i] = 'false' corrected_votes = [] for i in range(0, len(words), 2): corrected_votes.append(' + '.join(words[i:i+2])) player.corrected_votes = str(corrected_votes) import random random.seed(42) valid_votes = [v for v in corrected_votes if 'false' not in v] duplicates = [v for v in set(valid_votes) if valid_votes.count(v) >= 2] number_duplicates = len(duplicates) number_valid_votes = len(valid_votes) valid_votes = sorted(valid_votes) if len(duplicates) > 0: vote_group = duplicates[0] else: if len(valid_votes) > 0: i = random.randint(0, len(valid_votes) - 1) vote_group = valid_votes[i] else: vote_group = 'Kein gültiges Hinweispaar' player.vote_group = vote_group return dict(mystery_word = mystery_word, vote_group = vote_group, duplicates = number_duplicates, valid_votes = number_valid_votes) class Guess_Page(Page): timeout_seconds = 90 def is_displayed(player): return player.role() == 'Ratender' def vars_for_template(player): vote_group = [p.vote_group for p in player.get_others_in_group()] vote_group = vote_group[0] player.vote_group = vote_group vote_other_groups = [] for other_group in player.subsession.get_groups(): if other_group != player.group: for other_player in other_group.get_players(): vote_other_groups.append(other_player.vote_group) for vote in vote_other_groups: while (vote_other_groups.count(vote) > 1): vote_other_groups.remove(vote) while '' in vote_other_groups: vote_other_groups.remove('') def find_identical_words(str1, str2): str1 = str1.replace('+', '') str2 = str2.replace('+','') words1 = set(str1.split()) words2 = set(str2.split()) identical_words = words1.intersection(words2) return identical_words if len(vote_other_groups) > 0: vote_other_groups1 = vote_other_groups[0] identical_words = find_identical_words(vote_group, vote_other_groups1) if identical_words: vote_group = 'Identisches Hinweispaar' if len(vote_other_groups) > 1: vote_other_groups2 = vote_other_groups[1] identical_words = find_identical_words(vote_group, vote_other_groups2) if identical_words: vote_group = 'Identisches Hinweispaar' if len(vote_other_groups) > 2: vote_other_groups3 = vote_other_groups[2] identical_words = find_identical_words(vote_group, vote_other_groups3) if identical_words: vote_group = 'Identisches Hinweispaar' if len(vote_other_groups) > 3: vote_other_groups4 = vote_other_groups[3] identical_words = find_identical_words(vote_group, vote_other_groups4) if identical_words: vote_group = 'Identisches Hinweispaar' if len(vote_other_groups) > 4: vote_other_groups5 = vote_other_groups[4] identical_words = find_identical_words(vote_group, vote_other_groups5) if identical_words: vote_group = 'Identisches Hinweispaar' player.vote_group = vote_group return dict(vote_group = vote_group, vote_other_groups = vote_other_groups) form_model = 'player' form_fields = ['guess'] def before_next_page(player, timeout_happened): if timeout_happened: player.guess = 'Kein Tipp gegeben' else: player.guess = player.guess.lower() return player.guess class Results(Page): timeout_seconds = 40 def vars_for_template(player): mystery_word = C.MYSTERY_WORDS[player.round_number - 1] mystery_word = mystery_word.lower() if player.role() == 'Hinweisgebende': vote_group = [p.vote_group for p in player.get_others_in_group()] while '' in vote_group: vote_group.remove('') invalid = '' identical = '' player.identical = False player.invalid = False if 'Identisches Hinweispaar' in vote_group: player.identical = True identical = 'Achtung! Das Hinweispaar Ihrer Gruppe war identisch mit dem Hinweispaar einer anderen Gruppe.' vote_group = 'Identisches Hinweispaar' else: vote_group = vote_group[0] if vote_group == 'Kein gültiges Hinweispaar': player.invalid = True invalid = 'Achtung! Das Hinweispaar Ihrer Gruppe war ungültig.' guess = [p.guess for p in player.get_others_in_group()] while '' in guess: guess.remove('') guess = guess[0] player.guess_missing = False player.missing = False guess_missing = '' missing = '' pairs = [player.pair1after] + [player.pair2after] + [player.pair3after] + [player.pair4after] + [player.pair5after] for i in range(len(pairs)): if pairs[i] == 'empty': pairs[i] = '' while '' in pairs: pairs.remove('') player.quantity = len(pairs) if player.quantity == 0: player.missing = True missing = 'Achtung! Sie haben kein Hinweispaar abgegeben.' if player.role() == 'Ratender': vote_group = player.vote_group player.identical = False player.invalid = False player.quantity = 0 player.guess_missing = False player.missing = False identical = '' invalid = '' missing = '' guess_missing = '' guess = player.guess if guess == 'Kein Tipp gegeben': player.guess_missing = True guess_missing = 'Achtung! Sie haben keinen Tipp abgegeben.' if mystery_word == guess: player.result = 'richtig' player.payoff = 1 else: player.result = 'falsch' player.payoff = 0 player.score = int(player.participant.payoff) player.group.payoff = player.score if player.participant.treatment == 1: player.group.payoff = 1000 return dict(mystery_word = mystery_word, vote_group = vote_group, guess = guess, result = player.result, identical = identical, invalid = invalid, missing = missing, guess_missing = guess_missing, number_ideas = player.quantity) def score(group: Group): subsession = group.subsession groups = subsession.get_groups() overall_score = [] for group in groups: overall_score.append(group.payoff) if group.payoff == 1000: overall_score.remove(1000) sorted_overall_score = sorted(overall_score, reverse = True) return sorted_overall_score class Score(Page): timeout_seconds = 30 def is_displayed(player): return player.participant.treatment == 3 def vars_for_template(player): player.score = int(player.participant.payoff) overall_score = score(player.group) rank = 0 if player.score == overall_score[0]: rank = 1 if player.score == overall_score[1] and player.score != overall_score[0]: rank = 2 if len(overall_score) > 2: if player.score == overall_score[2] and player.score != overall_score[0] and player.score != overall_score[1]: rank = 3 if len(overall_score) > 3: if player.score == overall_score[3] and player.score != overall_score[0] and player.score != overall_score[1] and player.score != overall_score[2]: rank = 4 if len(overall_score) > 4: if player.score == overall_score[4] and player.score != overall_score[0] and player.score != overall_score[1] and player.score != overall_score[2] and player.score != overall_score[3]: rank = 5 number_groups = len(overall_score) return dict(overall_score = overall_score, score = player.score, rank = rank, number_groups = number_groups) class TestQuestions(Page): template_name = 'new_justone_deutsch/TestQuestions.html' timeout_seconds = 270 def is_displayed(player): return player.round_number == C.NUM_ROUNDS form_model = 'player' form_fields = ['known', 'understanding', 'role_question', 'comments', 'comments_2', 'strategy', 'strategy_2', 'strategy_3', 'strategy_4', 'group_individual' ,'strategy_5', 'strategy_6', ] class FredaQuestions(Page): template_name = 'new_justone_deutsch/FredaQuestions.html' timeout_seconds = 140 def is_displayed(player): return player.round_number == C.NUM_ROUNDS form_model = 'player' form_fields = ['freda_1', 'freda_2', 'freda_3', 'freda_4', 'freda_5', 'freda_6', 'freda_7', 'freda_8'] class IndividualismQuestions(Page): template_name = 'justone_deutsch/IndividualismQuestions.html' timeout_seconds = 120 def is_displayed(player): return player.round_number == C.NUM_ROUNDS form_model = 'player' form_fields = ['individualism_1', 'individualism_2', 'individualism_3', 'individualism_4', 'individualism_5', 'future_1', 'future_2'] class UnderstandPage(Page): template_name = 'new_justone_deutsch/UnderstandPage.html' timeout_seconds = 120 def is_displayed(player): return player.round_number == 1 form_model = 'player' form_fields = ['understand_1', 'understand_2', 'understand_3', 'understand_4', 'understand_5'] def error_message(player, values): if values['understand_1'] == 'false': return 'Falsche Antwort bei Frage 1! Versuchen Sie es noch einmal.' if values['understand_2'] == 'false': return 'Falsche Antwort bei Frage 2! Versuchen Sie es noch einmal.' if values['understand_3'] == 'false': return 'Falsche Antwort bei Frage 3! Versuchen Sie es noch einmal.' if values['understand_4'] == 'false': return 'Falsche Antwort bei Frage 4! Versuchen Sie es noch einmal.' if values['understand_5'] == 'false': return 'Falsche Antwort bei Frage 5! Versuchen Sie es noch einmal.' class Generation_Page(Page): timeout_seconds = 180 def is_displayed(player): return player.role() == 'Hinweisgebende' form_model = 'player' form_fields = ['Idea1', 'Idea2', 'Idea3', 'Idea4', 'Idea5', 'Idea6', 'Idea7', 'Idea8', 'Idea9', 'Idea10'] def vars_for_template(player): mystery_word = C.MYSTERY_WORDS[player.round_number - 1] return dict(mystery_word = mystery_word) def before_next_page(player, timeout_happened): if timeout_happened: player.before_missing = False mystery_word = C.MYSTERY_WORDS[player.round_number - 1] mystery_word = mystery_word.lower() stem_words = C.STEM_WORDS[player.round_number - 1] ideas = [player.Idea1, player.Idea2, player.Idea3, player.Idea4, player.Idea5, player.Idea6, player.Idea7, player.Idea8, player.Idea9, player.Idea10] import re def has_numbers(s): return bool(re.search(r'\d',s)) with open("wordlist-german.txt", 'r') as file: text = file.read() wordlist= text.split() player.before_invalid = 0 if len(ideas) > 0: for i in range(len(ideas)): if ideas[i] != '': special_char_map = {ord('ä'):'ae', ord('ü'):'ue', ord('ö'):'oe', ord('ß'):'ss'} ideas[i] = ideas[i].translate(special_char_map) ideas[i] = ideas[i].lower() if ' ' in ideas[i]: more = ideas[i].split() if len(more)>1: ideas[i] = 'false' for j in range(len(stem_words)): if stem_words[j] in ideas[i] or ideas[i] in stem_words[j]: ideas[i] = 'false' if re.search("[^a-zA-Z0-9s]", ideas[i]): ideas[i] = 'false' if has_numbers(ideas[i]) == True: ideas[i] = 'false' if ideas[i] not in wordlist: ideas[i] = 'false' if ideas[i] == 'false': player.before_invalid = player.before_invalid + 1 if ((ideas[0] != '' and ideas[0] != 'false') and (ideas[1] != '' and ideas[1] != 'false')): player.pair1 = ideas[0] + ' + ' + ideas[1] else: player.pair1 = 'empty' if ((ideas[2] != '' and ideas[2] != 'false') and (ideas[3] != '' and ideas[3] != 'false')): player.pair2 = ideas[2] + ' + ' + ideas[3] else: player.pair2 = 'empty' if ((ideas[4] != '' and ideas[4] != 'false') and (ideas[5] != '' and ideas[5] != 'false')): player.pair3 = ideas[4] + ' + ' + ideas[5] else: player.pair3 = 'empty' if ((ideas[6] != '' and ideas[6] != 'false') and (ideas[7] != '' and ideas[7] != 'false')): player.pair4 = ideas[6] + ' + ' + ideas[7] else: player.pair4 = 'empty' if ((ideas[8] != '' and ideas[8] != 'false') and (ideas[9] != '' and ideas[9] != 'false')): player.pair5 = ideas[8] + ' + ' + ideas[9] else: player.pair5 = 'empty' pairs = [player.pair1] + [player.pair2] + [player.pair3] + [player.pair4] + [player.pair5] while 'empty' in pairs: pairs.remove('empty') player.before_quantity = len(pairs) if player.before_quantity == 0: player.before_missing = True else: player.before_missing = False mystery_word = C.MYSTERY_WORDS[player.round_number - 1] mystery_word = mystery_word.lower() stem_words = C.STEM_WORDS[player.round_number - 1] ideas = [player.Idea1, player.Idea2, player.Idea3, player.Idea4, player.Idea5, player.Idea6, player.Idea7, player.Idea8, player.Idea9, player.Idea10] import re def has_numbers(s): return bool(re.search(r'\d',s)) with open("wordlist-german.txt", 'r') as file: text = file.read() wordlist= text.split() player.before_invalid = 0 if len(ideas) > 0: for i in range(len(ideas)): if ideas[i] != '': special_char_map = {ord('ä'):'ae', ord('ü'):'ue', ord('ö'):'oe', ord('ß'):'ss'} ideas[i] = ideas[i].translate(special_char_map) ideas[i] = ideas[i].lower() if ' ' in ideas[i]: more = ideas[i].split() if len(more)>1: ideas[i] = 'false' for j in range(len(stem_words)): if stem_words[j] in ideas[i] or ideas[i] in stem_words[j]: ideas[i] = 'false' if re.search("[^a-zA-Z0-9s]", ideas[i]): ideas[i] = 'false' if has_numbers(ideas[i]) == True: ideas[i] = 'false' if ideas[i] not in wordlist: ideas[i] = 'false' if ideas[i] == 'false': player.before_invalid = player.before_invalid + 1 if ((ideas[0] != '' and ideas[0] != 'false') and (ideas[1] != '' and ideas[1] != 'false')): player.pair1 = ideas[0] + ' + ' + ideas[1] else: player.pair1 = 'empty' if ((ideas[2] != '' and ideas[2] != 'false') and (ideas[3] != '' and ideas[3] != 'false')): player.pair2 = ideas[2] + ' + ' + ideas[3] else: player.pair2 = 'empty' if ((ideas[4] != '' and ideas[4] != 'false') and (ideas[5] != '' and ideas[5] != 'false')): player.pair3 = ideas[4] + ' + ' + ideas[5] else: player.pair3 = 'empty' if ((ideas[6] != '' and ideas[6] != 'false') and (ideas[7] != '' and ideas[7] != 'false')): player.pair4 = ideas[6] + ' + ' + ideas[7] else: player.pair4 = 'empty' if ((ideas[8] != '' and ideas[8] != 'false') and (ideas[9] != '' and ideas[9] != 'false')): player.pair5 = ideas[8] + ' + ' + ideas[9] else: player.pair5 = 'empty' pairs = [player.pair1] + [player.pair2] + [player.pair3] + [player.pair4] + [player.pair5] while 'empty' in pairs: pairs.remove('empty') player.before_quantity = len(pairs) if player.before_quantity == 0: player.before_missing = True def wordlength(player, value): value = value.lower() if len(value) > 18: return True def Idea1_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea2_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea3_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea4_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea5_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea6_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea7_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea8_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea9_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def Idea10_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' class Generation_WaitPage(WaitPage): title_text = "Vielen Dank für Ihre Hinweispaare!" body_text = "Bitte warten Sie, bis alle ihre Hinweispaare abgegeben haben." wait_for_all_players = True def is_displayed(player): return player.role() == 'Hinweisgebende' class Discussion(Page): timeout_seconds = 150 def is_displayed(player): return player.role() == 'Hinweisgebende' form_model = 'player' form_fields = ['rating_before1', 'rating_before2', 'rating_before3', 'rating_before4', 'rating_before5', 'rating_before6', 'rating_before7', 'rating_before8', 'rating_before9', 'rating_before10', 'replace_word1', 'replace_word2', 'replace_word3', 'replace_word4', 'replace_word5', 'replace_word6', 'replace_word7', 'replace_word8', 'replace_word9', 'replace_word10', 'discussion1','discussion2', 'discussion3', 'discussion4', 'discussion5', 'discussion6', 'discussion7', 'discussion8', 'discussion9', 'discussion10'] def vars_for_template(player): mystery_word = C.MYSTERY_WORDS[player.round_number - 1] mystery_word = mystery_word.lower() pairs = [player.pair1 for player in player.get_others_in_group()] + [player.pair2 for player in player.get_others_in_group()] + [player.pair3 for player in player.get_others_in_group()] + [player.pair4 for player in player.get_others_in_group()] + [player.pair5 for player in player.get_others_in_group()] while 'empty' in pairs: pairs.remove('empty') while '' in pairs: pairs.remove('') delimiter = ', ' player.other_pairs = delimiter.join(pairs) number_pairs = len(pairs) Pair1 = '' Pair2 = '' Pair3 = '' Pair4 = '' Pair5 = '' Pair6 = '' Pair7 = '' Pair8 = '' Pair9 = '' Pair10 = '' if number_pairs > 0: Pair1 = pairs[0] if number_pairs > 1: Pair2 = pairs[1] if number_pairs > 2: Pair3 = pairs[2] if number_pairs > 3: Pair4 = pairs[3] if number_pairs > 4: Pair5 = pairs[4] if number_pairs > 5: Pair6 = pairs[5] if number_pairs > 6: Pair7 = pairs[6] if number_pairs > 7: Pair8 = pairs[7] if number_pairs > 8: Pair9 = pairs[8] if number_pairs > 9: Pair10 = pairs[9] player.number_pairs = number_pairs return dict(mystery_word = mystery_word, number_pairs = number_pairs, Pair1 = Pair1, Pair2 = Pair2, Pair3 = Pair3, Pair4 = Pair4, Pair5 = Pair5, Pair6 = Pair6, Pair7 = Pair7, Pair8 = Pair8, Pair9 = Pair9, Pair10 = Pair10) def before_next_page(player, timeout_happened): if timeout_happened: pairs = [player.pair1 for player in player.get_others_in_group()] + [player.pair2 for player in player.get_others_in_group()] + [player.pair3 for player in player.get_others_in_group()] + [player.pair4 for player in player.get_others_in_group()] + [player.pair5 for player in player.get_others_in_group()] while 'empty' in pairs: pairs.remove('empty') while '' in pairs: pairs.remove('') if len(pairs) > 0: feedback_1 = [player.other_pairs.split(',')[0]] + [player.rating_before1] + [player.replace_word1] + [player.discussion1] feedback_1 = str(feedback_1) player.pair_feedback1 = feedback_1 if len(pairs) > 1: feedback_2 = [player.other_pairs.split(', ')[1]] + [player.rating_before2] + [player.replace_word2] + [player.discussion2] feedback_2 = str(feedback_2) player.pair_feedback2 = feedback_2 if len(pairs) > 2: feedback_3 = [player.other_pairs.split(', ')[2]] + [player.rating_before3] + [player.replace_word3] + [player.discussion3] feedback_3 = str(feedback_3) player.pair_feedback3 = feedback_3 if len(pairs) > 3: feedback_4 = [player.other_pairs.split(', ')[3]] + [player.rating_before4] + [player.replace_word4] + [player.discussion4] feedback_4 = str(feedback_4) player.pair_feedback4 = feedback_4 if len(pairs) > 4: feedback_5 = [player.other_pairs.split(', ')[4]] + [player.rating_before5] + [player.replace_word5] + [player.discussion5] feedback_5 = str(feedback_5) player.pair_feedback5 = feedback_5 if len(pairs) > 5: feedback_6 = [player.other_pairs.split(', ')[5]] + [player.rating_before6] + [player.replace_word6] + [player.discussion6] feedback_6 = str(feedback_6) player.pair_feedback6 = feedback_6 if len(pairs) > 6: feedback_7 = [player.other_pairs.split(', ')[6]] + [player.rating_before7] + [player.replace_word7] + [player.discussion7] feedback_7 = str(feedback_7) player.pair_feedback7 = feedback_7 if len(pairs) > 7: feedback_8 = [player.other_pairs.split(', ')[7]] + [player.rating_before8] + [player.replace_word8] + [player.discussion8] feedback_8 = str(feedback_8) player.pair_feedback8 = feedback_8 if len(pairs) > 8: feedback_9 = [player.other_pairs.split(', ')[8]] + [player.rating_before9] + [player.replace_word9] + [player.discussion9] feedback_9 = str(feedback_9) player.pair_feedback9 = feedback_9 if len(pairs) > 9: feedback_10 = [player.other_pairs.split(', ')[9]] + [player.rating_before10] + [player.replace_word10] + [player.discussion10] feedback_10 = str(feedback_10) player.pair_feedback10 = feedback_10 else: pairs = [player.pair1 for player in player.get_others_in_group()] + [player.pair2 for player in player.get_others_in_group()] + [player.pair3 for player in player.get_others_in_group()] + [player.pair4 for player in player.get_others_in_group()] + [player.pair5 for player in player.get_others_in_group()] while 'empty' in pairs: pairs.remove('empty') while '' in pairs: pairs.remove('') if len(pairs) > 0: feedback_1 = [player.other_pairs.split(',')[0]] + [player.rating_before1] + [player.replace_word1] + [player.discussion1] feedback_1 = str(feedback_1) player.pair_feedback1 = feedback_1 if len(pairs) > 1: feedback_2 = [player.other_pairs.split(', ')[1]] + [player.rating_before2] + [player.replace_word2] + [player.discussion2] feedback_2 = str(feedback_2) player.pair_feedback2 = feedback_2 if len(pairs) > 2: feedback_3 = [player.other_pairs.split(', ')[2]] + [player.rating_before3] + [player.replace_word3] + [player.discussion3] feedback_3 = str(feedback_3) player.pair_feedback3 = feedback_3 if len(pairs) > 3: feedback_4 = [player.other_pairs.split(', ')[3]] + [player.rating_before4] + [player.replace_word4] + [player.discussion4] feedback_4 = str(feedback_4) player.pair_feedback4 = feedback_4 if len(pairs) > 4: feedback_5 = [player.other_pairs.split(', ')[4]] + [player.rating_before5] + [player.replace_word5] + [player.discussion5] feedback_5 = str(feedback_5) player.pair_feedback5 = feedback_5 if len(pairs) > 5: feedback_6 = [player.other_pairs.split(', ')[5]] + [player.rating_before6] + [player.replace_word6] + [player.discussion6] feedback_6 = str(feedback_6) player.pair_feedback6 = feedback_6 if len(pairs) > 6: feedback_7 = [player.other_pairs.split(', ')[6]] + [player.rating_before7] + [player.replace_word7] + [player.discussion7] feedback_7 = str(feedback_7) player.pair_feedback7 = feedback_7 if len(pairs) > 7: feedback_8 = [player.other_pairs.split(', ')[7]] + [player.rating_before8] + [player.replace_word8] + [player.discussion8] feedback_8 = str(feedback_8) player.pair_feedback8 = feedback_8 if len(pairs) > 8: feedback_9 = [player.other_pairs.split(', ')[8]] + [player.rating_before9] + [player.replace_word9] + [player.discussion9] feedback_9 = str(feedback_9) player.pair_feedback9 = feedback_9 if len(pairs) > 9: feedback_10 = [player.other_pairs.split(', ')[9]] + [player.rating_before10] + [player.replace_word10] + [player.discussion10] feedback_10 = str(feedback_10) player.pair_feedback10 = feedback_10 def rating_before1_error_message(player, value): if value == '' and player.number_pairs > 0: return 'Bitte wählen Sie eine Antwort aus!' def rating_before2_error_message(player, value): if value == '' and player.number_pairs > 1: return 'Bitte wählen Sie eine Antwort aus!' def rating_before3_error_message(player, value): if value == '' and player.number_pairs > 2: return 'Bitte wählen Sie eine Antwort aus!' def rating_before4_error_message(player, value): if value == '' and player.number_pairs > 3: return 'Bitte wählen Sie eine Antwort aus!' def rating_before5_error_message(player, value): if value == '' and player.number_pairs > 4: return 'Bitte wählen Sie eine Antwort aus!' def rating_before6_error_message(player, value): if value == '' and player.number_pairs > 5: return 'Bitte wählen Sie eine Antwort aus!' def rating_before7_error_message(player, value): if value == '' and player.number_pairs > 6: return 'Bitte wählen Sie eine Antwort aus!' def rating_before8_error_message(player, value): if value == '' and player.number_pairs > 7: return 'Bitte wählen Sie eine Antwort aus!' def rating_before9_error_message(player, value): if value == '' and player.number_pairs > 8: return 'Bitte wählen Sie eine Antwort aus!' def rating_before10_error_message(player, value): if value == '' and player.number_pairs > 9: return 'Bitte wählen Sie eine Antwort aus!' def wordlength(player, value): value = value.lower() if len(value) > 18: return True def discussion1_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def discussion2_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def discussion3_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def discussion4_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def discussion5_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def discussion6_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def discussion7_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def discussion8_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def discussion9_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' def discussion10_error_message(player, value): if wordlength(player, value) == True: return 'Ihr Hinweis darf nicht länger als 18 Zeichen sein!' class Voting_Page(Page): timeout_seconds = 90 def is_displayed(player): return player.role() == 'Hinweisgebende' form_model = 'player' form_fields = ['vote'] def vars_for_template(player): mystery_word = C.MYSTERY_WORDS[player.round_number - 1] mystery_word = mystery_word.lower() pairs = [player.pair1after] + [player.pair1after for player in player.get_others_in_group()] + [player.pair2after] + [player.pair2after for player in player.get_others_in_group()] + [player.pair3after] + [player.pair3after for player in player.get_others_in_group()] + [player.pair4after] + [player.pair4after for player in player.get_others_in_group()] + [player.pair5after] + [player.pair5after for player in player.get_others_in_group()] while 'empty' in pairs: pairs.remove('empty') while '' in pairs: pairs.remove('') pairsafter = [] for item in pairs: if pairs.count(item) > 1 and item not in pairsafter: pairsafter.append(item) elif pairs.count(item) == 1: pairsafter.append(item) pairsafter = sorted(pairsafter) delimiter = ', ' player.pairsafter = delimiter.join(pairsafter) number_pairs = len(pairsafter) Pair1 = '' Pair2 = '' Pair3 = '' Pair4 = '' Pair5 = '' Pair6 = '' Pair7 = '' Pair8 = '' Pair9 = '' Pair10 = '' Pair11 = '' Pair12 = '' Pair13 = '' Pair14 = '' Pair15 = '' if number_pairs > 0: Pair1 = pairsafter[0] if number_pairs > 1: Pair2 = pairsafter[1] if number_pairs > 2: Pair3 = pairsafter[2] if number_pairs > 3: Pair4 = pairsafter[3] if number_pairs > 4: Pair5 = pairsafter[4] if number_pairs > 5: Pair6 = pairsafter[5] if number_pairs > 6: Pair7 = pairsafter[6] if number_pairs > 7: Pair8 = pairsafter[7] if number_pairs > 8: Pair9 = pairsafter[8] if number_pairs > 9: Pair10 = pairsafter[9] if number_pairs > 10: Pair11 = pairsafter[10] if number_pairs > 11: Pair12 = pairsafter[11] if number_pairs > 12: Pair13 = pairsafter[12] if number_pairs > 13: Pair14 = pairsafter[13] if number_pairs > 14: Pair15 = pairsafter[14] return dict(mystery_word = mystery_word, number_pairs = number_pairs, Pair1 = Pair1, Pair2 = Pair2, Pair3 = Pair3, Pair4 = Pair4, Pair5 = Pair5, Pair6 = Pair6, Pair7 = Pair7, Pair8 = Pair8, Pair9 = Pair9, Pair10 = Pair10, Pair11 = Pair11, Pair12 = Pair12, Pair13 = Pair13, Pair14 = Pair14, Pair15 = Pair15, pairs = pairsafter) class VotingResultWaitPage(WaitPage): title_text = "Vielen Dank für Ihre Abstimmung!" body_text = "Bitte warten Sie, bis alle ihre Stimmen abgegeben haben." wait_for_all_players = True def is_displayed(player): return player.role() == 'Hinweisgebende' class CluegiverWaitPage(WaitPage): title_text = "Vielen Dank für Ihr Hinweispaar!" body_text = "Das Hinweispaar wird nun dem Ratenden gezeigt." def is_displayed(player): return player.role() == 'Hinweisgebende' wait_for_all_groups = True class Clue_WaitPage(WaitPage): title_text = "Vielen Dank für Ihr Feedback!" body_text = "Bitte warten Sie, bis all Ihre Gruppenmitglieder ihr Feedback abgegeben haben." wait_for_all_players = True def is_displayed(player): return player.role() == 'Hinweisgebende' class VotingWaitPage(WaitPage): title_text = "Vielen Dank für Ihre Hinweispaare" body_text = "Bitte warten Sie, bis alle ihre Hinweispaare abgegeben haben." wait_for_all_players = True def is_displayed(player): return player.role() == 'Hinweisgebende' class GuesserWaitPage(WaitPage): title_text = "Sie können Ihren Tipp bald abgeben" body_text = "Bitte warten Sie, bis die anderen Spielenden ein Hinweispaar für Sie abgegeben haben. Dies kann ein paar Minuten dauern." def is_displayed(player): return player.role() == 'Ratender' wait_for_all_groups = True class ResultsWaitPage(WaitPage): title_text = "Ihre Gruppe ist fertig!" body_text = "Bitte warten Sie, bis alle Gruppen ihre Hinweispaare und Tipps abgegeben haben." wait_for_all_groups = True class FinalPage(Page): def is_displayed(player): return player.round_number == C.NUM_ROUNDS page_sequence = [GroupWaitPage, Intro, Intro2, Rules, Instructions, Instructions_2, UnderstandPage, Round, Generation_Page, Generation_WaitPage, Discussion, Clue_WaitPage, Clue_Page, VotingWaitPage, Voting_Page, VotingResultWaitPage, VotingResultPage, GuesserWaitPage, CluegiverWaitPage, Guess_Page, ResultsWaitPage, Results, Score, TestQuestions, FredaQuestions, IndividualismQuestions, DAT, FinalPage]