from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) doc = """ author = 'Wael Bousselmi' Exp E4C """ class Constants(BaseConstants): name_in_url = 'a5_questfin' players_per_group = None num_rounds = 1 app_seq1 = ["gp", "bw", "MDG_asso", "MDG_class"] app_seq2 = ["gp", "bw", "MDG_class", "MDG_asso"] app_seq3 = ["bw", "gp", "MDG_asso", "MDG_class"] app_seq4 = ["bw", "gp", "MDG_class", "MDG_asso"] exchangerate_gp_bw = 0.8 exchangerate_DGM = 0.1 showupfee = 5 instructions_GP_template = 'a5_questfin/instructions_gp.html' instructions_bw_template = 'a5_questfin/instructions_bw.html' instructions_DCL_template = 'a5_questfin/instructions_dcl.html' instructions_DAS_template = 'a5_questfin/instructions_das.html' instructions_colors_template = 'a5_questfin/instructions_colors.html' class Subsession(BaseSubsession): def vars_for_admin_report(self): report = list() for p in self.get_players(): report.append(dict( gainrisk_eur = p.field_maybe_none('gainrisk_eur') or 0.0, gain_bw_eur = p.field_maybe_none('gain_bw_eur') or 0.0, mdgasso_gain_dgm_eur = p.field_maybe_none('mdgasso_gain_dgm_eur') or 0.0, mdgasso_gain_asso_eur = p.field_maybe_none('mdgasso_gain_asso_eur') or 0.0, mdgclass_gain_dgm_eur = p.field_maybe_none('mdgclass_gain_dgm_eur') or 0.0, mdgclass_dgm_selected = p.field_maybe_none('mdgclass_dgm_selected') or 0, mdgclass_round_selected = p.field_maybe_none('mdgclass_round_selected') or 0, mdgclass_dot1_select = p.field_maybe_none('mdgclass_dot1_select') or 0, mdgclass_s1_select = p.field_maybe_none('mdgclass_s1_select') or 0, mdgclass_g1_select = p.field_maybe_none('mdgclass_g1_select') or 0, mdgclass_keep_select = p.field_maybe_none('mdgclass_keep_select') or 0, mdgclass_sent_select = p.field_maybe_none('mdgclass_sent_select') or 0, mdgclass_gain_joueur2 = p.field_maybe_none('mdgclass_gain_joueur2') or 0.0, mdgclass_gain_joueur2_eur = p.field_maybe_none('mdgclass_gain_joueur2_eur') or 0.0, dictatorYES = p.field_maybe_none('dictatorYES') or False, app_sequence_select_n = p.field_maybe_none('app_sequence_select_n') or 0, game_num_select = p.field_maybe_none('game_num_select') or 0, firstname = p.field_maybe_none('firstname') or "", lastname = p.field_maybe_none('lastname') or "", email = p.field_maybe_none('email') or "", room = p.field_maybe_none('room') or "", game_select_n = p.field_maybe_none('room') or "", gainfinal_eur_f = p.field_maybe_none('gainfinal_eur_f') or 0.0, gainfinal_eur_showupfee_f2025 = p.field_maybe_none('gainfinal_eur_showupfee_f2025') or 0.0, gainfinal_asso_eur_f = p.field_maybe_none('gainfinal_asso_eur_f') or 0.0, )) return dict(report=report) class Group(BaseGroup): pass class Player(BasePlayer): app_sequence_select = models.IntegerField(blank=True, null=True) app_sequence_select_n = models.StringField(blank=True, null=True) questionnaire_before = models.IntegerField(blank=True, null=True) game_num_select = models.IntegerField(blank=True, null=True) game_select_n = models.StringField(blank=True, null=True) game_select = models.IntegerField(blank=True, null=True) # result of GP tirageriskresult = models.StringField(blank=True, null=True) tirageriskresult_en = models.StringField(blank=True, null=True) risk11_a = models.FloatField(blank=True, null=True) risk11_b = models.FloatField(blank=True, null=True) gainrisk = models.FloatField(blank=True, null=True) gainrisk_eur = models.FloatField(blank=True, null=True) # result of BW tirage_color_n = models.StringField(blank=True, null=True) gain_bw = models.FloatField(blank=True, null=True) gain_bw_eur = models.FloatField(blank=True, null=True) # result of MDG_asso mdgasso_dgm_selected = models.IntegerField(blank=True, null=True) mdgasso_round_selected = models.IntegerField(blank=True, null=True) mdgasso_dot1_select = models.IntegerField(blank=True, null=True) mdgasso_s1_select = models.IntegerField(blank=True, null=True) mdgasso_g1_select = models.IntegerField(blank=True, null=True) mdgasso_keep_select = models.FloatField(blank=True, null=True) mdgasso_sent_select = models.FloatField(blank=True, null=True) mdgasso_gain_dgm = models.FloatField(blank=True, null=True) mdgasso_gain_asso = models.FloatField(blank=True, null=True) mdgasso_gain_dgm_eur = models.FloatField(blank=True, null=True) mdgasso_gain_asso_eur = models.FloatField(blank=True, null=True) # result of MDG_classique mdgclass_dgm_selected = models.IntegerField(blank=True, null=True) mdgclass_round_selected = models.IntegerField(blank=True, null=True) mdgclass_dot1_select = models.IntegerField(blank=True, null=True) mdgclass_s1_select = models.IntegerField(blank=True, null=True) mdgclass_g1_select = models.IntegerField(blank=True, null=True) mdgclass_keep_select = models.FloatField(blank=True, null=True) mdgclass_sent_select = models.FloatField(blank=True, null=True) mdgclass_gain_dgm = models.FloatField(blank=True, null=True) mdgclass_gain_joueur2 = models.FloatField(blank=True, null=True) mdgclass_gain_dgm_eur = models.FloatField(blank=True, null=True) mdgclass_gain_joueur2_eur = models.FloatField(blank=True, null=True) dictatorYES = models.IntegerField(blank=True, null=True) dictatorYES_n = models.StringField(blank=True, null=True) # new 2025 # g1_easy_to_understand = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) # g1_involves_risk = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) # g1_annoying_boring = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) # # g2_easy_to_understand = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) # g2_involves_risk = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) # g2_annoying_boring = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) # # g3_easy_to_understand = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) # g3_involves_altruism = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) # g3_annoying_boring = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) # # g4_easy_to_understand = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) # g4_involves_altruism = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) # g4_annoying_boring = models.IntegerField( # choices=[(1, 'Strongly Disagree'), (2, 'Disagree'), (3, 'Neutral'), (4, 'Agree'), (5, 'Strongly Agree')], # label="", # blank=False # ) crt1 = models.FloatField( label="", blank=True ) # Correct Answer: 5. crt2 = models.FloatField( label="", blank=True ) # Correct Answer: 5 crt3 = models.FloatField( label="", blank=True ) # Correct Answer: 47 gain_crt = models.IntegerField() # demographic quetsionnaire q_40_etude = models.IntegerField( choices=[ [1, '1- Arts and / or literature'], [2, '2- Economy and / or management'], [3, '3- Scientific / engineering'], [4, '4- Other'], ], widget=widgets.RadioSelect, label="a. Your field of study ", blank=False ) q_41_gender = models.IntegerField( choices=[ [1, '1- Woman'], [2, '2- Male'], [3, '3- Non-binary'], [4, '4- Do not wish to answer'], ], widget=widgets.RadioSelect, label="b. You are ", blank=False ) q_42_age = models.IntegerField( label="c. How old are you?", blank=False, min=15, max=100, ) q_43_nationalite = models.IntegerField( choices=[ [1, "Afghanistan"], [2, "Albania"], [3, "Algeria"], [4, "Andorra"], [5, "Angola"], [6, "Antigua and Barbuda"], [7, "Argentina"], [8, "Armenia"], [9, "Australia"], [10, "Austria"], [11, "Azerbaijan"], [12, "Bahamas"], [13, "Bahrain"], [14, "Bangladesh"], [15, "Barbados"], [16, "Belarus"], [17, "Belgium"], [18, "Belize"], [19, "Benin"], [20, "Bhutan"], [21, "Bolivia"], [22, "Bosnia and Herzegovina"], [23, "Botswana"], [24, "Brazil"], [25, "Brunei Darussalam"], [26, "Bulgaria"], [27, "Burkina Faso"], [28, "Burundi"], [29, "Cambodia"], [30, "Cameroon"], [31, "Canada"], [32, "Cape Verde"], [33, "Central African Republic"], [34, "Chad"], [35, "Chile"], [36, "China"], [37, "Colombia"], [38, "Comoros"], [39, "Congo, Republic of the..."], [40, "Costa Rica"], [41, "Côte d'Ivoire"], [42, "Croatia"], [43, "Cuba"], [44, "Cyprus"], [45, "Czech Republic"], [46, "Democratic People's Republic of Korea"], [47, "Democratic Republic of the Congo"], [48, "Denmark"], [49, "Djibouti"], [50, "Dominica"], [51, "Dominican Republic"], [52, "Ecuador"], [53, "Egypt"], [54, "El Salvador"], [55, "Equatorial Guinea"], [56, "Eritrea"], [57, "Estonia"], [58, "Ethiopia"], [59, "Fiji"], [60, "Finland"], [61, "France"], [62, "Gabon"], [63, "Gambia"], [64, "Georgia"], [65, "Germany"], [66, "Ghana"], [67, "Greece"], [68, "Grenada"], [69, "Guatemala"], [70, "Guinea"], [71, "Guinea-Bissau"], [72, "Guyana"], [73, "Haiti"], [74, "Honduras"], [75, "Hong Kong (S.A.R.)"], [76, "Hungary"], [77, "Iceland"], [78, "India"], [79, "Indonesia"], [80, "Iran, Islamic Republic of..."], [81, "Iraq"], [82, "Ireland"], [83, "Israel"], [84, "Italy"], [85, "Jamaica"], [86, "Japan"], [87, "Jordan"], [88, "Kazakhstan"], [89, "Kenya"], [90, "Kiribati"], [91, "Kuwait"], [92, "Kyrgyzstan"], [93, "Lao People's Democratic Republic"], [94, "Latvia"], [95, "Lebanon"], [96, "Lesotho"], [97, "Liberia"], [98, "Libyan Arab Jamahiriya"], [99, "Liechtenstein"], [100, "Lithuania"], [101, "Luxembourg"], [102, "Madagascar"], [103, "Malawi"], [104, "Malaysia"], [105, "Maldives"], [106, "Mali"], [107, "Malta"], [108, "Marshall Islands"], [109, "Mauritania"], [110, "Mauritius"], [111, "Mexico"], [112, "Micronesia, Federated States of..."], [113, "Monaco"], [114, "Mongolia"], [115, "Montenegro"], [116, "Morocco"], [117, "Mozambique"], [118, "Myanmar"], [119, "Namibia"], [120, "Nauru"], [121, "Nepal"], [122, "Netherlands"], [123, "New Zealand"], [124, "Nicaragua"], [125, "Niger"], [126, "Nigeria"], [127, "North Korea"], [128, "Norway"], [129, "Oman"], [130, "Pakistan"], [131, "Palau"], [132, "Panama"], [133, "Papua New Guinea"], [134, "Paraguay"], [135, "Peru"], [136, "Philippines"], [137, "Poland"], [138, "Portugal"], [139, "Qatar"], [140, "Republic of Korea"], [141, "Republic of Moldova"], [142, "Romania"], [143, "Russian Federation"], [144, "Rwanda"], [145, "Saint Kitts and Nevis"], [146, "Saint Lucia"], [147, "Saint Vincent and the Grenadines"], [148, "Samoa"], [149, "San Marino"], [150, "Sao Tome and Principe"], [151, "Saudi Arabia"], [152, "Senegal"], [153, "Serbia"], [154, "Seychelles"], [155, "Sierra Leone"], [156, "Singapore"], [157, "Slovakia"], [158, "Slovenia"], [159, "Solomon Islands"], [160, "Somalia"], [161, "South Africa"], [162, "South Korea"], [163, "Spain"], [164, "Sri Lanka"], [165, "Sudan"], [166, "Suriname"], [167, "Swaziland"], [168, "Sweden"], [169, "Switzerland"], [170, "Syrian Arab Republic"], [171, "Tajikistan"], [172, "Thailand"], [173, "The former Yugoslav Republic of Macedonia"], [174, "Timor-Leste"], [175, "Togo"], [176, "Tonga"], [177, "Trinidad and Tobago"], [178, "Tunisia"], [179, "Turkey"], [180, "Turkmenistan"], [181, "Tuvalu"], [182, "Uganda"], [183, "Ukraine"], [184, "United Arab Emirates"], [185, "United Kingdom of Great Britain and Northern Ireland"], [186, "United Republic of Tanzania"], [187, "United States of America"], [188, "Uruguay"], [189, "Uzbekistan"], [190, "Vanuatu"], [191, "Venezuela, Bolivarian Republic of..."], [192, "Viet Nam"], [193, "Yemen"], [194, "Zambia"], [195, "Zimbabwe"], ], blank=False, label="d. Country of citizenship", ) q_44_revenu = models.IntegerField( choices=[ [1, '1- Less than 5,000 Euros'], [2, '2- Between 5,000 and 10,000 Euros'], [3, '3- Between 10,000 and 15,000 Euros'], [4, '4- Between 15,000 and 20,000 Euros'], [5, '5- Between 20,000 and 25,000 Euros'], [6, '6- Greater than 25,000 Euros'], ], widget=widgets.RadioSelect, label="e. Please estimate your gross annual income (including your scholarships and student loan) in Euros. (Note: Your own income, not that of your parents)", blank=False ) q3_countries = models.IntegerField( choices=[ [1, "Afghanistan"], [2, "Albania"], [3, "Algeria"], [4, "Andorra"], [5, "Angola"], [6, "Antigua and Barbuda"], [7, "Argentina"], [8, "Armenia"], [9, "Australia"], [10, "Austria"], [11, "Azerbaijan"], [12, "Bahamas"], [13, "Bahrain"], [14, "Bangladesh"], [15, "Barbados"], [16, "Belarus"], [17, "Belgium"], [18, "Belize"], [19, "Benin"], [20, "Bhutan"], [21, "Bolivia"], [22, "Bosnia and Herzegovina"], [23, "Botswana"], [24, "Brazil"], [25, "Brunei Darussalam"], [26, "Bulgaria"], [27, "Burkina Faso"], [28, "Burundi"], [29, "Cambodia"], [30, "Cameroon"], [31, "Canada"], [32, "Cape Verde"], [33, "Central African Republic"], [34, "Chad"], [35, "Chile"], [36, "China"], [37, "Colombia"], [38, "Comoros"], [39, "Congo, Republic of the..."], [40, "Costa Rica"], [41, "Côte d'Ivoire"], [42, "Croatia"], [43, "Cuba"], [44, "Cyprus"], [45, "Czech Republic"], [46, "Democratic People's Republic of Korea"], [47, "Democratic Republic of the Congo"], [48, "Denmark"], [49, "Djibouti"], [50, "Dominica"], [51, "Dominican Republic"], [52, "Ecuador"], [53, "Egypt"], [54, "El Salvador"], [55, "Equatorial Guinea"], [56, "Eritrea"], [57, "Estonia"], [58, "Ethiopia"], [59, "Fiji"], [60, "Finland"], [61, "France"], [62, "Gabon"], [63, "Gambia"], [64, "Georgia"], [65, "Germany"], [66, "Ghana"], [67, "Greece"], [68, "Grenada"], [69, "Guatemala"], [70, "Guinea"], [71, "Guinea-Bissau"], [72, "Guyana"], [73, "Haiti"], [74, "Honduras"], [75, "Hong Kong (S.A.R.)"], [76, "Hungary"], [77, "Iceland"], [78, "India"], [79, "Indonesia"], [80, "Iran, Islamic Republic of..."], [81, "Iraq"], [82, "Ireland"], [83, "Israel"], [84, "Italy"], [85, "Jamaica"], [86, "Japan"], [87, "Jordan"], [88, "Kazakhstan"], [89, "Kenya"], [90, "Kiribati"], [91, "Kuwait"], [92, "Kyrgyzstan"], [93, "Lao People's Democratic Republic"], [94, "Latvia"], [95, "Lebanon"], [96, "Lesotho"], [97, "Liberia"], [98, "Libyan Arab Jamahiriya"], [99, "Liechtenstein"], [100, "Lithuania"], [101, "Luxembourg"], [102, "Madagascar"], [103, "Malawi"], [104, "Malaysia"], [105, "Maldives"], [106, "Mali"], [107, "Malta"], [108, "Marshall Islands"], [109, "Mauritania"], [110, "Mauritius"], [111, "Mexico"], [112, "Micronesia, Federated States of..."], [113, "Monaco"], [114, "Mongolia"], [115, "Montenegro"], [116, "Morocco"], [117, "Mozambique"], [118, "Myanmar"], [119, "Namibia"], [120, "Nauru"], [121, "Nepal"], [122, "Netherlands"], [123, "New Zealand"], [124, "Nicaragua"], [125, "Niger"], [126, "Nigeria"], [127, "North Korea"], [128, "Norway"], [129, "Oman"], [130, "Pakistan"], [131, "Palau"], [132, "Panama"], [133, "Papua New Guinea"], [134, "Paraguay"], [135, "Peru"], [136, "Philippines"], [137, "Poland"], [138, "Portugal"], [139, "Qatar"], [140, "Republic of Korea"], [141, "Republic of Moldova"], [142, "Romania"], [143, "Russian Federation"], [144, "Rwanda"], [145, "Saint Kitts and Nevis"], [146, "Saint Lucia"], [147, "Saint Vincent and the Grenadines"], [148, "Samoa"], [149, "San Marino"], [150, "Sao Tome and Principe"], [151, "Saudi Arabia"], [152, "Senegal"], [153, "Serbia"], [154, "Seychelles"], [155, "Sierra Leone"], [156, "Singapore"], [157, "Slovakia"], [158, "Slovenia"], [159, "Solomon Islands"], [160, "Somalia"], [161, "South Africa"], [162, "South Korea"], [163, "Spain"], [164, "Sri Lanka"], [165, "Sudan"], [166, "Suriname"], [167, "Swaziland"], [168, "Sweden"], [169, "Switzerland"], [170, "Syrian Arab Republic"], [171, "Tajikistan"], [172, "Thailand"], [173, "The former Yugoslav Republic of Macedonia"], [174, "Timor-Leste"], [175, "Togo"], [176, "Tonga"], [177, "Trinidad and Tobago"], [178, "Tunisia"], [179, "Turkey"], [180, "Turkmenistan"], [181, "Tuvalu"], [182, "Uganda"], [183, "Ukraine"], [184, "United Arab Emirates"], [185, "United Kingdom of Great Britain and Northern Ireland"], [186, "United Republic of Tanzania"], [187, "United States of America"], [188, "Uruguay"], [189, "Uzbekistan"], [190, "Vanuatu"], [191, "Venezuela, Bolivarian Republic of..."], [192, "Viet Nam"], [193, "Yemen"], [194, "Zambia"], [195, "Zimbabwe"], ], label="f. Country - previous accommodation", blank=False ) q_46_logement_ville = models.StringField( label="g. City - previous accommodation", blank=False ) q_31 = models.IntegerField() # nbre d'enfant q_47_residence = models.IntegerField( label="i. You currently live in:", choices=[ [1, 'Bâtiment 103'], [2, 'Another residence '], ], widget=widgets.RadioSelect, blank=False ) q_48_satisfaction = models.IntegerField( choices=[ [1, '1 - Very satisfied'], [2, '2 - Satisfied '], [3, '3 - Unsatisfied '], [4, '4 - Very unsatisfied'], ], widget=widgets.RadioSelect, label="j. How satisfied are you with your place of residence? ", blank=True ) q_49_propositions = models.StringField( label="k. Do you have any ideas or suggestions for improvements concerning your place of residence?", blank=True ) lastname = models.StringField( label="Last Name", blank=False ) firstname = models.StringField( label="First Name", blank=False ) email = models.StringField( label="Email", blank=False ) room = models.StringField( label="Room number (for example: 103.3.09)", blank=False ) id_in_group_nn = models.IntegerField(blank=True, null=True) gainfinal_eur = models.FloatField(blank=True, null=True) gainfinal_eur_showupfee = models.FloatField(blank=True, null=True) gainfinal_asso_eur = models.FloatField(blank=True, null=True) gainfinal_eur_f = models.FloatField(blank=True, null=True) gainfinal_eur_showupfee_f = models.FloatField(blank=True, null=True) gainfinal_asso_eur_f = models.FloatField(blank=True, null=True) gainfinal_eur_showupfee_f2025 = models.FloatField(blank=True, null=True)