from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random import itertools from django import forms from django.utils.safestring import mark_safe author = 'Nisvan Erkal, Lata Gangadharan, Boon Han Koh' doc = """ Effort/Luck Experiment (Revision): Investment Task """ class Constants(BaseConstants): name_in_url = 'el_investment_task' players_per_group = 3 num_rounds = 2 returnsuccess = { 1: 250, 2: 200, } returnfailure = { 1: 50, 2: 0, } order_set = [ [1, 2], [2, 1], ] class Subsession(BaseSubsession): def creating_session(self): # determine order of treatments order = itertools.cycle(Constants.order_set) if self.round_number == 1: # divide subjects into groups self.group_randomly() # die roll for task paid and round paid (fixed for entire session) self.session.vars['taskpaid'] = random.randint(1, 2) self.session.vars['task1roundpaid'] = random.randint(1, Constants.num_rounds) else: # keep groups from round 1 self.group_like_round(1) for player in self.get_players(): if player.id_in_group == 1: player.leader = True player.member = False else: player.leader = False player.member = True player.treatstrategy = self.session.config['treatstrategy'] player.taskpaid = self.session.vars['taskpaid'] player.task1roundpaid = self.session.vars['task1roundpaid'] print("Treat Strategy Method: " + str(self.session.config['treatstrategy'])) print("Task Paid: " + str(self.session.vars['taskpaid'])) print("Task 1 Round Paid: " + str(self.session.vars['task1roundpaid'])) for g in self.get_groups(): orderlist = next(order) # orderlist iterates over [1,2], [2,1], etc. for i in range(Constants.num_rounds): # i = round number - 1 if self.round_number == i+1: # print(i) g.param = int(orderlist[i]) # extracts param # for this round g.groupreturnsuccess = Constants.returnsuccess[g.param] # print(Constants.returnsuccess[Constants.order_set[g.param-1][i]]) g.groupreturnfailure = Constants.returnfailure[g.param] # print(Constants.returnfailure[Constants.order_set[g.param-1][i]]) # print(g.param1) # print(g.param2) class Group(BaseGroup): param = models.IntegerField() groupreturnsuccess = models.IntegerField() groupreturnfailure = models.IntegerField() class Player(BasePlayer): # treatment variable treatstrategy = models.BooleanField() # variables to capture task payments taskpaid = models.IntegerField() task1roundpaid = models.IntegerField() # define roles leader = models.BooleanField() member = models.BooleanField()