from otree.api import * import random class C(BaseConstants): Redirect_URL = 'https://www.unibocconi.it/en' URL_SCREENEDOUT = 'https://www.scuoleapertemilano.it/-/parlami-di-scuola-al-via-una-ricerca-sulle-secondarie-di-i-grado' NAME_IN_URL = 'survey' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 Answer = ['Canada','Canada','Cina', 'Romania','Paesi Bassi','Romania', 'Intesa Sanpaolo','Intesa Sanpaolo','Ferrovie dello Stato', 'Aldo Moro', 'Aldo Moro', 'JF Kennedy', 'Roma Termini', 'Bologna', 'Roma Termini', 'Islanda', 'Islanda', 'Cina', 'Italia', 'Italia', 'Grecia', 'Atletico de Madrid', 'Atletico de Madrid', 'AC Milan', 'Francia', 'Francia', 'Italia', 'Londra Heathrow', 'Londra Heathrow', 'Tokyo Haneda', 'Berlusconi IV', 'Craxi I', 'Berlusconi IV', 'Veneto', 'Veneto', 'Friuli-Venezia-Giulia', 'ENI', 'Enel', 'Enel', 'Croazia', 'Croazia', 'Bulgaria', 'Zucchina', 'Zucchina', 'Melanzana', 'Louvre', 'Louvre', 'Musei vaticani', 'Lussemburgo', 'Lussemburgo', 'Bulgaria', 'Svizzera', 'Svizzera', 'Spagna', 'Mole Antonelliana', 'Mole Antonelliana', 'Atomium', 'Nigeria', 'Nigeria', 'Burkina Faso' ] #correct answers to questions in order of appearance ChoicesNumbers = {'q1a': [ ('Canada', '9,984,670'), ('USA', '9,372,610'), ('Cina', '9,706,961'), ], 'q1b': [('A', 'x'), ('B', 'y'),], # 'q1c': [...], } gain = 1 class Subsession(BaseSubsession): pass def creating_session(subsession): if subsession.round_number == 1: subsession.session.vars['strata_counts'] = {} class Group(BaseGroup): pass class Player(BasePlayer): q1a = models.StringField( label='Quale nazione è più estesa (km2)?', choices=[['Canada','Canada'],['USA','USA']], widget= widgets.RadioSelect, ) ansq1a = models.StringField(initial = '', ) q1b = models.StringField( label='Quale nazione è più estesa (km2)?', choices=[['Canada','Canada'],['Cina','Cina']], widget= widgets.RadioSelect, ) ansq1b = models.StringField(initial = '', ) q1c = models.StringField( label='Quale nazione è più estesa (km2)?', choices=[['USA','USA'],['Cina','Cina']], widget= widgets.RadioSelect, answers=[['Canada','9,984,670'],['USA','9,372,610'],['Cina','9,706,961']], ) ansq1c = models.StringField(initial = '', ) q2a = models.StringField( label='Quale nazione ha più abitanti?', choices=[['Belgio','Belgio'],['Romania','Romania']], widget= widgets.RadioSelect, ) ansq2a = models.StringField(initial = '', ) q2b = models.StringField( label='Quale nazione ha più abitanti?', choices=[['Belgio','Belgio'],['Paesi Bassi','Paesi Bassi']], widget= widgets.RadioSelect, ) ansq2b = models.StringField(initial = '', ) q2c = models.StringField( label='Quale nazione ha più abitanti?', choices=[['Romania','Romania'],['Paesi Bassi','Paesi Bassi']], widget= widgets.RadioSelect, ) ansq2c = models.StringField(initial = '', ) q3a = models.StringField( label='Quale azienda aveva più dipendenti nel 2023?', choices=[['Intesa Sanpaolo','Intesa Sanpaolo'],['Ferrovie dello Stato','Ferrovie dello Stato']], widget= widgets.RadioSelect, ) ansq3a = models.StringField(initial = '', ) q3b = models.StringField( label='Quale azienda aveva più dipendenti nel 2023?', choices=[['Intesa Sanpaolo','Intesa Sanpaolo'],['UniCredit','UniCredit']], widget= widgets.RadioSelect, ) ansq3b = models.StringField(initial = '', ) q3c = models.StringField( label='Quale azienda aveva più dipendenti nel 2023?', choices=[['Ferrovie dello Stato','Ferrovie dello Stato'],['UniCredit','UniCredit']], widget= widgets.RadioSelect, ) ansq3c = models.StringField(initial = '', ) q4a = models.StringField( label='Chi è nato prima?', choices=[['Aldo Moro','Aldo Moro'],['JF Kennedy','JF Kennedy']], widget= widgets.RadioSelect, ) ansq4a = models.StringField(initial = '', ) q4b = models.StringField( label='Chi è nato prima?', choices=[['Aldo Moro','Aldo Moro'],['Giulio Andreotti','Giulio Andreotti']], widget= widgets.RadioSelect, ) ansq4b = models.StringField(initial = '', ) q4c = models.StringField( label='Chi è nato prima?', choices=[['JF Kennedy','JF Kennedy'],['Giulio Andreotti','Giulio Andreotti']], widget= widgets.RadioSelect, ) ansq4c = models.StringField(initial = '', ) q5a = models.StringField( label='Quale stazione ferroviaria ha più binari?', choices=[['Milano Centrale','Milano Centrale'],['Roma Termini','Roma Termini']], widget= widgets.RadioSelect, ) ansq5a = models.StringField(initial = '', ) q5b = models.StringField( label='Quale stazione ferroviaria ha più binari?', choices=[['Milano Centrale','Milano Centrale'],['Bologna','Bologna']], widget= widgets.RadioSelect, ) ansq5b = models.StringField(initial = '', ) q5c = models.StringField( label='Quale stazione ferroviaria ha più binari?', choices=[['Roma Termini','Roma Termini'],['Bologna','Bologna']], widget= widgets.RadioSelect, ) ansq5c = models.StringField(initial = '', ) q6a = models.StringField( label='Quale nazione emette più CO2 (particelle contaminanti)?', choices=[['Islanda','Islanda'],['Cina','Cina']], widget= widgets.RadioSelect, ) ansq6a = models.StringField(initial = '', ) q6b = models.StringField( label='Quale nazione emette più CO2 (particelle contaminanti)?', choices=[['Islanda','Islanda'],['Germania','Germania']], widget= widgets.RadioSelect, ) ansq6b = models.StringField(initial = '', ) q6c = models.StringField( label='Quale nazione emette più CO2 (particelle contaminanti)?', choices=[['Cina','Cina'],['Germania','Germania']], widget= widgets.RadioSelect, ) ansq6c = models.StringField(initial = '', ) q7a = models.StringField( label='Quale nazione ha una maggiore disuguaglianza (GINI)?', choices=[['Italia','Italia'],['Ungheria','Ungheria']], widget= widgets.RadioSelect, ) ansq7a = models.StringField(initial = '', ) q7b = models.StringField( label='Quale nazione ha una maggiore disuguaglianza (GINI)?', choices=[['Italia','Italia'],['Grecia','Grecia']], widget= widgets.RadioSelect, ) ansq7b = models.StringField(initial = '', ) q7c = models.StringField( label='Quale nazione ha una maggiore disuguaglianza (GINI)?', choices=[['Ungheria','Ungheria'],['Grecia','Grecia']], widget= widgets.RadioSelect, ) ansq7c = models.StringField(initial = '', ) q8a = models.StringField( label='Quale squadra di calcio vale di più??', choices=[['Atletico de Madrid','Atletico de Madrid'],['AC Milan','AC Milan']], widget= widgets.RadioSelect, ) ansq8a = models.StringField(initial = '', ) q8b = models.StringField( label='Quale squadra di calcio vale di più??', choices=[['Atletico de Madrid','Atletico de Madrid'],['Inter','Inter']], widget= widgets.RadioSelect, ) ansq8b = models.StringField(initial = '', ) q8c = models.StringField( label='Quale squadra di calcio vale di più??', choices=[['AC Milan','AC Milan'],['Inter','Inter']], widget= widgets.RadioSelect, ) ansq8c = models.StringField(initial = '', ) q9a = models.StringField( label='Quale nazione ha vinto più medaglie (Olimpiadi 2024)?', choices=[['Francia','Francia'],['Italia','Italia']], widget= widgets.RadioSelect, ) ansq9a = models.StringField(initial = '', ) q9b = models.StringField( label='Quale nazione ha vinto più medaglie (Olimpiadi 2024)?', choices=[['Francia','Francia'],['Germania','Germania']], widget= widgets.RadioSelect, ) ansq9b = models.StringField(initial = '', ) q9c = models.StringField( label='Quale nazione ha vinto più medaglie (Olimpiadi 2024)?', choices=[['Italia','Italia'],['Germania','Germania']], widget= widgets.RadioSelect, ) ansq9c = models.StringField(initial = '', ) q10a = models.StringField( label='Quale aeroporto ha più passeggeri?', choices=[['Londra Heathrow','Londra Heathrow'],['Tokyo Haneda','Tokyo Haneda']], widget= widgets.RadioSelect, ) ansq10a = models.StringField(initial = '', ) q10b = models.StringField( label='Quale aeroporto ha più passeggeri?', choices=[['Londra Heathrow','Londra Heathrow'],['Parigi CDG','Parigi CDG']], widget= widgets.RadioSelect, ) ansq10b = models.StringField(initial = '', ) q10c = models.StringField( label='Quale aeroporto ha più passeggeri?', choices=[['Tokyo Haneda','Tokyo Haneda'],['Parigi CDG','Parigi CDG']], widget= widgets.RadioSelect, ) ansq10c = models.StringField(initial = '', ) q11a = models.StringField( label='Quale governo, nella storia della Repubblica Italiana, è rimasto in carica più a lungo (giorni)?', choices=[['Renzi','Renzi'],['Berlusconi IV','Berlusconi IV']], widget= widgets.RadioSelect, ) ansq11a = models.StringField(initial = '', ) q11b = models.StringField( label='Quale governo, nella storia della Repubblica Italiana, è rimasto in carica più a lungo (giorni)?', choices=[['Renzi','Renzi'],['Craxi I','Craxi I']], widget= widgets.RadioSelect, ) ansq11b = models.StringField(initial = '', ) q11c = models.StringField( label='Quale governo, nella storia della Repubblica Italiana, è rimasto in carica più a lungo (giorni)?', choices=[['Berlusconi IV','Berlusconi IV'],['Craxi I','Craxi I']], widget= widgets.RadioSelect, ) ansq11c = models.StringField(initial = '', ) q12a = models.StringField( label='Quale di queste regioni italiane ha il maggior numero di comuni?', choices=[['Veneto','Veneto'],['Friuli-Venezia-Giulia','Friuli-Venezia-Giulia']], widget= widgets.RadioSelect, ) ansq12a = models.StringField(initial = '', ) q12b = models.StringField( label='Quale di queste regioni italiane ha il maggior numero di comuni?', choices=[['Veneto','Veneto'],['Emilia-Romagna','Emilia-Romagna']], widget= widgets.RadioSelect, ) ansq12b = models.StringField(initial = '', ) q12c = models.StringField( label='Quale di queste regioni italiane ha il maggior numero di comuni?', choices=[['Friuli-Venezia-Giulia','Friuli-Venezia-Giulia'],['Emilia-Romagna','Emilia-Romagna']], widget= widgets.RadioSelect, ) ansq12c = models.StringField(initial = '', ) q13a = models.StringField( label='Quale di queste aziende ha avuto i ricavi più alti nel 2023?', choices=[['ENI','ENI'],['Generali','Generali']], widget= widgets.RadioSelect, ) ansq13a = models.StringField(initial = '', ) q13b = models.StringField( label='Quale di queste aziende ha avuto i ricavi più alti nel 2023?', choices=[['ENI','ENI'],['Enel','Enel']], widget= widgets.RadioSelect, ) ansq13b = models.StringField(initial = '', ) q13c = models.StringField( label='Quale di queste aziende ha avuto i ricavi più alti nel 2023?', choices=[['Generali','Generali'],['Enel','Enel']], widget= widgets.RadioSelect, ) ansq13c = models.StringField(initial = '', ) q14a = models.StringField( label='Quale nazione ha più detenuti (per 100.000 abitanti)?', choices=[['Croazia','Croazia'],['Bulgaria','Bulgaria']], widget= widgets.RadioSelect, ) ansq14a = models.StringField(initial = '', ) q14b = models.StringField( label='Quale nazione ha più detenuti (per 100.000 abitanti)?', choices=[['Croazia','Croazia'],['Austria','Austria']], widget= widgets.RadioSelect, ) ansq14b = models.StringField(initial = '', ) q14c = models.StringField( label='Quale nazione ha più detenuti (per 100.000 abitanti)?', choices=[['Bulgaria','Bulgaria'],['Austria','Austria']], widget= widgets.RadioSelect, ) ansq14c = models.StringField(initial = '', ) q15a = models.StringField( label='Quale alimento ha più calorie (per 100g)?', choices=[['Zucchina','Zucchina'],['Melanzana','Melanzana']], widget= widgets.RadioSelect, ) ansq15a = models.StringField(initial = '', ) q15b = models.StringField( label='Quale alimento ha più calorie (per 100g)?', choices=[['Zucchina','Zucchina'],['Cetriolo','Cetriolo']], widget= widgets.RadioSelect, ) ansq15b = models.StringField(initial = '', ) q15c = models.StringField( label='Quale alimento ha più calorie (per 100g)?', choices=[['Melanzana','Melanzana'],['Cetriolo','Cetriolo']], widget= widgets.RadioSelect, ) ansq15c = models.StringField(initial = '', ) q16a = models.StringField( label='Quale museo è più grande (m2)?', choices=[['Louvre','Louvre'],['Musei vaticani','Musei vaticani']], widget= widgets.RadioSelect, ) ansq16a = models.StringField(initial = '', ) q16b = models.StringField( label='Quale museo è più grande (m2)?', choices=[['Louvre','Louvre'],['British Museum','British Museum']], widget= widgets.RadioSelect, ) ansq16b = models.StringField(initial = '', ) q16c = models.StringField( label='Quale museo è più grande (m2)?', choices=[['Musei vaticani','Musei vaticani'],['British Museum','British Museum']], widget= widgets.RadioSelect, ) ansq16c = models.StringField(initial = '', ) q17a = models.StringField( label='Quale nazione è più antica (in base all\'anno di indipendenza)?', choices=[['Lussemburgo','Lussemburgo'],['Norvegia','Norvegia']], widget= widgets.RadioSelect, ) ansq17a = models.StringField(initial = '', ) q17b = models.StringField( label='Quale nazione è più antica (in base all\'anno di indipendenza)?', choices=[['Lussemburgo','Lussemburgo'],['Bulgaria','Bulgaria']], widget= widgets.RadioSelect, ) ansq17b = models.StringField(initial = '', ) q17c = models.StringField( label='Quale nazione è più antica (in base all\'anno di indipendenza)?', choices=[['Norvegia','Norvegia'],['Bulgaria','Bulgaria']], widget= widgets.RadioSelect, ) ansq17c = models.StringField(initial = '', ) q18a = models.StringField( label='Quale di queste nazioni ha la speranza di vita media alla nascita più alta?', choices=[['Svizzera','Svizzera'],['Spagna','Spagna']], widget= widgets.RadioSelect, answers=[['']], ) ansq18a = models.StringField(initial = '', ) q18b = models.StringField( label='Quale di queste nazioni ha la speranza di vita media alla nascita più alta?', choices=[['Svizzera','Svizzera'],['Svezia','Svezia']], widget= widgets.RadioSelect, ) ansq18b = models.StringField(initial = '', ) q18c = models.StringField( label='Quale di queste nazioni ha la speranza di vita media alla nascita più alta?', choices=[['Spagna','Spagna'],['Svezia','Svezia']], widget= widgets.RadioSelect, ) ansq18c = models.StringField(initial = '', ) q19a = models.StringField( label='Quale di questi famosi monumenti è il più alto (m)?', choices=[['Mole Antonelliana','Mole Antonelliana'],['Big Ben','Big Ben']], widget= widgets.RadioSelect, answers=[['']], ) ansq19a = models.StringField(initial = '', ) q19b = models.StringField( label='Quale di questi famosi monumenti è il più alto (m)?', choices=[['Mole Antonelliana','Mole Antonelliana'],['Atomium','Atomium']], widget= widgets.RadioSelect, ) ansq19b = models.StringField(initial = '', ) q19c = models.StringField( label='Quale di questi famosi monumenti è il più alto (m)?', choices=[['Big Ben','Big Ben'],['Atomium','Atomium']], widget= widgets.RadioSelect, ) ansq19c = models.StringField(initial = '', ) q20a = models.StringField( label='Quale nazione ha la percentuale più alta di analfabetismo?', choices=[['Nigeria','Nigeria'],['Burkina Faso','Burkina Faso']], widget= widgets.RadioSelect, ) ansq20a = models.StringField(initial = '', ) q20b = models.StringField( label='Quale nazione ha la percentuale più alta di analfabetismo?', choices=[['Nigeria','Nigeria'],['Somalia','Somalia']], widget= widgets.RadioSelect, ) ansq20b = models.StringField(initial = '', ) q20c = models.StringField( label='Quale nazione ha la percentuale più alta di analfabetismo?', choices=[['Burkina Faso','Burkina Faso'],['Somalia','Somalia']], widget= widgets.RadioSelect, ) ansq20c = models.StringField(initial = '', ) check1 = models.StringField( label = 'Nel rispondere alla seguente domanda, scelga "fragola" e sposti il cursore al 100%:
Quale frutto è più grande?', choices=[['Watermelon','Anguria'],['Strawberry','Fragola']], widget=widgets.RadioSelect, ) check2 = models.StringField( label = 'Nel rispondere alla seguente domanda, scelga "islandese" e sposti il cursore allo 0%:
Qual è la lingua più parlata al mondo?', choices=[['Icelandic','Islandese'],['Chinese','Cinese']], widget=widgets.RadioSelect, ) #Generate points received for each question: points1 = models.FloatField(initial=0) points2 = models.FloatField(initial=0) points3 = models.FloatField(initial=0) points4 = models.FloatField(initial=0) points5 = models.FloatField(initial=0) points6 = models.FloatField(initial=0) points7 = models.FloatField(initial=0) points8 = models.FloatField(initial=0) points9 = models.FloatField(initial=0) points10 = models.FloatField(initial=0) points11 = models.FloatField(initial=0) points12 = models.FloatField(initial=0) points13 = models.FloatField(initial=0) points14 = models.FloatField(initial=0) points15 = models.FloatField(initial=0) points16 = models.FloatField(initial=0) points17 = models.FloatField(initial=0) points18 = models.FloatField(initial=0) points19 = models.FloatField(initial=0) points20 = models.FloatField(initial=0) points21 = models.FloatField(initial=0) points22 = models.FloatField(initial=0) points23 = models.FloatField(initial=0) points24 = models.FloatField(initial=0) points25 = models.FloatField(initial=0) points26 = models.FloatField(initial=0) points27 = models.FloatField(initial=0) points28 = models.FloatField(initial=0) points29 = models.FloatField(initial=0) points30 = models.FloatField(initial=0) points31 = models.FloatField(initial=0) points32 = models.FloatField(initial=0) points33 = models.FloatField(initial=0) points34 = models.FloatField(initial=0) points35 = models.FloatField(initial=0) points36 = models.FloatField(initial=0) points37 = models.FloatField(initial=0) points38 = models.FloatField(initial=0) points39 = models.FloatField(initial=0) points40 = models.FloatField(initial=0) conf1 = models.IntegerField(min=0, max=100, initial=50) conf2 = models.IntegerField(min=0, max=100, initial=50) conf3 = models.IntegerField(min=0, max=100, initial=50) conf4 = models.IntegerField(min=0, max=100, initial=50) conf5 = models.IntegerField(min=0, max=100, initial=50) conf6 = models.IntegerField(min=0, max=100, initial=50) conf7 = models.IntegerField(min=0, max=100, initial=50) conf8 = models.IntegerField(min=0, max=100, initial=50) conf9 = models.IntegerField(min=0, max=100, initial=50) conf10 = models.IntegerField(min=0, max=100, initial=50) conf11 = models.IntegerField(min=0, max=100, initial=50) conf12 = models.IntegerField(min=0, max=100, initial=50) conf13 = models.IntegerField(min=0, max=100, initial=50) conf14 = models.IntegerField(min=0, max=100, initial=50) conf15 = models.IntegerField(min=0, max=100, initial=50) conf16 = models.IntegerField(min=0, max=100, initial=50) conf17 = models.IntegerField(min=0, max=100, initial=50) conf18 = models.IntegerField(min=0, max=100, initial=50) conf19 = models.IntegerField(min=0, max=100, initial=50) conf20 = models.IntegerField(min=0, max=100, initial=50) conf21 = models.IntegerField(min=0, max=100, initial=50)#,widget=widgets.SliderInput()) conf22 = models.IntegerField(min=0, max=100, initial=50) conf23 = models.IntegerField(min=0, max=100, initial=50) conf24 = models.IntegerField(min=0, max=100, initial=50) conf25 = models.IntegerField(min=0, max=100, initial=50) conf26 = models.IntegerField(min=0, max=100, initial=50) conf27 = models.IntegerField(min=0, max=100, initial=50) conf28 = models.IntegerField(min=0, max=100, initial=50) conf29 = models.IntegerField(min=0, max=100, initial=50) conf30 = models.IntegerField(min=0, max=100, initial=50) conf31 = models.IntegerField(min=0, max=100, initial=50)#,widget=widgets.SliderInput()) conf32 = models.IntegerField(min=0, max=100, initial=50) conf33 = models.IntegerField(min=0, max=100, initial=50) conf34 = models.IntegerField(min=0, max=100, initial=50) conf35 = models.IntegerField(min=0, max=100, initial=50) conf36 = models.IntegerField(min=0, max=100, initial=50) conf37 = models.IntegerField(min=0, max=100, initial=50) conf38 = models.IntegerField(min=0, max=100, initial=50) conf39 = models.IntegerField(min=0, max=100, initial=50) conf40 = models.IntegerField(min=0, max=100, initial=50) conf_check1 = models.IntegerField(min=0, max=100, initial=50) conf_check2 = models.IntegerField(min=0, max=100, initial=50) round1 = models.StringField( choices = [['A'],['B'],['C']] ) round2 = models.StringField( choices = [['A'],['B'],['C']] ) score = models.IntegerField(initial=0) ranked_beneficiaries = models.LongStringField( doc="JSON array (ordered) of beneficiary ids in order from most to least benefited" ) #Demograhic questions: livello_contratto = models.StringField( label = 'Qual è il livello indicato nel Suo contratto di lavoro?', choices = [['Operaio/a', 'Operaio/a'], ['Impiegato/a', 'Impiegato/a'], ['Quadro', 'Quadro'], ['Dirigente', 'Dirigente'], ['Non lo so', 'Non lo so/Non applicabile']], widget = widgets.RadioSelect ) gender = models.StringField( label = 'Con quale genere si identifica?', choices = [['man', 'Uomo'], ['woman', 'Donna'], ['N/A', 'Altro/Preferisco non risponde']], widget = widgets.RadioSelect ) kids = models.StringField( label = 'Quanti figli ha?', choices = [['0','0'], ['1', '1'], ['2', '2'], ['3 or more', '3 o più']], widget = widgets.RadioSelect ) young_kid_age = models.IntegerField( label = 'In che anno è nato/a il/la Suo/a figlio/a più piccolo/a?', choices=range(1976, 2027), blank=True ) old_kid_age = models.IntegerField( label = 'In che anno è nato/a il/la Suo/a figlio/a più grande?', choices=range(1976, 2027), blank=True ) employed = models.StringField( label = 'Qual è la Sua attuale condizione occupazionale?', choices= [['Full-time employed','Lavoratore/lavoratrice dipendente a tempo pieno'], ['Part-time employed','Lavoratore/lavoratrice dipendente part-time'],['Self-employed or freelancer worker','Lavoratore/lavoratrice autonomo/a'],['Unemployed','Disoccupato/a (alla ricerca attiva di lavoro)'],['Homemaker','Casalingo/a'],['Student','Studente/ssa'],['Retired','Pensionato/a']] ) info_treat = models.IntegerField( choices = range(1, 5) ) text_seen = models.StringField() feedback1 = models.LongStringField( label = 'Alcune domande erano poco chiare o fonte di confusione?', blank = True ) feedback2 = models.LongStringField( label = 'Ha riscontrato problemi tecnici?', blank = True ) feedback3 = models.LongStringField( label = 'Ha suggerimenti per migliorare il questionario?', blank = True ) screened_out = models.BooleanField() fullscreen_popup_log = models.LongStringField(blank=True) end_word = models.StringField(choices = [['a','a'],['o','o']]) # FUNCTIONS def screening_out(player): if player.gender == 'N/A' or player.employed == 'Unemployed' or player.employed == 'Homemaker' or player.employed == 'Student' or player.employed == 'Retired': player.screened_out = True else: player.screened_out = False def set_payoffs(player): #sum the points received over all questions total_points = sum(getattr(player, f'points{i}') for i in range(1,41)) player.score = int(total_points) player.participant.payoff = cu(player.score) def set_rounds(player): options = ['A', 'B', 'C'] player.round1 = random.choice(options) remaining = [x for x in options if x != player.round1] player.round2 = random.choice(remaining) def kids_bucket(n): if n == '0': return 0 else: return 1 def assign_balanced_treatment(player): session = player.session strata_counts = session.vars['strata_counts'] stratum = (player.gender, kids_bucket(player.kids)) # initialize counts for this stratum if stratum not in strata_counts: strata_counts[stratum] = {1: 0, 2: 0, 3: 0, 4: 0} counts = strata_counts[stratum] min_count = min(counts.values()) # choose randomly among least-filled treatments candidates = [t for t, c in counts.items() if c == min_count] treat = random.choice(candidates) player.info_treat = treat # update counter strata_counts[stratum][treat] += 1 if player.info_treat == 1: player.text_seen = '

