from ._builtin import Page, WaitPage from otree.api import Currency as c, currency_range from .models import Constants import time import random #from otree_mturk_utils.views import CustomMturkPage, CustomMturkWaitPage class Introduction(CustomMturkPage): def is_displayed(self): return self.round_number == 1 and self.participant.vars['failed'] is False def vars_for_template(self): #self.participant.vars['end_time'] = time.time() #self.participant.vars['total_time'] = self.participant.vars['end_time'] - self.participant.vars['start_time'] self.participant.vars['see_results'] = True self.participant.vars['has_accepted'] = True class Decision(CustomMturkPage): def is_displayed(self): return self.participant.vars['failed'] is False form_model = 'player' form_fields = ['decision'] class ResultsWaitPage(WaitPage): def is_displayed(self): return self.participant.vars['failed'] is False and self.participant.vars['see_results'] is True app_name = self.player._meta.app_label participant = self.player.participant exiter = participant.vars.get('go_to_the_end', False) or participant.vars.get( 'skip_the_end_of_app_{}'.format(app_name), False) or participant.vars.get( 'skip_the_end_of_app_{}_round_{}'.format(app_name, self.player.round_number), False) if participant is exiter: return False else: return True def after_all_players_arrive(self): for p in self.group.get_players(): p.set_payoff() class Results(CustomMturkPage): def is_displayed(self): return self.participant.vars['failed'] is False def vars_for_template(self): me = self.player opponent = me.other_player() if self.participant.payoff > 200: self.participant.payoff = 200 if me.decision == 'Cooperate' and opponent.decision == 'Cooperate': return { 'my_decision': 'go for the tree-fruit', 'opponent_decision': 'go for the tree-fruit', 'same_choice': me.decision == opponent.decision, 'player_in_all_rounds': self.player.in_all_rounds(), 'total_payoff': self.participant.payoff, } if me.decision == 'Cooperate' and opponent.decision == 'Defect': return { 'my_decision': 'go for the tree-fruit', 'opponent_decision': 'go for the berries', 'same_choice': me.decision == opponent.decision, 'player_in_all_rounds': self.player.in_all_rounds(), 'total_payoff': self.participant.payoff, } if me.decision == 'Defect' and opponent.decision == 'Cooperate': return { 'my_decision': 'go for the berries', 'opponent_decision': 'go for the tree-fruit', 'same_choice': me.decision == opponent.decision, 'player_in_all_rounds': self.player.in_all_rounds(), 'total_payoff': self.participant.payoff, } if me.decision == 'Defect' and opponent.decision == 'Defect': return { 'my_decision': 'go for the berries', 'opponent_decision': 'go for the berries', 'same_choice': me.decision == opponent.decision, 'player_in_all_rounds': self.player.in_all_rounds(), 'total_payoff': self.participant.payoff, } class End(CustomMturkPage): def is_displayed(self): return self.round_number == 20 and self.participant.vars['failed'] is False def vars_for_template(self): #self.session.vars['end_time'] = time.time() #self.session.vars['total_time'] = self.session.vars['end_time'] - self.session.vars['start_time'] #self.participant.vars['wage_payment'] = (self.participant.vars['total_time'] / 60) * 0.17 #in dollars #if self.participant.vars['wage_payment'] > 2.55: # self.participant.vars['wage_payment'] = 2.55 #self.participant.vars['wage_points'] = round(self.participant.vars['wage_payment']*100) #self.participant.payoff = self.participant.payoff + (39*Constants.both_cooperate_payoff) + c(self.participant.vars['wage_points']) #ADD A CERTAIN NUMBER OF C(POINTS) TO TOTAL (39 betray_payoffs) return { 'participation_fee': self.session.config['participation_fee'], # + self.participant.vars['wage_payment'], #self.wage, 'experiment_payoff': self.participant.payoff, # - (39*Constants.both_cooperate_payoff) - c(self.participant.vars['wage_points']), #POINTS 'payment': self.participant.payoff.to_real_world_currency(self.session), # - 3.90 - self.participant.vars['wage_payment'], #self.participant.payoff_plus_participation_fee() - self.session.config['participation_fee'] - 3.90, 'final_payment': self.participant.payoff_plus_participation_fee(), } class GroupingPage(WaitPage): #b = models.IntegerField(initial=0) #c = models.IntegerField(initial=0) #d = models.IntegerField(initial=0) #e = models.IntegerField(initial=0) #f = models.IntegerField(initial=0) #g = models.IntegerField(initial=0) #h = models.IntegerField(initial=0) #a = models.IntegerField(initial=0) #wait_for_all_groups = True def is_displayed(self): return self.participant.vars['failed'] is False app_name = self.player._meta.app_label participant = self.player.participant exiter = participant.vars.get('go_to_the_end', False) or participant.vars.get( 'skip_the_end_of_app_{}'.format(app_name), False) or participant.vars.get( 'skip_the_end_of_app_{}_round_{}'.format(app_name, self.player.round_number), False) if participant is exiter: return False else: return True def vars_for_template(self): player_list = [] not_players = [] for p in self.subsession.get_players(): if p.participant.vars['has_accepted'] is True and len(player_list) < 4: player_list.append(p) # elif p.participant.vars['has_accepted'] is False or len(player_list) >= 4: # not_players.append(p) #print(player_list) # my_list_1 = [1, 2, 3, 4] # my_list_2 = [5, 6, 7, 8] # self.session.vars['my_list'] = my_list_1 # self.session.vars['my_list_2'] = my_list_2 #random.shuffle(player_list) #a = player_list[0] #b = player_list[1] #c = player_list[2] #d = player_list[3] a = random.choice(player_list) player_list.remove(a) b = random.choice(player_list) player_list.remove(b) c = random.choice(player_list) player_list.remove(c) d = random.choice(player_list) player_list.remove(d) # self.b = random.choice(self.session.vars['my_list']) # self.session.vars['my_list'].remove(self.b) # self.c = random.choice(self.session.vars['my_list']) # self.session.vars['my_list'].remove(self.c) # self.d = random.choice(self.session.vars['my_list']) # self.session.vars['my_list'].remove(self.d) e = random.choice(not_players) not_players.remove(e) f = random.choice(not_players) not_players.remove(f) g = random.choice(not_players) not_players.remove(g) h = random.choice(not_players) not_players.remove(h) # new_structure = [[self.a, self.b]] # , [self.c, self.d]] # self.e = random.choice(self.session.vars['my_list_2']) # self.session.vars['my_list_2'].remove(self.e) # self.f = random.choice(self.session.vars['my_list_2']) # self.session.vars['my_list_2'].remove(self.f) # self.g = random.choice(self.session.vars['my_list_2']) # self.session.vars['my_list_2'].remove(self.g) # self.h = random.choice(self.session.vars['my_list_2']) # self.session.vars['my_list_2'].remove(self.h) new_structure = [[a, b], [c, d], [e, f], [g, h]] self.subsession.set_group_matrix(new_structure) #class SkillTest(Page): # def is_displayed(self): # return self.round_number == 1 # form_model = 'player' # form_fields = ['skill_answer'] page_sequence = [ #SkillTest, Introduction, GroupingPage, Decision, ResultsWaitPage, Results, End ]