from otree.api import Currency as c, currency_range from . import models from ._builtin import Page, WaitPage from .models import Constants import random from random import shuffle import itertools from decimal import * import time def vars_for_all_templates(self): return { 'condition': self.participant.vars['condition'] } class GroupWait(WaitPage): template_name = 'cost_allocation_task/CWaitPage.html' body_text = "Please wait briefly while the other Manager arrives...(Note: You will be compensated for waiting " \ "(at $0.20/minute) and will wait a maximum of 5 minutes)..." title_text = "" #Change 6.22.2021 # group_by_arrival_time = True # No real 'role' that needs to be matched separately, so just group by time #def get_players_for_group(self, waiting_players): #mgrs = [p for p in waiting_players] #if len(mgrs) > 1: # return [mgrs[0], mgrs[1]] class PreTask(Page): def before_next_page(self): # Bring vars forward to this app self.player.condition = self.participant.vars['condition'] self.player.pay_period = self.participant.vars['pay_period'] # Get their partner partner = self.player.get_partner() self.player.partner_id = partner.id # Draw the result of the uncontrollable event in those conditions if self.player.condition == 3 or self.player.condition == 4: event_set = (0, 0, 0, 0, 0, 0, 1, 1, 1, 1) event_draw = random.choice(event_set) self.player.event_1 = event_draw class ResultWait(WaitPage): template_name = 'bsw3_task/CWaitPage.html' body_text = "Please wait briefly while the other Manager arrives (they may have started the work period a few seconds after you)..." title_text = "" class ResultWait2(WaitPage): template_name = 'bsw3_task/CWaitPage2.html' body_text = "Please wait briefly while the other Manager arrives (they may have started the work period a few seconds after you)..." title_text = "" class Interim1(Page): def before_next_page(self): if self.player.condition == 1 or self.player.condition == 3: firm_rev = self.player.income_1 + self.player.partner_income_1 cost = int(round((self.player.income_1 / firm_rev)*100, 0)) partner_cost = 100 - cost self.player.cost_1 = cost self.player.partner_cost_1 = partner_cost self.player.profit_1 = self.player.income_1 - cost self.player.partner_profit_1 = self.player.partner_income_1 - partner_cost else: self.player.cost_1 = 50 self.player.partner_cost_1 = 50 self.player.profit_1 = self.player.income_1 - 50 self.player.partner_profit_1 = self.player.partner_income_1 - 50 class Interim2(Page): def before_next_page(self): if self.player.condition == 1 or self.player.condition == 3: firm_rev = self.player.income_2 + self.player.partner_income_2 cost = int(round((self.player.income_2 / firm_rev)*100, 0)) partner_cost = 100 - cost self.player.cost_2 = cost self.player.partner_cost_2 = partner_cost self.player.profit_2 = self.player.income_2 - cost self.player.partner_profit_2 = self.player.partner_income_2 - partner_cost else: self.player.cost_2 = 50 self.player.partner_cost_2 = 50 self.player.profit_2 = self.player.income_2 - 50 self.player.partner_profit_2 = self.player.partner_income_2 - 50 class Interim3(Page): def before_next_page(self): if self.player.condition == 1 or self.player.condition == 3: firm_rev = self.player.income_3 + self.player.partner_income_3 cost = int(round((self.player.income_3 / firm_rev)*100, 0)) partner_cost = 100 - cost self.player.cost_3 = cost self.player.partner_cost_3 = partner_cost self.player.profit_3 = self.player.income_3 - cost self.player.partner_profit_3 = self.player.partner_income_3 - partner_cost else: self.player.cost_3 = 50 self.player.partner_cost_3 = 50 self.player.profit_3 = self.player.income_3 - 50 self.player.partner_profit_3 = self.player.partner_income_3 - 50 class Interim4(Page): def before_next_page(self): if self.player.condition == 1 or self.player.condition == 3: firm_rev = self.player.income_4 + self.player.partner_income_4 cost = int(round((self.player.income_4 / firm_rev)*100, 0)) partner_cost = 100 - cost self.player.cost_4 = cost self.player.partner_cost_4 = partner_cost self.player.profit_4 = self.player.income_4 - cost self.player.partner_profit_4 = self.player.partner_income_4 - partner_cost else: self.player.cost_4 = 50 self.player.partner_cost_4 = 50 self.player.profit_4 = self.player.income_4 - 50 self.player.partner_profit_4 = self.player.partner_income_4 - 50 class Results1(Page): form_model = models.Player form_fields = ['results_view_time_1'] def vars_for_template(self): if self.player.condition == 1 or self.player.condition == 2: rate = 7 elif self.player.condition == 3 or self.player.condition == 4: if self.player.event_1 == 1: rate = 4 else: rate = 9 return {'decode': self.player.num_decoded_1, 'rate': rate, 'income': self.player.income_1, 'cost': self.player.cost_1, 'profit': self.player.profit_1, 'event': self.player.event_1, 'partner_income': self.player.partner_income_1, 'partner_cost': self.player.partner_cost_1, 'partner_profit': self.player.partner_profit_1, 'partner_event': self.player.partner_event_1, 'firm_revenue': self.player.income_1 + self.player.partner_income_1} def before_next_page(self): # Draw the result of the uncontrollable event in those conditions if self.player.condition == 3 or self.player.condition == 4: event_set = (0, 0, 0, 0, 0, 0, 1, 1, 1, 1) event_draw = random.choice(event_set) self.player.event_2 = event_draw class Results2(Page): form_model = models.Player form_fields = ['results_view_time_2'] def vars_for_template(self): if self.player.condition == 1 or self.player.condition == 2: rate = 7 elif self.player.condition == 3 or self.player.condition == 4: if self.player.event_2 == 1: rate = 4 else: rate = 9 return {'decode': self.player.num_decoded_2, 'rate': rate, 'income': self.player.income_2, 'cost': self.player.cost_2, 'profit': self.player.profit_2, 'event': self.player.event_2, 'partner_income': self.player.partner_income_2, 'partner_cost': self.player.partner_cost_2, 'partner_profit': self.player.partner_profit_2, 'partner_event': self.player.partner_event_2, 'firm_revenue': self.player.income_2 + self.player.partner_income_2} def before_next_page(self): # Draw the result of the uncontrollable event in those conditions if self.player.condition == 3 or self.player.condition == 4: event_set = (0, 0, 0, 0, 0, 0, 1, 1, 1, 1) event_draw = random.choice(event_set) self.player.event_3 = event_draw class Results3(Page): form_model = models.Player form_fields = ['results_view_time_3'] def vars_for_template(self): if self.player.condition == 1 or self.player.condition == 2: rate = 7 elif self.player.condition == 3 or self.player.condition == 4: if self.player.event_3 == 1: rate = 4 else: rate = 9 return {'decode': self.player.num_decoded_3, 'rate': rate, 'income': self.player.income_3, 'cost': self.player.cost_3, 'profit': self.player.profit_3, 'event': self.player.event_3, 'partner_income': self.player.partner_income_3, 'partner_cost': self.player.partner_cost_3, 'partner_profit': self.player.partner_profit_3, 'partner_event': self.player.partner_event_3, 'firm_revenue': self.player.income_3 + self.player.partner_income_3} def before_next_page(self): # Draw the result of the uncontrollable event in those conditions if self.player.condition == 3 or self.player.condition == 4: event_set = (0, 0, 0, 0, 0, 0, 1, 1, 1, 1) event_draw = random.choice(event_set) self.player.event_4 = event_draw class Results4(Page): form_model = models.Player form_fields = ['results_view_time_4', 'total_wait_time'] def vars_for_template(self): if self.player.condition == 1 or self.player.condition == 2: rate = 7 elif self.player.condition == 3 or self.player.condition == 4: if self.player.event_4 == 1: rate = 4 else: rate = 9 return {'decode': self.player.num_decoded_4, 'rate': rate, 'income': self.player.income_4, 'cost': self.player.cost_4, 'profit': self.player.profit_4, 'event': self.player.event_4, 'partner_income': self.player.partner_income_4, 'partner_cost': self.player.partner_cost_4, 'partner_profit': self.player.partner_profit_4, 'partner_event': self.player.partner_event_4, 'firm_revenue': self.player.income_4 + self.player.partner_income_4} class DecodingTask1(Page): def vars_for_template(self): return { 'decode_strings': models.DecodeStrings.objects.filter(id__range=[6, 80]) } form_model = models.Player form_fields = ['num_attempted_1', 'num_decoded_1'] def before_next_page(self): # Draw the result of the uncontrollable event in those conditions #if self.player.condition == 3 or self.player.condition == 4: # event_set = (0, 0, 0, 0, 0, 0, 1, 1, 1, 1) # event_draw = random.choice(event_set) # self.player.event_1 = event_draw if self.player.condition == 1 or self.player.condition == 2: self.player.income_1 = 60 + self.player.num_decoded_1*7 elif self.player.condition == 3 or self.player.condition == 4: if self.player.event_1 == 0: self.player.income_1 = 60 + self.player.num_decoded_1*9 elif self.player.event_1 == 1: self.player.income_1 = 60 + self.player.num_decoded_1*4 # Update each p's record for their 'partner' models.Player.objects.filter(id=self.player.partner_id).update(partner_decoded_1= self.player.num_decoded_1, partner_event_1= self.player.event_1, partner_income_1= self.player.income_1) class DecodingTask2(Page): def vars_for_template(self): return { 'decode_strings': models.DecodeStrings.objects.filter(id__range=[81, 155]) } form_model = models.Player form_fields = ['num_attempted_2', 'num_decoded_2'] def before_next_page(self): if self.player.condition == 1 or self.player.condition == 2: self.player.income_2 = 60 + self.player.num_decoded_2*7 elif self.player.condition == 3 or self.player.condition == 4: if self.player.event_2 == 0: self.player.income_2 = 60 + self.player.num_decoded_2*9 elif self.player.event_2 == 1: self.player.income_2 = 60 + self.player.num_decoded_2*4 # Update each p's record for their 'partner' models.Player.objects.filter(id=self.player.partner_id).update(partner_decoded_2= self.player.num_decoded_2, partner_event_2= self.player.event_2, partner_income_2= self.player.income_2) class DecodingTask3(Page): def vars_for_template(self): return { 'decode_strings': models.DecodeStrings.objects.filter(id__range=[156, 230]) } form_model = models.Player form_fields = ['num_attempted_3', 'num_decoded_3'] def before_next_page(self): if self.player.condition == 1 or self.player.condition == 2: self.player.income_3 = 60 + self.player.num_decoded_3*7 elif self.player.condition == 3 or self.player.condition == 4: if self.player.event_3 == 0: self.player.income_3 = 60 + self.player.num_decoded_3*9 elif self.player.event_3 == 1: self.player.income_3 = 60 + self.player.num_decoded_3*4 # Update each p's record for their 'partner' models.Player.objects.filter(id=self.player.partner_id).update(partner_decoded_3= self.player.num_decoded_3, partner_event_3= self.player.event_3, partner_income_3= self.player.income_3) class DecodingTask4(Page): def vars_for_template(self): return { 'decode_strings': models.DecodeStrings.objects.filter(id__range=[231, 305]) } form_model = models.Player form_fields = ['num_attempted_4', 'num_decoded_4'] def before_next_page(self): if self.player.condition == 1 or self.player.condition == 2: self.player.income_4 = 60 + self.player.num_decoded_4*7 elif self.player.condition == 3 or self.player.condition == 4: if self.player.event_4 == 0: self.player.income_4 = 60 + self.player.num_decoded_4*9 elif self.player.event_4 == 1: self.player.income_4 = 60 + self.player.num_decoded_4*4 # Update each p's record for their 'partner' models.Player.objects.filter(id=self.player.partner_id).update(partner_decoded_4= self.player.num_decoded_4, partner_event_4= self.player.event_4, partner_income_4= self.player.income_4) class PEQ1(Page): form_model = models.Player form_fields = ['peq_group_attachment', 'peq_group_exit', 'peq_group_similarity', 'peq_group_salience', 'peq_relational_identification', 'peq_allocation_fairness', 'peq_perceived_control', 'peq_expected_bonus', 'peq_compensation_satisfaction' ] class PEQ2(Page): form_model = models.Player def get_form_fields(self): if self.player.condition == 1 or self.player.condition == 2: return ['peq_task_difficulty', 'peq_task_enjoyment', 'peq_ind_competition', 'peq_rpi_salience', 'peq_group_effort', 'peq_turk_income', 'peq_risk_attitude', 'peq_others_risk', 'peq_affect_excited', 'peq_affect_upset', 'peq_affect_proud', 'peq_affect_irritable', 'peq_affect_inspired', 'peq_affect_nervous', 'peq_gender', 'peq_age_range', 'peq_work_experience', 'peq_education' ] else: return ['peq_task_difficulty', 'peq_task_enjoyment', 'peq_ind_competition', 'peq_rpi_salience', 'peq_event_impact', 'peq_group_effort', 'peq_turk_income', 'peq_risk_attitude', 'peq_others_risk', 'peq_affect_excited', 'peq_affect_upset', 'peq_affect_proud', 'peq_affect_irritable', 'peq_affect_inspired', 'peq_affect_nervous', 'peq_gender', 'peq_age_range', 'peq_work_experience', 'peq_education' ] def before_next_page(self): self.player.wait_bonus = round((int(self.player.total_wait_time)/60)*0.20, 2) if self.player.pay_period == 1: self.player.task_bonus = self.player.profit_1*0.03 self.player.total_comp = 2.00 + self.player.profit_1*0.03 + self.player.wait_bonus self.player.pay_profit = self.player.profit_1 elif self.player.pay_period == 2: self.player.task_bonus = self.player.profit_2*0.03 self.player.total_comp = 2.00 + self.player.profit_2*0.03 + self.player.wait_bonus self.player.pay_profit = self.player.profit_2 elif self.player.pay_period == 3: self.player.task_bonus = self.player.profit_3*0.03 self.player.total_comp = 2.00 + self.player.profit_3*0.03 + self.player.wait_bonus self.player.pay_profit = self.player.profit_3 elif self.player.pay_period == 4: self.player.task_bonus = self.player.profit_4*0.03 self.player.total_comp = 2.00 + self.player.profit_4*0.03 + self.player.wait_bonus self.player.pay_profit = self.player.profit_4 class ExitResults(Page): def vars_for_template(self): return { 'pay_period': self.player.pay_period, 'pay_profit': self.player.pay_profit, 'bonus': '{0:.2f}'.format(self.player.task_bonus), 'wait_bonus': '{0:.2f}'.format(self.player.wait_bonus), 'bonus_total': '{0:.2f}'.format(self.player.total_comp) } page_sequence = [ GroupWait, PreTask, DecodingTask1, ResultWait, Interim1, Results1, DecodingTask2, ResultWait, Interim2, Results2, DecodingTask3, ResultWait2, Interim3, Results3, DecodingTask4, ResultWait2, Interim4, Results4, PEQ1, PEQ2, ExitResults ]