from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) author = 'Christian König gen. Kersting' doc = """ Public Good Games in standard and persistent form with variable number of players and 30 + x rounds. """ class Constants(BaseConstants): name_in_url = 'pgg_ending' players_per_group = None num_rounds = 1 class Subsession(BaseSubsession): persistent = models.BooleanField(initial=False, doc="Indicator for persistent variant of pgg") group_size = models.IntegerField(initial=3, doc="Number of members per group") def creating_session(self): self.group_size = int(self.session.config.get('group_size', 3)) self.persistent = True if self.session.config.get('variant', 'standard') == 'persistent' else False class Group(BaseGroup): pass class Player(BasePlayer): strategy = models.LongStringField(label="Was haben Sie bei Ihrer Entscheidung blaue Token in den gemeinsamen Topf zu legen berücksichtigt?", doc="What did you take into consideration when dedicing on how many blue tokens to put in the shared pot?") age = models.IntegerField( verbose_name='Wie alt sind Sie?', min=16, max=120, doc="Participant's age" ) gender = models.IntegerField( choices=[(1, 'männlich'), (2, 'weiblich'), (3, 'divers'), (4, 'keine Angabe')], verbose_name='Was ist Ihr Geschlecht?', widget=widgets.RadioSelect, doc="Participant's gender: 1 male, 2 female, 3 other, 4 prefer not to tell" ) major = models.StringField( verbose_name='Was studieren Sie im Hauptfach?', doc="Participant's major field of studies" ) risk = models.IntegerField( choices=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], verbose_name='Sind Sie im Allgemeinen ein risikobereiter Mensch oder versuchen Sie, Risiken zu vermeiden? (Der Wert 0 bedeutet: "gar nicht risikobereit" und der Wert 10: "sehr risikobereit")', widget=widgets.RadioSelectHorizontal(), doc="SOEP Risk question, scale 0 (lowest) to 10 (highest) propensity to take risk. (Dohmen et al. 2005)" ) patience = models.IntegerField( choices=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], verbose_name='Sind Sie im allgemeinen ein Mensch, der ungeduldig ist, oder der immer sehr viel Geduld aufbringt? (Der Wert 0 bedeutet: “sehr ungeduldig”, und der Wert 10: “sehr geduldig”)', widget=widgets.RadioSelectHorizontal(), doc="SOEP patience question, scale 0 (lowest) to 10 (highest) patience. Vischer et al. (2013, Econ Letters)" ) social_preference = models.IntegerField( choices=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], verbose_name='Sind Sie im allgemeinen Ein Mensch, dem das Wohlergehen anderer wichtig ist? (Der Wert 0 bedeutet: "gar nicht wichtig", und der Wert 10: "sehr wichtig"', widget=widgets.RadioSelectHorizontal(), doc="Private vs. social preferences question, scale 0 (lowest) to 10 (highest) social preference." ) economist = models.BooleanField( initial=False, doc="Indicator for participant being an economist" ) female = models.BooleanField( initial=False, doc="Indicator for participant being female" ) male = models.BooleanField( initial=False, doc="Indicator for participant being male" ) other_gender = models.BooleanField( initial=False, doc="Indicator for participant being of other gender" ) def set_indicators(self): self.male = self.gender == 1 self.female = self.gender == 2 self.other_gender = self.gender == 3 # check if major contains any word that indicates studying economics if any(word in self.major.lower() for word in ["economics", "economy", "economic", "vwl", "volkswirtschaft", "wirtschaft", "ökonomik"]): self.economist = True else: self.economist = False