from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import itertools import random from django.utils.safestring import mark_safe author = 'Anne Mensing, Julia Lauten, Kateryna Kuian, Moritz Gottschling' doc = """ This is the source code for the experiment for our bms seminar paper 2020. """ class Constants(BaseConstants): name_in_url = 'bms_experiment' players_per_group = None num_rounds = 2 labels = { 'age': 'Age:', 'gender': 'Gender:', 'installed': 'Have you installed the Corona-Warn-App?', 'competence': 'The app will be able to keep my personal data secured.', 'competence_neg': 'The app lacks the necessary competence to protect my data.', 'benevolence': 'The app was made to collect my personal data.', 'benevolence_neg': 'The app acts in my interest.', 'no_central_entity': 'The app does not store my personal data on a central server.', 'no_central_entity_neg': 'The personal data of mine is stored by the app on a central server.', 'anonymity': 'The app does not allow other users to access/view my personal data.', 'anonymity_neg': 'My personal data can be accessed/viewed by other users of the app.', 'no_tracking': 'The app will track my location and collect personal data on my phone.', 'no_tracking_neg': 'My location and personal data from my phone can not be collected by the ' 'app.', 'unlinkabilty': 'The app prevents linking back the collected data to my person.', 'unlinkabilty_neg': 'Using the app it is possible to link the collected data back to my person.', 'activity': 'What does the app do while being active?', 'data_stored': 'What data does the app store?', 'warnings': 'When are warnings given?', 'infected': 'What happens when you had contact with an infected person?', 'understanding': 'Please rate your technical understanding of the Corona-Warn-App.', } m_choice_questions = { 'q1': { 'text': 'What do two phones that have the app installed exchange?', 'answers': { 'a1': 'They exchange GPS coordinates', 'a2': 'They exchange data about your person ', 'a3': 'They exchange randomly generated keys', 'a4': 'They exchange a key that is assigned to you after installation of the app ', 'a5': 'I am not sure', } }, 'q2': { 'text': 'What data is stored centrally?', 'answers': { 'a1': 'Location data', 'a2': 'List of names of people infected', 'a3': 'Randomly generated keys of all users', 'a4': 'None of the above', 'a5': 'I am not sure', } }, 'q3': { 'text': 'Which encounter would lead to a high risk assessment for the other person in case you test ' 'positive within the following 14 days?', 'answers': { 'a1': 'Sitting next to this person on the bus for 2 hours', 'a2': 'Passing by this person with less than 1.5 meter distance between', 'a3': 'Sitting on opposite sides of the movie theater while watching a movie', 'a4': 'Meeting this person for coffee in a cafe for 1 hour', 'a5': 'I am not sure', } }, 'q4': { 'text': 'What happens if you are classified as “high risk” in the Corona-Warn-App?', 'answers': { 'a1': 'The health department will contact you to ask about your symptoms and to assess whether a ' 'COVID-19 test is necessary', 'a2': 'Your key will be automatically uploaded to the server', 'a3': 'You will be quarantined for 14 days', 'a4': 'It will be upon you to take action', 'a5': 'I am not sure', } }, } class Subsession(BaseSubsession): def creating_session(self): # randomize to treatments # transparency_conditions = itertools.cycle(['no', 'brief', 'detailed']) for player in self.get_players(): # player.participant.vars['tr'] = next(transparency_conditions) player.participant.vars['tr'] = 'unassigned' class Group(BaseGroup): pass def make_radio(label): return models.IntegerField( choices=[ [1, mark_safe('Totally Disagree')], [2, mark_safe('Disagree')], [3, mark_safe('Undecided/Not sure')], [4, mark_safe('Agree')], [5, mark_safe('Totally Agree')], ], label=mark_safe(label), widget=widgets.RadioSelectHorizontal, ) def make_answer(label): return models.BooleanField( label=label, widget=widgets.CheckboxInput, blank=True ) def make_attentive(): return models.StringField( choices=['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'pink', 'white', 'gray', 'brown', 'black'], label='What was the color?' ) class Player(BasePlayer): # automatically selected trans_cond = models.StringField(); # general information age = models.IntegerField(label=Constants.labels['age']) gender = models.IntegerField( choices=random.sample([ [0, 'Female'], [1, 'Male'], [2, 'Diverse'], ], 3), max=99, min=0, widget=widgets.RadioSelectHorizontal ) installed = models.BooleanField(label=Constants.labels['installed'], widget=widgets.RadioSelectHorizontal) # trust # competence competence = make_radio(Constants.labels['competence']) competence_neg = make_radio(Constants.labels['competence_neg']) # benevolence benevolence = make_radio(Constants.labels['benevolence']) benevolence_neg = make_radio(Constants.labels['benevolence_neg']) # integrity no_central_entity = make_radio(Constants.labels['no_central_entity']) no_central_entity_neg = make_radio(Constants.labels['no_central_entity_neg']) anonymity = make_radio(Constants.labels['anonymity']) anonymity_neg = make_radio(Constants.labels['anonymity_neg']) no_tracking = make_radio(Constants.labels['no_tracking']) no_tracking_neg = make_radio(Constants.labels['no_tracking_neg']) unlinkabilty = make_radio(Constants.labels['unlinkabilty']) unlinkabilty_neg = make_radio(Constants.labels['unlinkabilty_neg']) # understanding # perceived understanding = models.IntegerField( choices=[ [1, 'No understanding'], [2, 'Limited understanding'], [3, 'Moderate understanding'], [4, 'Good understanding'], [5, 'Complete understanding'], ], label=mark_safe(Constants.labels['understanding']), widget=widgets.RadioSelect, ) # actual q1_a1 = make_answer(Constants.m_choice_questions['q1']['answers']['a1']) q1_a2 = make_answer(Constants.m_choice_questions['q1']['answers']['a2']) q1_a3 = make_answer(Constants.m_choice_questions['q1']['answers']['a3']) q1_a4 = make_answer(Constants.m_choice_questions['q1']['answers']['a4']) q1_a5 = make_answer(Constants.m_choice_questions['q1']['answers']['a5']) q2_a1 = make_answer(Constants.m_choice_questions['q2']['answers']['a1']) q2_a2 = make_answer(Constants.m_choice_questions['q2']['answers']['a2']) q2_a3 = make_answer(Constants.m_choice_questions['q2']['answers']['a3']) q2_a4 = make_answer(Constants.m_choice_questions['q2']['answers']['a4']) q2_a5 = make_answer(Constants.m_choice_questions['q2']['answers']['a5']) q3_a1 = make_answer(Constants.m_choice_questions['q3']['answers']['a1']) q3_a2 = make_answer(Constants.m_choice_questions['q3']['answers']['a2']) q3_a3 = make_answer(Constants.m_choice_questions['q3']['answers']['a3']) q3_a4 = make_answer(Constants.m_choice_questions['q3']['answers']['a4']) q3_a5 = make_answer(Constants.m_choice_questions['q3']['answers']['a5']) q4_a1 = make_answer(Constants.m_choice_questions['q4']['answers']['a1']) q4_a2 = make_answer(Constants.m_choice_questions['q4']['answers']['a2']) q4_a3 = make_answer(Constants.m_choice_questions['q4']['answers']['a3']) q4_a4 = make_answer(Constants.m_choice_questions['q4']['answers']['a4']) q4_a5 = make_answer(Constants.m_choice_questions['q4']['answers']['a5']) # attentive attentive_1 = make_attentive() attentive_2 = make_attentive() # finished finished = models.BooleanField()