[cig-commits] r11831 - cs/portal/trunk/seismo/SeismoWebPortal

leif at geodynamics.org leif at geodynamics.org
Fri Apr 18 17:50:22 PDT 2008


Author: leif
Date: 2008-04-18 17:50:22 -0700 (Fri, 18 Apr 2008)
New Revision: 11831

Modified:
   cs/portal/trunk/seismo/SeismoWebPortal/gui.py
   cs/portal/trunk/seismo/SeismoWebPortal/views.py
Log:
Increased the UI's "perceived stability" [1] by remembering the last
page viewed in each app.

[1] http://portal.acm.org/citation.cfm?id=573097
    Chapter 1, p. 11


Modified: cs/portal/trunk/seismo/SeismoWebPortal/gui.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/gui.py	2008-04-18 21:51:28 UTC (rev 11830)
+++ cs/portal/trunk/seismo/SeismoWebPortal/gui.py	2008-04-19 00:50:22 UTC (rev 11831)
@@ -36,17 +36,24 @@
 
 class AppWindow(Window, WindowParent):
 
-    def __init__(self, url, title):
+    def __init__(self, url, title, memento):
+        url = memento.get('selectedWindow', url)
         Window.__init__(self, url, title)
         WindowParent.__init__(self)
+        self.memento = memento
 
     def icon(self):
         if hasattr(self, 'iconURL'):
             return '<img class="icon" src="%s">' % self.iconURL()
         return ''
 
+    def selectWindow(self, aWindow):
+        WindowParent.selectWindow(self, aWindow)
+        self.url = aWindow.url
+        self.memento['selectedWindow'] = aWindow.url
 
 
+
 class ChildWindow(Window):
 
     def __init__(self, url, title):
@@ -216,13 +223,14 @@
 
 class Navigator(AppWindow):
 
-    def __init__(self, url, title, root):
-        AppWindow.__init__(self, url, title)
+    def __init__(self, url, title, memento, root, rootURL):
+        AppWindow.__init__(self, url, title, memento)
         self.root = root
+        self.rootURL = rootURL
         self.path = [root]
 
     def renderNavTree(self, design):
-        return self.root.renderNavTreeItems(self.url, self.path, 0, design)
+        return self.root.renderNavTreeItems(self.rootURL, self.path, 0, design)
 
 
 class TreeBrowser(Navigator):
@@ -235,10 +243,9 @@
         path = self.path
         root = self.root #path[0]
         path = path[1:]
-        bc = [(self.url, root.title)]
-        urlRoot = self.url
+        bc = [(self.rootURL, root.title)]
         for node in path:
-            url = node.url(urlRoot)
+            url = node.url(self.rootURL)
             crumb = url, node.title
             bc.append(crumb)
         return bc
@@ -256,8 +263,8 @@
 
 class EventViewer(Navigator):
     
-    def __init__(self, url, title, root, workspace):
-        Navigator.__init__(self, url, title, root)
+    def __init__(self, url, title, memento, root, rootURL, workspace):
+        Navigator.__init__(self, url, title, memento, root, rootURL)
         self.workspace = workspace
 
     def icon(self):

Modified: cs/portal/trunk/seismo/SeismoWebPortal/views.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/views.py	2008-04-18 21:51:28 UTC (rev 11830)
+++ cs/portal/trunk/seismo/SeismoWebPortal/views.py	2008-04-19 00:50:22 UTC (rev 11831)
@@ -80,7 +80,7 @@
 
     if not path:
         if request.user.is_anonymous():
-            return httpResponse(about(desktop))
+            return httpResponse(about(request, desktop))
         openPrivateApps(request, desktop)
         return httpResponse(desktopFolder(request, desktop))
 
@@ -143,8 +143,8 @@
     return httpResponse(configObject(name, request, path, desktop))
 
 
-def about(desktop):
-    appWindow, _, _ = openPublicApps(desktop)
+def about(request, desktop):
+    appWindow, _, _ = openPublicApps(request, desktop)
     desktop.selectWindow(appWindow)
     
     splash = gui.ChildWindow(config.root + "/", "About")
@@ -157,35 +157,36 @@
     return desktop
 
 
-def openPublicApps(desktop):
-    about = gui.AppWindow(config.root + "/", "About")
+def openPublicApps(request, desktop):
+    about = gui.AppWindow(config.root + "/", "About", Memento('about', request.session))
     desktop.insertWindow(about)
 
-    login = gui.AppWindow(config.root + "/login/", "Login")
+    login = gui.AppWindow(config.root + "/login/", "Login", Memento('login', request.session))
     desktop.insertWindow(login)
 
-    register = gui.AppWindow(config.root + "/registration/", "Register")
+    register = gui.AppWindow(config.root + "/registration/", "Register", Memento('registration', request.session))
     desktop.insertWindow(register)
 
     return about, login, register
 
 
 def openPrivateApps(request, desktop):
-    openFileBrowser(desktop)
-    openEventFinder(desktop)
+    openFileBrowser(request, desktop)
+    openEventFinder(request, desktop)
     openEventViewers(request, desktop)
     if request.user.is_staff:
-        openAdminApp(desktop)
+        openAdminApp(request, desktop)
     return
 
 
-def openFileBrowser(desktop):
+def openFileBrowser(request, desktop):
     navtree = gui.Directory("desktop", "Desktop", [
         gui.Directory("home", "Home", []),
         gui.Directory("shared", "Shared", []),
         gui.Directory("trash", "Trash", []),
         ])
