#1 by Anwesha
Hi there, Hope you are well. I know that lately, I have posted several queries and I would like to apologise for the inconvenience. Being a first time programmer, while programming my experiment, I am still learning. I don't have any colleagues who knows otree or Python that works in my field as well. Hence, I pretty much depend on your wonderful support system. The question I have today is mainly two parts. 1) I have designed a group treatment. However, the payoff for each player is always coming to be zero. The codes are mentioned below. from otree.api import * import numpy as np cu = Currency class C(BaseConstants): NAME_IN_URL = 'group_esg' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 1 ENDOWMENT_PER_PLAYER = 100 payment_assetA = 110 payment_assetB = 115 payment_otherwise = 30 class Subsession(BaseSubsession): pass class Group(BaseGroup): get_payoff = models.IntegerField() class Player(BasePlayer): decision1 = models.BooleanField( label="Please make a selection between Asset A and Asset B", choices=[ [True, "Asset A"], [False, "Asset B"], ], widget=widgets.RadioSelectHorizontal ) decision2 = models.BooleanField( label="Please make a selection between Asset A and Asset B", choices=[ [True, "Asset A"], [False, "Asset B"], ], widget=widgets.RadioSelectHorizontal ) # PAGES class OriginalDecision(Page): form_model = "player" form_fields = ["decision1"] time = models.FloatField() @staticmethod def vars_for_template(player: Player): return dict( image_path='esg_wealth/flag2.jpg', pdf_path='Environmental report.pdf' ) @staticmethod def live_method(player, data): player.time = data class ResultsWaitPage(WaitPage): pass class Revision(Page): @staticmethod def vars_for_template(player: Player): opponent = player.get_others_in_group()[0] return dict( opponent=opponent, same_choice=player.decision1 == opponent.decision1, my_decision=player.field_display('decision1'), opponent_decision=opponent.field_display('decision1'), ) class RevisedDecision(Page): form_model = "player" form_fields = ["decision2"] time = models.FloatField() @staticmethod def vars_for_template(player: Player): return dict( image_path='esg_wealth/flag2.jpg', pdf_path='Environmental report.pdf' ) @staticmethod def live_method(player, data): player.time = data class Results(Page): @staticmethod def after_all_players_arrive(player: Player): pchoice = np.random.random() if pchoice <= 0.5: Group.get_payoff = 1 else: Group.get_payoff = 0 if player.decision2 == True: player.payoff += C.payment_assetA * Group.get_payoff if player.decision2 == False: player.payoff += C.payment_assetB * Group.get_payoff if Group.get_payoff == 0: player.payoff += C.payment_otherwise page_sequence = [OriginalDecision, ResultsWaitPage, Revision, RevisedDecision, ResultsWaitPage, Results] 2) My problem is with the rounding up of my payoff. So, £11.50 becomes £12.00. I tried my best to figure out a way to stop this but haven't been able to figure out anything yet. I have created a separate app for this. This is the code I am using: class Payment(Page): @staticmethod def vars_for_template(player: Player): participant = player.participant return dict( redemption_code=participant.label or participant.code, earning = format(float(participant.payoff / 10), '.2f') )
#2 by Fanist
Q1: do not write models under Page: like the code: # PAGES class OriginalDecision(Page): form_model = "player" form_fields = ["decision1"] time = models.FloatField() write the line "time = models.FloatField()" in Player field. Q2: write two time vars in Player In the Player field, now we have a "time" var in Player field. But the time is rewrittern in the RevisedDecision Page. So add "time1" and "time2" to differ. Q3: for payoff always = 0 issue, try to add a new page before Results Page. In this new page, add your code for determining payoff here. And in Results Page, just show the number to subjects.
#3 by Anwesha
Hi Fanist, Thank you for your reply. Unfortunately payoff = 0 problem still persists. Another quick question. I have created time1 and time2.In that case, any mention of time in html pages should also be time 1 and time2, is that correct?
#4 by Anwesha
Hi Fanist, So I have been able to solve the problem. I didn't add a new page before Results page. Just did this: class Results(Page): @staticmethod def vars_for_template(player: Player): pchoice = np.random.random() if pchoice <= 0.5: Group.get_payoff = 1 else: Group.get_payoff = 0 if player.decision2 == True: player.payoff += C.payment_assetA * Group.get_payoff if player.decision2 == False: player.payoff += C.payment_assetB * Group.get_payoff if Group.get_payoff == 0: player.payoff += C.payment_otherwise