Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/sugar
diff options
context:
space:
mode:
Diffstat (limited to 'src/sugar')
-rw-r--r--src/sugar/tutorius/bundler.py210
1 files changed, 191 insertions, 19 deletions
diff --git a/src/sugar/tutorius/bundler.py b/src/sugar/tutorius/bundler.py
index 585ba88..d6fb9e2 100644
--- a/src/sugar/tutorius/bundler.py
+++ b/src/sugar/tutorius/bundler.py
@@ -21,33 +21,79 @@ This module contains all the data handling class of Tutorius
"""
import logging
-import linecache
import os
from sugar.tutorius import gtkutils, overlayer
from sugar.tutorius.core import Tutorial, State, FiniteStateMachine
from sugar.tutorius.actions import DialogMessage, OnceWrapper, BubbleMessage
from sugar.tutorius.filters import GtkWidgetEventFilter, TimerEvent
+from ConfigParser import SaveConfigParser
class TutorialStore:
- def list_avaible_tutorials(self, activity_name):
+ def list_avaible_tutorials(self, activity_name, activity_vers):
"""
Recuperate the list of all tutorials present on disk for a
given activity.
"""
- NotImplementedError
+
+ logging.debug("*********** Path of TUT_STORE_ROOT : " + TUT_STORE_ROOT)
+
+ # Create /data/tutorius if no exists
+ if not os.path.exists(TUT_STORE_ROOT):
+ os.mkdir(TUT_STORE_ROOT)
+ logging.debug("************* Creating /data/tutorius folder")
+
+ tutoGuidName = {}
+
+ # iterate for each ".ini" file in the activity TUT_STORE_ROOT folder
+ for file_name in os.listdir(TUT_STORE_ROOT):
+
+ if file_name.endswith(".ini"):
+ logging.debug("************** .ini file found : " + file_name)
+ # Filter for just .ini files who metadata ACTIVITY_NAME
+ # match 'activity_name' given in argument.
+ config = SafeConfigParser()
+ config.read(file_name)
+ # Get all activity tuples (Activity_Name: Activity_Version)
+ file_activity_tuples = config.items(INI_ACTIVITY_SECTION)
+
+ for i in range(0, len(file_activity_tuples) - 1):
+
+ if file_activity_tuples[i][0] == activity_name and \
+ int(file_activity_tuples[i][1]) == activity_vers:
+ # Add this tutorial guid and name in the dictionary
+ file_activity_guid = config.get(INI_METADATA_SECTION,
+ INI_GUID_PROPERTY)
+ file_activity_name = config.get(INI_METADATA_SECTION,
+ INI_NAME_PROPERTY)
+ tutoGuidName[file_activity_name] = file_activity_guid
+
+## # Get the key line (always 1st line of .tml file)
+## key_line = linecache.getline(path + file_name, 1)
+## key_line = key_line.split("\n")[0]`
+## # Get the name line (always 2nd line of .tml file)
+## name_line = linecache.getline(path + file_name, 2)
+## name_line = name_line.split("\n")[0]
+## # Create dictionary
+## tutoKeyName[key_line.split("--KEY::")[1]] = \
+## name_line.split("--NAME::")[1]
+ return tutoGuidName
class Serializer:
"""
- Class that provide serializing and deserializing of the FSM
- used in the tutorials to/from disk.
+ Interface that provide serializing and deserializing of the FSM
+ used in the tutorials to/from disk. Must be inherited.
"""
- def save_fsm(self,fsm):
+ def save_fsm(self,fsm, guid = None):
"""
- Save fsm to disk.
+ Save fsm to disk. If a GUID parameter is provided, the existing GUID is
+ located in the .ini files in TUT_STORRE_ROOT and TUT_BUNDLE_ROOT and
+ the corresponding FSM is/are overwritten. If the GUId is not found, an
+ exception occur. If no GUID is provided, FSM is written in a new file
+ in TUT_STORE_ROOT.
"""
NotImplementedError
@@ -60,21 +106,50 @@ class Serializer:
class XMLSerializer(Serializer):
"""
Class that provide serializing and deserializing of the FSM
- used in the tutorials to/from a xml file.
+ used in the tutorials to/from a .xml file. Inherit from Serializer
"""
- def save_fsm(self,fsm):
- """
- Save fsm to .xml file
+ def save_fsm(self,fsm, xml_filename, path):
"""
- NotImplementedError
+ Save fsm to disk, in the xml file specified by "xml_filename", in the
+ "path" folder. If the specified file dont exist, it will be created.
+ """
+
+ logging.debug("************ found .tml file : " + file_name)
+ key_line = linecache.getline(path + file_name, 1)
+ key_line = key_line.split("\n")[0]
+ fileKey = key_line.split("--KEY::")[1]
+ logging.debug("************ fileKey = " + fileKey)
+ if key == fileKey:
+ logging.debug("************ Key : " + key + \
+ " = fileKey : " + fileKey)
+ tml = file(path + file_name, "r")
+ str = tml.read()
+ pick = str.split("--PICKLE::")[1]
+
+ fsm = pickle.loads(pick)
+ tuto = {key:Tutorial(key,fsm)}
+
+ return tuto
def load_fsm(self, guid):
"""
Load fsm from xml file who .ini file guid match argument guid.
"""
- NotImplementedError
+
+ path = os.getenv("SUGAR_ACTIVITY_ROOT") + "/data/"
+ # Create /data/ folder if no exists
+ if not os.path.exists(path):
+ os.mkdir(path)
+ logging.debug("************* Creating data folder")
+
+ # Save the dictionnary to .tml file
+ tutoSave = file(path + filename + ".tml", 'w')
+ str = "--KEY::" + key + "\n--NAME::" + name + "\n--PICKLE::" + \
+ pickle.dumps(fsm,0)
+ tutoSave.write(str)
+ tutoSave.close()
class TutorialBundler:
@@ -83,17 +158,114 @@ class TutorialBundler:
editor.
"""
- def write_metadata_file(data):
+ TUT_STORE_ROOT = os.getenv("$SUGAR_PREFIX") + "/share/tutorius/" + guid
+ TUT_BUNDLE_ROOT = os.getenv("$SUGAR_BUNDLE_PATH") + "/data/tutorius/"
+ INI_ACTIVITY_SECTION = "RELATED_ACTIVITIES"
+ INI_METADATA_SECTION = "GENERAL_METADATA"
+ INI_GUID_PROPERTY = "GUID"
+ INI_NAME_PROPERTY = "NAME"
+ INI_XML_FSM_PROPERTY = "FSM_FILENAME"
+
+
+ def __init__(self,generated_guid = None):
"""
- Write metadata to a .ini file.
+ TODO.
+ The GUID associated to the tutorial will be generated in the constructor.
"""
- NotImplementedError
-
- def write_fsm(fsm):
+
+ #TODO : GUID generation if no guid is given in entry to the constructor.
+
+ def write_metadata_file(data, guid=None):
"""
- Write fsm to disk.
+ Write metadata to a property file. If a GUID is provided, TutorialBundler
+ will try to find and overwrite the existing property file who contain the
+ given GUID, and will raise an exception if it cannot find it. If no
+ GUID is provided, TutorialBundler will create a new property file.
"""
NotImplementedError
+
+ def write_fsm(fsm, guid=None, metadata_filename = None):
+
+ """
+ Save fsm to disk. If a GUID parameter is provided, the existing GUID is
+ located in the .ini files in TUT_STORRE_ROOT and TUT_BUNDLE_ROOT and
+ the corresponding FSM is/are overwritten. If the GUID is not found, an
+ exception occur. If no GUID is provided, FSM is written in a new file
+ in TUT_STORE_ROOT. If a new FSM is created, the existing .ini filename
+ must be given in "metadata_filename".
+ """
+
+ config = SafeConfigParser()
+
+ if guid is not None:
+
+ logging.debug("************ Path of TUT_STORE_ROOT folder of activity : " \
+ + TUT_STORE_ROOT)
+
+ # iterate for each .ini file in the TUT_STORE_ROOT folder
+
+ for file_name in os.listdir(TUT_STORE_ROOT):
+ if file_name.endswith(".ini"):
+ logging.debug("******************* Found .ini file : " \
+ + file_name)
+ config.read(file_name)
+ if config.get(INI_METADATA_SECTION, INI_GUID_PROPERTY) == guid:
+ xml_filename = config.get(INI_METADATA_SECTION,
+ INI_XML_FSM_PROPERTY)
+ save_fsm(fsm, xml_filename, TUT_STORE_ROOT)
+
+
+ logging.debug("************ Path of TUT_BUNDLE_ROOT folder of activity : " \
+ + TUT_BUNDLE_ROOT)
+
+ ## TODO : Remove code duplication
+
+ # iterate for each .ini file in the TUT_BUNDLE_ROOT folder
+ for file_name in os.listdir(TUT_BUNDLE_ROOT):
+ if file_name.endswith(".ini"):
+ logging.debug("******************* Found .ini file : " \
+ + file_name)
+ config.read(file_name)
+ if config.get(INI_METADATA_SECTION, INI_GUID_PROPERTY) == guid:
+ xml_filename = config.get(INI_METADATA_SECTION,
+ INI_XML_FSM_PROPERTY)
+ save_fsm(fsm, xml_filename, TUT_STORE_ROOT)
+
+ elif metadata_filename is not None:
+
+ logging.debug("************ Path of TUT_STORE_ROOT folder of activity : " \
+ + TUT_STORE_ROOT)
+
+ # iterate for each .ini file in the TUT_STORE_ROOT folder
+
+ for file_name in os.listdir(TUT_STORE_ROOT):
+ if file_name == metadata_filename:
+ logging.debug("******************* Found .ini file : " \
+ + file_name)
+ config.read(file_name)
+ xml_filename = config.get(INI_METADATA_SECTION, INI_XML_FSM_PROPERTY)
+ save_fsm(fsm,xml_filename,TUT_STORE_ROOT)
+
+
+ logging.debug("************ Path of TUT_BUNDLE_ROOT folder of activity : " \
+ + TUT_BUNDLE_ROOT)
+
+ ## TODO : Remove code duplication
+
+ # iterate for each .ini file in the TUT_BUNDLE_ROOT folder
+ for file_name in os.listdir(TUT_BUNDLE_ROOT):
+ if file_name == metadata_filename:
+ logging.debug("******************* Found .ini file : " \
+ + file_name)
+ config.read(file_name)
+ if config.get(INI_METADATA_SECTION, INI_GUID_PROPERTY) == guid:
+ xml_filename = config.get(INI_METADATA_SECTION,
+ INI_XML_FSM_PROPERTY)
+ save_fsm(fsm, xml_filename, TUT_STORE_ROOT)
+
+
+
+ return tuto
def add_resources(typename, file):
"""