from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) author = 'Mingxian' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'platform_demo' players_per_group = 2 num_rounds = 3 role_agent = 'insurance company' role_principal = 'insured person' cake_width = 600 class Subsession(BaseSubsession): def creating_session(self): labels = ['HSBC', 'Josue'] for p, label in zip(self.get_players(), labels): p.participant.label = label def vars_for_admin_report(self): return dict( agent_v_bid = dict( initial = self.get_groups()[0].get_player_by_role(Constants.role_agent).in_round(1).first_bid_agent, first = self.get_groups()[0].get_player_by_role(Constants.role_agent).in_round(1).visible_bid, second = self.get_groups()[0].get_player_by_role(Constants.role_agent).in_round(2).visible_bid, third = self.get_groups()[0].get_player_by_role(Constants.role_agent).in_round(3).visible_bid, ), principal_v_bid = dict( initial=self.get_groups()[0].get_player_by_role(Constants.role_principal).in_round(1).first_bid_principal, first = self.get_groups()[0].get_player_by_role(Constants.role_principal).in_round(1).visible_bid, second = self.get_groups()[0].get_player_by_role(Constants.role_principal).in_round(2).visible_bid, third = self.get_groups()[0].get_player_by_role(Constants.role_principal).in_round(3).visible_bid, ), agent_s_bid = dict( initial=self.get_groups()[0].get_player_by_role(Constants.role_agent).in_round(1).first_bid_agent, first = self.get_groups()[0].get_player_by_role(Constants.role_agent).in_round(1).secret_bid, second = self.get_groups()[0].get_player_by_role(Constants.role_agent).in_round(2).secret_bid, third = self.get_groups()[0].get_player_by_role(Constants.role_agent).in_round(3).secret_bid, ), principal_s_bid = dict( initial=self.get_groups()[0].get_player_by_role(Constants.role_principal).in_round(1).first_bid_principal, first = self.get_groups()[0].get_player_by_role(Constants.role_principal).in_round(1).secret_bid, second = self.get_groups()[0].get_player_by_role(Constants.role_principal).in_round(2).secret_bid, third = self.get_groups()[0].get_player_by_role(Constants.role_principal).in_round(3).secret_bid, ), settlement = self.get_groups()[0].settlement, case_solved = self.get_groups()[0].case_solved, ) class Group(BaseGroup): visible_spectrum = models.FloatField() secret_spectrum = models.FloatField() settlement = models.FloatField() case_solved = models.IntegerField(initial=0) def define_background(self): if self.round_number == 1: self.get_player_by_role(Constants.role_agent).background_principal = self.\ get_player_by_role(Constants.role_principal).background_principal self.get_player_by_role(Constants.role_principal).background_agent = self.\ get_player_by_role(Constants.role_agent).background_agent self.get_player_by_role(Constants.role_agent).first_bid_principal = self.\ get_player_by_role(Constants.role_principal).first_bid_principal self.get_player_by_role(Constants.role_principal).first_bid_agent = self.\ get_player_by_role(Constants.role_agent).first_bid_agent # self.get_player_by_role(Constants.role_principal).background_detail = self.\ # get_player_by_role(Constants.role_agent).background_detail self.visible_spectrum = round(self.get_player_by_role(Constants.role_principal).first_bid_principal -\ self.get_player_by_role(Constants.role_agent).first_bid_agent,1) elif self.round_number == 2: self.visible_spectrum = round(self.get_player_by_role(Constants.role_principal).in_round(1).visible_bid - \ self.get_player_by_role(Constants.role_agent).in_round(1).visible_bid,1) self.secret_spectrum = round(self.get_player_by_role(Constants.role_principal).in_round(1).secret_bid - \ self.get_player_by_role(Constants.role_agent).in_round(1).secret_bid,1) for p in self.get_players(): p.background_principal = p.in_round(1).background_principal p.background_agent = p.in_round(1).background_agent p.first_bid_principal = p.in_round(1).first_bid_principal p.first_bid_agent = p.in_round(1).first_bid_agent # p.background_detail = p.in_round(1).background_detail elif self.round_number == 3: self.visible_spectrum = round(self.get_player_by_role(Constants.role_principal).in_round(2).visible_bid - \ self.get_player_by_role(Constants.role_agent).in_round(2).visible_bid,1) self.secret_spectrum = round(self.get_player_by_role(Constants.role_principal).in_round(2).secret_bid - \ self.get_player_by_role(Constants.role_agent).in_round(2).secret_bid,1) for p in self.get_players(): p.background_principal = p.in_round(1).background_principal p.background_agent = p.in_round(1).background_agent p.first_bid_principal = p.in_round(1).first_bid_principal p.first_bid_agent = p.in_round(1).first_bid_agent # p.background_detail = p.in_round(1).background_detail def define_settlement(self): if self.round_number == 1: if self.get_player_by_role(Constants.role_agent).visible_bid >=\ self.get_player_by_role(Constants.role_principal).visible_bid: self.in_round(1).case_solved = 1 self.in_round(2).case_solved = 1 self.in_round(3).case_solved = 1 self.settlement = round((self.get_player_by_role(Constants.role_principal).visible_bid + self.get_player_by_role(Constants.role_agent).visible_bid)/2,1) elif self.round_number == 2: if self.get_player_by_role(Constants.role_agent).visible_bid >= \ self.get_player_by_role(Constants.role_principal).visible_bid: self.in_round(2).case_solved = 1 self.in_round(3).case_solved = 1 self.settlement = round((self.get_player_by_role(Constants.role_principal).visible_bid + self.get_player_by_role(Constants.role_agent).visible_bid)/2,1) elif self.round_number == 3: if self.get_player_by_role(Constants.role_agent).visible_bid >= \ self.get_player_by_role(Constants.role_principal).visible_bid: self.in_round(3).case_solved = 1 self.settlement = round((self.get_player_by_role(Constants.role_principal).visible_bid + self.get_player_by_role(Constants.role_agent).visible_bid)/2,1) elif self.get_player_by_role(Constants.role_agent).visible_bid <\ self.get_player_by_role(Constants.role_principal).visible_bid and\ self.get_player_by_role(Constants.role_agent).secret_bid >= \ self.get_player_by_role(Constants.role_principal).secret_bid: self.settlement = round((self.get_player_by_role(Constants.role_principal).secret_bid + self.get_player_by_role(Constants.role_agent).secret_bid)/2,1) else: self.settlement = round((max([self.get_player_by_role(Constants.role_agent).visible_bid, self.get_player_by_role(Constants.role_agent).secret_bid]) + min([self.get_player_by_role(Constants.role_principal).visible_bid, self.get_player_by_role(Constants.role_principal).secret_bid]))/2,1) class Player(BasePlayer): background_principal = models.StringField() background_agent = models.StringField() first_bid_principal = models.FloatField() first_bid_agent = models.FloatField() # background_detail = models.LongStringField(initial='Enter details of this dispute...') visible_bid = models.FloatField() secret_bid = models.FloatField() visible_cut = models.FloatField() secret_cut = models.FloatField() # visible_improvement = models.FloatField() # secret_improvement = models.FloatField() settlement_accepted = models.IntegerField( choices=[(1, 'Yes'), (0, 'No and consult a mediator')], # widget=widgets.RadioSelect, initial=None, ) def define_improvement(self): if self.round_number == 2: self.visible_improvement = self.visible_bid - self.in_round(1).visible_bid self.secret_improvement = self.secret_bid - self.in_round(1).secret_bid elif self.round_number == 3: self.visible_improvement = self.visible_bid - self.in_round(2).visible_bid self.secret_improvement = self.secret_bid - self.in_round(2).secret_bid def custom_export(players): # header row yield ['session_code', 'agent_name', 'initial_bid_agent', 'principal_name', 'initial_bid_principal', 'role', 'round_number', 'visible_bid', 'secret_bid', 'settlement'] for p in players: yield [p.session.code, p.background_agent, p.first_bid_agent, p.background_principal, p.first_bid_principal, p.role, p.round_number, p.visible_bid, p.secret_bid, p.group.settlement]