[cig-commits] r11549 - in cs/portal/trunk/seismo/SeismoWebPortal: . designs/plone static/css templates/SeismoWebPortal

leif at geodynamics.org leif at geodynamics.org
Tue Mar 25 17:41:33 PDT 2008


Author: leif
Date: 2008-03-25 17:41:32 -0700 (Tue, 25 Mar 2008)
New Revision: 11549

Added:
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/fsnode_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemodel_form.html
Removed:
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_form.html
Modified:
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.html
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.py
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.html
   cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.py
   cs/portal/trunk/seismo/SeismoWebPortal/forms.py
   cs/portal/trunk/seismo/SeismoWebPortal/gui.py
   cs/portal/trunk/seismo/SeismoWebPortal/models.py
   cs/portal/trunk/seismo/SeismoWebPortal/static/css/style.css
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_list.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/object_lists.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html
   cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html
   cs/portal/trunk/seismo/SeismoWebPortal/views.py
Log:
Implemented pseudo filesystem.


Modified: cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -11,6 +11,14 @@
 </ul>
 
 <div id="portal-personaltools-wrapper"><ul id="portal-personaltools">
+
+        <li><a href="javascript:setActiveStyleSheet('Small Text',1);"
+               title="Small Text">Small</a></li>
+        <li><a href="javascript:setActiveStyleSheet('',1);"
+               title="Normal Text">Normal</a></li>
+        <li><a href="javascript:setActiveStyleSheet('Large Text', 1);"
+               title="Large Text">Large</a></li>
+
     #if $desktop.user
         <li class="portalUser">
             <!--<a id="user-name" href="">-->
@@ -37,32 +45,6 @@
         </li>
     #end if
 
-<!--
-        <li>
-        <dl class="actionMenu" id="statusMenu">
-          <dt class="actionMenuHeader">
-            <a href="http://www.geodynamics.org/cig/workinggroups/content_status_history"
-               title="Change the state of this item">
-                <span>text size</span>
-            </a>
-          </dt>
-          <dd class="actionMenuContent">
-
-
-    <ul>
-        <li><a href="javascript:setActiveStyleSheet('Large Text', 1);"
-               title="Large Text">Large</a></li>
-
-        <li><a href="javascript:setActiveStyleSheet('',1);"
-               title="Normal Text">Normal</a></li>
-        <li><a href="javascript:setActiveStyleSheet('Small Text',1);"
-               title="Small Text">Small</a></li>
-    </ul>
-          </dd>
-        </dl>
-        </li>
--->
-
 </ul></div>
 
 

Modified: cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.py	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/Desktop.py	2008-03-26 00:41:32 UTC (rev 11549)
@@ -33,10 +33,10 @@
 currentTime=time.time
 __CHEETAH_version__ = '2.0rc7'
 __CHEETAH_versionTuple__ = (2, 0, 0, 'candidate', 7)
-__CHEETAH_genTime__ = 1206060692.7349739
-__CHEETAH_genTimestamp__ = 'Thu Mar 20 17:51:32 2008'
+__CHEETAH_genTime__ = 1206471351.95895
+__CHEETAH_genTimestamp__ = 'Tue Mar 25 11:55:51 2008'
 __CHEETAH_src__ = 'Desktop.html'
-__CHEETAH_srcLastModified__ = 'Thu Mar 20 17:34:07 2008'
+__CHEETAH_srcLastModified__ = 'Tue Mar 25 11:55:43 2008'
 __CHEETAH_docstring__ = 'Autogenerated by CHEETAH: The Python-Powered Template Engine'
 
 if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
@@ -109,22 +109,30 @@
         write('''</ul>
 
 <div id="portal-personaltools-wrapper"><ul id="portal-personaltools">
+
+        <li><a href="javascript:setActiveStyleSheet('Small Text',1);"
+               title="Small Text">Small</a></li>
+        <li><a href="javascript:setActiveStyleSheet('',1);"
+               title="Normal Text">Normal</a></li>
+        <li><a href="javascript:setActiveStyleSheet('Large Text', 1);"
+               title="Large Text">Large</a></li>
+
 ''')
-        if VFFSL(SL,"desktop.user",True): # generated from line 14, col 5
+        if VFFSL(SL,"desktop.user",True): # generated from line 22, col 5
             write('        <li class="portalUser">\n            <!--<a id="user-name" href="">-->\n                <span class="visualCaseSensitive">')
-            _v = VFFSL(SL,"desktop.user.first_name",True) # '$desktop.user.first_name' on line 17, col 51
-            if _v is not None: write(_filter(_v, rawExpr='$desktop.user.first_name')) # from line 17, col 51.
+            _v = VFFSL(SL,"desktop.user.first_name",True) # '$desktop.user.first_name' on line 25, col 51
+            if _v is not None: write(_filter(_v, rawExpr='$desktop.user.first_name')) # from line 25, col 51.
             write(' (')
-            _v = VFFSL(SL,"desktop.user.username",True) # '$desktop.user.username' on line 17, col 77
-            if _v is not None: write(_filter(_v, rawExpr='$desktop.user.username')) # from line 17, col 77.
+            _v = VFFSL(SL,"desktop.user.username",True) # '$desktop.user.username' on line 25, col 77
+            if _v is not None: write(_filter(_v, rawExpr='$desktop.user.username')) # from line 25, col 77.
             write(''')</span>
             <!--</a>-->
         </li>
    
         <li>
             <a href="''')
-            _v = VFFSL(SL,"root",True) # '$root' on line 22, col 22
-            if _v is not None: write(_filter(_v, rawExpr='$root')) # from line 22, col 22.
+            _v = VFFSL(SL,"root",True) # '$root' on line 30, col 22
+            if _v is not None: write(_filter(_v, rawExpr='$root')) # from line 30, col 22.
             write('''/profile/">
                 Profile
             </a>
@@ -132,55 +140,29 @@
     
         <li>
             <a href="''')
-            _v = VFFSL(SL,"root",True) # '$root' on line 28, col 22
-            if _v is not None: write(_filter(_v, rawExpr='$root')) # from line 28, col 22.
+            _v = VFFSL(SL,"root",True) # '$root' on line 36, col 22
+            if _v is not None: write(_filter(_v, rawExpr='$root')) # from line 36, col 22.
             write('''/logout/">
                 Log out
             </a>
         </li>
 ''')
-        else: # generated from line 32, col 5
+        else: # generated from line 40, col 5
             write('        <li>\n            <a href="')
-            _v = VFFSL(SL,"root",True) # '$root' on line 34, col 22
-            if _v is not None: write(_filter(_v, rawExpr='$root')) # from line 34, col 22.
+            _v = VFFSL(SL,"root",True) # '$root' on line 42, col 22
+            if _v is not None: write(_filter(_v, rawExpr='$root')) # from line 42, col 22.
             write('''/login/">
                Log in
             </a>
         </li>
 ''')
         write('''
-<!--
-        <li>
-        <dl class="actionMenu" id="statusMenu">
-          <dt class="actionMenuHeader">
-            <a href="http://www.geodynamics.org/cig/workinggroups/content_status_history"
-               title="Change the state of this item">
-                <span>text size</span>
-            </a>
-          </dt>
-          <dd class="actionMenuContent">
-
-
-    <ul>
-        <li><a href="javascript:setActiveStyleSheet('Large Text', 1);"
-               title="Large Text">Large</a></li>
-
-        <li><a href="javascript:setActiveStyleSheet('',1);"
-               title="Normal Text">Normal</a></li>
-        <li><a href="javascript:setActiveStyleSheet('Small Text',1);"
-               title="Small Text">Small</a></li>
-    </ul>
-          </dd>
-        </dl>
-        </li>
--->
-
 </ul></div>
 
 
 ''')
-        _v = VFFSL(SL,"activeWindow",True) # '$activeWindow' on line 69, col 1
-        if _v is not None: write(_filter(_v, rawExpr='$activeWindow')) # from line 69, col 1.
+        _v = VFFSL(SL,"activeWindow",True) # '$activeWindow' on line 51, col 1
+        if _v is not None: write(_filter(_v, rawExpr='$activeWindow')) # from line 51, col 1.
         write('\n')
         
         ########################################

Modified: cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -45,6 +45,9 @@
                                              id="icon-full_screen" />
                                     </a>
                                 </li>
+                                #for $button in $browser.activeWindow.buttons
+                                    <li><a href="$button.url">$button.title</a></li>
+                                #end for
                                 #if $browser.activeWindow.menuBar
                                     #set $menuBar = $browser.activeWindow.menuBar[:]
                                     #silent $menuBar.reverse()

Modified: cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.py	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/designs/plone/TreeBrowser.py	2008-03-26 00:41:32 UTC (rev 11549)
@@ -33,10 +33,10 @@
 currentTime=time.time
 __CHEETAH_version__ = '2.0rc7'
 __CHEETAH_versionTuple__ = (2, 0, 0, 'candidate', 7)
-__CHEETAH_genTime__ = 1206128297.3114619
-__CHEETAH_genTimestamp__ = 'Fri Mar 21 12:38:17 2008'
+__CHEETAH_genTime__ = 1206477342.3192551
+__CHEETAH_genTimestamp__ = 'Tue Mar 25 13:35:42 2008'
 __CHEETAH_src__ = 'TreeBrowser.html'
-__CHEETAH_srcLastModified__ = 'Fri Mar 21 12:38:00 2008'
+__CHEETAH_srcLastModified__ = 'Tue Mar 25 13:32:36 2008'
 __CHEETAH_docstring__ = 'Autogenerated by CHEETAH: The Python-Powered Template Engine'
 
 if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
