from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ This is a task that requires real effort from participants. Subjects are shown two images of incomprehensible text. Subjects are required to transcribe (copy) the text into a text entry field. The quality of a subject's transcription is measured by the Levenshtein distance. """ def levenshtein(a, b): """Calculates the Levenshtein distance between a and b.""" n, m = len(a), len(b) if n > m: # Make sure n <= m, to use O(min(n,m)) space a, b = b, a n, m = m, n current = range(n + 1) for i in range(1, m + 1): previous, current = current, [i] + [0] * n for j in range(1, n + 1): add, delete = previous[j] + 1, current[j - 1] + 1 change = previous[j - 1] if a[j - 1] != b[i - 1]: change = change + 1 current[j] = min(add, delete, change) return current[n] def distance_and_ok(transcribed_text, reference_text, max_error_rate): error_threshold = len(reference_text) * max_error_rate distance = levenshtein(transcribed_text, reference_text) ok = distance <= error_threshold return distance, ok class Constants(BaseConstants): name_in_url = 'real_effort' players_per_group = None num_rounds = 10 reference_texts = ["LGz3xBrRy1", "WOBsKu2QSB", "DpPyxH9GN1", "G7y2J12Xjd", "5nQYC6E9Na", "9Ufj7Dy8UX", "V9Kqr3sJFF", "8vtg5wU7FP", "cz0Lcnmrmu", "UT6hguoX07"] reference_texts_backwards = ["1yRrBx3zGL", "BSQ2uKsBOW", "1NG9HxyPpD", "djX21J2y7G", "aN9E6CYQn5", "XU8yD7jfU9", "FFJs3rqK9V", "PF7Uw5gtv8", "umrmncL0zc", "70Xough6TU"] allowed_error_rates = [0, 0] class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: for p in self.get_players(): p.participant.vars['treatment'] = random.choice([1, 2]) class Group(BaseGroup): pass class Player(BasePlayer): transcribed_text = models.TextField() levenshtein_distance = models.PositiveIntegerField() treatment = models.IntegerField() checkmoney = models.FloatField() checkdifficult = models.IntegerField(choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) checkannoying = models.IntegerField(choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) checktime = models.IntegerField(choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) checkboring = models.IntegerField(choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) checkeffort = models.IntegerField(choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelectHorizontal) ppnr = models.IntegerField(verbose_name='What is your participant number (= participant nummer dat op het papiertje staat)?') age = models.PositiveIntegerField( verbose_name='What is your age (in years)?', min=13, max=125) gender = models.CharField(verbose_name='What is your gender?') study = models.CharField(verbose_name='What do you study?')