from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants,levenshtein, distance_and_ok from django.conf import settings import pandas as pd import socket, errno # import numpy as np class Welcome(Page): form_model = 'player' form_fields = ['name'] #def error_message(self,inputs): #if inputs["name"] != str: #return 'Your name has to be written with letters only' def is_displayed(self): return self.round_number == 1 def before_next_page(self): if self.round_number == 1: self.player.guthaben = self.player.guthaben + Constants.endowment def vars_for_template(self): return { 'treatmentgroup': self.player.treatmentgroup, 'image_path': 'trophy/{}.png'.format(self.round_number) } class Transcribe(Page): form_model = 'player' form_fields = ['transcribed_text'] def vars_for_template(self): self.player.cumulative_donated_trees = sum([p.no_trees for p in self.player.in_all_rounds()]) self.player.cumulative_guthaben = sum([p.guthaben for p in self.player.in_all_rounds()]) return { 'image_path': 'my_environmental_survey/{}.png'.format( self.round_number), 'reference_text': Constants.reference_texts[self.round_number - 1], 'debug': settings.DEBUG, 'required_accuracy': 100 * (1 - Constants.allowed_error_rates), 'guthaben': self.player.guthaben, 'round_number': self.round_number, 'donated_trees': self.player.cumulative_donated_trees, } def transcribed_text_error_message(self, transcribed_text): reference_text = Constants.reference_texts[self.round_number - 1] allowed_error_rate = Constants.allowed_error_rates distance, ok = distance_and_ok(transcribed_text, reference_text, allowed_error_rate) if ok: self.player.levenshtein_distance = distance self.player.guthaben = self.player.guthaben + Constants.reward self.player.cumulative_guthaben = sum([p.guthaben for p in self.player.in_all_rounds()]) self.player.right_answer = True else: self.player.cumulative_guthaben = sum([p.guthaben for p in self.player.in_all_rounds()]) self.player.right_answer = False if self.player.right_answer == True: self.player.right_answer_text = "Congratulations, you earned 1€ for solving the math task!" else: self.player.right_answer_text = "Sorry, you made a mistake. You didn´t earn any money this round." def before_next_page(self): self.player.cumulative_donated_trees = sum([p.no_trees for p in self.player.in_all_rounds()]) w = Constants.num_rounds+1 matrix = [[0 for x in range(w)] for y in range(Constants.number_of_players)] class Donation(Page): try: form_model = 'player' form_fields = ['donation'] def error_message(self,inputs): if inputs["donation"] > self.player.cumulative_guthaben: return 'You can´t donate more money than you have!' d = [0, 1, 2, 3, 4] if not inputs["donation"] in d: return 'You can only donate complete trees, please donate an integer amount of money' def vars_for_template(self): names = [] trees = [] sortedtrees = [] anzahlspalten = 0 for p in self.subsession.get_players(): if self.round_number == 1: matrix[p.id_in_group - 1][0] = p.name matrix[p.id_in_group - 1][self.round_number] = p.cumulative_donated_trees for i in range(0, Constants.number_of_players): names.append(matrix[i][0]) trees.append(matrix[i][self.round_number]) sortedtrees = sorted(trees, reverse=True) anzahlspalten = len(sortedtrees) for l in range(0, anzahlspalten): if self.player.cumulative_donated_trees == sortedtrees[l]: self.player.current_position = str(l + 1) df = pd.DataFrame({'Name': names, 'Donated Trees': trees}) tabelle = df.to_html() self.player.spielstand = tabelle return{ 'a': self.player.right_answer_text, 'b': self.player.cumulative_donated_trees, 'c': self.player.name, 'd': names, 'e': trees, 'f': sortedtrees, 'g': self.player.current_position, 'h': anzahlspalten, 'treatmentgroup': self.player.treatmentgroup, 'image_path1': 'tree/{}.png.'.format(self.round_number), 'round_number': self.round_number, 'tabelle': tabelle, 'spielstand': self.player.spielstand, } def before_next_page(self): self.player.guthaben = self.player.guthaben - self.player.donation self.player.cumulative_donation = sum([p.donation for p in self.player.in_all_rounds()]) self.player.no_trees = int(self.player.donation) * 1 self.player.cumulative_donated_trees = sum([p.no_trees for p in self.player.in_all_rounds()]) except IOError: print('kkk') except socket.error: print('kkk') class Feedback(Page): def vars_for_template(self): names = [] trees = [] sortedtrees = [] anzahlspalten = 0 for p in self.subsession.get_players(): if self.round_number == 1: matrix[p.id_in_group - 1][0] = p.name matrix[p.id_in_group - 1][self.round_number] = p.cumulative_donated_trees for i in range(0, Constants.number_of_players): names.append(matrix[i][0]) trees.append(matrix[i][self.round_number]) sortedtrees = sorted(trees, reverse=True) anzahlspalten = len(sortedtrees) for l in range(0, anzahlspalten): if self.player.cumulative_donated_trees == sortedtrees[l]: self.player.current_position = str(l + 1) if self.player.cumulative_donated_trees == max(sortedtrees): self.player.winner = 1 else: self.player.winner = 0 print(self.player.winner) df = pd.DataFrame({'Name': names, 'Donated Trees': trees}) tabelle = df.to_html() self.player.spielstand = tabelle self.player.hola = self.player.spielstand return { 'current_credit': self.player.cumulative_guthaben, 'current_position': self.player.current_position, 'donated_trees': self.player.cumulative_donated_trees, 'anzahlspieler': Constants.number_of_players, 'treatmentgroup': self.player.treatmentgroup, 'spielstand': self.player.spielstand, 'round_number': self.round_number, 'hola': self.player.hola, 'sortedtrees': sortedtrees, 'winner': self.player.winner, } class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): pass class Results(Page): def is_displayed(self): return self.round_number == Constants.num_rounds def vars_for_template(self): table_rows = [] self.player.earnedmoney = self.player.cumulative_guthaben 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, 'b': self.player.treatmentgroup, 'spielstand': self.player.spielstand, } table_rows.append(row) return {'table_rows': table_rows, 'donated_trees': self.player.cumulative_donated_trees, 'position': self.player.current_position, 'anzahlspieler': Constants.number_of_players, 'treatmentgroup': self.player.treatmentgroup, 'round_number': self.round_number, 'spielstand': self.player.spielstand, 'winner': self.player.winner, } page_sequence=[ Welcome, Transcribe, ResultsWaitPage, Donation, ResultsWaitPage, Feedback, Results]