diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
index 95d82fc..744b0cb 100644
--- a/.idea/dataSources.xml
+++ b/.idea/dataSources.xml
@@ -2,8 +2,9 @@
+ sqlite.xerial
org.sqlite.JDBC
- jdbc:sqlite:$PROJECT_DIR$/db.sqlite3
+ jdbc:sqlite:H:\GitHub\rockviewer\db.sqlite3
file://$USER_HOME$/.PyCharm30/config/jdbc-drivers/xerial-sqlite-license.txt
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 21955c8..8823786 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/.idea/rockviewer.iml b/.idea/rockviewer.iml
index 51ac604..acd6e51 100644
--- a/.idea/rockviewer.iml
+++ b/.idea/rockviewer.iml
@@ -11,7 +11,7 @@
-
+
@@ -20,9 +20,5 @@
-
-
-
-
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index aebe4b0..dbcce07 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -2,11 +2,16 @@
-
-
+
+
+
+
+
+
+
@@ -35,104 +40,130 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -153,19 +184,26 @@
+
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
@@ -193,6 +231,7 @@
+
@@ -339,78 +378,15 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -429,6 +405,7 @@
+
@@ -517,27 +494,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -563,7 +520,27 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -672,32 +649,36 @@
1392989898846
1392989898846
-
+
+ 1393200126352
+ 1393200126352
+
+
-
+
+
-
-
+
+
-
+
-
-
+
-
+
@@ -713,58 +694,103 @@
-
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -772,26 +798,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -813,20 +819,110 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/db.sqlite3 b/db.sqlite3
index e798f78..568e4ca 100644
Binary files a/db.sqlite3 and b/db.sqlite3 differ
diff --git a/three_d_viewer/models.py b/three_d_viewer/models.py
index aa5fc64..bb97ec9 100644
--- a/three_d_viewer/models.py
+++ b/three_d_viewer/models.py
@@ -59,30 +59,43 @@ class Sample(CommonInfo):
#Use the inheritance manager for handling subclasses
objects = InheritanceManager()
+ def GetTopParent(self, current_parent):
+ if current_parent.parent is None:
+ return current_parent
+ else:
+ return self.GetTopParent(current_parent.parent)
+
@property
def url(self):
- return 'three_d_viewer:mineral_detail'
- #if isinstance(self, Mineral):
- # return 'three_d_viewer:mineral_detail'
- #else:
- # return 'three_d_viewer:detail'
+ cat = self.GetTopParent(self.parent)
+
+ if cat.name == 'Fossils':
+ return 'three_d_viewer:fossil_detail'
+ elif cat.name == 'Rocks':
+ return 'three_d_viewer:rock_detail'
+ else:
+ return 'three_d_viewer:sample_detail'
class Mineral(Sample):
- """
- Extending the Sample class to add details specific to minerals
- """
- chemical_formula = models.CharField(max_length=100, blank=True)
- hardness = models.DecimalField(max_digits=3, decimal_places=2, blank=True, null=True)
- specific_gravity = models.DecimalField(max_digits=4, decimal_places=2, blank=True, null=True)
- cleavage_fracture = models.CharField(max_length=100, blank=True)
- 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=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)
+ """
+ Extending the Sample class to add details specific to minerals
+ """
+ chemical_formula = models.CharField(max_length=100, blank=True)
+ hardness = models.DecimalField(max_digits=3, decimal_places=2, blank=True, null=True)
+ specific_gravity = models.DecimalField(max_digits=4, decimal_places=2, blank=True, null=True)
+ cleavage_fracture = models.CharField(max_length=100, blank=True)
+ 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=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)
+
+ @property
+ def url(self):
+ return 'three_d_viewer:mineral_detail'
class Question(models.Model):
diff --git a/three_d_viewer/templates/three_d_viewer/base.html b/three_d_viewer/templates/three_d_viewer/base.html
index a1d7de9..303d7be 100644
--- a/three_d_viewer/templates/three_d_viewer/base.html
+++ b/three_d_viewer/templates/three_d_viewer/base.html
@@ -37,8 +37,8 @@
Self Test
- Rocks
- Fossils
+ Rocks
+ Fossils
diff --git a/three_d_viewer/templates/three_d_viewer/fossil_detail.html b/three_d_viewer/templates/three_d_viewer/fossil_detail.html
new file mode 100644
index 0000000..5edab8a
--- /dev/null
+++ b/three_d_viewer/templates/three_d_viewer/fossil_detail.html
@@ -0,0 +1,35 @@
+{% extends "three_d_viewer/sample_detail.html" %}
+
+{% block load %}
+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");
+ request.onreadystatechange = function(){
+ if (this.readyState == 3 || this.readyState == 4){
+ document.getElementById("progress").innerHTML = "Downloading... "
+ + formatNumber(this.responseText.length / 1048576, 2) + " MB";
+ }
+ if (this.readyState == 4 && (this.status == 200 || this.status == 0) ){
+ document.getElementById("progress").innerHTML = "Unpacking...";
+ setTimeout(loaded, 1);
+ }
+ }
+ request.send();
+}
+{% endblock load %}
+
+{% block menu_header %}Select a Fossil{% endblock %}
+
+
diff --git a/three_d_viewer/templates/three_d_viewer/fossil_practice.html b/three_d_viewer/templates/three_d_viewer/fossil_practice.html
new file mode 100644
index 0000000..8a45bac
--- /dev/null
+++ b/three_d_viewer/templates/three_d_viewer/fossil_practice.html
@@ -0,0 +1,3 @@
+{% extends "three_d_viewer/sample_practice.html" %}
+
+{% block menu_header %}Select a Fossil{% endblock %}
\ No newline at end of file
diff --git a/three_d_viewer/templates/three_d_viewer/mineral_detail.html b/three_d_viewer/templates/three_d_viewer/mineral_detail.html
index 547384d..9c2636c 100644
--- a/three_d_viewer/templates/three_d_viewer/mineral_detail.html
+++ b/three_d_viewer/templates/three_d_viewer/mineral_detail.html
@@ -1,72 +1,4 @@
-{% extends "three_d_viewer/minerals_practice.html" %}
-{% load static %}
-
-{% block includes %}
-{{ block.super }}
-
-
-
-
-
-
-
-
-
-{% endblock %}
-
-{% block loadscript %}"load()"{% endblock %}
-
-{% block mineral_detail %}
+{% block sample_detail %}
{{ mineral.name }}
@@ -453,11 +77,4 @@ function resizeCanvas() {
{{ mineral.occurance }}
-{% endblock %}
-
-{% block 3dcontent %}
-
-{% endblock %}
\ No newline at end of file
+{% endblock %}
\ No newline at end of file
diff --git a/three_d_viewer/templates/three_d_viewer/minerals_practice.html b/three_d_viewer/templates/three_d_viewer/minerals_practice.html
index a586bb3..1dbadeb 100644
--- a/three_d_viewer/templates/three_d_viewer/minerals_practice.html
+++ b/three_d_viewer/templates/three_d_viewer/minerals_practice.html
@@ -1,23 +1,3 @@
-{% extends "three_d_viewer/base.html" %}
+{% extends "three_d_viewer/sample_practice.html" %}
-{% block content %}
-
-
-{% block 3dcontent %}
-{% endblock %}
-
-{% endblock %}
\ No newline at end of file
+{% block menu_header %}Select a Mineral{% endblock %}
\ No newline at end of file
diff --git a/three_d_viewer/templates/three_d_viewer/rock_detail.html b/three_d_viewer/templates/three_d_viewer/rock_detail.html
new file mode 100644
index 0000000..ea83335
--- /dev/null
+++ b/three_d_viewer/templates/three_d_viewer/rock_detail.html
@@ -0,0 +1,35 @@
+{% extends "three_d_viewer/sample_detail.html" %}
+
+{% block load %}
+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");
+ request.onreadystatechange = function(){
+ if (this.readyState == 3 || this.readyState == 4){
+ document.getElementById("progress").innerHTML = "Downloading... "
+ + formatNumber(this.responseText.length / 1048576, 2) + " MB";
+ }
+ if (this.readyState == 4 && (this.status == 200 || this.status == 0) ){
+ document.getElementById("progress").innerHTML = "Unpacking...";
+ setTimeout(loaded, 1);
+ }
+ }
+ request.send();
+}
+{% endblock load %}
+
+{% block menu_header %}Select a rock{% endblock %}
+
+
diff --git a/three_d_viewer/templates/three_d_viewer/rock_practice.html b/three_d_viewer/templates/three_d_viewer/rock_practice.html
new file mode 100644
index 0000000..9a85982
--- /dev/null
+++ b/three_d_viewer/templates/three_d_viewer/rock_practice.html
@@ -0,0 +1,3 @@
+{% extends "three_d_viewer/sample_practice.html" %}
+
+{% block menu_header %}Select a Rock{% endblock %}
\ No newline at end of file
diff --git a/three_d_viewer/templates/three_d_viewer/sample_detail.html b/three_d_viewer/templates/three_d_viewer/sample_detail.html
new file mode 100644
index 0000000..70eb36c
--- /dev/null
+++ b/three_d_viewer/templates/three_d_viewer/sample_detail.html
@@ -0,0 +1,406 @@
+{% extends "three_d_viewer/sample_practice.html" %}
+{% load static %}
+
+{% block includes %}
+{{ block.super }}
+
+
+
+
+
+
+
+
+
+{% endblock %}
+
+{% block loadscript %}"load()"{% endblock %}
+
+{% block sample_detail %}
+ {% endblock %}
+
+{% block 3dcontent %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/three_d_viewer/templates/three_d_viewer/sample_practice.html b/three_d_viewer/templates/three_d_viewer/sample_practice.html
new file mode 100644
index 0000000..7f01037
--- /dev/null
+++ b/three_d_viewer/templates/three_d_viewer/sample_practice.html
@@ -0,0 +1,23 @@
+{% extends "three_d_viewer/base.html" %}
+
+{% block content %}
+
+
+{% block 3dcontent %}
+{% endblock %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/three_d_viewer/urls.py b/three_d_viewer/urls.py
index da55011..5918a3e 100644
--- a/three_d_viewer/urls.py
+++ b/three_d_viewer/urls.py
@@ -9,11 +9,12 @@ urlpatterns = patterns(
url(r'^$', generic.TemplateView.as_view(template_name="three_d_viewer/home.html"), name='home'),
url(r'^minerals_theory/$', generic.TemplateView.as_view(template_name="three_d_viewer/minerals_theory.html"), name='minerals_theory'),
url(r'^minerals_practice/$', views.MineralPracticeView.as_view(template_name="three_d_viewer/minerals_practice.html"), name='minerals_practice'),
- url(r'^minerals_selftest/$', generic.TemplateView.as_view(template_name="three_d_viewer/minerals_selftest.html"), name='minerals_selftest'),
url(r'^minerals/(?P\d+)/$', views.MineralDetailView.as_view(), name='mineral_detail'),
- #url(r'^minerals/(?P\d+)/$', views.MineralPracticeView.as_view(), name='mineral_practice'),
- #url(r'^(?P\d+)/$', views.DetailView.as_view(), name='detail'),
- #url(r'^minerals/(?P\d+)/$', views.MineralDetailView.as_view(), name='mineral_detail'),
+ url(r'^minerals_selftest/$', generic.TemplateView.as_view(template_name="three_d_viewer/minerals_selftest.html"), name='minerals_selftest'),
+ url(r'^rock_practice/$', views.RockPracticeView.as_view(), name='rocks_practice'),
+ url(r'^rocks/(?P\d+)/$', views.RockDetailView.as_view(), name='rock_detail'),
+ url(r'^fossil_practice/$', views.FossilPracticeView.as_view(), name='fossil_practice'),
+ url(r'^fossils/(?P\d+)/$', views.FossilDetailView.as_view(), name='fossil_detail'),
url(r'^media/(?P.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT}),
)
diff --git a/three_d_viewer/views.py b/three_d_viewer/views.py
index 7b2b547..5c3d860 100644
--- a/three_d_viewer/views.py
+++ b/three_d_viewer/views.py
@@ -27,7 +27,7 @@ class HomeView(generic.ListView):
return context
class MineralPracticeView(generic.ListView):
- model = Sample
+ model = Mineral
template_name = 'three_d_viewer/minerals_practice.html'
def get_context_data(self, **kwargs):
@@ -41,23 +41,6 @@ class MineralPracticeView(generic.ListView):
context['active_samples'] = sorted(result, key=attrgetter('name'))
return context
-class DetailView(generic.DetailView):
- """
- Define the view to view the 3D model of a sample
- """
-
- model = Sample
- template_name = 'three_d_viewer/detail.html'
- parent_categories = Category.objects.filter(parent=None). \
- filter(active=True).order_by("name")
-
- def get_context_data(self, **kwargs):
- context = super(DetailView, self).get_context_data(**kwargs)
- context['active_samples'] = Sample.objects.select_subclasses(Mineral).filter(active=True).order_by('name')
- context['parent_categories'] = Category.objects.filter(parent=None). \
- filter(active=True).order_by('name')
- return context
-
class MineralDetailView(generic.DetailView):
"""
Add extra functionality for mineral details
@@ -69,17 +52,87 @@ class MineralDetailView(generic.DetailView):
parent_categories = Category.objects.filter(parent=None). \
filter(active=True).order_by("name")
- #def get_context_data(self, **kwargs):
- # context = super(MineralDetailView, self).get_context_data(**kwargs)
- # context['active_samples'] = Sample.objects.select_subclasses(Mineral).filter(active=True).order_by('name')
- # context['parent_categories'] = Category.objects.filter(parent=None). \
- # filter(active=True).order_by('name')
- # return context
def get_context_data(self, **kwargs):
context = super(MineralDetailView, self).get_context_data(**kwargs)
cat = Category.objects.get(name='Minerals')
result = cat.active_samples
+ for child in cat.active_children:
+ result = chain(result, child.active_samples)
+
+ context['active_samples'] = sorted(result, key=attrgetter('name'))
+ return context
+
+class RockPracticeView(generic.ListView):
+ model = Sample
+ template_name = 'three_d_viewer/rock_practice.html'
+
+ parent_categories = Category.objects.filter(parent=None). \
+ filter(active=True).order_by("name")
+
+
+ def get_context_data(self, **kwargs):
+ context = super(RockPracticeView, self).get_context_data(**kwargs)
+ cat = Category.objects.get(name='Rocks')
+ result = cat.active_samples
+
+ for child in cat.active_children:
+ result = chain(result, child.active_samples)
+
+ context['active_samples'] = sorted(result, key=attrgetter('name'))
+ return context
+
+class RockDetailView(generic.DetailView):
+ model = Sample
+ template_name = 'three_d_viewer/rock_detail.html'
+
+ parent_categories = Category.objects.filter(parent=None). \
+ filter(active=True).order_by("name")
+
+
+ def get_context_data(self, **kwargs):
+ context = super(RockDetailView, self).get_context_data(**kwargs)
+ cat = Category.objects.get(name='Rocks')
+ result = cat.active_samples
+
+ for child in cat.active_children:
+ result = chain(result, child.active_samples)
+
+ context['active_samples'] = sorted(result, key=attrgetter('name'))
+ return context
+
+class FossilPracticeView(generic.ListView):
+ model = Sample
+ template_name = 'three_d_viewer/fossil_practice.html'
+
+ parent_categories = Category.objects.filter(parent=None). \
+ filter(active=True).order_by("name")
+
+
+ def get_context_data(self, **kwargs):
+ context = super(FossilPracticeView, self).get_context_data(**kwargs)
+ cat = Category.objects.get(name='Fossils')
+ result = cat.active_samples
+
+ for child in cat.active_children:
+ result = chain(result, child.active_samples)
+
+ context['active_samples'] = sorted(result, key=attrgetter('name'))
+ return context
+
+class FossilDetailView(generic.DetailView):
+ model = Sample
+ template_name = 'three_d_viewer/fossil_detail.html'
+
+ parent_categories = Category.objects.filter(parent=None). \
+ filter(active=True).order_by("name")
+
+
+ def get_context_data(self, **kwargs):
+ context = super(FossilDetailView, self).get_context_data(**kwargs)
+ cat = Category.objects.get(name='Fossils')
+ result = cat.active_samples
+
for child in cat.active_children:
result = chain(result, child.active_samples)