rom otree.api import * import itertools doc = """ One player decides how to divide a certain amount between himself and the other player. See: Kahneman, Daniel, Jack L. Knetsch, and Richard H. Thaler. "Fairness and the assumptions of economics." Journal of business (1986): S285-S300. """ class C(BaseConstants): name_in_url = 'dictator_1' players_per_group = None num_rounds = {1, 2} #randomise_question_order = True INSTRUCTIONS_TEMPLATE = 'dictator/instructions.html' #question_list = ["Question1", "Question2"] endowment = cu(100) in_treatment = {1, 2, 3} shared = {5, 49, 95} #Subsession: Treatments. # en X1 subsession, Y1 treatment. # en X2 subsession, Y2 treatment. class Subsession(BaseSubsession): pass class Group(BaseGroup): pass # Player: Toda la data que me quiera guardar va aquí. class Player(BasePlayer): # Dice True si pertenece al tratamiento. in_treatment = models.BooleanField() # Assigning a random id. Uso string. player_id = models.StringField() # Interger para guardar numeros enteros o Float para decimales #number_option_chosen = models.IntegerField() # Para los ingresos # current_earnings = models.CurrencyField() number_entered = models.CurrencyField( doc="""Amount dictator decided to send to participant B""", min=cu(0), max=C.endowment, label="How much do you want to send to participant B?", ) # FUNCTIONS #Functions: Treatment def creating_session(subsession): treatment = itertools.cycle([3, 4]) for group in subsession.get_groups(): group.multiplication_factor = next(treatment) def set_payoffs(player: Player): p1.payoff = player.number_entered p1sent.payoff = C.endowment - player.number_entered # PAGES class Introduction(Page): pass class Offer1(Page): #Digo, PRIMERO, DONDE quiero que me guarde la data. form_model = 'player' #Defino, SEGUNDO, qué inputs (fields) tendran los jugadores. (QUE PREVIAMENTE CREÉ EN "PLAYER CLASS") form_fields = ['number_entered'] #funciones DENTRO de la pagina... @staticmethod #is_displayed: Defino si la pagina se le muestra o no. def is_displayed(player: Player): if player.round_number == 1: return True else: return False @staticmethod def vars_for_template(player: Player): #return variables to be used in template (podemos usar codigo python aqui) return { 'treatment_1': "0", } @staticmethod def before_next_page(player: Player,timeout_happened): return { "You have shared:": p1sent.payoff, "Recently, another player, same as you, have decided to share: 0", } #SUPONGO QUE DEBO CREAR 1 PAG. POR CADA TRATAMIENTO. class Offer2_1(Page): form_model = 'player' form_fields = ['number_entered'] @staticmethod #is_displayed: Defino si la pagina se le muestra o no. def is_displayed(player: Player): if player.in_treatment == 1: return True else: return False class ResultsWaitPage(WaitPage): pass # ULTIMA PAGINA: Acá tiene que ir la DECISION FINAL. class Results(Page): @staticmethod def vars_for_template(player: Player): result = C.endowment - player.number_entered return { "Result": result , } page_sequence = [Introduction, Offer1, Offer2, Results]