from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) #from otree_tools.models import fields as tool_models import random import numpy as np import pandas as pd from django.forms.fields import MultiValueField, CharField, MultipleChoiceField, ChoiceField from otree.common import expand_choice_tuples from django.core.exceptions import ValidationError from django.forms import widgets as wid import xlrd #from .widgets import ImageCheckboxSelectMultiple import itertools import json from django.db import models as modelsdjango import json from django.core import checks duplicate_err_msg = 'One of the choices duplicates with the internal name for "Other" choice field' wrong_value_msg = 'Please provide a valid name for other_value. It should look like Python variable (no spaces etc.)' wrong_type_err_msg = 'Please provide a choices option for ListField which should be either a list or tuple of values' divider = ':' class OtherTextInput(wid.TextInput): is_required = False def get_context(self, name, value, attrs): context = super().get_context(name, value, attrs) if context['widget']['attrs'].get('required'): context['widget']['attrs'].pop('required') context['other_text_input'] = name return context class OtherSelectorWidget(wid.MultiWidget): #template_name = 'otree_tools/widgets/multiwidget.html' def __init__(self, other_val='other', choices=None, attrs=None): self.choices = choices self.other_val = other_val; _widgets = ( widgets.RadioSelect(choices=choices, attrs={'class': 'other_wg_radio_group'}), OtherTextInput(attrs={'class': 'hidden_text_group', }, ), ) super().__init__(_widgets, attrs) def get_context(self, name, value, attrs): con = super().get_context(name, value, attrs) con['wrap_label'] = True con['other_val'] = self.other_val # this one is needed only for a yet empty field if isinstance(value, list): con['widget']['show_other_inbox'] = value[0] == self.other_val else: if isinstance(value, str): con['widget']['show_other_inbox'] = self.decompress(value)[0] == self.other_val return con def decompress(self, value): # TODO what if someone starts his other answer with trailing divider? ignore for now if value: split_value = value.split(divider) if len(split_value) > 1: is_other = split_value[0] == self.other_val the_rest = ''.join(split_value[1:]) else: is_other = False the_rest = '' if is_other: return [self.other_val, the_rest] else: return [value, ''] return [None, None, ] def format_output(self, rendered_widgets): return ''.join(rendered_widgets) def value_from_datadict(self, data, files, name): radio_data = self.widgets[0].value_from_datadict(data, files, name + '_0') text_data = self.widgets[1].value_from_datadict(data, files, name + '_1') return [radio_data, text_data] class OtherFormField(MultiValueField): other_value = 'other_' other_label = 'Other' required = True def __init__(self, other_value=None, other_label=None, label='', **kwargs): self.choices = kwargs.pop('choices') if other_label: self.other_label = other_label if other_value: self.other_value = other_value # check that other_value provided is valid assert self.other_value.isidentifier(), wrong_value_msg if isinstance(self.choices, (list, tuple)) and len(self.choices) > 0: self.choices = list(expand_choice_tuples(self.choices)) flat_choices = [i for i, j in self.choices] # check if value of choices start with other_val and divider, like 'other: SOMETHING' for i in flat_choices: assert not i.startswith(self.other_value), duplicate_err_msg self.choices += [(self.other_value, self.other_label), ] self.widget = OtherSelectorWidget(choices=self.choices, other_val=self.other_value) fields = (CharField(required=self.required), CharField(required=False),) super().__init__(fields=fields, require_all_fields=False, label=label, **kwargs) def compress(self, data_list): # this fallback is needed only if the field is blank if len(data_list) > 0: if data_list[0] == self.other_value: if data_list[1] in (None, ''): raise ValidationError(u'Please provide the answer for "{}" field'.format(self.other_label)) return '{}{}{}'.format(self.other_value, divider, data_list[1]) else: return data_list[0] class InnerChoiceMixin: def __setattr__(self, name, value): super().__setattr__(name, value) if name == 'choices': if isinstance(value, (list, tuple)) and len(value) > 0: self.inner_choices = list(expand_choice_tuples(value)) class ListField(modelsdjango.CharField): def __init__( self, *, max_length=10000, blank=False, **kwargs): kwargs.setdefault('help_text', '') kwargs.setdefault('null', True) super().__init__( max_length=max_length, blank=blank, **kwargs) def from_db_value(self, value, expression, connection, context): return self.to_python(value) def to_python(self, value): if isinstance(value, list): return value if value is None: return value return json.loads(value) def get_prep_value(self, value): return json.dumps(value) class OtherModelField(InnerChoiceMixin, models.CharField): other_value = None other_label = None def __init__(self, max_length=10000, blank=False, label=None, *args, **kwargs): kwargs.update(dict(label=label, )) kwargs.setdefault('help_text', '') kwargs.setdefault('null', True) kwargs.setdefault('verbose_name', kwargs.pop('label')) self.other_value = kwargs.pop('other_value', None) self.other_label = kwargs.pop('other_label', None) self.inner_choices = kwargs.pop('choices', None) super().__init__(max_length=max_length, blank=blank, *args, **kwargs) def formfield(self, **kwargs): return OtherFormField(other_value=self.other_value, other_label=self.other_label, choices=self.inner_choices, label=self.verbose_name, required=not self.blank, **kwargs) class Constants(BaseConstants): name_in_url = 'survey' players_per_group = None num_rounds = 1 data = pd.read_csv("mask_values.csv") mask_values = {'masks': list(data['maskname']), 'mean': list(data['mean'])} df_masks = pd.DataFrame(mask_values) nrow = df_masks['masks'].size # list including all names of players player_data = pd.read_excel("player_stats.xls", sheet_name='Sheet 1') class Subsession(BaseSubsession): def creating_session(self): from .pages import initial_page_sequence aaa = [i.__name__.split('_') for i in initial_page_sequence] page_blocks = [list(group) for key, group in itertools.groupby(aaa, key=lambda x: x[0])] for player in self.get_players(): # randomize pages pb=page_blocks.copy() random.shuffle(pb) level1 = list(itertools.chain.from_iterable(pb)) level2 = ['_'.join(i) for i in level1] player.page_sequence = json.dumps(level2) ###### Information treatment player.full_information = random.choice([True, False]) ###### Probability treatment #player.probability = random.choice(["probabilistic", "certain", "none"]) player.probability = "none" ###### Player Setup # shuffle player list to randomize position in list player_data = pd.read_excel("player_stats.xls", sheet_name='Sheet 1') playerlist = list(np.random.choice(list(player_data['img_names']), p = list(player_data['probability']/np.sum(player_data['probability'])), size = 29, replace=False)) for i in playerlist: i = "card_"+i random.shuffle(playerlist) ##### Masks Setup # list all possible masks for combination if player.full_information == False: masks = ['mask' + str(int(i)) + ".png" for i in np.arange(1, (Constants.nrow - 70)/2, 1)] if player.full_information == True: masks = ['mask' + str(int(i)) + "info.png" for i in np.arange(1, (Constants.nrow - 70)/2, 1)] # shuffle masks random.shuffle(masks) ###### Endowment player.endowment = random.choice(['low', 'high']) shuffle_full_info = ['mask' + str(int(i)) + "info.png" for i in np.arange(1, Constants.nrow/2, 1)] ##### Players # Endowment player.endowment1 = playerlist[0] player.endowment2 = playerlist[1] player.endowment3 = playerlist[2] # Rating player.rating1_img = playerlist[3] player.rating2_img = playerlist[4] player.rating3_img = playerlist[5] # Pair 1 player.pairs1_1 = playerlist[6] # Pair 1/ left player.pairs1_2 = playerlist[7] # Pair 1/ right # Pair 2 player.pairs2_1 = playerlist[8] # Pair 1/ left player.pairs2_2 = playerlist[9] # Pair 1/ right # Five scarce 1 player.five_scarce1_1 = playerlist[10] player.five_scarce1_2 = playerlist[11] player.five_scarce1_3 = playerlist[12] player.five_scarce1_4 = playerlist[13] player.five_scarce1_5 = playerlist[14] # Five scarce 2 player.five_scarce2_1 = playerlist[15] player.five_scarce2_2 = playerlist[16] player.five_scarce2_3 = playerlist[17] player.five_scarce2_4 = playerlist[18] player.five_scarce2_5 = playerlist[19] # Risk 1 player.risk1_given_player = playerlist[20] player.risk1_new_player = playerlist[21] # Risk 2 player.risk2_given_player = playerlist[22] player.risk2_new_player = playerlist[23] # Lottery player.lottery1_1_img = playerlist[24] player.lottery1_2_img = playerlist[25] player.lottery1_3_img = playerlist[26] player.lottery1_4_img = playerlist[27] player.lottery1_5_img = playerlist[28] ##### Masks # Endowment player.endowment1mask = "".join(["mask", str(int(np.random.choice(range(73,77),size = 1, replace = False))), "extra.png"]) player.endowment2mask = "".join(["mask", str(int(np.random.choice(range(73,77),size = 1, replace = False))), "extra.png"]) player.endowment3mask = "".join(["mask", str(int(np.random.choice(range(73,77),size = 1, replace = False))), "extra.png"]) #if player.endowment == 'medium': # player.endowment1mask = "".join(["mask", str(int(np.random.choice(range(67, 74),size = 1, replace = False))), "extra.png"]) # player.endowment2mask = "".join(["mask", str(int(np.random.choice(range(67, 74),size = 1, replace = False))), "extra.png"]) # player.endowment3mask = "".join(["mask", str(int(np.random.choice(range(67, 74),size = 1, replace = False))), "extra.png"]) #if player.endowment == 'high': # player.endowment1mask = "".join(["mask", str(int(np.random.choice(range(75, 82),size = 1, replace = False))), "extra.png"]) # player.endowment2mask = "".join(["mask", str(int(np.random.choice(range(75, 82),size = 1, replace = False))), "extra.png"]) # player.endowment3mask = "".join(["mask", str(int(np.random.choice(range(75, 82),size = 1, replace = False))), "extra.png"]) # Rating player.rating1_mask = masks[0] player.rating2_mask = masks[1] player.rating3_mask = masks[2] # Pair 1 player.mask1_1 = masks[3] player.mask1_2 = masks[4] # Pair 2 player.mask2_1 = masks[5] player.mask2_2 = masks[6] # Five scarce 1 player.five_mask1 = masks[7] player.five_mask2 = masks[8] player.five_mask3 = masks[9] player.five_mask4 = masks[10] player.five_mask5 = masks[11] # Five scarce 2 player.five_mask2_1 = masks[12] player.five_mask2_2 = masks[13] player.five_mask2_3 = masks[14] player.five_mask2_4 = masks[15] player.five_mask2_5 = masks[16] # Lottery player.lottery1_1_mask = masks[17] player.lottery1_2_mask = masks[18] player.lottery1_3_mask = masks[19] player.lottery1_4_mask = masks[20] player.lottery1_5_mask = masks[21] ##### Values # Endowment player.endowment1value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.endowment1mask, ['mean']].values player.endowment2value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.endowment2mask, ['mean']].values player.endowment3value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.endowment3mask, ['mean']].values # Rating player.rating1_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.rating1_mask, ['mean']].values player.rating2_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.rating2_mask, ['mean']].values player.rating3_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.rating3_mask, ['mean']].values # Pair 1 player.mask1_1_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.mask1_1, ['mean']].values player.mask1_2_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.mask1_2, ['mean']].values # Pair 2 player.mask2_1_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.mask2_1, ['mean']].values player.mask2_2_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.mask2_2, ['mean']].values # Five scarce 1 player.five_mask1_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_mask1, ['mean']].values player.five_mask2_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_mask2, ['mean']].values player.five_mask3_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_mask3, ['mean']].values player.five_mask4_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_mask4, ['mean']].values player.five_mask5_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_mask5, ['mean']].values # Five scarce 2 player.five_mask2_1_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_mask2_1, ['mean']].values player.five_mask2_2_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_mask2_2, ['mean']].values player.five_mask2_3_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_mask2_3, ['mean']].values player.five_mask2_4_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_mask2_4, ['mean']].values player.five_mask2_5_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_mask2_5, ['mean']].values # Lottery player.lottery1_1_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.lottery1_1_mask, ['mean']].values player.lottery1_2_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.lottery1_2_mask, ['mean']].values player.lottery1_3_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.lottery1_3_mask, ['mean']].values player.lottery1_4_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.lottery1_4_mask, ['mean']].values player.lottery1_5_value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.lottery1_5_mask, ['mean']].values # Risk 1 player.risk1_given_value = 65 # Risk 2 player.risk2_given_value = 75 # Determing mask with value player.risk1_given_mask = str(Constants.df_masks.loc[Constants.df_masks['mean'] == player.risk1_given_value, ['masks']].values[0]) player.risk1_given_mask = player.risk1_given_mask.replace("[", "") player.risk1_given_mask = player.risk1_given_mask.replace("]", "") player.risk1_given_mask = player.risk1_given_mask.replace("'", "") player.risk2_given_mask = str(Constants.df_masks.loc[Constants.df_masks['mean'] == player.risk2_given_value, ['masks']].values[0]) player.risk2_given_mask = player.risk2_given_mask.replace("[", "") player.risk2_given_mask = player.risk2_given_mask.replace("]", "") player.risk2_given_mask = player.risk2_given_mask.replace("'", "") # ###### 3 out of 5 (five_multiple) # player.five_multiple1 = playerlist[7] # player.five_multiple2 = playerlist[8] # player.five_multiple3 = playerlist[9] # player.five_multiple4 = playerlist[10] # player.five_multiple5 = playerlist[11] # player.five_m_mask1 = masks[7] # player.five_m_mask2 = masks[8] # player.five_m_mask3 = masks[9] # player.five_m_mask4 = masks[10] # player.five_m_mask5 = masks[11] # player.five_m_mask1value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_m_mask1, ['mean']].values # player.five_m_mask2value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_m_mask2, ['mean']].values # player.five_m_mask3value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_m_mask3, ['mean']].values # player.five_m_mask4value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_m_mask4, ['mean']].values # player.five_m_mask5value = Constants.df_masks.loc[Constants.df_masks['masks'] == player.five_m_mask5, ['mean']].values ##### Risk ###### # 1. Risk risk1_integer = np.intc(np.random.random_integers(1, 10, size = 1)) risk1_value_shuffle = [65 - risk1_integer, 65 + risk1_integer] np.random.shuffle(risk1_value_shuffle) player.risk1_new_value = risk1_value_shuffle[0] player.risk1_lower = 65 - risk1_integer player.risk1_upper = 65 + risk1_integer player.risk1_new_mask = str(Constants.df_masks.loc[Constants.df_masks['mean'] == int(player.risk1_new_value), ['masks']].values[0]) player.risk1_new_mask = player.risk1_new_mask.replace("[", "") player.risk1_new_mask = player.risk1_new_mask.replace("]", "") player.risk1_new_mask = player.risk1_new_mask.replace("'", "") # 2. Risk risk2_odds = [[10, 90], [20, 80], [30,70], [40,60]] risk2_values = [[85, 74], [85, 73], [85, 71], [85, 69]] integer = int(np.random.random_integers(0,3, size = 1)) player.risk2_odds = risk2_odds[integer] player.risk2_payoff = risk2_values[integer] index = np.random.binomial(1, p = risk2_odds[integer][0]/100) player.risk2_new_value = player.risk2_payoff[index] player.risk2_new_mask = str(Constants.df_masks.loc[Constants.df_masks['mean'] == int(player.risk2_new_value), ['masks']].values[0]) player.risk2_new_mask = player.risk2_new_mask.replace("[", "") player.risk2_new_mask = player.risk2_new_mask.replace("]", "") player.risk2_new_mask = player.risk2_new_mask.replace("'", "") #player.rating_join_player = player.rating1_img #player.rating_join_mask = player.rating1_mask #player.rating_join_value = player.rating1_value #player.team_endowment_list = list(filter(None, [player.endowment1value, player.endowment2value, player.endowment3value, player.endowment4value, player.five_scarce_answer_mean])) class Group(BaseGroup): pass class Player(BasePlayer): from .widgets import ImageCheckboxSelectMultiple page_sequence = models.StringField() ## time stamp # start and end timestamp_start = models.FloatField() timestamp_end = models.FloatField() # sarce five timestamp_five = models.FloatField() timestamp_five2 = models.FloatField() # pairs timestamp_pairs = models.FloatField() timestamp_pairs2 = models.FloatField() # lottery timestamp_lottery1 = models.FloatField() timestamp_lottery2 = models.FloatField() timestamp_lottery3 = models.FloatField() timestamp_lottery4 = models.FloatField() timestamp_lottery5 = models.FloatField() timestamp_lottery = models.FloatField() # rating timestamp_rating = models.FloatField() timestamp_rating1 = models.FloatField() timestamp_rating2 = models.FloatField() timestamp_rating3 = models.FloatField() # risk timestamp_risk = models.FloatField() timestamp_risk1 = models.FloatField() timestamp_risk2 = models.FloatField() ### demographics # age age = models.IntegerField(label = "In welchem Jahr wurden Sie geboren?", min = 1919, max = 2001) # geschlecht sex = models.StringField(widget=widgets.RadioSelect, label = 'Welchem Geschlecht ordnen Sie sich zu?', choices = ["Männlich", "Weiblich", "Andere"]) # education education = models.StringField(widget=widgets.RadioSelect, label = 'Was ist Ihr höchster Bildungsabschluss?', choices = ["keinen Schulabschluss", "Haupt-/ Volkschulabschluss", "Realschulabschluss (oder gleichwertig)", "Abitur/Fachhochschulreife", "Bachelor/Master", "Promotion"]) # nationality # nationality = tool_models.OtherModelField(label = 'Welche Nationalität besitzen Sie?',# # choices = ["Deutsch"], # other_label = "Andere (bitte angeben)") nationality = OtherModelField(label = 'Welche Nationalität besitzen Sie?', choices = ["Deutsch"], other_label = "Andere (bitte angeben)") # contact contact = models.IntegerField(widget=widgets.RadioSelect, label = 'An wie vielen Tagen in der letzten Woche haben Sie mit einer Person gesprochen, die nach Deutschland gekommen ist, um hier zu leben?', choices = [0, 1, 2, 3, 4, 5, 6, 7]) contact2 = models.IntegerField(widget=widgets.RadioSelect, label = 'An wie vielen Tagen in der letzten Woche haben Sie mit einer Person, die nach Deutschland gekommen ist, um hier zu leben, ein interessantes Gespräch geführt?', choices = [0, 1, 2, 3, 4, 5, 6, 7]) # interest interest_football = models.StringField(widget=widgets.RadioSelect, label = "Wie sehr interessieren Sie sich für Fußball?", choices = ["sehr interessiert", "interessiert", "neutral", "wenig interessiert", "nicht interessiert"]) interest_games = models.IntegerField(widget=widgets.RadioSelect, label = "An wie vielen Tagen in der letzten Woche haben Sie Computer-Sportspiele gespielt?", choices = [0, 1, 2, 3, 4, 5, 6, 7]) interest_sportschau = models.StringField(widget=widgets.RadioSelect, label = "Wie oft schauen Sie sich Fußballspiele im Fernsehen an?", choices = ["oft", "gelegentlich", "kaum", "gar nicht"]) # party party = models.StringField(widget=widgets.RadioSelect, label = "Welcher politischen Partei in Deutschland fühlen Sie sich am nächsten?") def party_choices(self): choices = ["CDU - Christlich Demokratische Union Deutschlands/ Christlich-Soziale Union in Bayern", "SPD - Sozialdemokratische Partei Deutschlands", "AfD - Alternative für Deutschland", "FDP - Freie Demokratische Partei", "LINKE - Die Linke", "GRÜNE - Bündnis 90/Die Grünen", "Freie Wähler", "NPD - Nationaldemokratische Partei Deutschlands"] random.shuffle(choices) choices.append("Andere") choices.append("Keiner") return(choices) # zip zip = models.IntegerField(label = "Bitte geben Sie Ihre Postleitzahl an! (Ihre PLZ dient lediglich dem Zweck Kontextdaten auf Gemeindedaten mit ihren Daten zu verknüpfen)", min = 100, max = 99999) # jobs jobs = models.StringField(widget=widgets.RadioSelect, label = "Arbeitgeber sollten Deutsche gegenüber Einwanderern vorziehen, wenn Arbeitsplätze knapp sind.", choices = ["stimme überhaupt nicht zu", "stimme eher nicht zu", "stimme eher zu", "stimme voll und ganz zu"]) # comments comments = models.LongStringField(label = "Haben Sie weitere Kommentare?", blank = True) ## worker id worker_id = models.StringField(label = "Auf der nächsten Seite erhalten Sie den Code für Ihren Teilnahmebeitrag von 0,75€. Bitte geben Sie hier Ihre Clickworker ID ein, damit wir Ihnen Ihre Bonuszahlung überweisen können! (Bitte beachten Sie, dass dies 2-3 Wochen dauern kann)", blank = True) # Full information full_information = models.BooleanField() # Probability probability = models.StringField() # Endowment endowment = models.StringField() #team_endowment_list = tool_models.ListField() # endowment endowment1 = models.StringField() endowment2 = models.StringField() endowment3 = models.StringField() endowment1mask = models.StringField() endowment2mask = models.StringField() endowment3mask = models.StringField() endowment1value = models.IntegerField() endowment2value = models.IntegerField() endowment3value = models.IntegerField() # Risk 1 risk1_given_player = models.StringField() risk1_given_value = models.IntegerField() risk1_given_mask = models.StringField() risk1_new_player = models.StringField() risk1_new_value = models.IntegerField() risk1_new_mask = models.StringField() # Risk 2 risk2_given_player = models.StringField() risk2_given_value = models.IntegerField() risk2_given_mask = models.StringField() risk2_new_player = models.StringField() risk2_new_value = models.IntegerField() risk2_new_mask = models.StringField() #### First Pair # Player on left pairs1_1 = models.StringField() # Stats on left mask1_1 = models.StringField() # player on right pairs1_2 = models.StringField() # Stats on right mask1_2 = models.StringField() # mask values mask1_1_value = models.IntegerField() mask1_2_value = models.IntegerField() # empty field for value pair_answer = models.StringField(default = "anon.png") pair_answer_mask = models.StringField(default = "mask_anon.png") pair_answer_mean = models.IntegerField() #### Second Pair # Player on left pairs2_1 = models.StringField() # Stats on left mask2_1 = models.StringField() # player on right pairs2_2 = models.StringField() # Stats on right mask2_2 = models.StringField() # mask values mask2_1_value = models.IntegerField() mask2_2_value = models.IntegerField() # empty field for value pair2_answer = models.StringField(default = "anon.png") pair2_answer_mask = models.StringField(default = "mask_anon.png") pair2_answer_mean = models.IntegerField() ##### First: 1 out of 5 five_scarce1_1 = models.StringField() five_scarce1_2 = models.StringField() five_scarce1_3 = models.StringField() five_scarce1_4 = models.StringField() five_scarce1_5 = models.StringField() five_mask1 = models.StringField() five_mask2 = models.StringField() five_mask3 = models.StringField() five_mask4 = models.StringField() five_mask5 = models.StringField() five_mask1_value = models.IntegerField() five_mask2_value = models.IntegerField() five_mask3_value = models.IntegerField() five_mask4_value = models.IntegerField() five_mask5_value = models.IntegerField() five_scarce = models.StringField(default = "anon.png") five_scarce_answer_mask = models.StringField(default = "mask_anon.png") five_scarce_answer_mean = models.IntegerField() ##### Second: 1 out of 5 five_scarce2_1 = models.StringField() five_scarce2_2 = models.StringField() five_scarce2_3 = models.StringField() five_scarce2_4 = models.StringField() five_scarce2_5 = models.StringField() five_mask2_1 = models.StringField() five_mask2_2 = models.StringField() five_mask2_3 = models.StringField() five_mask2_4 = models.StringField() five_mask2_5 = models.StringField() five_mask2_1_value = models.IntegerField() five_mask2_2_value = models.IntegerField() five_mask2_3_value = models.IntegerField() five_mask2_4_value = models.IntegerField() five_mask2_5_value = models.IntegerField() five_scarce2 = models.StringField(default = "anon.png") five_scarce2_answer_mask = models.StringField(default = "mask_anon.png") five_scarce2_answer_mean = models.IntegerField() # ##### 3 out of 5 (Multiple_choice) # five_multiple1 = models.StringField() # five_multiple2 = models.StringField() # five_multiple3 = models.StringField() # five_multiple4 = models.StringField() # five_multiple5 = models.StringField() # five_m_mask1 = models.StringField() # five_m_mask2 = models.StringField() # five_m_mask3 = models.StringField() # five_m_mask4 = models.StringField() # five_m_mask5 = models.StringField() # five_mc = tool_models.MultipleChoiceModelField(label="Please select the three correct statements", # min_choices=3, max_choices=3) # five_m_mask1value = models.IntegerField() # five_m_mask2value = models.IntegerField() # five_m_mask3value = models.IntegerField() # five_m_mask4value = models.IntegerField() # five_m_mask5value = models.IntegerField() # five_mc_mean1 = models.IntegerField() # five_mc_mean2 = models.IntegerField() # five_mc_mean3 = models.IntegerField() # five_mc_mean4 = models.IntegerField() # five_mc_mean5 = models.IntegerField() # Risk risk1_player = models.StringField(default = "anon.png") risk1_value = models.IntegerField() risk1_mask = models.StringField(default = "mask_anon.png") risk1 = models.BooleanField() risk1_lower = models.IntegerField() risk1_upper = models.IntegerField() risk2_player = models.StringField(default = "anon.png") risk2_value = models.IntegerField() risk2_mask = models.StringField(default = "mask_anon.png") risk2 = models.BooleanField() risk2_odds = ListField() risk2_payoff = ListField() # Lottery lottery1_1 = models.BooleanField() lottery1_1_mask = models.StringField() lottery1_1_img = models.StringField() lottery1_1_value = models.IntegerField() lottery1_2 = models.BooleanField(blank = True) lottery1_2_mask = models.StringField() lottery1_2_img = models.StringField() lottery1_2_value = models.IntegerField() lottery1_3 = models.BooleanField(blank = True) lottery1_3_mask = models.StringField() lottery1_3_img = models.StringField() lottery1_3_value = models.IntegerField() lottery1_4 = models.BooleanField(blank = True) lottery1_4_mask = models.StringField() lottery1_4_img = models.StringField() lottery1_4_value =models.IntegerField() lottery1_5 = models.BooleanField(blank = True) lottery1_5_mask = models.StringField() lottery1_5_img = models.StringField() lottery1_5_value = models.IntegerField() lottery1_player = models.StringField(blank = True, default = "anon.png") lottery1_mask = models.StringField(blank = True, default = "mask_anon.png") lottery1_value = models.IntegerField(blank = True) rate_lottery1_2 = models.IntegerField(blank = True) rate_lottery1_3 = models.IntegerField(blank = True) rate_lottery1_4 = models.IntegerField(blank = True) rate_lottery1_5 = models.IntegerField(blank = True) # Rating rating1 = models.IntegerField(max = 100, min = 0) rating1_img = models.StringField() rating1_mask = models.StringField() rating1_value = models.IntegerField() rating1_deviation = models.IntegerField() rating2 = models.IntegerField(max = 100, min = 0) rating2_img = models.StringField() rating2_mask = models.StringField() rating2_value = models.IntegerField() rating2_deviation = models.IntegerField() rating3 = models.IntegerField(max = 100, min = 0) rating3_mask = models.StringField() rating3_img = models.StringField() rating3_value = models.IntegerField() rating3_deviation = models.IntegerField() rating_join_player = models.StringField(default = "anon.png") rating_join_mask = models.StringField(default = "mask_anon.png") rating_join_value = models.IntegerField() ###### Demographics comment = models.StringField(blank = True) #multiple_choice_five = tool_models.MultipleChoiceModelField(label="Please select the best three players for your team!", # min_choices=3, max_choices=3) def vars_for_template(self): return{ 'rating_join_player': self.rating_join_player, 'rating_join_mask': self.rating_join_mask, 'rating_feedback': None if self.rating1 is None else np.sum(abs(self.rating1 - self.rating1_value) > np.random.normal(loc = 30, scale = 10, size = 10)), "img_pair1_1": self.pairs1_1, "img_pair1_2": self.pairs1_2, "mask1_1": self.mask1_1, "mask1_2": self.mask1_2, 'pair_answer': self.pair_answer, 'pair_answer_mask': self.pair_answer_mask, 'mask1_1_value': self.mask1_1_value, 'mask1_2_value': self.mask1_2_value, "img_pair2_1": self.pairs2_1, "img_pair2_2": self.pairs2_2, "mask2_1": self.mask2_1, "mask2_2": self.mask2_2, 'pair2_answer': self.pair2_answer, 'pair2_answer_mask': self.pair2_answer_mask, 'mask2_1_value': self.mask2_1_value, 'mask2_2_value': self.mask2_2_value, "img_five_scarce1": self.five_scarce1_1, "img_five_scarce2": self.five_scarce1_2, "img_five_scarce3": self.five_scarce1_3, "img_five_scarce4": self.five_scarce1_4, "img_five_scarce5": self.five_scarce1_5, 'five_scarce': self.five_scarce, 'five_scarce_mask': self.five_scarce_answer_mask, "five_mask1": self.five_mask1, "five_mask2": self.five_mask2, "five_mask3": self.five_mask3, "five_mask4": self.five_mask4, "five_mask5": self.five_mask5, "five_mask1_value": self.five_mask1_value, "five_mask2_value": self.five_mask2_value, "five_mask3_value": self.five_mask3_value, "five_mask4_value": self.five_mask4_value, "five_mask5_value": self.five_mask5_value, "img_five_scarce2_1": self.five_scarce2_1, "img_five_scarce2_2": self.five_scarce2_2, "img_five_scarce2_3": self.five_scarce2_3, "img_five_scarce2_4": self.five_scarce2_4, "img_five_scarce2_5": self.five_scarce2_5, 'five_scarce2': self.five_scarce2, 'five_scarce2_mask': self.five_scarce2_answer_mask, "five_mask2_1": self.five_mask2_1, "five_mask2_2": self.five_mask2_2, "five_mask2_3": self.five_mask2_3, "five_mask2_4": self.five_mask2_4, "five_mask2_5": self.five_mask2_5, "five_mask2_1_value": self.five_mask2_1_value, "five_mask2_2_value": self.five_mask2_2_value, "five_mask2_3_value": self.five_mask2_3_value, "five_mask2_4_value": self.five_mask2_4_value, "five_mask2_5_value": self.five_mask2_5_value, 'lottery1_player': self.lottery1_player, 'lottery1_mask': self.lottery1_mask, # "img_five_multiple1": self.five_multiple1, # "img_five_multiple2": self.five_multiple2, # "img_five_multiple3": self.five_multiple3, # "img_five_multiple4": self.five_multiple4, # "img_five_multiple5": self.five_multiple5, # "five_m_mask1": self.five_m_mask1, # "five_m_mask2": self.five_m_mask2, # "five_m_mask3": self.five_m_mask3, # "five_m_mask4": self.five_m_mask4, # "five_m_mask5": self.five_m_mask5, # 'five_m_mask1value': self.five_m_mask1value, # 'five_m_mask2value': self.five_m_mask2value, # 'five_m_mask3value': self.five_m_mask3value, # 'five_m_mask4value': self.five_m_mask4value, # 'five_m_mask5value': self.five_m_mask5value, 'lottery1_1_img': self.lottery1_1_img, 'lottery1_2_img': self.lottery1_2_img, 'lottery1_3_img': self.lottery1_3_img, 'lottery1_4_img': self.lottery1_4_img, 'lottery1_5_img': self.lottery1_5_img, 'lottery1_1_mask': self.lottery1_1_mask, 'lottery1_2_mask': self.lottery1_2_mask, 'lottery1_3_mask': self.lottery1_3_mask, 'lottery1_4_mask': self.lottery1_4_mask, 'lottery1_5_mask': self.lottery1_5_mask, 'lottery1_1_value': self.lottery1_1_value, 'lottery1_2_value': self.lottery1_2_value, 'lottery1_3_value': self.lottery1_3_value, 'lottery1_4_value': self.lottery1_4_value, 'lottery1_5_value': self.lottery1_5_value, 'rating1_img': self.rating1_img, 'rating2_img': self.rating2_img, 'rating3_img': self.rating3_img, 'rating1_mask': self.rating1_mask, 'rating2_mask': self.rating2_mask, 'rating3_mask': self.rating3_mask, 'endowment1': self.endowment1, 'endowment2': self.endowment2, 'endowment3': self.endowment3, 'endowment1mask': self.endowment1mask, 'endowment2mask': self.endowment2mask, 'endowment3mask': self.endowment3mask, 'risk1_new_player': self.risk1_new_player, 'risk2_new_player': self.risk2_new_player, 'risk1_new_mask': self.risk1_new_mask, 'risk2_new_mask': self.risk2_new_mask, 'risk1_new_value': self.risk1_new_value, 'risk2_new_value': self.risk2_new_value, 'risk1_given_player': self.risk1_given_player, 'risk2_given_player': self.risk2_given_player, 'risk1_given_mask': self.risk1_given_mask, 'risk2_given_mask': self.risk2_given_mask, 'risk1_given_value': self.risk1_given_value, 'risk2_given_value': self.risk2_given_value, 'risk2_upper': self.risk2_payoff[0], 'risk2_lower': self.risk2_payoff[1], 'risk2_upper_prob': self.risk2_odds[0], 'risk2_lower_prob': self.risk2_odds[1], 'risk1_player': self.risk1_player, 'risk1_mask': self.risk1_mask, 'risk2_player': self.risk2_player, 'risk2_mask': self.risk2_mask, 'team_endowment_start': int(round(np.mean(list(filter(None, [self.endowment1value, self.endowment2value, self.endowment3value]))))), 'team_endowment_cent_start': round(np.mean(list(filter(None, [self.endowment1value, self.endowment2value, self.endowment3value]))))/100, 'average_offense': None if self.pair_answer_mean is None and self.pair2_answer_mean is None and self.lottery1_value is None else round(np.mean(list(filter(None, [self.pair_answer_mean, self.pair2_answer_mean, self.lottery1_value])))), 'average_defense': None if self.endowment1value is None and self.endowment2value is None and self.endowment3value is None else round(np.mean(list(filter(None, [self.endowment1value, self.endowment2value, self.endowment3value, self.rating_join_value])))), 'average_midfield': None if self.five_scarce_answer_mean is None and self.five_scarce2_answer_mean is None and self.risk2_value is None and self.risk1_value is None else round(np.mean(list(filter(None, [self.five_scarce_answer_mean, self.five_scarce2_answer_mean, self.risk2_value, self.risk1_value])))), 'team_endowment2': int(round(np.mean(list(filter(None, [self.endowment1value, self.endowment2value, self.endowment3value, self.rating_join_value, self.pair_answer_mean, self.pair2_answer_mean, self.five_scarce_answer_mean, self.five_scarce2_answer_mean, self.risk2_value, self.risk1_value, self.lottery1_value]))))), 'team_endowment_cent': round(np.mean(list(filter(None, [self.endowment1value, self.endowment2value, self.endowment3value, self.rating_join_value, self.pair_answer_mean, self.pair2_answer_mean, self.five_scarce_answer_mean, self.five_scarce2_answer_mean, self.risk2_value, self.risk1_value, self.lottery1_value]))))/100, 'certain_payoff': 0.5 + round(np.mean(list(filter(None, [self.endowment1value, self.endowment2value, self.endowment3value, self.rating_join_value, self.pair_answer_mean, self.pair2_answer_mean, self.five_scarce_answer_mean, self.five_scarce2_answer_mean, self.risk2_value, self.risk1_value, self.lottery1_value]))))/100, 'probability': self.probability, 'team_endowment': int(round(np.mean(list(filter(None, [None if self.pair_answer_mean is None and self.pair2_answer_mean is None and self.lottery1_value is None else round(np.mean(list(filter(None, [self.pair_answer_mean, self.pair2_answer_mean, self.lottery1_value])))), round(np.mean(list(filter(None, [self.endowment1value, self.endowment2value, self.endowment3value])))) if self.rating_join_value is None else round(np.mean(list(filter(None, [self.endowment1value, self.endowment2value, self.endowment3value, self.rating_join_value])))), None if self.five_scarce_answer_mean is None and self.five_scarce2_answer_mean is None and self.risk2_value is None and self.risk1_value is None else round(np.mean(list(filter(None, [self.five_scarce_answer_mean, self.five_scarce2_answer_mean, self.risk2_value, self.risk1_value]))))]))))), 'success': np.random.binomial(1, np.mean(list(filter(None, [self.endowment1value, self.endowment2value, self.endowment3value, self.rating_join_value, self.pair_answer_mean, self.pair2_answer_mean, self.five_scarce_answer_mean, self.five_scarce2_answer_mean, self.risk2_value, self.risk1_value, self.lottery1_value])))/100, 1), }