Notes for ricecooker library developers¶
Supported Python Versions for Chefs¶
All chefs written need to support either Python 3.4 or 3.5.
If you need a module or need to use syntax that is only available in newer Python versions, please get in touch.
Computed identifiers¶
Channel ID¶
The channel_id
(uuid hex str) property is an important identifier that:
- Is used in the wire formats used to communicate between
ricecooker
and Kolibri Studio - Appears as part of URLs for on both Kolibri Studio and Kolibri
- Determines the filename for the channel sqlite3 database file that Kolibri imports from Kolibri Studio.
To compute the channel_id
, you need to know the channel’s source_domain
(a.k.a. channel_info['CHANNEL_SOURCE_DOMAIN']
)
and the channel’s source_id
(a.k.a channel_info['CHANNEL_SOURCE_ID']
):
import uuid
channel_id = uuid.uuid5(
uuid.uuid5(uuid.NAMESPACE_DNS, source_domain),
source_id
).hex
This above code snippet is useful if you know the source_domain
and source_id
and you want to determine the channel_id
without crating a ChannelNode
object.
The ChannelNode
class implements the following methods:
class ChannelNode(Node):
def get_domain_namespace(self):
return uuid.uuid5(uuid.NAMESPACE_DNS, self.source_domain)
def get_node_id(self):
return uuid.uuid5(self.get_domain_namespace(), self.source_id)
Given a channel object ch
, you can find its id using channel_id = ch.get_node_id().hex
.
Node IDs¶
Content nodes within the Kolibri ecosystem have the following identifiers:
source_id
(str): arbitrary string used to identify content item within the source website, e.g., the a database id or URL.node_id
(uuid): an identifier for the content node within the channel treecontent_id
(uuid): an identifier derived from the channel source_domain and the content node’ssource_id
used for tracking a user interactions with the content node (e.g. video watched, or exercise completed).
When a particular piece of content appears in multiple channels, or in different
places within a tree, the node_id
of each occurrence will be different, but the
content_id
of each item will be the same for all copies. In other words, the
content_id
keeps track of the “is identical to” information about content nodes.
Content nodes inherit from the TreeNode
class, which implements the following methods:
class TreeNode(Node):
def get_domain_namespace(self):
return self.domain_ns if self.domain_ns else self.parent.get_domain_namespace()
def get_content_id(self):
return uuid.uuid5(self.get_domain_namespace(), self.source_id)
def get_node_id(self):
return uuid.uuid5(self.parent.get_node_id(), self.get_content_id().hex)
The content_id
identifier is computed based on the channel source domain,
and the source_id
attribute of the content node. To find the content_id
hex
value for a content node node
, use content_id = node.get_content_id().hex
.
The node_id
of a content nodes within a tree is computed based on the parent
node’s node_id
and current node’s content_id
.