diff --git a/.gitignore b/.gitignore index ea7063e..600a288 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ syntax: glob *.pyc db* +*.sqlite +*.sql localsettings.py *~ parsing_log.txt @@ -13,22 +15,15 @@ troggle_log.txt media/images/* .vscode/* .swp -imagekit-off/ localsettings-expo-live.py .gitignore desktop.ini -troggle-reset.log -troggle-reset0.log -troggle-surveys.log troggle.log troggle.sqlite -troggle.sqlite.0 -troggle.sqlite.1 my_project.dot memdump.sql troggle-sqlite.sql import_profile.json -import_times.json ignored-files.log tunnel-import.log posnotfound diff --git a/core/models.py b/core/models.py index 21a180a..3a5103e 100644 --- a/core/models.py +++ b/core/models.py @@ -112,7 +112,6 @@ class Expedition(TroggleModel): res = self.expeditionday_set.all() return res and res[len(res) - 1] or None - class ExpeditionDay(TroggleModel): expedition = models.ForeignKey("Expedition") date = models.DateField() @@ -182,7 +181,6 @@ class Person(TroggleModel): # self.href = self.first_name.lower() #self.orderref = self.first_name #self.notability = 0.0 # set temporarily - class PersonExpedition(TroggleModel): """Person's attendance to one Expo @@ -320,7 +318,6 @@ class LogbookEntry(TroggleModel): def DayIndex(self): return list(self.expeditionday.logbookentry_set.all()).index(self) - # # Single Person going on a trip, which may or may not be written up (accounts for different T/U for people in same logbook entry) # @@ -357,7 +354,6 @@ class PersonTrip(TroggleModel): def __str__(self): return "%s (%s)" % (self.personexpedition, self.logbook_entry.date) - ########################################## @@ -391,7 +387,6 @@ class CaveSlug(models.Model): cave = models.ForeignKey('Cave') slug = models.SlugField(max_length=50, unique = True) primary = models.BooleanField(default=False) - class Cave(TroggleModel): # too much here perhaps, @@ -564,7 +559,7 @@ class OtherCaveName(TroggleModel): cave = models.ForeignKey(Cave) def __str__(self): return str(self.name) - + class EntranceSlug(models.Model): entrance = models.ForeignKey('Entrance') slug = models.SlugField(max_length=50, unique = True) @@ -896,4 +891,4 @@ class DataIssue(TroggleModel): ordering = ['date'] def __str__(self): - return "%s - %s" % (self.parser, self.message) + return "%s - %s" % (self.parser, self.message) \ No newline at end of file diff --git a/core/models_survex.py b/core/models_survex.py index 629b4df..e58cf49 100644 --- a/core/models_survex.py +++ b/core/models_survex.py @@ -1,8 +1,9 @@ -from django.db import models -from django.conf import settings import os import urllib.parse import re + +from django.db import models +from django.conf import settings from django.core.urlresolvers import reverse @@ -21,7 +22,8 @@ class SurvexDirectory(models.Model): class Meta: ordering = ('id',) - + + class SurvexFile(models.Model): path = models.CharField(max_length=200) survexdirectory = models.ForeignKey("SurvexDirectory", blank=True, null=True) @@ -49,6 +51,7 @@ class SurvexFile(models.Model): self.survexdirectory = survexdirectory self.save() + class SurvexEquate(models.Model): cave = models.ForeignKey('Cave', blank=True, null=True) @@ -87,7 +90,6 @@ class SurvexLeg(models.Model): compass = models.FloatField() clino = models.FloatField() - # # Single SurvexBlock # @@ -152,7 +154,6 @@ class SurvexBlock(models.Model): def DayIndex(self): return list(self.expeditionday.survexblock_set.all()).index(self) - class SurvexTitle(models.Model): survexblock = models.ForeignKey('SurvexBlock') @@ -186,8 +187,7 @@ class SurvexPersonRole(models.Model): def __str__(self): return str(self.person) + " - " + str(self.survexblock) + " - " + str(self.nrole) - - + class SurvexScansFolder(models.Model): fpath = models.CharField(max_length=200) walletname = models.CharField(max_length=200) @@ -200,7 +200,7 @@ class SurvexScansFolder(models.Model): def __str__(self): return str(self.walletname) + " (Survey Scans Folder)" - + class SurvexScanSingle(models.Model): ffile = models.CharField(max_length=200) name = models.CharField(max_length=200) @@ -214,8 +214,7 @@ class SurvexScanSingle(models.Model): def __str__(self): return "Survey Scan Image: " + str(self.name) + " in " + str(self.survexscansfolder) - - + class TunnelFile(models.Model): tunnelpath = models.CharField(max_length=200) tunnelname = models.CharField(max_length=200) @@ -230,5 +229,4 @@ class TunnelFile(models.Model): class Meta: - ordering = ('tunnelpath',) - + ordering = ('tunnelpath',) \ No newline at end of file diff --git a/core/views_caves.py b/core/views_caves.py index 41831bd..c306461 100644 --- a/core/views_caves.py +++ b/core/views_caves.py @@ -3,24 +3,52 @@ from __future__ import (absolute_import, division, print_function, unicode_literals) -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 -from troggle.helper import login_required_if_public - -from django.forms.models import modelformset_factory -from django import forms -from django.core.urlresolvers import reverse -from django.http import HttpResponse, HttpResponseRedirect -from django.conf import settings -import re, urllib.parse -from django.shortcuts import get_object_or_404, render +import sys +import os +import string +import subprocess +import re import settings - +import urllib.parse from PIL import Image, ImageDraw, ImageFont -import string, os, sys, subprocess +from django import forms +from django.conf import settings +from django.forms.models import modelformset_factory +from django.core.urlresolvers import reverse +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render + +import troggle.settings as settings +import troggle.core.models as models +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 +from troggle.helper import login_required_if_public + +class MapLocations(object): + p = [ + ("laser.0_7", "BNase", "Reference", "Bräuning Nase laser point"), + ("226-96", "BZkn", "Reference", "Bräuning Zinken trig point"), + ("vd1","VD1","Reference", "VD1 survey point"), + ("laser.kt114_96","HSK","Reference", "Hinterer Schwarzmooskogel trig point"), + ("2000","Nipple","Reference", "Nipple (Weiße Warze)"), + ("3000","VSK","Reference", "Vorderer Schwarzmooskogel summit"), + ("oldtopcamp", "OTC", "Reference", "Old Top Camp"), + ("laser.0", "LSR0", "Reference", "Laser Point 0"), + ("laser.0_1", "LSR1", "Reference", "Laser Point 0/1"), + ("laser.0_3", "LSR3", "Reference", "Laser Point 0/3"), + ("laser.0_5", "LSR5", "Reference", "Laser Point 0/5"), + ("225-96", "BAlm", "Reference", "Bräuning Alm trig point") + ] + def points(self): + for ent in Entrance.objects.all(): + if ent.best_station(): + areaName = ent.caveandentrance_set.all()[0].cave.getArea().short_name + self.p.append((ent.best_station(), "%s-%s" % (areaName, str(ent)[5:]), ent.needs_surface_work(), str(ent))) + return self.p + + def __str__(self): + return "{} map locations".format(len(self.p)) 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.""" @@ -57,8 +85,6 @@ def caveindex(request): def millenialcaves(request): #RW messing around area return HttpResponse("Test text", content_type="text/plain") - - def cave3d(request, cave_id=''): cave = getCave(cave_id) @@ -216,9 +242,7 @@ def qm(request,cave_id,qm_id,year,grade=None): if grade: url += r'&grade=' + grade return HttpResponseRedirect(url) - - def ent(request, cave_id, ent_letter): cave = Cave.objects.filter(kataster_number = cave_id)[0] cave_and_ent = CaveAndEntrance.objects.filter(cave = cave).filter(entrance_letter = ent_letter)[0] @@ -362,7 +386,6 @@ areacolours = { '7' : '#808080' } - for FONT in [ "/usr/share/fonts/truetype/freefont/FreeSans.ttf", "/usr/X11R6/lib/X11/fonts/truetype/arial.ttf", @@ -460,27 +483,11 @@ def prospecting_image(request, name): draw.line([10+m100, TEXTSIZE * 3, 10+m100, TEXTSIZE*2], fill='#000000', width=LINEWIDTH) label = "100m" draw.text([10 + (m100 - draw.textsize(label)[0]) / 2, TEXTSIZE/2], label, fill='#000000') - plot("laser.0_7", "BNase", "Reference", "Bräuning Nase laser point", name, draw, img) - plot("226-96", "BZkn", "Reference", "Bräuning Zinken trig point", name, draw, img) - plot("vd1","VD1","Reference", "VD1 survey point", name, draw, img) - plot("laser.kt114_96","HSK","Reference", "Hinterer Schwarzmooskogel trig point", name, draw, img) - plot("2000","Nipple","Reference", "Nipple (Weiße Warze)", name, draw, img) - plot("3000","VSK","Reference", "Vorderer Schwarzmooskogel summit", name, draw, img) - plot("topcamp", "TC", "Reference", "Top Camp", name, draw, img) - plot("laser.0", "LSR0", "Reference", "Laser Point 0", name, draw, img) - plot("laser.0_1", "LSR1", "Reference", "Laser Point 0/1", name, draw, img) - plot("laser.0_3", "LSR3", "Reference", "Laser Point 0/3", name, draw, img) - plot("laser.0_5", "LSR5", "Reference", "Laser Point 0/5", name, draw, img) - plot("225-96", "BAlm", "Reference", "Bräuning Alm trig point", name, draw, img) - for entrance in Entrance.objects.all(): - station = entrance.best_station() - if station: - #try: - areaName = entrance.caveandentrance_set.all()[0].cave.getArea().short_name - plot(station, "%s-%s" % (areaName, str(entrance)[5:]), entrance.needs_surface_work(), str(entrance), name, draw, img) - #except: - # pass - + + for p in MapLocations.points(): + surveypoint, number, point_type, label = p + plot(surveypoint, number, point_type, label, name, draw, img) + for (N, E, D, num) in [(35975.37, 83018.21, 100,"177"), # Calculated from bearings (35350.00, 81630.00, 50, "71"), # From Auer map (36025.00, 82475.00, 50, "146"), # From mystery map @@ -503,20 +510,4 @@ def prospecting_image(request, name): response = HttpResponse(content_type = "image/png") del draw img.save(response, "PNG") - return response - -# Not used. -# All imported using parsers.survex.LoadPos() now -# STATIONS = {} -# poslineregex = re.compile("^\(\s*([+-]?\d*\.\d*),\s*([+-]?\d*\.\d*),\s*([+-]?\d*\.\d*)\s*\)\s*([^\s]+)$") -# def LoadPos(): -# call([settings.CAVERN, "--output=%s/all.3d" % settings.SURVEX_DATA, "%s/all.svx" % settings.SURVEX_DATA]) -# call([settings.THREEDTOPOS, '%sall.3d' % settings.SURVEX_DATA], cwd = settings.SURVEX_DATA) -# posfile = open("%sall.pos" % settings.SURVEX_DATA) -# posfile.readline()#Drop header -# for line in posfile.readlines(): -# r = poslineregex.match(line) -# if r: -# x, y, z, name = r.groups() -# STATIONS[name] = (x, y, z) - + return response \ No newline at end of file diff --git a/core/views_survex.py b/core/views_survex.py index 7595ea9..0435d52 100644 --- a/core/views_survex.py +++ b/core/views_survex.py @@ -23,13 +23,13 @@ survextemplatefile = """; Locn: Totes Gebirge, Austria - Loser/Augst-Eck Plateau *export [connecting stations] *title "area title" -*date 2999.99.99 +*date 2099.99.99 *team Insts [Caver] *team Insts [Caver] *team Notes [Caver] *instrument [set number] -;ref.: 2009#NN +*ref: 2099#NN *calibrate tape +0.0 ; +ve if tape was too short, -ve if too long @@ -39,9 +39,8 @@ survextemplatefile = """; Locn: Totes Gebirge, Austria - Loser/Augst-Eck Plateau *data passage station left right up down ignoreall 1 [L] [R] [U] [D] comment -*end [surveyname]""" - - +*end [surveyname]""" + def ReplaceTabs(stext): res = [ ] nsl = 0 @@ -252,8 +251,7 @@ def identifycavedircontents(gcavedir): if primesvx: subsvx.insert(0, primesvx) return subdirs, subsvx - - + # direct local non-database browsing through the svx file repositories # perhaps should use the database and have a reload button for it @@ -305,10 +303,6 @@ def survexcaveslist(request): onefilecaves.append(survdirobj[0]) return render_to_response('svxfilecavelist.html', {'settings': settings, "onefilecaves":onefilecaves, "multifilecaves":multifilecaves, "subdircaves":subdircaves }) - - - - # parsing all the survex files of a single cave and showing that it's consistent and can find all the files and people @@ -319,8 +313,3 @@ def survexcavesingle(request, survex_cave): if breload: parsers.survex.ReloadSurvexCave(survex_cave) return render_to_response('svxcavesingle.html', {'settings': settings, "cave":cave }) - - - - - diff --git a/parsers/survex.py b/parsers/survex.py index 3dc9d16..35e09b8 100644 --- a/parsers/survex.py +++ b/parsers/survex.py @@ -1,18 +1,18 @@ -import troggle.settings as settings -import troggle.core.models as models -import troggle.settings as settings - +import sys +import os +import re +import time +from datetime import datetime, timedelta from subprocess import call, Popen, PIPE -from troggle.parsers.people import GetPersonExpeditionNameLookup from django.utils.timezone import get_current_timezone from django.utils.timezone import make_aware -import re -import os -import time -from datetime import datetime, timedelta -import sys +import troggle.settings as settings +import troggle.core.models as models +from troggle.parsers.people import GetPersonExpeditionNameLookup +from troggle.core.views_caves import MapLocations + """A 'survex block' is a *begin...*end set of cave data. A 'survexscansfolder' is what we today call a "survey scans folder" or a "wallet". @@ -227,7 +227,7 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines): # print(insp+'QM notes %s' % qm_notes) # If the QM isn't resolved (has a resolving station) then load it - if not qm_resolve_section or qm_resolve_section != '-' or qm_resolve_section is not 'None': + if not qm_resolve_section or qm_resolve_section != '-' or qm_resolve_section != 'None': from_section = models.SurvexBlock.objects.filter(name=qm_from_section) # If we can find a section (survex note chunck, named) if len(from_section) > 0: @@ -474,7 +474,6 @@ def LoadAllSurvexBlocks(): poslineregex = re.compile(r"^\(\s*([+-]?\d*\.\d*),\s*([+-]?\d*\.\d*),\s*([+-]?\d*\.\d*)\s*\)\s*([^\s]+)$") - def LoadPos(): """Run cavern to produce a complete .3d file, then run 3dtopos to produce a table of all survey point positions. Then lookup each position by name to see if we have it in the database @@ -485,6 +484,8 @@ def LoadPos(): """ topdata = settings.SURVEX_DATA + settings.SURVEX_TOPNAME print((' - Generating a list of Pos from %s.svx and then loading...' % (topdata))) + + # TO DO - remove the cache file apparatus. Not needed. Only laser points and entrances loaded now. # Be careful with the cache file. # If LoadPos has been run before, @@ -532,27 +533,34 @@ def LoadPos(): # cavern defaults to using same cwd as supplied input file call([settings.CAVERN, "--output=%s.3d" % (topdata), "%s.svx" % (topdata)]) call([settings.THREEDTOPOS, '%s.3d' % (topdata)], cwd = settings.SURVEX_DATA) - print(" - This next bit takes a while. Matching ~32,000 survey positions. Be patient...") + #print(" - This next bit takes a while. Matching ~32,000 survey positions. Be patient...") + + mappoints = {} + for pt in MapLocations().points(): + svxid, number, point_type, label = pt + mappoints[svxid]=True posfile = open("%s.pos" % (topdata)) posfile.readline() #Drop header for line in posfile.readlines(): r = poslineregex.match(line) if r: - x, y, z, name = r.groups() # easting, northing, altitude - if name in notfoundbefore: - skip[name] = 1 + x, y, z, id = r.groups() # easting, northing, altitude, survexstation + if id in notfoundbefore: + skip[id] = 1 else: - try: - ss = models.SurvexStation.objects.lookup(name) - ss.x = float(x) - ss.y = float(y) - ss.z = float(z) - ss.save() - found += 1 - except: - notfoundnow.append(name) - print(" - %s stations not found in lookup of SurvexStation.objects. %s found. %s skipped." % (len(notfoundnow),found, len(skip))) + for sid in mappoints: + if id.endswith(sid): + try: + ss = models.SurvexStation.objects.lookup(id) + ss.x = float(x) + ss.y = float(y) + ss.z = float(z) + ss.save() + found += 1 + except: + notfoundnow.append(id) + print(" - %s failed lookups of SurvexStation.objects. %s found. %s skipped." % (len(notfoundnow),found, len(skip))) if found > 10: # i.e. a previous cave import has been done try: @@ -565,5 +573,4 @@ def LoadPos(): print((' Not-found cache file written: %s entries' % c)) except: print(" FAILURE WRITE opening cache file %s" % (cachefile)) - raise - + raise \ No newline at end of file