summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Wenham <sam@wenhams.co.uk>2019-03-04 19:39:43 +0000
committerSam Wenham <sam@wenhams.co.uk>2019-03-04 19:39:43 +0000
commitdc6d89b0ca5ab26dfdf8950a02300935c241f8bb (patch)
tree78feffcf35678d76afb7b2e9929f3c4eb2ac993a
parent6b59e3a68908b2ee3b05e4734a8f72d10a349c34 (diff)
downloadtroggle-dc6d89b0ca5ab26dfdf8950a02300935c241f8bb.tar.gz
troggle-dc6d89b0ca5ab26dfdf8950a02300935c241f8bb.tar.bz2
troggle-dc6d89b0ca5ab26dfdf8950a02300935c241f8bb.zip
Backed out changeset: f23440eb11a3
-rw-r--r--core/methods_millenial.py26
-rw-r--r--core/models_millenial.py33
-rw-r--r--core/views_caves.py23
-rw-r--r--databaseResetM.py3
-rw-r--r--media/scripts/TableSort.js11
-rw-r--r--parsers/cavesM.py143
-rw-r--r--settings.py3
-rw-r--r--templates/caveindex.html2
-rw-r--r--templates/millenialcaves.html136
-rw-r--r--urls.py4
10 files changed, 150 insertions, 234 deletions
diff --git a/core/methods_millenial.py b/core/methods_millenial.py
index ce7ce11..5d2483a 100644
--- a/core/methods_millenial.py
+++ b/core/methods_millenial.py
@@ -1,24 +1,2 @@
-import utm
-import math
-from django.conf import settings
-
-def lat_lon_entrance(utmstring):
- try:
- x = float(utmstring.split()[0])
- y = float(utmstring.split()[1])
- #return ' '+str(x+y)+' '+str(y)
- q = utm.to_latlon(x, y, 33, 'U')
- return "{:.5f} {:.5f}".format(q[0],q[1])
- except:
- return 'Not found'
-
-def top_camp_distance(utmstring):
- try:
- x = float(utmstring.split()[0])
- y = float(utmstring.split()[1])
- tx = settings.TOPCAMPX
- ty = settings.TOPCAMPY
- dist = math.sqrt( (tx-x)*(tx-x) + (ty-y)*(ty-y) )
- return "{:.1f}".format(dist)
- except:
- return 'Not found'
+def emptyfun():
+ return
diff --git a/core/models_millenial.py b/core/models_millenial.py
index c97be36..db893bc 100644
--- a/core/models_millenial.py
+++ b/core/models_millenial.py
@@ -1,7 +1,7 @@
from django.db import models
from django.conf import settings
-import troggle.core.methods_millenial as methods_millenial
+from troggle.core.methods_millenial import *
#
# This file was created in 2019
@@ -37,32 +37,15 @@ class CaveM(models.Model): #instance of this class corresponds to one 'thing' th
survex_file = models.TextField() #gives path to top level survex file
total_length = models.FloatField() #holds total length of this cave (as given by cavern)
total_depth = models.FloatField() #holds total depth of this cave (as given by cavern)
- description = models.TextField() #holds link to description
- date = models.TextField() #holds date of last visit
+ description = models.TextField() #holds decription of the cave
def top_camp_distance(self): #returns distance of this cave from topcamp
- return methods_millenial.top_camp_distance(self.entrance)
+ return 0
def top_camp_bearing(self): #returns bearing to this cave from topcamp in format 235.5 (float north-based azimuth)
- return methods_millenial.top_camp_bearing(self.entrance)
+ return 0
def top_camp_bearing_letter(self): #returns bearing to this cave from topcamp in format e.g. 'NE'
- return methods_millenial.top_camp_bearing_letter(self.entrance)
- def lat_lon_entrance(self): #lat_lon entrance location
- return methods_millenial.lat_lon_entrance(self.entrance)
-
-
-class Cave_descriptionM(models.Model): #instance of this class corresponds to each of the .html files in descriptions
- #each of those holds one XML field
- slug = models.TextField()
- explorers = models.TextField()
- underground_description = models.TextField()
- equipment = models.TextField()
- references = models.TextField()
- survey = models.TextField()
- kataster_status = models.TextField()
- underground_centre_line = models.TextField()
- survex_file = models.TextField() #as given in .html file
- notes = models.TextField()
-
-
+ return 0
+ def last_visit(self): #returns Survey class instance of the most recent visit
+ return 0
class ExpeditionM(models.Model): #instance of this class corresponds to one expo (usually one year)
date = models.CharField(max_length=100) #date in format YYYY.MM.DD-YYYY.MM.DD
@@ -74,7 +57,7 @@ class SurveyM(models.Model): #instance of this class corresponds to one .svx fil
class Logbook_entryM(models.Model): #instance of this class corresponds to one bit of logbook (c.f. expo.survex.com/years/2015/logbook.html or simil)
date = models.CharField(max_length=100) #date as typed into logbook
- contents = models.TextField() #contents of the logbook chunk
+ title = models.TextField() #contents of the logbook chunk
class Parser_messageM(models.Model): #instance of this class contains one error or warining message produce by any of the parsers
parsername = models.CharField(max_length = 20) #name of parser
diff --git a/core/views_caves.py b/core/views_caves.py
index 302003d..a785170 100644
--- a/core/views_caves.py
+++ b/core/views_caves.py
@@ -1,7 +1,7 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
-from troggle.core.models import CaveSlug, Cave, CaveAndEntrance, Survey, Expedition, QM, CaveDescription, EntranceSlug, Entrance, Area, SurvexStation, CaveM, Cave_descriptionM
+from troggle.core.models import CaveSlug, Cave, CaveAndEntrance, Survey, Expedition, QM, CaveDescription, EntranceSlug, Entrance, Area, SurvexStation
from troggle.core.forms import CaveForm, CaveAndEntranceFormSet, VersionControlCommentForm, EntranceForm, EntranceLetterForm
import troggle.core.models as models
import troggle.settings as settings
@@ -21,17 +21,6 @@ import settings
from PIL import Image, ImageDraw, ImageFont
import string, os, sys, subprocess
-def millenialcaves(request):
- #RW messing around area
- caves = CaveM.objects.all()
- descr = Cave_descriptionM.objects.all()
- return render_with_context(request,'millenialcaves.html',{'caves': caves,'descriptions' : descr})
-
-def millenialdescription(request, slug):
- desc = Cave_descriptionM.objects.get(slug=slug)
- return render_with_context(request,'cave_uground_description.html', {'cave': desc})
-
-
def getCave(cave_id):
"""Returns a cave object when given a cave name or number. It is used by views including cavehref, ent, and qm."""
try:
@@ -65,16 +54,16 @@ def caveindex(request):
caves = Cave.objects.all()
notablecavehrefs = settings.NOTABLECAVESHREFS
notablecaves = [Cave.objects.get(kataster_number=kataster_number) for kataster_number in notablecavehrefs ]
- #caves1623 = list(Cave.objects.filter(area__short_name = "1623"))
- caves1623 = list(Cave.objects.all())
+ caves1623 = list(Cave.objects.filter(area__short_name = "1623"))
caves1626 = list(Cave.objects.filter(area__short_name = "1626"))
caves1623.sort(caveCmp)
caves1626.sort(caveCmp)
return render_with_context(request,'caveindex.html', {'caves1623': caves1623, 'caves1626': caves1626, 'notablecaves':notablecaves, 'cavepage': True})
-
-
-
+def millenialcaves(request):
+ #RW messing around area
+ return HttpResponse("Test text", content_type="text/plain")
+
def cave3d(request, cave_id=''):
diff --git a/databaseResetM.py b/databaseResetM.py
index 4530763..07e4702 100644
--- a/databaseResetM.py
+++ b/databaseResetM.py
@@ -9,7 +9,7 @@ from django.contrib.auth.models import User
from django.http import HttpResponse
from django.core.urlresolvers import reverse
from troggle.core.models import Cave, Entrance
-from troggle.core.models import PersonM, SurveyM, CaveM, ExpeditionM, Logbook_entryM, Cave_descriptionM
+from troggle.core.models import PersonM, SurveyM, CaveM, ExpeditionM, Logbook_entryM
import troggle.flatpages.models
databasename=settings.DATABASES['default']['NAME']
@@ -42,7 +42,6 @@ def gracefull_flush():
SurveyM.objects.all().delete()
ExpeditionM.objects.all().delete()
Logbook_entryM.objects.all().delete()
- Cave_descriptionM.objects.all().delete()
print('Deleted contents of the database, ready to load new stuff :)')
def load_redirects():
diff --git a/media/scripts/TableSort.js b/media/scripts/TableSort.js
index 1ab80fd..39f5e92 100644
--- a/media/scripts/TableSort.js
+++ b/media/scripts/TableSort.js
@@ -34,18 +34,17 @@ function filterTable(tablename)
rows = table.rows;
for(i=1; i< rows.length; i++)
{
- name = (rows[i].getElementsByTagName("TD")[1]).innerHTML.toLowerCase();
+ name = (rows[i].getElementsByTagName("TD")[0]).innerHTML.toLowerCase();
- depth = (rows[i].getElementsByTagName("TD")[2]).innerHTML.toLowerCase();
+ depth = (rows[i].getElementsByTagName("TD")[1]).innerHTML.toLowerCase();
depth = Number(depth.replace(/[^0-9.]/g,''));
- length = (rows[i].getElementsByTagName("TD")[3]).innerHTML.toLowerCase();
+ length = (rows[i].getElementsByTagName("TD")[2]).innerHTML.toLowerCase();
length = Number(length.replace(/[^0-9.]/g,''));
- date = (rows[i].getElementsByTagName("TD")[4]).innerHTML.toLowerCase();
+ date = (rows[i].getElementsByTagName("TD")[3]).innerHTML.toLowerCase();
- //recentvisitor = (rows[i].getElementsByTagName("TD")[4]).innerHTML.toLowerCase();
- recentvisitor = ""
+ recentvisitor = (rows[i].getElementsByTagName("TD")[4]).innerHTML.toLowerCase();
if(cavename != "" && !name.includes(cavename))
{
diff --git a/parsers/cavesM.py b/parsers/cavesM.py
index 71bda0d..13cd5d5 100644
--- a/parsers/cavesM.py
+++ b/parsers/cavesM.py
@@ -19,23 +19,16 @@ def load():
print('Hi! I\'m caves parser. Ready to work')
print('Loading caves of 1623 area')
- loadarea('1623')
+ loadarea('caves-1623/')
def loadarea(areacode):
- if not file_exists(settings.SURVEX_DATA+'1623-and-1626.3d'):
- print('Computing master .3d file')
- bash('cavern -o'+settings.SURVEX_DATA+' '+settings.SURVEX_DATA+'1623-and-1626.svx')
- else:
- print('Loading from existing master .3d file')
-
- master3d = bash('dump3d -d '+settings.SURVEX_DATA+'1623-and-1626.3d').splitlines()
- master3dN = [x for x in master3d if ('NODE' in x)] #list of nodes of master survex file
- master3dL = [x for x in master3d if ('LINE' in x)] #list of nodes of master survex file
print('Searching all cave dirs files')
- basedir = settings.SURVEX_DATA+'caves-'+areacode+'/'
+ basedir = settings.SURVEX_DATA+areacode
+
+ bash('cavern -o'+settings.SURVEX_DATA+' '+settings.SURVEX_DATA+'1623-and-1626.svx')
cavedirs = bash("find "+basedir+" -maxdepth 1 -type d").splitlines() #this command finds all directories
print('Obtained list of directories! (#dirs='+str(len(cavedirs))+')')
@@ -47,14 +40,14 @@ def loadarea(areacode):
cavename = bash('echo '+cavedir+' | rev | cut -f1 -d \'/\' | rev').splitlines()[0] #get final bit of the directory
test = bash('if [ ! -f '+cavedir+'/'+cavename+'.svx ] ; then echo MISSING; fi')#test for file exisence
- if not file_exists(cavedir+'/'+cavename+'.svx'):
+ if 'MISSING' in test: #send error message to the database
msg = models.Parser_messageM(parsername='caves',content=cavedir+'/'+cavename+' MISSING!',message_type='warn')
print('Cave missing'+cavename+' :(')
msg.save()
continue
fullname=cavedir+'/'+cavename+'.svx'
print('Found cave:'+cavename)
- cavernout = bash('cavern -o '+cavedir+' '+fullname) #make cavern process the thing
+ cavernout = bash('cavern -q '+fullname) #make cavern process the thing
if 'cavern: error:' in cavernout:
msg = models.Parser_messageM(parsername='caves',content=cavedir+'/'+cavename+' Survex file messed up!',message_type='warn')
print('Fucked svx'+cavename+' :(')
@@ -64,71 +57,28 @@ def loadarea(areacode):
cavernout = cavernout.splitlines()
depth = float(([x for x in cavernout if ('Total vertical length' in x)][0].split()[-1])[:-2])
length = float(([x for x in cavernout if ('Total length' in x)][0].split()[6])[:-1])
- cavefile = open(fullname,'r')
- cavefilecontents = cavefile.read().splitlines()
- surveyname = [x for x in cavefilecontents if ('*begin ') in x][0].split()[1].lower()
- try:
- title = [x for x in cavefilecontents if ('*title ') in x][0].split()[1]
- except:
- syrveyname = "Untitled"
-
- relevant_nodes = [x for x in master3dN if (('['+areacode+'.'+surveyname+'.' in x) or ('['+areacode+'.'+surveyname+']' in x))]
- entrance_nodes = [x for x in relevant_nodes if 'ENTRANCE' in x]
- surface_nodes = [x for x in relevant_nodes if 'SURFACE' in x]
- location_nodes = []
- print('rel_nodes'+str(len(relevant_nodes)))
- if len(entrance_nodes) > 0:
- location_nodes = entrance_nodes
- elif len(surface_nodes) > 0:
- location_nodes = surface_nodes
- elif len(relevant_nodes) > 0:
- location_nodes = relevant_nodes
-
- try:
- location = sorted(location_nodes, key = lambda y : float(y.split()[3])).pop()
- except:
- print(location_nodes)
- location = 'Not found'
-
- relevant_lines = [x for x in master3dL if (('['+areacode+'.'+surveyname+'.' in x) or ('['+areacode+'.'+surveyname+']' in x))]
- try:
- lastleg = sorted(relevant_lines, key = lambda y : y.split().pop()).pop()
- except:
- lastleg = ['LINE 1900.01.01']
- try:
- lastdate = lastleg.split().pop()
- if 'STYLE' in lastdate:
- lastdate = lastleg.split().pop().pop()
- except:
- lastdate = '1900.01.01'
-
- entrance = ' '.join(location.split()[1:3])
- print((('depth','length','surv name','entr','date'),(depth,length,surveyname,entrance,lastdate))) #sanity check print
-
-
- newcave = models.CaveM(
- survex_file = fullname,
- total_length = length,
- name=areacode+'.'+surveyname,
- total_depth = depth,
- date = lastdate,
- entrance = entrance)
+ surveyname = bash('cat '+fullname+' | grep \'\*begin\' | head -n1 | cut -f2 -d \' \' ').splitlines().pop()
+ title = (bash('cat '+fullname+' | grep \'\*title\' | head -n1 | cut -f2 -d \' \' ').splitlines() or ["Not found"])[0]
+ print((('depth','length','surv name'),(depth,length,surveyname)))
+ print('dump3d '+settings.SURVEX_DATA+'1623-and-1626.3d | grep NODE | grep \'\\[\\.'+surveyname+'.*\\]\'')
+ nodes = bash('dump3d '+settings.SURVEX_DATA+'1623-and-1626.3d | grep NODE | grep \'\\[.*\\.'+surveyname+'.*\\]\'').splitlines()
+ entran = [x for x in nodes if ('ENTRANCE' in x) ]
+ print(nodes)
+
+
+ newcave = models.CaveM(survex_file = fullname, total_length = length, name=title, total_depth = depth)
newcave.save()
#end of reading survex masterfiles
-
+
print ("Reading cave descriptions")
cavefiles = bash('find '+settings.CAVEDESCRIPTIONS+' -name \'*.html\'').splitlines()
for fn in cavefiles:
f = open(fn, "r")
print(fn)
contents = f.read()
-
- slug = re.sub(r"\s+", "", extractXML(contents,'caveslug'))
+
desc = extractXML(contents,'underground_description')
- name = slug[5:] #get survex compatible name
- area = slug[0:4]
-
- print([area,name])
+ name = re.search(r'>.*<',extractXML(contents,'caveslug')).group()[6:-1]
if desc==None or name==None:
msg = models.Parser_messageM(parsername='caves',content=fn+' Description meesed up!',message_type='warn')
@@ -136,56 +86,26 @@ def loadarea(areacode):
msg.save()
continue
- print(area+'/'+name+'/'+name+'.svx')
- updatecave = models.CaveM.objects.filter(survex_file__icontains=area+'/'+name+'/'+name+'.svx')
+ updatecave = models.CaveM.objects.filter(survex_file__icontains='/'+name+'.svx')
if len(updatecave)>1:
print('Non unique solution - skipping. Name:'+name)
elif len(updatecave)==0:
- print('Cave with no survex data:'+name)
- continue
+ print('Cave with no survex data'+name)
+ newcave = models.CaveM(description = desc, name = name)
+ newcave.save()
else: #exaclty one match
- print('Adding desc:'+name)
updatecave = updatecave[0]
- updatecave.description = '/cave/descriptionM/'+slug #area-name
+ updatecave.description = desc
+ if updatecave.name=="Not found":
+ updatecave.name=name
updatecave.title=name
updatecave.save()
+
- slugS = slug
- explorersS = extractXML(contents,'explorers')
- underground_descriptionS = extractXML(contents,'underground_description')
- equipmentS = extractXML(contents,'equipment')
- referencesS = extractXML(contents,'references')
- surveyS = extractXML(contents,'survey')
- kataster_statusS = extractXML(contents,'kataster_status')
- underground_centre_lineS = extractXML(contents,'underground_centre_line')
- survex_fileS = extractXML(contents,'survex_file')
- notesS = extractXML(contents,'notes')
-
-
- newcavedesc = models.Cave_descriptionM(
- slug = slugS,
- explorers = explorersS,
- underground_description = underground_descriptionS,
- equipment = equipmentS,
- references = referencesS,
- survey = surveyS,
- kataster_status = kataster_statusS,
- underground_centre_line = underground_centre_lineS,
- survex_file = survex_fileS,
- notes = notesS)
- newcavedesc.save()
-
-
-
-
#end of reading cave descriptions
-def file_exists(filename):
- test = bash('if [ ! -f '+filename+' ] ; then echo MISSING; fi')#test for file exisence
- if 'MISSING' in test: #send error message to the database
- return False
- return True
+
def extractXML(contents,tag):
#find correct lines
@@ -199,10 +119,9 @@ def extractXML(contents,tag):
if endi!=begi:
segment = '\n'.join(lines[begi:endi+1])
else:
- segment = lines[begi:endi+1][0]
-
- hit = re.findall('<'+tag+'>(.*)</'+tag+'>', segment, re.S)[0]
- return hit
+ segment = lines[begi:endi+1]
+ return segment[0]
+
def bash(cmd): #calls command in bash shell, returns output
process = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
diff --git a/settings.py b/settings.py
index 364b45d..3c3b8d2 100644
--- a/settings.py
+++ b/settings.py
@@ -71,9 +71,6 @@ if django.VERSION[0] == 1 and django.VERSION[1] < 4:
else:
authmodule = 'django.contrib.auth.context_processors.auth'
-TOPCAMPX=411571.00
-TOPCAMPY=5282639.00
-
TEMPLATE_CONTEXT_PROCESSORS = ( authmodule, "core.context.troggle_context", )
LOGIN_REDIRECT_URL = '/'
diff --git a/templates/caveindex.html b/templates/caveindex.html
index 53f3dbe..be53ae3 100644
--- a/templates/caveindex.html
+++ b/templates/caveindex.html
@@ -20,7 +20,7 @@
<table class="searchable">
{% for cave in caves1623 %}
- <tr><td> <a href="{{ cave.url }}">{% if cave.kataster_number %}{{ cave.kataster_number }}{% else %}{{cave.unofficial_number }}{%endif %} {{cave.official_name|safe}}</a> {{ cave.slug }}</td></tr>
+ <tr><td> <a href="{{ cave.url }}">{% if cave.kataster_number %}{{ cave.kataster_number }}{% else %}{{cave.unofficial_number }}{%endif %} {{cave.official_name|safe}}</a> </td></tr>
{% endfor %}
</table>
diff --git a/templates/millenialcaves.html b/templates/millenialcaves.html
index 73372f8..8e8c5c6 100644
--- a/templates/millenialcaves.html
+++ b/templates/millenialcaves.html
@@ -8,62 +8,116 @@
<body>
-<h2>Caves of loserplateau (locations acording to all.3d)</h2>
-<span style="font-size:70%">
-Name contains:<br>
-<div id="inputf"><input type="text" name="CaveName" id="CaveName" style="width:100%"></div><br>
-Depth between (min, max) in meters (0 disables filter):<br>
-<div id="inputf"><input type="number" name="CaveDepthMin" id="CaveDepthMin" style="width:45%"> - <input type="number" name="CaveDepthMax" id="CaveDepthMax" style="width:45%"></div><br>
-Length between (min, max) in meters (0 disables filter):<br>
-<div id="inputf"><input type="number" name="CaveLengthMin" id="CaveLengthMin" style="width:45%"> - <input type="number" name="CaveLengthMax" id="CaveLengthMax" style="width:45%"></div><br>
-Last visit after (date in YYYY.MM.DD format works best):<br>
-<div id="inputf"><input type="text" name="VisitDate" id="VisitDate" style="width:100%"></div><br>
-Last visited by (single word or regular expression, search is not case sensitive):<br>
-(e.g. <span id="mono">/da.e/</span> matches both Dave and Dane, <span id="mono">/w..k|ol{2}y/</span> matches either Wook and Olly)<br>
-<div id="inputf"><input type="text" name="Visitor" id="Visitor" style="width:100%"></div><br>
-Hide incomplete entries:<br>
-<div id="inputf"><input type="checkbox" name="Incomplete" id="Incomplete" style="width:100%"></div><br><br>
+<table>
+<tr>
+<th>Cave</th>
+<th>Components</th>
+<th>aaa</th>
+<th>bbb</th>
+</tr>
+
+
+{% for subdircave, cavefiles, subsurvdirs in subdircaves %}
+<tr>
+ <td><b><a href="{% url "svx" cavefiles.0.0 %}">{{cavefiles.0.1}}</a></b></td>
+ <td>
+ root: {% for cavepath, cavename in cavefiles.1 %}
+ <a href="{% url "svx" cavepath %}">{{cavename}}</a>
+ {% endfor %}
+ <br>
+ {% for primarycavefile, subcavefiles in subsurvdirs %}
+ {{ primarycavefile.1 }}:
+ {% for cavepath, cavename in subcavefiles %}
+ <a href="{% url "svx" cavepath %}">{{cavename}}</a>
+ {% endfor %}
+ <br>
+ {% endfor %}
+ </td>
+</tr>
+{% endfor %}
+
+{% for primarycavefile, subcavefiles in multifilecaves %}
+<tr>
+ <td>
+ <a href="{% url "survexcavessingle" primarycavefile.1 %}">{{primarycavefile.1}}</a>
+ </td>
+ <td>
+ {% for cavepath, cavename in subcavefiles %}
+ <a href="{% url "svx" cavepath %}">{{cavename}}</a>
+ {% endfor %}
+ </td>
+</tr>
+{% endfor %}
+
+
+</table>
-<button onclick="filterTable('caves_table')">Filter</button><br>
-<button onclick="filterTableReset('caves_table')">Reset filters</button><br>
-Click on column headers to sort/reverse sort<br><br><br>
-</span>
+======================= OLD STUFF ==============================
+<td><a href="{% url "svx" cavefiles.0.0 %}">{{cavefiles.0.1}}</a></td>
+<p><a href="#cdir">caves with subdirectories</a> | <a href="#cmult">caves with multiple files</a> | <a href="#csing">caves with single files</a></p>
-<table id="caves_table">
+<h3><a href="/survexfile/all.svx">Link to all.svx for processing</a></h3>
+
+<h2 id="cdir">Caves with subdirectories</h2>
+
+{% for subdircave, cavefiles, subsurvdirs in subdircaves %}
+<h3>{{cavefiles.0.1}} - <a href="{% url "survexcavessingle" cavefiles.0.1 %}">dates and explorers</a></h3>
+<table>
<tr>
-<th onclick="sortTable(0,'caves_table',0)">Cave survex id</th>
-<th onclick="sortTable(1,'caves_table',0)">Cave name</th>
-<th onclick="sortTable(2,'caves_table',1)">Cave depth</th>
-<th onclick="sortTable(3,'caves_table',1)">Cave length</th>
-<th onclick="sortTable(4,'caves_table',0)">Last leg date</th>
-<th onclick="sortTable(5,'caves_table',0)">Cave location (UTM)</th>
-<th onclick="sortTable(6,'caves_table',0)">Cave location (lat/lon)</th>
-<th onclick="sortTable(7,'caves_table',1)">Top camp distance [m]</th>
+ <td><b><a href="{% url "svx" cavefiles.0.0 %}">{{cavefiles.0.1}}</a></b></td>
+ <td>
+ {% for cavepath, cavename in cavefiles.1 %}
+ <a href="{% url "svx" cavepath %}">{{cavename}}</a>
+ {% endfor %}
+ </td>
</tr>
-{% for cave in caves %}
+{% for primarycavefile, subcavefiles in subsurvdirs %}
<tr>
- <td><a href={{cave.description}}>{{ cave.name }}</a></td>
- <td>{{ cave.title }}</td>
- <td>{{ cave.total_depth }}</td>
- <td>{{ cave.total_length }}</td>
- <td>{{ cave.date }}</td>
- <td>33U {{ cave.entrance }}</td>
- <td>{{ cave.lat_lon_entrance }}</td>
- <td>{{ cave.top_camp_distance}}</td>
-</tr>
+ <td><a href="{% url "svx" primarycavefile.0 %}">{{primarycavefile.1}}</a></td>
+ <td>
+ {% for cavepath, cavename in subcavefiles %}
+ <a href="{% url "svx" cavepath %}">{{cavename}}</a>
+ {% endfor %}
+ </td>
+</tr>
{% endfor %}
-
</table>
-<script type="text/javascript" src="{{ settings.MEDIA_URL }}/scripts/TableSort.js"></script>
+{% endfor %}
+
-</body>
+<h2 id="cmult">Caves of multiple files</h2>
+<table>
+<tr><th>Dates and explorers</th><th>Survex files</th></tr>
+{% for primarycavefile, subcavefiles in multifilecaves %}
+<tr>
+ <td>
+ <a href="{% url "survexcavessingle" primarycavefile.1 %}">{{primarycavefile.1}}</a>
+ </td>
+ <td>
+ <a href="{% url "svx" primarycavefile.0 %}">{{primarycavefile.1}}</a> -
+ {% for cavepath, cavename in subcavefiles %}
+ <a href="{% url "svx" cavepath %}">{{cavename}}</a>
+ {% endfor %}
+ </td>
+</tr>
+{% endfor %}
+</table>
+
+<h2 id="csing">Caves of one file</h2>
+<p>
+{% for cavepath, cavename in onefilecaves %}
+ <a href="{% url "svx" cavepath %}">{{cavename}}</a>
+{% endfor %}
+</p>
+<body>
+<script type="text/javascript" src="scripts/TableSort.js"></script>
</html>
diff --git a/urls.py b/urls.py
index a38b7a4..7022d61 100644
--- a/urls.py
+++ b/urls.py
@@ -23,9 +23,7 @@ admin.autodiscover()
actualurlpatterns = patterns('',
- url(r'^millenialcaves/?$', views_caves.millenialcaves, name="millenialcaves"),
- url(r'^cave/descriptionM/([^/]+)/?$', views_caves.millenialdescription),
- #url(r'^cave/description/([^/]+)/?$', views_caves.caveDescription),
+ url(r'^millenialcaves/?$', views_survex.millenialcaves, name="millenialcaves"),
url(r'^troggle$', views_other.frontpage, name="frontpage"),
url(r'^todo/$', views_other.todo, name="todo"),