[PATCH] Backup & Restore front end for control panel

Martin Abente mabente at paraguayeduca.org
Fri Apr 9 14:18:42 EDT 2010


Backported from 0.88

Signed-off-by: Martin Abente <mabente at paraguayeduca.org>
---
 configure.ac                                       |    1 +
 data/icons/Makefile.am                             |    1 +
 data/icons/module-journalmanagement.svg            |  127 +++++++++++
 extensions/cpsection/Makefile.am                   |    2 +-
 extensions/cpsection/journalmanagement/Makefile.am |    6 +
 extensions/cpsection/journalmanagement/__init__.py |   22 ++
 extensions/cpsection/journalmanagement/model.py    |   78 +++++++
 extensions/cpsection/journalmanagement/view.py     |  236 ++++++++++++++++=
++++
 8 files changed, 472 insertions(+), 1 deletions(-)
 create mode 100644 data/icons/module-journalmanagement.svg
 create mode 100644 extensions/cpsection/journalmanagement/Makefile.am
 create mode 100644 extensions/cpsection/journalmanagement/__init__.py
 create mode 100644 extensions/cpsection/journalmanagement/model.py
 create mode 100644 extensions/cpsection/journalmanagement/view.py

diff --git a/configure.ac b/configure.ac
index 479056d..40442c6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -53,6 +53,7 @@ extensions/cpsection/aboutcomputer/Makef
 extensions/cpsection/aboutme/Makefile
 extensions/cpsection/datetime/Makefile
 extensions/cpsection/frame/Makefile
+extensions/cpsection/journalmanagement/Makefile
 extensions/cpsection/keyboard/Makefile
 extensions/cpsection/language/Makefile
 extensions/cpsection/modemconfiguration/Makefile
diff --git a/data/icons/Makefile.am b/data/icons/Makefile.am
index e1f8fa7..b982f2e 100644
--- a/data/icons/Makefile.am
+++ b/data/icons/Makefile.am
@@ -5,6 +5,7 @@ sugar_DATA =3D                        \
 	module-about_my_computer.svg    \
 	module-date_and_time.svg        \
 	module-frame.svg                \
+	module-journalmanagement.svg    \
 	module-keyboard.svg             \
 	module-language.svg             \
 	module-modemconfiguration.svg	\
