summaryrefslogtreecommitdiffstats
path: root/core/views_caves.py
diff options
context:
space:
mode:
Diffstat (limited to 'core/views_caves.py')
-rw-r--r--core/views_caves.py54
1 files changed, 40 insertions, 14 deletions
diff --git a/core/views_caves.py b/core/views_caves.py
index 95de183..946eba9 100644
--- a/core/views_caves.py
+++ b/core/views_caves.py
@@ -11,11 +11,12 @@ from django.conf import settings
from django.urls import reverse
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
+from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
import troggle.settings as settings
-import troggle.core.models as models
-from troggle.core.models import Expedition
-from troggle.core.models_caves import CaveSlug, Cave, CaveAndEntrance, QM, EntranceSlug, Entrance, Area, SurvexStation
+#import troggle.core.models as models
+from troggle.core.models import Expedition, DataIssue
+from troggle.core.models_caves import CaveSlug, Cave, CaveAndEntrance, QM, EntranceSlug, Entrance, Area, SurvexStation, GetCaveLookup
from troggle.core.forms import CaveForm, CaveAndEntranceFormSet, VersionControlCommentForm, EntranceForm, EntranceLetterForm
from troggle.helper import login_required_if_public
@@ -41,14 +42,14 @@ class MapLocations(object):
k = ent.caveandentrance_set.all()[0].cave
except:
message = " ! Failed to get Cave linked to Entrance:{} from:{} best:{}".format(ent.name, ent.filename, ent.best_station())
- models.DataIssue.objects.create(parser='entrances', message=message)
+ DataIssue.objects.create(parser='entrances', message=message)
print(message)
raise
try:
areaName = k.getArea().short_name
except:
message = " ! Failed to get Area on cave '{}' linked to Entrance:{} from:{} best:{}".format(cave, ent.name, ent.filename, ent.best_station())
- models.DataIssue.objects.create(parser='entrances', message=message)
+ DataIssue.objects.create(parser='entrances', message=message)
print(message)
raise
self.p.append((ent.best_station(), "%s-%s" % (areaName, str(ent)[5:]), ent.needs_surface_work(), str(ent)))
@@ -58,13 +59,23 @@ class MapLocations(object):
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."""
- # REPLACE OR MERGE this with other functions that do exactly th same thing!
+ '''Returns a cave object when given a cave name or number. It is used by views including cavehref, ent, and qm.
+
+ TO DO: search GCavelookup first, which should raise a MultpleObjectsReturned exception if there
+ are duplicates'''
try:
cave = Cave.objects.get(kataster_number=cave_id)
+ except Cave.MultipleObjectsReturned as ex:
+ raise MultipleObjectsReturned("Duplicate kataster number") from ex # propagate this up
+
except Cave.DoesNotExist:
- cave = Cave.objects.get(unofficial_number=cave_id)
- return cave
+ Gcavelookup = GetCaveLookup() # dictionary makes strings to Cave objects
+ if cave_id in Gcavelookup:
+ return Gcavelookup[cave_id]
+ else:
+ raise ObjectDoesNotExist("No cave found with this identifier in any id field")
+ except:
+ raise ObjectDoesNotExist("No cave found with this identifier in any id field")
def pad5(x):
return "0" * (5 -len(x.group(0))) + x.group(0)
@@ -75,7 +86,7 @@ def numericalcmp(x, y):
def caveKey(x):
"""python3 function for sort. Done in a hurry.
- Note that cave kataster numbers are not generally integers.
+ Note that cave kataster numbers are not always integers.
This needs to be fixed make a decent sort order.
"""
if not x.kataster_number:
@@ -107,7 +118,12 @@ def caveindex(request):
return render(request,'caveindex.html', {'caves1623': caves1623, 'caves1626': caves1626, 'notablecaves':getnotablecaves(), 'cavepage': True})
def cave3d(request, cave_id=''):
- cave = getCave(cave_id)
+ try:
+ cave = getCave(cave_id)
+ except Cave.MultipleObjectsReturned: # entirely the wrong action, REPLACE with the right display
+ caves = Cave.objects.filter(kataster_number=cave_id)
+ return render(request, 'svxcaveseveral.html', {'settings': settings, "caves":caves })
+
survexfilename = settings.SURVEX_DATA + cave.survex_file
threedfilename = settings.THREEDCACHEDIR + '%s.3d' % cave_id
if True or os.path.getmtime(survexfilename) > os.path.getmtime(threedfilename):
@@ -121,9 +137,16 @@ def cave3d(request, cave_id=''):
return response
def cave(request, cave_id='', offical_name=''):
- cave=getCave(cave_id)
+ try:
+ cave=getCave(cave_id)
+ except MultipleObjectsReturned:
+ caves = Cave.objects.filter(kataster_number=cave_id)
+ return render(request, 'svxcaveseveral.html', {'settings': settings, "caves":caves }) # not the right template, needs a specific one
+ except ObjectDoesNotExist:
+ return render(request, 'svxcavesingle404.html', {'settings': settings, "cave":cave_id })
+
if cave.non_public and settings.PUBLIC_SITE and not request.user.is_authenticated():
- return render(request,'nonpublic.html', {'instance': cave, 'cavepage': True, 'cave_id': cave_id})
+ return render(request, 'nonpublic.html', {'instance': cave, 'cavepage': True, 'cave_id': cave_id})
else:
return render(request,'cave.html', {'settings': settings, 'cave': cave, 'cavepage': True, 'cave_id': cave_id})
@@ -254,8 +277,11 @@ def editEntrance(request, caveslug, slug=None):
def qm(request,cave_id,qm_id,year,grade=None):
year=int(year)
try:
- qm=getCave(cave_id).get_QMs().get(number=qm_id,found_by__date__year=year)
+ qm=getCave(cave_id).get_QMs().get(number=qm_id,found_by__date__year=year)
return render(request,'qm.html',locals())
+ except Cave.MultipleObjectsReturned: # entirely the wrong action, REPLACE with the right display
+ caves = Cave.objects.filter(kataster_number=cave_id)
+ return render(request, 'svxcaveseveral.html', {'settings': settings, "caves":caves })
except QM.DoesNotExist:
url=urllib.parse.urljoin(settings.URL_ROOT, r'/admin/core/qm/add/'+'?'+ r'number=' + qm_id)