[cig-commits] r11893 - in cs/portal/trunk/northridge/SeismoWebPortal: . site templates/SeismoWebPortal

leif at geodynamics.org leif at geodynamics.org
Thu May 1 18:53:56 PDT 2008


Author: leif
Date: 2008-05-01 18:53:56 -0700 (Thu, 01 May 2008)
New Revision: 11893

Added:
   cs/portal/trunk/northridge/SeismoWebPortal/fformats.py
Removed:
   cs/portal/trunk/northridge/SeismoWebPortal/create_update.py
   cs/portal/trunk/northridge/SeismoWebPortal/managers.py
   cs/portal/trunk/northridge/SeismoWebPortal/middleware.py
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/model_confirm_delete.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/model_form.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/model_list.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/models.html
Modified:
   cs/portal/trunk/northridge/SeismoWebPortal/cmt.py
   cs/portal/trunk/northridge/SeismoWebPortal/forms.py
   cs/portal/trunk/northridge/SeismoWebPortal/models.py
   cs/portal/trunk/northridge/SeismoWebPortal/site/settings.py
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/par_file.txt
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/parameters.pml
   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_upload.html
   cs/portal/trunk/northridge/SeismoWebPortal/urls.py
   cs/portal/trunk/northridge/SeismoWebPortal/views.py
Log:
More changes related to Specfem model merge.  Upgraded to Django
v0.96.1, removing associated junk.  Removed last 'user' fields and
associated 'ThreadLocals' hack.  Consolidated 'upload' forms further;
init name with filename.


Modified: cs/portal/trunk/northridge/SeismoWebPortal/cmt.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/cmt.py	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/cmt.py	2008-05-02 01:53:56 UTC (rev 11893)
@@ -63,10 +63,10 @@
     createFromDBModel = classmethod(createFromDBModel)
 
 
-    def parse(cls, data):
+    def parse(cls, stream):
         cmtList = []
         cmtSolution = None
-        for line in data.splitlines():
+        for line in stream:
             tokens = line.split(':')
             if len(tokens) == 1:
                 if tokens[0]:

Deleted: cs/portal/trunk/northridge/SeismoWebPortal/create_update.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/create_update.py	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/create_update.py	2008-05-02 01:53:56 UTC (rev 11893)
@@ -1,236 +0,0 @@
-from django.core.xheaders import populate_xheaders
-from django.template import loader
-from django import forms
-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, HttpResponse, HttpResponseRedirect
-from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
-
-def noop(*args, **kwds):
-    pass
-
-def create_object(request, model, template_name=None,
-                  template_loader=loader, extra_context=None, post_save_redirect=None,
-                  login_required=False, follow=None, context_processors=None,
-                  post_save_hook=noop):
-    """
-    Generic object-creation function.
-
-    Templates: ``<app_label>/<model_name>_form.html``
-    Context:
-        form
-            the form wrapper for the object
-    """
-    if extra_context is None: extra_context = {}
-    if login_required and not request.user.is_authenticated():
-        return redirect_to_login(request.path)
-
-    manipulator = model.AddManipulator(follow=follow)
-    help_visible = request.session.get('help_visible', False)
-    
-    if request.POST:
-        new_data = request.POST.copy()
-        errors = {}
-        if new_data.has_key('show_help'):
-            help_visible = True
-            request.session['help_visible'] = help_visible
-            manipulator.do_html2python(new_data)
-        elif new_data.has_key('hide_help'):
-            help_visible = False
-            request.session['help_visible'] = help_visible
-            manipulator.do_html2python(new_data)
-        else:
-            # Data was POSTed; we're trying to create a new object
-            if model._meta.has_field_type(FileField):
-                new_data.update(request.FILES)
-
-            # Check for errors
-            errors = manipulator.get_validation_errors(new_data)
-            manipulator.do_html2python(new_data)
-
-            if not errors:
-                # No errors -- this means we can save the data!
-                new_object = manipulator.save(new_data)
-                kludge = post_save_hook(new_object)
-                if kludge:
-                    return kludge
-
-                if request.user.is_authenticated():
-                    request.user.message_set.create(message="The %s was created successfully." % model._meta.verbose_name)
-
-                # Redirect to the new object: first by trying post_save_redirect,
-                # then by obj.get_absolute_url; fail if neither works.
-                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:
-                    raise ImproperlyConfigured("No URL to redirect to from generic create view.")
-    else:
-        # No POST, so we want a brand new form without any data or errors
-        errors = {}
-        new_data = manipulator.flatten_data()
-
-    # Create the FormWrapper, template, context, response
-    form = forms.FormWrapper(manipulator, new_data, errors)
-    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, {
-        'form': form,
-        'help_visible': help_visible,
-        'action': request.path,
-    }, context_processors)
-    for key, value in extra_context.items():
-        if callable(value):
-            c[key] = value()
-        else:
-            c[key] = value
-    return HttpResponse(t.render(c))
-
-def update_object(request, model, object_id=None, slug=None,
-                  slug_field=None, template_name=None, template_loader=loader,
-                  extra_context=None, post_save_redirect=None,
-                  login_required=False, follow=None, context_processors=None,
-                  template_object_name='object',
-                  post_save_hook=noop):
-    """
-    Generic object-update function.
-
-    Templates: ``<app_label>/<model_name>_form.html``
-    Context:
-        form
-            the form wrapper for the object
-        object
-            the original object being edited
-    """
-    if extra_context is None: extra_context = {}
-    if login_required and not request.user.is_authenticated():
-        return redirect_to_login(request.path)
-
-    # Look up the object to be edited
-    lookup_kwargs = {}
-    if object_id:
-        lookup_kwargs['%s__exact' % model._meta.pk.name] = object_id
-    elif slug and slug_field:
-        lookup_kwargs['%s__exact' % slug_field] = slug
-    else:
-        raise AttributeError("Generic edit view must be called with either an object_id or a slug/slug_field")
-    try:
-        object = model.objects.get(**lookup_kwargs)
-    except ObjectDoesNotExist:
-        raise Http404, "No %s found for %s" % (model._meta.verbose_name, lookup_kwargs)
-
-    manipulator = model.ChangeManipulator(getattr(object, object._meta.pk.name), follow=follow)
-    help_visible = request.session.get('help_visible', False)
-
-    if request.POST:
-        new_data = request.POST.copy()
-        errors = {}
-        if new_data.has_key('show_help'):
-            help_visible = True
-            request.session['help_visible'] = help_visible
-            manipulator.do_html2python(new_data)
-        elif new_data.has_key('hide_help'):
-            help_visible = False
-            request.session['help_visible'] = help_visible
-            manipulator.do_html2python(new_data)
-        else:
-            if model._meta.has_field_type(FileField):
-                new_data.update(request.FILES)
-            errors = manipulator.get_validation_errors(new_data)
-            manipulator.do_html2python(new_data)
-            if not errors:
-                object = manipulator.save(new_data)
-                kludge = post_save_hook(object)
-                if kludge:
-                    return kludge
-
-                if request.user.is_authenticated():
-                    request.user.message_set.create(message="The %s was updated successfully." % model._meta.verbose_name)
-
-                # Do a post-after-redirect so that reload works, etc.
-                if post_save_redirect:
-                    return HttpResponseRedirect(post_save_redirect % object.__dict__)
-                elif hasattr(object, 'get_absolute_url'):
-                    return HttpResponseRedirect(object.get_absolute_url())
-                else:
-                    raise ImproperlyConfigured("No URL to redirect to from generic create view.")
-    else:
-        errors = {}
-        # This makes sure the form acurate represents the fields of the place.
-        new_data = manipulator.flatten_data()
-
-    form = forms.FormWrapper(manipulator, new_data, errors)
-    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, {
-        'form': form,
-        'help_visible': help_visible,
-        'action': request.path,
-        template_object_name: object,
-    }, context_processors)
-    for key, value in extra_context.items():
-        if callable(value):
-            c[key] = value()
-        else:
-            c[key] = value
-    response = HttpResponse(t.render(c))
-    populate_xheaders(request, response, model, getattr(object, object._meta.pk.name))
-    return response
-
-def delete_object(request, model, post_delete_redirect,
-        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'):
-    """
-    Generic object-delete function.
-
-    The given template will be used to confirm deletetion if this view is
-    fetched using GET; for safty, deletion will only be performed if this
-    view is POSTed.
-
-    Templates: ``<app_label>/<model_name>_confirm_delete.html``
-    Context:
-        object
-            the original object being deleted
-    """
-    if extra_context is None: extra_context = {}
-    if login_required and not request.user.is_authenticated():
-        return redirect_to_login(request.path)
-
-    # Look up the object to be edited
-    lookup_kwargs = {}
-    if object_id:
-        lookup_kwargs['%s__exact' % model._meta.pk.name] = object_id
-    elif slug and slug_field:
-        lookup_kwargs['%s__exact' % slug_field] = slug
-    else:
-        raise AttributeError("Generic delete view must be called with either an object_id or a slug/slug_field")
-    try:
-        object = model._default_manager.get(**lookup_kwargs)
-    except ObjectDoesNotExist:
-        raise Http404, "No %s found for %s" % (model._meta.app_label, lookup_kwargs)
-
-    if request.method == 'POST':
-        object.delete()
-        if request.user.is_authenticated():
-            request.user.message_set.create(message="The %s was deleted." % model._meta.verbose_name)
-        return HttpResponseRedirect(post_delete_redirect)
-    else:
-        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, {
-            template_object_name: object,
-        }, context_processors)
-        for key, value in extra_context.items():
-            if callable(value):
-                c[key] = value()
-            else:
-                c[key] = value
-        response = HttpResponse(t.render(c))
-        populate_xheaders(request, response, model, getattr(object, object._meta.pk.name))
-        return response