Queste informazioni possono aiutare gli studenti a prendere decisioni di carriera consapevoli grazie a esempi concreti e consigli pratici.

Condividere la Sua esperienza professionale può apportare un beneficio significativo all\'intera professione, contribuendo a far sì che la prossima generazione di professionisti sia ben preparata e dotata delle conoscenze e competenze necessarie per avere successo.

Qualora lo desideri, condivideremo il nome della Sua azienda/organizzazione. Pertanto, condividere la Sua esperienza professionale può anche avvantaggiare la Sua azienda/organizzazione aumentandone la visibilità tra i futuri lavoratori.

' elif player.info_treat == 2: player.text_seen = '

Condividere la Sua esperienza professionale può apportare un beneficio significativo all\'intera professione, contribuendo a far sì che la prossima generazione di professionisti sia ben preparata e dotata delle conoscenze e competenze necessarie per avere successo.

Qualora lo desideri, condivideremo il nome della Sua azienda/organizzazione. Pertanto, condividere la Sua esperienza professionale può anche avvantaggiare la Sua azienda/organizzazione aumentandone la visibilità tra i futuri lavoratori.

' elif player.info_treat == 3: player.text_seen = '

Queste informazioni possono aiutare gli studenti a prendere decisioni di carriera consapevoli grazie a esempi concreti e consigli pratici.

