import os from os import environ import dj_database_url import otree.settings BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # the environment variable OTREE_PRODUCTION controls whether Django runs in # DEBUG mode. If OTREE_PRODUCTION==1, then DEBUG=False if environ.get('OTREE_PRODUCTION') not in {None, '', '0'}: DEBUG = False else: DEBUG = True # don't share this with anybody. # Why is this stored here then...as plain text # TODO: Fix it... SECRET_KEY = 'u=h(a=w72(mn$u!lgh*0@exfw!*_y^wmg433)8610i+3573qo#' # DATABASES = { # 'default': dj_database_url.config( # # Rather than hardcoding the DB parameters here, # # it's recommended to set the DATABASE_URL environment variable. # # This will allow you to use SQLite locally, and postgres/mysql # # on the server # # Examples: # # export DATABASE_URL=postgres://USER:PASSWORD@HOST:PORT/NAME # # export DATABASE_URL=mysql://USER:PASSWORD@HOST:PORT/NAME # # fall back to SQLite if the DATABASE_URL env var is missing # default='sqlite:///' + os.path.join(BASE_DIR, 'db.sqlite3') # ) # } #DATABASE_URL = 'sqlite://' + os.path.join(BASE_DIR, 'db.sqlite3') DATABASE_URL = 'postgres://postgres:WontonChip15@localhost:5432/otree' # AUTH_LEVEL: # this setting controls which parts of your site are freely accessible, # and which are password protected: # - If it's not set (the default), then the whole site is freely accessible. # - If you are launching a study and want visitors to only be able to # play your app if you provided them with a start link, set it to STUDY. # - If you would like to put your site online in public demo mode where # anybody can play a demo version of your game, but not access the rest # of the admin interface, set it to DEMO. # for flexibility, you can set it in the environment variable OTREE_AUTH_LEVEL AUTH_LEVEL = environ.get('OTREE_AUTH_LEVEL') ADMIN_USERNAME = 'admin' # for security, best to set admin password in an environment variable ADMIN_PASSWORD = environ.get('OTREE_ADMIN_PASSWORD') # setting for integration with AWS Mturk AWS_ACCESS_KEY_ID = environ.get('AWS_ACCESS_KEY_ID') AWS_SECRET_ACCESS_KEY = environ.get('AWS_SECRET_ACCESS_KEY') # e.g. EUR, CAD, GBP, CHF, CNY, JPY REAL_WORLD_CURRENCY_CODE = 'USD' USE_POINTS = True POINTS_CUSTOM_NAME = '' POINTS_DECIMAL_PLACES = 1 # e.g. en, de, fr, it, ja, zh-hans # see: https://docs.djangoproject.com/en/1.9/topics/i18n/#term-language-code LANGUAGE_CODE = 'en' # if an app is included in SESSION_CONFIGS, you don't need to list it here INSTALLED_APPS = ['otree'] # SENTRY_DSN = '' DEMO_PAGE_INTRO_TEXT = """
Here are various games implemented with oTree. These games are all open source, and you can modify them as you wish.
""" ROOMS = [ { 'name': 'experiment1', 'display_name': 'GSC GSS experiment 1-6', 'participant_label_file': 'experiment_participants1.txt', }, { 'name': 'experiment2', 'display_name': 'GSC GSS experiment 7-12', 'participant_label_file': 'experiment_participants2.txt', }, { 'name': 'class_experiments', 'display_name': 'Class Experiment IO', 'participant_label_file': 'IO roster fall 2021.txt', }, { 'name': 'class_experiments2', 'display_name': 'Class Experiment IO 2', 'participant_label_file': 'IO roster fall 2021.txt', }, { 'name': 'class_experiments3', 'display_name': 'Class Experiment IO 3', 'participant_label_file': 'IO roster fall 2021.txt', }, { 'name': 'class_experiments4', 'display_name': 'Class Experiment Principles of Macro', 'participant_label_file': 'Bank run experiment.txt', }, { 'name': 'econ', 'display_name': 'Econ Club', 'participant_label_file': 'econ_club.txt', }, { 'name': 'travel', 'display_name': 'Travel Warning Experiment', 'participant_label_file': 'travel_warning_participants.txt', }, ] mturk_hit_settings = { 'keywords': ['bonus', 'study'], 'title': 'Title for your experiment', 'description': 'Description for your experiment', 'frame_height': 500, 'preview_template': 'global/MTurkPreview.html', 'minutes_allotted_per_assignment': 60, 'expiration_hours': 7*24, # 7 days # 'grant_qualification_id': 'YOUR_QUALIFICATION_ID_HERE',# to prevent retakes 'qualification_requirements': [] } # if you set a property in SESSION_CONFIG_DEFAULTS, it will be inherited by all configs # in SESSION_CONFIGS, except those that explicitly override it. # the session config can be accessed from methods in your apps as self.session.config, # e.g. self.session.config['participation_fee'] SESSION_CONFIG_DEFAULTS = { 'real_world_currency_per_point': 0.00, 'participation_fee': 0.00, 'doc': "", 'mturk_hit_settings': mturk_hit_settings, } SESSION_CONFIGS = [ { 'name': 'public_goods', 'display_name': "Public Goods", 'num_demo_participants': 3, 'app_sequence': ['public_goods', 'payment_info'], }, { 'name': 'trust', 'display_name': "Trust Game", 'num_demo_participants': 2, 'app_sequence': ['trust', 'payment_info'], }, { 'name': 'guess_two_thirds', 'display_name': "Guess 2/3 of the Average", 'num_demo_participants': 3, 'app_sequence': ['guess_two_thirds', 'payment_info'], }, { 'name': 'survey', 'display_name': "Survey", 'num_demo_participants': 1, 'app_sequence': ['survey', 'payment_info'], }, { 'name': 'quiz', 'display_name': "Quiz", 'num_demo_participants': 1, 'app_sequence': ['quiz'], }, { 'name': 'prisoner', 'display_name': "Prisoner's Dilemma", 'num_demo_participants': 2, 'app_sequence': ['prisoner', 'payment_info'], }, { 'name': 'ultimatum', 'display_name': "Ultimatum (randomized: strategy vs. direct response)", 'num_demo_participants': 2, 'app_sequence': ['ultimatum', 'payment_info'], }, { 'name': 'ultimatum_strategy', 'display_name': "Ultimatum (strategy method treatment)", 'num_demo_participants': 2, 'app_sequence': ['ultimatum', 'payment_info'], 'use_strategy_method': True, }, { 'name': 'ultimatum_non_strategy', 'display_name': "Ultimatum (direct response treatment)", 'num_demo_participants': 2, 'app_sequence': ['ultimatum', 'payment_info'], 'use_strategy_method': False, }, { 'name': 'vickrey_auction', 'display_name': "Vickrey Auction", 'num_demo_participants': 3, 'app_sequence': ['vickrey_auction', 'payment_info'], }, { 'name': 'volunteer_dilemma', 'display_name': "Volunteer's Dilemma", 'num_demo_participants': 3, 'app_sequence': ['volunteer_dilemma', 'payment_info'], }, { 'name': 'cournot', 'display_name': "Cournot Competition", 'num_demo_participants': 2, 'app_sequence': [ 'cournot', 'payment_info' ], }, { 'name': 'principal_agent', 'display_name': "Principal Agent", 'num_demo_participants': 2, 'app_sequence': ['principal_agent', 'payment_info'], }, { 'name': 'dictator', 'display_name': "Dictator Game", 'num_demo_participants': 2, 'app_sequence': ['dictator', 'payment_info'], }, { 'name': 'matching_pennies', 'display_name': "Matching Pennies", 'num_demo_participants': 2, 'app_sequence': [ 'matching_pennies', ], }, { 'name': 'traveler_dilemma', 'display_name': "Traveler's Dilemma", 'num_demo_participants': 2, 'app_sequence': ['traveler_dilemma', 'payment_info'], }, { 'name': 'bargaining', 'display_name': "Bargaining Game", 'num_demo_participants': 2, 'app_sequence': ['bargaining', 'payment_info'], }, { 'name': 'common_value_auction', 'display_name': "Common Value Auction", 'num_demo_participants': 3, 'app_sequence': ['common_value_auction', 'payment_info'], }, { 'name': 'stackelberg', 'display_name': "Stackelberg Competition", 'real_world_currency_per_point': 0.01, 'num_demo_participants': 2, 'app_sequence': [ 'stackelberg', 'payment_info' ], }, { 'name': 'bertrand', 'display_name': "Bertrand Competition", 'num_demo_participants': 2, 'app_sequence': [ 'bertrand', 'payment_info' ], }, { 'name': 'real_effort', 'display_name': "Real-effort transcription task", 'num_demo_participants': 1, 'app_sequence': [ 'real_effort', ], }, { 'name': 'lemon_market', 'display_name': "Lemon Market Game", 'num_demo_participants': 3, 'app_sequence': [ 'lemon_market', 'payment_info' ], }, { 'name': 'battle_of_the_sexes', 'display_name': "Battle of the Sexes", 'num_demo_participants': 2, 'app_sequence': [ 'battle_of_the_sexes', 'payment_info' ], }, { 'name': 'public_goods_simple', 'display_name': "Public Goods (simple version from tutorial)", 'num_demo_participants': 3, 'app_sequence': ['public_goods_simple', 'survey', 'payment_info'], }, { 'name': 'trust_simple', 'display_name': "Trust Game (simple version from tutorial)", 'num_demo_participants': 2, 'app_sequence': ['trust_simple'], }, { 'name': 'GSC_low', 'display_name': "GSC low", 'num_demo_participants': 2, 'app_sequence': ['GSC_low', 'payment_info2'], }, { 'name': 'GSS_low', 'display_name': "GSS low", 'num_demo_participants': 2, 'app_sequence': ['GSS_low', 'payment_info2'], }, { 'name': 'GSC_high', 'display_name': "GSC high", 'num_demo_participants': 2, 'app_sequence': ['GSC_high', 'payment_info2'], }, { 'name': 'GSS_high', 'display_name': "GSS high", 'num_demo_participants': 2, 'app_sequence': ['GSS_high', 'payment_info2'], }, { 'name': 'cournot_class', 'display_name': "Cournot Competition Class", 'num_demo_participants': 4, 'app_sequence': [ 'cournot_class', 'payment_info3' ], 'base_points':0, 'total_capacity': 60, 'marginal_cost':15, #'use_browser_bots':True, }, { 'name': 'cournot_class2', 'display_name': "Cournot Competition Class 2", 'num_demo_participants': 2, 'app_sequence': [ 'cournot_class2', 'payment_info3' ], }, { 'name': 'bank_run', 'display_name': "Bank run", 'num_demo_participants': 3, 'app_sequence': [ 'bank_run', 'payment_info3' ], }, { 'name': 'GSCGSS_ABCD', 'display_name': "GSC GSS ABCD", 'num_demo_participants': 2, 'app_sequence': ['GSC_low', 'GSC_high', 'GSS_low', 'GSS_high', 'payment_info2'], }, { 'name': 'GSCGSS_BDAC', 'display_name': "GSC GSS BDAC", 'num_demo_participants': 2, 'app_sequence': ['GSC_high', 'GSS_high', 'GSC_low', 'GSS_low', 'payment_info2'], }, { 'name': 'GSCGSS_DCBA', 'display_name': "GSC GSS DCBA", 'num_demo_participants': 2, 'app_sequence': ['GSS_high', 'GSS_low', 'GSC_high', 'GSC_low', 'payment_info2'], }, { 'name': 'GSCGSS_CADB', 'display_name': "GSC GSS CADB", 'num_demo_participants': 2, 'app_sequence': ['GSS_low', 'GSC_low', 'GSS_high', 'GSC_high', 'payment_info2'], }, { 'name': 'bank_run2', 'display_name': "Bank run 2", 'num_demo_participants': 10, 'app_sequence': [ 'bank_run2', 'payment_info3' ], }, { 'name': 'public_goods_class', 'display_name': "Public Goods Class", 'num_demo_participants': 5, 'app_sequence': ['public_goods_class', 'payment_info3'], }, { 'name': 'ultimatum_class', 'display_name': "Ultimatum Class", 'num_demo_participants': 10, 'app_sequence': ['ultimatum_class', 'payment_info'], 'treatment': 'direct_response', }, { 'name': 'beauty_class2', 'display_name': "Beauty Contest Class 2", 'num_demo_participants': 3, 'num_bots': 3, 'app_sequence': ['beauty_class2', 'payment_info3'], }, { 'name': 'IO_class', 'display_name': "IO Class Experiments ", 'num_demo_participants': 2, 'num_bots': 2, 'app_sequence': ['cournot_class', 'cournot_class2', 'bertrand_class', 'payment_info3'], }, { 'name': 'IO_class2', 'display_name': "IO Class Experiments 2 ", 'num_demo_participants': 2, 'num_bots': 2, 'app_sequence': ['beauty_class3', 'beauty_class4', 'payment_info3'], }, { 'name': 'bertrand_class', 'display_name': "Bertrand Competition Class", 'num_demo_participants': 2, 'app_sequence': [ 'bertrand_class', 'payment_info3' ], 'maximum_price': 100, 'marginal_cost': 25, }, { 'name': 'bank_run_new', 'display_name': "Bank run new", 'num_demo_participants': 2, 'app_sequence': [ 'bank_run_new', 'payment_info3' ], }, { 'name': 'anchoring', 'display_name': "Anchoring", 'num_demo_participants': 1, 'app_sequence': [ 'anchoring', 'payment_info3' ], }, { 'name': 'travel_warning', 'display_name': "Travel Warning", 'num_demo_participants': 5, 'app_sequence': [ 'travel_warning2', 'payment_info3' ], }, { 'name': 'anchoring2', 'display_name': "Anchoring 2", 'num_demo_participants': 1, 'app_sequence': [ 'anchoring2', 'anchoring' ], }, { 'name': 'behavioral_games', 'display_name': "Behavioral Games", 'num_demo_participants': 2, 'app_sequence': [ 'anchoring2', 'anchoring', 'ultimatum_class', 'payment_info3' ], }, { 'name': 'common_value_auction2', 'display_name': "Common Value Auction Multiple Rounds", 'num_demo_participants': 3, 'app_sequence': ['common_value_auction2', 'payment_info3'], }, { 'name': 'signaling', 'display_name': "Signaling Game", 'num_demo_participants': 2, 'app_sequence': ['signaling', 'payment_info3'], }, { 'name': 'beauty_class4', 'display_name': "Beauty Contest Class 4", 'num_demo_participants': 2, 'app_sequence': ['beauty_class4', 'payment_info3'], }, { 'name': 'free_entry_exit', 'display_name': "Free Entry & Exit Market", 'num_demo_participants': 15, 'app_sequence': [ 'free_entry_exit', 'payment_info3' ], 'market_item_1': 'Corn', 'market_item_1_price': 15, 'market_item_2': 'Wheat', 'market_item_2_price': 15, 'market_item_3': 'Soybeans', 'market_item_3_price': 15, 'market_item_4': 'Rice', 'market_item_4_price': 15, #'use_browser_bots':True, }, { 'name':'Parking_game', 'display_name':'Parking Game', 'num_demo_participants':16, 'app_sequence': [ 'Parking_game', 'payment_info3', ], 'parking_permit_value':15, 'lot_A_value':45, 'lot_B_value':35, 'lot_C_value':35, 'lot_D_value':25, 'home_value':15, 'penalty':5, }, ] # anything you put after the below line will override # oTree's default settings. Use with caution. otree.settings.augment_settings(globals())