Commit cf4f3deb by Piotr Mitros

Moved extra settings into state. Added fs module for aux content

parent a2ec2c0c
...@@ -18,8 +18,12 @@ from django.http import HttpResponse ...@@ -18,8 +18,12 @@ from django.http import HttpResponse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.template import Context from django.template import Context
from django.template import Context, loader from django.template import Context, loader
from fs.osfs import OSFS
from mitxmako.shortcuts import render_to_response, render_to_string from mitxmako.shortcuts import render_to_response, render_to_string
from models import StudentModule from models import StudentModule
from student.models import UserProfile from student.models import UserProfile
import track.views import track.views
...@@ -30,6 +34,13 @@ import courseware.modules ...@@ -30,6 +34,13 @@ import courseware.modules
log = logging.getLogger("mitx.courseware") log = logging.getLogger("mitx.courseware")
class I4xSystem(object):
def __init__(self, **args):
self.ajax_url = args['ajax_url']
self.track_function = args['track_function']
self.filestore = OSFS(settings.DATA_DIR)
self.render_function = args['render_function']
def object_cache(cache, user, module_type, module_id): def object_cache(cache, user, module_type, module_id):
# We don't look up on user -- all queries include user # We don't look up on user -- all queries include user
# Additional lookup would require a DB hit the way Django # Additional lookup would require a DB hit the way Django
...@@ -76,12 +87,15 @@ def modx_dispatch(request, module=None, dispatch=None, id=None): ...@@ -76,12 +87,15 @@ def modx_dispatch(request, module=None, dispatch=None, id=None):
xml = content_parser.module_xml(request.user, module, 'id', id) xml = content_parser.module_xml(request.user, module, 'id', id)
# Create the module # Create the module
instance=courseware.modules.get_module_class(module)(xml, system = I4xSystem(track_function = make_track_function(request),
render_function = None,
ajax_url = ajax_url,
filestore = None
)
instance=courseware.modules.get_module_class(module)(system,
xml,
id, id,
ajax_url=ajax_url, state=oldstate)
state=oldstate,
track_function = make_track_function(request),
render_function = None)
# Let the module handle the AJAX # Let the module handle the AJAX
ajax_return=instance.handle_ajax(dispatch, request.POST) ajax_return=instance.handle_ajax(dispatch, request.POST)
# Save the state back to the database # Save the state back to the database
...@@ -128,12 +142,15 @@ def render_x_module(user, request, xml_module, module_object_preload): ...@@ -128,12 +142,15 @@ def render_x_module(user, request, xml_module, module_object_preload):
# Create a new instance # Create a new instance
ajax_url = '/modx/'+module_type+'/'+module_id+'/' ajax_url = '/modx/'+module_type+'/'+module_id+'/'
instance=module_class(etree.tostring(xml_module), system = I4xSystem(track_function = make_track_function(request),
render_function = lambda x: render_module(user, request, x, module_object_preload),
ajax_url = ajax_url,
filestore = None
)
instance=module_class(system,
etree.tostring(xml_module),
module_id, module_id,
ajax_url=ajax_url, state=state)
state=state,
track_function = make_track_function(request),
render_function = lambda x: render_module(user, request, x, module_object_preload))
# If instance wasn't already in the database, create it # If instance wasn't already in the database, create it
if not smod: if not smod:
......
...@@ -131,8 +131,8 @@ class Module(XModule): ...@@ -131,8 +131,8 @@ class Module(XModule):
return html return html
def __init__(self, xml, item_id, ajax_url=None, track_url=None, state=None, track_function=None, render_function = None, meta = None): def __init__(self, system, xml, item_id, state=None):
XModule.__init__(self, xml, item_id, ajax_url, track_url, state, track_function, render_function) XModule.__init__(self, system, xml, item_id, state)
self.attempts = 0 self.attempts = 0
self.max_attempts = None self.max_attempts = None
......
...@@ -24,13 +24,13 @@ class Module(XModule): ...@@ -24,13 +24,13 @@ class Module(XModule):
textlist=[i for i in textlist if type(i)==str] textlist=[i for i in textlist if type(i)==str]
return "".join(textlist) return "".join(textlist)
try: try:
filename=settings.DATA_DIR+"html/"+self.filename filename="html/"+self.filename
return open(filename).read() return self.filestore.open(filename).read()
except: # For backwards compatibility. TODO: Remove except: # For backwards compatibility. TODO: Remove
return render_to_string(self.filename, {'id': self.item_id}) return render_to_string(self.filename, {'id': self.item_id})
def __init__(self, xml, item_id, ajax_url=None, track_url=None, state=None, track_function=None, render_function = None): def __init__(self, system, xml, item_id, state=None):
XModule.__init__(self, xml, item_id, ajax_url, track_url, state, track_function, render_function) XModule.__init__(self, system, xml, item_id, state)
xmltree=etree.fromstring(xml) xmltree=etree.fromstring(xml)
self.filename = None self.filename = None
filename_l=xmltree.xpath("/html/@filename") filename_l=xmltree.xpath("/html/@filename")
......
...@@ -19,6 +19,6 @@ class Module(XModule): ...@@ -19,6 +19,6 @@ class Module(XModule):
def get_html(self): def get_html(self):
return '<input type="hidden" class="schematic" name="{item_id}" height="480" width="640">'.format(item_id=self.item_id) return '<input type="hidden" class="schematic" name="{item_id}" height="480" width="640">'.format(item_id=self.item_id)
def __init__(self, xml, item_id, ajax_url=None, track_url=None, state=None, render_function = None): def __init__(self, system, xml, item_id, state=None):
XModule.__init__(self, xml, item_id, ajax_url, track_url, state, render_function) XModule.__init__(self, system, xml, item_id, state)
...@@ -107,9 +107,8 @@ class Module(XModule): ...@@ -107,9 +107,8 @@ class Module(XModule):
self.rendered = True self.rendered = True
def __init__(self, system, xml, item_id, state=None):
def __init__(self, xml, item_id, ajax_url=None, track_url=None, state=None, track_function=None, render_function = None): XModule.__init__(self, system, xml, item_id, state)
XModule.__init__(self, xml, item_id, ajax_url, track_url, state, track_function, render_function)
self.xmltree=etree.fromstring(xml) self.xmltree=etree.fromstring(xml)
self.position = 1 self.position = 1
......
...@@ -20,10 +20,9 @@ class Module(XModule): ...@@ -20,10 +20,9 @@ class Module(XModule):
def get_html(self): def get_html(self):
return self.html return self.html
def __init__(self, xml, item_id, ajax_url=None, track_url=None, state=None, track_function=None, render_function = None): def __init__(self, system, xml, item_id, state=None):
XModule.__init__(self, xml, item_id, ajax_url, track_url, state, track_function, render_function) XModule.__init__(self, system, xml, item_id, state)
xmltree = etree.fromstring(xml) xmltree = etree.fromstring(xml)
filename = xmltree.tag filename = xmltree.tag
params = dict(xmltree.items()) params = dict(xmltree.items())
# print params
self.html = render_to_string(filename, params, namespace = 'custom_tags') self.html = render_to_string(filename, params, namespace = 'custom_tags')
...@@ -26,8 +26,9 @@ class Module(XModule): ...@@ -26,8 +26,9 @@ class Module(XModule):
def get_destroy_js(self): def get_destroy_js(self):
return self.destroy_js_text return self.destroy_js_text
def __init__(self, xml, item_id, ajax_url=None, track_url=None, state=None, track_function=None, render_function = None):
XModule.__init__(self, xml, item_id, ajax_url, track_url, state, track_function, render_function) def __init__(self, system, xml, item_id, state=None):
XModule.__init__(self, system, xml, item_id, state)
xmltree=etree.fromstring(xml) xmltree=etree.fromstring(xml)
self.contents=[(e.get("name"),self.render_function(e)) \ self.contents=[(e.get("name"),self.render_function(e)) \
for e in xmltree] for e in xmltree]
......
...@@ -58,8 +58,8 @@ class Module(XModule): ...@@ -58,8 +58,8 @@ class Module(XModule):
def get_destroy_js(self): def get_destroy_js(self):
return "videoDestroy(\"{0}\");".format(self.item_id)+self.annotations_destroy return "videoDestroy(\"{0}\");".format(self.item_id)+self.annotations_destroy
def __init__(self, xml, item_id, ajax_url=None, track_url=None, state=None, track_function=None, render_function = None): def __init__(self, system, xml, item_id, state=None):
XModule.__init__(self, xml, item_id, ajax_url, track_url, state, track_function, render_function) XModule.__init__(self, system, xml, item_id, state)
xmltree=etree.fromstring(xml) xmltree=etree.fromstring(xml)
self.youtube = xmltree.get('youtube') self.youtube = xmltree.get('youtube')
self.name = xmltree.get('name') self.name = xmltree.get('name')
......
...@@ -45,13 +45,13 @@ class XModule(object): ...@@ -45,13 +45,13 @@ class XModule(object):
get is a dictionary-like object ''' get is a dictionary-like object '''
return "" return ""
def __init__(self, xml, item_id, ajax_url=None, track_url=None, state=None, track_function=None, render_function = None): def __init__(self, system, xml, item_id, track_url=None, state=None):
''' In most cases, you must pass state or xml''' ''' In most cases, you must pass state or xml'''
self.xml = xml self.xml = xml
self.item_id = item_id self.item_id = item_id
self.ajax_url = ajax_url
self.track_url = track_url
self.state = state self.state = state
self.tracker = track_function
self.render_function = render_function
self.ajax_url = system.ajax_url
self.tracker = system.track_function
self.filestore = system.filestore
self.render_function = system.render_function
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment