diff options
Diffstat (limited to 'core/views_caves.py')
-rw-r--r-- | core/views_caves.py | 54 |
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) |