from otree.api import *
import random
doc = """
This app is intended to facilitate the delivery of discrete choice experiments & conjoint analysis by offering the capability to
generate randomized choice sets
"""
class C(BaseConstants):
NAME_IN_URL = 'ESG_DCE'
PLAYERS_PER_GROUP = None
NUM_ROUNDS = 12
class Subsession(BaseSubsession):
pass
class Group(BaseGroup):
pass
class Player(
BasePlayer): ##need to define their inputs, but also all data i want stored (including make up of the choice sets), as i need that in the data file
attribute1level1 = models.StringField()
attribute2level1 = models.StringField() ##choices is the choice they made, everything else is to store choice informationred
attribute3level1 = models.StringField()
attribute1level2 = models.StringField()
attribute2level2 = models.StringField()
attribute3level2 = models.StringField()
attribute4level1 = models.StringField()
attribute4level2 = models.StringField()
attribute5level1 = models.StringField()
attribute5level2 = models.StringField()
attribute6level1 = models.StringField()
attribute6level2 = models.StringField()
attribute7level1 = models.StringField()
attribute7level2 = models.StringField()
attribute8level1 = models.StringField()
attribute8level2 = models.StringField()
choices = models.StringField(label="¿Por cuál candidato votarías?",
choices="AB",
widget=widgets.RadioSelectHorizontal) # actual choice between choice 1 or choice 2
attncheck = models.StringField(label="¿Por cuál candidato votarías?",
choices="AB",
widget=widgets.RadioSelectHorizontal) # actual choice between choice 1 or choice 2
attnrating1 = models.StringField(choices=["1", "2", "3", "4", "5", "6", "7"],
widget=widgets.RadioSelectHorizontal) # scale
attnrating2 = models.StringField(choices=["1", "2", "3", "4", "5", "6", "7"],
widget=widgets.RadioSelectHorizontal) # scale
rating1 = models.StringField(choices=["1", "2", "3", "4", "5", "6", "7"],
widget=widgets.RadioSelectHorizontal) # scale
rating2 = models.StringField(
label="En una escala del 1 al 7, ¿qué probabilidad hay de que votes por el Candidato A?
(1 = extremadamente improbable, 7 = muy probable)",
choices=["1", "2", "3", "4", "5", "6", "7"], widget=widgets.RadioSelectHorizontal)
# PAGES
class Choice(Page):
form_model = "player"
form_fields = ["choices", "rating1", "rating2"]
##def vars_for_template(player: Player):
##participant = player.participant
##participant.progress = 1
##result = {'progress':participant.progress}
##return result
def before_next_page(player: Player, timeout_happened):
participant = player.participant
participant.progress += 1
@staticmethod
def vars_for_template(player: Player): # this is the randomizer
attribute1 = ['Masculino', 'Femenino'] ## create each attribute as a list, with each level as a value
attribute2 = ['25-34', '35-44', '45-54', '55 y más']
attribute3 = ['Maya', 'Xinca', 'Garífuna', 'Afrodescendiente', 'Ladina', 'Extranjera']
attribute4 = ['Cristianismo Evangélico', 'Catolicismo', 'Sin afiliación religiosa', 'Espiritualidad Maya']
attribute5 = ["Cuanto más libre sea el mercado, mayor será el bienestar social", "El mercado debe estar fuertemente regulado por el gobierno para garantizar el bienestar social", "El mercado debe tener algunas regulaciones gubernamentales pero solamente para evitar monopolios"]
attribute6 = ['En la justicia penal, el castigo es más importante que la rehabilitación para quienes violen la ley', 'En la justicia penal, la rehabilitación es más importante que el castigo para quienes violen la ley', 'En la justicia penal, tanto el castigo como la rehabilitación son importantes para quienes violen la ley dependiendo de la gravedad de dicha violación']
attribute7 = ["Me opongo al aborto en cualquier circunstancia. Es una violación de la santidad de la vida y un error moral", "Reconozco la complejidad de la cuestión del aborto y trato de equilibrar los derechos reproductivos de la mujer con las preocupaciones sobre los derechos del feto y los valores sociales", "Apoyo la despenalización del aborto y lo considero un derecho fundamental de la mujer"]
attribute8 = ["La salud debe ser impulsada principalmente por el sector privado y la responsabilidad individual. Si el gobierno lidera la salud el sistema se hace ineficiente y disminuye la calidad de la atención", "Apoyo un sistema mixto de salud pública y privada, centrado en promover la competencia, regular las entidades privadas prestadoras de salud y reducir las barreras burocráticas", "La salud es un derecho fundamental. El gobierno debe garantizar que todos los ciudadanos tengan acceso a la salud, independientemente de su capacidad de pago"]
# manually adjust below to reflect listed attributes above
choiceuniverse = [attribute1, attribute2, attribute3, attribute4, attribute5, attribute6, attribute7, attribute8] ##create a list containing all possible attributes & levels
choiceset = []
for i in choiceuniverse:
rand = random.randint(0, (len(i) - 1))
selected = i[rand]
if i == attribute4: ## == Religion
if selected == attribute4[3]: ## == Espiritualidad Maya
if choiceset[4] != attribute3[0]: ## != Maya
selected = i[0 or 1 or 2] ## = Cristianismo, Catolicismo, Sin
elif selected != attribute4[3]: ## != Espiritualidad Maya
if choiceset[4] == attribute3[0]: ## == Maya
selected = i[3] ## = Espiritualidad Maya
choiceset.append(selected)
rand = random.randint(0, (len(i) - 1))
selected = i[rand]
if i == attribute4: ## == Religion
if selected == attribute4[3]: ## == Espiritualidad Maya
if choiceset[5] != attribute3[0]: ## != Maya
selected = i[0 or 1 or 2] ## = Cristianismo, Catolicismo, Sin
elif selected != attribute4[3]: ## != Espiritualidad Maya
if choiceset[5] == attribute3[0]: ## == Maya
selected = i[3] ## = Espiritualidad Maya
choiceset.append(selected)
player.attribute1level1 = choiceset[0]
player.attribute1level2 = choiceset[1]
player.attribute2level1 = choiceset[2]
player.attribute2level2 = choiceset[3]
player.attribute3level1 = choiceset[4]
player.attribute3level2 = choiceset[5]
player.attribute4level1 = choiceset[6]
player.attribute4level2 = choiceset[7]
player.attribute5level1 = choiceset[8]
player.attribute5level2 = choiceset[9]
player.attribute6level1 = choiceset[10]
player.attribute6level2 = choiceset[11]
player.attribute7level1 = choiceset[12]
player.attribute7level2 = choiceset[13]
player.attribute8level1 = choiceset[14]
player.attribute8level2 = choiceset[15]
result = {"attribute1level1": choiceset[0],
"attribute1level2": choiceset[1],
"attribute2level1": choiceset[2],
"attribute2level2": choiceset[3],
"attribute3level1": choiceset[4],
"attribute3level2": choiceset[5],
"attribute4level1": choiceset[6],
"attribute4level2": choiceset[7],
"attribute5level1": choiceset[8],
"attribute5level2": choiceset[9],
"attribute6level1": choiceset[10],
"attribute6level2": choiceset[11],
"attribute7level1": choiceset[12],
"attribute7level2": choiceset[13],
"attribute8level1": choiceset[14],
"attribute8level2": choiceset[15]}
return result
class AttentionCheck(Page):
##def vars_for_template(player: Player):
##participant = player.participant
##result = {'progress':participant.progress}
##return result
def before_next_page(player: Player, timeout_happened):
participant = player.participant
participant.progress += 1
@staticmethod
def vars_for_template(player: Player): # this is the randomizer
attribute1 = ['Masculino', 'Femenino'] ## create each attribute as a list, with each level as a value
attribute2 = ['25-34', '35-44', '45-54', '55 y más']
attribute3 = ['Maya', 'Xinca', 'Garífuna', 'Afrodescendiente', 'Ladina', 'Extranjera']
attribute4 = ['Cristianismo Evangélico', 'Catolicismo', 'Sin afiliación religiosa', 'Espiritualidad Maya']
attribute5 = ["Cuanto más libre sea el mercado, mayor será el bienestar social", "El mercado debe estar fuertemente regulado por el gobierno para garantizar el bienestar social", "El mercado debe tener algunas regulaciones gubernamentales pero solamente para evitar monopolios"]
attribute6 = ['En la justicia penal, el castigo es más importante que la rehabilitación para quienes violen la ley', 'En la justicia penal, la rehabilitación es más importante que el castigo para quienes violen la ley', 'En la justicia penal, tanto el castigo como la rehabilitación son importantes para quienes violen la ley dependiendo de la gravedad de dicha violación']
attribute7 = ["Me opongo al aborto en cualquier circunstancia. Es una violación de la santidad de la vida y un error moral", "Reconozco la complejidad de la cuestión del aborto y trato de equilibrar los derechos reproductivos de la mujer con las preocupaciones sobre los derechos del feto y los valores sociales", "Apoyo la despenalización del aborto y lo considero un derecho fundamental de la mujer"]
attribute8 = ["La salud debe ser impulsada principalmente por el sector privado y la responsabilidad individual. Si el gobierno lidera la salud el sistema se hace ineficiente y disminuye la calidad de la atención", "Apoyo un sistema mixto de salud pública y privada, centrado en promover la competencia, regular las entidades privadas prestadoras de salud y reducir las barreras burocráticas", "La salud es un derecho fundamental. El gobierno debe garantizar que todos los ciudadanos tengan acceso a la salud, independientemente de su capacidad de pago"]
# manually adjust below to reflect listed attributes above
choiceuniverse = [attribute1, attribute2, attribute3, attribute4, attribute5, attribute6, attribute7, attribute8] ##create a list containing all possible attributes & levels
choiceset = []
for i in choiceuniverse:
rand = random.randint(0, (len(i) - 1))
selected = i[rand]
if i == attribute4: ## == Religion
if selected == attribute4[3]: ## == Espiritualidad Maya
if choiceset[4] != attribute3[0]: ## != Maya
selected = i[0 or 1 or 2] ## = Cristianismo, Catolicismo, Sin
elif selected != attribute4[3]: ## != Espiritualidad Maya
if choiceset[4] == attribute3[0]: ## == Maya
selected = i[3] ## = Espiritualidad Maya
choiceset.append(selected)
rand = random.randint(0, (len(i) - 1))
selected = i[rand]
if i == attribute4: ## == Religion
if selected == attribute4[3]: ## == Espiritualidad Maya
if choiceset[5] != attribute3[0]: ## != Maya
selected = i[0 or 1 or 2] ## = Cristianismo, Catolicismo, Sin
elif selected != attribute4[3]: ## != Espiritualidad Maya
if choiceset[5] == attribute3[0]: ## == Maya
selected = i[3] ## = Espiritualidad Maya
choiceset.append(selected)
result = {"attribute1level1": choiceset[0],
"attribute1level2": choiceset[1],
"attribute2level1": choiceset[2],
"attribute2level2": choiceset[3],
"attribute3level1": choiceset[4],
"attribute3level2": choiceset[5],
"attribute4level1": choiceset[6],
"attribute4level2": choiceset[7],
"attribute5level1": choiceset[8],
"attribute5level2": choiceset[9],
"attribute6level1": choiceset[10],
"attribute6level2": choiceset[11],
"attribute7level1": choiceset[12],
"attribute7level2": choiceset[13],
"attribute8level1": choiceset[14],
"attribute8level2": choiceset[15]}
return result
@staticmethod
def is_displayed(player: Player):
return player.round_number == 3 or player.round_number == 7
form_model = "player"
form_fields = ["attncheck", "attnrating1", "attnrating2"]
page_sequence = [Choice, AttentionCheck]