Skip to content

Commit

Permalink
Merge pull request openedx#839 from MITx/feature/victor/per-course-st…
Browse files Browse the repository at this point in the history
…atus

Feature/victor/per course status
  • Loading branch information
David Ormsbee committed Oct 9, 2012
2 parents 32699d2 + 7e1ca6e commit 076ef3d
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 7 deletions.
24 changes: 19 additions & 5 deletions common/djangoapps/status/status.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,41 @@
"""

from django.conf import settings
import json
import logging
import os
import sys

log = logging.getLogger(__name__)

def get_site_status_msg():
def get_site_status_msg(course_id):
"""
Look for a file settings.STATUS_MESSAGE_PATH. If found, return the
contents. Otherwise, return None.
Look for a file settings.STATUS_MESSAGE_PATH. If found, read it,
parse as json, and do the following:
* if there is a key 'global', include that in the result list.
* if course is not None, and there is a key for course.id, add that to the result list.
* return "<br/>".join(result)
Otherwise, return None.
If something goes wrong, returns None. ("is there a status msg?" logic is
not allowed to break the entire site).
"""
try:
content = None
if os.path.isfile(settings.STATUS_MESSAGE_PATH):
with open(settings.STATUS_MESSAGE_PATH) as f:
content = f.read()
else:
return None

status_dict = json.loads(content)
msg = status_dict.get('global', None)
if course_id in status_dict:
msg = msg + "<br>" if msg else ''
msg += status_dict[course_id]

return content
return msg
except:
log.exception("Error while getting a status message.")
return None
90 changes: 90 additions & 0 deletions common/djangoapps/status/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
from django.conf import settings
from django.test import TestCase
import os
from override_settings import override_settings
from tempfile import NamedTemporaryFile

from status import get_site_status_msg

# Get a name where we can put test files
TMP_FILE = NamedTemporaryFile(delete=False)
TMP_NAME = TMP_FILE.name
# Close it--we just want the path.
TMP_FILE.close()


@override_settings(STATUS_MESSAGE_PATH=TMP_NAME)
class TestStatus(TestCase):
"""Test that the get_site_status_msg function does the right thing"""

no_file = None

invalid_json = """{
"global" : "Hello, Globe",
}"""

global_only = """{
"global" : "Hello, Globe"
}"""

toy_only = """{
"edX/toy/2012_Fall" : "A toy story"
}"""

global_and_toy = """{
"global" : "Hello, Globe",
"edX/toy/2012_Fall" : "A toy story"
}"""


# json to use, expected results for course=None (e.g. homepage),
# for toy course, for full course. Note that get_site_status_msg
# is supposed to return global message even if course=None. The
# template just happens to not display it outside the courseware
# at the moment...
checks = [
(no_file, None, None, None),
(invalid_json, None, None, None),
(global_only, "Hello, Globe", "Hello, Globe", "Hello, Globe"),
(toy_only, None, "A toy story", None),
(global_and_toy, "Hello, Globe", "Hello, Globe<br>A toy story", "Hello, Globe"),
]

def setUp(self):
"""
Fake course ids, since we don't have to have full django
settings (common tests run without the lms settings imported)
"""
self.full_id = 'edX/full/2012_Fall'
self.toy_id = 'edX/toy/2012_Fall'

def create_status_file(self, contents):
"""
Write contents to settings.STATUS_MESSAGE_PATH.
"""
with open(settings.STATUS_MESSAGE_PATH, 'w') as f:
f.write(contents)

def remove_status_file(self):
"""Delete the status file if it exists"""
if os.path.exists(settings.STATUS_MESSAGE_PATH):
os.remove(settings.STATUS_MESSAGE_PATH)

def tearDown(self):
self.remove_status_file()

def test_get_site_status_msg(self):
"""run the tests"""
for (json_str, exp_none, exp_toy, exp_full) in self.checks:

self.remove_status_file()
if json_str:
self.create_status_file(json_str)

print "checking results for {0}".format(json_str)
print "course=None:"
self.assertEqual(get_site_status_msg(None), exp_none)
print "course=toy:"
self.assertEqual(get_site_status_msg(self.toy_id), exp_toy)
print "course=full:"
self.assertEqual(get_site_status_msg(self.full_id), exp_full)
2 changes: 1 addition & 1 deletion lms/envs/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@


# Where to look for a status message
STATUS_MESSAGE_PATH = ENV_ROOT / "status_message.html"
STATUS_MESSAGE_PATH = ENV_ROOT / "status_message.json"

############################ OpenID Provider ##################################
OPENID_PROVIDER_TRUSTED_ROOTS = ['cs50.net', '*.cs50.net']
Expand Down
15 changes: 15 additions & 0 deletions lms/envs/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
# Want static files in the same dir for running on jenkins.
STATIC_ROOT = TEST_ROOT / "staticfiles"

STATUS_MESSAGE_PATH = TEST_ROOT / "status_message.json"

COURSES_ROOT = TEST_ROOT / "data"
DATA_DIR = COURSES_ROOT

Expand Down Expand Up @@ -77,6 +79,19 @@
if os.path.isdir(COMMON_TEST_DATA_ROOT / course_dir)
]

# point tests at the test courses by default

MODULESTORE = {
'default': {
'ENGINE': 'xmodule.modulestore.xml.XMLModuleStore',
'OPTIONS': {
'data_dir': COMMON_TEST_DATA_ROOT,
'default_class': 'xmodule.hidden_module.HiddenDescriptor',
}
}
}


DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
Expand Down
7 changes: 6 additions & 1 deletion lms/templates/navigation.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,12 @@

<%block cached="False">
<%
site_status_msg = get_site_status_msg()
try:
course_id = course.id
except:
# can't figure out a better way to get at a possibly-defined course var
course_id = None
site_status_msg = get_site_status_msg(course_id)
%>
% if site_status_msg:
<div class="site-status">
Expand Down

0 comments on commit 076ef3d

Please sign in to comment.