[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