diff --git a/data/icons/module-journalmanagement.svg b/data/icons/module-jo=
urnalmanagement.svg
new file mode 100644
index 0000000..9250c6f
--- /dev/null
+++ b/data/icons/module-journalmanagement.svg
@@ -0,0 +1,127 @@
+<?xml version=3D"1.0" encoding=3D"UTF-8" standalone=3D"no"?>
+<svg
+   xmlns:dc=3D"http://purl.org/dc/elements/1.1/"
+   xmlns:cc=3D"http://creativecommons.org/ns#"
+   xmlns:rdf=3D"http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg=3D"http://www.w3.org/2000/svg"
+   xmlns=3D"http://www.w3.org/2000/svg"
+   xmlns:sodipodi=3D"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape=3D"http://www.inkscape.org/namespaces/inkscape"
+   enable-background=3D"new 0 0 55 55"
+   height=3D"55px"
+   id=3D"Layer_1"
+   version=3D"1.1"
+   viewBox=3D"0 0 55 55"
+   width=3D"55px"
+   x=3D"0px"
+   xml:space=3D"preserve"
+   y=3D"0px"
+   sodipodi:version=3D"0.32"
+   inkscape:version=3D"0.46"
+   sodipodi:docname=3D"journalmanagement.svg"
+   inkscape:output_extension=3D"org.inkscape.output.svg.inkscape"><sodipod=
i:namedview
+   inkscape:window-height=3D"827"
+   inkscape:window-width=3D"1440"
+   inkscape:pageshadow=3D"2"
+   inkscape:pageopacity=3D"0.0"
+   guidetolerance=3D"10.0"
+   gridtolerance=3D"10.0"
+   objecttolerance=3D"10.0"
+   borderopacity=3D"1.0"
+   bordercolor=3D"#666666"
+   pagecolor=3D"#ffffff"
+   id=3D"base"
+   showgrid=3D"false"
+   inkscape:zoom=3D"8.9818182"
+   inkscape:cx=3D"7.7378543"
+   inkscape:cy=3D"27.5"
+   inkscape:window-x=3D"0"
+   inkscape:window-y=3D"25"
+   inkscape:current-layer=3D"Layer_1" /><metadata
+   id=3D"metadata35"><rdf:RDF><cc:Work
+       rdf:about=3D""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource=3D"http://purl.org/dc/dcmitype/StillImage" /></cc:Wo=
rk></rdf:RDF></metadata><defs
+   id=3D"defs33"><inkscape:perspective
+     sodipodi:type=3D"inkscape:persp3d"
+     inkscape:vp_x=3D"0 : 27.5 : 1"
+     inkscape:vp_y=3D"0 : 1000 : 0"
+     inkscape:vp_z=3D"55 : 27.5 : 1"
+     inkscape:persp3d-origin=3D"27.5 : 18.333333 : 1"
+     id=3D"perspective37" /><inkscape:perspective
+     id=3D"perspective12"
+     inkscape:persp3d-origin=3D"27.5 : 18.333333 : 1"
+     inkscape:vp_z=3D"55 : 27.5 : 1"
+     inkscape:vp_y=3D"0 : 1000 : 0"
+     inkscape:vp_x=3D"0 : 27.5 : 1"
+     sodipodi:type=3D"inkscape:persp3d" /></defs>
+
+<g
+   display=3D"block"
+   id=3D"document-save"
+   transform=3D"matrix(1.2198714,0,0,1.0017443,-2.2062535,-2.4418416)"
+   style=3D"display:block">
+	<g
+   id=3D"g4">
+		<g
+   id=3D"g6">
+			<g
+   id=3D"g8">
+				<path
+   d=3D"M 6.736,49.002 L 31.256,49.002 C 33.481,49.002 34.695,47.555 34.69=
5,45.561 L 34.695,18.281 C 34.695,16.551 32.963,14.84 31.256,14.84 L 26.867=
,14.84"
+   id=3D"path10"
+   style=3D"fill:#ffffff;stroke:#010101;stroke-width:3.5;stroke-linecap:ro=
und;stroke-linejoin:round" />
+			</g>
+		</g>
+		<g
+   id=3D"g12">
+			<g
+   id=3D"g14">
+				<path
+   d=3D"M 26.867,38.592 C 26.867,40.428 25.522,41.793 23.426,42.639 L 6.73=
6,49.002 L 6.736,14.84 L 23.426,6.241 C 25.654,5.847 26.867,7.081 26.867,9.=
075 L 26.867,38.592 z"
+   id=3D"path16"
+   style=3D"fill:#ffffff;stroke:#010101;stroke-width:3.5;stroke-linecap:ro=
und;stroke-linejoin:round" />
+			</g>
+		</g>
+		<path
+   d=3D"M 9.424,42.607 C 9.424,42.607 8.073,42.064 6.722,42.064 C 5.371,42=
.064 4.019,42.607 4.019,42.607"
+   id=3D"path18"
+   style=3D"fill:none;stroke:#010101;stroke-width:2.25;stroke-linecap:roun=
d;stroke-linejoin:round" />
+		<path
+   d=3D"M 9.424,32.006 C 9.424,32.006 8.185,31.463 6.609,31.463 C 5.032,31=
.463 4.019,32.006 4.019,32.006"
+   id=3D"path20"
+   style=3D"fill:none;stroke:#010101;stroke-width:2.25;stroke-linecap:roun=
d;stroke-linejoin:round" />
+		<path
+   d=3D"M 9.424,21.678 C 9.424,21.678 8.299,21.134 6.497,21.134 C 4.695,21=
.134 4.019,21.678 4.019,21.678"
+   id=3D"path22"
+   style=3D"fill:none;stroke:#010101;stroke-width:2.25;stroke-linecap:roun=
d;stroke-linejoin:round" />
+	=09
+		<line
+   x1=3D"13.209"
+   x2=3D"13.209"
+   y1=3D"46.533001"
+   y2=3D"11.505"
+   id=3D"line24"
+   style=3D"fill:none;stroke:#010101;stroke-width:2.25;stroke-linecap:roun=
d;stroke-linejoin:round" />
+	=09
+		<g
+   id=3D"g26">
+		=09
+		=09
+		</g>
+	</g>
+</g><rect
+   y=3D"28.864494"
+   x=3D"28.753164"
+   height=3D"22.87829"
+   width=3D"23.546305"
+   id=3D"rect2668"
+   style=3D"fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2.9926=
0712;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><g
+   id=3D"view-expand"
+   display=3D"block"
+   transform=3D"matrix(0.4680612,0,0,0.4482681,27.768809,28.143274)"
+   style=3D"fill:#000000;display:block">
+	<path
+   id=3D"path5"
+   d=3D"M 4.875,5 L 4.875,50 L 49.875,50 L 49.875,5 L 4.875,5 z M 23.638,4=
4.051 L 12.574,44.051 C 12.503,44.051 12.433,44.038 12.364,44.03 C 12.322,4=
4.025 12.28,44.026 12.238,44.017 C 12.205,44.01 12.174,43.997 12.141,43.989=
 C 12.062,43.968 11.983,43.949 11.907,43.918 C 11.894,43.912 11.882,43.903 =
