from ._builtin import Page, WaitPage from .models import Constants, Slider from otree.api import Page from django.forms import modelformset_factory from math import ceil from random import randint class SliderTaskPage1(Page): template_name = "slider_task/SliderTaskPage1.html" Constants = None Slider = None def vars_for_template(self): SliderFormSet = modelformset_factory(self.Slider, fields=('end_pos', 'touched'), extra=0) def _chunks(l, n): """Yield successive n-sized chunks from l.""" for i in range(0, len(l), n): yield l[i:i + n] sliders_query_set = self.Slider.objects.filter(player__exact=self.player) # assert len(sliders_query_set) == Constants.num_sliders slider_formset = SliderFormSet(queryset=sliders_query_set) # starting_values = [s.start_pos for s in sliders_query_set] # min_values = [s.minimum for s in sliders_query_set] # max_values = [s.maximum for s in sliders_query_set] # offsets = [randint(0, 10) for _ in sliders_query_set] starting_values = [] min_values = [] max_values = [] offsets = [] for s in sliders_query_set: starting_values.append(s.start_pos) min_values.append(s.minimum) max_values.append(s.maximum) offsets.append(randint(0, 10)) if hasattr(self.Constants, 'slider_columns'): if self.Constants.slider_columns > 0: slider_columns = self.Constants.slider_columns else: slider_columns = 1 chunk_size = ceil(self.player.num_sliders / slider_columns) return { 'slider_formset': slider_formset, 'slider_values_and_forms': list(_chunks(list(zip(offsets, min_values, max_values, starting_values, slider_formset.forms)), chunk_size)), 'slider_columns': slider_columns } def before_next_page(self): submitted_data = self.form.data slider_objs_by_id = {slider.pk: slider for slider in self.player.slider_set.all()} assert len(slider_objs_by_id) == self.player.num_sliders for i in range(self.player.num_sliders): input_prefix = 'form-%d-' % i slider_id = int(submitted_data[input_prefix + 'id']) end_pos = submitted_data[input_prefix + 'end_pos'] touched = submitted_data[input_prefix + 'touched'] slider = slider_objs_by_id[slider_id] slider.end_pos = end_pos slider.touched = True if touched == "True" else False slider.save() slider.is_centered() slider.save() self.player.count_centered_sliders() class SliderTaskPage2(Page): template_name = "slider_task/SliderTaskPage2.html" Constants = None Slider = None def vars_for_template(self): SliderFormSet = modelformset_factory(self.Slider, fields=('end_pos', 'touched'), extra=0) def _chunks(l, n): """Yield successive n-sized chunks from l.""" for i in range(0, len(l), n): yield l[i:i + n] sliders_query_set = self.Slider.objects.filter(player__exact=self.player) # assert len(sliders_query_set) == Constants.num_sliders slider_formset = SliderFormSet(queryset=sliders_query_set) # starting_values = [s.start_pos for s in sliders_query_set] # min_values = [s.minimum for s in sliders_query_set] # max_values = [s.maximum for s in sliders_query_set] # offsets = [randint(0, 10) for _ in sliders_query_set] starting_values = [] min_values = [] max_values = [] offsets = [] for s in sliders_query_set: starting_values.append(s.start_pos) min_values.append(s.minimum) max_values.append(s.maximum) offsets.append(randint(0, 10)) if hasattr(self.Constants, 'slider_columns'): if self.Constants.slider_columns > 0: slider_columns = self.Constants.slider_columns else: slider_columns = 1 chunk_size = ceil(self.player.num_sliders / slider_columns) return { 'slider_formset': slider_formset, 'slider_values_and_forms': list(_chunks(list(zip(offsets, min_values, max_values, starting_values, slider_formset.forms)), chunk_size)), 'slider_columns': slider_columns } def before_next_page(self): submitted_data = self.form.data slider_objs_by_id = {slider.pk: slider for slider in self.player.slider_set.all()} assert len(slider_objs_by_id) == self.player.num_sliders for i in range(self.player.num_sliders): input_prefix = 'form-%d-' % i slider_id = int(submitted_data[input_prefix + 'id']) end_pos = submitted_data[input_prefix + 'end_pos'] touched = submitted_data[input_prefix + 'touched'] slider = slider_objs_by_id[slider_id] slider.end_pos = end_pos slider.touched = True if touched == "True" else False slider.save() slider.is_centered() slider.save() self.player.count_centered_sliders() class SliderTaskPage3(Page): template_name = "slider_task/SliderTaskPage3.html" Constants = None Slider = None def vars_for_template(self): SliderFormSet = modelformset_factory(self.Slider, fields=('end_pos', 'touched'), extra=0) def _chunks(l, n): """Yield successive n-sized chunks from l.""" for i in range(0, len(l), n): yield l[i:i + n] sliders_query_set = self.Slider.objects.filter(player__exact=self.player) # assert len(sliders_query_set) == Constants.num_sliders slider_formset = SliderFormSet(queryset=sliders_query_set) # starting_values = [s.start_pos for s in sliders_query_set] # min_values = [s.minimum for s in sliders_query_set] # max_values = [s.maximum for s in sliders_query_set] # offsets = [randint(0, 10) for _ in sliders_query_set] starting_values = [] min_values = [] max_values = [] offsets = [] for s in sliders_query_set: starting_values.append(s.start_pos) min_values.append(s.minimum) max_values.append(s.maximum) offsets.append(randint(0, 10)) if hasattr(self.Constants, 'slider_columns'): if self.Constants.slider_columns > 0: slider_columns = self.Constants.slider_columns else: slider_columns = 1 chunk_size = ceil(self.player.num_sliders / slider_columns) return { 'slider_formset': slider_formset, 'slider_values_and_forms': list(_chunks(list(zip(offsets, min_values, max_values, starting_values, slider_formset.forms)), chunk_size)), 'slider_columns': slider_columns } def before_next_page(self): submitted_data = self.form.data slider_objs_by_id = {slider.pk: slider for slider in self.player.slider_set.all()} assert len(slider_objs_by_id) == self.player.num_sliders for i in range(self.player.num_sliders): input_prefix = 'form-%d-' % i slider_id = int(submitted_data[input_prefix + 'id']) end_pos = submitted_data[input_prefix + 'end_pos'] touched = submitted_data[input_prefix + 'touched'] slider = slider_objs_by_id[slider_id] slider.end_pos = end_pos slider.touched = True if touched == "True" else False slider.save() slider.is_centered() slider.save() self.player.count_centered_sliders() class SliderTaskPagePractice(Page): template_name = "slider_task/SliderTaskPagePractice.html" Constants = None Slider = None def vars_for_template(self): SliderFormSet = modelformset_factory(self.Slider, fields=('end_pos', 'touched'), extra=0) def _chunks(l, n): """Yield successive n-sized chunks from l.""" for i in range(0, len(l), n): yield l[i:i + n] sliders_query_set = self.Slider.objects.filter(player__exact=self.player) # assert len(sliders_query_set) == Constants.num_sliders slider_formset = SliderFormSet(queryset=sliders_query_set) # starting_values = [s.start_pos for s in sliders_query_set] # min_values = [s.minimum for s in sliders_query_set] # max_values = [s.maximum for s in sliders_query_set] # offsets = [randint(0, 10) for _ in sliders_query_set] starting_values = [] min_values = [] max_values = [] offsets = [] for s in sliders_query_set: starting_values.append(s.start_pos) min_values.append(s.minimum) max_values.append(s.maximum) offsets.append(randint(0, 10)) if hasattr(self.Constants, 'slider_columns'): if self.Constants.slider_columns > 0: slider_columns = self.Constants.slider_columns else: slider_columns = 1 chunk_size = ceil(self.player.num_sliders / slider_columns) return { 'slider_formset': slider_formset, 'slider_values_and_forms': list(_chunks(list(zip(offsets, min_values, max_values, starting_values, slider_formset.forms)), chunk_size)), 'slider_columns': slider_columns } class Introduction(Page): pass class Introduction2(Page): pass class Introduction3(Page): pass class Introduction4(Page): pass class Results1(Page): pass class Results2(Page): pass class Results3(Page): pass class Practice(SliderTaskPagePractice): timeout_seconds = 180 Constants = Constants Slider = Slider class SlidersWaitPage1(WaitPage): after_all_players_arrive = 'offer_calculate1' class SlidersWaitPage2(WaitPage): after_all_players_arrive = 'offer_calculate2' class SlidersWaitPage3(WaitPage): after_all_players_arrive = 'offer_calculate3' class Warning1(Page): timeout_seconds = 20 def is_displayed(self): return self.player.id_in_group == 2 class Warning2(Page): timeout_seconds = 20 def is_displayed(self): return self.player.id_in_group == 2 class Warning3(Page): timeout_seconds = 20 def is_displayed(self): return self.player.id_in_group == 2 class Test(Page): form_model = 'player' form_fields = ['practice_1', 'practice_2', 'practice_3', 'practice_4'] class TestResult(Page): pass class Info(Page): form_model = 'player' form_fields = ['ad_soyad', 'mail_tlf', 'yas', 'cinsiyet', 'egitim'] class Offer1(Page): form_model = 'group' form_fields = ['offer_amount1'] def is_displayed(self): return self.player.id_in_group == 1 class Offer2(Page): form_model = 'group' form_fields = ['offer_amount2'] def is_displayed(self): return self.player.id_in_group == 1 class Offer3(Page): form_model = 'group' form_fields = ['offer_amount3'] def is_displayed(self): return self.player.id_in_group == 1 class Sliders1(SliderTaskPage1): timeout_seconds = 120 Constants = Constants Slider = Slider def is_displayed(self): return self.player.id_in_group == 2 class Sliders2(SliderTaskPage2): timeout_seconds = 120 Constants = Constants Slider = Slider def is_displayed(self): return self.player.id_in_group == 2 class Sliders3(SliderTaskPage3): timeout_seconds = 120 Constants = Constants Slider = Slider def is_displayed(self): return self.player.id_in_group == 2 class ResultsWaitPage1(WaitPage): after_all_players_arrive = 'set_payoffs1' class ResultsWaitPage2(WaitPage): after_all_players_arrive = 'set_payoffs2' class ResultsWaitPage3(WaitPage): after_all_players_arrive = 'set_payoffs3' class FinalResultsWaitPage(WaitPage): after_all_players_arrive = 'set_all_payoffs' class FinalResults(Page): pass class OfferExpectation1(Page): form_model = 'player' form_fields = ['offer_expectation1'] def is_displayed(self): return self.player.id_in_group == 2 class OfferExpectation2(Page): form_model = 'player' form_fields = ['offer_expectation2'] def is_displayed(self): return self.player.id_in_group == 2 class OfferExpectation3(Page): form_model = 'player' form_fields = ['offer_expectation3'] def is_displayed(self): return self.player.id_in_group == 2 class SliderExpectation1(Page): form_model = 'player' form_fields = ['slider_expectation1'] def is_displayed(self): return self.player.id_in_group == 1 class SliderExpectation2(Page): form_model = 'player' form_fields = ['slider_expectation2'] def is_displayed(self): return self.player.id_in_group == 1 class SliderExpectation3(Page): form_model = 'player' form_fields = ['slider_expectation3'] def is_displayed(self): return self.player.id_in_group == 1 page_sequence = [Info, Introduction, Introduction2, Practice, Introduction4, Test, TestResult, Introduction3, Offer1, SlidersWaitPage1, SliderExpectation1, OfferExpectation1, Warning1, Sliders1, ResultsWaitPage1, Results1, Offer2, SlidersWaitPage2, SliderExpectation2, OfferExpectation2, Warning2, Sliders2, ResultsWaitPage2, Results2, Offer3, SlidersWaitPage3, SliderExpectation3, OfferExpectation3, Warning3, Sliders3, ResultsWaitPage3, Results3, FinalResultsWaitPage, FinalResults]