@@ -143,34 +143,42 @@
                                     </a>
                                 </li>
 ''')
-            if VFFSL(SL,"browser.activeWindow.menuBar",True): # generated from line 48, col 33
+            for button in VFFSL(SL,"browser.activeWindow.buttons",True): # generated from line 48, col 33
+                write('                                    <li><a href="')
+                _v = VFFSL(SL,"button.url",True) # '$button.url' on line 49, col 50
+                if _v is not None: write(_filter(_v, rawExpr='$button.url')) # from line 49, col 50.
+                write('">')
+                _v = VFFSL(SL,"button.title",True) # '$button.title' on line 49, col 63
+                if _v is not None: write(_filter(_v, rawExpr='$button.title')) # from line 49, col 63.
+                write('</a></li>\n')
+            if VFFSL(SL,"browser.activeWindow.menuBar",True): # generated from line 51, col 33
                 menuBar = VFN(VFFSL(SL,"browser.activeWindow",True),"menuBar",True)[:]
                 VFN(VFFSL(SL,"menuBar",True),"reverse",False)()
-                for menu in VFFSL(SL,"menuBar",True): # generated from line 51, col 37
+                for menu in VFFSL(SL,"menuBar",True): # generated from line 54, col 37
                     write('                                        <li>\n                                            <dl class="actionMenu" id="')
-                    _v = VFFSL(SL,"menu.id",True) # '$menu.id' on line 53, col 72
-                    if _v is not None: write(_filter(_v, rawExpr='$menu.id')) # from line 53, col 72.
+                    _v = VFFSL(SL,"menu.id",True) # '$menu.id' on line 56, col 72
+                    if _v is not None: write(_filter(_v, rawExpr='$menu.id')) # from line 56, col 72.
                     write('">\n                                                <dt class="actionMenuHeader"><a href="')
-                    _v = VFFSL(SL,"menu.url",True) # '$menu.url' on line 54, col 87
-                    if _v is not None: write(_filter(_v, rawExpr='$menu.url')) # from line 54, col 87.
+                    _v = VFFSL(SL,"menu.url",True) # '$menu.url' on line 57, col 87
+                    if _v is not None: write(_filter(_v, rawExpr='$menu.url')) # from line 57, col 87.
                     write('">')
-                    _v = VFFSL(SL,"menu.title",True) # '$menu.title' on line 54, col 98
-                    if _v is not None: write(_filter(_v, rawExpr='$menu.title')) # from line 54, col 98.
+                    _v = VFFSL(SL,"menu.title",True) # '$menu.title' on line 57, col 98
+                    if _v is not None: write(_filter(_v, rawExpr='$menu.title')) # from line 57, col 98.
                     write('''</a></dt>
                                                 <dd class="actionMenuContent">
                                                     <ul>
 ''')
-                    for item in VFFSL(SL,"menu.items",True): # generated from line 57, col 57
+                    for item in VFFSL(SL,"menu.items",True): # generated from line 60, col 57
                         klass = "visualIconPadding visualIcon"
                         write('                                                            <li><a href="')
-                        _v = VFFSL(SL,"item.url",True) # '$item.url' on line 59, col 74
-                        if _v is not None: write(_filter(_v, rawExpr='$item.url')) # from line 59, col 74.
+                        _v = VFFSL(SL,"item.url",True) # '$item.url' on line 62, col 74
+                        if _v is not None: write(_filter(_v, rawExpr='$item.url')) # from line 62, col 74.
                         write('" class="')
-                        _v = VFFSL(SL,"klass",True) # '$klass' on line 59, col 92
-                        if _v is not None: write(_filter(_v, rawExpr='$klass')) # from line 59, col 92.
+                        _v = VFFSL(SL,"klass",True) # '$klass' on line 62, col 92
+                        if _v is not None: write(_filter(_v, rawExpr='$klass')) # from line 62, col 92.
                         write('">')
-                        _v = VFFSL(SL,"item.title",True) # '$item.title' on line 59, col 100
-                        if _v is not None: write(_filter(_v, rawExpr='$item.title')) # from line 59, col 100.
+                        _v = VFFSL(SL,"item.title",True) # '$item.title' on line 62, col 100
+                        if _v is not None: write(_filter(_v, rawExpr='$item.title')) # from line 62, col 100.
                         write('</a></li>\n')
                     write('''                                                    </ul>
                                                 </dd>
@@ -181,8 +189,8 @@
                         </div>
                         <div class="documentContent" id="region-content">
                             ''')
-            _v = VFN(VFFSL(SL,"design",True),"render",False)(VFFSL(SL,"browser.activeWindow.content",True)) # '$design.render($browser.activeWindow.content)' on line 70, col 29
-            if _v is not None: write(_filter(_v, rawExpr='$design.render($browser.activeWindow.content)')) # from line 70, col 29.
+            _v = VFN(VFFSL(SL,"design",True),"render",False)(VFFSL(SL,"browser.activeWindow.content",True)) # '$design.render($browser.activeWindow.content)' on line 73, col 29
+            if _v is not None: write(_filter(_v, rawExpr='$design.render($browser.activeWindow.content)')) # from line 73, col 29.
             write('''
                         </div>
                     </div>

Modified: cs/portal/trunk/seismo/SeismoWebPortal/forms.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/forms.py	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/forms.py	2008-03-26 00:41:32 UTC (rev 11549)
@@ -3,15 +3,13 @@
 from django.contrib.auth import authenticate, login
 from django.contrib.auth.models import User
 from django.core import validators
-from models import Mesh, Model, Event, DataSource, Region, Source
-from models import UserInfo, Invite
+from models import Specfem3DGlobeMesh, Event, DataSource, Region, Source
+from models import UserInfo, Invite, Folder
 from cmt import CMTSolution
 
-from models import Specfem3DGlobeParameters as Simulation # NYI
 
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Simulation
+# Specfem 3D Globe Meshes
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
@@ -56,30 +54,30 @@
         return
 
 
-class MeshAddManipulator(Mesh.AddManipulator, MeshManipulator):
+class MeshAddManipulator(Specfem3DGlobeMesh.AddManipulator, MeshManipulator):
     def __init__(self, nchunks):
-        Mesh.AddManipulator.__init__(self)
+        Specfem3DGlobeMesh.AddManipulator.__init__(self, follow = { 'fsNode': False })
         MeshManipulator.__init__(self, nchunks)
 
     def save(self, new_data):
         MeshManipulator.save(self, new_data)
-        return Mesh.AddManipulator.save(self, new_data)
+        return Specfem3DGlobeMesh.AddManipulator.save(self, new_data)
 
 
-class MeshChangeManipulator(Mesh.ChangeManipulator, MeshManipulator):
+class MeshChangeManipulator(Specfem3DGlobeMesh.ChangeManipulator, MeshManipulator):
     def __init__(self, nchunks, object_id):
-        Mesh.ChangeManipulator.__init__(self, object_id)
+        Specfem3DGlobeMesh.ChangeManipulator.__init__(self, object_id, follow = { 'fsNode': False })
         MeshManipulator.__init__(self, nchunks)
 
     def flatten_data(self):
-        new_data = Mesh.ChangeManipulator.flatten_data(self)
+        new_data = Specfem3DGlobeMesh.ChangeManipulator.flatten_data(self)
         new_data['nproc'] = self.original_object.nproc_xi
         new_data['nex_c'] = self.original_object.nex_xi_c
         return new_data
 
     def save(self, new_data):
         MeshManipulator.save(self, new_data)
-        return Mesh.ChangeManipulator.save(self, new_data)
+        return Specfem3DGlobeMesh.ChangeManipulator.save(self, new_data)
 
 
 class RunStatusManipulator(forms.Manipulator):
@@ -189,6 +187,7 @@
             phone       = new_data['phone'],
             invite      = invite,
             approved    = approved,
+            home        = Folder.newFolder(user.username, user)
             )
         
         # Log-in the new user.
@@ -246,6 +245,7 @@
             userInfo = user.userinfo
         except UserInfo.DoesNotExist:
             userInfo = UserInfo()
+            userInfo.home = Folder.newFolder(user.username, user)
             user.userinfo = userInfo
         # Save the new user.
         user.first_name      = new_data['first_name']
@@ -284,8 +284,7 @@
         del self['event']
         del self['dataSource']
         del self['region']
