From 506ef038b668ad3ecfa79e24a4bae80e4fec0e36 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Savard Date: Tue, 14 Apr 2009 22:52:07 +0000 Subject: LP 341760 Core Serializer : Most recent devlopment. --- 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): """ -- cgit v0.9.1