From 911110c6bc4d80cb0452a9789bb0d4c8b4946b64 Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Sat, 11 May 2013 16:19:04 -0400 Subject: [PATCH] Imports djanalytics, and adds URLs --- lms/envs/analyticsserver.py | 262 ++++++++++++++++++++++++++++++++++++ lms/envs/common.py | 7 + lms/urls.py | 8 ++ 3 files changed, 277 insertions(+) create mode 100644 lms/envs/analyticsserver.py diff --git a/lms/envs/analyticsserver.py b/lms/envs/analyticsserver.py new file mode 100644 index 0000000000..e91e935d95 --- /dev/null +++ b/lms/envs/analyticsserver.py @@ -0,0 +1,262 @@ +""" + +This config file is used to host an analytics server. The edX codebase +is fairly monolithic, and expensive to import from within the +analytics framework. It also mixes up Django authentication databases, +etc. The analytics framework is fairly modular, and easy to import +from within edX. With this configuration. + +This should configuration should never be enabled on a production LMS. + +This configuration should also never be used as the main analytics +server. It should only be used as a thin layer to allow access to edX +data in a way that can use the edX libraries. When used in this mode, +it should only be granted access to read replicas of the databases. + +""" +import json + +ROOT_URLCONF = 'lms.urls' + +from .common import * +from logsettings import get_logger_config + +DEBUG = True +TEMPLATE_DEBUG = True + + +MITX_FEATURES['DISABLE_START_DATES'] = True +MITX_FEATURES['ENABLE_SQL_TRACKING_LOGS'] = True +MITX_FEATURES['SUBDOMAIN_COURSE_LISTINGS'] = False # Enable to test subdomains--otherwise, want all courses to show up +MITX_FEATURES['SUBDOMAIN_BRANDING'] = True +MITX_FEATURES['FORCE_UNIVERSITY_DOMAIN'] = None # show all university courses if in dev (ie don't use HTTP_HOST) +MITX_FEATURES['ENABLE_MANUAL_GIT_RELOAD'] = True +MITX_FEATURES['ENABLE_PSYCHOMETRICS'] = False # real-time psychometrics (eg item response theory analysis in instructor dashboard) +MITX_FEATURES['ENABLE_INSTRUCTOR_ANALYTICS'] = True +MITX_FEATURES['RUN_AS_ANALYTICS_SERVER_ENABLED'] = True + +INSTALLED_APPS = INSTALLED_APPS + ( 'djeventstream.httphandler', + 'djcelery', + 'south', + 'djanalytics.core', + 'djanalytics.modulefs', +) + +INSTALLED_ANALYTICS_MODULES = open("../analytics_modules.txt").readlines() +INSTALLED_ANALYTICS_MODULES = [x for x in INSTALLED_ANALYTICS_MODULES if x and len(x)>1] + +DJFS = { 'type' : 'osfs', + 'directory_root' : '/tmp/djfsmodule', + 'url_root' : 'file:///tmp/' + } + +import djcelery + +djcelery.setup_loader() +default_optional_kwargs = ['fs','db','query'] + +WIKI_ENABLED = True + +LOGGING = get_logger_config(ENV_ROOT / "log", + logging_env="dev", + local_loglevel="DEBUG", + dev_env=True, + debug=True) + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': ENV_ROOT / "db" / "mitx.db", + } +} + +CACHES = { + # This is the cache used for most things. + # In staging/prod envs, the sessions also live here. + 'default': { + 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', + 'LOCATION': 'mitx_loc_mem_cache', + 'KEY_FUNCTION': 'util.memcache.safe_key', + }, + + # The general cache is what you get if you use our util.cache. It's used for + # things like caching the course.xml file for different A/B test groups. + # We set it to be a DummyCache to force reloading of course.xml in dev. + # In staging environments, we would grab VERSION from data uploaded by the + # push process. + 'general': { + 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', + 'KEY_PREFIX': 'general', + 'VERSION': 4, + 'KEY_FUNCTION': 'util.memcache.safe_key', + }, + + 'mongo_metadata_inheritance': { + 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', + 'LOCATION': '/var/tmp/mongo_metadata_inheritance', + 'TIMEOUT': 300, + 'KEY_FUNCTION': 'util.memcache.safe_key', + } +} + + +XQUEUE_INTERFACE = { + "url": "https://sandbox-xqueue.edx.org", + "django_auth": { + "username": "lms", + "password": "***REMOVED***" + }, + "basic_auth": ('anant', 'agarwal'), +} + +# Make the keyedcache startup warnings go away +CACHE_TIMEOUT = 0 + +# Dummy secret key for dev +SECRET_KEY = '85920908f28904ed733fe576320db18cabd7b6cd' + + +COURSE_LISTINGS = { + 'default': ['BerkeleyX/CS169.1x/2012_Fall', + 'BerkeleyX/CS188.1x/2012_Fall', + 'HarvardX/CS50x/2012', + 'HarvardX/PH207x/2012_Fall', + 'MITx/3.091x/2012_Fall', + 'MITx/6.002x/2012_Fall', + 'MITx/6.00x/2012_Fall'], + 'berkeley': ['BerkeleyX/CS169/fa12', + 'BerkeleyX/CS188/fa12'], + 'harvard': ['HarvardX/CS50x/2012H'], + 'mit': ['MITx/3.091/MIT_2012_Fall'], + 'sjsu': ['MITx/6.002x-EE98/2012_Fall_SJSU'], +} + + +SUBDOMAIN_BRANDING = { + 'sjsu': 'MITx', + 'mit': 'MITx', + 'berkeley': 'BerkeleyX', + 'harvard': 'HarvardX', +} + +# List of `university` landing pages to display, even though they may not +# have an actual course with that org set +VIRTUAL_UNIVERSITIES = [] + +# Organization that contain other organizations +META_UNIVERSITIES = {'UTx': ['UTAustinX']} + +COMMENTS_SERVICE_KEY = "PUT_YOUR_API_KEY_HERE" + +############################## Course static files ########################## +if os.path.isdir(DATA_DIR): + # Add the full course repo if there is no static directory + STATICFILES_DIRS += [ + # TODO (cpennington): When courses are stored in a database, this + # should no longer be added to STATICFILES + (course_dir, DATA_DIR / course_dir) + for course_dir in os.listdir(DATA_DIR) + if (os.path.isdir(DATA_DIR / course_dir) and + not os.path.isdir(DATA_DIR / course_dir / 'static')) + ] + # Otherwise, add only the static directory from the course dir + STATICFILES_DIRS += [ + # TODO (cpennington): When courses are stored in a database, this + # should no longer be added to STATICFILES + (course_dir, DATA_DIR / course_dir / 'static') + for course_dir in os.listdir(DATA_DIR) + if (os.path.isdir(DATA_DIR / course_dir / 'static')) + ] + + +################################# mitx revision string ##################### + +MITX_VERSION_STRING = os.popen('cd %s; git describe' % REPO_ROOT).read().strip() + +################################# Open ended grading config ##################### + +OPEN_ENDED_GRADING_INTERFACE = { + 'url' : 'http://127.0.0.1:3033/', + 'username' : 'lms', + 'password' : 'abcd', + 'staff_grading' : 'staff_grading', + 'peer_grading' : 'peer_grading', + 'grading_controller' : 'grading_controller' +} + +################################ LMS Migration ################################# +MITX_FEATURES['ENABLE_LMS_MIGRATION'] = True +MITX_FEATURES['ACCESS_REQUIRE_STAFF_FOR_COURSE'] = False # require that user be in the staff_* group to be able to enroll +MITX_FEATURES['USE_XQA_SERVER'] = 'http://xqa:server@content-qa.mitx.mit.edu/xqa' + +INSTALLED_APPS += ('lms_migration',) + +LMS_MIGRATION_ALLOWED_IPS = ['127.0.0.1'] + +################################ OpenID Auth ################################# +MITX_FEATURES['AUTH_USE_OPENID'] = True +MITX_FEATURES['AUTH_USE_OPENID_PROVIDER'] = True +MITX_FEATURES['BYPASS_ACTIVATION_EMAIL_FOR_EXTAUTH'] = True + +INSTALLED_APPS += ('external_auth',) +INSTALLED_APPS += ('django_openid_auth',) + +OPENID_CREATE_USERS = False +OPENID_UPDATE_DETAILS_FROM_SREG = True +OPENID_SSO_SERVER_URL = 'https://www.google.com/accounts/o8/id' # TODO: accept more endpoints +OPENID_USE_AS_ADMIN_LOGIN = False + +OPENID_PROVIDER_TRUSTED_ROOTS = ['*'] + +################################ MIT Certificates SSL Auth ################################# + +MITX_FEATURES['AUTH_USE_MIT_CERTIFICATES'] = True + +################################ DEBUG TOOLBAR ################################# +INSTALLED_APPS += ('debug_toolbar',) +MIDDLEWARE_CLASSES += ('django_comment_client.utils.QueryCountDebugMiddleware', + 'debug_toolbar.middleware.DebugToolbarMiddleware',) +INTERNAL_IPS = ('127.0.0.1',) + +DEBUG_TOOLBAR_PANELS = ( + 'debug_toolbar.panels.version.VersionDebugPanel', + 'debug_toolbar.panels.timer.TimerDebugPanel', + 'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel', + 'debug_toolbar.panels.headers.HeaderDebugPanel', + 'debug_toolbar.panels.request_vars.RequestVarsDebugPanel', + 'debug_toolbar.panels.sql.SQLDebugPanel', + 'debug_toolbar.panels.signals.SignalDebugPanel', + 'debug_toolbar.panels.logger.LoggingPanel', + +# Enabling the profiler has a weird bug as of django-debug-toolbar==0.9.4 and +# Django=1.3.1/1.4 where requests to views get duplicated (your method gets +# hit twice). So you can uncomment when you need to diagnose performance +# problems, but you shouldn't leave it on. +# 'debug_toolbar.panels.profiling.ProfilingDebugPanel', +) + +DEBUG_TOOLBAR_CONFIG = { + 'INTERCEPT_REDIRECTS': False +} +############################ FILE UPLOADS (for discussion forums) ############################# +DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' +MEDIA_ROOT = ENV_ROOT / "uploads" +MEDIA_URL = "/static/uploads/" +STATICFILES_DIRS.append(("uploads", MEDIA_ROOT)) +FILE_UPLOAD_TEMP_DIR = ENV_ROOT / "uploads" +FILE_UPLOAD_HANDLERS = ( + 'django.core.files.uploadhandler.MemoryFileUploadHandler', + 'django.core.files.uploadhandler.TemporaryFileUploadHandler', +) + +########################### PIPELINE ################################# + +PIPELINE_SASS_ARGUMENTS = '--debug-info --require {proj_dir}/static/sass/bourbon/lib/bourbon.rb'.format(proj_dir=PROJECT_ROOT) + +########################## PEARSON TESTING ########################### +MITX_FEATURES['ENABLE_PEARSON_LOGIN'] = False + +########################## ANALYTICS TESTING ######################## + +ANALYTICS_SERVER_URL = "http://127.0.0.1:9000/" +ANALYTICS_API_KEY = "" diff --git a/lms/envs/common.py b/lms/envs/common.py index e6d761c070..c6091fa382 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -85,6 +85,13 @@ MITX_FEATURES = { # analytics experiments 'ENABLE_INSTRUCTOR_ANALYTICS': False, + # enable analytics server. + # WARNING: THIS SHOULD ALWAYS BE SET TO FALSE UNDER NORMAL + # LMS OPERATION. See analytics.py for details about what + # this does. + + 'RUN_AS_ANALYTICS_SERVER_ENABLED' : False, + # Flip to True when the YouTube iframe API breaks (again) 'USE_YOUTUBE_OBJECT_API': False, diff --git a/lms/urls.py b/lms/urls.py index b00813a40d..8fffa80586 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -353,6 +353,12 @@ if settings.MITX_FEATURES.get('ENABLE_SQL_TRACKING_LOGS'): url(r'^event_logs/(?P.+)$', 'track.views.view_tracking_log'), ) +if settings.MITX_FEATURES.get('RUN_AS_ANALYTICS_SERVER_ENABLED'): + urlpatterns += ( + url('^', include('djanalytics.core.urls')), + ) + import djanalytics.core.registry + # FoldIt views urlpatterns += ( # The path is hardcoded into their app... @@ -367,3 +373,5 @@ if settings.DEBUG: #Custom error pages handler404 = 'static_template_view.views.render_404' handler500 = 'static_template_view.views.render_500' + +