import os from os import environ import dj_database_url import otree.settings BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # environment vars environ['DATABASE_URL'] = 'postgres://postgres@localhost/django_db' environ['OTREE_PRODUCTION'] = '1' environ['OTREE_ADMIN_PASSWORD'] = 'Yan1234' environ['OTREE_AUTH_LEVEL'] = 'STUDY' # 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 = Truegi # don't share this with anybody. SECRET_KEY = '3+)q_)z$l64f4z_pv5)!rnl=-ctw5k)bu3kiwm)_g=%)4jx&^^' 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') ) } # 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 = 'CNY' USE_POINTS = False # 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': 'ComLab6', 'display_name': 'Com Lab 6', 'participant_label_file': '_rooms/comlab6.txt', }, { 'name': 'CATILab', 'display_name': 'CATI Lab', 'participant_label_file': '_rooms/catilab.txt', }, { 'name': 'D6556', 'display_name': 'Behavioral Econ (NCPA)', 'participant_label_file': '_rooms/d6556.txt' }, { 'name': 'VirtualRoom', 'display_name': 'Virtual Room' }, { 'name': 'OnlineSurvey', 'display_name': 'Online Housing Survey', 'participant_label_file': '_rooms/OnlineSurvey.txt'} ] mturk_hit_settings = { 'keywords': ['bonus', 'study'], 'title': 'mturk test', 'description': 'this is a test', '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.01, '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': 'wta_wtp_gap', 'display_name': "WTAWTP Gap", 'num_demo_participants': 2, 'app_sequence': ['wta_wtp_gap', 'payment_info'], }, { 'name': 'kt_framing', 'display_name': "Khaneman Tversky", 'num_demo_participants': 2, 'app_sequence': ['kt_framing', 'payment_info'], }, { 'name': 'teaching_asian_disease', 'display_name': "Asian Disease", 'num_demo_participants': 2, 'app_sequence': ['teaching_asian_disease'], }, # { # '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': 'mpl', # 'display_name': "MPL (Individual)", # 'num_demo_participants': 1, # 'app_sequence': ['mpl', 'survey', 'payment_info'], # }, # { # 'name': 'certainty_eq', # 'display_name': "Certainty Equivalent with Amount (Individual)", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['certainty_eq', 'survey', 'payment_info'], # }, # { # 'name': 'certainty_eq_group', # 'display_name': "Certainty Equivalent with Amount (Group Voting)", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['certainty_eq_group', 'survey', 'payment_info'], # }, # { # 'name': 'certainty_eq_random', # 'display_name': "Certainty Equivalent with Amount (Random)", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['certainty_eq_random', 'survey', 'payment_info'], # }, # { # 'name': 'cem_list', # 'display_name': "Certainty Equivalent and GP (Individual Choice)", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['cem_list', 'gneezy_potters', 'survey', 'payment_info'], # }, # { # 'name': 'cem_list_g', # 'display_name': "Certainty Equivalent and GP (Group Voting)", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['cem_list_g', 'gneezy_potters_group', 'survey', 'payment_info'], # }, # { # 'name': 'cem_list_random', # 'display_name': "Certainty Equivalent with List", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['cem_list', 'survey', 'payment_info'] # }, # { # 'name': 'group_risk', # 'display_name': "Group Risky Decision Making", # 'num_demo_participants': 3, # 'app_sequence': ['cem_list', 'cem_list_g', 'survey', 'payment_info'], # }, # { # 'name': 'gneezy_potters', # 'display_name': "Investment Game (GP)", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['gneezy_potters', 'survey', 'payment_info'], # }, # { # 'name': 'gneezy_potters_group', # 'display_name': "Investment Game (GP Group)", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['gneezy_potters_group', 'survey', 'payment_info'], # }, # { # 'name': 'gneezy_potters_random', # 'display_name': "Investment Game (GP Group Random)", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['gneezy_potters_random', 'survey', 'payment_info'], # }, # These are formal experiments # { # 'name': 'CE_GP', # 'display_name': "CE+GP (Individual)", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['certainty_eq', 'gneezy_potters', 'survey', 'payment_info'], # }, # { # 'name': 'CE_GP_group', # 'display_name': "CE+GP (Group Voting)", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['certainty_eq_group', 'gneezy_potters_group', 'survey', 'payment_info'], # }, # { # 'name': 'CE_GP_random', # 'display_name': "CE+GP (Random Selection)", # 'num_demo_participants': 3, # 'real_world_currency_per_point': 0.05, # 'app_sequence': ['certainty_eq_random', 'gneezy_potters_random', 'survey', 'payment_info'], # } ] SENTRY_DSN = 'http://effa011612924da9a31880f18e1460c8:f637595de9794b54a2ff3fc367130605@sentry.otree.org/296' # anything you put after the below line will override # oTree's default settings. Use with caution. otree.settings.augment_settings(globals())