QMs now have working url to survexfile & tick description

This commit is contained in:
Philip Sargent
2022-07-20 14:44:56 +03:00
parent 2a7f1506c9
commit 549c1649b4
6 changed files with 91 additions and 54 deletions

View File

@@ -4,6 +4,7 @@ import datetime
import re
import json
import subprocess
import operator
from collections import defaultdict
from pathlib import Path
@@ -149,7 +150,21 @@ class Cave(TroggleModel):
return str(self.slug())
def get_QMs(self):
return QM.objects.filter(cave=self)
'''Searches for all QMs that reference this cave. Probably a better Django way to do this
'''
qms = QM.objects.filter(cave=self).order_by('expoyear', 'block__date') # a QuerySet, see https://docs.djangoproject.com/en/4.0/ref/models/querysets/#order-by
return qms # a QuerySet
# undated = []
# dated = []
# qms = QM.objects.filter(cave=self) # a QuerySet
# for q in qms:
# if q.block:
# dated.append(q)
# else:
# undated.append(q)
# sortedqms = sorted(dated, key=operator.attrgetter('block.date')) # sort by date of survexblock the QM was defined in
# orderedqms = sorted(undated, key=operator.attrgetter('expoyear')) # sort by date of expoyear
# return orderedqms + sortedqms # a list, NOT a QuerySet
# def new_QM_number(self, year=datetime.date.today().year):
@@ -456,8 +471,8 @@ class QM(TroggleModel):
blockname=models.TextField(blank=True,null=True) # NB truncated copy of survexblock name
expoyear = models.CharField(max_length=4,blank=True, null=True) # could change to datetime if logbooks similarly chnaged
found_by = models.ForeignKey(LogbookEntry, related_name='QMs_found',blank=True, null=True,on_delete=models.SET_NULL )
ticked = models.BooleanField(default=False) # for ticked QMs not atatched to a logbook entry
ticked_off_by = models.ForeignKey(LogbookEntry, related_name='QMs_ticked_off',blank=True, null=True,on_delete=models.SET_NULL)
ticked = models.BooleanField(default=False) # for ticked QMs not attached to a logbook entry, should imply completion_description has text
ticked_off_by = models.ForeignKey(LogbookEntry, related_name='QMs_ticked_off',blank=True, null=True,on_delete=models.SET_NULL) # unused, ever?!
number = models.IntegerField(help_text="this is the sequential number in the year, only unique for CSV imports", )
GRADE_CHOICES=(
('A', 'A: Large obvious lead'),
@@ -493,9 +508,20 @@ class QM(TroggleModel):
blocknamestr = ""
#return f'{self.cave.slug()[5:]}-{self.expoyear}-{self.blockname}{self.number}{self.grade}'
return f'{cavestr}-{expoyearstr}-{blocknamestr}{self.number}{self.grade}'
def newslug(self):
def get_completion_url(self):
'''assumes html file named is in same folder as cave description file
'''
cd = None
if self.completion_description:
try:
dir = Path(self.cave.url).parent
cd = dir / self.completion_description
except:
cd = None
return cd
def newslug(self):
qmslug = f'{str(self.cave)}-{self.expoyear}-{self.blockname}{self.number}{self.grade}'
return qmslug

View File

@@ -272,14 +272,12 @@ def cavepage(request, karea, subpath):
r = rendercave(request, cave, cave.slug())
return r
except NoReverseMatch:
raise
except:
raise
message = f'Failed to render cave: {kpath} (it does exist and is unique) because of a Django URL resolution error. Check urls.py.'
return render(request,'errors/generic.html', {'message': message})
# return rendercave(request, cave, cave.slug(), cave_id=cave_id)
except:
# anything else is a new problem. Add in specific error messages here as we discover new types of error
raise
def caveEntrance(request, slug):
try:
cave = Cave.objects.get(caveslug__slug = slug)
@@ -482,6 +480,7 @@ def qm(request,cave_id,qm_id,year,grade=None, blockname=None):
290 has several QMS with the same number, grade, year (2108) and first 8 chars of the survexblock. This crashes things.
'''
year=int(year)
if blockname == '':
@@ -492,12 +491,13 @@ def qm(request,cave_id,qm_id,year,grade=None, blockname=None):
qm=manyqms.get(number=qm_id,expoyear=year)
return render(request,'qm.html', {'qm': qm})
except QM.DoesNotExist:
raise
#raise
return render(request,'errors/badslug.html', {'badslug': f'{cave_id=} {year=} {qm_id=} {blockname=}'})
else:
try:
qmslug = f'{cave_id}-{year}-{blockname=}{qm_id}{grade}'
print(f'{qmslug=}')
c=getCave(cave_id)
manyqms=c.get_QMs()
qmqs=manyqms.filter(expoyear=year, blockname=blockname, number=qm_id, grade=grade)
@@ -509,15 +509,16 @@ def qm(request,cave_id,qm_id,year,grade=None, blockname=None):
else:
qm=qmqs.get(expoyear=year, blockname=blockname, number=qm_id, grade=grade)
if qm:
print(qm, f'{qmslug=}:{cave_id=} {year=} {qm_id=} {blockname=} {qm.expoyear=}')
print(qm, f'{qmslug=}:{cave_id=} {year=} {qm_id=} {blockname=} {qm.expoyear=} {qm.completion_description=}')
return render(request,'qm.html', {'qm': qm})
else:
raise
#raise
return render(request,'errors/badslug.html', {'badslug': f'{cave_id=} {year=} {qm_id=} {blockname=}'})
except MultipleObjectsReturned:
raise
message = f'Multiple QMs with the same cave, year, number, grade AND first 8 chars of the survexblock name. (Could be caused by incomplete databasereset). Fix this in the survex file(s). {cave_id=} {year=} {qm_id=} {blockname=}'
return render(request,'errors/generic.html', {'message': message})
except QM.DoesNotExist:
raise
#raise
return render(request,'errors/badslug.html', {'badslug': f'{cave_id=} {year=} {qm_id=} {blockname=}'})