Added: cs/portal/trunk/northridge/SeismoWebPortal/fformats.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/fformats.py	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/fformats.py	2008-05-02 01:53:56 UTC (rev 11893)
@@ -0,0 +1,102 @@
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# file formats
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+import cmt
+import models
+
+
+class CMTSolutionFormat:
+
+    def parse(self, stream):
+        cmt.CMTSolution.parse(stream)
+        return
+
+    def create(self, filename, stream):
+        cmtSolutionList = cmt.CMTSolution.parse(stream)
+
+        # Create the new event.
+        event = models.Event.objects.create(
+            name = filename,
+            )
+
+        # Add each source.
+        for cmtSolution in cmtSolutionList:
+            models.Source.saveSource(event, cmtSolution)
+
+        return event
+
+    uploadError = 'Please select a file in CMTSOLUTION format.'
+
+
+class StationListFormat:
+    
+    def parse(self, stream):
+        self._parse(None, stream)
+        return
+
+    def _parse(self, stationList, stream):
+
+        for i, line in enumerate(stream):
+
+            # parse the line
+            line = line.split()
+            if i == 0 and len(line) == 1:
+                # old-style station list with count
+                continue
+
+            if len(line) != 6:
+                raise Exception
+
+            code, network, latitude, longitude, elevation, bur = line
+            latitude, longitude = float(latitude), float(longitude)
+            elevation, bur = float(elevation), float(bur)
+
+            if stationList is None:
+                continue
+
+            # get/create the network entry
+            network, created = models.StationNetwork.objects.get_or_create(code = network, defaults = { 'name': "" })
+
+            # create the station
+            station = models.Station.objects.create(
+                stationList = stationList,
+                code = code,
+                name = "",
+                network = network,
+                status = 1,
+                latitude = latitude,
+                longitude = longitude,
+                elevation = elevation,
+                bur = bur,
+                )
+        return
+
+    def create(self, filename, stream):
+        stationList = models.StationList.objects.create(
+            name = filename,
+            )
+        self._parse(stationList, stream)
+        return stationList
+
+    uploadError = 'Please select a file in STATIONS format.'
+
+
+class MineosModelFormat:
+
+    def parse(self, stream):
+        return
+
+    def create(self, filename, stream):
+        mineosModel = models.MineosModel.objects.create(
+            name = filename,
+            data = stream.getvalue(),
+            )
+        return mineosModel
+
+    uploadError = 'Please select a file in Mineos model format.'
+
+
+# end of file

Modified: cs/portal/trunk/northridge/SeismoWebPortal/forms.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/forms.py	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/forms.py	2008-05-02 01:53:56 UTC (rev 11893)
@@ -292,12 +292,11 @@
                             ])
         return
 
-    def save(self, new_data, user):
+    def save(self, new_data):
         from datetime import datetime
         
         # Create the new Event.
-        event = models.Event.objects.create(user = user,
-                                            name = new_data['name'])
+        event = models.Event.objects.create(name = new_data['name'])
 
         # Create the DataSource and Region.
         dataSource, created = models.DataSource.objects.get_or_create(name = new_data['dataSource'])
