from django.contrib.staticfiles.templatetags.staticfiles import static from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants import io import os import re import base64 from PIL import Image from django.conf import settings from uuid import uuid4 dataUrlPattern = re.compile('data:image/(png|jpeg);base64,(.*)$') from random import seed from random import randint class Welcome(Page): pass class InvestorInstructions(Page): def is_displayed(self): return self.player.treat == 'investor' form_model = 'player' class InnovatorInstructions(Page): def is_displayed(self): return self.player.treat == 'innovator' form_model = 'player' class WaitPageInvestor(WaitPage): wait_for_all_groups = True title_text = "Einen Moment bitte." body_text = "Bitte warten Sie, bis die anderen Teilnehmer ihre kreativen Ideen entwickelt haben." def is_displayed(self): return self.player.treat == 'investor' class Task(Page): def is_displayed(self): return self.player.treat == 'innovator' form_model = 'player' form_fields = ['image_info', 'word'] # hier wird das bild gemacht und hochgeladen def before_next_page(self): ImageData = self.request.POST.get('image_info') ImageData = dataUrlPattern.match(ImageData).group(2) i = base64.b64decode(ImageData) im = Image.open(io.BytesIO(i)) # rotate image by 90 degrees angle = 180 out = im.rotate(angle, expand=True) your_media_root = settings.MEDIA_ROOT file_name = self.player.photoid path_to_file = os.path.join(your_media_root, f'{file_name}.{Constants.IMAGE_EXTENTION}') out.save(path_to_file) self.player.full_path_to_image = path_to_file self.player.image_info = str(file_name) class Promotion(Page): def is_displayed(self): return self.player.treat == 'innovator' form_model = 'player' form_fields = ['promotion_verbal', 'promotion_grade'] def vars_for_template(self): return {'myphoto':'image_upload/photo{}.jpg'.format(self.player.photoid)} # bild wird angezeigt class GradeOnlyDec1(Page): # treatment in welchem nur die note gesehen wird def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'GradeOnly' form_model = 'group' form_fields = ['invest_dec1_i1', 'invest_dec1_i2'] # das sind die felder in die der investor eingibt wie viel er investieren möchte (hier für die erste entscheidung) def error_message(self, values): if values["invest_dec1_i1"] + values["invest_dec1_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' # Die obere Fehlermeldung wird nicht angezeigt, da sie im Template der Seite angepasst wurde. # Bei Änderungswunsch im Template ändern. # Der obige Code muss trotzdem stehen bleiben, da sonst überhaupt kein Fehler ausgegeben würde. def vars_for_template(self): # im folgenden wird die note des jeweiligen teilnehmers angezeigt, der durch die zufallszahl zufällig gezogen wurde grade_dec1_i1 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i1][0] # anzeigen der promotion dieses teilnehmers wenn id der zufallszahl entpricht # Statt treat_aux2 wurde vorher id_in_subsession genutzt. Ersteres bezieht sich auf den oberen der beiden Codes # in models.py, die den Teilnehmern die treatments zuordnen, Letzteres auf den unteren. # Statt self.group.dec1_i1 wurde vorher self.player.dec1_i1 genutzt, die Variable wurde allerdings in Group # verschoben, um u.a. die Payoffs zuweisen zu können. grade_dec1_i2 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i2][0] return dict(promo1="{}".format(grade_dec1_i1), promo2="{}".format(grade_dec1_i2)) # um die variablen aufrufen zu können in den templates müssen sie vorher in dem "dictionary" hier definiert werden # mit "format() kann man bestimmen was in die geschweiften klammern eingesetzt werden soll. # Da wir nicht mit Runden arbeiten (können) (siehe Kommentar in models.py unter creating_subsession), muss für jedes # treatment des Investors für jede Entscheidung eine neue Seite angelegt werden. Bei 17 Teilnehmern wären das also # 8 Seiten pro treatment. class GradeOnlyDec2(Page): def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'GradeOnly' form_model = 'group' form_fields = ['invest_dec2_i1', 'invest_dec2_i2'] def error_message(self, values): if values["invest_dec2_i1"] + values["invest_dec2_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' def vars_for_template(self): grade_dec2_i1 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec2_i1][0] grade_dec2_i2 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec2_i2][0] return dict(promo1="{}".format(grade_dec2_i1), promo2="{}".format(grade_dec2_i2)) class GradeOnlyDec3(Page): def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'GradeOnly' form_model = 'group' form_fields = ['invest_dec3_i1', 'invest_dec3_i2'] def error_message(self, values): if values["invest_dec3_i1"] + values["invest_dec3_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' def vars_for_template(self): grade_dec3_i1 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec3_i1][0] grade_dec3_i2 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec3_i2][0] return dict(promo1="{}".format(grade_dec3_i1), promo2="{}".format(grade_dec3_i2)) class GradeOnlyDec4(Page): def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'GradeOnly' form_model = 'group' form_fields = ['invest_dec4_i1', 'invest_dec4_i2'] def error_message(self, values): if values["invest_dec4_i1"] + values["invest_dec4_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' def vars_for_template(self): grade_dec4_i1 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec4_i1][0] grade_dec4_i2 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec4_i2][0] return dict(promo1="{}".format(grade_dec4_i1), promo2="{}".format(grade_dec4_i2)) class GradeOnlyDec5(Page): def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'GradeOnly' form_model = 'group' form_fields = ['invest_dec5_i1', 'invest_dec5_i2'] def error_message(self, values): if values["invest_dec5_i1"] + values["invest_dec5_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' def vars_for_template(self): grade_dec5_i1 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec5_i1][0] grade_dec5_i2 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec5_i2][0] return dict(promo1="{}".format(grade_dec5_i1), promo2="{}".format(grade_dec5_i2)) class GradeOnlyDec6(Page): def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'GradeOnly' form_model = 'group' form_fields = ['invest_dec6_i1', 'invest_dec6_i2'] def error_message(self, values): if values["invest_dec6_i1"] + values["invest_dec6_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' def vars_for_template(self): grade_dec6_i1 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec6_i1][0] grade_dec6_i2 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec6_i2][0] return dict(promo1="{}".format(grade_dec6_i1), promo2="{}".format(grade_dec6_i2)) class GradeOnlyDec7(Page): def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'GradeOnly' form_model = 'group' form_fields = ['invest_dec7_i1', 'invest_dec7_i2'] def error_message(self, values): if values["invest_dec7_i1"] + values["invest_dec7_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' def vars_for_template(self): grade_dec7_i1 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec7_i1][0] grade_dec7_i2 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec7_i2][0] return dict(promo1="{}".format(grade_dec7_i1), promo2="{}".format(grade_dec7_i2)) class GradeOnlyDec8(Page): def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'GradeOnly' form_model = 'group' form_fields = ['invest_dec8_i1', 'invest_dec8_i2'] def error_message(self, values): if values["invest_dec8_i1"] + values["invest_dec8_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' def vars_for_template(self): grade_dec8_i1 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec8_i1][0] grade_dec8_i2 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec8_i2][0] return dict(promo1="{}".format(grade_dec8_i1), promo2="{}".format(grade_dec8_i2)) class GradeCIDec1(Page): def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'GradeCI' form_model = 'group' form_fields = ['invest_dec1_i1', 'invest_dec1_i2'] def error_message(self, values): if values["invest_dec1_i1"] + values["invest_dec1_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' def vars_for_template(self): grade_dec1_i1 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i1][0] grade_dec1_i2 = [other.promotion_grade for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i2][0] photo_dec_i1 = [other.photoid for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i1][0] # das gleiche wie mit grades nur dass hier die jeweiligen fotos aufgerufen werden photo_dec_i2 = [other.photoid for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i2][0] return dict(promo1="{}".format(grade_dec1_i1), promo2="{}".format(grade_dec1_i2), photo1= "image_upload/photo{}.jpg".format(photo_dec_i1), photo2= "image_upload/photo{}.jpg".format(photo_dec_i2)) class CIDec1(Page): def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'CI' form_model = 'group' form_fields = ['invest_dec1_i1', 'invest_dec1_i2'] def error_message(self, values): if values["invest_dec1_i1"] + values["invest_dec1_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' def vars_for_template(self): photo_dec_i1 = [other.photoid for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i1][0] photo_dec_i2 = [other.photoid for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i2][0] return dict(photo1="image_upload/photo{}.jpg".format(photo_dec_i1), photo2="image_upload/photo{}.jpg".format(photo_dec_i2)) class VerbalOnlyDec1(Page): def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'VerbalOnly' form_model = 'group' form_fields = ['invest_dec1_i1', 'invest_dec1_i2'] def error_message(self, values): if values["invest_dec1_i1"] + values["invest_dec1_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' def vars_for_template(self): verbal_dec1_i1 = [other.promotion_verbal for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i1][0] verbal_dec1_i2 = [other.promotion_verbal for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i2][0] return dict(promo1="{}".format(verbal_dec1_i1), promo2="{}".format(verbal_dec1_i2)) class VerbalCIDec1(Page): def is_displayed(self): return self.player.treat == 'investor' and self.player.treat_investor == 'VerbalCI' form_model = 'group' form_fields = ['invest_dec1_i1', 'invest_dec1_i2'] def error_message(self, values): if values["invest_dec1_i1"] + values["invest_dec1_i2"] > 10: return 'Sie können nicht mehr als 10€ investieren.' def vars_for_template(self): verbal_dec1_i1 = [other.promotion_verbal for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i1][0] verbal_dec1_i2 = [other.promotion_verbal for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i2][0] photo_dec_i1 = [other.photoid for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i1][0] photo_dec_i2 = [other.photoid for other in self.player.get_others_in_subsession() if other.treat_aux2 == self.group.dec1_i2][0] return dict(promo1="{}".format(verbal_dec1_i1), promo2="{}".format(verbal_dec1_i2), photo1="image_upload/photo{}.jpg".format(photo_dec_i1), photo2="image_upload/photo{}.jpg".format(photo_dec_i2)) class QuestWaitPage(WaitPage): title_text = "Einen Moment bitte." body_text = "Bitte warten Sie, bis alle Teilnehmer ihre Aufgaben abgeschlossen haben." class InnovatorQuest(Page): def is_displayed(self): return self.player.treat == 'innovator' form_model = 'player' form_fields = [ 'gender', 'study_field', 'colourblindness', 'creativity', 'difficulty', 'stereotypes', 'investment_likelihood', 'persuasiveness', 'estimate_identification', 'estimate_same_CI', 'risk_preference', 'competition_preference' ] def vars_for_template(self): # für die Likert-Skalen creativity = self.player.creativity difficulty = self.player.difficulty stereotypes = self.player.stereotypes investment_likelihood = self.player.investment_likelihood persuasiveness = self.player.persuasiveness return dict( creativity=creativity, difficulty=difficulty, stereotypes=stereotypes, investment_likelihood=investment_likelihood, persuasiveness=persuasiveness ) def before_next_page(self): self.player.set_payoffs() # Die Payoffs werden berechnet, nachdem der Fragebogen ausgefüllt wurde. Dafür müssen die Investitionsentscheidungen # vorher getroffen worden sein. class InvestorQuest(Page): def is_displayed(self): return self.player.treat == 'investor' form_model = 'player' form_fields = [ 'gender', 'age', 'study_field', 'colourblindness', 'advantage', 'tournaments', 'risk_preference', 'competition_preference' ] def vars_for_template(self): risk_preference = self.player.risk_preference competition_preference = self.player.competition_preference advantage = self.player.advantage return dict( risk_preference=risk_preference, competition_preference=competition_preference, advantage=advantage ) class ResultsWaitPage(WaitPage): title_text = "Einen Moment bitte." body_text = "Bitte warten Sie, bis alle Teilnehmer den Fragebogen ausgefüllt haben." class Results(Page): pass page_sequence = [ Welcome, InnovatorInstructions, InvestorInstructions, WaitPageInvestor, Task, Promotion, GradeOnlyDec1, #GradeOnlyDec2, #GradeOnlyDec3, #GradeOnlyDec4, #GradeOnlyDec5, #GradeOnlyDec6, #GradeOnlyDec7, #GradeOnlyDec8, CIDec1, GradeCIDec1, VerbalOnlyDec1, VerbalCIDec1, QuestWaitPage, InvestorQuest, InnovatorQuest, ResultsWaitPage, Results ]