from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'seqPGG' players_per_group = 4 num_rounds = 48 endowment = c(10) multiplication_factor = 2 df = [[[ 1,4,2,3 ]],[[ 4,3,1,2 ]],[[ 1,2,4,3 ]],[[ 4,3,2,1 ]],[[ 3,2,1,4 ]],[[ 3,2,4,1 ]],[[ 2,3,4,1 ]],[[ 4,2,1,3 ]],[[ 2,4,3,1 ]],[[ 2,1,3,4 ]],[[ 1,2,3,4 ]],[[ 3,4,2,1 ]]] my_list = df.copy() random.shuffle(my_list) print(my_list) StandardChoices_1=[ [1, ''], [2, ''], [3, ''], [4, ''], [5, ''], [6, ''], [7, ''] ] Survey1Choices = StandardChoices_1 class Subsession(BaseSubsession): def creating_session(self): # my_list = C.DF.copy() # random.shuffle(my_list) # print(my_list) # if self.round_number <= 4: # self.set_group_matrix(C.DF[0]) # elif self.round_number >= 5 and self.round_number <= 8: # self.set_group_matrix(C.DF[1]) # elif self.round_number >= 9 and self.round_number <= 12: # self.set_group_matrix(C.DF[2]) # elif self.round_number >= 13 and self.round_number <= 16: # self.set_group_matrix(C.DF[3]) # elif self.round_number >= 16 and self.round_number <= 20: # self.set_group_matrix(C.DF[4]) # elif self.round_number >= 21 and self.round_number <= 24: # self.set_group_matrix(C.DF[5]) # elif self.round_number >= 25 and self.round_number <= 28: # self.set_group_matrix(C.DF[6]) # elif self.round_number >= 29 and self.round_number <= 32: # self.set_group_matrix(C.DF[7]) # elif self.round_number >= 33 and self.round_number <= 36: # self.set_group_matrix(C.DF[8]) # elif self.round_number >= 37 and self.round_number <= 40: # self.set_group_matrix(C.DF[9]) # elif self.round_number >= 41 and self.round_number <= 44: # self.set_group_matrix(C.DF[10]) # elif self.round_number >= 45 and self.round_number <= 48: # self.set_group_matrix(C.DF[11]) if self.round_number <= 4: self.set_group_matrix(C.MY_LIST[0]) elif self.round_number >= 5 and self.round_number <= 8: self.set_group_matrix(C.MY_LIST[1]) elif self.round_number >= 9 and self.round_number <= 12: self.set_group_matrix(C.MY_LIST[2]) elif self.round_number >= 13 and self.round_number <= 16: self.set_group_matrix(C.MY_LIST[3]) elif self.round_number >= 16 and self.round_number <= 20: self.set_group_matrix(C.MY_LIST[4]) elif self.round_number >= 21 and self.round_number <= 24: self.set_group_matrix(C.MY_LIST[5]) elif self.round_number >= 25 and self.round_number <= 28: self.set_group_matrix(C.MY_LIST[6]) elif self.round_number >= 29 and self.round_number <= 32: self.set_group_matrix(C.MY_LIST[7]) elif self.round_number >= 33 and self.round_number <= 36: self.set_group_matrix(C.MY_LIST[8]) elif self.round_number >= 37 and self.round_number <= 40: self.set_group_matrix(C.MY_LIST[9]) elif self.round_number >= 41 and self.round_number <= 44: self.set_group_matrix(C.MY_LIST[10]) elif self.round_number >= 45 and self.round_number <= 48: self.set_group_matrix(C.MY_LIST[11]) class Group(BaseGroup): total_sent_amount = models.CurrencyField() individual_share = models.CurrencyField() pertrial_amounts = models.CurrencyField() role1 = models.CurrencyField() role2 = models.CurrencyField() role3 = models.CurrencyField() role4 = models.CurrencyField() # cumulative_payoff = models.CurrencyField() # return {'cumulative_payoff': sum([p.sent_amount for p in self.player.in_all_rounds()])*2, def include_0s(self): players = self.get_players() for p in players: print(p.sent_amount) if p.sent_amount == None: p.sent_amount = 0 print('it was None') self.pertrial_amounts = sum([p.sent_amount for p in players]) def set_payoffs(self): players = self.get_players() # print([p.sent_amount for p in players]) # sent_amounts = [p.contribution for p in players] for p in players: p.sent_amounts = sum([pp.sent_amount for pp in p.in_rounds(self.round_number-3,self.round_number)]) # sum([p.sent_amount for p in self.player.in_all_rounds()]) self.total_sent_amount = sum([p.sent_amounts for p in players]) self.individual_share = self.total_sent_amount * C.MULTIPLICATION_FACTOR / C.PLAYERS_PER_GROUP for p in players: p.payoff = C.ENDOWMENT - p.sent_amounts + self.individual_share def total_payoff(self): players = self.get_players() for p in players: p.total_payoffs = sum([pp.payoff for pp in p.in_all_rounds()]) p.participant.vars['po_Hap'] = p.total_payoffs print('po_Hap is',p.participant.vars['po_Hap']) def set_ind_invest(self): players = self.get_players() self.role1 = self.pertrial_amounts self.role2 = self.in_round(self.round_number - 1).pertrial_amounts self.role3 = self.in_round(self.round_number - 2).pertrial_amounts self.role4 = self.in_round(self.round_number - 3).pertrial_amounts class Player(BasePlayer): sent_amount = models.CurrencyField(min=0, max=C.ENDOWMENT,choices=[0,1,2,3,4,5,6,7,8,9,10]) sent_amounts = models.CurrencyField() total_payoffs = models.CurrencyField() rn = models.IntegerField(initial=1) def role(self): if self.round_number <= 4: self.rn = self.round_number elif self.round_number <= 8: self.rn = self.round_number-4 elif self.round_number <= 12: self.rn = self.round_number-8 elif self.round_number <= 16: self.rn = self.round_number-12 elif self.round_number <= 20: self.rn = self.round_number-16 elif self.round_number <= 24: self.rn = self.round_number-20 elif self.round_number <= 28: self.rn = self.round_number-24 elif self.round_number <= 32: self.rn = self.round_number-28 elif self.round_number <= 36: self.rn = self.round_number-32 elif self.round_number <= 40: self.rn = self.round_number-36 elif self.round_number <= 44: self.rn = self.round_number-40 elif self.round_number <= 48: self.rn = self.round_number-44 print('round number is ',self.rn) if self.rn == 1: if self.id_in_group==1: return 'Sender' else: return 'Receiver' elif self.rn == 2: if self.id_in_group==2: return 'Sender' else: return 'Receiver' elif self.rn == 3: if self.id_in_group==3: return 'Sender' else: return 'Receiver' elif self.rn == 4: if self.id_in_group==4: return 'Sender' else: return 'Receiver' elif self.rn == 5: if self.id_in_group==5: return 'Sender' else: return 'Receiver' elif self.rn == 6: if self.id_in_group==6: return 'Sender' else: return 'Receiver' elif self.rn == 7: if self.id_in_group==7: return 'Sender' else: return 'Receiver' elif self.rn == 8: if self.id_in_group==8: return 'Sender' else: return 'Receiver' elif self.rn == 9: if self.id_in_group==9: return 'Sender' else: return 'Receiver' elif self.rn == 10: if self.id_in_group==10: return 'Sender' else: return 'Receiver' elif self.rn == 11: if self.id_in_group==11: return 'Sender' else: return 'Receiver' elif self.rn == 12: if self.id_in_group==12: return 'Sender' else: return 'Receiver' #Survey1 (Emotional Scale) item1A = models.IntegerField( label='暖かさ', choices=C.SURVEY1CHOICES, widget=widgets.RadioSelect ) item1B = models.IntegerField( label='怒り', choices=C.SURVEY1CHOICES, widget=widgets.RadioSelect ) item1C = models.IntegerField( label='悲しみ', choices=C.SURVEY1CHOICES, widget=widgets.RadioSelect ) item1D = models.IntegerField( label='幸せ', choices=C.SURVEY1CHOICES, widget=widgets.RadioSelect ) item1E = models.IntegerField( label='軽蔑', choices=C.SURVEY1CHOICES, widget=widgets.RadioSelect ) item1F = models.IntegerField( label='罪悪感', choices=C.SURVEY1CHOICES, widget=widgets.RadioSelect ) item1G = models.IntegerField( label='嫉妬', choices=C.SURVEY1CHOICES, widget=widgets.RadioSelect ) item1H = models.IntegerField( label='驚き', choices=C.SURVEY1CHOICES, widget=widgets.RadioSelect )