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

leif at geodynamics.org leif at geodynamics.org
Tue May 20 20:35:33 PDT 2008


Author: leif
Date: 2008-05-20 20:35:33 -0700 (Tue, 20 May 2008)
New Revision: 11989

Added:
   cs/portal/trunk/northridge/SeismoWebPortal/static/images/rocket.gif
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_confirm_delete.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_detail.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_list.html
Modified:
   cs/portal/trunk/northridge/SeismoWebPortal/forms.py
   cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py
   cs/portal/trunk/northridge/SeismoWebPortal/models.py
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_map.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/mineosparameters_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_map.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.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_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/style.css
Log:
Sketched 'Run' pages.  Use 'User.message_set' once again (but threw
out Django's messages because they sound robotic).  New, consistent
look for buttons/menus.  Added 'onclick' to table rows.  Gave all
objects names once again, abandoning my plan to create an anonymous
UI.


Modified: cs/portal/trunk/northridge/SeismoWebPortal/forms.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/forms.py	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/forms.py	2008-05-21 03:35:33 UTC (rev 11989)
@@ -2,6 +2,7 @@
 from django import forms
 from django.contrib.auth import authenticate, login
 from django.contrib.auth.models import User
+from django.contrib.contenttypes.models import ContentType
 from django.core import validators
 
 import cmt
@@ -84,6 +85,81 @@
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
+class RunManipulator(forms.Manipulator):
+
+    def __init__(self, objId=None):
+        from django.db.models import BLANK_CHOICE_DASH as blank
+
+        super(RunManipulator, self).__init__()
+        if objId:
+            self.obj = models.Run.objects.get(id = objId)
+        else:
+            self.obj = None
+        
+        self.selectFields = [
+            ('event', blank + [(x.id, str(x)) for x in models.Event.objects.all()]),
+            ('stationList', blank + [(x.id, str(x)) for x in models.StationList.objects.all()]),
+            ]
+
+        parametersChoices = list(blank)
+        for ModelClass in [models.Specfem3DGlobeParameters, models.MineosParameters]:
+            ctype = ContentType.objects.get_for_model(ModelClass)
+            for obj in ModelClass.objects.all():
+                value = "%d,%d" % (ctype.id, obj.id)
+                title = str(obj)
+                parametersChoices.append((value, title))
+        self.selectFields.append(
+            ('parameters', parametersChoices)
+            )
+
+        self.fields = [
+            forms.SelectField(fieldName, is_required=True, choices=choices)
+            for fieldName, choices in self.selectFields
+            ]
+        
+        return
+
+    def flatten_data(self):
+        data = {}
+        obj = self.obj
+        if obj:
+            for fieldName, choices in self.selectFields:
+                value = getattr(obj, fieldName)
+                if fieldName == 'parameters':
+                    ctype = ContentType.objects.get_for_model(value.__class__)
+                    value = "%d,%d" % (ctype.id, value.id)
+                else:
+                    value = value.id
+                data[fieldName] = value
+        else:
+            for fieldName, choices in self.selectFields:
+                if len(choices) == 2:
+                    data[fieldName] = choices[1][0]
+        return data
+
+    def save(self, new_data):
+        event = models.Event.objects.get(id = int(new_data['event']))
+        stationList = models.StationList.objects.get(id = int(new_data['stationList']))
+        parametersType, parametersId = map(int, new_data['parameters'].split(','))
+        parametersType = ContentType.objects.get(id = parametersType)
+        
+        obj = self.obj
+        if obj:
+            obj.event = event
+            obj.stationList = stationList
+            obj.parametersType = parametersType
+            obj.parametersId = parametersId
+            obj.save()
+        else:
+            obj = models.Run.objects.create(
+                event = event,
+                stationList = stationList,
+                parametersType = parametersType,
+                parametersId = parametersId,
+            )
+        return obj
+
+
 class RunStatusManipulator(forms.Manipulator):
 
     def __init__(self):

Modified: cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/mezzanine.py	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,14 +1,12 @@
 
 
-from django.template import loader, RequestContext
 from django import oldforms
 from django.db.models import FileField
 from django.contrib.auth.views import redirect_to_login
-from django.template import RequestContext
+from django.template import loader, Context
 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
 
 import cmt
@@ -30,7 +28,7 @@
     @classmethod
     def create(cls, request, template_name=None,
                template_loader=loader, extra_context=None, post_save_redirect=None,
-               login_required=False, follow=None, context_processors=None):
+               login_required=False):
         """
         Generic object-creation function.
 
@@ -44,7 +42,7 @@
         if login_required and not request.user.is_authenticated():
             return redirect_to_login(request.path)
 
-        manipulator = model.AddManipulator(follow=follow)
+        manipulator = cls.addManipulator()
         if request.POST:
             # If data was POSTed, we're trying to create a new object
             new_data = request.POST.copy()
@@ -61,7 +59,7 @@
                 new_object = manipulator.save(new_data)
 
                 if request.user.is_authenticated():
-                    request.user.message_set.create(message=gettext("The %(verbose_name)s was created successfully.") % {"verbose_name": model._meta.verbose_name})
+                    request.user.message_set.create(message = 'Created "%s".' % new_object)
 
                 # Redirect to the new object: first by trying post_save_redirect,
                 # then by obj.get_absolute_url; fail if neither works.
@@ -81,11 +79,11 @@
         if not template_name:
             template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
         t = template_loader.get_template(template_name)
-        c = RequestContext(request, {
+        c = Context({
             'form': form,
             'action': request.path,
             'root': request.root,
-        }, context_processors)
+        })
         for key, value in extra_context.items():
             if callable(value):
                 c[key] = value()
@@ -96,7 +94,7 @@
     def update(self, request,
                template_name=None, template_loader=loader,
                extra_context=None, post_save_redirect=None,
-               login_required=False, follow=None, context_processors=None,
+               login_required=False,
                template_object_name='object'):
         """
         Generic object-update function.
