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 =
'
- Canada: 9,984,670 km2
- USA: 9,372,610 km2
',
)
q1b = models.StringField(
label='Quale nazione è più estesa (km2)?',
choices=[['Canada','Canada'],['Cina','Cina']],
widget= widgets.RadioSelect,
)
ansq1b = models.StringField(initial =
'- Canada: 9,984,670 km2
- Cina: 9,706,961 km2
',
)
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 =
'- USA: 9,372,610 km2
- Cina: 9,706,961 km2
',
)
q2a = models.StringField(
label='Quale nazione ha più abitanti?',
choices=[['Belgio','Belgio'],['Romania','Romania']],
widget= widgets.RadioSelect,
)
ansq2a = models.StringField(initial =
'- Belgio: 11,758,603
- Romania: 18,908,650
',
)
q2b = models.StringField(
label='Quale nazione ha più abitanti?',
choices=[['Belgio','Belgio'],['Paesi Bassi','Paesi Bassi']],
widget= widgets.RadioSelect,
)
ansq2b = models.StringField(initial =
'- Belgio: 11,758,603
- Paesi Bassi: 18,346,819
',
)
q2c = models.StringField(
label='Quale nazione ha più abitanti?',
choices=[['Romania','Romania'],['Paesi Bassi','Paesi Bassi']],
widget= widgets.RadioSelect,
)
ansq2c = models.StringField(initial =
'- Romania: 18,908,650
- Paesi Bassi: 18,346,819
',
)
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 =
'- Intesa Sanpaolo: 95,574
- Ferrovie dello Stato: 82,998
',
)
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 =
'- Intesa Sanpaolo: 95,574
- UniCredit: 75,040
',
)
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 =
'- Ferrovie dello Stato: 82,998
- UniCredit: 75,040
',
)
q4a = models.StringField(
label='Chi è nato prima?',
choices=[['Aldo Moro','Aldo Moro'],['JF Kennedy','JF Kennedy']],
widget= widgets.RadioSelect,
)
ansq4a = models.StringField(initial =
'- Aldo Moro: 1916
- JF Kennedy: 1917
',
)
q4b = models.StringField(
label='Chi è nato prima?',
choices=[['Aldo Moro','Aldo Moro'],['Giulio Andreotti','Giulio Andreotti']],
widget= widgets.RadioSelect,
)
ansq4b = models.StringField(initial =
'- Aldo Moro: 1916
- Giulio Andreotti: 1919
',
)
q4c = models.StringField(
label='Chi è nato prima?',
choices=[['JF Kennedy','JF Kennedy'],['Giulio Andreotti','Giulio Andreotti']],
widget= widgets.RadioSelect,
)
ansq4c = models.StringField(initial =
'- JF Kennedy: 1917
- Giulio Andreotti: 1919
',
)
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 =
'- Milano Centrale: 24
- Roma Termini: 32
',
)
q5b = models.StringField(
label='Quale stazione ferroviaria ha più binari?',
choices=[['Milano Centrale','Milano Centrale'],['Bologna','Bologna']],
widget= widgets.RadioSelect,
)
ansq5b = models.StringField(initial =
'- Milano Centrale: 24
- Bologna: 28
',
)
q5c = models.StringField(
label='Quale stazione ferroviaria ha più binari?',
choices=[['Roma Termini','Roma Termini'],['Bologna','Bologna']],
widget= widgets.RadioSelect,
)
ansq5c = models.StringField(initial =
'- Roma Termini: 32
- Bologna: 28
',
)
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 =
'- Islanda: 9.36
- Germania: 8.01
',
)
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 =
'- Italia: 32.2
- Ungheria: 27.6
',
)
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 =
'- Ungheria: 27.6
- Grecia: 31.8
',
)
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 =
'- Atletico de Madrid: 1.7B
- AC Milan: 1.5B
',
)
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 =
'- Atletico de Madrid: 1.7B
- Inter: 1.15B
',
)
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 =
'- AC Milan: 1.5B
- Inter: 1.15B
',
)
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 =
'- Londra Heathrow: 79M+
- Tokyo Haneda: 78M+
',
)
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 =
'- Londra Heathrow: 79M+
- Parigi CDG: 72M+
',
)
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 =
'- Tokyo Haneda: 78M+
- Parigi CDG: 72M+
',
)
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 =
'- Renzi: 1019
- Berlusconi IV: 1283
',
)
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 =
'- Berlusconi IV: 1283
- Craxi I: 1058
',
)
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 =
'- Veneto: 337
- Friuli-Venezia-Giulia: 330
',
)
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 =
'- Veneto: 337
- Emilia-Romagna: 305
',
)
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 =
'- Friuli-Venezia-Giulia: 330
- Emilia-Romagna: 305
',
)
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 =
'- ENI: 140,607 USD M
- Generali: 85,750 USD M
',
)
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 =
'- ENI: 140,607 USD M
- Enel: 147,790 USD M
',
)
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 =
'- Generali: 85,750 USD M
- Enel: 147,790 USD M
',
)
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 =
'- Croazia: 106
- Bulgaria: 101
',
)
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 =
'- Bulgaria: 101
- Austria: 100
',
)
q15a = models.StringField(
label='Quale alimento ha più calorie (per 100g)?',
choices=[['Zucchina','Zucchina'],['Melanzana','Melanzana']],
widget= widgets.RadioSelect,
)
ansq15a = models.StringField(initial =
'- Zucchina: 23
- Melanzana: 20
',
)
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 =
'- Melanzana: 20
- Cetriolo: 14
',
)
q16a = models.StringField(
label='Quale museo è più grande (m2)?',
choices=[['Louvre','Louvre'],['Musei vaticani','Musei vaticani']],
widget= widgets.RadioSelect,
)
ansq16a = models.StringField(initial =
'- Louvre: 72,735
- Musei vaticani: 43,000
',
)
q16b = models.StringField(
label='Quale museo è più grande (m2)?',
choices=[['Louvre','Louvre'],['British Museum','British Museum']],
widget= widgets.RadioSelect,
)
ansq16b = models.StringField(initial =
'- Louvre: 72,735
- British Museum: 22,500
',
)
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 =
'- Musei vaticani: 43,000
- British Museum: 22,500
',
)
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 =
'- Lussemburgo: 1839
- Norvegia: 1903
',
)
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 =
'- Lussemburgo: 1839
- Bulgaria: 1878
',
)
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 =
'- Norvegia: 1903
- Bulgaria: 1878
',
)
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 =
'- Svizzera: 84.23
- Spagna: 83.96
',
)
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 =
'- Svizzera: 84.23
- Svezia: 83.58
',
)
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 =
'- Spagna: 83.96
- Svezia: 83.58
',
)
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 =
'- Mole Antonelliana: 167,5
- Big Ben: 96
',
)
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 =
'- Mole Antonelliana: 167,5
- Atomium: 102
',
)
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 =
'- Nigeria: 64,4%
- Burkina Faso: 59,1%
',
)
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 =
'- Nigeria: 64,4%
- Somalia: 46%
',
)
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 =
'- Burkina Faso: 59,1%
- Somalia: 46%
',
)
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]