# Sky Vercauteren # WageNegotiations # July 2020 from django.conf import settings from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants # Agree to the terms class Release(Page): form_model = 'player' form_fields = ['agree'] def is_displayed(self): return self.round_number == 1 pass # Enter name and wnumber class LoginScreen(Page): form_model = 'player' form_fields = ['name', 'email'] def is_displayed(self): return self.round_number == 1 def before_next_page(self): # Set Role if self.player.id_in_group % 2 == 0: self.player.participant.vars['Role'] = 'Employee' else: self.player.participant.vars['Role'] = 'Employer' # Set Tokens self.player.payoff = self.session.config['STARTING_TOKENS'] self.player.participant.vars['negotiation'] = 0 pass # ask prefered gender class SurveyGender(Page): form_model = 'player' form_fields = ['gender'] def is_displayed(self): return self.round_number == 1 pass # Globally assigns, and shows Player their respective role class RevealRole(Page): def is_displayed(self): return self.round_number == 1 def vars_for_template(self): return dict( role=self.player.participant.vars['Role'], tokens=c(self.player.payoff), ) def before_next_page(self): for p in self.group.get_players(): p.participant.vars['name'] = p.name p.participant.vars['email'] = p.email p.participant.vars['gender'] = p.gender pass class BeginPractice(Page): def is_displayed(self): return self.round_number == 1 pass class BasicWait(WaitPage): pass class PracticeInitialWork(Page): live_method = 'live_initial_work' def is_displayed(self): return self.round_number == 1 def get_timeout_seconds(self): return self.session.config['INITIAL_WORK_TIME'] def before_next_page(self): # get score score = self.player.correct_init_answers self.player.score = score self.player.participant.vars['initial_score'] = score pass class PracticeInitialResults(Page): def is_displayed(self): return self.round_number == 1 # set the score, earnings, standing and points def vars_for_template(self): score = self.player.score avg = self.group.avgScore standing = self.player.participant.vars['standing'] return dict( score=score, avgScore=avg, standing=standing, tokens=self.player.payoff, ) pass class PracticePreview(Page): def before_next_page(self): self.player.participant.vars['negotiation'] = 0 def is_displayed(self): return self.round_number == 1 def vars_for_template(self): return dict( score=self.player.score, tokens=self.player.payoff, ) pass class PracticeNegotiation(Page): live_method = 'live_negotiate' def get_timeout_seconds(self): # 10 seconds of prep time # 5 seconds of forgiveness time return self.session.config['NEGOTIATION_TIME'] + 15 def vars_for_template(self): employee_offer = self.group.employeeOffer employer_offer = self.group.employerOffer opRole = "x" opStanding = 0 oppic = ' ' pic = '' opinitscore = 0 opscore = 0 opearn = 0 opneg = 0 # Find opponent information for p in self.group.get_players(): if not p.id_in_group == self.player.id_in_group: if p.participant.vars['gender'] == "Male/Man": oppic = 'male.jpg' else: oppic = 'female.jpg' opRole = p.participant.vars['Role'] opStanding = p.participant.vars['standing'] opinitscore = p.participant.vars['initial_score'] opscore = p.participant.vars['score'] opearn = p.participant.vars['prev_earnings'] opneg = int(p.participant.vars['negotiation'] * 100) # determine your image paths if self.player.participant.vars['gender'] == "Male/Man": pic = 'male.jpg' else: pic = 'female.jpg' neg = int(self.player.participant.vars['negotiation'] * 100) return dict( ee_offer=employee_offer, er_offer=employer_offer, op_image_path=oppic, your_image_path=pic, oprole=opRole, opstand=opStanding, opinitscore=opinitscore, opscore=opscore, opearn=opearn, opneg=opneg, neg=neg, ) def before_next_page(self): if self.timeout_happened: # This means there was no agreement! self.player.expired = True # if fallback is turned on, set the data here. if self.subsession.fallback: partnerAmount = 0 role = self.player.role() if role == 'Employee': self.player.participant.vars['negotiation'] = 0.4 print("here") else: self.player.participant.vars['negotiation'] = 0 partnerAmount = 0.4 for p in self.group.get_players(): if p.id_in_group != self.player.id_in_group: p.participant.vars['negotiation'] = partnerAmount pass class PartnerWait(Page): live_method = 'live_partner_wait' pass class PracticeWork(Page): live_method = 'live_work' def get_timeout_seconds(self): # 5 seconds of forgiveness time return self.session.config['MAIN_WORK_TIME'] + 5 def vars_for_template(self): return dict( neg=int(self.player.participant.vars['negotiation'] * 100)) pass class PracticeWorkWait(WaitPage): wait_for_all_groups = True after_all_players_arrive = 'set_practice_scores' pass class PracticeResults(Page): # set the score, earnings, standing and points def vars_for_template(self): avgE = 0 score = self.player.score avg = self.group.avgScore standing = self.player.participant.vars['standing'] neg = int(self.player.participant.vars['negotiation'] * 100) earn = self.player.participant.vars['prev_earnings'] for p in self.subsession.get_players(): avgE = avgE + p.participant.vars['prev_earnings'] avgE = avgE / self.session.num_participants avgEarn = int(avgE) # Find opponent information for p in self.group.get_players(): if not p.id_in_group == self.player.id_in_group: oprole = p.participant.vars['Role'] opscore = p.participant.vars['score'] opearn = p.participant.vars['prev_earnings'] opneg = int(p.participant.vars['negotiation'] * 100) return dict( score=score, avgScore=avg, standing=standing, tokens=self.player.participant.vars['practice_earnings'], neg=neg, earn=earn, avgE=avgEarn, oprole=oprole, opscore=opscore, opearn=opearn, opneg=opneg, ) pass class EndPractice(Page): def is_displayed(self): return self.round_number == 2 pass class SpecialWait(WaitPage): def is_displayed(self): return self.round_number == 2 after_all_players_arrive = 'special_wait' pass class WorkWait1(WaitPage): def is_displayed(self): return self.round_number == 1 wait_for_all_groups = True after_all_players_arrive = 'set_scores' pass class WorkWait2(WaitPage): def is_displayed(self): return self.round_number == 2 wait_for_all_groups = True after_all_players_arrive = 'set_scores' pass # Work page, for the initial placement of player standing. # displays the set number of matrices for the player to complete. class InitialWork(Page): live_method = 'live_initial_work' def is_displayed(self): return self.round_number == 2 def get_timeout_seconds(self): return self.session.config['INITIAL_WORK_TIME'] def before_next_page(self): # calculate score score = self.player.correct_init_answers self.player.score = score self.player.participant.vars['initial_score'] = score pass # Page to display results of work session class WorkResults(Page): def is_displayed(self): return self.round_number == 2 # set the score, earnings, standing and points def vars_for_template(self): score = self.player.score avg = self.group.avgScore standing = self.player.participant.vars['standing'] return dict( score=score, avgScore=avg, standing=standing, tokens=self.participant.payoff, ) pass page_sequence = [Release, LoginScreen, SurveyGender, RevealRole, BeginPractice, BasicWait, PracticeInitialWork, WorkWait1, PracticeInitialResults, PracticePreview, BasicWait, PracticeNegotiation, PartnerWait, PracticeWork, PracticeWorkWait, PracticeResults, EndPractice, SpecialWait, InitialWork, WorkWait2, WorkResults]