11.869,43.897 C 11.779,43.857 11.691,43.813 11.607,43.757 C 11.511,43.694 1=
1.42,43.62 11.338,43.538 C 11.255,43.455 11.181,43.363 11.116,43.266 C 11.0=
86,43.22 11.065,43.17 11.04,43.122 C 11.012,43.07 10.98,43.02 10.957,42.965=
 C 10.925,42.889 10.905,42.809 10.885,42.73 C 10.877,42.7 10.864,42.67 10.8=
58,42.639 C 10.839,42.541 10.831,42.443 10.829,42.343 C 10.829,42.328 10.82=
5,42.315 10.825,42.3 L 10.825,31.236 C 10.825,30.267 11.608,29.485 12.574,2=
9.485 C 13.542,29.485 14.325,30.267 14.325,31.236 L 14.325,38.075 L 22.337,=
30.06 C 23.021,29.378 24.129,29.378 24.813,30.06 C 25.495,30.744 25.495,31.=
852 24.813,32.537 L 16.8,40.549 L 23.638,40.549 L 23.638,40.552 C 24.604,40=
.552 25.388,41.334 25.388,42.3 C 25.389,43.267 24.604,44.051 23.638,44.051 =
z M 42.573,25.114 C 41.605,25.114 40.822,24.331 40.822,23.363 L 40.822,16.5=
23 L 31.809,25.536 C 31.467,25.878 31.019,26.049 30.571,26.049 C 30.124,26.=
049 29.675,25.878 29.334,25.536 C 28.651,24.852 28.651,23.745 29.334,23.061=
 L 38.345,14.049 L 31.511,14.049 C 30.545,14.049 29.76,13.264 29.76,12.298 =
C 29.76,11.332 30.545,10.547 31.511,10.547 L 42.573,10.547 C 42.677,10.547 =
42.782,10.559 42.885,10.578 C 42.892,10.579 42.9,10.579 42.906,10.58 C 42.9=
61,10.591 43.012,10.611 43.066,10.627 C 43.124,10.644 43.182,10.657 43.238,=
10.68 C 43.27,10.693 43.3,10.713 43.331,10.729 C 43.402,10.763 43.475,10.79=
6 43.541,10.841 C 43.598,10.878 43.646,10.924 43.697,10.968 C 43.734,10.999=
 43.774,11.025 43.809,11.059 C 43.856,11.106 43.892,11.16 43.933,11.211 C 4=
3.963,11.25 43.999,11.285 44.027,11.326 C 44.088,11.417 44.137,11.513 44.17=
8,11.611 C 44.181,11.617 44.185,11.622 44.188,11.628 C 44.222,11.711 44.245=
,11.796 44.265,11.883 C 44.272,11.908 44.283,11.933 44.287,11.959 C 44.299,=
12.02 44.301,12.083 44.306,12.145 C 44.311,12.196 44.322,12.247 44.322,12.2=
98 L 44.324,23.363 C 44.324,24.332 43.54,25.114 42.573,25.114 z"
+   style=3D"fill:#000000" />
+</g></svg>
\ No newline at end of file
diff --git a/extensions/cpsection/Makefile.am b/extensions/cpsection/Makefi=
le.am
index 73e5164..fe6b46b 100644
@@ -1,5 +1,15 @@
-SUBDIRS =3D aboutme aboutcomputer datetime frame keyboard language \
-    modemconfiguration network power updater
+SUBDIRS =3D
+	aboutme \
+	aboutcomputer \
+	datetime \
+	frame \
+	journalmanagement \
+	keyboard \
+	language \
+	modemconfiguration \
+	network \
+	power \
+	updater
=20
 sugardir =3D $(pkgdatadir)/extensions/cpsection
 sugar_PYTHON =3D __init__.py
