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