-    fileBrowser = gui.FileBrowser(config.root + "/", "Files", navtree)
+    fileBrowser = gui.FileBrowser(config.root + "/home/", "Files", Memento('files', request.session),
+                                  navtree, config.root + "/")
     desktop.insertWindow(fileBrowser)
     desktop.selectWindow(fileBrowser)
 
@@ -214,6 +215,18 @@
     return design.serveFile(path)
 
 
+class Memento(object):
+    def __init__(self, key, session):
+        self.key = key
+        self.session = session
+    def get(self, key, default):
+        return self.session.get(self.key + '_' + key, default)
+    def __getitem__(self, key):
+        return self.session[self.key + '_' + key]
+    def __setitem__(self, key, value):
+        self.session[self.key + '_' + key] = value
+
+
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Specfem 3D Globe
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -253,6 +266,8 @@
     html = StringIO()
     
     print >>html, '<h2>%s</h2>' % name
+    count = items.count()
+    print >>html, '<p class=infobar>%d item%s</p>' % (count, count != 1 and "s" or "")
 
     print >>html, '<table width="100%"><tr>'
     i = 0
@@ -422,7 +437,7 @@
     fileBrowser = desktop.windowList[0]
     homeFolder = fileBrowser.root.index["home"]
     fileBrowser.path.append(homeFolder)
-    
+
     home = Folder.homeFolder(request.user)
     
     child = gui.ChildWindow(config.root + "/home/", "View")
@@ -557,7 +572,7 @@
     from django.contrib.sites.models import Site
     import datetime
 
-    _, appWindow, _ = openPublicApps(desktop)
+    _, appWindow, _ = openPublicApps(request, desktop)
     desktop.selectWindow(appWindow)
     
     login = gui.ChildWindow(config.root + "/login/", "Login")
@@ -928,7 +943,7 @@
 
 def registration(request, path, desktop):
 
-    _, _, appWindow = openPublicApps(desktop)
+    _, _, appWindow = openPublicApps(request, desktop)
     desktop.selectWindow(appWindow)
 
     register = gui.ChildWindow(config.root + "/registration/", "Register")
@@ -978,7 +993,7 @@
 
 
 def profile(request, path, desktop):
-    appWindow = gui.AppWindow(config.root + "/profile/", "Profile")
+    appWindow = gui.AppWindow(config.root + "/profile/", "Profile", Memento('profile', request.session))
     desktop.insertWindow(appWindow)
     desktop.selectWindow(appWindow)
     
@@ -1285,9 +1300,11 @@
 def openEventViewers(request, desktop):
     desktop.eventViewers = {}
     for workspace in EventWorkspace.objects.filter(fsNode__owner = request.user, fsNode__inTrash = False):
-        url = "%s/%d/" % (config.root, workspace.fsNode.id)
+        id = workspace.fsNode.id
+        url = "%s/%d/" % (config.root, id)
         navtree = gui.Directory("events", "Events", [])
-        appWindow = gui.EventViewer(url, workspace.fsNode.name, navtree, workspace)
+        appWindow = gui.EventViewer(url, workspace.fsNode.name, Memento('eventWorkspace_%d' % id, request.session),
+                                    navtree, url, workspace)
         desktop.insertWindow(appWindow)
         desktop.eventViewers[workspace.id] = appWindow
     return
@@ -1624,7 +1641,7 @@
     mapsFolder.appendNode(gui.File("global", "Global", url = url + "global/"))
     mapsFolder.appendNode(gui.File("stations", "Stations", url = url + "stations/"))
     appWindow.path.append(mapsFolder.index[name])
-    child = gui.ChildWindow(url, "View")
+    child = gui.ChildWindow(url + name + "/", "View")
 
     if name == "global":
         mapRoot = "%s/maps/events/%d/stations/%d/global" % (config.root, event.firstSource.id, workspace.stations.id)
@@ -1639,11 +1656,12 @@
     return desktop
 
 
-def openEventFinder(desktop):
+def openEventFinder(request, desktop):
     navtree = gui.Directory("events", "Events", [
         gui.Search("search", "Search", url = config.root + "/events/"),
         ])
-    appWindow = gui.EventFinder(config.root + "/events/", "Event Search", navtree)
+    appWindow = gui.EventFinder(config.root + "/events/", "Event Search", Memento("events", request.session),
+                                navtree, config.root + "/events/")
     desktop.insertWindow(appWindow)
     desktop.events = appWindow
     
@@ -2247,7 +2265,7 @@
 # Administration
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-def openAdminApp(desktop):
+def openAdminApp(request, desktop):
     navtree = gui.Directory("admin", "Administration", [
         gui.File("status", "Status"),
         gui.Directory("jobs", "Jobs", []),
@@ -2255,7 +2273,9 @@
         gui.Directory("users", "Users", []),
         gui.Directory("invites", "Invites", []),
         ])
-    adminAppWindow = gui.TreeBrowser(config.root + "/admin/", "Administration", navtree)
+    url = config.root + "/admin/"
+    adminAppWindow = gui.TreeBrowser(url, "Administration", Memento('admin', request.session),
+                                     navtree, url)
     desktop.insertWindow(adminAppWindow)
     desktop.admin = adminAppWindow
 



More information about the cig-commits mailing list