from otree.api import * from settings import POINTS_CUSTOM_NAME from random import randint from _utils.payoff import ( get_endowment_in_points, get_points_per_real_world_currency_unit, get_points_from_partner_in_winning_dec ) c = Currency doc = """ Dictator Game - Treatment: Baseline Course: Behavioral Economic Experiments in the Context of the COVID-19 Pandemic Created by: David Lucius (david.lucius@posteo.de) """ # ---------------------------------------------------------------------------------------------------------------------- # MODELS # ---------------------------------------------------------------------------------------------------------------------- class Constants(BaseConstants): name_in_url = 'baseline' players_per_group = 2 num_rounds = 3 class Subsession(BaseSubsession): is_winning_dec = models.BooleanField(initial=False) def creating_session(subsession): if subsession.round_number == 1: subsession.session.winning_dec = randint(1, Constants.num_rounds) if subsession.round_number == subsession.session.winning_dec: subsession.is_winning_dec = True subsession.group_randomly() class Group(BaseGroup): pass class Player(BasePlayer): qshelfen = models.StringField( label='Sie versuchen Anderen zu helfen.', choices=[ 'trifft voll zu', 'trifft eher zu', 'weder zutreffend, noch unzutreffend', 'trifft eher nicht zu', 'trifft gar nicht zu' ], widget=widgets.RadioSelect ) qsempathisch = models.StringField( label='Sie sind empathisch mit denjenigen, die Unterstützung benötigen.', choices=[ 'trifft voll zu', 'trifft eher zu', 'weder zutreffend, noch unzutreffend', 'trifft eher nicht zu', 'trifft gar nicht zu' ], widget=widgets.RadioSelect ) qsUnterstuetzung = models.StringField( label='Sie fühlen intensiv, was Andere fühlen.', choices=[ 'trifft voll zu', 'trifft eher zu', 'weder zutreffend, noch unzutreffend', 'trifft eher nicht zu', 'trifft gar nicht zu', ], widget=widgets.RadioSelect ) qsTroesten = models.StringField( label='Sie versuchen diejenigen zu trösten, die traurig sind.', choices=[ 'trifft voll zu', 'trifft eher zu', 'weder zutreffend, noch unzutreffend', 'trifft eher nicht zu', 'trifft gar nicht zu' ], widget=widgets.RadioSelect ) qsLage = models.StringField( label='Sie können sich gut in die Lage derer versetzen, die sich unwohl fühlen.', choices=[ 'trifft voll zu', 'trifft eher zu', 'weder zutreffend, noch unzutreffend', 'trifft eher nicht zu', 'trifft gar nicht zu' ], widget=widgets.RadioSelect ) qsDasein = models.StringField( label='Sie versuchen für diejenigen da zu sein, die Unterstützung benötigen.', choices=[ 'trifft voll zu', 'trifft eher zu', 'weder zutreffend, noch unzutreffend', 'trifft eher nicht zu', 'trifft gar nicht zu' ], widget=widgets.RadioSelect ) qcErkrankti = models.StringField( label='Sind Sie schon einmal an COVID-19 erkrankt?', choices=[ 'Ja, leichter Verlauf', 'Ja, schwerer Verlauf', 'Nein' ], widget=widgets.RadioSelect ) qcErkranktf = models.StringField( label='Ist ein Familienmitglied schon einmal an COVID-19 erkrankt?', choices=[ 'Ja, leichter Verlauf', 'Ja, schwerer Verlauf', 'Nein' ], widget=widgets.RadioSelect ) q1 = models.StringField( label='Haben Sie Ihre Kontakte in den letzten 14 Tagen bewusst reduziert?', choices=[ 'trifft voll zu', 'trifft eher zu', 'weder zutreffend, noch unzutreffend', 'trifft eher nicht zu', 'trifft gar nicht zu' ], widget=widgets.RadioSelect ) qcMaske = models.StringField( label='Haben Sie in den letzten 14 Tagen freiwillig, über die geltenden ' 'Corona-Maßnahmen hinaus,
eine medizinische Maske getragen? ' '(z.B. in Fußgängerzonen, bei privaten Treffen)', choices=[ 'trifft voll zu', 'trifft eher zu', 'weder zutreffend, noch unzutreffend', 'trifft eher nicht zu', 'trifft gar nicht zu' ], widget=widgets.RadioSelect ) qcTesten = models.StringField( label='Haben Sie sich in den letzten 14 Tagen freiwillig, über die geltenden Corona-Maßnahmen ' 'hinaus,
auf Covid-19 testen lassen? ' '(z.B. PCR/Schnelltest vor oder nach einem privaten Treffen) ', choices=[ 'trifft voll zu', 'trifft eher zu', 'weder zutreffend, noch unzutreffend', 'trifft eher nicht zu', 'trifft gar nicht zu' ], widget=widgets.RadioSelect ) q2 = models.StringField( label='Ich habe mich am ehesten impfen lassen, weil...', choices=[ 'ich mich selbst schützen möchte.', 'ich Andere schützen möchte.', 'ich am öffentlichen Leben teilnehmen möchte.', 'ich Angst hatte im privaten Umfeld ausgeschlossen zu werden.', 'Ich habe mich nicht impfen lassen.', ], widget=widgets.RadioSelect ) qcMasnahmen = models.StringField( label='Welche der folgenden Aussagen trifft am ehesten auf Sie zu:
' 'Ich habe mich in den letzten 14 Tagen an die geltenden Corona-Maßnahmen gehalten, weil...', choices=[ 'es mich nicht stört, mich an die geltenden Maßnahmen zu halten.', 'ich mich schützen möchte.', 'ich meine Familie/Freunde schützen möchte.', 'ich die Allgemeinheit schützen möchte.', 'ich kein Bußgeld zahlen möchte.', 'sich Andere auch daran halten.', 'Ich halte mich nicht an die geltenden Regelungen.', ], widget=widgets.RadioSelect ) taler = models.IntegerField( label='', min=0 ) Alter = models.IntegerField( label='Bitte geben Sie Ihr Alter in Jahren an.' ) Geschlecht = models.StringField( label='Bitte geben Sie Ihr Geschlecht an.', choices=[ 'Weiblich', 'Männlich', 'Divers' ], widget=widgets.RadioSelect ) Fakultaet = models.StringField( label='Welcher Fakultät gehört Ihr Studiengang an?', choices=[ 'Betriebswirtschaft', 'Erziehungswisschenschaften', 'Geisteswissenschaften', 'Mathematik, Informatik und Naturwissenschaften', 'Medizin', 'Rechtswissenschaften', 'Psychologie und Bewegungswissenschaft', 'Wirtschafts- und Sozialwissenschaften', 'sonstige', ], widget=widgets.RadioSelect ) Bildung = models.StringField( label='Bitte geben Sie Ihren höchsten Bildungsabschluss an.', choices=[ 'Mittlere Reife', '(Fach)Hochschulreife', 'Hochschulabschluss Bachelor', 'Hochschulabschluss Master oder höher', ], widget=widgets.RadioSelect ) Erwerbstaetigkeit = models.StringField( label='Bitte geben Sie Ihr derzeitiges Anstellungsverhältnis an.', choices=[ 'Minijob', 'Werkstudent:in', 'Teilzeit', 'Vollzeit', 'derzeitig gehe ich keiner Erwerbstätigkeit nach', ], widget=widgets.RadioSelect ) def taler_max(player): return get_endowment_in_points(player) # ---------------------------------------------------------------------------------------------------------------------- # PAGES # ---------------------------------------------------------------------------------------------------------------------- class Intro(Page): @staticmethod def is_displayed(player): return player.round_number == 1 class IntroDecision01(Page): @staticmethod def is_displayed(player): return player.round_number == 1 @staticmethod def vars_for_template(player): return dict( endowment_in_points=c(get_endowment_in_points(player)), points_per_real_world_currency_unit=c(get_points_per_real_world_currency_unit(player)) ) class DecisionInfo(Page): @staticmethod def is_displayed(player): return player.round_number >= 2 @staticmethod def vars_for_template(player): return dict( endowment_in_points=c(get_endowment_in_points(player)), points_per_real_world_currency_unit=c(get_points_per_real_world_currency_unit(player)), partners_answer_to_q1=player.get_others_in_group()[0].participant.q1 if player.round_number == 2 else None, partners_answer_to_q2=player.get_others_in_group()[0].participant.q2 if player.round_number == 3 else None ) class Decision(Page): form_model = 'player' form_fields = [ 'taler' ] @staticmethod def vars_for_template(player): return dict( POINTS_CUSTOM_NAME=POINTS_CUSTOM_NAME, endowment_in_points=c(get_endowment_in_points(player)), points_per_real_world_currency_unit=c(get_points_per_real_world_currency_unit(player)), partners_answer_to_q1=player.get_others_in_group()[0].participant.q1 if player.round_number == 2 else None, partners_answer_to_q2=player.get_others_in_group()[0].participant.q2 if player.round_number == 3 else None ) @staticmethod def js_vars(player): return dict( endowment_in_points=get_endowment_in_points(player) ) class Questionnaire01(Page): form_model = 'player' form_fields = [ 'q1', 'q2', 'qsUnterstuetzung', 'qsTroesten', 'qsLage', 'qsDasein', 'qcErkrankti', 'qcErkranktf', 'qsempathisch', 'qcMaske', 'qcTesten', 'qshelfen', 'qcMasnahmen', ] @staticmethod def is_displayed(player): return player.round_number == 1 @staticmethod def before_next_page(player, timeout_happened): player.participant.q1 = player.q1 player.participant.q2 = player.q2 class Questionnaire02(Page): form_model = 'player' form_fields = [ 'Alter', 'Geschlecht', 'Bildung', 'Fakultaet', 'Erwerbstaetigkeit', ] @staticmethod def is_displayed(player): return player.round_number == Constants.num_rounds class Payment(Page): @staticmethod def is_displayed(player): return player.round_number == Constants.num_rounds @staticmethod def vars_for_template(player): return dict( POINTS_CUSTOM_NAME=POINTS_CUSTOM_NAME, points_in_rounds=[player.in_round(r).taler for r in range(1, Constants.num_rounds + 1)], points_in_winning_dec=c(player.in_round(player.session.winning_dec).taler), points_from_partner_in_winning_dec=c(get_points_from_partner_in_winning_dec(player)) ) class WaitingForPartner01(WaitPage): body_text = 'Bitte warten Sie, bis Ihr:e Partner:in bereit ist.' @staticmethod def is_displayed(player): return player.round_number >= 2 class WaitingForPartner02(WaitPage): body_text = 'Bitte warten Sie, bis Ihr:e Partner:in bereit ist.' @staticmethod def after_all_players_arrive(group): if group.round_number == group.session.winning_dec: for p in group.get_players(): p.payoff = p.taler + get_points_from_partner_in_winning_dec(p) page_sequence = [ Intro, Questionnaire01, IntroDecision01, WaitingForPartner01, DecisionInfo, Decision, WaitingForPartner02, Questionnaire02, Payment ]