@@ -342,7 +341,7 @@
         new_data['name'] = self.event.name
         return new_data
 
-    def save(self, new_data, user):
+    def save(self, new_data):
         from datetime import datetime
         
         # Save event info.
@@ -365,176 +364,41 @@
         return event
 
 
-class UploadEventManipulator(forms.Manipulator):
-    
-    def __init__(self):
-        super(UploadEventManipulator, self).__init__()
-        self.fields = [
-            forms.TextField('name', maxlength=100, is_required=True),
-            forms.FileUploadField(field_name='cmtsolution', is_required=True),
-            ]
-
-    def get_validation_errors(self, new_data):
-        errors = super(UploadEventManipulator, self).get_validation_errors(new_data)
-        
-        if not errors.get('cmtsolution'):
-            try:
-                cmtSolution = new_data['cmtsolution']['content']
-                cmt.CMTSolution.parse(cmtSolution)
-            except Exception, e:
-                errors['cmtsolution'] = ['Please select a file in CMTSOLUTION format.']
-
-        return errors
-
-    def save(self, new_data, user):
-
-        # Parse the uploaded CMTSOLUTION file.
-        cmtSolution = new_data['cmtsolution']['content']
-        cmtSolutionList = cmt.CMTSolution.parse(cmtSolution)
-
-        # Create the new event.
-        event = models.Event.objects.create(user = user,
-                                            name = new_data['name'])
-
-        # Add each source.
-        for cmtSolution in cmtSolutionList:
-            models.Source.saveSource(event, cmtSolution)
-
-        return event
-
-
-models.Event.UploadManipulator = UploadEventManipulator
-
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Stations
+# file upload
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-class UploadStationListManipulator(forms.Manipulator):
+class UploadManipulator(forms.Manipulator):
     
-    def __init__(self):
-        super(UploadStationListManipulator, self).__init__()
+    def __init__(self, format):
+        super(UploadManipulator, self).__init__()
+        self.format = format
         self.fields = [
-            forms.TextField('name', maxlength=100, is_required=True),
-            forms.FileUploadField(field_name='stations', is_required=True),
+            forms.FileUploadField(field_name='file', is_required=True),
             ]
 
     def get_validation_errors(self, new_data):
         from StringIO import StringIO
         
-        errors = super(UploadStationListManipulator, self).get_validation_errors(new_data)
+        errors = super(UploadManipulator, self).get_validation_errors(new_data)
         
-        if not errors.get('stations'):
+        if not errors.get('file'):
             try:
-                stations = new_data['stations']['content']
-                stream = StringIO(stations)
-                parse_station_list(None, stream)
+                content = new_data['file']['content']
+                stream = StringIO(content)
+                self.format.parse(stream)
             except Exception:
-                errors['stations'] = ['Please select a file in STATIONS format.']
+                errors['file'] = [self.format.uploadError]
 
         return errors
 
-    def save(self, new_data, user):
+    def save(self, new_data):
         from StringIO import StringIO
+        content = new_data['file']['content']
+        stream = StringIO(content)
+        return self.format.create(new_data['file']['filename'], stream)
 
-        # Create the new station list.
-        stationList = models.StationList.objects.create(
-            user = user,
-            name = new_data['name'],
-            )
-        
-        # Parse the uploaded STATIONS file.
-        stations = new_data['stations']['content']
-        stream = StringIO(stations)
-        parse_station_list(stationList, stream)
 
-        return stationList
 
-
-models.StationList.UploadManipulator = UploadStationListManipulator 
-
-
-def parse_station_list(stationList, stream):
-
-    for i, line in enumerate(stream):
-
-        # parse the line
-        line = line.split()
-        if i == 0 and len(line) == 1:
-            # old-style station list with count
-            continue
-
-        if len(line) != 6:
-            raise Exception
-        
-        code, network, latitude, longitude, elevation, bur = line
-        latitude, longitude = float(latitude), float(longitude)
-        elevation, bur = float(elevation), float(bur)
-
-        if stationList is None:
-            continue
-
-        # get/create the network entry
-        network, created = models.StationNetwork.objects.get_or_create(code = network, defaults = { 'name': "" })
-
-        # create the station
-        station = models.Station.objects.create(
-            stationList = stationList,
-            code = code,
-            name = "",
-            network = network,
-            status = 1,
-            latitude = latitude,
-            longitude = longitude,
-            elevation = elevation,
-            bur = bur,
-            )
-    return
-
-
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Mineos
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-class UploadMineosModelManipulator(forms.Manipulator):
-    
-    def __init__(self):
-        super(UploadMineosModelManipulator, self).__init__()
-        self.fields = [
-            forms.FileUploadField(field_name='model', is_required=True),
-            ]
-
-    def get_validation_errors(self, new_data):
-        
-        errors = super(UploadMineosModelManipulator, self).get_validation_errors(new_data)
-        
-        if not errors.get('model'):
-            try:
-                content = new_data['model']['content']
-                #stream = StringIO(content)
-                #parseMineosModel(None, stream)
-            except Exception:
-                errors['model'] = ['Please select a file in XXX format.']
-
-        return errors
-
-    def save(self, new_data, user):
-
-        # Parse the uploaded MODEL file.
-        content = new_data['model']['content']
-        #stream = StringIO(content)
-        #parseMineosModel(None, stream)
-
-        # Create the new model.
-        model = models.MineosModel.objects.create(data = content)
-        #name = new_data['model']['filename']
-
-        return model
-
-
-models.MineosModel.UploadManipulator = UploadMineosModelManipulator
-
-
 # end of file