Qualora lo desideri, condivideremo il nome della Sua azienda/organizzazione. Pertanto, condividere la Sua esperienza professionale può anche avvantaggiare la Sua azienda/organizzazione aumentandone la visibilità tra i futuri lavoratori.

' else: player.text_seen = '

Queste informazioni possono aiutare gli studenti a prendere decisioni di carriera consapevoli grazie a esempi concreti e consigli pratici.

Condividere la Sua esperienza professionale può apportare un beneficio significativo all\'intera professione, contribuendo a far sì che la prossima generazione di professionisti sia ben preparata e dotata delle conoscenze e competenze necessarie per avere successo.

' # PAGES class Welcome(Page): form_model = 'player' @staticmethod def before_next_page(player: Player, timeout_happened): set_rounds(player) class survey(Page): form_model = 'player' form_fields = ['gender','kids','young_kid_age','old_kid_age','employed','livello_contratto','fullscreen_popup_log'] def error_message(player, values): if values['kids'] != '0' and not values['young_kid_age']: return "Inserisca l'anno di nascita del suo figlio più giovane." if values['kids'] not in ['0', '1'] and not values['old_kid_age']: return "Inserisca l'anno di nascita del suo figlio più grande." if values['kids'] not in ['0', '1'] and values['young_kid_age'] < values['old_kid_age']: return "L'anno di nascita del suo figlio maggiore deve precedere quello del figlio più giovane." @staticmethod def before_next_page(player, timeout_happened): if player.gender == "woman": player.end_word = "a" else: player.end_word = "o" assign_balanced_treatment(player) screening_out(player) class EndScreenedOut(Page): form_model = 'player' def is_displayed(player): return player.screened_out==True def js_vars(player): return dict(screenout_url=C.URL_SCREENEDOUT) class Test1A(Page): form_model = 'player' form_fields = [f'q{i}a' for i in range(1, 21)] + [f'conf{i}' for i in range(1, 21)] + ['check1','conf_check1','fullscreen_popup_log'] def is_displayed(player): return player.round1=='A' @staticmethod def before_next_page(player: Player, timeout_happened): for i, answer in enumerate(C.Answer[0::3], start=1): # Get player's answer player_response = getattr(player, f'q{i}a') # Check whether player's answer is correct if player_response == answer: setattr(player, f'points{i}', C.gain) class Test1B(Page): form_model = 'player' form_fields = [f'q{i}b' for i in range(1, 21)] + [f'conf{i}' for i in range(1, 21)] + ['check1','conf_check1','fullscreen_popup_log'] def is_displayed(player): return player.round1=='B' @staticmethod def before_next_page(player: Player, timeout_happened): for i, answer in enumerate(C.Answer[1::3], start=1): # Get player's answer player_response = getattr(player, f'q{i}b') # Check whether player's answer is correct if player_response == answer: setattr(player, f'points{i}', C.gain) class Test1C(Page): form_model = 'player' form_fields = [f'q{i}c' for i in range(1, 21)] + [f'conf{i}' for i in range(1, 21)] + ['check1','conf_check1','fullscreen_popup_log'] def is_displayed(player): return player.round1=='C' @staticmethod def before_next_page(player: Player, timeout_happened): for i, answer in enumerate(C.Answer[2::3], start=1): # Get player's answer player_response = getattr(player, f'q{i}c') # Check whether player's answer is correct if player_response == answer: setattr(player, f'points{i}', C.gain) class Test2A(Page): form_model = 'player' form_fields = [f'q{i}a' for i in range(1, 21)] + [f'conf{i}' for i in range(21, 41)] + ['check2','conf_check2','fullscreen_popup_log'] def is_displayed(player): return player.round2=='A' @staticmethod def before_next_page(player: Player, timeout_happened): for i, answer in enumerate(C.Answer[0::3], start=1): # Get player's answer player_response = getattr(player, f'q{i}a') # Check whether player's answer is correct if player_response == answer: setattr(player, f'points{20+i}', C.gain) set_payoffs(player) class Test2B(Page): form_model = 'player' form_fields = [f'q{i}b' for i in range(1, 21)] + [f'conf{i}' for i in range(21, 41)] + ['check2','conf_check2','fullscreen_popup_log'] def is_displayed(player): return player.round2=='B' @staticmethod def before_next_page(player: Player, timeout_happened): for i, answer in enumerate(C.Answer[1::3], start=1): # Get player's answer player_response = getattr(player, f'q{i}b') # Check whether player's answer is correct if player_response == answer: setattr(player, f'points{20+i}', C.gain) set_payoffs(player) class Test2C(Page): form_model = 'player' form_fields = [f'q{i}c' for i in range(1, 21)] + [f'conf{i}' for i in range(21, 41)] + ['check2','conf_check2','fullscreen_popup_log'] def is_displayed(player): return player.round2=='C' @staticmethod def before_next_page(player: Player, timeout_happened): for i, answer in enumerate(C.Answer[2::3], start=1): # Get player's answer player_response = getattr(player, f'q{i}c') # Check whether player's answer is correct if player_response == answer: setattr(player, f'points{20+i}', C.gain) set_payoffs(player) class RankBeneficiaries(Page): form_model = 'player' form_fields = ['ranked_beneficiaries','fullscreen_popup_log'] # hidden input will populate this def vars_for_template(self): # list of (id, label) - id must be unique and stable items = [ ("students", "Gli studenti che leggono tali informazioni"), ("organization", "La mia azienda/organizzazione"), ("profession", "La mia professione"), ("family", "Io e la mia famiglia"), ("retired", "I cittadini in pensione"), ] return {'items': items} class EndSurvey(Page): form_model = 'player' form_fields = ['feedback1','feedback2','feedback3','fullscreen_popup_log'] class Payment(Page): form_model = 'player' @staticmethod def get_form_fields(player: Player): r1 = player.round1 r2 = player.round2 if r1 == 'A' and r2 == 'B': return [f'q{i}{letter}' for letter in ('a', 'b') for i in range(1, 21)] if r1 == 'A' and r2 == 'C': return [f'q{i}{letter}' for letter in ('a', 'c') for i in range(1, 21)] if r1 == 'B' and r2 == 'A': return [f'q{i}{letter}' for letter in ('b', 'a') for i in range(1, 21)] if r1 == 'B' and r2 == 'C': return [f'q{i}{letter}' for letter in ('b', 'c') for i in range(1, 21)] if r1 == 'C' and r2 == 'A': return [f'q{i}{letter}' for letter in ('c', 'a') for i in range(1, 21)] if r1 == 'C' and r2 == 'B': return [f'q{i}{letter}' for letter in ('c', 'b') for i in range(1, 21)] @staticmethod def vars_for_template(player: Player): questions = [] fields = Payment.get_form_fields(player) for name in fields: field_def = getattr(Player, name) ans_name = 'ans' + name for i in range(1,21): if name == f'q{i}a' and player.round1 == 'A': correct = getattr(player, f'points{i}') if correct == 1: check = '✅' #checkmark if correct else: check = '❌' #cross mark otherwise elif name == f'q{i}b' and player.round1 == 'B': correct = getattr(player, f'points{i}') if correct == 1: check = '✅' else: check = '❌' elif name == f'q{i}c' and player.round1 == 'C': correct = getattr(player, f'points{i}') if correct == 1: check = '✅' else: check = '❌' for i in range(1,21): if name == f'q{i}a' and player.round2 == 'A': correct = getattr(player, f'points{i+20}') if correct == 1: check = '✅' else: check = '❌' elif name == f'q{i}b' and player.round2 == 'B': correct = getattr(player, f'points{i+20}') if correct == 1: check = '✅' else: check = '❌' elif name == f'q{i}c' and player.round2 == 'C': correct = getattr(player, f'points{i+20}') if correct == 1: check = '✅' else: check = '❌' questions.append(dict( name=name, label=field_def.label, # same as label= in question form value=getattr(player, name), # player's answer ans = getattr(player, ans_name), #answers check = check #add checkmark when correct )) return dict(questions=questions) def js_vars(player): return dict(redirect_url=C.Redirect_URL) page_sequence = [Welcome, survey, EndScreenedOut, Test1A, Test1B, Test1C, Test2A, Test2B, Test2C, RankBeneficiaries, EndSurvey, Payment]