import random from otree.api import * import cv2 from twilio.rest import Client class Constants(BaseConstants): name_in_url = 'w' players_per_group = None num_rounds = 1 endowment = cu(3) def make_likert_agreement(label): return models.IntegerField( label=label, min=0, max=100 ) class Subsession(BaseSubsession): pass def creating_session(subsession): import itertools treatments = itertools.cycle( itertools.product([0, 1, 2, 3], ['A', 'B'], [0, 1, 2, 3]) ) for p in subsession.get_players(): treatment = next(treatments) p.menu_treatment = treatment[0] p.order_treatment = treatment[1] p.rank_treatment = treatment[2] p.participation = False p.show_percentage = 0 class Group(BaseGroup): pass class Player(BasePlayer): # Participants ID first_name = models.StringField() last_name = models.StringField() mobile = models.IntegerField() # Time track survey_time = models.FloatField() survey_time_readable = models.StringField() main_stage = models.BooleanField() # Treatment assignment menu_treatment = models.IntegerField() order_treatment = models.StringField() rank_treatment = models.IntegerField() participation = models.BooleanField() # Voucher ID tmp = models.StringField() voucher = models.StringField() voucher_code = models.StringField() extra_voucher_code = models.StringField() # Participation show_sequence = models.IntegerField() show_percentage = models.StringField() # Menu choices -- treatment 1A: high vegan & fish compensation [25%] T1A_Menu = models.IntegerField( label='', choices=[ [1, 'Meat & Chicken meal (2,70 €) + Coffee (0,90 €)'], [2, 'Fish & vegetable meal (2,70 €) + Coffee (0,90 €)'], [3, 'Vegan meal (2,70 €) + Coffee (0,90 €)'], [4, 'Meat & Chicken meal (2,70 €) + Carbon offset (0,15 €)'], [5, 'Fish & vegetable meal (2,70 €) + Carbon offset (0,15 €)'], [6, 'Vegan meal (2,70 €) + Carbon offset (0,15 €)'], ], widget=widgets.RadioSelect() ) # Menu choices -- treatment 1B: high vegan & fish compensation [25%] T1B_Menu = models.IntegerField( label='', choices=[ [4, 'Meat & Chicken meal (2,70 €) + Carbon offset (0,15 €)'], [5, 'Fish & vegetable meal (2,70 €) + Carbon offset (0,15 €)'], [6, 'Vegan meal (2,70 €) + Carbon offset (0,15 €)'], [1, 'Meat & Chicken meal (2,70 €) + Coffee (0,90 €)'], [2, 'Fish & vegetable meal (2,70 €) + Coffee (0,90 €)'], [3, 'Vegan meal (2,70 €) + Coffee (0,90 €)'], ], widget=widgets.RadioSelect() ) # Menu choices -- treatment 2A: high vegan & fish compensation [25%] T2A_Menu = models.IntegerField( label='', choices=[ [1, 'Meat & Chicken meal (2,70 €) + Coffee (0,90 €)'], [2, 'Fish & vegetable meal (2,70 €) + Coffee (0,90 €)'], [3, 'Vegan meal (2,70 €) + Coffee (0,90 €)'], [4, 'Meat & Chicken meal (2,70 €) + Carbon offset (0,90 €)'], [5, 'Fish & vegetable meal (2,70 €) + Carbon offset (0,60 €)'], [6, 'Vegan meal (2,70 €) + Carbon offset (0,30 €)'], ], widget=widgets.RadioSelect() ) # Menu choices -- treatment 2B: high vegan & fish compensation [25%] T2B_Menu = models.IntegerField( label='', choices=[ [4, 'Meat & Chicken meal (2,70 €) + Carbon offset (0,90 €)'], [5, 'Fish & vegetable meal (2,70 €) + Carbon offset (0,60 €)'], [6, 'Vegan meal (2,70 €) + Carbon offset (0,30 €)'], [1, 'Meat & Chicken meal (2,70 €) + Coffee (0,90 €)'], [2, 'Fish & vegetable meal (2,70 €) + Coffee (0,90 €)'], [3, 'Vegan meal (2,70 €) + Coffee (0,90 €)'], ], widget=widgets.RadioSelect() ) # Menu choices -- treatment 3: low vegan [25%] T3A_Menu = models.IntegerField( label='', choices=[ [1, 'Meat & Chicken meal (2,70 €) + Coffee (0,90 €)'], [2, 'Fish & vegetable meal (2,70 €) + Coffee (0,90 €)'], [3, 'Vegan meal (2,70 €) + Coffee (0,90 €)'], [4, 'Meat & Chicken meal (2,70 €) + Carbon offset (0,15 €)'], [5, 'Fish & vegetable meal (2,70 €) + Carbon offset (0,10 €)'], [6, 'Vegan meal (2,70 €) + Carbon offset (0,01 €)'], ], widget=widgets.RadioSelect() ) # Menu choices -- treatment 3: low vegan [25%] T3B_Menu = models.IntegerField( label='', choices=[ [4, 'Meat & Chicken meal (2,70 €) + Carbon offset (0,15 €)'], [5, 'Fish & vegetable meal (2,70 €) + Carbon offset (0,10 €)'], [6, 'Vegan meal (2,70 €) + Carbon offset (0,01 €)'], [1, 'Meat & Chicken meal (2,70 €) + Coffee (0,90 €)'], [2, 'Fish & vegetable meal (2,70 €) + Coffee (0,90 €)'], [3, 'Vegan meal (2,70 €) + Coffee (0,90 €)'], ], widget=widgets.RadioSelect() ) # Menu choices -- Control: status quo options [25%] CA_Menu = models.IntegerField( label='', choices=[ [1, 'Meat & Chicken meal (2,70 €) + Coffee (0,90 €)'], [2, 'Fish & vegetable meal (2,70 €) + Coffee (0,90 €)'], [3, 'Vegan meal (2,70 €) + Coffee (0,90 €)'], [4, 'Meat & Chicken meal (2,70 €) + Carbon offset (0,15 €)'], [5, 'Fish & vegetable meal (2,70 €) + Carbon offset (0,10 €)'], [6, 'Vegan meal (2,70 €) + Carbon offset (0,05 €)'], ], widget=widgets.RadioSelect() ) # Menu choices -- Control: status quo options [25%] CB_Menu = models.IntegerField( label='', choices=[ [4, 'Meat & Chicken meal (2,70 €) + Carbon offset (0,15 €)'], [5, 'Fish & vegetable meal (2,70 €) + Carbon offset (0,10 €)'], [6, 'Vegan meal (2,70 €) + Carbon offset (0,05 €)'], [1, 'Meat & Chicken meal (2,70 €) + Coffee (0,90 €)'], [2, 'Fish & vegetable meal (2,70 €) + Coffee (0,90 €)'], [3, 'Vegan meal (2,70 €) + Coffee (0,90 €)'], ], widget=widgets.RadioSelect() ) Second_menu_choices = models.IntegerField( label='', choices=[ [1, 'Meat & Chicken meal (2,70 €)'], [2, 'Fish & vegetable meal (2,70 €)'], [3, 'Vegan meal (2,70 €) '], ], widget=widgets.RadioSelect() ) # Treatment 3: Name and amount with publication choices Treatment3_rank_choices = models.BooleanField( label="If you choose to pay a certain amount of carbon offset, do you prefer to have your name listed on the website or not?", choices=[ [1, 'Yes'], [0, 'No'] ], widget=widgets.RadioSelectHorizontal(), ) # WTC elicitation -- Control/Treatment 1: name only/Treatment 2: name and amount/Treatment 3: name and amount and publication choices WTC_elicitation = models.CurrencyField( label="When using your lunch voucher at UniCafe, how much of your own money are you ready to pay " "for compensating carbon offsets?", min=0, max=20*Constants.endowment ) WTC_elicitation_currency = models.CurrencyField() # Belief questions belief_people = models.IntegerField( label="", choices=[ [1, '0-5'], [2, '6-10'], [3, '11-15'], [4, '16-20'], [5, '21-25'], [6, '26-30'], [7, '31-35'], [8, '36-40'], [9, '41-45'], [10, '46-50'], [11, '51-55'], [12, '56-60'], [13, '61-65'], [14, '66-70'], [15, '71-75'], [16, '76-80'], [17, '81-85'], [18, '86-90'], [19, '91-95'], [20, '96-100'], ], widget=widgets.RadioSelectHorizontal ) belief_public = models.IntegerField( label="", choices=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100], widget=widgets.RadioSelectHorizontal ) belief_money = models.FloatField( label="", choices=[0,0.05,0.10,0.15,0.20,0.25,0.30,0.35,0.40,0.45,0.50,0.55,0.60,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1.00,1.05,1.10,1.15,1.20,1.25,1.30,1.35,1.40,1.45,1.50,1.55,1.60,1.65,1.70,1.75,1.80,1.85,1.90,1.95,2.00,2.05,2.10,2.15,2.20,2.25,2.30,2.35,2.40,2.45,2.50,2.55,2.60,2.65,2.70,2.75,2.80,2.85,2.90,2.95,3.00], widget=widgets.RadioSelectHorizontal ) belief_money_public = models.FloatField( label="", choices=[0,0.05,0.10,0.15,0.20,0.25,0.30,0.35,0.40,0.45,0.50,0.55,0.60,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1.00,1.05,1.10,1.15,1.20,1.25,1.30,1.35,1.40,1.45,1.50,1.55,1.60,1.65,1.70,1.75,1.80,1.85,1.90,1.95,2.00,2.05,2.10,2.15,2.20,2.25,2.30,2.35,2.40,2.45,2.50,2.55,2.60,2.65,2.70,2.75,2.80,2.85,2.90,2.95,3.00], widget=widgets.RadioSelectHorizontal ) belief_money_private = models.FloatField( label="", choices=[0,0.05,0.10,0.15,0.20,0.25,0.30,0.35,0.40,0.45,0.50,0.55,0.60,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1.00,1.05,1.10,1.15,1.20,1.25,1.30,1.35,1.40,1.45,1.50,1.55,1.60,1.65,1.70,1.75,1.80,1.85,1.90,1.95,2.00,2.05,2.10,2.15,2.20,2.25,2.30,2.35,2.40,2.45,2.50,2.55,2.60,2.65,2.70,2.75,2.80,2.85,2.90,2.95,3.00], widget=widgets.RadioSelectHorizontal ) # Questionnaire q1 = models.IntegerField( label='How many times per month do you usually eat at UniCafe?', min=0, max=100 ) q2 = models.IntegerField( label='Overall, how satisfied are you with UniCafe?', min=0, max=100 ) q3 = make_likert_agreement('') q4 = make_likert_agreement('') q5 = make_likert_agreement('') q6 = make_likert_agreement('') q7 = models.IntegerField( label='', min=0, max=100 ) q80 = make_likert_agreement('') q8 = make_likert_agreement('') q9 = make_likert_agreement('') q10 = make_likert_agreement('') q11 = make_likert_agreement('') q12 = make_likert_agreement('') q13 = make_likert_agreement('') q14 = make_likert_agreement('') q140 = make_likert_agreement('') q15 = make_likert_agreement('') q16 = make_likert_agreement('') q17 = make_likert_agreement('') q18 = make_likert_agreement('') q19 = make_likert_agreement('') q20 = make_likert_agreement('') q21 = make_likert_agreement('') q22 = make_likert_agreement('') q23 = make_likert_agreement('') q24 = make_likert_agreement('') q25 = models.IntegerField( label='How often do you drink coffee do you drink?', choices=[ [1, 'Never'], [2, 'Once a week at most'], [3, 'A couple of times a week'], [4, 'Approximately one cup per day'], [5, '2-3 cups per day'], [6, '3-5 cups per day'], [7, 'More than 5 cups a day'] ], widget=widgets.RadioSelect() ) d1 = models.IntegerField( label='Gender', choices=[ [1, 'Female'], [2, 'male'], [3, 'Other'], [4, 'No gender'], [5, 'Don’t want to state any gender'], ], blank=True ) d2 = models.StringField( label='Age', blank=True ) d3 = models.IntegerField( label='Faculty', choices=[ [1, 'Accounting'], [2, 'Aesthetics'], [3, 'African studies'], [4, 'Agriculture and agricultural sciences'], [5, 'Anthropology'], [6, 'Arabic and Islamic studies'], [7, 'Archaeology'], [8, 'Architecture/Environmental Design'], [9, 'Area/Ethnic/Cultural Studies'], [10, 'Art history'], [11, 'Asian studies'], [12, 'Astronomy'], [13, 'Atmospheric science and meteorology'], [14, 'Baltic philology'], [15, 'Bible/Biblical Studies'], [16, 'Biochemistry'], [17, 'Bioinformatics'], [18, 'Biology'], [19, 'Business Administration'], [20, 'Chemistry'], [21, 'Classical philology'], [22, 'Communication'], [23, 'Computer and information sciences'], [24, 'Criminal Justice and Corrections'], [25, 'Criminology'], [26, 'Demography/Population studies'], [27, 'Dentistry'], [28, 'Development studies'], [29, 'Earth and space sciences'], [30, 'Econometrics'], [31, 'Economic history'], [32, 'Economics'], [33, 'Educational science'], [34, 'Engineering'], [35, 'English philology'], [36, 'Environmental Economics'], [37, 'Film and television studies'], [38, 'Finance'], [39, 'Folklore studies'], [40, 'French philology'], [41, 'Gender studies'], [42, 'General linguistics'], [43, 'Geography'], [44, 'Geology'], [45, 'Geophysics'], [46, 'German philology'], [47, 'History (general)'], [48, 'Hospitality'], [49, 'Food Service and Tourism Management'], [50, 'Human Resources Development'], [51, 'International Business/Trade/Commerce'], [52, 'International Relations/Affairs'], [53, 'Italian philology'], [54, 'Latin American studies'], [55, 'Law'], [56, 'Letters'], [57, 'Library Science'], [58, 'Literary studies'], [59, 'Management studies'], [60, 'Marketing'], [61, 'Mathematics'], [62, 'Media and communication studies'], [63, 'Medicine and health sciences'], [64, 'Middle Eastern studies'], [65, 'Museology'], [66, 'Musicology'], [67, 'Natural resources'], [68, 'Nordic studies'], [69, 'North American studies'], [70, 'Nutrition science'], [71, 'Ocean/marine sciences'], [72, 'Operations Research'], [73, 'Performing arts'], [74, 'Pharmaceutics'], [75, 'Philosophy'], [76, 'Physics'], [77, 'Political history'], [78, 'Political science'], [79, 'Psychology'], [80, 'Religion/Religious studies'], [81, 'Scandinavian languages'], [82, 'Slavic philology'], [83, 'Social and public policy'], [84, 'Social psychology'], [85, 'Sociology'], [86, 'Spanish philology'], [87, 'Sports science'], [88, 'Statistics'], [89, 'Theatre studies'], [90, 'Theology'], [91, 'Urban Affairs/Studies'], [92, 'Urban/City'], [93, 'Community and Regional Planning'], [94, 'Veterinary medicine'], [95, 'Visual arts'], [96, 'Others'] ], blank=True ) d4 = models.IntegerField( label='Level of education', choices=[ [1, 'Comprehensive school (primary + middle)'], [2, 'Vocational school'], [3, 'High School'], [4, 'Higher education, university of applied sciences'], [5, 'Higher education, university'], [6, 'Doctoral degree'] ], blank=True ) d5 = models.IntegerField( label='Profession', choices=[ [1, 'Civil servant'], [2, 'Conscript/undergoing non-military service'], [3, 'High school student'], [4, 'Househusband/Housewife'], [5, 'Ph.D. student'], [6, 'Retiree'], [7, 'Self-employed'], [8, 'Unemployed'], [9, 'University student'], [10, 'Worker'] ], blank=True ) # Check pop up window WTC click checkpopWTC0 = models.IntegerField() checkpopWTC1 = models.IntegerField() checkpopWTC2 = models.IntegerField() checkpopWTC3 = models.IntegerField() # Check pop up window Belief Incentive click checkpopIB0 = models.IntegerField() checkpopIB1 = models.IntegerField() # Check WTC slider response checkWTC0 = models.IntegerField() checkWTC1 = models.IntegerField() checkWTC2 = models.IntegerField() checkWTC3 = models.IntegerField() # Check slider response checkslider1 = models.IntegerField() checkslider2 = models.IntegerField() checkslider3 = models.IntegerField() checkslider4 = models.IntegerField() checkslider5 = models.IntegerField() checkslider6 = models.IntegerField() checkslider7 = models.IntegerField() checkslider80 = models.IntegerField() checkslider8 = models.IntegerField() checkslider9 = models.IntegerField() checkslider10 = models.IntegerField() checkslider11 = models.IntegerField() checkslider12 = models.IntegerField() checkslider13 = models.IntegerField() checkslider14 = models.IntegerField() checkslider140 = models.IntegerField() checkslider15 = models.IntegerField() checkslider16 = models.IntegerField() checkslider17 = models.IntegerField() checkslider18 = models.IntegerField() checkslider19 = models.IntegerField() checkslider20 = models.IntegerField() checkslider21 = models.IntegerField() checkslider22 = models.IntegerField() checkslider23 = models.IntegerField() checkslider24 = models.IntegerField() # Pages class ITD(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == None form_model = 'player' form_fields = ['first_name', 'last_name', 'mobile'] @staticmethod def error_message(player: Player, values): if len(str(values['mobile'])) != 9: return "Sorry! Your phone number does not match the format! Please check!" repeated_mobile = False for p in player.subsession.get_players(): if p.participation: if p.mobile == values['mobile']: repeated_mobile = True if repeated_mobile: return "Sorry! You have already filled in this survey, multiple participation are not allowed! " \ "Thanks for understanding!" else: pass else: pass else: pass @staticmethod def before_next_page(player: Player, timeout_happened): from datetime import datetime, timedelta t = datetime.now() + timedelta(weeks=0) player.survey_time = t.timestamp() player.survey_time_readable = t.strftime('%Y-%m-%d %H:%M:%S') pilot_date = datetime(2022, 6, 5) if t > pilot_date: player.main_stage = True else: player.main_stage = False class CMA(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: if player.menu_treatment == 0: return player.order_treatment == 'A' form_model = 'player' form_fields = ['CA_Menu'] @staticmethod def before_next_page(player: Player, timeout_happened): code = "F" for i in range(0,4): code += random.choice('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') code += str(player.mobile) player.voucher_code = code img1 = cv2.imread('./_static/vouchercontrol/voucher'+str(int(player.CA_Menu))+'.png') text_1 = 'Name: '+str(player.first_name)+' '+str(player.last_name) img1 = cv2.putText(img1, text_1, (408,380), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) text_2 = 'Voucher Code: '+str(player.voucher_code) img1 = cv2.putText(img1, text_2, (280,430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) cv2.imwrite('./_static/vcodesearch/'+str(player.voucher_code)+'.png', img1) player.tmp = '/static/vcodesearch/'+str(player.voucher_code)+'.png' account_sid = 'AC9b9d731cdc6647a4fdfa402dee626bd0' auth_token = '7c630b07fdf811a59e89236c04c9fb43' client = Client(account_sid, auth_token) try: message = client.messages \ .create( body='Thanks for registering LABBET! Your UniCafe voucher code:' + str(player.voucher_code), from_='+17472985061', to='+358' + str(player.mobile) ) except: print('Wrong number') else: print(message.sid) class CMB(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: if player.menu_treatment == 0: return player.order_treatment == 'B' form_model = 'player' form_fields = ['CB_Menu'] @staticmethod def before_next_page(player: Player, timeout_happened): code = "F" for i in range(0,4): code += random.choice('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') code += str(player.mobile) player.voucher_code = code img1 = cv2.imread('./_static/vouchercontrol/voucher'+str(int(player.CB_Menu))+'.png') text_1 = 'Name: '+str(player.first_name)+' '+str(player.last_name) img1 = cv2.putText(img1, text_1, (408,380), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) text_2 = 'Voucher Code: '+str(player.voucher_code) img1 = cv2.putText(img1, text_2, (280,430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) cv2.imwrite('./_static/vcodesearch/'+str(player.voucher_code)+'.png', img1) player.tmp = '/static/vcodesearch/'+str(player.voucher_code)+'.png' account_sid = 'AC9b9d731cdc6647a4fdfa402dee626bd0' auth_token = '7c630b07fdf811a59e89236c04c9fb43' client = Client(account_sid, auth_token) try: message = client.messages \ .create( body='Thanks for registering LABBET! Your UniCafe voucher code:' + str(player.voucher_code), from_='+17472985061', to='+358' + str(player.mobile) ) except: print('Wrong number') else: print(message.sid) # Menu choice page - Treatment high vegan&fish compensation class T1MA(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: if player.menu_treatment == 1: return player.order_treatment == 'A' form_model = 'player' form_fields = ['T1A_Menu'] @staticmethod def before_next_page(player: Player, timeout_happened): code = "F" for i in range(0,4): code += random.choice('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') code += str(player.mobile) player.voucher_code = code img1 = cv2.imread('./_static/vouchertreat/voucher'+str(int(player.T1A_Menu))+'.png') text_1 = 'Name: '+str(player.first_name)+' '+str(player.last_name) img1 = cv2.putText(img1, text_1, (408,380), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) text_2 = 'Voucher Code: '+str(player.voucher_code) img1 = cv2.putText(img1, text_2, (280,430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) cv2.imwrite('./_static/vcodesearch/'+str(player.voucher_code)+'.png', img1) player.tmp = '/static/vcodesearch/'+str(player.voucher_code)+'.png' account_sid = 'AC9b9d731cdc6647a4fdfa402dee626bd0' auth_token = '7c630b07fdf811a59e89236c04c9fb43' client = Client(account_sid, auth_token) try: message = client.messages \ .create( body='Thanks for registering LABBET! Your UniCafe voucher code:' + str(player.voucher_code), from_='+17472985061', to='+358' + str(player.mobile) ) except: print('Wrong number') else: print(message.sid) # Menu choice page - Treatment high vegan&fish compensation class T1MB(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: if player.menu_treatment == 1: return player.order_treatment == 'B' form_model = 'player' form_fields = ['T1B_Menu'] @staticmethod def before_next_page(player: Player, timeout_happened): code = "F" for i in range(0,4): code += random.choice('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') code += str(player.mobile) player.voucher_code = code img1 = cv2.imread('./_static/vouchertreat/voucher'+str(int(player.T1B_Menu))+'.png') text_1 = 'Name: '+str(player.first_name)+' '+str(player.last_name) img1 = cv2.putText(img1, text_1, (408,380), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) text_2 = 'Voucher Code: '+str(player.voucher_code) img1 = cv2.putText(img1, text_2, (280,430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) cv2.imwrite('./_static/vcodesearch/'+str(player.voucher_code)+'.png', img1) player.tmp = '/static/vcodesearch/'+str(player.voucher_code)+'.png' account_sid = 'AC9b9d731cdc6647a4fdfa402dee626bd0' auth_token = '7c630b07fdf811a59e89236c04c9fb43' client = Client(account_sid, auth_token) try: message = client.messages \ .create( body='Thanks for registering LABBET! Your UniCafe voucher code:' + str(player.voucher_code), from_='+17472985061', to='+358' + str(player.mobile) ) except: print('Wrong number') else: print(message.sid) # Menu choice page - Treatment 6-time status quo compensation class T2MA(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: if player.menu_treatment == 2: return player.order_treatment == 'A' form_model = 'player' form_fields = ['T2A_Menu'] @staticmethod def before_next_page(player: Player, timeout_happened): code = "F" for i in range(0,4): code += random.choice('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') code += str(player.mobile) player.voucher_code = code img1 = cv2.imread('./_static/vouchertreatnew/voucher'+str(int(player.T2A_Menu))+'.png') text_1 = 'Name: '+str(player.first_name)+' '+str(player.last_name) img1 = cv2.putText(img1, text_1, (408,380), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) text_2 = 'Voucher Code: '+str(player.voucher_code) img1 = cv2.putText(img1, text_2, (280,430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) cv2.imwrite('./_static/vcodesearch/'+str(player.voucher_code)+'.png', img1) print('success image created!') player.tmp = '/static/vcodesearch/'+str(player.voucher_code)+'.png' account_sid = 'AC9b9d731cdc6647a4fdfa402dee626bd0' auth_token = '7c630b07fdf811a59e89236c04c9fb43' client = Client(account_sid, auth_token) try: message = client.messages \ .create( body='Thanks for registering LABBET! Your UniCafe voucher code:' + str(player.voucher_code), from_='+17472985061', to='+358' + str(player.mobile) ) except: print('Wrong number') else: print(message.sid) # Menu choice page - Treatment 6-time status quo compensation class T2MB(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: if player.menu_treatment == 2: return player.order_treatment == 'B' form_model = 'player' form_fields = ['T2B_Menu'] @staticmethod def before_next_page(player: Player, timeout_happened): code = "F" for i in range(0,4): code += random.choice('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') code += str(player.mobile) player.voucher_code = code img1 = cv2.imread('./_static/vouchertreatnew/voucher'+str(int(player.T2B_Menu))+'.png') text_1 = 'Name: '+str(player.first_name)+' '+str(player.last_name) img1 = cv2.putText(img1, text_1, (408,380), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) text_2 = 'Voucher Code: '+str(player.voucher_code) img1 = cv2.putText(img1, text_2, (280,430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) cv2.imwrite('./_static/vcodesearch/'+str(player.voucher_code)+'.png', img1) player.tmp = '/static/vcodesearch/'+str(player.voucher_code)+'.png' account_sid = 'AC9b9d731cdc6647a4fdfa402dee626bd0' auth_token = '7c630b07fdf811a59e89236c04c9fb43' client = Client(account_sid, auth_token) try: message = client.messages \ .create( body='Thanks for registering LABBET! Your UniCafe voucher code:' + str(player.voucher_code), from_='+17472985061', # media_url=['https://co2-compensation.herokuapp.com' + str(player.tmp)], to='+358' + str(player.mobile) ) except: print('Wrong number') else: print(message.sid) # Menu choice page - Treatment 6-time status quo compensation class T3MA(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: if player.menu_treatment == 3: return player.order_treatment == 'A' form_model = 'player' form_fields = ['T3A_Menu'] @staticmethod def before_next_page(player: Player, timeout_happened): code = "F" for i in range(0,4): code += random.choice('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') code += str(player.mobile) player.voucher_code = code img1 = cv2.imread('./_static/vouchertreatthird/voucher'+str(int(player.T3A_Menu))+'.png') text_1 = 'Name: '+str(player.first_name)+' '+str(player.last_name) img1 = cv2.putText(img1, text_1, (408,380), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) text_2 = 'Voucher Code: '+str(player.voucher_code) img1 = cv2.putText(img1, text_2, (280,430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) cv2.imwrite('./_static/vcodesearch/'+str(player.voucher_code)+'.png', img1) player.tmp = '/static/vcodesearch/'+str(player.voucher_code)+'.png' account_sid = 'AC9b9d731cdc6647a4fdfa402dee626bd0' auth_token = '7c630b07fdf811a59e89236c04c9fb43' client = Client(account_sid, auth_token) try: message = client.messages \ .create( body='Thanks for registering LABBET! Your UniCafe voucher code:' + str(player.voucher_code), from_='+17472985061', to='+358' + str(player.mobile) ) except: print('Wrong number') else: print(message.sid) class T3MB(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: if player.menu_treatment == 3: return player.order_treatment == 'B' form_model = 'player' form_fields = ['T3B_Menu'] @staticmethod def before_next_page(player: Player, timeout_happened): code = "F" for i in range(0,4): code += random.choice('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') code += str(player.mobile) player.voucher_code = code img1 = cv2.imread('./_static/vouchertreatthird/voucher'+str(int(player.T3B_Menu))+'.png') text_1 = 'Name: '+str(player.first_name)+' '+str(player.last_name) img1 = cv2.putText(img1, text_1, (408,380), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) text_2 = 'Voucher Code: '+str(player.voucher_code) img1 = cv2.putText(img1, text_2, (280,430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) cv2.imwrite('./_static/vcodesearch/'+str(player.voucher_code)+'.png', img1) player.tmp = '/static/vcodesearch/'+str(player.voucher_code)+'.png' account_sid = 'AC9b9d731cdc6647a4fdfa402dee626bd0' auth_token = '7c630b07fdf811a59e89236c04c9fb43' client = Client(account_sid, auth_token) try: message = client.messages \ .create( body='Thanks for registering LABBET! Your UniCafe voucher code:' + str(player.voucher_code), from_='+17472985061', to='+358' + str(player.mobile) ) except: print('Wrong number') else: print(message.sid) class FVR(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == None def before_next_page(player: Player, timeout_happened): sequence = 1 for p in player.subsession.get_players(): if p.participation == True: sequence = sequence + 1 player.show_sequence = sequence # Treatment 1: name only class T1W(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: return player.rank_treatment == 1 form_model = 'player' form_fields = ['WTC_elicitation', 'checkWTC1', 'checkpopWTC1'] @staticmethod def checkWTC_error_message(player: Player, values): if not values: return 'Please make your decision using slider' @staticmethod def js_vars(player: Player): return dict(endowment=Constants.endowment) @staticmethod def before_next_page(player: Player, timeout_happened): player.WTC_elicitation_currency = player.WTC_elicitation/20 player.payoff = Constants.endowment - player.WTC_elicitation/20 class T2W(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: return player.rank_treatment == 2 form_model = 'player' form_fields = ['WTC_elicitation', 'checkWTC2', 'checkpopWTC2'] @staticmethod def checkWTC_error_message(player: Player, values): if not values: return 'Please make your decision using slider' @staticmethod def js_vars(player: Player): return dict(endowment=Constants.endowment) @staticmethod def before_next_page(player: Player, timeout_happened): player.WTC_elicitation_currency = player.WTC_elicitation/20 player.payoff = Constants.endowment - player.WTC_elicitation/20 class T3W(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: return player.rank_treatment == 3 form_model = 'player' form_fields = ['Treatment3_rank_choices', 'WTC_elicitation', 'checkWTC3', 'checkpopWTC3'] @staticmethod def checkWTC_error_message(player: Player, values): if not values: return 'Please make your decision using slider' @staticmethod def js_vars(player: Player): return dict(endowment=Constants.endowment) @staticmethod def before_next_page(player: Player, timeout_happened): player.WTC_elicitation_currency = player.WTC_elicitation/20 player.payoff = Constants.endowment - player.WTC_elicitation/20 def error_message(player: Player, values): if values['Treatment3_rank_choices']: if values['WTC_elicitation'] == 0: return "€0 compensation are not eligible to be listed as a compensator. " \ "Please select a positive amount or switch your previous answer to “No” to be listed as a " \ "compensator. " else: pass else: pass class CW(Page): @staticmethod def is_displayed(player: Player): if player.participant.label == None: return player.rank_treatment == 0 form_model = 'player' form_fields = ['WTC_elicitation', 'checkWTC0', 'checkpopWTC0'] @staticmethod def checkWTC_error_message(player: Player, values): if not values: return 'Please make your decision using slider' @staticmethod def js_vars(player: Player): return dict(endowment=Constants.endowment) @staticmethod def before_next_page(player: Player, timeout_happened): player.WTC_elicitation_currency = player.WTC_elicitation/20 player.payoff = Constants.endowment - player.WTC_elicitation/20 class SM(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == None form_model = 'player' form_fields = ['Second_menu_choices'] class QC(Page): form_model = 'player' form_fields = ['belief_people', 'belief_money', 'checkpopIB0'] @staticmethod def is_displayed(player: Player): if player.participant.label == None: return player.rank_treatment != 3 class QNA(Page): form_model = 'player' form_fields = ['belief_people', 'belief_public', 'belief_money', 'belief_money_public', 'belief_money_private', 'checkpopIB1'] @staticmethod def is_displayed(player: Player): if player.participant.label == None: return player.rank_treatment == 3 def error_message(player: Player, values): if values['belief_public'] > values['belief_people']: return "Your guess of the number out of randomly drawn 100 participants who bought carbon offsets compared to the " \ "number out of randomly drawn 100 participants who choose to publish their carbon offset mathematically are not consistent. " \ "Please read the question carefully and choose your answers. " else: pass class Q1(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == None form_model = 'player' form_fields = ['q1', 'q2', 'q3', 'q4', 'q5', 'q6', 'q7', 'checkslider1', 'checkslider2', 'checkslider3', 'checkslider4', 'checkslider5', 'checkslider6', 'checkslider7'] @staticmethod def checkslider_error_message(player: Player, values): if not values: return 'Please make your decision using slider' class Q2(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == None form_model = 'player' form_fields = ['q80', 'q8', 'q9', 'q10', 'q11', 'q12', 'q13', 'q14', 'q140', 'checkslider80', 'checkslider8', 'checkslider9', 'checkslider10', 'checkslider11', 'checkslider12', 'checkslider13', 'checkslider14', 'checkslider140'] @staticmethod def checkslider_error_message(player: Player, values): if not values: return 'Please make your decision using slider' class Q3(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == None form_model = 'player' form_fields = ['q15', 'q16', 'q17', 'q18', 'q19', 'q20', 'q21', 'q22', 'q23', 'q24', 'q25', 'checkslider15', 'checkslider16', 'checkslider17', 'checkslider18', 'checkslider19', 'checkslider20', 'checkslider21', 'checkslider22', 'checkslider23','checkslider24', 'd1', 'd2', 'd3', 'd4', 'd5'] @staticmethod def checkslider_error_message(player: Player, values): if not values: return 'Please make your decision using slider' @staticmethod def before_next_page(player: Player, timeout_happened): player.participation = True code = "S" for i in range(0,4): code += random.choice('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') code += str(player.mobile) player.extra_voucher_code = code img1 = cv2.imread('./_static/extravoucher/extravoucher'+str(int(player.Second_menu_choices))+'.png') if player.rank_treatment == 1: if player.WTC_elicitation > 0: text_1 = 'Name: ' + str(player.first_name) + ' ' + str(player.last_name) img1 = cv2.putText(img1, text_1, (408, 330), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) text_2 = 'Compensation: Yes' img1 = cv2.putText(img1, text_2, (278, 380), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) text_3 = 'Voucher Code: ' + str(player.extra_voucher_code) img1 = cv2.putText(img1, text_3, (280, 430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) cv2.imwrite('./_static/vcodesearch/' + str(player.extra_voucher_code) + '.png', img1) player.voucher = '/static/vcodesearch/' + str(player.extra_voucher_code) + '.png' else: text_1 = 'Name: ' + str(player.first_name) + ' ' + str(player.last_name) img1 = cv2.putText(img1, text_1, (408, 330), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) text_3 = 'Voucher Code: ' + str(player.extra_voucher_code) img1 = cv2.putText(img1, text_3, (280, 430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) cv2.imwrite('./_static/vcodesearch/' + str(player.extra_voucher_code) + '.png', img1) print('success image created!') player.voucher = '/static/vcodesearch/' + str(player.extra_voucher_code) + '.png' elif player.rank_treatment == 2: if player.WTC_elicitation > 0: text_1 = 'Name: ' + str(player.first_name) + ' ' + str(player.last_name) img1 = cv2.putText(img1, text_1, (408, 330), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) text_2 = 'Compensation: ' + str(player.WTC_elicitation / 20)[1:] + 'Euro' img1 = cv2.putText(img1, text_2, (278, 380), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) text_3 = 'Voucher Code: ' + str(player.extra_voucher_code) img1 = cv2.putText(img1, text_3, (280, 430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) cv2.imwrite('./_static/vcodesearch/' + str(player.extra_voucher_code) + '.png', img1) player.voucher = '/static/vcodesearch/' + str(player.extra_voucher_code) + '.png' else: text_1 = 'Name: ' + str(player.first_name) + ' ' + str(player.last_name) img1 = cv2.putText(img1, text_1, (408, 330), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) text_3 = 'Voucher Code: ' + str(player.extra_voucher_code) img1 = cv2.putText(img1, text_3, (280, 430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) cv2.imwrite('./_static/vcodesearch/' + str(player.extra_voucher_code) + '.png', img1) print('success image created!') player.voucher = '/static/vcodesearch/' + str(player.extra_voucher_code) + '.png' elif player.rank_treatment == 3: if player.Treatment3_rank_choices: text_1 = 'Name: '+str(player.first_name)+' '+str(player.last_name) img1 = cv2.putText(img1, text_1, (408,330), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) text_2 = 'Compensation: '+str(player.WTC_elicitation/20)[1:]+'Euro' img1 = cv2.putText(img1, text_2, (278,380), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) text_3 = 'Voucher Code: '+str(player.extra_voucher_code) img1 = cv2.putText(img1, text_3, (280,430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,0,0), 2) cv2.imwrite('./_static/vcodesearch/'+str(player.extra_voucher_code)+'.png', img1) player.voucher = '/static/vcodesearch/'+str(player.extra_voucher_code)+'.png' else: text_1 = 'Name: ' + str(player.first_name) + ' ' + str(player.last_name) img1 = cv2.putText(img1, text_1, (408, 330), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) text_3 = 'Voucher Code: ' + str(player.extra_voucher_code) img1 = cv2.putText(img1, text_3, (280, 430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) cv2.imwrite('./_static/vcodesearch/' + str(player.extra_voucher_code) + '.png', img1) player.voucher = '/static/vcodesearch/' + str(player.extra_voucher_code) + '.png' else: text_1 = 'Name: ' + str(player.first_name) + ' ' + str(player.last_name) img1 = cv2.putText(img1, text_1, (408, 330), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) text_3 = 'Voucher Code: ' + str(player.extra_voucher_code) img1 = cv2.putText(img1, text_3, (280, 430), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) cv2.imwrite('./_static/vcodesearch/' + str(player.extra_voucher_code) + '.png', img1) player.voucher = '/static/vcodesearch/' + str(player.extra_voucher_code) + '.png' account_sid = 'AC9b9d731cdc6647a4fdfa402dee626bd0' auth_token = '7c630b07fdf811a59e89236c04c9fb43' client = Client(account_sid, auth_token) try: message = client.messages \ .create( body='Thanks for taking this survey! Your UniCafe voucher code:' + str(player.extra_voucher_code), from_='+17472985061', to='+358' + str(player.mobile) ) except: print('Wrong number') else: print(message.sid) n = 0 m = 0 for p in player.subsession.get_players(): if p.participation: n=n+1 if p.WTC_elicitation > 0: m=m+1 player.show_percentage = str(round(m*100/n)) class SVR(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == None class T1RL(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == 'qzymzrl' class T2RL(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == 'qmzhslwy' class T1R(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == 'zymzrl' @staticmethod def js_vars(player: Player): max_sequence = 0 new_percentage = 0 for p in player.subsession.get_players(): if p.participation: if p.show_sequence: if p.show_percentage: if p.show_sequence > max_sequence: max_sequence = p.show_sequence new_percentage = p.show_percentage else: pass else: pass else: pass else: pass return dict(new_percentage=new_percentage) class T2R(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == 'mzhslwy' @staticmethod def js_vars(player: Player): max_sequence = 0 new_percentage = 0 for p in player.subsession.get_players(): if p.participation: if p.show_sequence: if p.show_percentage: if p.show_sequence > max_sequence: max_sequence = p.show_sequence new_percentage = p.show_percentage else: pass else: pass else: pass else: pass return dict(new_percentage=new_percentage) class CR(Page): @staticmethod def is_displayed(player: Player): return player.participant.label == 'kzzphb' @staticmethod def js_vars(player: Player): max_sequence = 0 new_percentage = 0 for p in player.subsession.get_players(): if p.participation: if p.show_sequence: if p.show_percentage: if p.show_sequence > max_sequence: max_sequence = p.show_sequence new_percentage = p.show_percentage else: pass else: pass else: pass else: pass return dict(new_percentage=new_percentage) # Pages page_sequence = [ ITD, CMA, CMB, T1MA, T1MB, T2MA, T2MB, T3MA, T3MB, FVR, T1W, T2W, T3W, CW, SM, QC, QNA, Q1, Q2, Q3, SVR, T1RL, T2RL, CR, T1R, T2R, ]