Deleted: cs/portal/trunk/northridge/SeismoWebPortal/managers.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/managers.py	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/managers.py	2008-05-02 01:53:56 UTC (rev 11893)
@@ -1,61 +0,0 @@
-
-from django.db import models
-from django.db.models.fields import FieldDoesNotExist
-from middleware import get_current_user
-
-
-class CurrentUser(object):
-    """
-    Use in limit_choices_to to compare the field to the current user.  For example:
-
-        ... limit_choices_to = {'user__exact' : CurrentUser()} ...
-
-    Based upon Django's LazyDate.
-    
-    """
-    
-    def __str__(self):
-        return str(self.__get_value__())
-
-    def __get_value__(self):
-        return get_current_user()
-
-    def __getattr__(self, attr):
-        return getattr(self.__get_value__(), attr)
-
-
-
-class CurrentUserManager(models.Manager):
-    """Use this to limit objects to those associated with the current
-    user.  For example:
-
-        ... 'queryset': MyModel.user_objects.all(), ...
-
-    """
-
-    # Based upon Django's CurrentSiteManager.  Requires that you add
-    # cig.web.middleware.ThreadLocals to your site's
-    # MIDDLEWARE_CLASSES setting.
-    
-    # This class has less value than models.CurrentUser, since any
-    # view using a "current user" query will usually be decorated with
-    # login_required(), and thus will have to be written-out as a
-    # custom view in 'views.py' anyway.
-    
-    def __init__(self, field_name='user'):
-        super(CurrentUserManager, self).__init__()
-        self.__field_name = field_name
-        self.__is_validated = False
-
-    def get_query_set(self):
-        if not self.__is_validated:
-            try:
-                self.model._meta.get_field(self.__field_name)
-            except FieldDoesNotExist:
-                raise ValueError, "%s couldn't find a field named %s in %s." % \
-                    (self.__class__.__name__, self.__field_name, self.model._meta.object_name)
-            self.__is_validated = True
-        return super(CurrentUserManager, self).get_query_set().filter(**{self.__field_name + '__exact': CurrentUser()})
-
-
-# end of file

Deleted: cs/portal/trunk/northridge/SeismoWebPortal/middleware.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/middleware.py	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/middleware.py	2008-05-02 01:53:56 UTC (rev 11893)
@@ -1,147 +0,0 @@
-
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# "Django Admin Hack - Fields varying with user permissions"
-# by Luke Plant
-# with Python 2.3 patch by Joseph Kocherhans
-#
-# from http://lukeplant.me.uk/blog.php?id=1107301634
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-try:
-    # It wasn't until Python 2.4 that they realized they needed this...
-    from threading import local
-except ImportError:
-    # ...thankfully, Django includes a substitute.
-    from django.utils._threading_local import local
-
-_thread_locals = local()
-
-class You_need_to_add_ThreadLocals_to_MIDDLEWARE_CLASSES(object): pass
-
-def get_current_user():
-    return getattr(_thread_locals, 'user', You_need_to_add_ThreadLocals_to_MIDDLEWARE_CLASSES())
-
-# Add this to MIDDLEWARE_CLASSES.
-class ThreadLocals(object):
-    """Middleware that gets various objects from the request object
-    and saves them in thread local storage.
-
-    """
-
-    def process_request(self, request):
-        _thread_locals.user = getattr(request, 'user', None)
-
-
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Revised django/contrib/sessions/middleware.py
-#
-# The following was backported from Django 0.96 to fix a bug which
-# causes Django to die with a SuspiciousOperation when a visitor
-# arrives with an old, stale cookie (one generated with a different
-# SECRET_KEY)... or (theoretically) when a hacker arrives with a bogus
-# cookie.
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-from django.conf import settings
-from django.contrib.sessions.models import Session
-from django.core.exceptions import SuspiciousOperation
-from django.utils.cache import patch_vary_headers
-import datetime
-
-TEST_COOKIE_NAME = 'testcookie'
-TEST_COOKIE_VALUE = 'worked'
-
-class SessionWrapper(object):
-    def __init__(self, session_key):
-        self.session_key = session_key
-        self.accessed = False
-        self.modified = False
-
-    def __contains__(self, key):
-        return key in self._session
-
-    def __getitem__(self, key):
-        return self._session[key]
-
-    def __setitem__(self, key, value):
-        self._session[key] = value
-        self.modified = True
-
-    def __delitem__(self, key):
-        del self._session[key]
-        self.modified = True
-
-    def keys(self):
-        return self._session.keys()
-
-    def items(self):
-        return self._session.items()
-
-    def get(self, key, default=None):
-        return self._session.get(key, default)
-
-    def set_test_cookie(self):
-        self[TEST_COOKIE_NAME] = TEST_COOKIE_VALUE
-
-    def test_cookie_worked(self):
-        return self.get(TEST_COOKIE_NAME) == TEST_COOKIE_VALUE
-
-    def delete_test_cookie(self):
-        del self[TEST_COOKIE_NAME]
-
-    def _get_session(self):
-        # Lazily loads session from storage.
-        self.accessed = True
-        try:
-            return self._session_cache
-        except AttributeError:
-            if self.session_key is None:
-                self._session_cache = {}
-            else:
-                try:
-                    s = Session.objects.get(session_key=self.session_key,
-                        expire_date__gt=datetime.datetime.now())
-                    self._session_cache = s.get_decoded()
-                except (Session.DoesNotExist, SuspiciousOperation):
-                    self._session_cache = {}
-                    # Set the session_key to None to force creation of a new
-                    # key, for extra security.
-                    self.session_key = None
-            return self._session_cache
-
-    _session = property(_get_session)
-
-class SessionMiddleware(object):
-    def process_request(self, request):
-        request.session = SessionWrapper(request.COOKIES.get(settings.SESSION_COOKIE_NAME, None))
-
-    def process_response(self, request, response):
-        # If request.session was modified, or if response.session was set, save
-        # those changes and set a session cookie.
-        try:
-            accessed = request.session.accessed
-            modified = request.session.modified
-        except AttributeError:
-            pass
-        else:
-            if accessed:
-                patch_vary_headers(response, ('Cookie',))
-            if modified or settings.SESSION_SAVE_EVERY_REQUEST:
-                if request.session.session_key:
-                    session_key = request.session.session_key
-                else:
-                    session_key = Session.objects.get_new_session_key()
-
-                if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE:
-                    max_age = None
-                    expires = None
-                else:
-                    max_age = settings.SESSION_COOKIE_AGE
-                    expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT")
-                new_session = Session.objects.save(session_key, request.session._session,
-                    datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE))
-                response.set_cookie(settings.SESSION_COOKIE_NAME, session_key,
-                    max_age=max_age, expires=expires, domain=settings.SESSION_COOKIE_DOMAIN)
-        return response
-
-# end of file

Modified: cs/portal/trunk/northridge/SeismoWebPortal/models.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/models.py	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/models.py	2008-05-02 01:53:56 UTC (rev 11893)
@@ -3,8 +3,6 @@
 from django.contrib.auth.models import User
 from django.core import validators
 
-from managers import CurrentUser, CurrentUserManager
-from middleware import get_current_user
 
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Events
@@ -23,15 +21,8 @@
 
 class Event(models.Model):
 