@@ -115,7 +113,7 @@
         model = self.Model
         object = self.obj
 
-        manipulator = model.ChangeManipulator(getattr(object, object._meta.pk.attname), follow=follow)
+        manipulator = self.changeManipulator()
 
         if request.POST:
             new_data = request.POST.copy()
@@ -127,7 +125,7 @@
                 object = manipulator.save(new_data)
 
                 if request.user.is_authenticated():
-                    request.user.message_set.create(message=gettext("The %(verbose_name)s was updated successfully.") % {"verbose_name": model._meta.verbose_name})
+                    request.user.message_set.create(message = 'Saved "%s".' % object)
 
                 # Do a post-after-redirect so that reload works, etc.
                 if post_save_redirect:
@@ -145,12 +143,12 @@
         if not template_name:
             template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
         t = template_loader.get_template(template_name)
-        c = RequestContext(request, {
+        c = Context({
             'form': form,
             template_object_name: object,
             'action': request.path,
             'root': request.root,
-        }, context_processors)
+        })
         for key, value in extra_context.items():
             if callable(value):
                 c[key] = value()
@@ -161,7 +159,7 @@
     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'):
+               login_required=False, template_object_name='object'):
         """
         Generic object-delete function.
 
@@ -182,9 +180,10 @@
         object = self.obj
 
         if request.method == 'POST':
+            message = 'Deleted "%s".' % object
             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})
+                request.user.message_set.create(message = message)
             if post_delete_redirect:
                 return HttpResponseRedirect(post_delete_redirect)
             else:
@@ -193,11 +192,11 @@
             if not template_name:
                 template_name = "%s/%s_confirm_delete.html" % (model._meta.app_label, model._meta.object_name.lower())
             t = template_loader.get_template(template_name)
-            c = RequestContext(request, {
+            c = Context({
                 template_object_name: object,
                 'action': request.path,
                 'root': request.root,
-            }, context_processors)
+            })
             for key, value in extra_context.items():
                 if callable(value):
                     c[key] = value()
@@ -208,7 +207,7 @@
     @classmethod
     def list(cls, request, paginate_by=None, page=None,
              allow_empty=True, template_name=None, template_loader=loader,
-             extra_context=None, context_processors=None, template_object_name='object',
+             extra_context=None, template_object_name='object',
              ):
         """
         Generic list of objects.
@@ -258,7 +257,7 @@
                     object_list = []
                 else:
                     raise Http404
-            c = RequestContext(request, {
+            c = Context({
                 '%s_list' % template_object_name: object_list,
                 'is_paginated': paginator.pages > 1,
                 'results_per_page': paginate_by,
@@ -272,13 +271,13 @@
                 'pages': paginator.pages,
                 'hits' : paginator.hits,
                 'root': request.root,
-            }, context_processors)
+            })
         else:
-            c = RequestContext(request, {
+            c = Context({
                 '%s_list' % template_object_name: queryset,
                 'is_paginated': False,
                 'root': request.root,
-            }, context_processors)
+            })
             if not allow_empty and len(queryset) == 0:
                 raise Http404
         for key, value in extra_context.items():
