===================
A generic SCORM API
===================
($Id$)
In order to work with the SCORM API we first need a tracking storage.
>>> from cybertools.tracking.btree import TrackingStorage
>>> 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.
>>> from cybertools.scorm.base import ScormAPI
>>> api = ScormAPI(tracks, 'a001', 0, 'user1')
The first step is always the initialize() call - though in our case it
does not do anything.
>>> api.initialize()
'0'
Then we can set some values.
>>> rc = api.setValue('cmi.interactions.0.id', 'q007')
>>> rc = api.setValue('cmi.interactions.0.result', 'correct')
>>> rc = api.setValue('cmi.comments_from_learner', 'Hello SCORM')
>>> rc = api.setValue('cmi.interactions.1.id', 'q009')
>>> rc = api.setValue('cmi.interactions.1.result', 'incorrect')
Depending on the data elements the values entered are kept together in
one track or stored in separate track objects. So there is a separate
track for each interaction and one additional track for all the other elements.
>>> for t in sorted(tracks.values(), key=lambda x: x.timeStamp):
... print t.data
{'id': 'q007', 'key_prefix': 'cmi.interactions.0', 'result': 'correct'}
{'cmi.comments_from_learner': 'Hello SCORM', 'key_prefix': ''}
{'id': 'q009', 'key_prefix': 'cmi.interactions.1', 'result': 'incorrect'}
Using the getValue() method we can retrieve certain values without having
to care about the storage in different track objects.
>>> api.getValue('cmi.comments_from_learner')
('Hello SCORM', '0')
>>> api.getValue('cmi.interactions.0.id')
('q007', '0')
>>> api.getValue('cmi.interactions.1.result')
('incorrect', '0')
We can also query special elements like _count and _children.
>>> api.getValue('cmi.objectives._count')
(0, '0')
>>> api.getValue('cmi.interactions._count')
(2, '0')
>>> api.getValue('cmi.interactions._children')
(('id', 'type', 'objectives', 'timestamp', 'correct_responses',
'weighting', 'learner_response', 'result', 'latency', 'description'), '0')
>>> api.getValue('cmi.objectives.5.score._children')
(('scaled', 'raw', 'min', 'max'), '0')