-    # each user has a list of their own events
-    user = models.ForeignKey(User)
-    
     name = models.CharField(maxlength=100)
 
-    # managers
-    objects = models.Manager()
-    user_objects = CurrentUserManager()
-
     def _getSingleSource(self):
         if not hasattr(self, '_singleSource'):
             if self.source_set.count() == 1:
@@ -193,15 +184,8 @@
 
 class StationList(models.Model):
 
-    # each user has their own station lists
-    user = models.ForeignKey(User)
-
     name = models.CharField(maxlength=100)
 
-    # managers
-    objects = models.Manager()
-    user_objects = CurrentUserManager()
-
     def __str__(self): return self.name
 
     def delete(self):
@@ -274,10 +258,6 @@
     center_longitude = models.FloatField(max_digits=19, decimal_places=10, core=True)
     gamma_rotation_azimuth = models.FloatField(max_digits=19, decimal_places=10, core=True)
 
-    # managers
-    objects = models.Manager()
-    user_objects = objects #CurrentUserManager()
-
     def shortestPeriod(self):
         if self.nchunks == 6:
             return (256.0 / float(self.nex_xi())) * 17.0
@@ -305,10 +285,6 @@
     rotation = models.BooleanField(core=True, default=True)
     ellipticity = models.BooleanField(core=True, default=True)
 
-    # managers
-    objects = models.Manager()
-    user_objects = objects #CurrentUserManager()
-
     def nodes(self):
         """Return the number of processors required for this simulation."""
         mesh = self.mesh
@@ -359,21 +335,15 @@
 
     max_depth = models.FloatField(max_digits=19, decimal_places=10, default=1000.0) # km
 
-    #------------------------------------------------------------------------
-    # managers
-    objects = models.Manager()
-    user_objects = objects #CurrentUserManager()
 
-
 class MineosModel(models.Model):
 
+    name = models.CharField(maxlength=100)
+
     # A Mineos model is a small (15-20K) text file.
     data = models.TextField()
 
-    #------------------------------------------------------------------------
-    # managers
-    objects = models.Manager()
-    user_objects = objects #CurrentUserManager()
+    def __str__(self): return self.name
 
 
 class MineosParameters(models.Model):
@@ -398,12 +368,7 @@
     
     step = models.FloatField(max_digits=19, decimal_places=10, default=1.0) # seconds
 
-    #------------------------------------------------------------------------
-    # managers
-    objects = models.Manager()
-    user_objects = objects #CurrentUserManager()
 
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Runs, Jobs
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Modified: cs/portal/trunk/northridge/SeismoWebPortal/site/settings.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/site/settings.py	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/site/settings.py	2008-05-02 01:53:56 UTC (rev 11893)
@@ -66,14 +66,9 @@
 
 MIDDLEWARE_CLASSES = (
     'django.middleware.common.CommonMiddleware',
-
-    ### See the comment in middleware.py.
-    #'django.contrib.sessions.middleware.SessionMiddleware',
-    'SeismoWebPortal.middleware.SessionMiddleware',
-    
+    'django.contrib.sessions.middleware.SessionMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.middleware.doc.XViewMiddleware',
-    'SeismoWebPortal.middleware.ThreadLocals',
 )
 
 ROOT_URLCONF = 'SeismoWebPortal.site.urls'

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/event_upload.html	2008-05-02 01:53:56 UTC (rev 11893)
@@ -25,17 +25,11 @@
     <div class=tab30ex>
 
     <div>
-        <label for="id_name" class=before>name for this event</label></td>
-        {{ form.name }}
-        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
+        <label for="id_file" class=before>local file to upload</label>
+        {{ form.file }} {{ form.file_file }}
+        {% if form.file.errors %}<span class=error>{{ form.file.errors|join:", " }}</span>{% endif %}
     </div>
 
-    <div>
-        <label for="id_cmtsolution" class=before>local file to upload</label>
-        {{ form.cmtsolution }} {{ form.cmtsolution_file }}
-        {% if form.cmtsolution.errors %}<span class=error>{{ form.cmtsolution.errors|join:", " }}</span>{% endif %}
-    </div>
-
     <p>Uploaded files must be in <code>CMTSOLUTION</code> format.
 
     <div><input class=submit type="submit" value="Upload"></div>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/mineosmodel_upload.html	2008-05-02 01:53:56 UTC (rev 11893)
@@ -14,9 +14,9 @@
     <div class=tab30ex>
 
     <div>
-        <label for="id_model" class=before>local file to upload</label>
-        {{ form.model }} {{ form.model_file }}
-        {% if form.model.errors %}<span class=error>{{ form.model.errors|join:", " }}</span>{% endif %}
+        <label for="id_file" class=before>local file to upload</label>
+        {{ form.file }} {{ form.file_file }}
+        {% if form.file.errors %}<span class=error>{{ form.file.errors|join:", " }}</span>{% endif %}
     </div>
 
     <div>

Deleted: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/model_confirm_delete.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/model_confirm_delete.html	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/model_confirm_delete.html	2008-05-02 01:53:56 UTC (rev 11893)
@@ -1,14 +0,0 @@
-
-{% extends "SeismoWebPortal/models.html" %}
-
-{% block content %}
-
-<h2 class=titlebar>delete model</h2>
-
-<form method="post" action="/specfem3dglobe/models/{{ object.id }}/delete/">
-    <p>Are you sure you want to delete the model "{{ object }}"?
-    <p><input type="submit" value="Delete" />
-</form>
-
-{% endblock %}
-

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

Deleted: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/model_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/model_list.html	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/model_list.html	2008-05-02 01:53:56 UTC (rev 11893)
@@ -1,49 +0,0 @@
-
-{% extends "SeismoWebPortal/models.html" %}
-
-{% block content %}
-
-<div class=toolbar>
-    <form action="create/" method="get"><input type="submit" value="New..." /></form>
-</div>
-
-{% if object_list %}
-    <table rules=groups>
-        <colgroup><col class=odd></colgroup>
-        <colgroup><col class=even></colgroup>
-        <colgroup><col class=odd><col class=even><col class=odd><col class=even><col class=odd><col class=even></colgroup>
-
-        <thead>
-        <tr>
-            <th>name</th>
-            <th>type</th>
-            <th>oceans</th>
-            <th>gravity</th>
-            <th>attenuation</th>
-            <th>topography</th>
-            <th>rotation</th>
-            <th>ellipticity</th>
-        </tr>
-        </thead>
-
-        <tbody>
-        {% for object in object_list %}
-        <tr>
-            <th><a href="{{ object.id }}/">{{ object.name }}</a></th>
-            <td>{{ object.get_type_display }}</td>
-            <td><span class={{ object.oceans }}>{{ object.oceans }}</span></td>
-            <td><span class={{ object.gravity }}>{{ object.gravity }}</span></td>
-            <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>
-        </tr>
-        {% endfor %}
-        </tbody>
-
-    </table>
-{% else %}
-    <p>You have no models.
-{% endif %}
-
-{% endblock %}

