From bf41e3afd4a7eb031fe8b1dfed2691416821ee84 Mon Sep 17 00:00:00 2001 From: helmutm Date: Thu, 2 Aug 2007 20:17:41 +0000 Subject: [PATCH] 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 --- scorm/README.txt | 8 ++++++-- scorm/base.py | 19 ++++++++++++------- scorm/interfaces.py | 4 ++++ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/scorm/README.txt b/scorm/README.txt index e4b6d55..ca46679 100644 --- a/scorm/README.txt +++ b/scorm/README.txt @@ -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. diff --git a/scorm/base.py b/scorm/base.py index 4db5a44..e20c0bf 100644 --- a/scorm/base.py +++ b/scorm/base.py @@ -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.'): diff --git a/scorm/interfaces.py b/scorm/interfaces.py index 039e26b..0f95908 100644 --- a/scorm/interfaces.py +++ b/scorm/interfaces.py @@ -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.