[cig-commits] r11942 - in cs/portal/trunk/northridge/SeismoWebPortal: . static templates/SeismoWebPortal

leif at geodynamics.org leif at geodynamics.org
Fri May 9 18:55:18 PDT 2008


Author: leif
Date: 2008-05-09 18:55:18 -0700 (Fri, 09 May 2008)
New Revision: 11942

Added:
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_confirm_delete.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_detail.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_confirm_delete.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_detail.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_confirm_delete.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_detail.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_detail_gearth.kml
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_detail.html
Removed:
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/events.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/job_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/meshes.html
Modified:
   cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py
   cs/portal/trunk/northridge/SeismoWebPortal/static/style.css
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_confirm_delete.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_search.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_search_results.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/home.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/password_change_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/register.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_confirm_delete.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_detail.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_confirm_delete.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_confirm_delete.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_confirm_delete.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/userinfo_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/urls.py
   cs/portal/trunk/northridge/SeismoWebPortal/views.py
Log:
Added missing templates (detail views and forms).  Made sure all
buttons work, disabling them if they don't apply to the current
context.  Brought meshes and kinematic ruptures into the new
'mezzanine' layer.  Cleaned-up 'urls.py'.


Modified: cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py	2008-05-10 01:55:18 UTC (rev 11942)
@@ -5,8 +5,8 @@
 from django.db.models import FileField
 from django.contrib.auth.views import redirect_to_login
 from django.template import RequestContext
-from django.http import Http404, HttpResponseRedirect
-from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
+from django.http import HttpResponse, HttpResponseRedirect, Http404
+from django.core.exceptions import ObjectDoesNotExist
 from django.core.paginator import ObjectPaginator, InvalidPage
 from django.utils.translation import gettext
 from HTMLParser import HTMLParser
@@ -18,6 +18,11 @@
 
 class Object(object):
 
