make ScormAPI a real adapter by changing its __init__()

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1865 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2007-08-02 20:17:41 +00:00
parent 821b922f6a
commit bf41e3afd4
3 changed files with 22 additions and 9 deletions

View file

@ -10,10 +10,14 @@ In order to work with the SCORM API we first need a tracking storage.
>>> tracks = TrackingStorage()
We can now create a ScormAPI adapter. Note that this adapter is stateless
as usually a new instance is created upon each request.
as usually a new instance is created upon each request. In order to comply
with Zope's adapter protocol the constructor can only have one argument,
the context, i.e. the tracking storage. Therefore we have to set the
basic attributes of the adapter with a separate ``init()`` call.
>>> from cybertools.scorm.base import ScormAPI
>>> api = ScormAPI(tracks, 'a001', 0, 'user1')
>>> api = ScormAPI(tracks)
>>> api.init('a001', 0, 'user1')
The first step is always the initialize() call - though in our case it
does not do anything.

View file

@ -22,11 +22,13 @@ Base classes for providing a generic SCORM-compliant API.
$Id$
"""
from zope import component
from zope.component import adapts
from zope import interface
from zope.interface import implements
from cybertools.scorm.interfaces import IScormAPI
from cybertools.tracking.btree import TrackingStorage
from cybertools.tracking.interfaces import ITrackingStorage
OK = '0'
@ -51,12 +53,15 @@ class ScormAPI(object):
"""
implements(IScormAPI)
adapts(ITrackingStorage)
def __init__(self, storage, taskId, runId, userId):
def __init__(self, context):
self.context = context
def init(self, taskId, runId, userId):
self.taskId = taskId
self.runId = runId
self.userId = userId
self.storage = storage
def initialize(self, parameter=''):
# Note that the run has already been started upon SCO launch, the runId
@ -66,20 +71,20 @@ class ScormAPI(object):
def terminate(self, parameter=''):
rc = self.commit()
if rc == OK:
self.storage.stopRun(self.taskId, self.runId)
self.context.stopRun(self.taskId, self.runId)
return rc
def commit(self, parameter=''):
return OK
def setValue(self, element, value):
tracks = self.storage.getUserTracks(self.taskId, self.runId, self.userId)
tracks = self.context.getUserTracks(self.taskId, self.runId, self.userId)
prefix, key = self._splitKey(element)
data = self._getTrackData(tracks, prefix) or {}
update = bool(data)
data['key_prefix'] = prefix
data.update({key: value})
self.storage.saveUserTrack(self.taskId, self.runId, self.userId, data,
self.context.saveUserTrack(self.taskId, self.runId, self.userId, data,
update=update)
return OK
@ -93,7 +98,7 @@ class ScormAPI(object):
return OK
def getValue(self, element):
tracks = self.storage.getUserTracks(self.taskId, self.runId, self.userId)
tracks = self.context.getUserTracks(self.taskId, self.runId, self.userId)
if element.endswith('._count'):
base = element[:-len('._count')]
if element.startswith('cmi.interactions.'):

View file

@ -49,6 +49,10 @@ class IScormAPI(Interface):
runId = Attribute('Run ID (integer)')
userId = Attribute('User ID')
def init(taskId, runId, userId):
""" Set the basic attributes with one call.
"""
def initialize(parameter):
""" Corresponds to API.Initialize('').
Return CMIErrorCode.