Merge branch 'master' into feature/kevin/flagging
This commit is contained in:
@@ -9,7 +9,6 @@ from tempdir import mkdtemp_clean
|
||||
from fs.osfs import OSFS
|
||||
import copy
|
||||
from json import loads
|
||||
import traceback
|
||||
from datetime import timedelta
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
@@ -397,7 +396,7 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase):
|
||||
|
||||
# We had a bug where orphaned draft nodes caused export to fail. This is here to cover that case.
|
||||
draft_store.clone_item(vertical.location, Location(['i4x', 'edX', 'full',
|
||||
'vertical', 'no_references', 'draft']))
|
||||
'vertical', 'no_references', 'draft']))
|
||||
|
||||
for child in vertical.get_children():
|
||||
draft_store.clone_item(child.location, child.location)
|
||||
@@ -478,6 +477,12 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase):
|
||||
for child in vertical.get_children():
|
||||
self.assertTrue(getattr(child, 'is_draft', False))
|
||||
|
||||
# make sure that we don't have a sequential that is in draft mode
|
||||
sequential = draft_store.get_item(Location(['i4x', 'edX', 'full',
|
||||
'sequential', 'Administrivia_and_Circuit_Elements', None]))
|
||||
|
||||
self.assertFalse(getattr(sequential, 'is_draft', False))
|
||||
|
||||
# verify that we have the private vertical
|
||||
test_private_vertical = draft_store.get_item(Location(['i4x', 'edX', 'full',
|
||||
'vertical', 'vertical_66', None]))
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
|
||||
<%namespace name='static' file='static_content.html'/>
|
||||
<%!
|
||||
from contentstore import utils
|
||||
from contentstore import utils
|
||||
%>
|
||||
|
||||
<%block name="jsextra">
|
||||
<link rel="stylesheet" type="text/css" href="${static.url('js/vendor/timepicker/jquery.timepicker.css')}" />
|
||||
<script src="${static.url('js/vendor/timepicker/jquery.timepicker.js')}"></script>
|
||||
|
||||
|
||||
<script type="text/javascript" src="${static.url('js/template_loader.js')}"></script>
|
||||
<script type="text/javascript" src="${static.url('js/views/server_error.js')}"></script>
|
||||
<script type="text/javascript" src="${static.url('js/models/course_relative.js')}"></script>
|
||||
<script type="text/javascript" src="${static.url('js/views/validating_view.js')}"></script>
|
||||
<script type="text/javascript" src="${static.url('js/models/settings/course_grading_policy.js')}"></script>
|
||||
<script type="text/javascript" src="${static.url('js/views/settings/settings_grading_view.js')}"></script>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
|
||||
@@ -26,15 +26,15 @@ from contentstore import utils
|
||||
}).blur(function() {
|
||||
$("label").removeClass("is-focused");
|
||||
});
|
||||
|
||||
|
||||
var editor = new CMS.Views.Settings.Grading({
|
||||
el: $('.settings-grading'),
|
||||
model : new CMS.Models.Settings.CourseGradingPolicy(${course_details|n},{parse:true})
|
||||
});
|
||||
|
||||
|
||||
editor.render();
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
</%block>
|
||||
|
||||
@@ -97,7 +97,7 @@ from contentstore import utils
|
||||
<ol class="list-input">
|
||||
<li class="field text" id="field-course-grading-graceperiod">
|
||||
<label for="course-grading-graceperiod">Grace Period on Deadline:</label>
|
||||
<input type="text" class="short time" id="course-grading-graceperiod" value="0:00" placeholder="e.g. 10 minutes">
|
||||
<input type="text" class="short time" id="course-grading-graceperiod" value="0:00" placeholder="HH:MM" autocomplete="off" />
|
||||
<span class="tip tip-inline">Leeway on due dates</span>
|
||||
</li>
|
||||
</ol>
|
||||
@@ -112,13 +112,13 @@ from contentstore import utils
|
||||
</header>
|
||||
|
||||
<ol class="list-input course-grading-assignment-list enum">
|
||||
|
||||
</ol>
|
||||
|
||||
</ol>
|
||||
|
||||
<div class="actions">
|
||||
<a href="#" class="new-button new-course-grading-item add-grading-data">
|
||||
<span class="plus-icon white"></span>New Assignment Type
|
||||
</a>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
</form>
|
||||
|
||||
@@ -668,6 +668,8 @@ class MatlabInput(CodeInput):
|
||||
# Check if problem has been queued
|
||||
self.queuename = 'matlab'
|
||||
self.queue_msg = ''
|
||||
# this is only set if we don't have a graded response
|
||||
# the graded response takes precedence
|
||||
if 'queue_msg' in self.input_state and self.status in ['queued', 'incomplete', 'unsubmitted']:
|
||||
self.queue_msg = self.input_state['queue_msg']
|
||||
if 'queuestate' in self.input_state and self.input_state['queuestate'] == 'queued':
|
||||
@@ -712,11 +714,23 @@ class MatlabInput(CodeInput):
|
||||
self.input_state['queuestate'] = None
|
||||
self.input_state['queuekey'] = None
|
||||
|
||||
def button_enabled(self):
|
||||
""" Return whether or not we want the 'Test Code' button visible
|
||||
|
||||
Right now, we only want this button to show up when a problem has not been
|
||||
checked.
|
||||
"""
|
||||
if self.status in ['correct', 'incorrect']:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def _extra_context(self):
|
||||
''' Set up additional context variables'''
|
||||
extra_context = {
|
||||
'queue_len': str(self.queue_len),
|
||||
'queue_msg': self.queue_msg
|
||||
'queue_msg': self.queue_msg,
|
||||
'button_enabled': self.button_enabled(),
|
||||
}
|
||||
return extra_context
|
||||
|
||||
@@ -766,10 +780,6 @@ class MatlabInput(CodeInput):
|
||||
lms_key=queuekey,
|
||||
queue_name=self.queuename)
|
||||
|
||||
# save the input state
|
||||
self.input_state['queuekey'] = queuekey
|
||||
self.input_state['queuestate'] = 'queued'
|
||||
|
||||
# construct xqueue body
|
||||
student_info = {'anonymous_student_id': anonymous_student_id,
|
||||
'submission_time': qtime}
|
||||
@@ -779,6 +789,10 @@ class MatlabInput(CodeInput):
|
||||
|
||||
(error, msg) = qinterface.send_to_queue(header=xheader,
|
||||
body=json.dumps(contents))
|
||||
# save the input state if successful
|
||||
if error == 0:
|
||||
self.input_state['queuekey'] = queuekey
|
||||
self.input_state['queuestate'] = 'queued'
|
||||
|
||||
return {'success': error == 0, 'message': msg}
|
||||
|
||||
|
||||
@@ -33,9 +33,11 @@
|
||||
${queue_msg|n}
|
||||
</div>
|
||||
|
||||
% if button_enabled:
|
||||
<div class="plot-button">
|
||||
<input type="button" class="save" name="plot-button" id="plot_${id}" value="Plot" />
|
||||
<input type="button" class="save" name="plot-button" id="plot_${id}" value="Run Code" />
|
||||
</div>
|
||||
%endif
|
||||
|
||||
<script>
|
||||
// Note: We need to make the area follow the CodeMirror for this to work.
|
||||
@@ -91,7 +93,7 @@
|
||||
window.location.reload();
|
||||
}
|
||||
else {
|
||||
gentle_alert(problem_elt, msg);
|
||||
gentle_alert(problem_elt, response.message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,7 +104,7 @@
|
||||
{'submission': submission}, plot_callback);
|
||||
}
|
||||
else {
|
||||
gentle_alert(problem_elt, msg);
|
||||
gentle_alert(problem_elt, response.message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -384,6 +384,7 @@ class MatlabTest(unittest.TestCase):
|
||||
'linenumbers': 'true',
|
||||
'hidden': '',
|
||||
'tabsize': int(self.tabsize),
|
||||
'button_enabled': True,
|
||||
'queue_len': '3'}
|
||||
|
||||
self.assertEqual(context, expected)
|
||||
@@ -409,10 +410,37 @@ class MatlabTest(unittest.TestCase):
|
||||
'linenumbers': 'true',
|
||||
'hidden': '',
|
||||
'tabsize': int(self.tabsize),
|
||||
'button_enabled': True,
|
||||
'queue_len': '3'}
|
||||
|
||||
self.assertEqual(context, expected)
|
||||
|
||||
def test_rendering_when_completed(self):
|
||||
for status in ['correct', 'incorrect']:
|
||||
state = {'value': 'print "good evening"',
|
||||
'status': status,
|
||||
'input_state': {},
|
||||
}
|
||||
elt = etree.fromstring(self.xml)
|
||||
|
||||
the_input = self.input_class(test_system, elt, state)
|
||||
context = the_input._get_render_context()
|
||||
expected = {'id': 'prob_1_2',
|
||||
'value': 'print "good evening"',
|
||||
'status': status,
|
||||
'msg': '',
|
||||
'mode': self.mode,
|
||||
'rows': self.rows,
|
||||
'cols': self.cols,
|
||||
'queue_msg': '',
|
||||
'linenumbers': 'true',
|
||||
'hidden': '',
|
||||
'tabsize': int(self.tabsize),
|
||||
'button_enabled': False,
|
||||
'queue_len': '0'}
|
||||
|
||||
self.assertEqual(context, expected)
|
||||
|
||||
def test_rendering_while_queued(self):
|
||||
state = {'value': 'print "good evening"',
|
||||
'status': 'incomplete',
|
||||
@@ -433,6 +461,7 @@ class MatlabTest(unittest.TestCase):
|
||||
'linenumbers': 'true',
|
||||
'hidden': '',
|
||||
'tabsize': int(self.tabsize),
|
||||
'button_enabled': True,
|
||||
'queue_len': '1'}
|
||||
|
||||
self.assertEqual(context, expected)
|
||||
@@ -447,6 +476,17 @@ class MatlabTest(unittest.TestCase):
|
||||
self.assertTrue(self.the_input.input_state['queuekey'] is not None)
|
||||
self.assertEqual(self.the_input.input_state['queuestate'], 'queued')
|
||||
|
||||
def test_plot_data_failure(self):
|
||||
get = {'submission': 'x = 1234;'}
|
||||
error_message = 'Error message!'
|
||||
test_system.xqueue['interface'].send_to_queue.return_value = (1, error_message)
|
||||
response = self.the_input.handle_ajax("plot", get)
|
||||
self.assertFalse(response['success'])
|
||||
self.assertEqual(response['message'], error_message)
|
||||
self.assertTrue('queuekey' not in self.the_input.input_state)
|
||||
self.assertTrue('queuestate' not in self.the_input.input_state)
|
||||
test_system.xqueue['interface'].send_to_queue.return_value = (0, 'Success!')
|
||||
|
||||
def test_ungraded_response_success(self):
|
||||
queuekey = 'abcd'
|
||||
input_state = {'queuekey': queuekey, 'queuestate': 'queued'}
|
||||
@@ -583,7 +623,6 @@ class ImageInputTest(unittest.TestCase):
|
||||
self.check('[12 13 14]', 0, 0)
|
||||
|
||||
|
||||
|
||||
class CrystallographyTest(unittest.TestCase):
|
||||
'''
|
||||
Check that crystallography inputs work
|
||||
@@ -613,8 +652,7 @@ class CrystallographyTest(unittest.TestCase):
|
||||
'status': 'unsubmitted',
|
||||
'msg': '',
|
||||
'width': width,
|
||||
'height': height,
|
||||
}
|
||||
'height': height}
|
||||
|
||||
self.assertEqual(context, expected)
|
||||
|
||||
@@ -654,13 +692,11 @@ class VseprTest(unittest.TestCase):
|
||||
'width': width,
|
||||
'height': height,
|
||||
'molecules': molecules,
|
||||
'geometries': geometries,
|
||||
}
|
||||
'geometries': geometries}
|
||||
|
||||
self.assertEqual(context, expected)
|
||||
|
||||
|
||||
|
||||
class ChemicalEquationTest(unittest.TestCase):
|
||||
'''
|
||||
Check that chemical equation inputs work.
|
||||
@@ -674,7 +710,6 @@ class ChemicalEquationTest(unittest.TestCase):
|
||||
state = {'value': 'H2OYeah', }
|
||||
self.the_input = lookup_tag('chemicalequationinput')(test_system, element, state)
|
||||
|
||||
|
||||
def test_rendering(self):
|
||||
''' Verify that the render context matches the expected render context'''
|
||||
context = self.the_input._get_render_context()
|
||||
@@ -688,10 +723,8 @@ class ChemicalEquationTest(unittest.TestCase):
|
||||
}
|
||||
self.assertEqual(context, expected)
|
||||
|
||||
|
||||
def test_chemcalc_ajax_sucess(self):
|
||||
''' Verify that using the correct dispatch and valid data produces a valid response'''
|
||||
|
||||
data = {'formula': "H"}
|
||||
response = self.the_input.handle_ajax("preview_chemcalc", data)
|
||||
|
||||
@@ -700,9 +733,6 @@ class ChemicalEquationTest(unittest.TestCase):
|
||||
self.assertEqual(response['error'], "")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class DragAndDropTest(unittest.TestCase):
|
||||
'''
|
||||
Check that drag and drop inputs work
|
||||
|
||||
@@ -274,7 +274,7 @@ def import_from_xml(store, data_dir, course_dirs=None,
|
||||
|
||||
# now import any 'draft' items
|
||||
if draft_store is not None:
|
||||
import_course_draft(xml_module_store, draft_store, course_data_path,
|
||||
import_course_draft(xml_module_store, store, draft_store, course_data_path,
|
||||
static_content_store, target_location_namespace if target_location_namespace is not None
|
||||
else course_location)
|
||||
|
||||
@@ -339,7 +339,7 @@ def import_module(module, store, course_data_path, static_content_store, allow_n
|
||||
store.update_metadata(module.location, dict(own_metadata(module)))
|
||||
|
||||
|
||||
def import_course_draft(xml_module_store, store, course_data_path, static_content_store, target_location_namespace):
|
||||
def import_course_draft(xml_module_store, store, draft_store, course_data_path, static_content_store, target_location_namespace):
|
||||
'''
|
||||
This will import all the content inside of the 'drafts' folder, if it exists
|
||||
NOTE: This is not a full course import, basically in our current application only verticals (and downwards)
|
||||
@@ -396,7 +396,7 @@ def import_course_draft(xml_module_store, store, course_data_path, static_conten
|
||||
del module.xml_attributes['parent_sequential_url']
|
||||
del module.xml_attributes['index_in_children_list']
|
||||
|
||||
import_module(module, store, course_data_path, static_content_store, allow_not_found=True)
|
||||
import_module(module, draft_store, course_data_path, static_content_store, allow_not_found=True)
|
||||
for child in module.get_children():
|
||||
_import_module(child)
|
||||
|
||||
|
||||
@@ -231,7 +231,6 @@ def forum_form_discussion(request, course_id):
|
||||
'is_course_cohorted': is_course_cohorted(course_id)
|
||||
}
|
||||
# print "start rendering.."
|
||||
|
||||
return render_to_response('discussion/index.html', context)
|
||||
|
||||
|
||||
|
||||
@@ -1,16 +1,61 @@
|
||||
"""
|
||||
This file demonstrates writing tests using the unittest module. These will pass
|
||||
when you run "manage.py test".
|
||||
|
||||
Replace this with more appropriate tests for your application.
|
||||
"""
|
||||
|
||||
from django.test import TestCase
|
||||
from django.test.client import Client
|
||||
|
||||
|
||||
class SimpleTest(TestCase):
|
||||
def test_basic_addition(self):
|
||||
|
||||
def setUp(self):
|
||||
self.client = Client()
|
||||
|
||||
def test_render(self):
|
||||
"""
|
||||
Tests that 1 + 1 always equals 2.
|
||||
Render a normal page, like jobs
|
||||
"""
|
||||
self.assertEqual(1 + 1, 2)
|
||||
response = self.client.get("/jobs")
|
||||
self.assertEquals(response.status_code, 200)
|
||||
|
||||
|
||||
def test_render_press_release(self):
|
||||
"""
|
||||
Render press releases from generic URL match
|
||||
"""
|
||||
# since I had to remap files, pedantically test all press releases
|
||||
# published to date. Decent positive test while we're at it.
|
||||
all_releases = ["/press/mit-and-harvard-announce-edx",
|
||||
"/press/uc-berkeley-joins-edx",
|
||||
"/press/edX-announces-proctored-exam-testing",
|
||||
"/press/elsevier-collaborates-with-edx",
|
||||
"/press/ut-joins-edx",
|
||||
"/press/cengage-to-provide-book-content",
|
||||
"/press/gates-foundation-announcement",
|
||||
"/press/wellesley-college-joins-edx",
|
||||
"/press/georgetown-joins-edx",
|
||||
"/press/spring-courses",
|
||||
"/press/lewin-course-announcement",
|
||||
"/press/bostonx-announcement",
|
||||
"/press/eric-lander-secret-of-life",
|
||||
"/press/edx-expands-internationally",
|
||||
"/press/xblock_announcement",
|
||||
"/press/stanford-to-work-with-edx",
|
||||
]
|
||||
|
||||
for rel in all_releases:
|
||||
response = self.client.get(rel)
|
||||
self.assertNotContains(response, "PAGE NOT FOUND", status_code=200)
|
||||
|
||||
# should work with caps
|
||||
response = self.client.get("/press/STANFORD-to-work-with-edx")
|
||||
self.assertContains(response, "Stanford", status_code=200)
|
||||
|
||||
# negative test
|
||||
response = self.client.get("/press/this-shouldnt-work")
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
# can someone do something fishy? no.
|
||||
response = self.client.get("/press/../homework.html")
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
# "." in is ascii 2E
|
||||
response = self.client.get("/press/%2E%2E/homework.html")
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
|
||||
@@ -4,9 +4,10 @@
|
||||
# security reasons.
|
||||
|
||||
from mitxmako.shortcuts import render_to_response, render_to_string
|
||||
from mako.exceptions import TopLevelLookupException
|
||||
from django.shortcuts import redirect
|
||||
from django.conf import settings
|
||||
from django.http import HttpResponseNotFound, HttpResponseServerError
|
||||
from django.http import HttpResponseNotFound, HttpResponseServerError, Http404
|
||||
from django_future.csrf import ensure_csrf_cookie
|
||||
|
||||
from util.cache import cache_if_anonymous
|
||||
@@ -40,6 +41,25 @@ def render(request, template):
|
||||
return render_to_response('static_templates/' + template, {})
|
||||
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@cache_if_anonymous
|
||||
def render_press_release(request, slug):
|
||||
"""
|
||||
Render a press release given a slug. Similar to the "render" function above,
|
||||
but takes a slug and does a basic conversion to convert it to a template file.
|
||||
a) all lower case,
|
||||
b) convert dashes to underscores, and
|
||||
c) appending ".html"
|
||||
"""
|
||||
template = slug.lower().replace('-', '_') + ".html"
|
||||
try:
|
||||
resp = render_to_response('static_templates/press_releases/' + template, {})
|
||||
except TopLevelLookupException:
|
||||
raise Http404
|
||||
else:
|
||||
return resp
|
||||
|
||||
|
||||
def render_404(request):
|
||||
return HttpResponseNotFound(render_to_string('static_templates/404.html', {}))
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<id>tag:www.edx.org,2012:Post/17</id>
|
||||
<published>2012-12-19T14:00:00-07:00</published>
|
||||
<updated>2012-12-19T14:00:00-07:00</updated>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press/stanford-to-work-with-edx')}"/>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press_release', args=['stanford-to-work-with-edx'])}"/>
|
||||
<title>Stanford University to Collaborate with edX on Development of Non-Profit Open Source edX Platform</title>
|
||||
<content type="html"><img src="${static.url('images/press/releases/stanford-university-m.png')}" />
|
||||
<p></p></content>
|
||||
@@ -20,7 +20,7 @@
|
||||
<id>tag:www.edx.org,2013:Post/16</id>
|
||||
<published>2013-03-15T10:00:00-07:00</published>
|
||||
<updated>2013-03-15T10:00:00-07:00</updated>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press/xblock-announcement')}"/>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press_release', args=['xblock-announcement'])}"/>
|
||||
<title>edX releases XBlock SDK, first step toward open source vision</title>
|
||||
<content type="html"><img src="${static.url('images/press/releases/edx-logo_240x180.png')}" />
|
||||
<p></p></content>
|
||||
@@ -38,7 +38,7 @@
|
||||
<!-- <id>tag:www.edx.org,2013:Post/14</id> -->
|
||||
<!-- <published>2013-02-20T10:00:00-07:00</published> -->
|
||||
<!-- <updated>2013-02-20T10:00:00-07:00</updated> -->
|
||||
<!-- <link type="text/html" rel="alternate" href="${reverse('press/edx-expands-internationally')}"/> -->
|
||||
<!-- <link type="text/html" rel="alternate" href="${reverse('press_release', args=['edx-expands-internationally'])}"/> -->
|
||||
<!-- <title>edX Expands Internationally and Doubles its Institutional Membership with the Addition of Six New Schools</title> -->
|
||||
<!-- <content type="html"><img src="${static.url('images/press/releases/edx-logo_240x180.png')}" /> -->
|
||||
<!-- <p></p></content> -->
|
||||
@@ -47,7 +47,7 @@
|
||||
<id>tag:www.edx.org,2013:Post/14</id>
|
||||
<published>2013-01-30T10:00:00-07:00</published>
|
||||
<updated>2013-01-30T10:00:00-07:00</updated>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press/eric-lander-secret-of-life')}"/>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press_release', args=['eric-lander-secret-of-life'])}"/>
|
||||
<title>New biology course from human genome pioneer Eric Lander</title>
|
||||
<content type="html"><img src="${static.url('images/press/releases/eric-lander_240x180.jpg')}" />
|
||||
<p></p></content>
|
||||
@@ -56,7 +56,7 @@
|
||||
<id>tag:www.edx.org,2013:Post/12</id>
|
||||
<published>2013-01-22T10:00:00-07:00</published>
|
||||
<updated>2013-01-22T10:00:00-07:00</updated>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press/lewin-course-announcement')}"/>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press_release', args=['lewin-course-announcement'])}"/>
|
||||
<title>New course from legendary MIT physics professor Walter Lewin</title>
|
||||
<content type="html"><img src="${static.url('images/press/releases/dr-lewin-316_240x180.jpg')}" />
|
||||
<p></p></content>
|
||||
@@ -65,7 +65,7 @@
|
||||
<id>tag:www.edx.org,2013:Post/11</id>
|
||||
<published>2013-01-29T10:00:00-07:00</published>
|
||||
<updated>2013-01-29T10:00:00-07:00</updated>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press/bostonx-announcement')}"/>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press_release', args=['bostonx-announcement'])}"/>
|
||||
<title>City of Boston and edX partner to establish BostonX to improve educational access for residents</title>
|
||||
<content type="html"><img src="${static.url('images/press/releases/edx-logo_240x180.png')}" />
|
||||
<p></p></content>
|
||||
@@ -74,7 +74,7 @@
|
||||
<!-- <id>tag:www.edx.org,2012:Post/10</id> -->
|
||||
<!-- <published>2012-12-19T14:00:00-07:00</published> -->
|
||||
<!-- <updated>2012-12-19T14:00:00-07:00</updated> -->
|
||||
<!-- <link type="text/html" rel="alternate" href="${reverse('press/spring-courses')}"/> -->
|
||||
<!-- <link type="text/html" rel="alternate" href="${reverse('press_release', args=['spring-courses'])}"/> -->
|
||||
<!-- <title>edX announces first wave of new courses for Spring 2013</title> -->
|
||||
<!-- <content type="html"><img src="${static.url('images/press/releases/edx-logo_240x180.png')}" /> -->
|
||||
<!-- <p></p></content> -->
|
||||
@@ -83,7 +83,7 @@
|
||||
<id>tag:www.edx.org,2012:Post/9</id>
|
||||
<published>2012-12-10T14:00:00-07:00</published>
|
||||
<updated>2012-12-10T14:00:00-07:00</updated>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press/georgetown-joins-edx')}"/>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press_release', args=['georgetown-joins-edx'])}"/>
|
||||
<title>Georgetown University joins edX</title>
|
||||
<content type="html"><img src="${static.url('images/press/releases/georgetown-seal_240x180.png')}" />
|
||||
<p>Sixth institution to join global movement in year one</p></content>
|
||||
@@ -92,7 +92,7 @@
|
||||
<id>tag:www.edx.org,2012:Post/8</id>
|
||||
<published>2012-12-04T14:00:00-07:00</published>
|
||||
<updated>2012-12-04T14:00:00-07:00</updated>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press/wellesley-college-joins-edx')}"/>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press_release', args=['wellesley-college-joins-edx'])}"/>
|
||||
<title>Wellesley College joins edX</title>
|
||||
<content type="html"><img src="${static.url('images/press/releases/wellesley-seal_240x180.png')}" />
|
||||
<p>First liberal arts college to join edX</p></content>
|
||||
@@ -101,7 +101,7 @@
|
||||
<id>tag:www.edx.org,2012:Post/7</id>
|
||||
<published>2012-11-12T14:00:00-07:00</published>
|
||||
<updated>2012-11-12T14:00:00-07:00</updated>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press/gates-foundation-announcement')}"/>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press_release', args=['gates-foundation-announcement'])}"/>
|
||||
<title>edX and Massachusetts Community Colleges join in Gates-Funded educational initiative</title>
|
||||
<content type="html"><img src="${static.url('images/press/releases/mass-seal_240x180.png')}" />
|
||||
<p></p></content>
|
||||
@@ -110,7 +110,7 @@
|
||||
<id>tag:www.edx.org,2012:Post/6</id>
|
||||
<published>2012-10-15T14:00:00-07:00</published>
|
||||
<updated>2012-10-14T14:00:00-07:00</updated>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press/ut-joins-edx')}"/>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press_release', args=['ut-joins-edx'])}"/>
|
||||
<title>The University of Texas System joins edX</title>
|
||||
<content type="html"><img src="${static.url('images/press/releases/utsys-seal_240x180.png')}" />
|
||||
<p>Nine universities and six health institutions</p></content>
|
||||
@@ -119,7 +119,7 @@
|
||||
<!-- <id>tag:www.edx.org,2012:Post/5</id> -->
|
||||
<!-- <published>2012-09-25T14:00:00-07:00</published> -->
|
||||
<!-- <updated>2012-09-25T14:00:00-07:00</updated> -->
|
||||
<!-- <link type="text/html" rel="alternate" href="${reverse('press/elsevier-collaborates-with-edx')}"/> -->
|
||||
<!-- <link type="text/html" rel="alternate" href="${reverse('press_release', args=['elsevier-collaborates-with-edx'])}"/> -->
|
||||
<!-- <title>Elsevier collaborates with edX</title> -->
|
||||
<!-- <content type="html"><img src="${static.url('images/press/releases/foundations-of-analog_240x180.jpg')}" /> -->
|
||||
<!-- <p>Free course textbook made available to edX students</p></content> -->
|
||||
@@ -128,7 +128,7 @@
|
||||
<id>tag:www.edx.org,2012:Post/4</id>
|
||||
<published>2012-09-06T14:00:00-07:00</published>
|
||||
<updated>2012-09-06T14:00:00-07:00</updated>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press/edX-announces-proctored-exam-testing')}"/>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press_release', args=['edX-announces-proctored-exam-testing'])}"/>
|
||||
<title>edX to offer learners option of taking proctored final exam</title>
|
||||
<content type="html"><img src="${static.url('images/press/releases/diploma_240x180.jpg')}" /></content>
|
||||
</entry>
|
||||
@@ -136,7 +136,7 @@
|
||||
<id>tag:www.edx.org,2012:Post/3</id>
|
||||
<published>2012-07-16T14:08:12-07:00</published>
|
||||
<updated>2012-07-16T14:08:12-07:00</updated>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press/uc-berkeley-joins-edx')}"/>
|
||||
<link type="text/html" rel="alternate" href="${reverse('press_release', args=['uc-berkeley-joins-edx'])}"/>
|
||||
<title>UC Berkeley joins edX</title>
|
||||
<content type="html"><img src="${static.url('images/press/releases/edx-logo_240x180.png')}" />
|
||||
<p>edX broadens course offerings</p></content>
|
||||
|
||||
46
lms/urls.py
46
lms/urls.py
@@ -117,51 +117,9 @@ urlpatterns = ('',
|
||||
{'template': 'honor.html'}, name="honor"),
|
||||
|
||||
#Press releases
|
||||
url(r'^press/mit-and-harvard-announce-edx$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/MIT_and_Harvard_announce_edX.html'}, name="press/mit-and-harvard-announce-edx"),
|
||||
url(r'^press/uc-berkeley-joins-edx$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/UC_Berkeley_joins_edX.html'}, name="press/uc-berkeley-joins-edx"),
|
||||
url(r'^press/edX-announces-proctored-exam-testing$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/edX_announces_proctored_exam_testing.html'}, name="press/edX-announces-proctored-exam-testing"),
|
||||
url(r'^press/elsevier-collaborates-with-edx$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/Elsevier_collaborates_with_edX.html'}, name="press/elsevier-collaborates-with-edx"),
|
||||
url(r'^press/ut-joins-edx$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/UT_joins_edX.html'}, name="press/ut-joins-edx"),
|
||||
url(r'^press/cengage-to-provide-book-content$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/Cengage_to_provide_book_content.html'}, name="press/cengage-to-provide-book-content"),
|
||||
url(r'^press/gates-foundation-announcement$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/Gates_Foundation_announcement.html'}, name="press/gates-foundation-announcement"),
|
||||
url(r'^press/wellesley-college-joins-edx$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/Wellesley_College_joins_edX.html'}, name="press/wellesley-college-joins-edx"),
|
||||
url(r'^press/georgetown-joins-edx$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/Georgetown_joins_edX.html'}, name="press/georgetown-joins-edx"),
|
||||
url(r'^press/spring-courses$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/Spring_2013_course_announcements.html'},
|
||||
name="press/spring-courses"),
|
||||
url(r'^press/lewin-course-announcement$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/Lewin_course_announcement.html'},
|
||||
name="press/lewin-course-announcement"),
|
||||
url(r'^press/bostonx-announcement$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/bostonx_announcement.html'},
|
||||
name="press/bostonx-announcement"),
|
||||
url(r'^press/eric-lander-secret-of-life$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/eric_lander_secret_of_life.html'},
|
||||
name="press/eric-lander-secret-of-life"),
|
||||
url(r'^press/edx-expands-internationally$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/edx_expands_internationally.html'},
|
||||
name="press/edx-expands-internationally"),
|
||||
url(r'^press/xblock_announcement$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/xblock_announcement.html'},
|
||||
name="press/xblock-announcement"),
|
||||
url(r'^press/stanford-to-work-with-edx$', 'static_template_view.views.render',
|
||||
{'template': 'press_releases/stanford_announcement.html'},
|
||||
name="press/stanford-to-work-with-edx"),
|
||||
|
||||
# Should this always update to point to the latest press release?
|
||||
(r'^pressrelease$', 'django.views.generic.simple.redirect_to',
|
||||
{'url': '/press/xblock-announcement'}),
|
||||
|
||||
url(r'^press/([_a-zA-Z0-9-]+)$', 'static_template_view.views.render_press_release', name='press_release'),
|
||||
|
||||
# Favicon
|
||||
(r'^favicon\.ico$', 'django.views.generic.simple.redirect_to', {'url': '/static/images/favicon.ico'}),
|
||||
|
||||
# TODO: These urls no longer work. They need to be updated before they are re-enabled
|
||||
|
||||
Reference in New Issue
Block a user