Deleted: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/models.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/models.html	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/models.html	2008-05-02 01:53:56 UTC (rev 11893)
@@ -1,26 +0,0 @@
-
-{% extends "SeismoWebPortal/base.html" %}
-
-{% block desktop %}
-
-<div class=taskbar>
-    <ul>
-        <li class=first><a href="/specfem3dglobe/">home</a>
-        <li><a href="/specfem3dglobe/simulations/">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><a href="/specfem3dglobe/meshes/">meshes</a>
-        <li class=selected><a href="/specfem3dglobe/models/">models</a>
-        <li><a href="/specfem3dglobe/registration/">profile</a>
-    </ul>
-</div>
-
-<h1 class=titlebar>models</h1>
-
-{% block content %}
-{% endblock %}
-
-{% endblock %}

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/par_file.txt
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/par_file.txt	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/par_file.txt	2008-05-02 01:53:56 UTC (rev 11893)
@@ -1,7 +1,7 @@
 
 # forward or adjoint simulation
-SIMULATION_TYPE                 = {{ simulation.simulation_type }}
-SAVE_FORWARD                    = .{{ simulation.save_forward }}.  # save last frame of forward simulation or not
+SIMULATION_TYPE                 = 1
+SAVE_FORWARD                    = .false.  # save last frame of forward simulation or not
 
 # number of chunks (1,2,3 or 6)
 NCHUNKS                         = {{ simulation.mesh.nchunks }}
@@ -31,15 +31,15 @@
 # fully 3D models:
 # transversely_isotropic_prem_plus_3D_crust_2.0, 3D_anisotropic, 3D_attenuation,
 # s20rts, s362ani, s362iso, s362wmani, s362ani_prem, s29ea
-MODEL                           = {{ simulation.model.get_type_id }}
+MODEL                           = {{ simulation.get_model_id }}
 
 # parameters describing the Earth model
-OCEANS                          = .{{ simulation.model.oceans }}.
-ELLIPTICITY                     = .{{ simulation.model.ellipticity }}.
-TOPOGRAPHY                      = .{{ simulation.model.topography }}.
-GRAVITY                         = .{{ simulation.model.gravity }}.
-ROTATION                        = .{{ simulation.model.rotation }}.
-ATTENUATION                     = .{{ simulation.model.attenuation }}.
+OCEANS                          = .{{ simulation.oceans }}.
+ELLIPTICITY                     = .{{ simulation.ellipticity }}.
+TOPOGRAPHY                      = .{{ simulation.topography }}.
+GRAVITY                         = .{{ simulation.gravity }}.
+ROTATION                        = .{{ simulation.rotation }}.
+ATTENUATION                     = .{{ simulation.attenuation }}.
 
 # absorbing boundary conditions for a regional simulation
 ABSORBING_CONDITIONS            = .{{ simulation.auto_absorbing_conditions }}.
@@ -48,10 +48,10 @@
 RECORD_LENGTH_IN_MINUTES        = {{ simulation.record_length|stringformat:".1f" }}
 
 # save AVS or OpenDX movies
-MOVIE_SURFACE                   = .{{ simulation.movie_surface }}.
-MOVIE_VOLUME                    = .{{ simulation.movie_volume }}.
-NTSTEP_BETWEEN_FRAMES           = {{ simulation.ntstep_between_frames }}
-HDUR_MOVIE                      = {{ simulation.hdur_movie|stringformat:".1f" }}
+MOVIE_SURFACE                   = .false.
+MOVIE_VOLUME                    = .false.
+NTSTEP_BETWEEN_FRAMES           = 100
+HDUR_MOVIE                      = 0.d0
 
 # save movie in volume.  Will save element if center of element is in prescribed volume
 # top/bottom: depth in KM, use MOVIE_TOP = -100 to make sure the surface is stored.
@@ -72,7 +72,7 @@
 MOVIE_STOP                      = 40000
 
 # save mesh files to check the mesh
-SAVE_MESH_FILES                 = .{{ simulation.mesh.save_files }}.
+SAVE_MESH_FILES                 = .false.
 
 # restart files (number of runs can be 1, 2 or 3, choose 1 for no restart files)
 NUMBER_OF_RUNS                  = 1
@@ -82,10 +82,10 @@
 LOCAL_PATH                      = /scratch/
 
 # interval at which we output time step info and max of norm of displacement
-NTSTEP_BETWEEN_OUTPUT_INFO      = {{ simulation.ntstep_between_output_info }}
+NTSTEP_BETWEEN_OUTPUT_INFO      = 100
 
 # interval in time steps for temporary writing of seismograms
-NTSTEP_BETWEEN_OUTPUT_SEISMOS   = {{ simulation.ntstep_between_output_seismos }}
+NTSTEP_BETWEEN_OUTPUT_SEISMOS   = 5000000
 NTSTEP_BETWEEN_READ_ADJSRC      = 1000
 
 # output format for the seismograms (one can use either or all of the three formats)
@@ -105,8 +105,8 @@
 USE_BINARY_FOR_LARGE_FILE       = .false.
 
 # flag to impose receivers at the surface or allow them to be buried
-RECEIVERS_CAN_BE_BURIED         = .{{ simulation.receivers_can_be_buried }}.
+RECEIVERS_CAN_BE_BURIED         = .true.
 
 # print source time function
-PRINT_SOURCE_TIME_FUNCTION      = .{{ simulation.print_source_time_function }}.
+PRINT_SOURCE_TIME_FUNCTION      = .false.
 

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/parameters.pml
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/parameters.pml	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/parameters.pml	2008-05-02 01:53:56 UTC (rev 11893)
@@ -5,23 +5,11 @@
 <inventory>
 
     <component name="Specfem3DGlobe">
-        <facility name="model">{{ simulation.model.get_type_id }}</facility>
+        <facility name="model">{{ simulation.get_model_id }}</facility>
 
         <component name="solver">
