From 92a2332105b8fa693fc37fff585ea4611bee638c Mon Sep 17 00:00:00 2001 From: Jean-Christophe Savard Date: Mon, 30 Mar 2009 17:38:36 +0000 Subject: Core (bug 341760) : TutoSerializer, 2nd version (fonction save_tutorial added) + Tests : added serializertests.py --- (limited to 'src/sugar/tutorius/tutoserialize.py') diff --git a/src/sugar/tutorius/tutoserialize.py b/src/sugar/tutorius/tutoserialize.py new file mode 100644 index 0000000..ebd17c6 --- /dev/null +++ b/src/sugar/tutorius/tutoserialize.py @@ -0,0 +1,143 @@ +# Copyright (C) 2009, Tutorius.org +# Copyright (C) 2009, Jean-Christophe Savard +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +""" +-Save and load FSM Dictionnary to file in $SUGAR_ACTIVITY_ROOT/data/ +""" + +import logging +import linecache +import os +import cPickle as pickle + +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 + +class TutoSerializer: + """ + Serializer is a class that provide serializing and file reading and + writing to disk services for the FSM Dictionary used in the tutorials. + """ + def __init__(self): + """ + TutoSerializer constructor (empty) + """ + pass + + + def load_tuto_list(self): + """ + Load the tutorial key/name list for this activity from .tml files. + Return the key/name dictionary + """ + # TODO : Temp path; decide how .tml files will be distrribued in file + # architecture + + path = os.getenv("SUGAR_ACTIVITY_ROOT") + "/data/" + logging.debug("*********** Path of /data/ folder of activity : " + path) + + # Create /data/ folder if no exists + if not os.path.exists(path): + os.mkdir(path) + logging.debug("************* Creating data folder") + + tutoKeyName = {} + + # iterate for each .tml file in the activity /data folder + for file_name in os.listdir(path): + + if file_name.endswith(".tml"): + logging.debug("************** .tml file found : " + file_name) + + # TODO : Filter for just current activity files + # (design convention and/or filter xxxxx.yyyyyy key ? ) + + # 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] + + +## tutoKeyName = {} +## tutoKeyName["Writus.CopyPasteStyle"] = "Copy-paste and style" + + return tutoKeyName + + def build_tutorial(self,key): + """ + Load the chosen dictionnary from Pickle file on disk, then build and + return the corresponding tutorial. + TODO : Decode pickle to prevent broswer corruption + """ + path = os.getenv("SUGAR_ACTIVITY_ROOT") + "/data/" + logging.debug("************ Path of /data/ folder of activity : " \ + + path) + logging.debug("************ User key = " + key) + + # iterate for each .tml file in the activity /data folder + for file_name in os.listdir(path): + + if file_name.endswith(".tml"): + + 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 save_tutorial(self, key, name, fsm, filename): + """ + Save the dictionnary given in parameter to a filename.tml file with a + key and a name. + + TODO : TEST : In developpement, untested. + TODO : Encode pickle to prevent broswer corruption + """ + + 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() + \ No newline at end of file -- cgit v0.9.1