From 4ffca36884bd9f53344c7bd3210cc26452155d57 Mon Sep 17 00:00:00 2001 From: Shane Frischkorn Date: Tue, 21 Jan 2014 15:32:35 +1000 Subject: [PATCH] Added details for minerals and fixed use of the active flag --- db.sqlite3 | Bin 167936 -> 172032 bytes .../0006_auto__chg_field_mineral_habit.py | 67 ++++++++++++++++++ three_d_viewer/models.py | 12 +++- .../templates/three_d_viewer/detail.html | 27 ++++--- .../templates/three_d_viewer/treenode.html | 4 +- 5 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 three_d_viewer/migrations/0006_auto__chg_field_mineral_habit.py diff --git a/db.sqlite3 b/db.sqlite3 index de1f1b3e0f08d79fae6c8bac67ff9d8bae804cad..bb152c796271bf578d9d92084c7cb2a1801767aa 100644 GIT binary patch delta 6049 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 JNZ+8B`wy+B$o&8S delta 715 zcmZuuZAg<*6u#%x`R?mIXA@_`Qa3HsEYZ0{EwcI{g>$YC@kfEpTC(zE+Ll^BR1nsm z+J?v_W@H5Y>PI>8H3ADsFe3UQ`XV!;py&&X5-RDopkH0?bMN7vbDneVa|Ukc2gdZ# ztaSF4F;*Z@Bme?+v2_lK&0X35aGJ^-)#c7=r=w&;MX6YcZP#Z?GqqX|BRys)ImSYR zL%&H^tM$m=5?<51tN~B`VB>Jpl6|=FyECzCX zcD<~Kn;RRX@zuI)osQ*ZnPnwkxK?(y`H%TKd`b3(zjls^W4)9!>5)=xY0ShJeGnbJ YA#;YJC@i_bBJcJ$IK=a3id{DU2G&T-d;kCd 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 @@