[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 ≅ {{ 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