@@ -295,7 +294,7 @@
     def detail(self, request, view,
                template_name=None, template_name_field=None,
                template_loader=loader, extra_context=None,
-               context_processors=None, template_object_name='object',
+               template_object_name='object',
                ):
         """
         Generic detail of an object.
@@ -315,10 +314,10 @@
             t = template_loader.select_template(template_name_list)
         else:
             t = template_loader.get_template(template_name)
-        c = RequestContext(request, {
+        c = Context({
             template_object_name: obj,
             'root': request.root,
-        }, context_processors)
+        })
         for key, value in extra_context.items():
             if callable(value):
                 c[key] = value()
@@ -328,12 +327,17 @@
 
     def duplicate(self, request):
         dup = self._duplicate()
+        if request.user.is_authenticated():
+            request.user.message_set.create(message = 'Editing a new copy of "%s".' % self.obj)
         return HttpResponseRedirect(self.urlForObject(dup, request.root, action = 'edit'))
     
     def _duplicate(self):
         from copy import copy
-        dup = copy(self.obj)
+        obj = self.obj
+        dup = copy(obj)
         dup.id = None
+        if hasattr(obj, 'name'):
+            dup.name = "copy of %s" % obj.name
         dup.save()
         return dup
 
@@ -374,6 +378,8 @@
             if not errors:
                 manipulator.do_html2python(new_data)
                 new_object = manipulator.save(new_data)
+                if request.user.is_authenticated():
+                    request.user.message_set.create(message = 'Uploaded "%s".' % new_object)
                 if post_save_redirect:
                     return HttpResponseRedirect(post_save_redirect % new_object.__dict__)
                 elif hasattr(new_object, 'get_absolute_url'):
@@ -386,7 +392,7 @@
         form = oldforms.FormWrapper(manipulator, new_data, errors)
         template_name = "%s/%s_upload.html" % (ModelClass._meta.app_label, ModelClass._meta.object_name.lower())
         t = template_loader.get_template(template_name)
-        c = RequestContext(request, {
+        c = Context({
             'form': form,
             'action': request.path,
             'root': request.root,
@@ -404,8 +410,15 @@
     def postDeleteRedirect(self, root):
         return "%s/?class=%s" % (root, self.__class__.__name__)
 
+    @classmethod
+    def addManipulator(cls):
+        return cls.Model.AddManipulator()
 
+    def changeManipulator(self):
+        object = self.obj
+        return self.Model.ChangeManipulator(getattr(object, object._meta.pk.attname))
 
+
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Events
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -425,17 +438,17 @@
     @classmethod
     def create(cls, request):
         from forms import SingleSourceEventAddManipulator
-        return cls._manipulate(request, SingleSourceEventAddManipulator())
+        return cls._manipulate(request, SingleSourceEventAddManipulator(), 'Created "%s".')
 
     def update(self, request):
         from forms import SingleSourceEventChangeManipulator
         event = self.obj
         if not event.singleSource:
             return super(Event, self).update(request)
-        return self._manipulate(request, SingleSourceEventChangeManipulator(event), event)
+        return self._manipulate(request, SingleSourceEventChangeManipulator(event), 'Saved "%s".', event)
 
     @classmethod
-    def _manipulate(cls, request, manipulator, event=None):
+    def _manipulate(cls, request, manipulator, messageFormat, event=None):
         if request.method == 'POST':
             new_data = request.POST.copy()
             errors = manipulator.get_validation_errors(new_data)
@@ -445,6 +458,8 @@
                 new_data['object'] = None; del new_data['object']
                 new_data['action'] = None; del new_data['action']
                 obj = manipulator.save(new_data)
+                if request.user.is_authenticated():
+                    request.user.message_set.create(message = messageFormat % obj)
                 return HttpResponseRedirect(cls.urlForObject(obj, request.root))
         else:
             new_data = manipulator.flatten_data()
@@ -452,7 +467,7 @@
 
         form = oldforms.FormWrapper(manipulator, new_data, errors)
         t = loader.get_template('SeismoWebPortal/single_source_event_form.html')
-        c = RequestContext(request, dict(
+        c = Context(dict(
             form = form,
             action = request.path,
             object = event,
@@ -476,7 +491,7 @@
 
         if not request.GET.get('itype'):
             t = loader.get_template('SeismoWebPortal/event_search.html')
-            c = RequestContext(request, dict(action = request.path, root = request.root))
+            c = Context(dict(action = request.path, root = request.root))
             return t.render(c)
 
         # Simply forward the search request to globalcmt.org.
@@ -508,12 +523,10 @@
                 r.save()
 
         t = loader.get_template('SeismoWebPortal/event_search_results.html')
-        c = RequestContext(request,
-                           {'event_list': parser.cmtList,
-                            'error': parser.error,
-                            'root': request.root,
-                            }
-                           )
+        c = Context({'event_list': parser.cmtList,
+                     'error': parser.error,
+                     'root': request.root,
+                     })
         return t.render(c)
 
     def downloadAsText(self, request):
@@ -669,16 +682,16 @@
             nchunks = int(nchunks)
         except ValueError:
             raise Http404
-        return cls._manipulate(request, nchunks, MeshAddManipulator(nchunks))
+        return cls._manipulate(request, nchunks, MeshAddManipulator(nchunks), 'Created "%s".')
 
     def update(self, request):
         from forms import MeshChangeManipulator
         mesh = self.obj
         nchunks = mesh.nchunks
-        return self._manipulate(request, nchunks, MeshChangeManipulator(nchunks, mesh.id), mesh)
+        return self._manipulate(request, nchunks, MeshChangeManipulator(nchunks, mesh.id), 'Saved "%s".', mesh)
 
     @classmethod
-    def _manipulate(cls, request, nchunks, manipulator, mesh=None):
+    def _manipulate(cls, request, nchunks, manipulator, messageFormat, mesh=None):
 
         if nchunks == 1:
             template = 'SeismoWebPortal/mesh_form_1chunk.html'
@@ -697,6 +710,8 @@
             if not errors:
                 manipulator.do_html2python(new_data)
                 new_object = manipulator.save(new_data)
+                if request.user.is_authenticated():
+                    request.user.message_set.create(message = messageFormat % new_object)
                 return HttpResponseRedirect(cls.urlForObject(new_object, request.root))
         else:
             # Populate new_data with a 'flattened' version of the current data.
@@ -706,7 +721,7 @@
         # Populate the FormWrapper.
         form = oldforms.FormWrapper(manipulator, new_data, errors)
         t = loader.get_template(template)
-        c = RequestContext(request, dict(
+        c = Context(dict(
             form = form,
             nchunks = nchunks,
             object = mesh,
@@ -739,8 +754,9 @@
     downloadableAsText = True
     duplicatable = False
 
-    def update(self, request):
-        return super(MineosModel, self).update(request, follow = dict(data = False))
+    def changeManipulator(self):
+        object = self.obj
+        return self.Model.ChangeManipulator(getattr(object, object._meta.pk.attname), follow = dict(data = False))
 
     def downloadAsText(self, request):
         response = HttpResponse(mimetype='text/plain')
@@ -755,6 +771,24 @@
 
 
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Runs
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+class Run(Object):
+    Model = models.Run
+
+    @classmethod
+    def addManipulator(cls):
+        from forms import RunManipulator
+        return RunManipulator()
+
+    def changeManipulator(self):
+        from forms import RunManipulator
+        return RunManipulator(self.obj.id)
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # support code
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

Modified: cs/portal/trunk/northridge/SeismoWebPortal/models.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/models.py	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/models.py	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,6 +1,7 @@
 
 from django.db import models
 from django.contrib.auth.models import User
+from django.contrib.contenttypes.models import ContentType
 from django.core import validators
 
 
@@ -243,6 +244,8 @@
 
 class Specfem3DGlobeMesh(models.Model):
 
+    name = models.CharField(maxlength=100)
+
     nchunks = models.IntegerField(core=True, choices=NCHUNKS_CHOICES, default=1)
     nproc_xi = models.IntegerField(core=True, choices=NPROC_CHOICES, default=5)
     nproc_eta = models.IntegerField(core=True, choices=NPROC_CHOICES, default=5)
@@ -258,6 +261,8 @@
     center_longitude = models.FloatField(max_digits=19, decimal_places=10, core=True)
     gamma_rotation_azimuth = models.FloatField(max_digits=19, decimal_places=10, core=True)
 
+    def __str__(self): return self.name
+
     def shortestPeriod(self):
         if self.nchunks == 6:
             return (256.0 / float(self.nex_xi())) * 17.0
@@ -275,8 +280,10 @@
 
 
 class Specfem3DGlobeParameters(models.Model):
+
+    name = models.CharField(maxlength=100)
+    
     mesh = models.ForeignKey(Specfem3DGlobeMesh)
-
     model = models.IntegerField(choices=MODEL_TYPES, core=True, default=2)
     oceans = models.BooleanField(core=True, default=True)
     gravity = models.BooleanField(core=True, default=True)
@@ -285,6 +292,8 @@
     rotation = models.BooleanField(core=True, default=True)
     ellipticity = models.BooleanField(core=True, default=True)
 
+    def __str__(self): return self.name
+
     def nodes(self):
         """Return the number of processors required for this simulation."""
         mesh = self.mesh
@@ -311,6 +320,8 @@
 
 class MineosModeCatalog(models.Model):
 
+    name = models.CharField(maxlength=100)
+
     #------------------------------------------------------------------------
     # minos_bran
     
@@ -335,7 +346,9 @@
 
     max_depth = models.FloatField(max_digits=19, decimal_places=10, default=1000.0) # km
 
+    def __str__(self): return self.name
 
+
 class MineosModel(models.Model):
 
     name = models.CharField(maxlength=100)
@@ -348,6 +361,8 @@
 
 class MineosParameters(models.Model):
 
+    name = models.CharField(maxlength=100)
+
     catalog = models.ForeignKey(MineosModeCatalog)
     model = models.ForeignKey(MineosModel)
 
@@ -368,25 +383,31 @@
     
     step = models.FloatField(max_digits=19, decimal_places=10, default=1.0) # seconds
 
+    def __str__(self): return self.name
 
+
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Runs, Jobs
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
 class Run(models.Model):
-    # each simulation may have multiple runs
-    #simulation = models.ForeignKey(Simulation)
+    event = models.ForeignKey(Event)
+    stationList = models.ForeignKey(StationList)
 
+    parametersType = models.ForeignKey(ContentType, db_index=True)
+    parametersId = models.PositiveIntegerField(db_index=True)
+    parameters = models.GenericForeignKey(ct_field='parametersType', fk_field='parametersId')
+
     status = models.CharField(maxlength=100)
     started = models.DateTimeField(auto_now_add=True, editable=False)
-    finished = models.DateTimeField(null=True, blank=True)
+    finished = models.DateTimeField(null=True)
 
     class Admin:
         list_display = ('status', 'started', 'finished')
 
     def __str__(self):
-        return "%s r%d" % (self.simulation.name, self.id)
+        return "run %04d" % self.id
 
 
 class Job(models.Model):

Added: cs/portal/trunk/northridge/SeismoWebPortal/static/images/rocket.gif
===================================================================
(Binary files differ)


Property changes on: cs/portal/trunk/northridge/SeismoWebPortal/static/images/rocket.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,5 +1,5 @@
 
-<h2>{{ object.name }}</h2>
+<h2>{{ object }}</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 rules=cols>
+    <table rules=cols class="clickable">
         <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,7 +34,7 @@
 
         <tbody>
         {% for source in object.sources %}
-        <tr class="{% cycle odd,even %}" id="s{{source.id}}">
+        <tr class="{% cycle odd,even %}" id="s{{source.id}}" onclick="location.href='{{root}}/?class=Source&object={{source.id}}'">
             <td><a href="{{root}}/?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>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_list.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,6 +1,6 @@
 
 {% if object_list %}
-    <table rules=cols>
+    <table rules=cols class="clickable">
         <thead>
         <tr>
             <th>name</th>
@@ -15,7 +15,7 @@
 
         <tbody>
         {% for object in object_list %}
-        <tr class="{% cycle odd,even %}" id="o{{object.id}}">
+        <tr class="{% cycle odd,even %}" id="o{{object.id}}" onclick="location.href='{{root}}/?class=Event&object={{object.id}}'">
             <td><a href="{{root}}/?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_map.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_map.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_map.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,4 +1,6 @@
 
+<h2>{{ object }}</h2>
+
 {% if object.singleSource %}
 
 <center><p><img src="{{root}}/maps/events/{{object.singleSource.id}}/global/event.jpg">

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-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mesh_form_base.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -16,6 +16,12 @@
 
     <div class=tab30ex>
 
+    <div>
+        <label for="id_name" class=before>name</label>
+        {{ form.name }}
+        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
+    </div>
+
     <fieldset><legend>chunks</legend>
 
     <p>Nchunks = {{ nchunks }}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_form.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -17,6 +17,12 @@
     <div class=tab30ex>
 
     <div>
+        <label for="id_name" class=before>name</label>
+        {{ form.name }}
+        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div>
         <label for="id_eps" class=before>eps</label>
         {{ form.eps }}
         {% if form.eps.errors %}<span class=error>{{ form.eps.errors|join:", " }}</span>{% endif %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_list.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodecatalog_list.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,7 +1,7 @@
 
 {% if object_list %}
 
-<table rules=cols class=cool width="100%">
+<table rules=cols class="clickable">
     <thead>
     <tr>
         <th rowspan=2></th>
@@ -23,8 +23,8 @@
 
     <tbody>
     {% for object in object_list %}
-    <tr class="{% cycle odd,even %}" id="o{{object.id}}">
-        <td><a href="{{root}}/?class=MineosModeCatalog&object={{object.id}}">xxx</a></td>
+    <tr class="{% cycle odd,even %}" id="o{{object.id}}" onclick="location.href='{{root}}/?class=MineosModeCatalog&object={{object.id}}'">
+        <td><a href="{{root}}/?class=MineosModeCatalog&object={{object.id}}">{{ object }}</a></td>
         <td>{{ object.eps }}</td>
         <td>{{ object.wgrav }}</td>
         <td>{{ object.lmin }}</td>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_list.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,7 +1,7 @@
 
 {% if object_list %}
 
-<table rules=cols>
+<table rules=cols class="clickable">
     <thead>
     <tr>
         <th>name</th>
@@ -10,7 +10,7 @@
 
     <tbody>
     {% for object in object_list %}
-    <tr class="{% cycle odd,even %}" id="o{{object.id}}">
+    <tr class="{% cycle odd,even %}" id="o{{object.id}}" onclick="location.href='{{root}}/?class=MineosModel&object={{object.id}}'">
         <td><a href="{{root}}/?class=MineosModel&object={{object.id}}">{{ object }}</a></td>
     </tr>
     {% endfor %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_form.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -17,6 +17,12 @@
     <div class=tab30ex>
 
     <div>
+        <label for="id_name" class=before>name</label>
+        {{ form.name }}
+        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div>
         <label for="id_catalog" class=before>catalog</label>
         {{ form.catalog }}
         {% if form.catalog.errors %}<span class=error>{{ form.catalog.errors|join:", " }}</span>{% endif %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosparameters_list.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,7 +1,7 @@
 
 {% if object_list %}
 
-<table rules=cols class=cool width="100%">
+<table rules=cols class="clickable">
     <thead>
     <tr>
         <th rowspan=3></th>
@@ -25,8 +25,8 @@
 
     <tbody>
     {% for object in object_list %}
-    <tr class="{% cycle odd,even %}" id="o{{object.id}}">
-        <td><a href="{{root}}/?class=MineosParameters&object={{object.id}}">xxx</a></td>
+    <tr class="{% cycle odd,even %}" id="o{{object.id}}" onclick="location.href='{{root}}/?class=MineosParameters&object={{object.id}}'">
+        <td><a href="{{root}}/?class=MineosParameters&object={{object.id}}">{{ object }}</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>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/pluggable.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -28,6 +28,10 @@
                         Home</a>
                     </td>
                     <td align=center>
+                        <a href="{{root}}/?class=Run"><img src="{{root}}/images/rocket.gif" width=32 height=32><br>
+                        Runs</a>
+                    </td>
+                    <td align=center>
                         <a href="{{root}}/?class=Event"><img src="{{root}}/icons/events.gif" width=32 height=32><br>
                         Events</a>
                     </td>
@@ -104,6 +108,13 @@
                     </td>
                     <td>
                         {% if object %}
+                        <a class="actionButton" href="{{root}}/?class={{klass}}&object={{object.id}}">View</a>
+                        {% else %}
+                        <span class="actionButton disabled">View</span>
+                        {% endif %}
+                    </td>
+                    <td>
+                        {% if object %}
                         <a class="actionButton" href="{{root}}/?class={{klass}}&object={{object.id}}&action=edit">Edit</a>
                         {% else %}
                         <span class="actionButton disabled">Edit</span>
@@ -154,9 +165,6 @@
                         <span class="actionButton disabled">Download</span>
                         {% endif %}
                     </td>
-                    <td>
-                        <a class="actionButton" href="{{root}}/run/">Run Simulation</a>
-                    </td>
                 </tr>
             </table>
         </td>
@@ -198,7 +206,17 @@
     </tr>
 </table>
 
-<div class="content">
+{% if messages %}
+<div id="messages">
+    <ul>
+        {% for message in messages %}
+        <li>{{ message }}</li>
+        {% endfor %}
+    </ul>
+</div>
+{% endif %}
+
+<div id="content">
     {{content}}
 </div>
 

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_confirm_delete.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_confirm_delete.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_confirm_delete.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -0,0 +1,10 @@
+
+<h2>delete run</h2>
+
+<form method="post" action="{{action}}">
+    <input type="hidden" name="class" value="Run">
+    <input type="hidden" name="object" value="{{object.id}}">
+    <input type="hidden" name="action" value="delete">
+    <p>Are you sure you want to delete {{ object }}?
+    <p><input type="submit" value="Delete" />
+</form>

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_detail.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_detail.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_detail.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -0,0 +1,12 @@
+
+<h2>{{ object }}</h2>
+
+<dl class=parameters>
+    <dt>id</dt><dd>{{ object.id|stringformat:"04d" }}</dd>
+    <dt>event</dt><dd>{{ object.event }}</dd>
+    <dt>stationList</dt><dd>{{ object.stationList }}</dd>
+    <dt>parameters</dt><dd>{{ object.parameters }}</dd>
+    <dt>started</dt><dd>{{ object.started|date }} {{ object.started|time }}</dd>
+    <dt>finished</dt><dd>{{ object.finshed|date }} {{ object.finished|time }}</dd>
+    <dt>status</dt><dd>{{ object.status }}</dd>
+</dl>

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_form.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_form.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -0,0 +1,57 @@
+
+<h2>{% if object %}edit {{object}}{% else %}new run{% endif %}</h2>
+
+<form method="post" action="{{action}}">
+    <input type="hidden" name="class" value="Run">
+    {% if object %}
+    <input type="hidden" name="object" value="{{object.id}}">
+    <input type="hidden" name="action" value="edit">
+    {% else %}
+    <input type="hidden" name="action" value="new">
+    {% endif %}
+
+    {% if form.has_errors %}
+    <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
+    {% endif %}
+
+{% if form.has_errors %}
+<dl class=error>
+    {% for f in form.error_dict.iteritems %}
+    <dt>{{ f.0 }}</dt>
+    <dd>
+        <ul class=error>
+        {% for e in f.1 %}
+            <li>{{ e }}</li>
+        {% endfor %}
+        </ul>
+    </dd>
+    {% endfor %}
+</dl>
+{% endif %}
+
+    <div class=tab30ex>
+
+    <div>
+        <label for="id_event" class=before>event</label>
+        {{ form.event }}
+        {% if form.event.errors %}<span class=error>{{ form.event.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div>
+        <label for="id_stationList" class=before>station list</label>
+        {{ form.stationList }}
+        {% if form.stationList.errors %}<span class=error>{{ form.stationList.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div>
+        <label for="id_parameters" class=before>parameters</label>
+        {{ form.parameters }}
+        {% if form.parameters.errors %}<span class=error>{{ form.parameters.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div><input class=submit type="submit" name="save" value="Save" />
+    </div>
+
+    </div> <!-- tab30ex -->
+
+</form>

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_list.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/run_list.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -0,0 +1,33 @@
+
+{% if object_list %}
+    <table rules=cols class="clickable">
+        <thead>
+        <tr>
+            <th>id</th>
+            <th>event</th>
+            <th>stations</th>
+            <th>parameters</th>
+            <th>started</th>
+            <th>finished</th>
+            <th>status</th>
+        </tr>
+        </thead>
+        
+        <tbody>
+        {% for object in object_list %}
+        <tr class="{% cycle odd,even %}" id="o{{object.id}}" onclick="location.href='{{root}}/?class=Run&object={{object.id}}'">
+            <td><a href="{{root}}/?class=Run&object={{object.id}}">{{ object.id|stringformat:"04d" }}</a></td>
+            <td>{{ object.event }}</td>
+            <td>{{ object.stationList }}</td>
+            <td>{{ object.parameters }}</td>
+            <td>{{ object.started|date }} {{ object.started|time }}</td>
+            <td>{{ object.finshed|date }} {{ object.finished|time }}</td>
+            <td>{{ object.status }}</td>
+        </tr>
+        {% endfor %}
+        </tbody>
+
+    </table>
+{% else %}
+    <p>You have no runs.
+{% endif %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_map.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_map.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/source_map.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,3 +1,5 @@
 
+<h2>{{ object }}</h2>
+
 <center><p><img src="{{root}}/maps/events/{{object.id}}/global/event.jpg">
            <img src="{{root}}/maps/events/{{object.id}}/global/antipode.jpg"></p></center>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobemesh_list.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,6 +1,6 @@
 
 {% if object_list %}
-    <table border=1 rules=groups>
+    <table rules=cols class="clickable">
         <colgroup><col class=odd></colgroup>
         <colgroup><col class=even></colgroup>
         <colgroup><col class=odd><col class=even></colgroup>
@@ -40,8 +40,8 @@
 
         <tbody>
         {% for object in object_list %}
-        <tr class="{% cycle odd,even %}" id="o{{object.id}}">
-            <td><a href="{{root}}/?class=Specfem3DGlobeMesh&object={{object.id}}">xxx</a></td>
+        <tr class="{% cycle odd,even %}" id="o{{object.id}}" onclick="location.href='{{root}}/?class=Specfem3DGlobeMesh&object={{object.id}}'">
+            <td><a href="{{root}}/?class=Specfem3DGlobeMesh&object={{object.id}}">{{ object }}</a></td>
             <td class=int>{{ object.nchunks }}</td>
             <td class=int>{{ object.nproc_eta }}</td>
             <td class=int>{{ object.nproc_xi }}</td>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -14,6 +14,7 @@
     <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
     {% endif %}
 
+{% if 0 %}
 {% if form.has_errors %}
 <dl class=error>
     {% for f in form.error_dict.iteritems %}
@@ -28,10 +29,17 @@
     {% endfor %}
 </dl>
 {% endif %}
+{% endif %}
 
     <div class=tab30ex>
 
     <div>
+        <label for="id_name" class=before>name</label>
+        {{ form.name }}
+        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div>
         <label for="id_mesh" class=before>mesh</label>
         {{ form.mesh }}
         {% if form.mesh.errors %}<span class=error>{{ form.mesh.errors|join:", " }}</span>{% endif %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,6 +1,6 @@
 
 {% if object_list %}
-    <table rules=cols>
+    <table rules=cols class="clickable">
         <thead>
         <tr>
             <th></th>
@@ -17,8 +17,8 @@
         
         <tbody>
         {% for object in object_list %}
-        <tr class="{% cycle odd,even %}" id="o{{object.id}}">
-            <td><a href="{{root}}/?class=Specfem3DGlobeParameters&object={{object.id}}">xxx</a></td>
+        <tr class="{% cycle odd,even %}" id="o{{object.id}}" onclick="location.href='{{root}}/?class=Specfem3DGlobeParameters&object={{object.id}}'">
+            <td><a href="{{root}}/?class=Specfem3DGlobeParameters&object={{object.id}}">{{ object }}</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>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_list.html	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_list.html	2008-05-21 03:35:33 UTC (rev 11989)
@@ -1,6 +1,6 @@
 
 {% if object_list %}
-    <table rules=cols>
+    <table rules=cols class="clickable">
         <thead>
         <tr>
             <th>name</th>
@@ -10,7 +10,7 @@
 
         <tbody>
         {% for object in object_list %}
-        <tr class="{% cycle odd,even %}" id="o{{object.id}}">
+        <tr class="{% cycle odd,even %}" id="o{{object.id}}" onclick="location.href='{{root}}/?class=StationList&object={{object.id}}'">
             <td><a href="{{root}}/?class=StationList&object={{object.id}}">{{ object.name }}</a></td>
             <td>{{ object.station_set.count }}</td>
         </tr>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/style.css
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/style.css	2008-05-20 15:01:36 UTC (rev 11988)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/style.css	2008-05-21 03:35:33 UTC (rev 11989)
@@ -23,6 +23,27 @@
     margin-bottom: 1em;
 }
 
+#messages {
+    position: relative;
+}
+
+#messages ul {
+    position: absolute;
+    top: -3ex;
+    right: 1ex;
+    font-weight: bold;
+    background-color: yellow;
+    border: medium double black;
+    padding-top: .5ex;
+    padding-bottom: .5ex;
+    padding-left: 1ex;
+    padding-right: 1ex;
+}
+
+#messages li {
+    list-style: none;
+}
+
 #login {
     font-size: small;
 }
@@ -86,6 +107,7 @@
 
 .actionMenu .actionMenuHeader {
     border: 1px solid black;
+    background: white url({{root}}/images/input_background.gif) repeat-x;
 }
 
 .actionMenu .actionMenuHeader a {
@@ -93,10 +115,6 @@
     padding-right: 1ex;
 }
 
-.actionMenu.deactivated .actionMenuHeader a:hover {
-    background-color: #cde2a7;
-}
-
 .actionMenu .actionMenuContent {
     display: none;
     position: absolute;
@@ -126,6 +144,7 @@
 .actionMenu.activated .actionMenuHeader {
     color: white;
     background-color: black;
+    background-image: none;
 }
 
 .actionMenu.activated .actionMenuHeader a {
@@ -134,6 +153,7 @@
 
 .actionMenu.activated .actionMenuContent {
     display: block;
+    z-index: 1;
     border: 1px solid black;
 }
 
@@ -164,13 +184,9 @@
     padding-right: 1ex;
     text-decoration: none;
     color: black;
+    background: white url({{root}}/images/input_background.gif) repeat-x;
 }
 
-a.actionButton:hover {
-    color: white;
-    background-color: black;
-}
-
 .disabled {
     color: silver;
 }
@@ -190,12 +206,12 @@
   tables
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
-.content table {
+#content table {
     border: 1px solid black;
     width: 100%;
 }
 
-.content thead {
+#content thead {
     border-bottom: 1px solid black;
 }
 
@@ -207,17 +223,17 @@
     background-color: #ff9;
 }
 
-.content th {
+#content th {
     text-align: left;
     padding-left: 1ex;
     padding-right: 1ex;
 }
 
-.content th.colgroup {
+#content th.colgroup {
     text-align: center;
 }
 
-.content td {
+#content td {
     padding-left: 1ex;
     padding-right: 1ex;
 }
@@ -239,7 +255,11 @@
     font-size: small;
 }
 
+table.clickable tbody tr {
+    cursor: pointer;
+}
 
+
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   forms
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
@@ -285,7 +305,7 @@
 .computed {
     font-weight: bold;
     background-color: #fcc;
-    border: thin solid red;
+    border: 1px solid red;
 }
 
 label.before {
@@ -347,28 +367,34 @@
 .tab30ex select.vSelectField {
     float: left;
     margin-bottom: 1em;
+    margin-left: .5ex;
+    margin-right: .5ex;
 }
 
+input {
+    font-family: "Lucida Grande", Verdana, Lucida, Helvetica, Arial, sans-serif;
+    border: 1px solid #8cacbb;
+    background: white url({{root}}/images/input_background.gif) repeat-x;
+    margin-left: .5ex;
+    margin-right: .5ex;
+}
+
 input.reset {
     float: right;
+    border: 1px solid black;
 }
 
 input.submit {
     margin-top: 2em;
     margin-bottom: 2em;
+    border: 1px solid black;
 }
 
 .tab30ex input.submit {
     margin-left: 30ex;
 }
 
-input {
-    font-family: "Lucida Grande", Verdana, Lucida, Helvetica, Arial, sans-serif;
-    border: 1px solid #8cacbb;
-    background: White url({{root}}/images/input_background.gif) repeat-x;
-}
 
-
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   collapsible help
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



More information about the cig-commits mailing list