from . import models from ._builtin import Page, WaitPage from otree.api import Currency as c, currency_range from .models import Constants, levenshtein, distance_and_ok from django.conf import settings class Informedconsent(Page): def is_displayed(self): return self.round_number == 1 def before_next_page(self): self.player.treatment = self.participant.vars['treatment'] class Transcribe(Page): def is_displayed(self): return self.participant.vars['treatment'] == 1 form_model = models.Player form_fields = ['transcribed_text'] def vars_for_template(self): return { 'image_path': 'real_effort/paragraphs/{}.png'.format( self.round_number), 'reference_text': Constants.reference_texts[self.round_number - 1], 'debug': settings.DEBUG, 'required_accuracy': 100 } def transcribed_text_error_message(self, transcribed_text): reference_text = Constants.reference_texts[self.round_number - 1] allowed_error_rate = 0 distance, ok = distance_and_ok(transcribed_text, reference_text, allowed_error_rate) if ok: self.player.levenshtein_distance = distance else: if allowed_error_rate == 0: return "The transcription should be exactly the same as on the image." else: return "This transcription appears to contain too many errors." def before_next_page(self): self.player.payoff = 0 class Results(Page): def is_displayed(self): return self.participant.vars['treatment'] == 1 & self.round_number == Constants.num_rounds def vars_for_template(self): table_rows = [] for prev_player in self.player.in_all_rounds(): row = { 'round_number': prev_player.round_number, 'reference_text_length': len(Constants.reference_texts[prev_player.round_number - 1]), 'transcribed_text_length': len(prev_player.transcribed_text), 'distance': prev_player.levenshtein_distance, } table_rows.append(row) return {'table_rows': table_rows} class Transcribe_Backwards(Page): def is_displayed(self): return self.participant.vars['treatment'] == 2 form_model = models.Player form_fields = ['transcribed_text'] def vars_for_template(self): return { 'image_path': 'real_effort/paragraphs/{}.png'.format( self.round_number), 'reference_text': Constants.reference_texts_backwards[self.round_number - 1], 'debug': settings.DEBUG, 'required_accuracy': 100 } def transcribed_text_error_message(self, transcribed_text): reference_text = Constants.reference_texts_backwards[self.round_number - 1] allowed_error_rate = 0 distance, ok = distance_and_ok(transcribed_text, reference_text, allowed_error_rate) if ok: self.player.levenshtein_distance = distance else: if allowed_error_rate == 0: return "The transcription should be exactly the same as on the image." else: return "This transcription appears to contain too many errors." def before_next_page(self): self.player.payoff = 0 class Results_Backwards(Page): def is_displayed(self): return self.participant.vars['treatment'] == 2 & self.round_number == Constants.num_rounds def vars_for_template(self): table_rows = [] for prev_player in self.player.in_all_rounds(): row = { 'round_number': prev_player.round_number, 'reference_text_length': len(Constants.reference_texts_backwards[prev_player.round_number - 1]), 'transcribed_text_length': len(prev_player.transcribed_text), 'distance': prev_player.levenshtein_distance, } table_rows.append(row) return {'table_rows': table_rows} class Checks(Page): def is_displayed(self): return self.subsession.round_number == Constants.num_rounds form_model = models.Player form_fields = ['checkmoney', 'checkdifficult', 'checkannoying', 'checktime', 'checkeffort', 'checkboring'] class Demographics(Page): def is_displayed(self): return self.subsession.round_number == Constants.num_rounds form_model = models.Player form_fields = ['ppnr', 'age', 'gender', 'study'] class End(Page): def is_displayed(self): return self.subsession.round_number == Constants.num_rounds page_sequence = [Informedconsent, Transcribe, Results, Transcribe_Backwards, Results_Backwards, Checks, Demographics, End]