from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants class Cockpit(Page): form_model = 'player' form_fields = ['player_invests'] def is_displayed(self): if (self.player.treatment_group == "yearly_edu" or self.player.treatment_group =="yearly"): if self.round_number % 4 == 1: return True else: return False return True def vars_for_template(self): # ---- Group that sees yearly performance --- # View yearly is true every 5th round if (self.player.treatment_group == "yearly_edu" or self.player.treatment_group =="yearly"): # If player decided to invest 4 rounds ago or if it is round 4 (since round 0 has no player_invests variable), calculate new portfolio performance if self.round_number == 1: invested_previous_round = False self.player.calculate_portfolioPerformance() self.player.calculate_portfolio_returnInEur() self.player.calculate_portfolio_returnInPercent() self.player.calculate_marketPerformance() elif (self.player.in_round(self.round_number - 4).player_invests == True): # Do loop for i = 3,2,1,0 for i in reversed(range(4)): player_current = self.player.in_round(self.round_number - i) player_current.calculate_portfolioPerformance() player_current.calculate_portfolio_returnInEur() player_current.calculate_portfolio_returnInPercent() player_current.calculate_marketPerformance() # set variable to show "continue investing" button invested_previous_round = True # If player's last decision was not to invest, use payoff of 4 rounds ago else: for i in reversed(range(4)): player_current = self.player.in_round(self.round_number - i) player_4roundsago = self.player.in_round(self.round_number - 4) player_current.payoff = player_4roundsago.payoff player_current.portfolio_returnInEur = player_4roundsago.portfolio_returnInEur player_current.portfolio_returnInPercent = player_4roundsago.portfolio_returnInPercent player_current.calculate_marketPerformance() player_current.player_invests = False invested_previous_round = False # --- Group that sees quartly performance --- # If round 1 or invested in previous round, calculate new portfolio data else: if self.round_number == 1: invested_previous_round = False self.player.calculate_portfolioPerformance() self.player.calculate_portfolio_returnInEur() self.player.calculate_portfolio_returnInPercent() elif (self.player.in_round(self.round_number - 1).player_invests == True): invested_previous_round = True self.player.calculate_portfolioPerformance() self.player.calculate_portfolio_returnInEur() self.player.calculate_portfolio_returnInPercent() # Else use portfolio data from last round else: invested_previous_round = False self.player.payoff = self.player.in_round(self.round_number - 1).payoff self.player.portfolio_returnInEur = self.player.in_round(self.round_number - 1).portfolio_returnInEur self.player.portfolio_returnInPercent = self.player.in_round(self.round_number - 1).portfolio_returnInPercent self.player.calculate_marketPerformance() # Determine whether it is last round if self.round_number != Constants.num_rounds: is_not_last_round = True else: is_not_last_round = False # Values for final page difference_market_portfolio = 0 return_market_percent = 0 final_payoff = 0 url_payoff = "https://denniswetzel.typeform.com/to/d0aIOL?redirect=" if self.round_number == Constants.num_rounds: # Difference between portfolio and market performance for final page difference_market_portfolio = self.player.payoff - self.player.market_performance # Caclulate Market return in percent to show on final page return_market_percent = round (100 * float(self.player.market_performance - Constants.initial_investment) / float(Constants.initial_investment), 2) # Round up final payoff to 10 cents # import math # final_payoff = math.ceil((self.player.payoff / 10000)*10)/10 # Determine payoff group if self.player.portfolio_returnInPercent < return_market_percent: final_payoff = 20 elif self.player.portfolio_returnInPercent == return_market_percent: final_payoff = 30 else: final_payoff = 40 # Round counter for yearly view if (self.player.treatment_group == "yearly_edu" or self.player.treatment_group =="yearly"): round_no = int(self.round_number/4) + 1 else: round_no = self.round_number return dict ( invested_previous_round = invested_previous_round, is_not_last_round = is_not_last_round, difference_market_portfolio = difference_market_portfolio, difference_market_portfolio_negative = -1 * difference_market_portfolio, return_market_percent = return_market_percent, final_payoff = final_payoff, url_payoff = url_payoff + str((final_payoff + 77)*1337) + str(0), round_no = round_no ) def js_vars(self): # Define boolean to show educational popups if (self.player.treatment_group == "yearly_edu" or self.player.treatment_group =="quarterly_edu"): has_educational_info = True else: has_educational_info = False return dict( market_values = Constants.cumulative_market_return[0:self.round_number], timeseries = Constants.timeseries[0:self.round_number], # round number - 1 array starts at 0 performance_modals = Constants.quarterly_performance[self.round_number - 1], has_educational_info = has_educational_info, is_positive_info = self.player.is_positive_info ) class Questions(Page): form_model = 'player' form_fields = ['valence', 'arousal', 'perceived_risk', 'confidence'] def is_displayed(self): # Ask questionnaire every 4th round, starting in round 5 and not in the last round if (self.round_number % 4 == 1) and (self.round_number != Constants.num_rounds): return True else: return False def vars_for_template(self): if self.round_number == 1: questionnaire_no = 1 # E.g. true round number is 9 and questionnaire no. 3 else: questionnaire_no = int((self.round_number)/4 + 1) return dict( questionnaire_no = questionnaire_no ) class ACS90(Page): form_model = 'player' form_fields = ['acs_1', 'acs_2', 'acs_4', 'acs_5', 'acs_7', 'acs_8', 'acs_10', 'acs_11', 'acs_13', 'acs_14', 'acs_16', 'acs_17', 'acs_19', 'acs_20', 'acs_22', 'acs_23', 'acs_25', 'acs_26', 'acs_28', 'acs_29', 'acs_31', 'acs_32', 'acs_34', 'acs_35'] def is_displayed(self): if self.round_number == Constants.num_rounds - 1: return True else: return False page_sequence = [Cockpit, Questions, ACS90]