-            <property name="simulation-type">{{ simulation.get_simulation_type_id }}</property>
-            <property name="save-forward">{{ simulation.save_forward }}</property>
             <property name="record-length">{{ simulation.record_length }}*minute</property>
             <property name="absorbing-conditions">{{ simulation.auto_absorbing_conditions }}</property>
-            <property name="movie-surface">{{ simulation.movie_surface }}</property>
-            <property name="movie-volume">{{ simulation.movie_volume }}</property>
-            <property name="ntstep-between-frames">{{ simulation.ntstep_between_frames }}</property>
-            <property name="hdur-movie">{{ simulation.hdur_movie }}</property>
-            <property name="number-of-runs">1</property>
-            <property name="number-of-this-run">1</property>
-            <property name="ntstep-between-output-info">{{ simulation.ntstep_between_output_info }}</property>
-            <property name="ntstep-between-output-seismos">{{ simulation.ntstep_between_output_seismos }}</property>
-            <property name="receivers-can-be-buried">{{ simulation.receivers_can_be_buried }}</property>
-            <property name="print-source-time-function">{{ simulation.print_source_time_function }}</property>
         </component>
 
 
@@ -36,17 +24,16 @@
             <property name="nex-eta">{{ simulation.mesh.nex_eta }}</property>
             <property name="nproc-xi">{{ simulation.mesh.nproc_xi }}</property>
             <property name="nproc-eta">{{ simulation.mesh.nproc_eta }}</property>
-            <property name="save-files">{{ simulation.mesh.save_files }}</property>
         </component>
 
 
         <component name="model">
-            <property name="oceans">{{ simulation.model.oceans }}</property>
-            <property name="ellipticity">{{ simulation.model.ellipticity }}</property>
-            <property name="topography">{{ simulation.model.topography }}</property>
-            <property name="gravity">{{ simulation.model.gravity }}</property>
-            <property name="rotation">{{ simulation.model.rotation }}</property>
-            <property name="attenuation">{{ simulation.model.attenuation }}</property>
+            <property name="oceans">{{ simulation.oceans }}</property>
+            <property name="ellipticity">{{ simulation.ellipticity }}</property>
+            <property name="topography">{{ simulation.topography }}</property>
+            <property name="gravity">{{ simulation.gravity }}</property>
+            <property name="rotation">{{ simulation.rotation }}</property>
+            <property name="attenuation">{{ simulation.attenuation }}</property>
         </component>
 
     </component>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_form.html	2008-05-02 01:53:56 UTC (rev 11893)
@@ -56,7 +56,51 @@
         {% if form.model.errors %}<span class=error>{{ form.model.errors|join:", " }}</span>{% endif %}
     </div>
 