+    creatable = True
+    uploadable = False
+    downloadable = False
+    duplicatable = True
+
     @classmethod
     def create(cls, request, template_name=None,
                template_loader=loader, extra_context=None, post_save_redirect=None,
@@ -61,7 +66,7 @@
                 elif hasattr(new_object, 'get_absolute_url'):
                     return HttpResponseRedirect(new_object.get_absolute_url())
                 else:
-                    raise ImproperlyConfigured("No URL to redirect to from generic create view.")
+                    return HttpResponseRedirect(cls.urlForObject(new_object))
         else:
             # No POST, so we want a brand new form without any data or errors
             errors = {}
@@ -124,7 +129,7 @@
                 elif hasattr(object, 'get_absolute_url'):
                     return HttpResponseRedirect(object.get_absolute_url())
                 else:
-                    raise ImproperlyConfigured("No URL to redirect to from generic create view.")
+                    return HttpResponseRedirect(self.url)
         else:
             errors = {}
             # This makes sure the form acurate represents the fields of the place.
@@ -145,7 +150,7 @@
                 c[key] = value
         return t.render(c)
 
-    def delete(self, request, post_delete_redirect,
+    def delete(self, request, post_delete_redirect=None,
                object_id=None, slug=None, slug_field=None, template_name=None,
                template_loader=loader, extra_context=None,
                login_required=False, context_processors=None, template_object_name='object'):
@@ -172,7 +177,10 @@
             object.delete()
             if request.user.is_authenticated():
                 request.user.message_set.create(message=gettext("The %(verbose_name)s was deleted.") % {"verbose_name": model._meta.verbose_name})
-            return HttpResponseRedirect(post_delete_redirect)
+            if post_delete_redirect:
+                return HttpResponseRedirect(post_delete_redirect)
+            else:
+                return HttpResponseRedirect(self.postDeleteRedirect())
         else:
             if not template_name:
                 template_name = "%s/%s_confirm_delete.html" % (model._meta.app_label, model._meta.object_name.lower())
@@ -189,7 +197,7 @@
 
     @classmethod
     def list(cls, request, paginate_by=None, page=None,
-             allow_empty=False, template_name=None, template_loader=loader,
+             allow_empty=True, template_name=None, template_loader=loader,
              extra_context=None, context_processors=None, template_object_name='object',
              ):
         """
@@ -305,6 +313,17 @@
                 c[key] = value
         return t.render(c)
 
+    def duplicate(self, request):
+        dup = self._duplicate()
+        return HttpResponseRedirect(self.urlForObject(dup, action = 'edit'))
+    
+    def _duplicate(self):
+        from copy import copy
+        dup = copy(self.obj)
+        dup.id = None
+        dup.save()
+        return dup
+
     def __init__(self, objId):
         self.objId = objId
         self.obj = self._lookupObject()
@@ -350,8 +369,13 @@
                 errors = manipulator.get_validation_errors(new_data)
                 if not errors:
                     manipulator.do_html2python(new_data)
-                    obj = manipulator.save(new_data)
-                    return HttpResponseRedirect(post_save_redirect)
+                    new_object = manipulator.save(new_data)
+                    if post_save_redirect:
+                        return HttpResponseRedirect(post_save_redirect % new_object.__dict__)
+                    elif hasattr(new_object, 'get_absolute_url'):
+                        return HttpResponseRedirect(new_object.get_absolute_url())
+                    else:
+                        return HttpResponseRedirect(cls.urlForObject(new_object))
         else:
             errors = new_data = {}
 
@@ -362,19 +386,36 @@
         return t.render(c)
 
     id = property(lambda self: self.obj.id)
+    url = property(lambda self: self.urlForObject(self.obj))
 
+    @classmethod
+    def urlForObject(cls, obj, action=None):
+        if action:
+            return "/specfem3dglobe/?class=%s&object=%d&action=%s" % (cls.__name__, obj.id, action)
+        return "/specfem3dglobe/?class=%s&object=%d" % (cls.__name__, obj.id)
 
+    def postDeleteRedirect(self):
+        return "/specfem3dglobe/?class=%s" % (self.__class__.__name__)
+
+
+
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Events
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
 class Event(Object):
     Model = models.Event
     FileFormat = fformats.CMTSolutionFormat
 
+    uploadable = True
+    downloadable = True
+    duplicatable = property(lambda self: bool(self.obj.singleSource))
+
     @classmethod
     def create(cls, request):
         from forms import SingleSourceEventAddManipulator
-        return cls._manipulate(request, SingleSourceEventAddManipulator(), None)
+        return cls._manipulate(request, SingleSourceEventAddManipulator())
 
     def update(self, request):
         from forms import SingleSourceEventChangeManipulator
@@ -384,7 +425,7 @@
         return self._manipulate(request, SingleSourceEventChangeManipulator(event), event)
 
     @classmethod
-    def _manipulate(cls, request, manipulator, event):
+    def _manipulate(cls, request, manipulator, event=None):
         if request.method == 'POST':
             new_data = request.POST.copy()
             errors = manipulator.get_validation_errors(new_data)
@@ -394,7 +435,7 @@
                 new_data['object'] = None; del new_data['object']
                 new_data['action'] = None; del new_data['action']
                 obj = manipulator.save(new_data)
-                return HttpResponseRedirect("/specfem3dglobe/")
+                return HttpResponseRedirect(cls.urlForObject(obj))
         else:
             new_data = manipulator.flatten_data()
             errors = {}
@@ -408,6 +449,16 @@
             ))
         return t.render(c)
 
+    def _duplicate(self):
+        from copy import copy
+        dup = super(Event, self)._duplicate()
+        for source in self.obj.source_set.all():
+            sourceCopy = copy(source)
+            sourceCopy.id = None
+            sourceCopy.event = dup
+            sourceCopy.save()
+        return dup
+
     @classmethod
     def search(cls, request):
         import urllib2
@@ -453,7 +504,52 @@
                            )
         return t.render(c)
 
+    def downloadAsText(self, request):
+        event = self.obj
+        response = HttpResponse(mimetype='text/plain')
+        response['Content-Disposition'] = 'attachment; filename=%s' % event.name
+        count = event.source_set.count()
+        for source in event.source_set.all():
+            cmtSolution = cmt.CMTSolution.createFromDBModel(source)
+            response.write(str(cmtSolution))
+        return response
 
+    def downloadAsKML(self, request):
+        return gearth_object_list(request,
+                                  self.obj.name,
+                                  queryset = self.obj.source_set.all(),
+                                  template_name = 'SeismoWebPortal/event_detail_gearth.kml',
+                                  extra_context = {'name': self.obj.name},
+                                  )
+
+
+class Source(Object):
+    Model = models.Source
+    FileFormat = fformats.CMTSolutionFormat
+
+    downloadable = True
+
+    def postDeleteRedirect(self):
+        return "/specfem3dglobe/?class=Event&object=%d" % self.obj.event.id
+
+    def downloadAsText(self, request):
+        source = self.obj
+        response = HttpResponse(mimetype='text/plain')
+        response['Content-Disposition'] = 'attachment; filename=%s' % source.eventName
+        response.write(str(source.cmtSolution()))
+        return response
+
+    def downloadAsKML(self, request):
+        source = self.obj
+        response = HttpResponse(mimetype='application/vnd.google-earth')
+        response['Content-Disposition'] = 'attachment; filename=%s.kml' % source.eventName
+        response.write(self.detail(request, 
+                                   template_name = 'SeismoWebPortal/source_detail_gearth.kml',
+                                   )
+                       )
+        return response
+
+
 # support code
 
 class HarvardCMTSearchResultsParser(HTMLParser):
@@ -499,19 +595,128 @@
         return
 
 
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Stations
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
 class StationList(Object):
     Model = models.StationList
     FileFormat = fformats.StationListFormat
 
+    creatable = False
+    uploadable = True
+    downloadable = True
+    duplicatable = False
 
+    def downloadAsText(self, request):
+        response = HttpResponse(mimetype='text/plain')
+        response['Content-Disposition'] = 'attachment; filename=%s' % self.obj.name
+        self.writeAsText(response)
+        return response
+
+    def writeAsText(self, response):
+        for station in self.obj.station_set.all():
+            response.write("%-5s %-3s %8.4f %10.4f %6.1f %6.1f\n" %
+                           (station.code, station.network.code,
+                            station.latitude, station.longitude, station.elevation, station.bur))
+        return
+
+    def downloadAsKML(self, request):
+        return gearth_object_list(request,
+                                  self.obj.name,
+                                  template_name =  'SeismoWebPortal/station_list_gearth.kml',
+                                  queryset = self.obj.station_set.all(),
+                                  extra_context = {'name': self.obj.name})
+
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Specfem 3D Globe
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
 class Specfem3DGlobeMesh(Object):
     Model = models.Specfem3DGlobeMesh
 
+    @classmethod
+    def create(cls, request):
+        from forms import MeshAddManipulator
+        nchunks = request.REQUEST.get('nchunks')
+        if nchunks is None:
+            raise Http404
+        try:
+            nchunks = int(nchunks)
+        except ValueError:
+            raise Http404
+        return cls._manipulate(request, nchunks, MeshAddManipulator(nchunks))
 
+    def update(self, request):
+        from forms import MeshChangeManipulator
+        mesh = self.obj
+        nchunks = mesh.nchunks
+        return self._manipulate(request, nchunks, MeshChangeManipulator(nchunks, mesh.id), mesh)
+
+    @classmethod
+    def _manipulate(cls, request, nchunks, manipulator, mesh=None):
+
+        if nchunks == 1:
+            template = 'SeismoWebPortal/mesh_form_1chunk.html'
+        elif nchunks == 2:
+            template = 'SeismoWebPortal/mesh_form_2chunks.html'
+        elif nchunks == 3:
+            template = 'SeismoWebPortal/mesh_form_3chunks.html'
+        elif nchunks == 6:
+            template = 'SeismoWebPortal/mesh_form_global.html'
+        else:
+            assert False
+
+        help_visible = False #get_help_visible(request)
+
+        if request.method == 'POST':
+            new_data = request.POST.copy()
+            errors = {}
+            if new_data.has_key('show_help'):
+                help_visible = True
+                request.session['help_visible'] = help_visible
+            elif new_data.has_key('hide_help'):
+                help_visible = False
+                request.session['help_visible'] = help_visible
+            else:
+                errors = manipulator.get_validation_errors(new_data)
+                if not errors:
+                    manipulator.do_html2python(new_data)
+                    new_object = manipulator.save(new_data)
+                    return HttpResponseRedirect(cls.urlForObject(new_object))
+        else:
+            # Populate new_data with a 'flattened' version of the current data.
+            new_data = manipulator.flatten_data()
+            errors = {}
+
+        # Populate the FormWrapper.
+        form = oldforms.FormWrapper(manipulator, new_data, errors)
+        t = loader.get_template(template)
+        c = RequestContext(request, dict(
+            form = form,
+            nchunks = nchunks,
+            help_visible = help_visible,
+            object = mesh,
+            action = request.path,
+            ))
+        return t.render(c)
+
+
 class Specfem3DGlobeParameters(Object):
     Model = models.Specfem3DGlobeParameters
 
 
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Mineos
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
 class MineosModeCatalog(Object):
     Model = models.MineosModeCatalog
 
@@ -520,20 +725,30 @@
     Model = models.MineosModel
     FileFormat = fformats.MineosModelFormat
 
+    creatable = False
+    uploadable = True
+    duplicatable = False
 
+    def update(self, request):
+        return super(MineosModel, self).update(request, follow = dict(data = False))
+
+
 class MineosParameters(Object):
     Model = models.MineosParameters
 
 
-classes = [
-    Event,
-    StationList,
-    Specfem3DGlobeMesh,
-    Specfem3DGlobeParameters,
-    MineosModeCatalog,
-    MineosModel,
-    MineosParameters,
-    ]
 
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# support code
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+def gearth_object_list(request, filename, **kwds):
+    from django.views.generic.list_detail import object_list
+    response = object_list(request,
+                           mimetype='application/vnd.google-earth',
+                           **kwds)
+    response['Content-Disposition'] = 'attachment; filename=%s.kml' % filename
+    return response
+
+
 # end of file

Modified: cs/portal/trunk/northridge/SeismoWebPortal/static/style.css
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/static/style.css	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/static/style.css	2008-05-10 01:55:18 UTC (rev 11942)
@@ -61,15 +61,19 @@
 
 
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-  menus
+  buttons/menus
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
 #menubar {
     border-bottom: 1px solid #8cacbb;
-    width: 100%;
     font-size: small;
 }
 
+#viewbar {
+    border-bottom: 1px solid #8cacbb;
+    font-size: small;
+}
+
 .actionMenu {
     position: relative;
     margin: 0;
@@ -160,7 +164,7 @@
     background-color: black;
 }
 
-.actionButton.disabled {
+.disabled {
     color: silver;
 }
 
@@ -192,6 +196,10 @@
     background-color: #eef;
 }
 
+tr:target {
+    background-color: #ff9;
+}
+
 .content th {
     text-align: left;
     padding-left: 1ex;
@@ -358,7 +366,7 @@
   misc.
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
-.cmtsolution pre {
+pre {
     border: 1px solid black;
     padding: 1em;
     background-color: #eee;

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_confirm_delete.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_confirm_delete.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_confirm_delete.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>delete event</h2>
+<h2>delete event</h2>
 
 <form method="post" action="/specfem3dglobe/">
     <input type="hidden" name="class" value="Event">

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>{{ object.name }}</h2>
+<h2>{{ object.name }}</h2>
 
 {% if object.singleSource %}
 
@@ -17,7 +17,7 @@
 <p class=infobar>{{ object.source_set.count }} source{{ object.source_set.count|pluralize }}
 
 {% if object.source_set.count %}
-    <table border=1 rules=groups>
+    <table rules=cols>
         <colgroup><col class=odd><col class=even><col class=odd><col class=even><col class=odd><col class=even><col class=odd></colgroup>
 
         <thead>
@@ -34,8 +34,8 @@
 
         <tbody>
         {% for source in object.sources %}
-        <tr>
-            <th><a href="../sources/{{ source.id }}/">{{ source.eventName }}</a></th>
+        <tr class="{% cycle odd,even %}" id="s{{source.id}}">
+            <td><a href="/specfem3dglobe/?class=Source&object={{source.id}}">{{ source.eventName }}</a></td>
             <td class=float>{{ source.timeShift|stringformat:".4f" }}</td>
             <td class=float>{{ source.halfDuration|stringformat:".4f" }}</td>
             <td class=float>{{ source.latitude|stringformat:".4f" }}&deg;</td>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_form.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_form.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>rename event</h2>
+<h2>rename event</h2>
 
 {% if form.has_errors %}
 <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -15,7 +15,7 @@
 
         <tbody>
         {% for object in object_list %}
-        <tr class="{% cycle odd,even %}">
+        <tr class="{% cycle odd,even %}" id="o{{object.id}}">
             <td><a href="/specfem3dglobe/?class=Event&object={{object.id}}">{{ object.name }}</a></td>
             {% if object.singleSource %}
             <td>point-source</td>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_search.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_search.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_search.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>event search</h2>
+<h2>event search</h2>
 
 {% if form.has_errors %}
 <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_search_results.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_search_results.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_search_results.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,12 +1,12 @@
 
-<h2 class=titlebar>event search results</h2>
+<h2>event search results</h2>
 
 {% if error %}
 <p><span class=error>{{ error }}</span></p>
 {% endif %}
 
 {% if event_list %}
-    <table rules=groups>
+    <table rules=cols>
         <colgroup><col class=odd><col class=even><col class=odd><col class=even><col class=odd><col class=even><col class=odd></colgroup>
 
         <thead>
@@ -23,7 +23,7 @@
 
         <tbody>
         {% for event in event_list %}
-        <tr>
+        <tr class="{% cycle odd,even %}">
             <td>
                 <!-- an inline events/add form, already filled-out -->
 	        <form method="post" action="/specfem3dglobe/">

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>upload event</h2>
+<h2>upload event</h2>
 
 <div class=toolbar>
     <form method="post" action="/specfem3dglobe/help/toggle/">

Deleted: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/events.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/events.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/events.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,25 +0,0 @@
-
-{% extends "SeismoWebPortal/base.html" %}
-
-{% block desktop %}
-
-<div class=taskbar>
-    <ul>
-        <li class=first><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/specfem3dglobeparameters/">3D</a>
-        <li><a href="/specfem3dglobe/mineosparameters/">1D</a>
-        <li><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
-        <li><a href="/specfem3dglobe/mineosmodels/">1D models</a>
-        <li class=selected><a href="/specfem3dglobe/events/">events</a>
-        <li><a href="/specfem3dglobe/stations/">stations</a>
-        <li><a href="/specfem3dglobe/specfem3dglobemeshes/">meshes</a>
-        <li><a href="/specfem3dglobe/registration/">profile</a>
-    </ul>
-</div>
-
-<h1 class=titlebar>events</h1>
-
-{% block content %}
-{% endblock %}
-
-{% endblock %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/home.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/home.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/home.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,12 +1,6 @@
 
-{% extends "SeismoWebPortal/base.html" %}
+<h2>home</h2>
 
-{% block desktop %}
-
-{{taskbar}}
-
-<h1 class=titlebar>home</h1>
-
 <h3>quick start</h3>
 
 <p>To set up a new simulation, proceed as follows:
@@ -53,5 +47,3 @@
 
 <p><a href="/specfem3dglobe/doc/manual_SPECFEM3D_GLOBE.pdf">
    <img src="/specfem3dglobe/pics/adobe-pdf.icon.gif">SPECFEM 3D GLOBE User Manual</a>
-
-{% endblock %}

Deleted: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/job_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/job_list.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/job_list.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,37 +0,0 @@
-
-{% extends "SeismoWebPortal/jobs.html" %}
-
-{% block content %}
-
-{% if object_list %}
-    <table rules=groups>
-        
-        <colgroup><col class=odd><col class=even><col class=odd><col class=even><col class=odd>
-                  <col class=even><col class=odd><col class=even><col class=odd></colgroup>
-
-        <thead>
-        <tr><th>id</th><th>simulation</th><th>task</th><th>status</th><th>created</th><th>started</th><th>finished</th><th>wait</th><th>duration</th></tr>
-        </thead>
-        
-        <tbody>
-        {% for object in object_list %}
-        <tr>
-            <td>{{ object.id|stringformat:"05d" }}</td>
-            <td><a href="/specfem3dglobe/simulations/{{ object.run.simulation.id }}/">{{ object.run.simulation.name }}</a></td>
-            <td>{{ object.task }}</td>
-            <td>{{ object.status }}</td>
-            <td>{{ object.created|date }} {{ object.created|time }}</td>
-            <td>{{ object.started|date }} {{ object.started|time }}</td>
-            <td>{{ object.finshed|date }} {{ object.finished|time }}</td>
-            <td>{{ object.wait }}</td>
-            <td>{{ object.duration }}</td>
-        </tr>
-        {% endfor %}
-        </tbody>
-
-    </table>
-{% else %}
-    <p>You have no jobs.
-{% endif %}
-
-{% endblock %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,28 +1,15 @@
 
-{% extends "SeismoWebPortal/meshes.html" %}
+<h2>{% if object %}edit{% else %}new{% endif %} {% block heading %}{{ nchunks }}-chunk regional mesh{% endblock %}</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} {% block heading %}{{ nchunks }}-chunk regional mesh{% endblock %}</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>
-
+<form name="mesh_form" method="post" action="{{ action }}">
+    <input type="hidden" name="class" value="Specfem3DGlobeMesh">
     {% if object %}
-    <form action="delete/" method="get"><input type="submit" value="Delete" /></form>
+    <input type="hidden" name="object" value="{{object.id}}">
+    <input type="hidden" name="action" value="edit">
+    {% else %}
+    <input type="hidden" name="action" value="new">
     {% endif %}
 
-</div>
-
-<form name="mesh_form" method="post" action="{{ action }}">
-
     {% if form.has_errors %}
     <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
     {% endif %}
@@ -133,5 +120,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Deleted: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/meshes.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/meshes.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/meshes.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,25 +0,0 @@
-
-{% extends "SeismoWebPortal/base.html" %}
-
-{% block desktop %}
-
-<div class=taskbar>
-    <ul>
-        <li class=first><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/pecfem3dglobeparameters/">3D</a>
-        <li><a href="/specfem3dglobe/mineosparameters/">1D</a>
-        <li><a href="/specfem3dglobe/mineosmodecatalogs/">modes</a>
-        <li><a href="/specfem3dglobe/mineosmodels/">1D models</a>
-        <li><a href="/specfem3dglobe/events/">events</a>
-        <li><a href="/specfem3dglobe/stations/">stations</a>
-        <li class=selected><a href="/specfem3dglobe/specfem3dglobemeshes/">meshes</a>
-        <li><a href="/specfem3dglobe/registration/">profile</a>
-    </ul>
-</div>
-
-<h1 class=titlebar>meshes</h1>
-
-{% block content %}
-{% endblock %}
-
-{% endblock %}

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_confirm_delete.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_confirm_delete.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_confirm_delete.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -0,0 +1,10 @@
+
+<h2>delete mineos mode catalog</h2>
+
+<form method="post" action="/specfem3dglobe/">
+    <input type="hidden" name="class" value="MineosModeCatalog">
+    <input type="hidden" name="object" value="{{object.id}}">
+    <input type="hidden" name="action" value="delete">
+    <p>Are you sure you want to delete the parameters "{{ object }}"?
+    <p><input type="submit" value="Delete" />
+</form>

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_detail.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_detail.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -0,0 +1,10 @@
+
+<h2>{{ object }}</h2>
+
+<dl class=parameters>
+    <dt>eps</dt><dd>{{ object.eps }}</dd>
+    <dt>wgrav</dt><dd>{{ object.wgrav }} mHz</dd>
+    <dt>angular orders</dt><dd>{{ object.lmin }} <= l < {{ object.lmax }}</dd>
+    <dt>compute frequency range</dt><dd>{{ object.wmin }} <= w < {{ object.wmax }} mHz</dd>
+    <dt>dispersion branch numbers</dt><dd>{{ object.nmin }} <= n < {{ object.nmax }}</dd>
+</dl>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -27,10 +27,12 @@
 has to be set to 10<span style="vertical-align: super">-12</span>&mdash;10<span style="vertical-align: super">-10</span>.</span>{% endif %}
     </div>
 
-    <p><label for="id_max_depth" class=before>maximum depth</label> {{ form.max_depth }} km
-       {% if form.max_depth.errors %}<span class=error>{{ form.max_depth.errors|join:", " }}</span>{% endif %}
-       {% if help_visible %}<span class=help>Maximum depth, d<span style="vertical-align: sub">max</span>, to cut all output eigenfunctions (in km). All output values exist in the interval 
+    <div>
+        <label for="id_max_depth" class=before>maximum depth</label> {{ form.max_depth }} km
+        {% if form.max_depth.errors %}<span class=error>{{ form.max_depth.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>Maximum depth, d<span style="vertical-align: sub">max</span>, to cut all output eigenfunctions (in km). All output values exist in the interval 
 (r<span style="vertical-align: sub">n</span>, r<span style="vertical-align: sub">n</span> - d<span style="vertical-align: sub">max</span>) only, where r<span style="vertical-align: sub">n</span> is the radius of the free surface in km.</span>{% endif %}
+    </div>
 
     </div> <!-- tab30ex -->
 

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_list.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_list.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -4,6 +4,7 @@
 <table rules=cols class=cool width="100%">
     <thead>
     <tr>
+        <th rowspan=2></th>
         <th rowspan=2 valign=bottom>eps</th>
         <th rowspan=2 valign=bottom>wgrav<br><small>(mHz)</small></th>
         <th colspan=2 valign=bottom><center>angular<br>orders</center></th>
@@ -22,7 +23,8 @@
 
     <tbody>
     {% for object in object_list %}
-    <tr class="{% cycle odd,even %}">
+    <tr class="{% cycle odd,even %}" id="o{{object.id}}">
+        <td><a href="/specfem3dglobe/?class=MineosModeCatalog&object={{object.id}}">xxx</a></td>
         <td>{{ object.eps }}</td>
         <td>{{ object.wgrav }}</td>
         <td>{{ object.lmin }}</td>

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_confirm_delete.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_confirm_delete.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_confirm_delete.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -0,0 +1,10 @@
+
+<h2>delete mineos model</h2>
+
+<form method="post" action="/specfem3dglobe/">
+    <input type="hidden" name="class" value="MineosModel">
+    <input type="hidden" name="object" value="{{object.id}}">
+    <input type="hidden" name="action" value="delete">
+    <p>Are you sure you want to delete the model "{{ object }}"?
+    <p><input type="submit" value="Delete" />
+</form>

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_detail.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_detail.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -0,0 +1,6 @@
+
+<h2>{{ object }}</h2>
+
+<pre>
+{{ object.data }}
+</pre>

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_form.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_form.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -0,0 +1,27 @@
+
+<h2>rename mineos model</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/">
+    <input type="hidden" name="class" value="MineosModel">
+    <input type="hidden" name="object" value="{{object.id}}">
+    <input type="hidden" name="action" value="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/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -10,8 +10,8 @@
 
     <tbody>
     {% for object in object_list %}
-    <tr class="{% cycle odd,even %}">
-        <td>{{ object }}</td>
+    <tr class="{% cycle odd,even %}" id="o{{object.id}}">
+        <td><a href="/specfem3dglobe/?class=MineosModel&object={{object.id}}">{{ object }}</a></td>
     </tr>
     {% endfor %}
     </tbody>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>upload mineos model</h2>
+<h2>upload mineos model</h2>
 
 <form action="/specfem3dglobe/?class=MineosModel&action=upload" method="POST" enctype="multipart/form-data">
 

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_confirm_delete.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_confirm_delete.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_confirm_delete.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -0,0 +1,10 @@
+
+<h2>delete mineos parameters</h2>
+
+<form method="post" action="/specfem3dglobe/">
+    <input type="hidden" name="class" value="MineosParameters">
+    <input type="hidden" name="object" value="{{object.id}}">
+    <input type="hidden" name="action" value="delete">
+    <p>Are you sure you want to delete the parameters "{{ object }}"?
+    <p><input type="submit" value="Delete" />
+</form>

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_detail.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_detail.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -0,0 +1,14 @@
+
+<h2>{{ object }}</h2>
+
+<dl class=parameters>
+    <dt>model</dt><dd><a href="/specfem3dglobe/?class=MineosModel&object={{object.model.id}}">{{ object.model }}</a></dd>
+    <dt>mode catalog</dt><dd><a href="/specfem3dglobe/?class=MineosModeCatalog&object={{object.model.id}}">{{ object.catalog }}</a></dd>
+    <dt>oscillations</dt>
+        <dd><img src="/specfem3dglobe/pics/icon-{% if object.radial %}yes{% else %}no{% endif %}.gif" alt="{{ object.radial }}"> radial</dd>
+        <dd><img src="/specfem3dglobe/pics/icon-{% if object.toroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.toroidal }}"> toroidal </dd>
+        <dd><img src="/specfem3dglobe/pics/icon-{% if object.spheroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.spheroidal }}"> spheroidal</dd>
+        <dd><img src="/specfem3dglobe/pics/icon-{% if object.ictoroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.ictoroidal }}"> inner core toroidal</dd>
+    <dt>select frequency range</dt><dd>{{ object.fmin }} <= f < {{ object.fmax }}</dd>
+    <dt>sampling period</dt><dd>{{ object.step }}s</dd>
+</dl>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} Mineos parameters</h2>
+<h2>{% if object %}edit{% else %}new{% endif %} Mineos parameters</h2>
 
 <div class=toolbar>
     <form method="post" action="/specfem3dglobe/help/toggle/">

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -4,6 +4,7 @@
 <table rules=cols class=cool width="100%">
     <thead>
     <tr>
+        <th rowspan=3></th>
         <th rowspan=3 valign=bottom>model</th>
         <th rowspan=3 valign=bottom>mode catalog</th>
         <th colspan=4 valign=bottom>oscillations</th>
@@ -24,13 +25,14 @@
 
     <tbody>
     {% for object in object_list %}
-    <tr class="{% cycle odd,even %}">
+    <tr class="{% cycle odd,even %}" id="o{{object.id}}">
+        <td><a href="/specfem3dglobe/?class=MineosParameters&object={{object.id}}">xxx</a></td>
         <td>{{ object.model }}</td>
         <td>{{ object.catalog }}</td>
-        <td><img src="{{ root }}/pics/icon-{% if object.radial %}yes{% else %}no{% endif %}.gif" alt="{{ object.radial }}"></td>
-        <td><img src="{{ root }}/pics/icon-{% if object.toroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.toroidal }}"></td>
-        <td><img src="{{ root }}/pics/icon-{% if object.spheroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.spheroidal }}"></td>
-        <td><img src="{{ root }}/pics/icon-{% if object.ictoroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.ictoroidal }}"></td>
+        <td><img src="/specfem3dglobe/pics/icon-{% if object.radial %}yes{% else %}no{% endif %}.gif" alt="{{ object.radial }}"></td>
+        <td><img src="/specfem3dglobe/pics/icon-{% if object.toroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.toroidal }}"></td>
+        <td><img src="/specfem3dglobe/pics/icon-{% if object.spheroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.spheroidal }}"></td>
+        <td><img src="/specfem3dglobe/pics/icon-{% if object.ictoroidal %}yes{% else %}no{% endif %}.gif" alt="{{ object.ictoroidal }}"></td>
         <td>{{ object.fmin }}</td>
         <td>{{ object.fmax }}</td>
         <td>{{ object.step }}</td>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/password_change_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/password_change_form.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/password_change_form.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -3,7 +3,7 @@
 
 {% block content %}
 
-<h1 class=titlebar>profile</h1>
+<h2>profile</h2>
 
 <div class=tabs>
     <ul>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -3,14 +3,7 @@
 
 {% block desktop %}
 
-<!--
-{{iconbar}}
-{{toolbar}}
-
-<h1>{{title}}</h1>
--->
-
-<table id=header>
+<table id=header cellspacing=0>
     <tr>
         <td>
             <h1>
@@ -69,7 +62,7 @@
         </td>
     </tr>
     <tr>
-        <td id=menubar colspan=2>
+        <td id=menubar>
             <table>
                 <tr>
                     <td>
@@ -80,6 +73,7 @@
                         {% endifequal %}
                     </td>
                     <td>
+                        {% if creatable %}
                         {% ifequal klass 'Specfem3DGlobeMesh' %}
                         <dl class="actionMenu" id="newMenu">
                             <dt class="actionMenuHeader">
@@ -87,15 +81,19 @@
                             </dt>
                             <dd class="actionMenuContent">
                                 <ul>
-                                    <li><a href="red">1-chunk regional mesh</a></li>
-                                    <li><a href="red">2-chunk regional mesh</a></li>
-                                    <li><a href="red">3-chunk regional mesh</a></li>
+                                    <li><a href="/specfem3dglobe/?class={{klass}}&action=new&nchunks=1">1-chunk regional mesh</a></li>
+                                    <li><a href="/specfem3dglobe/?class={{klass}}&action=new&nchunks=2">2-chunk regional mesh</a></li>
+                                    <li><a href="/specfem3dglobe/?class={{klass}}&action=new&nchunks=3">3-chunk regional mesh</a></li>
+                                    <li><a href="/specfem3dglobe/?class={{klass}}&action=new&nchunks=6">global mesh</a></li>
                                 </ul>
                             </dd>
                         </dl>
                         {% else %}
                         <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&action=new">New</a>
                         {% endifequal %}
+                        {% else %}
+                        <span class="actionButton disabled">New</span>
+                        {% endif %}
                     </td>
                     <td>
                         {% if uploadable %}
@@ -105,40 +103,44 @@
                         {% endif %}
                     </td>
                     <td>
-                        {% if obj %}
-                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&object={{obj.id}}&action=edit">Edit</a>
+                        {% if object %}
+                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&object={{object.id}}&action=edit">Edit</a>
                         {% else %}
                         <span class="actionButton disabled">Edit</span>
                         {% endif %}
                     </td>
                     <td>
-                        {% if obj %}
-                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&object={{obj.id}}&action=duplicate"><img src="/specfem3dglobe/images/dup_icon.gif"> Duplicate</a>
+                        {% if duplicatable %}
+                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&object={{object.id}}&action=duplicate"><img src="/specfem3dglobe/images/dup_icon.gif"> Duplicate</a>
                         {% else %}
                         <span class="actionButton disabled"><img src="/specfem3dglobe/images/dup_icon.gif"> Duplicate</span>
                         {% endif %}
                     </td>
                     <td>
-                        {% if obj %}
-                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&object={{obj.id}}&action=delete"><img src="/specfem3dglobe/images/delete_icon.gif"> Delete</a>
+                        {% if object %}
+                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}&object={{object.id}}&action=delete"><img src="/specfem3dglobe/images/delete_icon.gif"> Delete</a>
                         {% else %}
                         <span class="actionButton disabled"><img src="/specfem3dglobe/images/delete_icon.gif"> Delete</span>
                         {% endif %}
                     </td>
                     <td>
+                        {% if downloadable %}
                         <dl class="actionMenu" id="downloadMenu">
                             <dt class="actionMenuHeader">
                                 <a href="some_destination">&diams; Download</a>
                             </dt>
                             <dd class="actionMenuContent">
                                 <ul>
-                                    <li><a href="red"><img src="/specfem3dglobe/icons/document.gif" width=32 height=32> Text</a></li>
-                                    <li><a href="red"><img src="/specfem3dglobe/pics/kml.icon.gif"> Google Earth Map</a></li>
-                                    <li><a href="red"><img src="/specfem3dglobe/pics/adobe-pdf.icon.gif"> PDF</a></li>
-                                    <li><a href="red"><img src="/specfem3dglobe/images/ps.gif"> PostScript</a></li>
+                                    <li><a href="/specfem3dglobe/?class={{klass}}&object={{object.id}}&action=downloadAsText"><img src="/specfem3dglobe/icons/document.gif" width=32 height=32> Text</a></li>
+                                    <li><a href="/specfem3dglobe/?class={{klass}}&object={{object.id}}&action=downloadAsKML"><img src="/specfem3dglobe/pics/kml.icon.gif"> Google Earth Map</a></li>
+                                    <li><span class="actionMenuItem disabled"><img src="/specfem3dglobe/pics/adobe-pdf.icon.gif"> PDF</span></li>
+                                    <li><span class="actionMenuItem disabled"><img src="/specfem3dglobe/images/ps.gif"> PostScript</span></li>
                                 </ul>
                             </dd>
                         </dl>
+                        {% else %}
+                        <span class="actionButton disabled">Download</span>
+                        {% endif %}
                     </td>
                     <td>
                         <a class="actionButton" href="/specfem3dglobe/run/">Run Simulation</a>
@@ -146,6 +148,26 @@
                 </tr>
             </table>
         </td>
+        <td id=viewbar align=right>
+            <table>
+                <tr>
+                    <td>
+                        {% if object %}
+                        {% ifequal klass 'Source' %}
+                        <a class="actionButton" href="/specfem3dglobe/?class=Event&object={{object.obj.event.id}}#s{{object.id}}">List Item Select</a>
+                        {% else %}
+                        <a class="actionButton" href="/specfem3dglobe/?class={{klass}}#o{{object.id}}">List Item Select</a>
+                        {% endifequal %}
+                        {% else %}
+                        <span class="actionButton disabled">List Item Select</span>
+                        {% endif %}
+                    </td>
+                    <td>
+                        <span class="actionButton disabled">Show</span>
+                    </td>
+                </tr>
+            </table>
+        </td>
     </tr>
 </table>
 

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/register.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/register.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/register.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -5,7 +5,7 @@
 
 <p><a href="/specfem3dglobe/"><img id=logo src="/specfem3dglobe/pics/specfem3dg_logo.jpg" width=99 height=94>Home</a>
 
-<h1 class=titlebar>new user registration</h1>
+<h2>new user registration</h2>
 
 <p>To create a new account, simply fill-out the form below.
 

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/single_source_event_form.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,11 +1,11 @@
 
-<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} event</h2>
+<h2>{% if object %}edit{% else %}new{% endif %} 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="{{ action }}">
+<form method="post" action="/specfem3dglobe/">
     <input type="hidden" name="class" value="Event">
     {% if object %}
     <input type="hidden" name="object" value="{{object.id}}">

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_confirm_delete.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_confirm_delete.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_confirm_delete.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,13 +1,10 @@
 
-{% extends "SeismoWebPortal/events.html" %}
+<h2>delete source</h2>
 
-{% block content %}
-
-<h2 class=titlebar>delete source</h2>
-
-<form method="post" action="/specfem3dglobe/events/sources/{{ object.id }}/delete/">
+<form method="post" action="/specfem3dglobe/">
+    <input type="hidden" name="class" value="Source">
+    <input type="hidden" name="object" value="{{object.id}}">
+    <input type="hidden" name="action" value="delete">
     <p>Are you sure you want to delete the source "{{ object }}"?
     <p><input type="submit" value="Delete" />
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_detail.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_detail.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,21 +1,9 @@
 
-{% extends "SeismoWebPortal/events.html" %}
+<h2>{{ object }}</h2>
 
-{% block content %}
-
-<h2 class=titlebar>{{ object.eventName }}</h2>
-
-<div class=toolbar>
-    <form action="edit/" method="get"><input type="submit" value="Edit..." /></form>
-    <form action="delete/" method="get"><input type="submit" value="Delete" /></form>
-    [<a href="CMTSOLUTION.txt">download as text</a>]
-</div>
-
 <p id=sourceBeachballMw>{{ object.beachball }} M<sub>w</sub> &cong; {{ object.momentMagnitude|stringformat:".2f" }}</p>
 
 <div class=cmtsolution>
     <h3><code>CMTSOLUTION</code></h3>
     <pre>{{ object.cmtSolution }}</pre>
 </div>
-
-{% endblock %}

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_detail_gearth.kml
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_detail_gearth.kml	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_detail_gearth.kml	2008-05-10 01:55:18 UTC (rev 11942)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://earth.google.com/kml/2.0">
+    <Placemark>
+        <name><![CDATA[{{object.eventName}}]]></name>
+        <description><![CDATA[M<sub>w</sub> = {{ object.momentMagnitude|stringformat:".2f" }}]]></description>
+        <styleUrl>root://styleMaps#default+nicon=0x304+hicon=0x314</styleUrl>
+        <Point>
+            <coordinates>{{object.longitude}},{{object.latitude}},0</coordinates>
+        </Point>
+    </Placemark>
+</kml>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_form.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_form.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,15 +1,14 @@
 
-{% extends "SeismoWebPortal/events.html" %}
+<h2>edit source</h2>
 
-{% block content %}
-
-<h2 class=titlebar>edit source</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/sources/{{ object.id }}/edit/">
+<form method="post" action="/specfem3dglobe/">
+    <input type="hidden" name="class" value="Source">
+    <input type="hidden" name="object" value="{{object.id}}">
+    <input type="hidden" name="action" value="edit">
 
     <div class=tab30ex>
 
@@ -106,5 +105,3 @@
     </div> <!-- tab30ex -->
 
 </form>
-
-{% endblock %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_confirm_delete.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_confirm_delete.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_confirm_delete.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>delete mesh</h2>
+<h2>delete mesh</h2>
 
 <form method="post" action="/specfem3dglobe/">
     <input type="hidden" name="class" value="Specfem3DGlobeMesh">

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_detail.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_detail.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -0,0 +1,18 @@
+
+<h2>{{ object }}</h2>
+
+<dl class=parameters>
+    <dt>nchunks</dt><dd>{{ object.nchunks }}</dd>
+    <dt>nproc &eta;</dt><dd>{{ object.nproc_eta }}</dd>
+    <dt>nproc &xi;</dt><dd>{{ object.nproc_xi }}</dd>
+    <dt>nex &eta;</dt><dd>{{ object.nex_eta }}</dd>
+    <dt>nex &xi;</dt><dd>{{ object.nex_xi }}</dd>
+    {% ifnotequal object.nchunks 6 %}
+    <dt>angular width &eta;</dt><dd>{{ object.angular_width_eta }}&deg;</dd>
+    <dt>angular width &xi;</dt><dd>{{ object.angular_width_xi }}&deg;</dd>
+    <dt>center latitude</dt><dd>{{ object.center_latitude }}&deg;</dd>
+    <dt>center longitude</dt><dd>{{ object.center_longitude }}&deg;</dd>
+    <dt>&gamma; rotation azimuth</dt><dd>{{ object.gamma_rotation_azimuth }}&deg;</dd>
+    {% endifnotequal %}
+    <dt>shortest period</dt><dd>{{ object.shortestPeriod|stringformat:".0f" }}s</dd>
+</dl>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,6 +1,7 @@
 
 {% if object_list %}
     <table border=1 rules=groups>
+        <colgroup><col class=odd></colgroup>
         <colgroup><col class=even></colgroup>
         <colgroup><col class=odd><col class=even></colgroup>
         <colgroup><col class=odd><col class=even></colgroup>
@@ -12,6 +13,7 @@
 
         <thead>
         <tr>
+            <th rowspan=2></th>
             <th></th>
             <th colspan=2 class=colgroup>nproc</th>
             <th colspan=2 class=colgroup>nex</th>
@@ -38,7 +40,8 @@
 
         <tbody>
         {% for object in object_list %}
-        <tr class="{% cycle odd,even %}">
+        <tr class="{% cycle odd,even %}" id="o{{object.id}}">
+            <td><a href="/specfem3dglobe/?class=Specfem3DGlobeMesh&object={{object.id}}">xxx</a></td>
             <td class=int>{{ object.nchunks }}</td>
             <td class=int>{{ object.nproc_eta }}</td>
             <td class=int>{{ object.nproc_xi }}</td>
@@ -64,5 +67,5 @@
 
     </table>
 {% else %}
-    <p>You have no meshes.
+    <p>You have no Specfem 3D Globe meshes.
 {% endif %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_confirm_delete.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_confirm_delete.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_confirm_delete.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>delete specfem 3d globe parameters</h2>
+<h2>delete specfem 3d globe parameters</h2>
 
 <form method="post" action="/specfem3dglobe/">
     <input type="hidden" name="class" value="Specfem3DGlobeParameters">

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_detail.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,19 +1,13 @@
 
-<h2 class=titlebar>{{ object.name }}</h2>
+<h2>{{ object }}</h2>
 
-<div class=toolbar>
-    <form action="edit/" method="get"><input type="submit" value="Edit..." /></form>
-    <form action="delete/" method="get"><input type="submit" value="Delete" /></form>
-</div>
-
-<div class=properties>
-
-    <div class=box>
-    <dl>
-        <dt>type</dt><dd>{% ifequal object.mesh.nchunks 6 %}global{% else %}regional{% endifequal %}</dd>
-        <dt>mesh</dt><dd><a href="../../specfem3dglobemeshes/{{ object.mesh.id }}/">{{ object.mesh }}</a></dd>
-        <dt>model</dt><dd>{{ object.get_model_display }}</dd>
-    </dl>
-    </div>
-
-</div>
+<dl class=parameters>
+    <dt>mesh</dt><dd><a href="/specfem3dglobe/?class=Specfem3DGlobeMesh&object={{object.mesh.id}}">{{ object.mesh }}</a></dd>
+    <dt>model</dt><dd>{{ object.get_model_display }}</dd>
+    <dt>oceans</dt><dd>{{ object.oceans }}</dd>
+    <dt>gravity</dt><dd>{{ object.gravity }}</dd>
+    <dt>attenuation</dt><dd>{{ object.attenuation }}</dd>
+    <dt>topography</dt><dd>{{ object.topography }}</dd>
+    <dt>rotation</dt><dd>{{ object.rotation }}</dd>
+    <dt>ellipticity</dt><dd>{{ object.ellipticity }}</dd>
+</dl>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,22 +1,6 @@
 
-<h2 class=titlebar>{% if object %}edit{% else %}new{% endif %} Specfem 3D Globe parameters</h2>
+<h2>{% if object %}edit{% else %}new{% endif %} Specfem 3D Globe parameters</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/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -3,6 +3,7 @@
     <table rules=cols>
         <thead>
         <tr>
+            <th></th>
             <th>mesh</th>
             <th>model</th>
             <th>oceans</th>
@@ -16,16 +17,17 @@
         
         <tbody>
         {% for object in object_list %}
-        <tr class="{% cycle odd,even %}">
-            <td><a href="/specfem3dglobe/specfem3dglobemeshes/{{ object.mesh.id }}/">{{ object.mesh }}</a><br>
+        <tr class="{% cycle odd,even %}" id="o{{object.id}}">
+            <td><a href="/specfem3dglobe/?class=Specfem3DGlobeParameters&object={{object.id}}">xxx</a></td>
+            <td>{{ object.mesh }}<br>
                 <span class=inlineInfo>shortest period &cong; {{ object.mesh.shortestPeriod|stringformat:".0f" }}s</span></td>
             <td>{{ object.get_model_display }}</td>
-            <td><span class={{ object.oceans }}>{{ object.oceans }}</span></td>
-            <td><span class={{ object.gravity }}>{{ object.gravity }}</span></td>
-            <td><span class={{ object.attenuation }}>{{ object.attenuation }}</span></td>
-            <td><span class={{ object.topography }}>{{ object.topography }}</span></td>
-            <td><span class={{ object.rotation }}>{{ object.rotation }}</span></td>
-            <td><span class={{ object.ellipticity }}>{{ object.ellipticity }}</span></td>
+            <td><img src="/specfem3dglobe/pics/icon-{% if object.oceans %}yes{% else %}no{% endif %}.gif" alt="{{ object.oceans }}"></td>
+            <td><img src="/specfem3dglobe/pics/icon-{% if object.gravity %}yes{% else %}no{% endif %}.gif" alt="{{ object.gravity }}"></td>
+            <td><img src="/specfem3dglobe/pics/icon-{% if object.attenuation %}yes{% else %}no{% endif %}.gif" alt="{{ object.attenuation }}"></td>
+            <td><img src="/specfem3dglobe/pics/icon-{% if object.topography %}yes{% else %}no{% endif %}.gif" alt="{{ object.topography }}"></td>
+            <td><img src="/specfem3dglobe/pics/icon-{% if object.rotation %}yes{% else %}no{% endif %}.gif" alt="{{ object.rotation }}"></td>
+            <td><img src="/specfem3dglobe/pics/icon-{% if object.ellipticity %}yes{% else %}no{% endif %}.gif" alt="{{ object.ellipticity }}"></td>
         </tr>
         {% endfor %}
         </tbody>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_confirm_delete.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_confirm_delete.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_confirm_delete.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>delete station list</h2>
+<h2>delete station list</h2>
 
 <form method="post" action="/specfem3dglobe/">
     <input type="hidden" name="class" value="StationList">

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_detail.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,11 +1,6 @@
 
-<h2 class=titlebar>{{ object.name }}</h2>
+<h2>{{ object.name }}</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>
-    [<a href="stations.txt">download as text</a>]
-</div>
-
 <p class=infobar>{{ object.station_set.count }} station{{ object.station_set.count|pluralize }}
 
 {% if object.station_set.count %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_form.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_form.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>rename station list</h2>
+<h2>rename station list</h2>
 
 {% if form.has_errors %}
 <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_list.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_list.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -10,7 +10,7 @@
 
         <tbody>
         {% for object in object_list %}
-        <tr class="{% cycle odd,even %}">
+        <tr class="{% cycle odd,even %}" id="o{{object.id}}">
             <td><a href="/specfem3dglobe/?class=StationList&object={{object.id}}">{{ object.name }}</a></td>
             <td>{{ object.station_set.count }}</td>
         </tr>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,5 +1,5 @@
 
-<h2 class=titlebar>upload station list</h2>
+<h2>upload station list</h2>
 
 <div class=toolbar>
     <form method="post" action="/specfem3dglobe/help/toggle/">

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/userinfo_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/userinfo_form.html	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/userinfo_form.html	2008-05-10 01:55:18 UTC (rev 11942)
@@ -3,7 +3,7 @@
 
 {% block content %}
 
-<h1 class=titlebar>profile</h1>
+<h2>profile</h2>
 
 <div class=tabs>
     <ul>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/urls.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/urls.py	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/urls.py	2008-05-10 01:55:18 UTC (rev 11942)
@@ -1,94 +1,24 @@
 
 import os
-
-from django.conf.urls.defaults import *
 import models
+from django.conf.urls.defaults import *
 
-# Static Paths
+
 STATIC_ROOT = os.path.join(os.path.dirname(__file__), "static")
 
 
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Generic
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-def list_detail_args(ModelClass):
-    return dict(
-        queryset = ModelClass.objects.all(),
-        allow_empty = True,
-        )
-
-def cu_args(ModelClass, subdir):
-    return dict(
-        model = ModelClass,
-        post_save_redirect = ('/specfem3dglobe/%s/' % subdir),
-        )
-
-def delete_args(ModelClass, subdir):
-    return dict(
-        model = ModelClass,
-        post_delete_redirect = ('/specfem3dglobe/%s/' % subdir),
-        )
-
-def upload_args(ModelClass):
-    return dict(
-        ModelClass = ModelClass,
-        )
-
-
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Registration
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-password_change_args = {
-    'template_name': 'SeismoWebPortal/password_change_form.html',
-}
-
-
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Events
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-event_detail_args = {
-    'queryset': models.Event.objects.all(),
-    'extra_context': { 'object_list': models.Event.objects.all() },
-}
-
-source_detail_args = {
-    'queryset': models.Source.objects.all(),
-}
-
-
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# URLs
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
 urlpatterns = patterns('',
     (r'^$', 'SeismoWebPortal.views.root'),
 
     (r'^login/$', 'SeismoWebPortal.views.login_view'),
     (r'^logout/$', 'SeismoWebPortal.views.logout_view'),
     (r'^pwreset/$', 'SeismoWebPortal.views.password_reset'),
-    (r'^pwreset/done/$', 'django.views.generic.simple.direct_to_template', { 'template': 'registration/pwreset_done.html'}),
+    (r'^pwreset/done/$', 'django.views.generic.simple.direct_to_template', dict(template = 'registration/pwreset_done.html')),
     
     (r'^registration/$', 'SeismoWebPortal.views.registration'),
-    (r'^registration/password/$', 'SeismoWebPortal.views.password_change', password_change_args),
+    (r'^registration/password/$', 'SeismoWebPortal.views.password_change', dict(template_name = 'SeismoWebPortal/password_change_form.html')),
 
-    (r'^specfem3dglobemeshes/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.Specfem3DGlobeMesh)),
-    (r'^specfem3dglobemeshes/create/$', 'SeismoWebPortal.views.create_mesh'),
-    (r'^specfem3dglobemeshes/create/(?P<nchunks>\d+)/$', 'SeismoWebPortal.views.manipulate_mesh', dict(action='create')),
-    (r'^specfem3dglobemeshes/(?P<object_id>\d+)/$', 'SeismoWebPortal.views.manipulate_mesh', dict(action='edit')),
-    (r'^specfem3dglobemeshes/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.Specfem3DGlobeMesh, 'specfem3dglobemeshes')),
-
-    (r'^specfem3dglobeparameters/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.Specfem3DGlobeParameters)),
-    (r'^specfem3dglobeparameters/create/$', 'django.views.generic.create_update.create_object', cu_args(models.Specfem3DGlobeParameters, 'specfem3dglobeparameters')),
-    (r'^specfem3dglobeparameters/(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', {'queryset': models.Specfem3DGlobeParameters.objects.all()}),
-    (r'^specfem3dglobeparameters/(?P<object_id>\d+)/edit/$', 'django.views.generic.create_update.update_object', cu_args(models.Specfem3DGlobeParameters, 'specfem3dglobeparameters')),
-    (r'^specfem3dglobeparameters/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.Specfem3DGlobeParameters, 'specfem3dglobeparameters')),
-
+    # input files downloaded by daemon
     (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/par_file\.txt$', 'SeismoWebPortal.views.par_file'),
     (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/parameters\.pml$', 'SeismoWebPortal.views.parameters_pml'),
     (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/stations\.txt$', 'SeismoWebPortal.views.stations_txt'),
@@ -98,47 +28,9 @@
     (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/mineos/stations\.site$', 'SeismoWebPortal.views.mineos_stations_site'),
     (r'^specfem3dglobeparameters/(?P<sim_id>\d+)/mineos/stations\.sitechan$', 'SeismoWebPortal.views.mineos_stations_sitechan'),
 
-    (r'^mineosparameters/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.MineosParameters)),
-    (r'^mineosparameters/create/$', 'django.views.generic.create_update.create_object', cu_args(models.MineosParameters, 'mineosparameters')),
-    (r'^mineosparameters/(?P<object_id>\d+)/$', 'django.views.generic.create_update.update_object', cu_args(models.MineosParameters, 'mineosparameters')),
-    (r'^mineosparameters/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.MineosParameters, 'mineosparameters')),
-
-    (r'^mineosmodecatalogs/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.MineosModeCatalog)),
-    (r'^mineosmodecatalogs/create/$', 'django.views.generic.create_update.create_object', cu_args(models.MineosModeCatalog, 'mineosmodecatalogs')),
-    (r'^mineosmodecatalogs/(?P<object_id>\d+)/$', 'django.views.generic.create_update.update_object', cu_args(models.MineosModeCatalog, 'mineosmodecatalogs')),
-    (r'^mineosmodecatalogs/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.MineosModeCatalog, 'mineosmodecatalogs')),
-
-    (r'^mineosmodels/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.MineosModel)),
-    (r'^mineosmodels/upload/$', 'SeismoWebPortal.views.upload', upload_args(models.MineosModel)),
-    (r'^mineosmodels/(?P<object_id>\d+)/$', 'django.views.generic.create_update.update_object', cu_args(models.MineosModel, 'mineosmodels')),
-    (r'^mineosmodels/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.MineosModel, 'mineosmodels')),
-
-    # events
-    (r'^events/$', 'django.views.generic.list_detail.object_list', list_detail_args(models.Event)),
-    (r'^events/search/$', 'SeismoWebPortal.views.event_search'),
-    (r'^events/create/$', 'SeismoWebPortal.views.manipulate_event', dict(action='create')),
-    (r'^events/upload/$', 'SeismoWebPortal.views.upload', upload_args(models.Event)),
-    (r'^events/sources/(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', source_detail_args),
-    (r'^events/sources/(?P<object_id>\d+)/edit/$', 'django.views.generic.create_update.update_object', cu_args(models.Source, 'events')),
-    (r'^events/sources/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.Source, 'events')),
-    (r'^events/sources/(?P<object_id>\d+)/CMTSOLUTION\.txt$', 'SeismoWebPortal.views.cmtsolution_txt'),
-    (r'^events/sources/(?P<object_id>\d+)/beachball\.gif$', 'SeismoWebPortal.views.beachball_gif'),
-    (r'^events/(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', event_detail_args),
-    (r'^events/(?P<object_id>\d+)/edit/$', 'SeismoWebPortal.views.manipulate_event', dict(action='edit')),
-    (r'^events/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.Event, 'events')),
-    (r'^events/(?P<object_id>\d+)/CMTSOLUTION\.txt$','SeismoWebPortal.views.event_detail_cmtsolution_txt'),
-    (r'^events/(?P<object_id>\d+)/gearth\.kml$','SeismoWebPortal.views.event_detail_gearth'),
-
-    # stations
-    (r'^stations/upload/$', 'SeismoWebPortal.views.upload', upload_args(models.StationList)),
-    (r'^stations/(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', {'queryset': models.StationList.objects.all()}),
-    (r'^stations/(?P<object_id>\d+)/edit/$', 'django.views.generic.create_update.update_object', cu_args(models.StationList, 'stations')),
-    (r'^stations/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', delete_args(models.StationList, 'stations')),
-    (r'^stations/(?P<object_id>\d+)/stations\.txt$','SeismoWebPortal.views.stationlist_detail_txt'),
-    (r'^stations/(?P<object_id>\d+)/gearth\.kml$','SeismoWebPortal.views.stationlist_detail_gearth'),
-
     # runs
-    (r'^runs/list\.py$', 'django.views.generic.list_detail.object_list', dict(list_detail_args(models.Run),
+    (r'^runs/list\.py$', 'django.views.generic.list_detail.object_list', dict(queryset = models.Run.objects.all(),
+                                                                              allow_empty = True,
                                                                               template_name='SeismoWebPortal/run_list.py',
                                                                               mimetype='text/plain')),
     (r'^runs/(?P<object_id>\d+)/status/$', 'SeismoWebPortal.views.update_run_status'),
@@ -153,7 +45,7 @@
     # help
     (r'^help/toggle/$', 'SeismoWebPortal.views.help_toggle'),
 
-    (r'^(.*)', 'django.views.static.serve', {'document_root': STATIC_ROOT}),
+    (r'^(.*)', 'django.views.static.serve', dict(document_root = STATIC_ROOT)),
 )
 
 

Modified: cs/portal/trunk/northridge/SeismoWebPortal/views.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/views.py	2008-05-10 00:17:57 UTC (rev 11941)
+++ cs/portal/trunk/northridge/SeismoWebPortal/views.py	2008-05-10 01:55:18 UTC (rev 11942)
@@ -30,69 +30,89 @@
 
 
 def root(request):
+    from django.template import loader, Context
+    
     if request.user.is_anonymous():
         return render_to_response('SeismoWebPortal/splash.html', {},
                                   RequestContext(request, {}))
 
     className = request.REQUEST.get('class')
-    if className is None:
-        return render_to_response('SeismoWebPortal/home.html',
-                                  {},
-                                  RequestContext(request, dict(iconbar = iconbar('home'))))
-
-    try:
-        Class = getattr(mezzanine, className)
-    except AttributeError:
-        raise Http404
-
-    ret = None
+    Class = None
     obj = None
+    ret = None
+    creatable = False
+    uploadable = False
+    downloadable = False
+    duplicatable = False
+    klass = None
     
-    objId = request.REQUEST.get('object')
-    action = request.REQUEST.get('action')
-    
-    if objId is None:
-        if action is None:
-            ret = Class.list(request)
-        elif action == 'new':
-            ret = Class.create(request)
-        elif action == 'upload':
-            ret = Class.upload(request, post_save_redirect = "/specfem3dglobe/")
-        elif action == 'search':
-            ret = Class.search(request)
+    if className is None:
+        t = loader.get_template('SeismoWebPortal/home.html')
+        ret = t.render({})
 
     else:
+
         try:
-            objId = int(objId)
-        except ValueError:
+            Class = getattr(mezzanine, className)
+        except AttributeError:
             raise Http404
 
-        obj = Class(objId)
+        objId = request.REQUEST.get('object')
+        action = request.REQUEST.get('action')
 
-        if action is None:
-            ret = obj.detail(request)
-        elif action == 'edit':
-            ret = obj.update(request)
-        elif action == 'delete':
-            ret = obj.delete(request, "/specfem3dglobe/")
+        if objId is None:
+            if action is None:
+                ret = Class.list(request)
+            elif action == 'new':
+                ret = Class.create(request)
+            elif action == 'upload':
+                ret = Class.upload(request)
+            elif action == 'search':
+                ret = Class.search(request)
 
-    if ret is None:
-        raise Http404
+        else:
+            try:
+                objId = int(objId)
+            except ValueError:
+                raise Http404
 
-    if isinstance(ret, HttpResponse):
-        return ret
+            obj = Class(objId)
+            downloadable = obj.downloadable
+            duplicatable = obj.duplicatable
 
-    from django.template import loader, Context
+            if action is None:
+                ret = obj.detail(request)
+            elif action == 'edit':
+                ret = obj.update(request)
+            elif action == 'duplicate':
+                ret = obj.duplicate(request)
+            elif action == 'delete':
+                ret = obj.delete(request)
+            elif action == 'downloadAsText':
+                ret = obj.downloadAsText(request)
+            elif action == 'downloadAsKML':
+                ret = obj.downloadAsKML(request)
+
+        if ret is None:
+            raise Http404
+
+        if isinstance(ret, HttpResponse):
+            return ret
+
+        creatable = Class.creatable
+        uploadable = Class.uploadable
+        klass = Class.__name__
+
     response = HttpResponse(mimetype='text/html')
     t = loader.get_template('SeismoWebPortal/pluggable.html')
     c = RequestContext(request, dict(
-        toolbar = toolbar(Class, obj),
-        iconbar = iconbar(Class),
-        title = Class.title(),
         content = ret,
-        klass = Class.__name__,
-        obj = obj,
-        uploadable = hasattr(Class, 'FileFormat'),
+        klass = klass,
+        object = obj,
+        creatable = creatable,
+        uploadable = uploadable,
+        downloadable = downloadable,
+        duplicatable = duplicatable,
         ))
     response.write(t.render(c))
     return response
@@ -115,42 +135,6 @@
     return
 
 
-def toolbar(Class, obj):
-    from StringIO import StringIO
-    html = StringIO()
-    print >>html, '<div class=toolbar><ul>'
-    for action in ['new', 'upload', 'search']:
-        print >>html, ('<a href="/specfem3dglobe/?class=%s&action=%s">%s</a>' %
-                       (Class.__name__, action, action))
-    if obj:
-        for action in ['edit', 'delete']:
-            print >>html, ('<a href="/specfem3dglobe/?class=%s&object=%d&action=%s">%s</a>' %
-                           (Class.__name__, obj.obj.id, action, action))
-    print >>html, '</ul></div>'
-    return html.getvalue()
-
-
-def iconbar(selected):
-    from StringIO import StringIO
-    html = StringIO()
-    print >>html, '<div class=iconbar><ul>'
-    print >>html, ('<li class="%s"><a href="/specfem3dglobe/">home</a></li>' %
-                   (selected == "home" and "selected" or ""))
-    for i, Class in enumerate(mezzanine.classes):
-        cssClass = ""
-        if Class is selected:
-            cssClass = "selected"
-        url = '/specfem3dglobe/?class=%s' % Class.__name__
-        title = Class.title()
-        print >>html, ('<li class="%s"><a href="%s">%s</a></li>' %
-                       (cssClass, url, title)
-                       )
-    print >>html, ('<li class="%s"><a href="/specfem3dglobe/registration/">profile</a></li>' %
-                   (selected == "profile" and "selected" or ""))
-    print >>html, '</ul></div>'
-    return html.getvalue()
-
-
 def par_file(request, sim_id):
     from django.template import loader, Context
 
@@ -253,14 +237,6 @@
     return response
 
 
-def write_stations(stations, response):
-    for station in stations:
-        response.write("%-5s %-3s %8.4f %10.4f %6.1f %6.1f\n" %
-                       (station.code, station.network.code,
-                        station.latitude, station.longitude, station.elevation, station.bur))
-    return
-
-
 def stations_txt(request, sim_id):
     response = HttpResponse(mimetype='text/plain')
 
@@ -272,17 +248,6 @@
     return response
 
 
-def stationlist_detail_txt(request, object_id):
-    response = HttpResponse(mimetype='text/plain')
-
-    l = get_object_or_404(models.StationList, id=object_id)
-    stations = l.station_set.all()
-
-    write_stations(stations, response)
-
-    return response
-
-
 def update_run_status(request, object_id):
     from forms import RunStatusManipulator
     import datetime
@@ -448,7 +413,7 @@
     # Populate the FormWrapper.
     form = forms.FormWrapper(manipulator, new_data, errors, edit_inline = True)
     
-    return render_to_response(template, { 'form': form, 'iconbar': iconbar('profile') }, RequestContext(request, {}))
+    return render_to_response(template, { 'form': form }, RequestContext(request, {}))
 
 
 def notify_managers_of_new_user(request, user):
@@ -499,167 +464,15 @@
             form.save(new_data)
             request.user.message_set.create(message="Your password has been changed.")
             return HttpResponseRedirect('/specfem3dglobe/')
-    return render_to_response(template_name, {'form': forms.FormWrapper(form, new_data, errors),
-                                              'iconbar': iconbar('profile')},
+    return render_to_response(template_name, {'form': forms.FormWrapper(form, new_data, errors)},
         context_instance=RequestContext(request))
 
 password_change = login_required(password_change)
 
 
-def create_mesh(request):
 
-    if request.method != 'POST':
-        return HttpResponseRedirect('/specfem3dglobe/specfem3dglobemeshes/')
-        
-    nchunks = int(request.POST['nchunks'])
-    return HttpResponseRedirect('/specfem3dglobe/specfem3dglobemeshes/create/%d/' % nchunks)
 
-create_mesh = login_required(create_mesh)
-
-
-
-def manipulate_mesh(request, action=None, nchunks=None, object_id=None):
-    from forms import MeshAddManipulator, MeshChangeManipulator
-    
-    if nchunks is None:
-        mesh = get_object_or_404(models.Specfem3DGlobeMesh, id=object_id)
-        nchunks = mesh.nchunks
-    else:
-        mesh = None
-        nchunks = int(nchunks)
-    
-    if action == "create":
-        manipulator = MeshAddManipulator(nchunks)
-    elif action == "edit":
-        manipulator = MeshChangeManipulator(nchunks, object_id)
-    else:
-        raise Http404
-
-    if nchunks == 1:
-        template = 'SeismoWebPortal/mesh_form_1chunk.html'
-    elif nchunks == 2:
-        template = 'SeismoWebPortal/mesh_form_2chunks.html'
-    elif nchunks == 3:
-        template = 'SeismoWebPortal/mesh_form_3chunks.html'
-    elif nchunks == 6:
-        template = 'SeismoWebPortal/mesh_form_global.html'
-    else:
-        assert False
-
-    help_visible = get_help_visible(request)
-
-    if request.method == 'POST':
-        new_data = request.POST.copy()
-        errors = {}
-        if new_data.has_key('show_help'):
-            help_visible = True
-            request.session['help_visible'] = help_visible
-        elif new_data.has_key('hide_help'):
-            help_visible = False
-            request.session['help_visible'] = help_visible
-        else:
-            errors = manipulator.get_validation_errors(new_data)
-            if not errors:
-                manipulator.do_html2python(new_data)
-                manipulator.save(new_data)
-                if not errors:
-                    return HttpResponseRedirect('/specfem3dglobe/specfem3dglobemeshes/')
-    else:
-        # Populate new_data with a 'flattened' version of the current data.
-        new_data = manipulator.flatten_data()
-        errors = {}
-
-    # Populate the FormWrapper.
-    form = forms.FormWrapper(manipulator, new_data, errors, edit_inline = True)
-    
-    return render_to_response(template,
-                              { 'form': form,
-                                'nchunks': nchunks,
-                                'help_visible': help_visible,
-                                'object': mesh,
-                                'action': request.path,
-                                },
-                              RequestContext(request, {}))
-
-manipulate_mesh = login_required(manipulate_mesh)
-
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Events
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-def event_detail_gearth(request, object_id):
-    event = get_object_or_404(models.Event, id=object_id)
-    return gearth_object_list(request,
-                              queryset = event.source_set.all(),
-                              template_name = 'SeismoWebPortal/event_detail_gearth.kml',
-                              extra_context = {'name': event.name},
-                              )
-
-def beachball_gif(request, object_id):
-    source = get_object_or_404(models.Source, id=object_id)
-    return HttpResponseRedirect(source.beachballUrl())
-
-def cmtsolution_txt(request, object_id):
-    source = get_object_or_404(models.Source, id=object_id)
-    response = HttpResponse(mimetype='text/plain')
-    response.write(str(source.cmtSolution()))
-    return response
-
-def event_detail_cmtsolution_txt(request, object_id):
-
-    response = HttpResponse(mimetype='text/plain')
-
-    event = get_object_or_404(models.Event, id=object_id)
-
-    count = event.source_set.count()
-    for event in event.source_set.all():
-        cmtSolution = cmt.CMTSolution.createFromDBModel(event)
-        response.write(str(cmtSolution))
-
-    return response
-
-
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Stations
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-def station_index(request):
-    station_lists = models.StationList.objects.all()
-    return render_to_response('SeismoWebPortal/station_index.html',
-                              {'station_lists': station_lists },
-                              RequestContext(request, {}))
-station_index = login_required(station_index)
-
-
-def stationlist_detail_gearth(request, object_id):
-    stationList = get_object_or_404(models.StationList, id=object_id)
-    kwds = dict(queryset = stationList.station_set.all(),
-                extra_context = {'name': stationList.name})
-    return station_list_gearth(request, **kwds)
-
-
-
-# support code
-
-
-# move to shared location
-def gearth_object_list(request, **kwds):
-    from django.views.generic.list_detail import object_list
-    return object_list(request,
-                       mimetype='application/vnd.google-earth',
-                       **kwds)
-
-
-def station_list_gearth(request, **kwds):
-    return gearth_object_list(request,
-                              template_name='SeismoWebPortal/station_list_gearth.kml',
-                              **kwds)
-
-
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Help
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 



More information about the cig-commits mailing list