diff --git a/extensions/cpsection/journalmanagement/Makefile.am b/extension=
s/cpsection/journalmanagement/Makefile.am
new file mode 100644
index 0000000..ed68aa7
--- /dev/null
+++ b/extensions/cpsection/journalmanagement/Makefile.am
@@ -0,0 +1,6 @@
+sugardir =3D $(pkgdatadir)/extensions/cpsection/journalmanagement
+
+sugar_PYTHON =3D 		\
+	__init__.py	\
+	model.py	\
+	view.py
diff --git a/extensions/cpsection/journalmanagement/__init__.py b/extension=
s/cpsection/journalmanagement/__init__.py
new file mode 100644
index 0000000..6eace00
--- /dev/null
+++ b/extensions/cpsection/journalmanagement/__init__.py
@@ -0,0 +1,22 @@
+# Copyright (C) 2010 Paraguay Educa, Martin Abente
+#
+# 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  U=
S
+
+from gettext import gettext as _
+
+CLASS =3D 'JournalManagement'
+ICON =3D 'module-journalmanagement'
+TITLE =3D _('Journal Management')
+
diff --git a/extensions/cpsection/journalmanagement/model.py b/extensions/c=
psection/journalmanagement/model.py
new file mode 100644
index 0000000..811bdfb
--- /dev/null
+++ b/extensions/cpsection/journalmanagement/model.py
@@ -0,0 +1,78 @@
+# Copyright (C) 2010 Paraguay Educa, Martin Abente, Bernie Innocenti
+#
+# 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  U=
S
+
+import os
+import gobject
+import glib
+import gio
+import logging
+
+BYTES_TO_READ =3D 100
+
+class JournalManagementModel(gobject.GObject):
+
+    __gtype_name__ =3D 'JournalManagementModel'
+
+    __gsignals__ =3D {
+        'journal-management-running'    : (gobject.SIGNAL_RUN_FIRST, gobje=
ct.TYPE_NONE, ([str])),
+        'journal-management-started'    : (gobject.SIGNAL_RUN_FIRST, gobje=
ct.TYPE_NONE, ([])),
+        'journal-management-finished'    : (gobject.SIGNAL_RUN_FIRST, gobj=
ect.TYPE_NONE, ([])),
+        'journal-management-failed'    : (gobject.SIGNAL_RUN_FIRST, gobjec=
t.TYPE_NONE, ([]))
+    }
+
+    def __init__(self):
+        gobject.GObject.__init__(self)
+
+        self._running =3D False
+        self._backup_script_path =3D ['/usr/bin/journal-backup']
+        self._restore_script_path =3D ['/usr/bin/journal-restore']
+
+    def do_backup(self):
+        self.run_cmd_async(self._backup_script_path)
+
+    def do_restore(self):
+        self.run_cmd_async(self._restore_script_path)
+
+    def report_process_status(self, stream, result):
+        data =3D stream.read_finish(result)
+
+        if len(data):
+            self.emit('journal-management-running', data)
+            stream.read_async(BYTES_TO_READ, self.report_process_status)
+
+    def run_cmd_async(self, cmd):
+        if self._running =3D=3D False:
+            try:
+                pid, stdin, stdout, stderr =3D glib.spawn_async(cmd, flags=
=3Dglib.SPAWN_DO_NOT_REAP_CHILD, standard_output=3DTrue)
+                gobject.child_watch_add(pid, _handle_process_end, (self))
+            except Exception:
+                self.emit('journal-management-failed')
+            else:
+                stdin_stream =3D gio.unix.InputStream(stdout, True)
+                stdin_stream.read_async(BYTES_TO_READ, self.report_process=
_status)
+
+                self._running  =3D True
+                self.emit('journal-management-started')
+
+def _handle_process_end(pid, condition, myself):
+    myself._running =3D False
+
+    if os.WIFEXITED(condition) and\
+        os.WEXITSTATUS(condition) =3D=3D 0:
+            myself.emit('journal-management-finished')
+    else:
+        myself.emit('journal-management-failed')
+
diff --git a/extensions/cpsection/journalmanagement/view.py b/extensions/cp=
section/journalmanagement/view.py
new file mode 100644
index 0000000..ae3194c
--- /dev/null
+++ b/extensions/cpsection/journalmanagement/view.py
@@ -0,0 +1,236 @@
+# Copyright (C) 2010 Paraguay Educa, Martin Abente
+#
+# 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  U=
S.
+
+import gtk
+import gobject
+import logging
+from gettext import gettext as _
+
+from jarabe.model.session import get_session_manager
+
+from sugar.graphics import style
+from sugar.graphics.alert import Alert
+from sugar.graphics.icon import Icon
+
+from jarabe.controlpanel.sectionview import SectionView
+
+from model import JournalManagementModel
+
+class JournalManagement(SectionView):
+    def __init__(self, model, alerts):
+        SectionView.__init__(self)
+
+        self._model =3D JournalManagementModel()
+        self._model.connect('journal-management-running', self._set_update=
_log)
+        self._model.connect('journal-management-started', self._set_status=
_started)
+        self._model.connect('journal-management-finished', self._set_statu=
s_finished)
+        self._model.connect('journal-management-failed', self._set_status_=
failed)
+
+        self.restart_alerts =3D alerts
+        self._showing_alert =3D False
+        self._process_name =3D None
+        self._needs_restart =3D True
+
+        self.set_border_width(style.DEFAULT_SPACING)
+        self.set_spacing(style.DEFAULT_SPACING)
+        self._group =3D gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
+
+        self._vbox =3D gtk.VBox()
+
+        self._setup_options()
+        self._setup_status_info()
+        self._setup_more_info()
+
+        self._vbox.show()
+        self.pack_start(self._vbox, expand=3DTrue)
+
+    def _setup_options(self):
+        self._setup_separator(_('Options'))
+
+        self._setup_option(_('Backup'), \
+            _('Save your Journal to the School Server'), \
+                self._pre_start_backup_cb)
+
+        self._setup_option(_('Restore'), \
+            _('Restore your Journal to the last backup'), \
+                self._pre_start_restore_cb)
+
+    def _setup_option(self, button_text, description_text, button_callback=
):
+        option_hbox =3D gtk.HBox()
+
+        button =3D gtk.Button(label=3Dbutton_text)
+        button.connect('pressed', button_callback)
+        button.show()
+        option_hbox.pack_start(button, expand=3DTrue, fill=3DTrue)
+
+        label =3D gtk.Label(description_text)
+        label.show()
+        option_hbox.pack_start(label, expand=3DTrue, fill=3DTrue)
+
+        option_hbox.show()
+        self._vbox.pack_start(option_hbox, expand=3DFalse, padding=3D5)
+
+    def _setup_expander(self):
+        expander =3D gtk.Expander(_('Show'))
+        expander.connect("notify::expanded", self._log_menu_control)
+        expander.show()
+
+        self._vbox.pack_start(expander, expand=3DFalse)
+
+    def _setup_more_info(self):
+        self._setup_separator(_('Log'))
+        self._setup_expander()
+        self._setup_log()
+
+    def _setup_status_info(self):
+        self._setup_separator(_('Status'))
+
+        self._status_label =3D gtk.Label(_('No process is running'))
+        self._status_label.show()
+
+        self._vbox.pack_start(self._status_label, expand=3DFalse, fill=3DF=
alse)
+
+    def _setup_log(self):
+        self._log_vbox =3D gtk.VBox()
+
+        scrolled_window =3D gtk.ScrolledWindow()
+        scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMA=
TIC)
+        self._log_vbox.pack_start(scrolled_window, expand=3DTrue, padding=
=3D 10)
+
+        self._log_view =3D gtk.TextView()
+        self._log_view.set_editable(False)
+        self._log_buffer =3D self._log_view.get_buffer()
+        scrolled_window.add(self._log_view)
+
+        self._vbox.pack_start(self._log_vbox, expand=3DTrue)
+
+    def _setup_separator(self, label_text):
+        separator_vbox =3D gtk.VBox()
+
+        separator =3D gtk.HSeparator()
+        separator.show()
+        separator_vbox.pack_start(separator, expand=3DFalse)
+
+        label =3D gtk.Label(label_text)
+        label.set_alignment(0, 0)
+        label.show()
+        separator_vbox.pack_start(label, expand=3DFalse)
+
+        separator_vbox.show()
+        self._vbox.pack_start(separator_vbox, expand=3DFalse, padding=3D10=
)
+
+    def _log_menu_control(self, expander, data=3D None):
+        if expander.get_expanded():
+            self._log_vbox.show_all()
+        else:
+            self._log_vbox.hide()
+
+    def _pre_start_restore_cb(self, button, data=3D None):
+        self._show_alert(_('Restore Warning!'), \
+            _('You are about to delete all your journal, are you sure?'), =
\
+                self._response_restore_cb)
+
+    def _response_restore_cb(self, alert, response_id):
+        if response_id =3D=3D gtk.RESPONSE_APPLY:
+            self._process_name =3D _('Restore')
+            self._needs_restart =3D True
+            self._model.do_restore()
+
+        self._destroy_alert(alert)
+
+    def _pre_start_backup_cb(self, button, data=3D None):
+        self._show_alert(_('Backup Warning!'), \
+            _('This process could take several minutes, are you sure?'), \
+                self._response_backup_cb)
+
+    def _response_backup_cb(self, alert, response_id):
+        if response_id =3D=3D gtk.RESPONSE_APPLY:
+            self._process_name =3D _('Backup')
+            self._needs_restart =3D False
+            self._model.do_backup()
+
+        self._destroy_alert(alert)
+
+    def _set_update_log(self, model, data):
+        self._log_buffer.insert(self._log_buffer.get_end_iter(), data)
+        self._log_view.scroll_to_iter(self._log_buffer.get_end_iter(), 0)
+
+    def _set_status_started(self, model, data=3DNone):
+        self._status_label.set_text(self._process_name + ' ' +\
+            _('is running, please wait...'))
+
+        self._hack_hide_toolbar_buttons()
+
+    def _set_status_finished(self, model, data=3DNone):
+        self._status_label.set_text(self._process_name + ' ' + \
+            _('has finished, please check the logs.'))
+
+        if self._needs_restart =3D=3D True:
+            self._show_alert(self._process_name + ' ' + \
+                _('Warning!'), \
+                    _('The process has finished, Sugar will restart now.')=
, \
+                        self._post_process_restart_cb, \
+                            True)
+        else:
+            self._hack_show_toolbar_buttons()
+
+    def _post_process_restart_cb(self, alert, responde_id):
+        session_manager =3D get_session_manager()
+        session_manager.logout()
+
+    def _set_status_failed(self, model, data=3DNone):
+        self._status_label.set_text(self._process_name + ' ' +\
+            _('has failed.'))
+
+        self._hack_show_toolbar_buttons()
+
+    def _show_alert(self, title, msg, response_listener_cb, only_yes=3D Fa=
lse):
+        if self._showing_alert =3D=3D False and \
+            self._model._running =3D=3D False:
+                alert =3D Alert()
+                alert.props.title =3D title
+                alert.props.msg =3D msg
+
+                if only_yes =3D=3D False:
+                    icon =3D Icon(icon_name=3D'dialog-cancel')
+                    alert.add_button(gtk.RESPONSE_CANCEL, _('No'), icon)
+                    icon.show()
+
+                icon =3D Icon(icon_name=3D'dialog-ok')
+                alert.add_button(gtk.RESPONSE_APPLY, _('Yes'), icon)
+                icon.show()
+
+                alert.connect('response', response_listener_cb)
+                alert.show()
+
+                self._vbox.pack_start(alert, False)
+                self._vbox.reorder_child(alert, 0)
+                self._showing_alert =3D True
+
+    def _destroy_alert(self, alert):
+        self._vbox.remove(alert)
+        self._showing_alert =3D False
+
+    def _hack_show_toolbar_buttons(self):
+        panel_control =3D self.get_toplevel()
+        panel_control._section_toolbar.cancel_button.show()
+        panel_control._section_toolbar.accept_button.show()
+
+    def _hack_hide_toolbar_buttons(self):
+        panel_control =3D self.get_toplevel()
+        panel_control._section_toolbar.cancel_button.hide()
+        panel_control._section_toolbar.accept_button.hide()
+
--=20
1.6.0.4


--=-waKH9YHbN02ylDPMbF6M
Content-Disposition: attachment; filename="0001-Add-journal-backup-backup-list-restore.patch"
Content-Type: text/x-patch; name="0001-Add-journal-backup-backup-list-restore.patch"; charset="UTF-8"
Content-Transfer-Encoding: 7bit



More information about the Sugar-devel mailing list