+    <div class=checkbox>
+        {{ form.oceans }}
+        <label for="id_oceans" class=after>oceans</label>
+        {% if form.oceans.errors %}<span class=error>{{ form.oceans.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, the effect of the oceans on seismic wave propagation will be incorporated based upon the approximate treatment discussed in Komatitsch and Tromp [2002b]. This feature is inexpensive from a numerical perspective, both in terms of memory requirements and CPU time. This approximation is accurate at periods of roughly 20s and longer. At shorter periods the effect of water phases/reverberations is not taken into account, even when the flag is on.</span>{% endif %}
+    </div>
 
+    <div class=checkbox>
+        {{ form.gravity }}
+        <label for="id_gravity" class=after>gravity</label>
+        {% if form.gravity.errors %}<span class=error>{{ form.gravity.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, self-gravitation will be incorporated in the Cowling approximation [Komatitsch and Tromp, 2002b, Dahlen and Tromp, 1998]. Turning this feature on is relatively inexpensive, both from the perspective of memory requirements as well as in terms of computational speed.</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.attenuation }}
+        <label for="id_attenuation" class=after>attenuation</label>
+        {% if form.attenuation.errors %}<span class=error>{{ form.attenuation.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, attenuation will be incorporated. Turning this feature on increases the memory requirements significantly (roughly by a factor of 1.5), and is numerically fairly expensive. Of course for realistic simulations this flag should be turned on. See Komatitsch and Tromp [1999, 2002a] for a discussion on the implementation of attenuation based upon standard linear solids.</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.topography }}
+        <label for="id_topography" class=after>topography</label>
+        {% if form.topography.errors %}<span class=error>{{ form.topography.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, topography and bathymetry will be incorporated based upon model ETOPO5 [NOAA, 1988]. This feature adds no cost to the simulation.</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.rotation }}
+        <label for="id_rotation" class=after>rotation</label>
+        {% if form.rotation.errors %}<span class=error>{{ form.rotation.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, the Coriolis effect will be incorporated. Turning this feature on is relatively cheap 
+numerically.</span>{% endif %}
+    </div>
+
+    <div class=checkbox>
+        {{ form.ellipticity }}
+        <label for="id_ellipticity" class=after>ellipticity</label>
+        {% if form.ellipticity.errors %}<span class=error>{{ form.ellipticity.errors|join:", " }}</span>{% endif %}
+        {% if help_visible %}<span class=help>If selected, the mesh will make the Earth model elliptical in shape according to
+ Clairaut's equation [Dahlen and Tromp, 1998]. This feature adds no cost to the simulation.</span>{% endif %}
+    </div>
+
+
     <div><input class=submit type="submit" name="save" value="Save" />
     </div>
 

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/specfem3dglobeparameters_list.html	2008-05-02 01:53:56 UTC (rev 11893)
@@ -10,10 +10,17 @@
 {% 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></colgroup>
-
         <thead>
-        <tr><th>mesh</th><th>model</th></tr>
+        <tr>
+            <th>mesh</th>
+            <th>model</th>
+            <th>oceans</th>
+            <th>gravity</th>
+            <th>attenuation</th>
+            <th>topography</th>
+            <th>rotation</th>
+            <th>ellipticity</th>
+        </tr>
         </thead>
         
         <tbody>
@@ -22,6 +29,12 @@
             <td><a href="/specfem3dglobe/specfem3dglobemeshes/{{ object.mesh.id }}/">{{ object.mesh }}</a><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>
         </tr>
         {% endfor %}
         </tbody>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/stationlist_upload.html	2008-05-02 01:53:56 UTC (rev 11893)
@@ -25,17 +25,11 @@
     <div class=tab30ex>
 
     <div>
-        <label for="id_name" class=before>name for this station list</label>
-        {{ form.name }}
-        {% if form.name.errors %}<span class=error>{{ form.name.errors|join:", " }}</span>{% endif %}
+        <label for="id_file" class=before>local file to upload</label>
+        {{ form.file }} {{ form.file_file }}
+        {% if form.file.errors %}<span class=error>{{ form.file.errors|join:", " }}</span>{% endif %}
     </div>
 
-    <div>
-        <label for="id_stations" class=before>local file to upload</label>
-        {{ form.stations }} {{ form.stations_file }}
-        {% if form.stations.errors %}<span class=error>{{ form.stations.errors|join:", " }}</span>{% endif %}
-    </div>
-
     <p>Uploaded files must be in <code>STATIONS</code> format.
 
     <div>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/urls.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/urls.py	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/urls.py	2008-05-02 01:53:56 UTC (rev 11893)
@@ -14,12 +14,8 @@
 
 
 def list_detail_args(ModelClass):
-    if hasattr(ModelClass, 'user_objects'):
-        queryset = ModelClass.user_objects.all()
-    else:
-        queryset = ModelClass.objects.all()
     return dict(
-        queryset = queryset,
+        queryset = ModelClass.objects.all(),
         allow_empty = True,
         )
 
@@ -37,9 +33,10 @@
 
 def upload_args(ModelClass):
     return dict(
-        model = ModelClass,
+        ModelClass = ModelClass,
         )
 
+
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Registration
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -50,48 +47,22 @@
 }
 
 
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Events
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
 event_detail_args = {
-    'queryset': models.Event.user_objects.all(),
-    'extra_context': { 'object_list': models.Event.user_objects.all() },
+    'queryset': models.Event.objects.all(),
+    'extra_context': { 'object_list': models.Event.objects.all() },
 }
 
 source_detail_args = {
     'queryset': models.Source.objects.all(),
 }
 
-source_create_update_args = {
-    'model': models.Source,
-    'post_save_redirect': '/specfem3dglobe/events/',
-    }
 
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Stations
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-stationlist_create_update_args = {
-    'model': models.StationList,
-    'post_save_redirect': '/specfem3dglobe/stations/',
-    'follow': { 'user': False },
-    }
-
-
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Runs, Jobs, Output
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-
-
-
-# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # URLs
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -114,7 +85,7 @@
 
     (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.user_objects.all()}),
+    (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')),
 
@@ -148,7 +119,7 @@
     (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', source_create_update_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'),
@@ -161,8 +132,8 @@
     # stations
     (r'^stations/$', 'SeismoWebPortal.views.station_index'),
     (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.user_objects.all()}),
-    (r'^stations/(?P<object_id>\d+)/edit/$', 'django.views.generic.create_update.update_object', stationlist_create_update_args),
+    (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'),

Modified: cs/portal/trunk/northridge/SeismoWebPortal/views.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/views.py	2008-05-02 01:25:48 UTC (rev 11892)
+++ cs/portal/trunk/northridge/SeismoWebPortal/views.py	2008-05-02 01:53:56 UTC (rev 11893)
@@ -8,7 +8,7 @@
 from django.http import HttpResponse, HttpResponseRedirect, Http404
 from django.shortcuts import render_to_response, get_object_or_404
 from django.template.context import RequestContext
-from create_update import create_object, update_object
+from django.views.generic import create_update
 
 import cmt
 import models
@@ -23,7 +23,6 @@
 
 
 OUTPUT_ROOT = os.path.join(settings.MEDIA_ROOT, 'SeismoWebPortal', 'output')
-disapproval = "You cannot run simulations until you are approved by a site administrator."
 
 
 # Create our own version of 'login_required' which redirects to our login page.
@@ -524,14 +523,13 @@
         manipulator = SingleSourceEventAddManipulator()
         event = None
     elif action == "edit":
-        event = get_object_or_404(models.Event, id=object_id, user__exact=request.user)
+        event = get_object_or_404(models.Event, id=object_id)
         if not event.singleSource:
-            return update_object(
+            return create_update.update_object(
                 request,
                 models.Event,
                 object_id,
                 post_save_redirect = '/specfem3dglobe/events/',
-                follow = { 'user': False },
                 )
         manipulator = SingleSourceEventChangeManipulator(event)
     else:
@@ -542,7 +540,7 @@
         errors = manipulator.get_validation_errors(new_data)
         if not errors:
             manipulator.do_html2python(new_data)
-            new_event = manipulator.save(new_data, request.user)
+            new_event = manipulator.save(new_data)
             url = "/specfem3dglobe/events/%i/" % new_event.id
             return HttpResponseRedirect(url)
     else:
@@ -560,10 +558,18 @@
 manipulate_event = login_required(manipulate_event)
 
 
-def upload(request, model):
+def upload(request, ModelClass):
+    import fformats
+    from forms import UploadManipulator
     from os.path import dirname
-    
-    manipulator = model.UploadManipulator()
+
+    formats = {
+        models.Event:         fformats.CMTSolutionFormat,
+        models.StationList:   fformats.StationListFormat,
+        models.MineosModel:   fformats.MineosModelFormat,
+        }
+
+    manipulator = UploadManipulator(formats[ModelClass]())
     help_visible = get_help_visible(request)
     
     if request.method == 'POST':
@@ -580,14 +586,14 @@
             errors = manipulator.get_validation_errors(new_data)
             if not errors:
                 manipulator.do_html2python(new_data)
-                obj = manipulator.save(new_data, request.user)
+                obj = manipulator.save(new_data)
                 url = "%s/%i/" % (dirname(dirname(request.path)), obj.id)
                 return HttpResponseRedirect(url)
     else:
         errors = new_data = {}
 
     form = forms.FormWrapper(manipulator, new_data, errors)
-    template_name = "%s/%s_upload.html" % (model._meta.app_label, model._meta.object_name.lower())
+    template_name = "%s/%s_upload.html" % (ModelClass._meta.app_label, ModelClass._meta.object_name.lower())
     return render_to_response(template_name,
                               {'form': form, 'help_visible': help_visible},
                               RequestContext(request, {}))
@@ -677,7 +683,7 @@
 
 
 def station_index(request):
-    station_lists = models.StationList.objects.filter(user__exact=request.user)
+    station_lists = models.StationList.objects.all()
     return render_to_response('SeismoWebPortal/station_index.html',
                               {'station_lists': station_lists },
                               RequestContext(request, {}))



More information about the cig-commits mailing list