diff --git a/db.sqlite3 b/db.sqlite3 index de1f1b3..bb152c7 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/three_d_viewer/migrations/0006_auto__chg_field_mineral_habit.py b/three_d_viewer/migrations/0006_auto__chg_field_mineral_habit.py new file mode 100644 index 0000000..8b38686 --- /dev/null +++ b/three_d_viewer/migrations/0006_auto__chg_field_mineral_habit.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'Mineral.habit' + db.alter_column(u'three_d_viewer_mineral', 'habit', self.gf('django.db.models.fields.CharField')(max_length=1000)) + + def backwards(self, orm): + + # Changing field 'Mineral.habit' + db.alter_column(u'three_d_viewer_mineral', 'habit', self.gf('django.db.models.fields.CharField')(max_length=100)) + + models = { + u'three_d_viewer.answer': { + 'Meta': {'object_name': 'Answer'}, + 'correct': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': u"orm['three_d_viewer.Question']"}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '2000'}) + }, + u'three_d_viewer.category': { + 'Meta': {'object_name': 'Category'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['three_d_viewer.Category']"}) + }, + u'three_d_viewer.mineral': { + 'Meta': {'object_name': 'Mineral', '_ormbases': [u'three_d_viewer.Sample']}, + 'chemical_formula': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'cleavage_fracture': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'colour': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'crystallography': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'habit': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}), + 'hardness': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '3', 'decimal_places': '2', 'blank': 'True'}), + 'identifying_features': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}), + 'lustre': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'occurance': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}), + u'sample_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['three_d_viewer.Sample']", 'unique': 'True', 'primary_key': 'True'}), + 'specific_gravity': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '4', 'decimal_places': '2', 'blank': 'True'}), + 'streak': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}) + }, + u'three_d_viewer.question': { + 'Meta': {'object_name': 'Question'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'sample': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questions'", 'to': u"orm['three_d_viewer.Sample']"}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '2000'}) + }, + u'three_d_viewer.sample': { + 'Meta': {'object_name': 'Sample'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'description': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '2000', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model_filename': ('django.db.models.fields.CharField', [], {'max_length': '1000'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'samples'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['three_d_viewer.Category']"}) + } + } + + complete_apps = ['three_d_viewer'] \ No newline at end of file diff --git a/three_d_viewer/models.py b/three_d_viewer/models.py index 0b6f24c..21c1a2d 100644 --- a/three_d_viewer/models.py +++ b/three_d_viewer/models.py @@ -32,6 +32,14 @@ class Category(CommonInfo): on_delete=models.SET_NULL, related_name='children') + @property + def active_children(self): + return self.children.filter(active=True) + + @property + def active_samples(self): + return self.samples.filter(active=True) + class Sample(CommonInfo): """ @@ -57,12 +65,12 @@ class Mineral(Sample): lustre = models.CharField(max_length=100, blank=True) colour = models.CharField(max_length=100, blank=True) streak = models.CharField(max_length=100, blank=True) - habit = models.CharField(max_length=100, blank=True) + habit = models.CharField(max_length=1000, blank=True) crystallography = models.CharField(max_length=100, blank=True) identifying_features = models.CharField(max_length=1000, blank=True) occurance = models.CharField(max_length=1000, blank=True) - + class Question(models.Model): """ The definition of a multiple choice question, associated with a Sample diff --git a/three_d_viewer/templates/three_d_viewer/detail.html b/three_d_viewer/templates/three_d_viewer/detail.html index 9225853..be8310e 100644 --- a/three_d_viewer/templates/three_d_viewer/detail.html +++ b/three_d_viewer/templates/three_d_viewer/detail.html @@ -72,8 +72,15 @@ function formatNumber(numero, decimales){ function load(){ window.addEventListener('resize', resizeCanvas, false); resizeCanvas(); - + var sampleFilename = '{{ sample.model_filename|escapejs }}'; + + if (sampleFilename.trim() == "") + { + document.getElementById("progress").innerHTML = "No model defined!"; + return; + } + request = new XMLHttpRequest(); request.open("GET", '{{ MEDIA_URL }}' + sampleFilename, true); request.overrideMimeType("text/plain; charset=x-user-defined"); @@ -113,7 +120,7 @@ function webGLStart(){ var canvas = document.getElementById("canvas"); canvas.oncontextmenu = function() { return false; } // supress the context menu in the canvas - + initGL(canvas); initBoundingBox(); initOffsets(); @@ -347,15 +354,15 @@ function handleMouseMove(event){ var newY = event.clientY; var deltaX = newX - lastMouseX; var deltaY = newY - lastMouseY; - + switch (event.which) { case 1: // left mouse - + var newRotationMatrix = mat4.create(); mat4.identity(newRotationMatrix); mat4.rotate(newRotationMatrix, degToRad(deltaX / 5), [0, 1, 0]); - + mat4.rotate(newRotationMatrix, degToRad(deltaY / 5), [1, 0, 0]); mat4.multiply(newRotationMatrix, rotationMatrix, rotationMatrix); @@ -369,8 +376,8 @@ function handleMouseMove(event){ console.log('moving ' + deltaX + ', ' + deltaY) break; - } - + } + lastMouseX = newX lastMouseY = newY; } @@ -379,13 +386,13 @@ function handleMouseMove(event){ function resizeCanvas() { var canvas = document.getElementById("canvas") ; var parent = document.getElementById("contentdiv"); - + var canvasWidth1 = canvas.width; var canvasHeight1 = canvas.height; - + canvas.width = parent.offsetWidth; canvas.height = parent.offsetHeight; - + if (gl){ /*hmove = canvas.width / 2 - canvasWidth1 / 2 vmove = canvas.height / 2 - canvasHeight1 / 2 diff --git a/three_d_viewer/templates/three_d_viewer/treenode.html b/three_d_viewer/templates/three_d_viewer/treenode.html index 2399ada..fcebdec 100644 --- a/three_d_viewer/templates/three_d_viewer/treenode.html +++ b/three_d_viewer/templates/three_d_viewer/treenode.html @@ -1,13 +1,13 @@