-        self.fields.extend([forms.TextField('name',        maxlength=100,  is_required=True),
-                            forms.TextField('dataSource',  maxlength=100,  is_required=True),
+        self.fields.extend([forms.TextField('dataSource',  maxlength=100,  is_required=True),
                             forms.TextField('region',      maxlength=100,  is_required=True),
                             ])
         return
@@ -294,8 +293,7 @@
         from datetime import datetime
         
         # Create the new Event.
-        event = Event.objects.create(user = user,
-                                     name = new_data['name'])
+        event = Event.objects.create()
 
         # Create the DataSource and Region.
         dataSource, created = DataSource.objects.get_or_create(name = new_data['dataSource'])
@@ -309,7 +307,6 @@
         args['dataSource'] = dataSource
         args['region'] = region
         args['when'] = datetime.combine(args['when_date'], args['when_time'])
-        del args['name']
         del args['when_date']
         del args['when_time']
         source = Source.objects.create(**args)
@@ -329,23 +326,16 @@
         del self['event']
         del self['dataSource']
         del self['region']
-        self.fields.extend([forms.TextField('name',        maxlength=100,  is_required=True),
-                            forms.TextField('dataSource',  maxlength=100,  is_required=True),
+        self.fields.extend([forms.TextField('dataSource',  maxlength=100,  is_required=True),
                             forms.TextField('region',      maxlength=100,  is_required=True),
                             ])
         return
 
-    def flatten_data(self):
-        new_data =  super(SingleSourceEventChangeManipulator, self).flatten_data()
-        new_data['name'] = self.event.name
-        return new_data
-
     def save(self, new_data, user):
         from datetime import datetime
         
         # Save event info.
         event = self.event
-        event.name = new_data['name']
         event.save()
 
         # Create the DataSource and Region.
@@ -368,7 +358,6 @@
     def __init__(self):
         super(UploadEventManipulator, self).__init__()
         self.fields = [
-            forms.TextField('name', maxlength=100, is_required=True),
             forms.FileUploadField(field_name='cmtsolution', is_required=True),
             ]
 
@@ -391,8 +380,9 @@
         cmtSolutionList = CMTSolution.parse(cmtSolution)
 
         # Create the new event.
-        event = Event.objects.create(user = user,
-                                     name = new_data['name'])
+        event = Event.objects.create()
+        event.fsNode.name = new_data['cmtsolution']['filename']
+        event.fsNode.save()
 
         # Add each source.
         for cmtSolution in cmtSolutionList:

Modified: cs/portal/trunk/seismo/SeismoWebPortal/gui.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/gui.py	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/gui.py	2008-03-26 00:41:32 UTC (rev 11549)
@@ -43,11 +43,19 @@
 
     def __init__(self, url, title):
         Window.__init__(self, url, title)
+        self.buttons = []
         self.menuBar = None
         self.content = None
         return
 
 
+class WindowButton(object):
+    
+    def __init__(self, url, title):
+        self.url = url
+        self.title = title
+
+
 class Menu(object):
 
     def __init__(self, id, url, title, items):

Modified: cs/portal/trunk/seismo/SeismoWebPortal/models.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/models.py	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/models.py	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,13 +1,89 @@
 
 from django.db import models
+from django.db.models import Q
 from django.contrib.auth.models import User
 from django.core import validators
+from django.contrib.contenttypes.models import ContentType
 
-from managers import CurrentUser, CurrentUserManager
+from managers import CurrentUser
 from middleware import get_current_user
 
 
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# pseudo filesystem
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+class FSNode(models.Model):
+    name = models.CharField(maxlength=100, db_index=True)
+    owner = models.ForeignKey(User, null=True, db_index=True)
+    parent = models.ForeignKey('self', null=True, db_index=True, related_name='childSet')
+    oldParent = models.ForeignKey('self', null=True, related_name='deletedChildSet')
+    created = models.DateTimeField(auto_now_add=True, editable=False)
+    modified = models.DateTimeField(auto_now=True, editable=False)
+    inTrash = models.BooleanField(default=False)
+    kind = models.ForeignKey(ContentType, db_index=True)
+    objectId = models.PositiveIntegerField(db_index=True)
+    contents = models.GenericForeignKey(ct_field='kind', fk_field='objectId')
+
+    follow = dict(owner = False,
+                  parent = False,
+                  oldParent = False,
+                  kind = False,
+                  objectId = False)
+
+    def url(self):
+        return "/specfem3dglobe/%d/" % self.id
+
+    def icon(self):
+        return self.contents.icon()
+
+    @classmethod
+    def newNode(cls, contents):
+        owner = get_current_user()
+        name = "untitled"
+        number = 1
+        while True:
+            q = FSNode.objects.filter(name = name, owner = owner)
+            if q.count() == 0:
+                break
+            number += 1
+            name = "untitled %d" % number
+        fsNode = FSNode(name = name,
+                        owner = owner,
+                        parent = Folder.homeFolder(owner),
+                        contents = contents)
+        fsNode.save()
+        return fsNode
+
+
+class Folder(models.Model):
+    fsNode = models.ForeignKey(FSNode, null=True)
+
+    @classmethod
+    def homeFolder(cls, user):
+        userInfo = UserInfo.getOrCreate(user)
+        return userInfo.home
+
+    @classmethod
+    def newFolder(cls, name, owner):
+        folder = Folder()
+        folder.save()
+        node = FSNode(name = name,
+                      owner = owner,
+                      contents = folder)
+        node.save()
+        folder.fsNode = node
+        folder.save()
+        return folder
+
+
+# user's files and shared files which are not in the Trash
+userFSChoices = ((Q(fsNode__owner__exact = CurrentUser()) | Q(fsNode__owner__isnull = True)) &
+                 Q(fsNode__inTrash = False))
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Events
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -24,15 +100,8 @@
 
 class Event(models.Model):
 
-    # each user has a list of their own events
-    user = models.ForeignKey(User)
+    fsNode = models.ForeignKey(FSNode, null=True)
     
-    name = models.CharField(maxlength=100)
-
-    # managers
-    objects = models.Manager()
-    user_objects = CurrentUserManager()
-
     def _getSingleSource(self):
         if not hasattr(self, '_singleSource'):
             if self.source_set.count() == 1:
@@ -45,24 +114,20 @@
     def sources(self):
         return self.source_set.order_by('timeShift')
 
-    def __str__(self): return self.name
+    def __str__(self): return self.fsNode.name
 
     def icon(self):
         ss = self.singleSource
         return ss and ss.beachball() or ""
 
-    def copy(self, objMap):
-        from copy import copy
-        obj = copy(self)
-        obj.id = None
-        obj.user = objMap[User][self.user.id]
-        super(Event, obj).save()
-        for source in self.source_set.all():
-            sourceCopy = copy(source)
-            sourceCopy.id = None
-            sourceCopy.event = obj
-            sourceCopy.save()
-        return obj
+    def save(self):
+        super(Event, self).save()
+        if self.fsNode is None:
+            self.fsNode = FSNode.newNode(self)
+            super(Event, self).save()
+        else:
+            self.fsNode.save() # touch
+        return
 
     def delete(self):
         self.source_set.all().delete()
@@ -196,30 +261,22 @@
 
 class StationList(models.Model):
 
-    # each user has their own station lists
-    user = models.ForeignKey(User)
+    fsNode = models.ForeignKey(FSNode, null=True)
 
-    name = models.CharField(maxlength=100)
+    def __str__(self): return self.fsNode.name
 
-    # managers
-    objects = models.Manager()
-    user_objects = CurrentUserManager()
+    def icon(self):
+        return '<img src="/specfem3dglobe/pics/kml.icon.gif">'
 
-    def __str__(self): return self.name
+    def save(self):
+        super(StationList, self).save()
+        if self.fsNode is None:
+            self.fsNode = FSNode.newNode(self)
+            super(StationList, self).save()
+        else:
+            self.fsNode.save() # touch
+        return
 
-    def copy(self, objMap):
-        from copy import copy
-        obj = copy(self)
-        obj.id = None
-        obj.user = objMap[User][self.user.id]
-        super(StationList, obj).save()
-        for station in self.station_set.all():
-            stationCopy = copy(station)
-            stationCopy.id = None
-            stationCopy.stationList = obj
-            stationCopy.save()
-        return obj
-
     def delete(self):
         self.station_set.all().delete()
         super(StationList, self).delete()
@@ -227,7 +284,6 @@
 
 class Station(models.Model):
     
-    # each user has their own stations
     stationList = models.ForeignKey(StationList)
 
     code = models.CharField(maxlength=10) # 3-4 chars currently
@@ -278,12 +334,9 @@
 NEX_C_CHOICES = oneThruNine
 
 
-class Mesh(models.Model):
+class Specfem3DGlobeMesh(models.Model):
 
-    user = models.ForeignKey(User, blank=True)
-    name = models.CharField(maxlength=100)
-    created = models.DateTimeField(auto_now_add=True, editable=False)
-    modified = models.DateTimeField(auto_now=True, editable=False)
+    fsNode = models.ForeignKey(FSNode, null=True)
     
     nchunks = models.IntegerField(core=True, choices=NCHUNKS_CHOICES, default=1)
     nproc_xi = models.IntegerField(core=True, choices=NPROC_CHOICES, default=5)
@@ -302,40 +355,34 @@
     center_longitude = models.FloatField(max_digits=19, decimal_places=10, core=True)
     gamma_rotation_azimuth = models.FloatField(max_digits=19, decimal_places=10, core=True)
 
-    # managers
-    objects = models.Manager()
-    user_objects = CurrentUserManager()
-
     def shortestPeriod(self):
         if self.nchunks == 6:
             return (256.0 / float(self.nex_xi())) * 17.0
         # regional
         return (256.0 / float(self.nex_xi())) * (self.angular_width_xi / 90.0) * 17.0
 
-    def __str__(self): return self.name
+    def __str__(self): return self.fsNode.name
 
+    def icon(self):
+        return '<img src="/specfem3dglobe/pics/kml.icon.gif">'
+
     def save(self):
-        self.user = get_current_user()
-        super(Mesh, self).save()
+        super(Specfem3DGlobeMesh, self).save()
+        if self.fsNode is None:
+            self.fsNode = FSNode.newNode(self)
+            super(Specfem3DGlobeMesh, self).save()
+        else:
+            self.fsNode.save() # touch
+        return
 
-    def copy(self, objMap):
-        from copy import copy
-        obj = copy(self)
-        obj.id = None
-        obj.user = objMap[User][self.user.id]
-        super(Mesh, obj).save()
-        return obj
-
     class Admin:
         pass
 
 
-class Model(models.Model):
+
+class Specfem3DGlobeModel(models.Model):
     
-    user = models.ForeignKey(User, blank=True)
-    name = models.CharField(maxlength=100)
-    created = models.DateTimeField(auto_now_add=True, editable=False)
-    modified = models.DateTimeField(auto_now=True, editable=False)
+    fsNode = models.ForeignKey(FSNode, null=True)
     
     type = models.IntegerField(choices=MODEL_TYPES, core=True, default=False)
     oceans = models.BooleanField(core=True, default=False)
@@ -345,24 +392,20 @@
     rotation = models.BooleanField(core=True, default=False)
     ellipticity = models.BooleanField(core=True, default=False)
 
-    # managers
-    objects = models.Manager()
-    user_objects = CurrentUserManager()
+    def __str__(self): return self.fsNode.name
 
-    def __str__(self): return self.name
+    def icon(self):
+        return '<img src="/specfem3dglobe/pics/kml.icon.gif">'
 
     def save(self):
-        self.user = get_current_user()
-        super(Model, self).save()
+        super(Specfem3DGlobeModel, self).save()
+        if self.fsNode is None:
+            self.fsNode = FSNode.newNode(self)
+            super(Specfem3DGlobeModel, self).save()
+        else:
+            self.fsNode.save() # touch
+        return
 
-    def copy(self, objMap):
-        from copy import copy
-        obj = copy(self)
-        obj.id = None
-        obj.user = objMap[User][self.user.id]
-        super(Model, obj).save()
-        return obj
-
     def get_type_id(self):
         return model_types[self.type-1][0]
 
@@ -370,6 +413,7 @@
         pass
 
 
+
 def isValidRecordLength(field_data, all_data):
     lower = 0.0
     upper = 100.0
@@ -383,13 +427,10 @@
     #
     # general information about the simulation
     #
-    user = models.ForeignKey(User)
-    name = models.CharField(maxlength=100, core=True)
-    created = models.DateTimeField(auto_now_add=True, editable=False)
-    modified = models.DateTimeField(auto_now=True, editable=False)
+    fsNode = models.ForeignKey(FSNode, null=True)
     
-    mesh = models.ForeignKey(Mesh, limit_choices_to = {'user__exact': CurrentUser()})
-    model = models.ForeignKey(Model, limit_choices_to = {'user__exact': CurrentUser()})
+    mesh = models.ForeignKey(Specfem3DGlobeMesh, limit_choices_to = userFSChoices)
+    model = models.ForeignKey(Specfem3DGlobeModel, limit_choices_to = userFSChoices)
 
     zero_half_duration = models.BooleanField(default=True)
     
@@ -406,7 +447,7 @@
     movie_volume = models.BooleanField(core=True)
 
     # STATIONS
-    stations = models.ForeignKey(StationList, limit_choices_to = {'user__exact': CurrentUser()})
+    stations = models.ForeignKey(StationList, limit_choices_to = userFSChoices)
 
     # hdur_movie:
     hdur_movie = models.FloatField(max_digits=19, decimal_places=10, core=True, default=0.0, blank=True)
@@ -421,12 +462,11 @@
     # simulation_type:
     simulation_type = models.IntegerField(choices=SIMULATION_TYPES, default=1)
 
-    # managers
-    objects = models.Manager()
-    user_objects = CurrentUserManager()
+    def __str__(self): return self.fsNode.name
+    
+    def icon(self):
+        return '<img src="/specfem3dglobe/pics/kml.icon.gif">'
 
-    def __str__(self): return self.name
-    
     def nodes(self):
         """Return the number of processors required for this simulation."""
         mesh = self.mesh
@@ -444,24 +484,16 @@
         return not self.mesh.nchunks == 6
 
     def save(self):
-        self.user = get_current_user()
         self.ntstep_between_output_info = 100
         self.ntstep_between_output_seismos = 5000
         super(Specfem3DGlobeParameters, self).save()
+        if self.fsNode is None:
+            self.fsNode = FSNode.newNode(self)
+            super(Specfem3DGlobeParameters, self).save()
+        else:
+            self.fsNode.save() # touch
         return
 
-    def copy(self, objMap):
-        from copy import copy
-        obj = copy(self)
-        obj.id = None
-        obj.user = objMap[User][self.user.id]
-        obj.mesh = objMap[Mesh][self.mesh.id]
-        obj.model = objMap[Model][self.model.id]
-        obj.events = objMap[Event][self.events.id]
-        obj.stations = objMap[StationList][self.stations.id]
-        super(Specfem3DGlobeParameters, obj).save()
-        return obj
-
     def run(self):
         r = Run()
         r.simulation = self
@@ -489,6 +521,8 @@
 
 class MineosModeCatalog(models.Model):
 
+    fsNode = models.ForeignKey(FSNode, null=True)
+    
     #------------------------------------------------------------------------
     # minos_bran
     
@@ -512,12 +546,31 @@
     # eigcon
 
     max_depth = models.FloatField(max_digits=19, decimal_places=10, default=1000.0) # km
+
+
+    #------------------------------------------------------------------------
+
+    def __str__(self): return self.fsNode.name
     
+    def icon(self):
+        return '<img src="/specfem3dglobe/pics/kml.icon.gif">'
 
+    def save(self):
+        super(MineosModeCatalog, self).save()
+        if self.fsNode is None:
+            self.fsNode = FSNode.newNode(self)
+            super(MineosModeCatalog, self).save()
+        else:
+            self.fsNode.save() # touch
+        return
+    
+
 class MineosParameters(models.Model):
 
-    catalog = models.ForeignKey(MineosModeCatalog)
+    fsNode = models.ForeignKey(FSNode, null=True)
 
+    catalog = models.ForeignKey(MineosModeCatalog, limit_choices_to = userFSChoices)
+
     # jcom
     radial = models.BooleanField(default=True)
     toroidal = models.BooleanField(default=True)
@@ -539,7 +592,23 @@
         from math import ceil
         return int(ceil(self.record_length * 60.0 / self.step))
 
+    #------------------------------------------------------------------------
 
+    def __str__(self): return self.fsNode.name
+    
+    def icon(self):
+        return '<img src="/specfem3dglobe/pics/kml.icon.gif">'
+
+    def save(self):
+        super(MineosParameters, self).save()
+        if self.fsNode is None:
+            self.fsNode = FSNode.newNode(self)
+            super(MineosParameters, self).save()
+        else:
+            self.fsNode.save() # touch
+        return
+
+
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Request
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -548,7 +617,7 @@
 class Request(models.Model):
     
     # CMTSOLUTION
-    event = models.ForeignKey(Event, limit_choices_to = {'user__exact': CurrentUser()})
+    event = models.ForeignKey(Event, limit_choices_to = userFSChoices)
 
     parametersSpecfem3DGlobe = models.ForeignKey(Specfem3DGlobeParameters, null=True)
     parametersMineos = models.ForeignKey(MineosParameters, null=True)
@@ -644,6 +713,8 @@
     approved = models.BooleanField(default=False)
     help_visible = models.BooleanField(default=True)
 
+    home = models.ForeignKey(Folder)
+
     def __str__(self): return self.user.username
 
     # forward to User
@@ -657,5 +728,17 @@
         list_display = ('username', 'first_name', 'last_name', 'invite', 'approved')
         list_filter = ('approved',)
 
+    @classmethod
+    def getOrCreate(cls, user):
+        try:
+            userInfo = user.userinfo
+        except UserInfo.DoesNotExist:
+            newHome = Folder.newFolder(user.username, user)
+            userInfo = UserInfo(home = newHome)
+            user.userinfo = userInfo
+            user.save()
+            userInfo.save()
+        return userInfo
 
+
 # end of file

Modified: cs/portal/trunk/seismo/SeismoWebPortal/static/css/style.css
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/static/css/style.css	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/static/css/style.css	2008-03-26 00:41:32 UTC (rev 11549)
@@ -414,10 +414,6 @@
     font-size: small;
 }
 
-table .beachball {
-    float: left;
-}
-
 .new {
     background-color: yellow;
 }
@@ -446,6 +442,12 @@
     padding-bottom: .2em;
 }
 
+.properties dd input {
+    display: inline;
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
 /*** experimental floating properties
 div.box {
     float: left;

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,5 +1,5 @@
 
-<h2>{{ object.name }}</h2>
+<h2>{{ object }}</h2>
 
 <div class=toolbar>
     <a href="gearth.kml"><img src="/specfem3dglobe/pics/kml.icon.gif" title="View in Google Earth" alt="View in Google Earth"></a>

Deleted: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_form.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_form.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,22 +0,0 @@
-
-<h2>rename event</h2>
-
-{% if form.has_errors %}
-<p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
-{% endif %}
-
-<form method="post" action="/specfem3dglobe/events/{{ object.id }}/edit/">
-
-    <div class=tab30ex>
-
-    <div>
-        <label for="id_name" class=before>name</label>
-        {{ form.name }}
-        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
-    </div>
-
-    <div><input class=submit type="submit" value="Save" /></div>
-
-    </div> <!-- tab30ex -->
-
-</form>

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_list.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_list.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_list.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -27,7 +27,7 @@
         <tbody>
         {% for object in object_list %}
         <tr>
-            <th><a href="{{ object.id }}/">{{ object.name }}</a></th>
+            <th><a href="{{ object.id }}/">{{ object }}</a></th>
             {% if object.singleSource %}
             <td>point-source</td>
             <td>{{ object.singleSource.beachball }}</td>

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,17 +1,6 @@
 
 <h2>upload event</h2>
 
-<div class=toolbar>
-    <form method="post" action="/specfem3dglobe/help/toggle/">
-        <input type="hidden" name="post_toggle_redirect" value="/specfem3dglobe/events/upload/">
-        {% if help_visible %}
-        <input type="submit" name="hide_help" value="Hide Help" />
-        {% else %}
-        <input type="submit" name="show_help" value="Show Help" />
-        {% endif %}
-    </form>
-</div>
-
 <form action="/specfem3dglobe/events/upload/" method="post" enctype="multipart/form-data">
 
     {% if form.has_errors %}
@@ -21,12 +10,6 @@
     <div class=tab30ex>
 
     <div>
-        <label for="id_name" class=before>name for this event</label>
-        {{ form.name }}
-        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
-    </div>
-
-    <div>
         <label for="id_cmtsolution" class=before>local file to upload</label>
         {{ form.cmtsolution }} {{ form.cmtsolution_file }}
         {% if form.cmtsolution.errors %}<span class=error>{{ form.cmtsolution.errors|join:", " }}</span>{% endif %}

Added: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/fsnode_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/fsnode_form.html	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/fsnode_form.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -0,0 +1,22 @@
+
+<h2>{{ object.name }} properties</h2>
+
+<form method="post" action="{{ action }}">
+
+    <div class=properties>
+
+        <dl>
+            <dt>name</dt>
+            <dd>
+                {{ form.name }}
+                <input class=submit type="submit" value="Rename" />
+            </dd>
+
+            <dt>kind</dt><dd>{{ object.kind }}</dd>
+            <dt>created</dt><dd>{{ object.created|date }} {{ object.created|time }}</dd>
+            <dt>modified</dt><dd>{{ object.modified|date }} {{ object.modified|time }}</dd>
+        </dl>
+
+    </div>
+
+</form>

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,17 +1,6 @@
 
-<h2>{% if object %}edit{% else %}new{% endif %} {% block heading %}{{ nchunks }}-chunk regional mesh{% endblock %}</h2>
+<h2>{% if object %}edit {{ object }}{% else %}new {% block heading %}{{ nchunks }}-chunk regional mesh{% endblock %}{% endif %}</h2>
 
-<div class=toolbar>
-    <form method="post" action="/specfem3dglobe/help/toggle/">
-        <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
-        {% if help_visible %}
-        <input type="submit" name="hide_help" value="Hide Help" />
-        {% else %}
-        <input type="submit" name="show_help" value="Show Help" />
-        {% endif %}
-    </form>
-</div>
-
 <form name="mesh_form" method="post" action="{{ action }}">
 
     {% if form.has_errors %}
@@ -20,12 +9,6 @@
 
     <div class=tab30ex>
 
-    <div>
-        <label for="id_name" class=before>name</label>
-        {{ form.name }}
-        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
-    </div>
-
     <fieldset><legend>chunks</legend>
 
     <p>Nchunks = {{ nchunks }}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,22 +1,6 @@
 
-<h2>{% if object %}edit{% else %}new{% endif %} mode catalog</h2>
+<h2>{% if object %}edit {{ object }}{% else %}new mode catalog{% endif %}</h2>
 
-<div class=toolbar>
-    <form method="post" action="/specfem3dglobe/help/toggle/">
-        <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
-        {% if help_visible %}
-        <input type="submit" name="hide_help" value="Hide Help" />
-        {% else %}
-        <input type="submit" name="show_help" value="Show Help" />
-        {% endif %}
-    </form>
-
-    {% if object %}
-    <form action="delete/" method="get"><input type="submit" value="Delete" /></form>
-    {% endif %}
-
-</div>
-
 <form method="post" action="{{ action }}">
 
     {% if form.has_errors %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,17 +1,6 @@
 
-<h2>{% if object %}edit{% else %}new{% endif %} mineos parameters</h2>
+<h2>{% if object %}edit {{ object }}{% else %}new mineos parameters{% endif %}</h2>
 
-<div class=toolbar>
-    <form method="post" action="/specfem3dglobe/help/toggle/">
-        <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
-        {% if help_visible %}
-        <input type="submit" name="hide_help" value="Hide Help" />
-        {% else %}
-        <input type="submit" name="show_help" value="Show Help" />
-        {% endif %}
-    </form>
-</div>
-
 <form method="post" action="{{ action }}">
 
     {% if form.has_errors %}

Deleted: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_form.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_form.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,101 +0,0 @@
-
-<h2>{% if object %}edit{% else %}new{% endif %} model</h2>
-
-<div class=toolbar>
-    <form method="post" action="/specfem3dglobe/help/toggle/">
-        <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
-        {% if help_visible %}
-        <input type="submit" name="hide_help" value="Hide Help" />
-        {% else %}
-        <input type="submit" name="show_help" value="Show Help" />
-        {% endif %}
-    </form>
-</div>
-
-<form method="post" action="{{ action }}">
-
-    {% if form.has_errors %}
-    <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
-    {% endif %}
-
-    <div class=tab30ex>
-
-    <div>
-        <label for="id_name" class=before>name</label>
-        {{ form.name }}
-        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
-    </div>
-
-    <div>
-        <label for="id_type" class=before>type</label>
-        {{ form.type }}
-        {% if form.type.errors %}<span class=error>{{ form.type.errors|join:", " }}</span>{% endif %}
-
-        {% if help_visible %}
-        <dl class=help>
-
-            <dt>crust2.0+prem</dt><dd>This model has CRUST2.0 [Bassin et al., 2000] on top of a transversely isotropic PREM. We first extrapolate PREM mantle velocity up to the surface, then overwrite the model with CRUST2.0.</dd>
-
-            <dt>s20rts</dt><dd>By default, the code uses 3D mantle model S20RTS [Ritsema et al., 1999] and 3D crustal model Crust2.0 [Bassin et al., 2000]. Note that S20RTS uses transversely isotropic PREM as a background model, and that we use the PREM radial attenuation model when 'attenuation' is selected.</dd>
-
-            <dt>s362ani</dt><dd>A global shear-wave speed model developed by Kustowski et al. [2006]. In this model, radial anisotropy is confined to the uppermost mantle. The model (and the corresponding mesh) incorporate tomography on the 650~km and 410~km discontinuities in the 1D reference model REF.</dd>
-
-            <dt>s362wmani</dt><dd>A version of S362ANI with anisotropy allowed throughout the mantle.</dd>
-            <dt>s362ani+prem</dt><dd>A version of S362ANI calculated using PREM as the 1D reference model.</dd>
-            <dt>s29ea</dt><dd>A global model with higher resolution in the upper mantle beneath Eurasia calculated using REF as the 1D reference model.</dd>
-        </dl>
-        {% endif %}
-
-    </div>
-
-    <div class=checkbox>
-        {{ form.oceans }}
-        <label for="id_oceans" class=after>oceans</label>
-        {% if form.oceans.errors %}<span class=error>{{ form.oceans.errors|join:", " }}</span>{% endif %}
-        {% if help_visible %}<span class=help>If selected, the effect of the oceans on seismic wave propagation will be incorporated based upon the approximate treatment discussed in Komatitsch and Tromp [2002b]. This feature is inexpensive from a numerical perspective, both in terms of memory requirements and CPU time. This approximation is accurate at periods of roughly 20s and longer. At shorter periods the effect of water phases/reverberations is not taken into account, even when the flag is on.</span>{% endif %}
-    </div>
-
-    <div class=checkbox>
-        {{ form.gravity }}
-        <label for="id_gravity" class=after>gravity</label>
-        {% if form.gravity.errors %}<span class=error>{{ form.gravity.errors|join:", " }}</span>{% endif %}
-        {% if help_visible %}<span class=help>If selected, self-gravitation will be incorporated in the Cowling approximation [Komatitsch and Tromp, 2002b, Dahlen and Tromp, 1998]. Turning this feature on is relatively inexpensive, both from the perspective of memory requirements as well as in terms of computational speed.</span>{% endif %}
-    </div>
-
-    <div class=checkbox>
-        {{ form.attenuation }}
-        <label for="id_attenuation" class=after>attenuation</label>
-        {% if form.attenuation.errors %}<span class=error>{{ form.attenuation.errors|join:", " }}</span>{% endif %}
-        {% if help_visible %}<span class=help>If selected, attenuation will be incorporated. Turning this feature on increases the memory requirements significantly (roughly by a factor of 1.5), and is numerically fairly expensive. Of course for realistic simulations this flag should be turned on. See Komatitsch and Tromp [1999, 2002a] for a discussion on the implementation of attenuation based upon standard linear solids.</span>{% endif %}
-    </div>
-
-    <div class=checkbox>
-        {{ form.topography }}
-        <label for="id_topography" class=after>topography</label>
-        {% if form.topography.errors %}<span class=error>{{ form.topography.errors|join:", " }}</span>{% endif %}
-        {% if help_visible %}<span class=help>If selected, topography and bathymetry will be incorporated based upon model ETOPO5 [NOAA, 1988]. This feature adds no cost to the simulation.</span>{% endif %}
-    </div>
-
-    <div class=checkbox>
-        {{ form.rotation }}
-        <label for="id_rotation" class=after>rotation</label>
-        {% if form.rotation.errors %}<span class=error>{{ form.rotation.errors|join:", " }}</span>{% endif %}
-        {% if help_visible %}<span class=help>If selected, the Coriolis effect will be incorporated. Turning this feature on is relatively cheap 
-numerically.</span>{% endif %}
-    </div>
-
-    <div class=checkbox>
-        {{ form.ellipticity }}
-        <label for="id_ellipticity" class=after>ellipticity</label>
-        {% if form.ellipticity.errors %}<span class=error>{{ form.ellipticity.errors|join:", " }}</span>{% endif %}
-        {% if help_visible %}<span class=help>If selected, the mesh will make the Earth model elliptical in shape according to
- Clairaut's equation [Dahlen and Tromp, 1998]. This feature adds no cost to the simulation.</span>{% endif %}
-    </div>
-
-    <div>
-        <input class=submit type="submit" value="Save" />
-    </div>
-
-    </div> <!-- tab30ex -->
-
-</form>

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/object_lists.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/object_lists.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/object_lists.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -15,7 +15,7 @@
         <tbody>
         {% for object in specfem3dglobe_parameters_list %}
         <tr>
-            <th><a href="specfem3dglobe/parameters/{{ object.id }}/">{{ object.name }}</a></th>
+            <th><a href="specfem3dglobe/parameters/{{ object.id }}/">{{ object }}</a></th>
             <td><a href="specfem3dglobe/meshes/{{ object.mesh.id }}/">{{ object.mesh }}</a><br>
                 <span class=inlineInfo>shortest period &cong; {{ object.mesh.shortestPeriod|stringformat:".0f" }}s</span></td>
             <td><a href="specfem3dglobe/models/{{ object.model.id }}/">{{ object.model }}</a></td>
@@ -77,7 +77,7 @@
         <tbody>
         {% for object in mesh_list %}
         <tr>
-            <th><a href="specfem3dglobe/meshes/{{ object.id }}/">{{ object.name }}</a></th>
+            <th><a href="specfem3dglobe/meshes/{{ object.id }}/">{{ object }}</a></th>
             <td class=int>{{ object.nchunks }}</td>
             <td class=int>{{ object.nproc_eta }}</td>
             <td class=int>{{ object.nproc_xi }}</td>
@@ -132,7 +132,7 @@
         <tbody>
         {% for object in model_list %}
         <tr>
-            <th><a href="specfem3dglobe/models/{{ object.id }}/">{{ object.name }}</a></th>
+            <th><a href="specfem3dglobe/models/{{ object.id }}/">{{ object }}</a></th>
             <td>{{ object.get_type_display }}</td>
             <td><span class={{ object.oceans }}>{{ object.oceans }}</span></td>
             <td><span class={{ object.gravity }}>{{ object.gravity }}</span></td>
@@ -173,7 +173,7 @@
         <tbody>
         {% for object in mode_catalog_list %}
         <tr>
-            <th><a href="mineos/modes/{{ object.id }}/">XXXX</a></th>
+            <th><a href="mineos/modes/{{ object.id }}/">{{ object }}</a></th>
             <td>{{ object.eps }}</td>
             <td>{{ object.wgrav }}</td>
             <td>{{ object.lmin }}</td>
@@ -215,7 +215,7 @@
         <tbody>
         {% for object in mineos_parameters_list %}
         <tr>
-            <th><a href="mineos/parameters/{{ object.id }}/">XXXX</a></th>
+            <th><a href="mineos/parameters/{{ object.id }}/">{{ object }}</a></th>
             <td>{{ object.catalog }}</td>
             <td><span class={{ object.radial }}>{{ object.radial }}</span></td>
             <td><span class={{ object.toroidal }}>{{ object.toroidal }}</span></td>
@@ -252,7 +252,7 @@
         <tbody>
         {% for station_list in station_lists %}
         <tr>
-            <td><a href="stations/{{ station_list.id }}/">{{ station_list.name }}</a></td>
+            <td><a href="stations/{{ station_list.id }}/">{{ station_list }}</a></td>
             <td>{{ station_list.station_set.count }}</td>
             <td>
                 <a href="stations/{{ station_list.id }}/gearth.kml"><img src="/specfem3dglobe/pics/kml.icon.gif" title="View in Google Earth" alt="View in Google Earth"></a>
@@ -266,3 +266,9 @@
 {% else %}
     <p>You have no stations.
 {% endif %}
+
+<ul>
+{% for item in home %}
+    <li><a href="{{item.url}}">{{ item.icon }} {{ item.name }}</a></li>
+{% endfor %}
+</ul>

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -9,12 +9,6 @@
 
     <div class=tab30ex>
 
-    <div>
-        <label for="id_name" class=before>name</label>
-        {{ form.name }}
-        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
-    </div>
-
     {% if object %}
 
     <!-- PDE info is not used by the code -->

Copied: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemodel_form.html (from rev 11539, cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/model_form.html)
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemodel_form.html	                        (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemodel_form.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -0,0 +1,84 @@
+
+<h2>{% if object %}edit {{ object }}{% else %}new model{% endif %}</h2>
+
+<form method="post" action="{{ action }}">
+
+    {% if form.has_errors %}
+    <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
+    {% endif %}
+
+    <div class=tab30ex>
+
+    <div>
+        <label for="id_type" class=before>type</label>
+        {{ form.type }}
+        {% if form.type.errors %}<span class=error>{{ form.type.errors|join:", " }}</span>{% endif %}
+
+        {% if help_visible %}
+        <dl class=help>
+
+            <dt>crust2.0+prem</dt><dd>This model has CRUST2.0 [Bassin et al., 2000] on top of a transversely isotropic PREM. We first extrapolate PREM mantle velocity up to the surface, then overwrite the model with CRUST2.0.</dd>
+
+            <dt>s20rts</dt><dd>By default, the code uses 3D mantle model S20RTS [Ritsema et al., 1999] and 3D crustal model Crust2.0 [Bassin et al., 2000]. Note that S20RTS uses transversely isotropic PREM as a background model, and that we use the PREM radial attenuation model when 'attenuation' is selected.</dd>
+
+            <dt>s362ani</dt><dd>A global shear-wave speed model developed by Kustowski et al. [2006]. In this model, radial anisotropy is confined to the uppermost mantle. The model (and the corresponding mesh) incorporate tomography on the 650~km and 410~km discontinuities in the 1D reference model REF.</dd>
+
+            <dt>s362wmani</dt><dd>A version of S362ANI with anisotropy allowed throughout the mantle.</dd>
+            <dt>s362ani+prem</dt><dd>A version of S362ANI calculated using PREM as the 1D reference model.</dd>
+            <dt>s29ea</dt><dd>A global model with higher resolution in the upper mantle beneath Eurasia calculated using REF as the 1D reference model.</dd>
+        </dl>
+        {% endif %}
+
+    </div>
+
+    <div class=checkbox>
+        {{ form.oceans }}
+        <label for="id_oceans" class=after>oceans</label>
+        {% if form.oceans.errors %}<span class=error>{{ form.oceans.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, the effect of the oceans on seismic wave propagation will be incorporated based upon the approximate treatment discussed in Komatitsch and Tromp [2002b]. This feature is inexpensive from a numerical perspective, both in terms of memory requirements and CPU time. This approximation is accurate at periods of roughly 20s and longer. At shorter periods the effect of water phases/reverberations is not taken into account, even when the flag is on.</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.gravity }}
+        <label for="id_gravity" class=after>gravity</label>
+        {% if form.gravity.errors %}<span class=error>{{ form.gravity.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, self-gravitation will be incorporated in the Cowling approximation [Komatitsch and Tromp, 2002b, Dahlen and Tromp, 1998]. Turning this feature on is relatively inexpensive, both from the perspective of memory requirements as well as in terms of computational speed.</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.attenuation }}
+        <label for="id_attenuation" class=after>attenuation</label>
+        {% if form.attenuation.errors %}<span class=error>{{ form.attenuation.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, attenuation will be incorporated. Turning this feature on increases the memory requirements significantly (roughly by a factor of 1.5), and is numerically fairly expensive. Of course for realistic simulations this flag should be turned on. See Komatitsch and Tromp [1999, 2002a] for a discussion on the implementation of attenuation based upon standard linear solids.</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.topography }}
+        <label for="id_topography" class=after>topography</label>
+        {% if form.topography.errors %}<span class=error>{{ form.topography.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, topography and bathymetry will be incorporated based upon model ETOPO5 [NOAA, 1988]. This feature adds no cost to the simulation.</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.rotation }}
+        <label for="id_rotation" class=after>rotation</label>
+        {% if form.rotation.errors %}<span class=error>{{ form.rotation.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, the Coriolis effect will be incorporated. Turning this feature on is relatively cheap 
+numerically.</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.ellipticity }}
+        <label for="id_ellipticity" class=after>ellipticity</label>
+        {% if form.ellipticity.errors %}<span class=error>{{ form.ellipticity.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, the mesh will make the Earth model elliptical in shape according to
+ Clairaut's equation [Dahlen and Tromp, 1998]. This feature adds no cost to the simulation.</span>{% endif %}
+    </div>
+
+    <div>
+        <input class=submit type="submit" value="Save" />
+    </div>
+
+    </div> <!-- tab30ex -->
+
+</form>

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,23 +1,15 @@
 
-<h2>{{ object.name }}</h2>
+<h2>{{ object }}</h2>
 
 <div class=properties>
 
     <div class=box>
-    <dl>
-        <dt>type</dt><dd>{% ifequal object.mesh.nchunks 6 %}global{% else %}regional{% endifequal %}</dd>
-        <dt>created</dt><dd>{{ object.created|date }} {{ object.created|time }}</dd>
-        <dt>modified</dt><dd>{{ object.modified|date }} {{ object.modified|time }}</dd>
-    </dl>
-    </div>
-
-    <div class=box>
     <h3>general</h3>
 
     <dl>
-        <dt>name</dt><dd>{{ object.name }}</dd>
-        <dt>mesh</dt><dd><a href="../../meshes/{{ object.mesh.id }}/">{{ object.mesh.name }}</a></dd>
-        <dt>model</dt><dd><a href="../../models/{{ object.model.id }}/">{{ object.model.name }}</a></dd>
+        <dt>type</dt><dd>{% ifequal object.mesh.nchunks 6 %}global{% else %}regional{% endifequal %}</dd>
+        <dt>mesh</dt><dd><a href="../../meshes/{{ object.mesh.id }}/">{{ object.mesh }}</a></dd>
+        <dt>model</dt><dd><a href="../../models/{{ object.model.id }}/">{{ object.model }}</a></dd>
         <dt>record length</dt><dd>{{ object.record_length }} minutes</dd>
     </dl>
     </div>
@@ -26,7 +18,7 @@
     <h3>stations</h3>
 
     <dl>
-        <dt>station list</dt><dd><a href="../../../stations/{{ object.stations.id }}/">{{ object.stations.name }}</a></dd>
+        <dt>station list</dt><dd><a href="../../../stations/{{ object.stations.id }}/">{{ object.stations }}</a></dd>
         <dt>receivers at depth</dt><dd>{{ object.receivers_can_be_buried }}</dd>
     </dl>
     </div>

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,17 +1,6 @@
 
-<h2>{% if object %}edit{% else %}new{% endif %} simulation</h2>
+<h2>{% if object %}edit {{ object }}{% else %}new simulation{% endif %}</h2>
 
-<div class=toolbar>
-    <form method="post" action="/specfem3dglobe/help/toggle/">
-        <input type="hidden" name="post_toggle_redirect" value="{{ action }}">
-        {% if help_visible %}
-        <input type="submit" name="hide_help" value="Hide Help" />
-        {% else %}
-        <input type="submit" name="show_help" value="Show Help" />
-        {% endif %}
-    </form>
-</div>
-
 <form method="post" action="{{ action }}">
 
     {% if form.has_errors %}
@@ -20,12 +9,6 @@
 
     <div class=tab30ex>
 
-    <div>
-        <label for="id_name" class=before>name</label>
-        {{ form.name }}
-        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
-    </div>
-
     <input type="hidden" name="simulation_type" value="1">
 
     <div class=checkbox>

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,5 +1,5 @@
 
-<h2>{{ object.name }}</h2>
+<h2>{{ object }}</h2>
 
 <div class=toolbar>
     <a href="gearth.kml"><img src="/specfem3dglobe/pics/kml.icon.gif" title="View in Google Earth" alt="View in Google Earth"></a>

Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html	2008-03-26 00:41:32 UTC (rev 11549)
@@ -1,17 +1,6 @@
 
 <h2>upload station list</h2>
 
-<div class=toolbar>
-    <form method="post" action="/specfem3dglobe/help/toggle/">
-        <input type="hidden" name="post_toggle_redirect" value="/specfem3dglobe/config/stations/upload/">
-        {% if help_visible %}
-        <input type="submit" name="hide_help" value="Hide Help" />
-        {% else %}
-        <input type="submit" name="show_help" value="Show Help" />
-        {% endif %}
-    </form>
-</div>
-
 <form action="/specfem3dglobe/config/stations/upload/" method="POST" enctype="multipart/form-data">
 
     {% if form.has_errors %}
@@ -21,12 +10,6 @@
     <div class=tab30ex>
 
     <div>
-        <label for="id_name" class=before>name for this station list</label>
-        {{ form.name }}
-        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
-    </div>
-
-    <div>
         <label for="id_stations" class=before>local file to upload</label>
         {{ form.stations }} {{ form.stations_file }}
         {% if form.stations.errors %}<span class=error>{{ form.stations.errors|join:", " }}</span>{% endif %}

Modified: cs/portal/trunk/seismo/SeismoWebPortal/views.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/views.py	2008-03-25 19:09:06 UTC (rev 11548)
+++ cs/portal/trunk/seismo/SeismoWebPortal/views.py	2008-03-26 00:41:32 UTC (rev 11549)
@@ -10,9 +10,11 @@
 from django.template.context import RequestContext
 from create_update import create_object, update_object
 from forms import RegistrationAddManipulator, RegistrationChangeManipulator
-from models import Model, Mesh, Station, StationList, StationNetwork, DataSource, Region
+from models import Station, StationList, StationNetwork, DataSource, Region
+from models import Specfem3DGlobeModel, Specfem3DGlobeMesh, Specfem3DGlobeParameters
 from models import MineosModeCatalog, MineosParameters
 from models import Run, Job, OutputFile
+from models import FSNode, Folder
 from cmt import CMTSolution
 import gui
 
@@ -20,9 +22,6 @@
 from HTMLParser import HTMLParser
 
 
-from models import Specfem3DGlobeParameters
-Simulation = Specfem3DGlobeParameters # NYI
-
 static_media_root = os.environ.get("WEBPORTAL_MEDIA_ROOT")+'/static'
 
 
@@ -130,12 +129,11 @@
 
 
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Meshes, Models, Simulations
+# Specfem 3D Globe
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
 OUTPUT_ROOT = os.path.join(settings.MEDIA_ROOT, 'SeismoWebPortal', 'output')
-disapproval = "You cannot run simulations until you are approved by a site administrator."
 
 
 def home(request, desktop):
@@ -161,7 +159,7 @@
         if name == "stations":
             return config_stations(request, path, desktop)
         index = Index({
-            "specfem3dglobe": Index({"models": Model,
+            "specfem3dglobe": Index({"models": Specfem3DGlobeModel,
                                      "meshes": [config_specfem3dglobe_meshes],
                                      "parameters": [config_specfem3dglobe_parameters] }),
             "mineos": Index({"modes": MineosModeCatalog,
@@ -181,6 +179,7 @@
             if path: raise Http404
             url = "/specfem3dglobe/config/%s/new/" % url
             window = gui.ChildWindow(url, "New")
+            window.buttons.append(helpButton(request))
             return create(request, desktop, window, ModelClass)
         
         objId = intOr404(name)
@@ -188,6 +187,7 @@
 
         view = gui.ChildWindow(url, "View")
         edit = gui.ChildWindow(url + "edit/", "Edit")
+        properties = gui.ChildWindow(url + "properties/", "Properties")
         menuBar = [
             gui.Menu("actionMenu", "actions", "Actions",
                      [gui.MenuItem(url + "duplicate/", "Duplicate"),
@@ -195,9 +195,11 @@
                       ]
                      ),
             ]
-        view.menuBar = edit.menuBar = menuBar
+        view.menuBar = edit.menuBar = properties.menuBar = menuBar
+        edit.buttons.append(helpButton(request))
         desktop.activeWindow.insertWindow(view)
         desktop.activeWindow.insertWindow(edit)
+        desktop.activeWindow.insertWindow(properties)
     
         if not path:
             return update(request, desktop, view, object_id = objId, ModelClass = ModelClass)
@@ -205,6 +207,16 @@
         if path: raise Http404
         if name == "edit":
             return update(request, desktop, edit, object_id = objId, ModelClass = ModelClass)
+        if name == "properties":
+            objId = get_object_or_404(ModelClass, id=objId).fsNode.id # Ouch!
+            return update_object(request,
+                                 desktop,
+                                 properties,
+                                 FSNode,
+                                 objId,
+                                 post_save_redirect = '/specfem3dglobe/config/',
+                                 follow = FSNode.follow,
+                                 )
         if name == "delete":
             return delete_object(request,
                                  desktop,
@@ -232,13 +244,15 @@
                  ]
                  )
         ]
+    home = Folder.homeFolder(request.user)
     html = loader.render_to_string('SeismoWebPortal/object_lists.html',
-                                   {'specfem3dglobe_parameters_list': Simulation.objects.filter(user=request.user),
-                                    'mesh_list': Mesh.user_objects.all(),
-                                    'model_list': Model.user_objects.all(),
-                                    'mode_catalog_list': MineosModeCatalog.objects.all(),
-                                    'mineos_parameters_list': MineosParameters.objects.all(),
-                                    'station_lists': StationList.objects.filter(user__exact=request.user),
+                                   {'specfem3dglobe_parameters_list': Specfem3DGlobeParameters.objects.filter(fsNode__owner=request.user),
+                                    'mesh_list': Specfem3DGlobeMesh.objects.filter(fsNode__owner=request.user),
+                                    'model_list': Specfem3DGlobeModel.objects.filter(fsNode__owner=request.user),
+                                    'mode_catalog_list': MineosModeCatalog.objects.filter(fsNode__owner=request.user),
+                                    'mineos_parameters_list': MineosParameters.objects.filter(fsNode__owner=request.user),
+                                    'station_lists': StationList.objects.filter(fsNode__owner=request.user),
+                                    'home': FSNode.objects.filter(parent=home.fsNode),
                                     }
                                    )
     child.content = gui.StaticContent(html)
@@ -254,12 +268,13 @@
     name = path.pop(0)
     if name == "new":
         window = gui.ChildWindow("/specfem3dglobe/config/specfem3dglobe/parameters/new/", "New")
+        window.buttons.append(helpButton(request))
         return create_object(request,
                              desktop,
                              window,
-                             Simulation,
+                             Specfem3DGlobeParameters,
                              post_save_redirect = '/specfem3dglobe/config/specfem3dglobe/parameters/%(id)d/',
-                             follow = { 'user': False },
+                             follow = { 'fsNode': False },
                              )
     
     objId = intOr404(name)
@@ -267,18 +282,21 @@
     
     view = gui.ChildWindow(url, "View")
     edit = gui.ChildWindow(url + "edit/", "Edit")
+    properties = gui.ChildWindow(url + "properties/", "Properties")
     menuBar = [
         gui.Menu("actionMenu", "actions", "Actions",
                  [gui.MenuItem(url + "delete/", "Delete"),
                   ]
                  ),
         ]
-    view.menuBar = edit.menuBar = menuBar
+    view.menuBar = edit.menuBar = properties.menuBar = menuBar
+    edit.buttons.append(helpButton(request))
     desktop.activeWindow.insertWindow(view)
     desktop.activeWindow.insertWindow(edit)
+    desktop.activeWindow.insertWindow(properties)
     
     if not path:
-        return object_detail(request, desktop, view, Simulation.user_objects.all(), object_id = objId)
+        return object_detail(request, desktop, view, Specfem3DGlobeParameters.objects.all(), object_id = objId)
     
     name = path.pop(0)
             
@@ -301,8 +319,18 @@
                              Specfem3DGlobeParameters,
                              object_id = objId,
                              post_save_redirect = url,
-                             follow = { 'user': False },
+                             follow = { 'fsNode': False },
                              )
+    if name == "properties":
+        objId = get_object_or_404(Specfem3DGlobeParameters, id=objId).fsNode.id # Ouch!
+        return update_object(request,
+                             desktop,
+                             properties,
+                             FSNode,
+                             objId,
+                             post_save_redirect = url,
+                             follow = FSNode.follow,
+                             )
     if name == "delete":
         return delete_object(request,
                              desktop,
@@ -326,7 +354,7 @@
     response = HttpResponse(mimetype='text/plain')
     #response['Content-Disposition'] = 'attachment; filename=parameters.xml'
 
-    simulation = get_object_or_404(Simulation, id=sim_id)
+    simulation = get_object_or_404(Specfem3DGlobeParameters, id=sim_id)
 
     t = loader.get_template('SeismoWebPortal/par_file.txt')
     c = Context({
@@ -341,7 +369,7 @@
     response = HttpResponse(mimetype='text/xml')
     #response['Content-Disposition'] = 'attachment; filename=parameters.xml'
 
-    simulation = get_object_or_404(Simulation, id=sim_id)
+    simulation = get_object_or_404(Specfem3DGlobeParameters, id=sim_id)
 
     t = loader.get_template('SeismoWebPortal/parameters.pml')
     c = Context({
@@ -417,7 +445,7 @@
 
     response = HttpResponse(mimetype='text/plain')
 
-    simulation = get_object_or_404(Simulation, id=sim_id)
+    simulation = get_object_or_404(Specfem3DGlobeParameters, id=sim_id)
 
     count = simulation.events.source_set.count()
     for event in simulation.events.source_set.all():
@@ -450,7 +478,7 @@
 def stations_txt(request, sim_id):
     response = HttpResponse(mimetype='text/plain')
 
-    simulation = get_object_or_404(Simulation, id=sim_id)
+    simulation = get_object_or_404(Specfem3DGlobeParameters, id=sim_id)
     stations = simulation.stations.station_set.all()
 
     write_stations(stations, response)
@@ -670,7 +698,6 @@
                 if isNewUser:
                     request.session.delete_test_cookie()
                     help_login_hook(request, user)
-                    #set_up_user_defaults(user)
                     notify_managers_of_new_user(request, user)
                     user.message_set.create(message="Welcome to the SPECFEM 3D GLOBE web portal!")
                 else:
@@ -693,38 +720,6 @@
     return desktop
 
 
-def set_up_user_defaults(newUser):
-    from django.contrib.auth.models import User
-    from models import Event, Source, StationList, Mesh, Model, Simulation
-
-    if newUser.username == 'template':
-        return
-
-    try:
-        templateUser = User.objects.get(username = 'template')
-    except User.DoesNotExist:
-        return
-
-    # map template objects to the new user's objects
-    objMap = {
-        User: {templateUser.id: newUser}
-        }
-
-    # The order of model classes is significant: Simulations must be
-    # copied last.
-    
-    for ModelClass in [Event, StationList, Mesh, Model, Simulation]:
-
-        queryset = ModelClass.objects.filter(user = templateUser)
-        
-        for template in queryset:
-            obj = template.copy(objMap)
-            objMap.setdefault(ModelClass, {})
-            objMap[ModelClass][template.id] = obj
-            
-    return
-
-
 def notify_managers_of_new_user(request, user):
     from django.core.mail import mail_managers
 
@@ -802,26 +797,39 @@
     
     view = gui.ChildWindow(url, "View")
     edit = gui.ChildWindow(url + "edit/", "Edit")
+    properties = gui.ChildWindow(url + "properties/", "Properties")
     menuBar = [
         gui.Menu("actionMenu", "actions", "Actions",
                  [gui.MenuItem(url + "delete/", "Delete"),
                   ]
                  ),
         ]
-    view.menuBar = edit.menuBar = menuBar
+    view.menuBar = edit.menuBar = properties.menuBar = menuBar
+    edit.buttons.append(helpButton(request))
     desktop.activeWindow.insertWindow(view)
     desktop.activeWindow.insertWindow(edit)
+    desktop.activeWindow.insertWindow(properties)
     
     if not path:
         return manipulate_mesh(request, desktop, view, object_id = objId, action='edit')
     name = path.pop(0)
     if name == "edit":
         return manipulate_mesh(request, desktop, edit, object_id = objId, action='edit')
+    if name == "properties":
+        objId = get_object_or_404(Specfem3DGlobeMesh, id=objId).fsNode.id # Ouch!
+        return update_object(request,
+                             desktop,
+                             properties,
+                             FSNode,
+                             objId,
+                             post_save_redirect = '/specfem3dglobe/config/',
+                             follow = FSNode.follow,
+                             )
     if name == "delete":
         if path: raise Http404
         return delete_object(request,
                              desktop,
-                             Mesh,
+                             Specfem3DGlobeMesh,
                              "/specfem3dglobe/config/",
                              object_id = objId)
 
@@ -832,7 +840,7 @@
     from forms import MeshAddManipulator, MeshChangeManipulator
     
     if nchunks is None:
-        mesh = get_object_or_404(Mesh, id=object_id, user__exact=request.user)
+        mesh = get_object_or_404(Specfem3DGlobeMesh, id=object_id)
         nchunks = mesh.nchunks
     else:
         mesh = None
@@ -906,7 +914,7 @@
                          window,
                          ModelClass,
                          post_save_redirect = '/specfem3dglobe/config/',
-                         follow = { 'user': False },
+                         follow = { 'fsNode': False },
                          )
 
 
@@ -917,7 +925,7 @@
                          ModelClass,
                          object_id,
                          post_save_redirect = '/specfem3dglobe/config/',
-                         follow = { 'user': False },
+                         follow = { 'fsNode': False },
                          )
 
 
@@ -937,7 +945,7 @@
     
     if not path:
         view = gui.ChildWindow("/specfem3dglobe/events/", "View")
-        return object_list(request, desktop, view, queryset = Event.user_objects.all(), allow_empty = True)
+        return object_list(request, desktop, view, queryset = Event.objects.filter(fsNode__owner=request.user), allow_empty = True)
 
     name = path.pop(0)
     index = Index({
@@ -952,21 +960,25 @@
 
     objId = intOr404(name)
     url = "/specfem3dglobe/events/%d/" % objId
-    node = gui.File(name, get_object_or_404(Event, id=objId, user__exact=request.user).name) # Ouch!
+    event = get_object_or_404(Event, id=objId) # Ouch!
+    node = gui.File(name, event.fsNode.name)
     eventsDir.appendNode(node)
     fileBrowser.path.append(node)
     
     view = gui.ChildWindow(url, "View")
     edit = gui.ChildWindow(url + "edit/", "Edit")
+    properties = gui.ChildWindow(url + "properties/", "Properties")
     menuBar = [
         gui.Menu("actionMenu", "actions", "Actions",
                  [gui.MenuItem(url + "delete/", "Delete"),
                   ]
                  ),
         ]
-    view.menuBar = edit.menuBar = menuBar
+    view.menuBar = edit.menuBar = properties.menuBar = menuBar
     desktop.activeWindow.insertWindow(view)
-    desktop.activeWindow.insertWindow(edit)
+    if event.singleSource:
+        desktop.activeWindow.insertWindow(edit)
+    desktop.activeWindow.insertWindow(properties)
     
     if not path:
         return object_detail(
@@ -974,13 +986,14 @@
             desktop,
             view,
             object_id = objId,
-            queryset = Event.user_objects.all(),
-            extra_context = { 'object_list': Event.user_objects.all() },
+            queryset = Event.objects.filter(fsNode__owner=request.user),
             )
 
     name = path.pop(0)
     if name == "edit":
         return manipulate_event(request, path, desktop, object_id = objId, action = 'edit', window = edit)
+    if name == "properties":
+        return manipulate_event(request, path, desktop, object_id = objId, action = 'properties', window = properties)
     if name == "delete":
         return delete_object(request,
                              desktop,
@@ -1017,6 +1030,7 @@
                   ]
                  ),
         ]
+    
     view.menuBar = edit.menuBar = menuBar
     desktop.activeWindow.insertWindow(view)
     desktop.activeWindow.insertWindow(edit)
@@ -1114,18 +1128,19 @@
         window = gui.ChildWindow("/specfem3dglobe/events/new/", "New")
         desktop.activeWindow.insertWindow(window)
     elif action == "edit":
-        event = get_object_or_404(Event, id=object_id, user__exact=request.user)
-        if not event.singleSource:
-            return update_object(
-                request,
-                desktop,
-                window,
-                Event,
-                object_id,
-                post_save_redirect = '/specfem3dglobe/events/',
-                follow = { 'user': False },
-                )
+        event = get_object_or_404(Event, id=object_id)
+        if not event.singleSource: raise Http404
         manipulator = SingleSourceEventChangeManipulator(event)
+    elif action == "properties":
+        objId = get_object_or_404(Event, id=object_id).fsNode.id # Ouch!
+        return update_object(request,
+                             desktop,
+                             window,
+                             FSNode,
+                             objId,
+                             post_save_redirect = '/specfem3dglobe/config/',
+                             follow = FSNode.follow,
+                             )
     else:
         raise Http404
     
@@ -1134,7 +1149,13 @@
         errors = manipulator.get_validation_errors(new_data)
         if not errors:
             manipulator.do_html2python(new_data)
+            name = new_data.get('name')
+            if name:
+                del new_data['name']
             new_event = manipulator.save(new_data, request.user)
+            if name:
+                new_event.fsNode.name = name
+                new_event.fsNode.save()
             url = "/specfem3dglobe/events/%i/" % new_event.id
             return HttpResponseRedirect(url)
     else:
@@ -1182,6 +1203,7 @@
         errors = new_data = {}
 
     child = gui.ChildWindow("/specfem3dglobe/events/upload/", "Upload")
+    child.buttons.append(helpButton(request))
     form = forms.FormWrapper(manipulator, new_data, errors)
     html = loader.render_to_string('SeismoWebPortal/event_upload.html',
                                    {'form': form, 'help_visible': help_visible}
@@ -1295,31 +1317,32 @@
     url = "/specfem3dglobe/config/stations/%d/" % objId
 
     view = gui.ChildWindow(url, "View")
-    edit = gui.ChildWindow(url + "edit/", "Edit")
+    properties = gui.ChildWindow(url + "properties/", "Properties")
     menuBar = [
         gui.Menu("actionMenu", "actions", "Actions",
                  [gui.MenuItem(url + "delete/", "Delete"),
                   ]
                  ),
         ]
-    view.menuBar = edit.menuBar = menuBar
+    view.menuBar = properties.menuBar = menuBar
     desktop.activeWindow.insertWindow(view)
-    desktop.activeWindow.insertWindow(edit)
+    desktop.activeWindow.insertWindow(properties)
 
     if not path:
-        return object_detail(request, desktop, view, StationList.user_objects.all(), object_id = objId)
+        return object_detail(request, desktop, view, StationList.objects.all(), object_id = objId)
 
     name = path.pop(0)
     if path: raise Http404
 
-    if name == "edit":
+    if name == "properties":
+        objId = get_object_or_404(StationList, id=objId).fsNode.id # Ouch!
         return update_object(request,
                              desktop,
-                             edit,
-                             StationList,
-                             object_id = objId,
-                             post_save_redirect = "/specfem3dglobe/config/stations/%(id)d/",
-                             follow = { 'user': False },
+                             properties,
+                             FSNode,
+                             objId,
+                             post_save_redirect = url,
+                             follow = FSNode.follow,
                              )
     
     if name == "delete":
@@ -1365,6 +1388,7 @@
         errors = new_data = {}
 
     child = gui.ChildWindow("/specfem3dglobe/config/stations/upload/", "Upload")
+    child.buttons.append(helpButton(request))
     form = forms.FormWrapper(manipulator, new_data, errors)
     html = loader.render_to_string('SeismoWebPortal/stationlist_upload.html',
                                    {'form': form, 'help_visible': help_visible}
@@ -1418,7 +1442,6 @@
     def __init__(self):
         super(UploadStationListManipulator, self).__init__()
         self.fields = [
-            forms.TextField('name', maxlength=100, is_required=True),
             forms.FileUploadField(field_name='stations', is_required=True),
             ]
 
@@ -1441,8 +1464,9 @@
         from StringIO import StringIO
 
         # Create the new station list.
-        stationList = StationList.objects.create(user = user,
-                                                 name = new_data['name'])
+        stationList = StationList.objects.create()
+        stationList.fsNode.name = new_data['stations']['filename']
+        stationList.fsNode.save()
         
         # Parse the uploaded STATIONS file.
         stations = new_data['stations']['content']
@@ -1474,10 +1498,10 @@
 from models import UserInfo
 
 def help(request, path, desktop):
-    if path != ["toggle"] or request.method != 'POST':
+    if path != ["toggle"]:
         raise Http404
     
-    data = request.POST
+    data = request.REQUEST
     if data.has_key('show_help'):
         help_visible = True
     elif data.has_key('hide_help'):
@@ -1508,6 +1532,16 @@
     return help_visible
 
 
+def helpButton(request):
+    from urllib import quote
+    if get_help_visible(request):
+        showHide = "hide_help=1"
+        title = "Hide Help"
+    else:
+        showHide = "show_help=1"
+        title = "Show Help"
+    return gui.WindowButton("/specfem3dglobe/help/toggle/?" + showHide + "&post_toggle_redirect=" + quote(request.path), title)
+
 def help_login_hook(request, user):
     try:
         userInfo = user.userinfo
@@ -1526,7 +1560,7 @@
 
     response = HttpResponse(mimetype='text/xml')
 
-    simulation = get_object_or_404(Simulation, id=sim_id)
+    simulation = get_object_or_404(Specfem3DGlobeParameters, id=sim_id)
 
     t = loader.get_template('SeismoWebPortal/mineos_parameters.pml')
     c = Context({
@@ -1541,7 +1575,7 @@
     
     response = HttpResponse(mimetype='text/plain')
 
-    simulation = get_object_or_404(Simulation, id=sim_id)
+    simulation = get_object_or_404(Specfem3DGlobeParameters, id=sim_id)
     
     for source in simulation.events.source_set.all():
         cmt = CMTSolution.createFromDBModel(source)
@@ -1572,7 +1606,7 @@
 def mineos_stations_site(request, sim_id):
     response = HttpResponse(mimetype='text/plain')
     
-    simulation = get_object_or_404(Simulation, id=sim_id)
+    simulation = get_object_or_404(Specfem3DGlobeParameters, id=sim_id)
 
     stations = simulation.stations.station_set.all()
     ondate = 0
@@ -1594,7 +1628,7 @@
 def mineos_stations_sitechan(request, sim_id):
     response = HttpResponse(mimetype='text/plain')
     
-    simulation = get_object_or_404(Simulation, id=sim_id)
+    simulation = get_object_or_404(Specfem3DGlobeParameters, id=sim_id)
 
     stations = simulation.stations.station_set.all()
     chanid = -1



More information about the cig-commits mailing list