from . import models from ._builtin import Page, WaitPage from otree.api import Currency as c, currency_range from .forms import PFormset from .models import Constants, Player, Punishment as PunishmentModel from otree.constants import timeout_happened import random import random class WaitPage1(WaitPage): timeout_seconds = 60 # group_by_arrival_time = True def is_displayed(self): return self.round_number == 1 # def after_all_players_arrive(self): # self.subsession.get_game() def before_next_page(self): if self.timeout_happened: self.player.dropWP = 1 body_text = "グループが形成できるまでお待ち下さい。通常は5分以内にグループ人数がそろいますが、長い間そろわない場合、ここであきらめて、ヤフーの画面で「83472」と打ち込めば、30ポイントの基本参加謝礼を獲得して終わりにできます。ただし、その場合、取引で得られる50~130ポイントの追加謝礼を得る機会は失われます。" class GameStart(Page): timeout_seconds = 60 def is_displayed(self): return self.round_number == 1 def before_next_page(self): if self.timeout_happened: self.player.dropGS = 1 pass class CheckPGGPinststart(Page): # timeout_seconds = 30 def is_displayed(self): self.subsession.get_game() # self.player.id_in_group=1 return self.subsession.round_number == 1 class Intro(Page): template_name = 'pggfg/Introduction.html' def is_displayed(self): # self.player.id_in_group=1 return self.subsession.round_number == 1 class page11(Page): form_model = models.Player form_fields = ['q11'] def is_displayed(self): return self.subsession.round_number == 1 #The questions on this page are all about matching protocol and number of repetitions def error_message(self, values): if values['q11'] != 3 : return '回答が間違っています。【全ての説明を表示する/しない】を押して、確認してから回答し直してください。' class page1_ans1(Page): def is_displayed(self): return self.subsession.round_number == 1 class page12(Page): def is_displayed(self): if self.subsession.round_number == 1 and self.player.q11 != 3: return True return False form_model = models.Player form_fields = ['q12'] class page1_ans2(Page): def is_displayed(self): if self.subsession.round_number == 1 and self.player.q11 != 3: return True return False class page13(Page): def is_displayed(self): if self.subsession.round_number == 1 and self.player.q11 != 3 and self.player.q12 != 3: return True return False form_model = models.Player form_fields = ['q13'] class page1_ans3(Page): def is_displayed(self): if self.subsession.round_number == 1 and self.player.q11 != 3 and self.player.q12 != 3: return True return False class after_instP(WaitPage): def after_all_players_arrive(self): return True def is_displayed(self): return self.round_number == 1 body_text = "同じグループの3人全員がそろうまで、少々お待ちください。全員そろったら、取引に入ります。場合によっては(他の参加者の内容理解がゆっくりな場合)、5分以上待つ場合もあります。または、3人のうちで参加を途中で取りやめた人が出た場合、これ以上進まなくなってしまいます。長い間そろわない場合、ここであきらめて、ヤフーの画面で「92731」と打ち込めば、30ポイントの基本参加謝礼を獲得して終わりにできます。その場合、追加謝礼は先ほどまでの総獲得ポイント分のみとなりますので、ご了承ください。" #class after_instP(Page): # def is_displayed(self): # if self.subsession.round_number == 1: # return True # return False class CheckPGGPstart(Page): timeout_seconds = 30 def is_displayed(self): # self.player.id_in_group=1 return self.subsession.round_number == 1 class Contribute(Page): timeout_seconds = 40 form_model = 'player' form_fields = ['contribution'] timeout_submission = {'contribution': Constants.endowment} def before_next_page(self): if self.timeout_happened: self.player.dropPC = 1 class AfterContribWP(WaitPage): after_all_players_arrive = 'set_pd_payoffs' # body_text = "他のプレイヤーが終わるまで、しばらくお待ちください" # body_text = "他のプレイヤーが終わるまで、しばらくお待ちください。5分以上、この画面から進まない場合、システムエラーかマシントラブルだと思われます。その場合、ヤフーの画面で「42376」と打ち込み、50ポイントの基本参加謝礼を獲得して終わりにしてください。追加報酬はここまでの獲得額を元に算出し、1月下旬に「追加謝礼」のタスクを掲載いたします。" body_text = "他のプレイヤーが終わるまで、しばらくお待ちください。3分以上、この画面から進まない場合、システムエラーかマシントラブルだと思われますので、まずは「更新」を押してみてください。それでも進まない場合、ヤフーの画面で「42876」と打ち込んでください(実験開始から1時間が立つとヤフーの画面は閉じてしまうので、早めに打ち込んでください)。追加報酬は参加を取り辞めたところまでの獲得額を元に算出し、2週間以内に「追加謝礼」のタスクを掲載いたします。なお、ヤフーの画面で「42876」と打ち込んだ後でも、実験参加を継続すれば、その分の獲得額も追加報酬に加えられますが、1時間以上の参加になる可能性がありますので、ご理解の上参加を継続するかご判断ください。" class Results1(Page): """Players payoff: How much each has earned""" timeout_seconds = 30 def vars_for_template(self): players = self.player.get_others_in_group() random.shuffle(players) return dict(players=players, ) class Punishment(Page): timeout_seconds = 80 def vars_for_template(self): players = self.player.get_others_in_group() random.shuffle(players) return dict(players=players, ) def post(self): print(self.request.POST) return super().post() def get_formset(self, data=None): return PFormset(instance=self.player, data=data, ) def get_form(self, data=None, files=None, **kwargs): # here if this page was forced by admin to continue we just submit an empty form (with no formset data) # if we need this data later on that can create some problems. But that's the price we pay for autosubmission if data and data.get('timeout_happened'): return super().get_form(data, files, **kwargs) if not data: return self.get_formset() formset = self.get_formset(data=data) return formset def before_next_page(self): if self.timeout_happened: self.player.punishments_sent.all().update(amount=0) self.player.dropPP = 1 class AfterPunishmentWP(WaitPage): after_all_players_arrive = 'set_punishments' # body_text = "他のプレイヤーが終わるまで、しばらくお待ちください" # body_text = "他のプレイヤーが終わるまで、しばらくお待ちください。5分以上、この画面から進まない場合、システムエラーかマシントラブルだと思われます。その場合、ヤフーの画面で「42376」と打ち込み、50ポイントの基本参加謝礼を獲得して終わりにしてください。追加報酬はここまでの獲得額を元に算出し、1月下旬に「追加謝礼」のタスクを掲載いたします。" body_text = "他のプレイヤーが終わるまで、しばらくお待ちください。3分以上、この画面から進まない場合、システムエラーかマシントラブルだと思われますので、まずは「更新」を押してみてください。それでも進まない場合、ヤフーの画面で「42876」と打ち込んでください(実験開始から1時間が立つとヤフーの画面は閉じてしまうので、早めに打ち込んでください)。追加報酬は参加を取り辞めたところまでの獲得額を元に算出し、2週間以内に「追加謝礼」のタスクを掲載いたします。なお、ヤフーの画面で「42876」と打ち込んだ後でも、実験参加を継続すれば、その分の獲得額も追加報酬に加えられますが、1時間以上の参加になる可能性がありますので、ご理解の上参加を継続するかご判断ください。" class Results(Page): timeout_seconds = 40 ... class end_game(Page): def is_displayed(self): if self.subsession.round_number == Constants.num_rounds: return True return False page_sequence = [ # WaitPage1, # GameStart, CheckPGGPinststart, Intro, page11, page1_ans1, # page12, # page1_ans2, # page13, # page1_ans3, after_instP, CheckPGGPstart, Contribute, AfterContribWP, # Results1, Punishment, AfterPunishmentWP, Results, end_game, ]