from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random import numpy as np doc = """ Traitement 1 """ class Constants(BaseConstants): name_in_url = 'Pre_Exp' players_per_session = 20 players_per_group = 2 #Changer avec session num_rounds = 50 instructions_template_G = 'Pre_Exp/instruction_G.html' gain_elicitation = c(3) acceptation = 10 class Subsession(BaseSubsession): def creating_session(self): for p in self.get_players(): p.participant.vars['Gain_elicitation'] = 0 p.participant.vars['cumulative_payoff'] = 0 class Group(BaseGroup): STOP = models.CharField(initial='') Attente = models.CharField(initial='') ADGA = models.IntegerField(initial=0,) ADGB = models.IntegerField(initial=0,) ANGAA = models.IntegerField(initial=0,) ANGAB = models.IntegerField(initial=0,) ANGBA = models.IntegerField(initial=0,) ANGBB = models.IntegerField(initial=0,) def AorB(self): for p in self.get_players(): if p.round_number != 1: if p.in_round(1).rolee == "A": p.ADA_old = p.in_round(p.round_number - 1).ADA p.ANA_old = p.in_round(p.round_number - 1).ANA if p.in_round(1).rolee == "B": p.ADB_old = p.in_round(p.round_number - 1).ADB p.ANB_old = p.in_round(p.round_number - 1).ANB if p.in_round(1).rolee == "A" and p.in_round(1).get_partner().rolee == "A": p.instructions_template = 'Pre_Exp/instruction_A.html' elif p.in_round(1).rolee == "B" and p.in_round(1).get_partner().rolee == "B": p.instructions_template = 'Pre_Exp/instruction_B.html' else: p.instructions_template = "erreur" if not p.get_partner(): p.Attente ="Alone" def elicitation(self): ADLA = [] ADLB = [] ANLAA = [] #ANLBA = [] #ANLAB = [] ANLBB = [] for p in self.get_players(): if p.in_round(1).rolee == "A": ADLA.append(p.decision) ANLAA.append(p.AN1A) if p.in_round(1).rolee == "B": ADLB.append(p.decision) ANLBB.append(p.AN1B) self.ADGA = int((sum(ADLA)/(Constants.players_per_session)/2) * 100) self.ADGB = int((sum(ADLB)/(Constants.players_per_session)/2) * 100) self.ANGAA = int((sum(ANLAA)/(Constants.players_per_session)/2) * 100) #self.ANGAB = int((sum(ANLAB)/(Constants.players_per_session)/2) * 100) #self.ANGBA = int((sum(ANLBA)/(Constants.players_per_session)/2) * 100) self.ANGBB = int((sum(ANLBB)/(Constants.players_per_session)/2) * 100) def set_payoffs(self): for p in self.get_players(): if p.in_round(1).rolee == "A" and p.in_round(1).get_partner().rolee =="A": if p.decision == 1 and p.get_partner().decision == 1: p.payoff = Constants.both_cooperate_payoff_A elif p.decision == 1 and p.get_partner().decision == 0: p.payoff = Constants.betrayed_payoff_A elif p.decision == 0 and p.get_partner().decision == 1: p.payoff = Constants.betray_payoff_A elif p.decision == 0 and p.get_partner().decision == 0: p.payoff = Constants.both_defect_payoff_A if p.in_round(1).rolee == "B" and p.in_round(1).get_partner().rolee =="B": if p.decision == 1 and p.get_partner().decision == 1: p.payoff = Constants.both_cooperate_payoff_B elif p.decision == 1 and p.get_partner().decision == 0: p.payoff = Constants.betrayed_payoff_B elif p.decision == 0 and p.get_partner().decision == 1: p.payoff = Constants.betray_payoff_B elif p.decision == 0 and p.get_partner().decision == 0: p.payoff = Constants.both_defect_payoff_B if p.in_round(1).rolee == "A": if abs(p.ADA - self.ADGA) <= Constants.acceptation: p.Gain_ADA = Constants.gain_elicitation if abs(p.ANA - self.ANGAA) <= Constants.acceptation: p.Gain_ANA = Constants.gain_elicitation if p.in_round(1).rolee == "B": if abs(p.ADB - self.ADGB) <= Constants.acceptation: p.Gain_ADB = Constants.gain_elicitation if abs(p.ANB - self.ANGBB) <= Constants.acceptation: p.Gain_ANB = Constants.gain_elicitation if p.AD1 == p.get_partner().decision: p.Gain_AD1 = Constants.gain_elicitation if p.round_number == 1: p.Total_payoff = p.payoff p.Gain_Total_Attente = p.Gain_ADA + p.Gain_ADB + p.Gain_ANA + p.Gain_ANB + p.Gain_AD1 else: p.Total_payoff = p.payoff + p.in_round(p.round_number - 1).Total_payoff p.Gain_Total_Attente = p.Gain_ADA + p.Gain_ADB + p.Gain_ANA + p.Gain_ANB + p.Gain_AD1 + p.in_round(p.round_number - 1).Gain_Total_Attente p.participant.vars['cumulative_payoff'] = p.Total_payoff p.participant.vars['Gain_elicitation'] = p.Gain_Total_Attente class Player(BasePlayer): rolee = models.CharField(initial='') instructions_template = models.CharField(initial='') AD1 = models.IntegerField( choices=[[1, 'option X'], [0, 'option Y']], doc="""Attente descriptive du premier ordre""", widget=widgets.RadioSelect, ) AN1A = models.IntegerField( choices=[[1, 'option X'], [0, 'option Y']], doc="""Attente normative du premier ordre des A""", widget=widgets.RadioSelect, ) AN1B = models.IntegerField( choices=[[1, 'option X'], [0, 'option Y']], doc="""Attente normative du premier ordre des B""", widget=widgets.RadioSelect, ) Gain_ADA = models.CurrencyField(initial=0,) Gain_ANA = models.CurrencyField(initial=0,) Gain_ADB = models.CurrencyField(initial=0,) Gain_ANB = models.CurrencyField(initial=0,) Gain_AD1 = models.CurrencyField(initial=0,) Gain_Total_Attente = models.CurrencyField(initial=0,) Total_payoff = models.CurrencyField(initial=0,) def role(self): if self.participant.vars['role'] == "A": self.rolee = self.participant.vars['role'] elif self.participant.vars['role'] == "B": self.rolee = self.participant.vars['role'] def get_partner(self): return self.get_others_in_group()[0]