from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) doc = '' class Constants(BaseConstants): name_in_url = 'tarjetas2020' players_per_group = None num_rounds = 1 colones_ecu = 50 prob_no_pago = 0.4 class Subsession(BaseSubsession): def creating_session(self): import itertools tratamientos = itertools.cycle([1, 2, 3]) for p in self.get_players(): p.tratamiento = next(tratamientos) class Group(BaseGroup): pass class Player(BasePlayer): tratamiento = models.IntegerField(choices=[[1, '1'], [2, '2'], [3, '3']]) producto = models.StringField(choices=[['Producto A', 'Producto A'], ['Producto B', 'Producto B']], label='Elegir producto:') si_pago = models.BooleanField(initial=True) nombre = models.StringField(label='Nombre completo:') beneficio_esperado = models.IntegerField() menos_intereses = models.IntegerField() final_ecus = models.IntegerField() final_colones = models.IntegerField() str_resultado = models.StringField() correo = models.StringField(label='Correo electrónico:') consentimiento = models.BooleanField(choices=[[True, 'Acepto participar en la investigación.'], [False, 'No acepto participar en la investigación.']], label='He leído lo anterior y, por lo tanto:', widget=widgets.RadioSelect) cedula = models.StringField(label='Número de cédula:') def verificar_pago(self): import random if self.producto == "Producto B": rand = random.random() if rand < Constants.prob_no_pago: self.si_pago = False def calc_str_resultado(self): self.verificar_pago() if self.producto == "Producto A": self.str_resultado = "No utilizó crédito para su compra" else: if self.si_pago: self.str_resultado = "Sí pagó el crédito a tiempo" else: self.str_resultado = "No pagó el crédito a tiempo" return self.str_resultado def calc_beneficio_esperado(self): if self.producto == "Producto A": self.beneficio_esperado = 50 else: self.beneficio_esperado = 65 return self.beneficio_esperado def calc_descuento(self): if self.tratamiento == 1: return 20 elif self.tratamiento == 2: return 35 else: return 50 def calc_final_ecus(self): self.final_ecus = self.beneficio_esperado - self.menos_intereses return self.final_ecus def calc_final_colones(self): self.final_colones = self.final_ecus * Constants.colones_ecu return self.final_colones def calc_menos_intereses(self): if self.si_pago: self.menos_intereses = 0 else: self.menos_intereses = self.calc_descuento() return self.menos_intereses def nombre_error_message(self, value): if not all(letra.isalpha() or letra.isspace() for letra in value): return "Utilice solo letras o espacios al indicar su nombre" if len(value) < 7: return "Su nombre completo debe de tener 7 letras o más" if ' ' not in value: return "Escriba su nombre y apellido separados por un espacio" def correo_error_message(self, value): if '@' not in value: return "Escriba una dirección de correo electrónico válida" def consentimiento_error_message(self, value): if value == False: return "Debe brindar su consentimiento antes de iniciar la investigación."