from otree.api import * c = cu doc = 'This app includes the performance results, payments and questions about socio-demographics, color vision, prior knowledge as well as the debriefing.' class C(BaseConstants): NAME_IN_URL = 'SocioDemographicsAndDebriefing' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 FINAL_DEMAND = 63 SELLING_PRICE = cu(10) UNIT_PURCHASING_COST = cu(3) EXPECTED_PROFIT = cu(12150) MEAN_PROFIT = cu(11670) MAX_PROFIT = cu(14056) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): age = models.IntegerField(label='Çfarë moshe keni?', max=125, min=18) gender = models.StringField(choices=[['Femër', 'Femër'], ['Mashkull', 'Mashkull'], ['Nuk identifikohem.', 'Nuk identifikohem.']], label='Gjinia?') nationality = models.StringField(choices=[['Afghan', 'Afghan'], ['Albanian', 'Albanian'], ['Algerian', 'Algerian'], ['American', 'American'], ['Andorran', 'Andorran'], ['Angolan', 'Angolan'], ['Antiguans', 'Antiguans'], ['Argentinean', 'Argentinean'], ['Armenian', 'Armenian'], ['Australian', 'Australian'], ['Austrian', 'Austrian'], ['Azerbaijani', 'Azerbaijani'], ['Bahamian', 'Bahamian'], ['Bahraini', 'Bahraini'], ['Bangladeshi', 'Bangladeshi'], ['Barbadian', 'Barbadian'], ['Barbudans', 'Barbudans'], ['Batswana', 'Batswana'], ['Belarusian', 'Belarusian'], ['Belgian', 'Belgian'], ['Belizean', 'Belizean'], ['Beninese', 'Beninese'], ['Bhutanese', 'Bhutanese'], ['Bolivian', 'Bolivian'], ['Bosnian', 'Bosnian'], ['Brazilian', 'Brazilian'], ['British', 'British'], ['Bruneian', 'Bruneian'], ['Bulgarian', 'Bulgarian'], ['Burkinabe', 'Burkinabe'], ['Burmese', 'Burmese'], ['Burundian', 'Burundian'], ['Cambodian', 'Cambodian'], ['Cameroonian', 'Cameroonian'], ['Canadian', 'Canadian'], ['Cape Verdean', 'Cape Verdean'], ['Central African', 'Central African'], ['Chadian', 'Chadian'], ['Chilean', 'Chilean'], ['Chinese', 'Chinese'], ['Colombian', 'Colombian'], ['Comoran', 'Comoran'], ['Congolese', 'Congolese'], ['Costa Rican', 'Costa Rican'], ['Croatian', 'Croatian'], ['Cuban', 'Cuban'], ['Cypriot', 'Cypriot'], ['Czech', 'Czech'], ['Danish', 'Danish'], ['Djibouti', 'Djibouti'], ['Dominican', 'Dominican'], ['Dutch', 'Dutch'], ['East Timorese', 'East Timorese'], ['Ecuadorean', 'Ecuadorean'], ['Egyptian', 'Egyptian'], ['Emirian', 'Emirian'], ['Equatorial Guinean', 'Equatorial Guinean'], ['Eritrean', 'Eritrean'], ['Estonian', 'Estonian'], ['Ethiopian', 'Ethiopian'], ['Fijian', 'Fijian'], ['Filipino', 'Filipino'], ['Finnish', 'Finnish'], ['French', 'French'], ['Gabonese', 'Gabonese'], ['Gambian', 'Gambian'], ['Georgian', 'Georgian'], ['German', 'German'], ['Ghanaian', 'Ghanaian'], ['Greek', 'Greek'], ['Grenadian', 'Grenadian'], ['Guatemalan', 'Guatemalan'], ['Guinea-Bissauan', 'Guinea-Bissauan'], ['Guinean', 'Guinean'], ['Guyanese', 'Guyanese'], ['Haitian', 'Haitian'], ['Herzegovinian', 'Herzegovinian'], ['Honduran', 'Honduran'], ['Hungarian', 'Hungarian'], ['I-Kiribati', 'I-Kiribati'], ['Icelander', 'Icelander'], ['Indian', 'Indian'], ['Indonesian', 'Indonesian'], ['Iranian', 'Iranian'], ['Iraqi', 'Iraqi'], ['Irish', 'Irish'], ['Israeli', 'Israeli'], ['Italian', 'Italian'], ['Ivorian', 'Ivorian'], ['Jamaican', 'Jamaican'], ['Japanese', 'Japanese'], ['Jordanian', 'Jordanian'], ['Kazakhstani', 'Kazakhstani'], ['Kenyan', 'Kenyan'], ['Kittian and Nevisian', 'Kittian and Nevisian'], ['Kuwaiti', 'Kuwaiti'], ['Kyrgyz', 'Kyrgyz'], ['Laotian', 'Laotian'], ['Latvian', 'Latvian'], ['Lebanese', 'Lebanese'], ['Liberian', 'Liberian'], ['Libyan', 'Libyan'], ['Liechtensteiner', 'Liechtensteiner'], ['Lithuanian', 'Lithuanian'], ['Luxembourger', 'Luxembourger'], ['Macedonian', 'Macedonian'], ['Malagasy', 'Malagasy'], ['Malawian', 'Malawian'], ['Malaysian', 'Malaysian'], ['Maldivian', 'Maldivian'], ['Malian', 'Malian'], ['Maltese', 'Maltese'], ['Marshallese', 'Marshallese'], ['Mauritanian', 'Mauritanian'], ['Mauritian', 'Mauritian'], ['Mexican', 'Mexican'], ['Micronesian', 'Micronesian'], ['Moldovan', 'Moldovan'], ['Monacan', 'Monacan'], ['Mongolian', 'Mongolian'], ['Moroccan', 'Moroccan'], ['Mosotho', 'Mosotho'], ['Motswana', 'Motswana'], ['Mozambican', 'Mozambican'], ['Namibian', 'Namibian'], ['Nauruan', 'Nauruan'], ['Nepalese', 'Nepalese'], ['New Zealander', 'New Zealander'], ['Ni-Vanuatu', 'Ni-Vanuatu'], ['Nicaraguan', 'Nicaraguan'], ['Nigerian', 'Nigerian'], ['Nigerien', 'Nigerien'], ['North Korean', 'North Korean'], ['Northern Irish', 'Northern Irish'], ['Norwegian', 'Norwegian'], ['Omani', 'Omani'], ['Pakistani', 'Pakistani'], ['Palauan', 'Palauan'], ['Panamanian', 'Panamanian'], ['Papua New Guinean', 'Papua New Guinean'], ['Paraguayan', 'Paraguayan'], ['Peruvian', 'Peruvian'], ['Polish', 'Polish'], ['Portuguese', 'Portuguese'], ['Qatari', 'Qatari'], ['Romanian', 'Romanian'], ['Russian', 'Russian'], ['Rwandan', 'Rwandan'], ['Saint Lucian', 'Saint Lucian'], ['Salvadoran', 'Salvadoran'], ['Samoan', 'Samoan'], ['San Marinese', 'San Marinese'], ['Sao Tomean', 'Sao Tomean'], ['Saudi', 'Saudi'], ['Scottish', 'Scottish'], ['Senegalese', 'Senegalese'], ['Serbian', 'Serbian'], ['Seychellois', 'Seychellois'], ['Sierra Leonean', 'Sierra Leonean'], ['Singaporean', 'Singaporean'], ['Slovakian', 'Slovakian'], ['Slovenian', 'Slovenian'], ['Solomon Islander', 'Solomon Islander'], ['Somali', 'Somali'], ['South African', 'South African'], ['South Korean', 'South Korean'], ['Spanish', 'Spanish'], ['Sri Lankan', 'Sri Lankan'], ['Sudanese', 'Sudanese'], ['Surinamer', 'Surinamer'], ['Swazi', 'Swazi'], ['Swedish', 'Swedish'], ['Swiss', 'Swiss'], ['Syrian', 'Syrian'], ['Taiwanese', 'Taiwanese'], ['Tajik', 'Tajik'], ['Tanzanian', 'Tanzanian'], ['Thai', 'Thai'], ['Togolese', 'Togolese'], ['Tongan', 'Tongan'], ['Trinidadian or Tobagonian', 'Trinidadian or Tobagonian'], ['Tunisian', 'Tunisian'], ['Turkish', 'Turkish'], ['Tuvaluan', 'Tuvaluan'], ['Ugandan', 'Ugandan'], ['Ukrainian', 'Ukrainian'], ['Uruguayan', 'Uruguayan'], ['Uzbekistani', 'Uzbekistani'], ['Venezuelan', 'Venezuelan'], ['Vietnamese', 'Vietnamese'], ['Welsh', 'Welsh'], ['Yemenite', 'Yemenite'], ['Zambian', 'Zambian'], ['Zimbabwean', 'Zimbabwean']], label='Cila është kombësia juaj') color_vision = models.StringField(choices=[['Po', 'Po.'], ['Jo', 'Jo.'], ['Nuk e di.', 'Nuk e di.']], label='A keni ndonjë formë të mungesës së shikimit të ngjyrave (p.sh. mangësi kuq-jeshile)?') ishihara_plate = models.StringField(choices=[['0', '0'], ['1', '1'], ['2', '2'], ['3', '3'], ['4', '4'], ['5', '5'], ['6', '6'], ['7', '7'], ['8', '8'], ['9', '9'], ['There is no digit.', 'There is no number.']], label='Çfarë numri shihni në figurë?') prior_knowledge = models.StringField(choices=[['Jo', 'Jo.'], ['Po', 'Po.'], ['Nuk e di.', 'Nuk jam i/e sigurt.']], label='A keni luajtur ndonjë lojë të ngjashme më përpara (Përfshirë NEWSVENDOR shitësin e gazetave)?', widget=widgets.RadioSelectHorizontal) risk_taking = models.IntegerField(choices=[[10, '10 - shumë i gatshëm për të marrë risk'], [9, '9'], [8, '8'], [7, '7'], [6, '6'], [5, '5'], [4, '4'], [3, '3'], [2, '2'], [1, '1'], [0, '0 - aspak i gatshëm për të marrë risk']], label='A e konsideroni veten si një person që është i/e gatshëm/me të marrë risk apo përpiqeni të shmangni marrjen e riskut? (Ju lutemi zgjidhni një vlerë në shkallë: Vlera 0 do të thotë aspak i/e gatshëm/me për të marrë risk dhe vlera 10 do të thotë shumë i/e gatshëm/me për të marrë risk.)', widget=widgets.RadioSelect) risky_choice = models.IntegerField(choices=[[80, '80'], [70, '70'], [0, 'Ska diferencë nga vendimet e marra.']], label='Duke kujtuar kushtet e 20 raundeve të mëparshme të vendimmarrjes, zgjedhja e cilës sasi të porosisë do të ishte më me risk për t’u zgjedhur?', widget=widgets.RadioSelectHorizontal) pay = models.FloatField(initial=0) nfc_1r = models.IntegerField(choices=[[1, 'plotësisht e pavërtetë'], [2, ''], [3, ''], [4, ''], [5, 'plotësisht e vërtetë']], label="Më pëlqen të mos më duhet të mendoj shumë.", widget=widgets.RadioSelectHorizontal) nfc_2r = models.IntegerField(choices=[[1, 'plotësisht e pavërtetë'], [2, ''], [3, ''], [4, ''], [5, 'plotësisht e vërtetë']], label='Mundohem të shmang situata që kërkojnë mendim të thelluar për diçka.', widget=widgets.RadioSelectHorizontal) nfc_3 = models.IntegerField(choices=[[1, 'plotësisht e pavërtetë'], [2, ''], [3, ''], [4, ''], [5, 'plotësisht e vërtetë']], label='Preferoj të bëj diçka që sfidon aftësitë e mia të mendimit sesa diçka që kërkon pak mendim.', widget=widgets.RadioSelectHorizontal) nfc_4 = models.IntegerField(choices=[[1, 'plotësisht e pavërtetë'], [2, ''], [3, ''], [4, ''], [5, 'plotësisht e vërtetë']], label='I preferoj problemet komplekse në vend të atyre të thjeshta.', widget=widgets.RadioSelectHorizontal) nfc_5r = models.IntegerField(choices=[[1, 'plotësisht e pavërtetë'], [2, ''], [3, ''], [4, ''], [5, 'plotësisht e vërtetë']], label='Të mendoj shumë dhe për kohë të gjatë për dicka më jep pak kënaqësi.', widget=widgets.RadioSelectHorizontal) fi_1 = models.IntegerField(choices=[[1, 'plotësisht e pavërtetë'], [2, ''], [3, ''], [4, ''], [5, 'plotësisht e vërtetë']], label='Besoj në ndjesitë e mia fillestare për njerëzit.', widget=widgets.RadioSelectHorizontal) fi_2 = models.IntegerField(choices=[[1, 'plotësisht e pavërtetë'], [2, ''], [3, ''], [4, ''], [5, 'plotësisht e vërtetë']], label='Prirem t’i besoj intuitës time.', widget=widgets.RadioSelectHorizontal) fi_3 = models.IntegerField(choices=[[1, 'cplotësisht e pavërtetë'], [2, ''], [3, ''], [4, ''], [5, 'plotësisht e vërtetë']], label='Përshtypjet e mia fillestare për njerëzit janë pothuajse gjithmonë të sakta.', widget=widgets.RadioSelectHorizontal) fi_4 = models.IntegerField(choices=[[1, 'plotësisht e pavërtetë'], [2, ''], [3, ''], [4, ''], [5, 'plotësisht e vërtetë']], label='Kur vjen puna për t’u besuar njerëzve, zakonisht mund të mbështetem në "ndjesitë time të zemrës".', widget=widgets.RadioSelectHorizontal) fi_5 = models.IntegerField(choices=[[1, 'plotësisht e pavërtetë'], [2, ''], [3, ''], [4, ''], [5, 'plotësisht e vërtetë']], label="Zakonisht mund të ndjej kur një person ka të drejtë ose gabon, edhe nëse nuk mund të shpjegoj se si e di.", widget=widgets.RadioSelectHorizontal) def custom_export(players): yield ['participant_code', 'id_in_group'] for p in players: pp = p.participant yield [pp.code, p.id_in_group] class YourOutcome(Page): form_model = 'player' @staticmethod def vars_for_template(player: Player): participant = player.participant final_cost = C.UNIT_PURCHASING_COST * participant.final_order final_earn = C.SELLING_PRICE * min(participant.final_order, C.FINAL_DEMAND) - final_cost earn = C.SELLING_PRICE - C.UNIT_PURCHASING_COST final_revenue = C.SELLING_PRICE * min(participant.final_order, C.FINAL_DEMAND) if C.FINAL_DEMAND > participant.final_order: final_loss = earn * (C.FINAL_DEMAND - participant.final_order) final_earn2 = C.SELLING_PRICE * min(participant.final_order, C.FINAL_DEMAND) - final_cost - final_loss else: final_loss = C.UNIT_PURCHASING_COST * (participant.final_order - C.FINAL_DEMAND) final_earn2 = C.SELLING_PRICE * min(participant.final_order, C.FINAL_DEMAND) - final_cost return dict( final_cost = final_cost, final_earn = final_earn, final_loss = final_loss, positive = participant.positive, final_revenue = final_revenue, final_earn2 = final_earn2 ) @staticmethod def js_vars(player: Player): participant = player.participant final_cost = C.UNIT_PURCHASING_COST * participant.final_order final_earn = C.SELLING_PRICE * min(participant.final_order, C.FINAL_DEMAND) - final_cost earn = C.SELLING_PRICE - C.UNIT_PURCHASING_COST final_revenue = C.SELLING_PRICE * min(participant.final_order, C.FINAL_DEMAND) if C.FINAL_DEMAND > participant.final_order: final_loss = earn * (C.FINAL_DEMAND - participant.final_order) final_rush = earn * (C.FINAL_DEMAND - participant.final_order) final_earn2 = C.SELLING_PRICE * min(participant.final_order, C.FINAL_DEMAND) - final_cost - final_loss else: final_loss = C.UNIT_PURCHASING_COST * (participant.final_order - C.FINAL_DEMAND) final_rush = 0 final_earn2 = C.SELLING_PRICE * min(participant.final_order, C.FINAL_DEMAND) - final_cost return dict( final_cost = final_cost, final_earn = final_earn, final_loss = final_loss, positive = participant.positive, final_revenue = final_revenue, final_earn2 = final_earn2, final_rush = final_rush ) class PerformanceAndPayment(Page): form_model = 'player' @staticmethod def vars_for_template(player: Player): session = player.session participant = player.participant participation_fee = session.config['participation_fee'] percentage = int((participant.payoff / C.MAX_PROFIT) * 100) if percentage > 85: bonus = 5 elif percentage > 50: bonus = 2.5 else: bonus = 0 return dict( participation_fee = participation_fee, percentage = percentage, bonus = bonus ) @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant percentage = int((participant.payoff / C.MAX_PROFIT) * 100) if percentage > 85: player.pay = 5 elif percentage > 50: player.pay = 2.5 else: player.pay = 0 class RiskTaking(Page): form_model = 'player' form_fields = ['risk_taking'] class RiskyChoice(Page): form_model = 'player' form_fields = ['risky_choice'] class Survey(Page): form_model = 'player' form_fields = ['nfc_1r', 'fi_1', 'nfc_2r', 'fi_2', 'nfc_3', 'fi_3', 'nfc_4', 'fi_4', 'nfc_5r', 'fi_5'] class SocioDemographics(Page): form_model = 'player' form_fields = ['age', 'gender'] #, 'nationality' class ColorVision(Page): form_model = 'player' form_fields = ['color_vision', 'ishihara_plate'] class Debriefing(Page): form_model = 'player' form_fields = ['prior_knowledge'] class ThankYou(Page): form_model = 'player' @staticmethod def vars_for_template(player: Player): payment = player.pay + 5 return dict( payment = payment ) page_sequence = [YourOutcome, PerformanceAndPayment, RiskTaking, RiskyChoice, Survey, SocioDemographics, ColorVision, Debriefing, ThankYou]