forked from expo/troggle
Much QM re-engineering
This commit is contained in:
@@ -47,11 +47,11 @@ class SurvexBlockAdmin(TroggleModelAdmin):
|
||||
inlines = (RoleInline,)
|
||||
|
||||
|
||||
class QMsFoundInline(admin.TabularInline):
|
||||
model = QM
|
||||
fk_name = "found_by"
|
||||
fields = ("number", "grade", "location_description", "comment") # need to add foreignkey to cave part
|
||||
extra = 1
|
||||
# class QMsFoundInline(admin.TabularInline):
|
||||
# model = QM
|
||||
# fk_name = "found_by"
|
||||
# fields = ("number", "grade", "location_description", "comment") # need to add foreignkey to cave part
|
||||
# extra = 1
|
||||
|
||||
|
||||
class PersonLogEntryInline(admin.TabularInline):
|
||||
@@ -64,7 +64,7 @@ class LogbookEntryAdmin(TroggleModelAdmin):
|
||||
prepopulated_fields = {"slug": ("title",)}
|
||||
search_fields = ("title", "expedition__year")
|
||||
date_heirarchy = "date"
|
||||
inlines = (PersonLogEntryInline, QMsFoundInline)
|
||||
# inlines = (PersonLogEntryInline, QMsFoundInline)
|
||||
|
||||
class Media:
|
||||
css = {"all": ("css/troggleadmin.css",)} # this does not exist
|
||||
@@ -91,12 +91,12 @@ class PersonAdmin(TroggleModelAdmin):
|
||||
|
||||
|
||||
class QMAdmin(TroggleModelAdmin):
|
||||
search_fields = ("found_by__cave__kataster_number", "number", "found_by__date")
|
||||
list_display = ("__str__", "grade", "found_by", "ticked_off_by")
|
||||
search_fields = ("number", "expoyear")
|
||||
list_display = ("__str__", "grade")
|
||||
list_display_links = ("__str__",)
|
||||
list_editable = ("found_by", "ticked_off_by", "grade")
|
||||
list_per_page = 20
|
||||
raw_id_fields = ("found_by", "ticked_off_by")
|
||||
# list_editable = ("comment", "page_ref", "grade")
|
||||
# list_per_page = 20
|
||||
# raw_id_fields = ("found_by", "ticked_off_by")
|
||||
|
||||
|
||||
class PersonExpeditionAdmin(TroggleModelAdmin):
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import os
|
||||
import os
|
||||
import re
|
||||
from collections import defaultdict
|
||||
from datetime import datetime, timezone
|
||||
@@ -161,14 +162,27 @@ class Cave(TroggleModel):
|
||||
def __str__(self, sep=": "):
|
||||
return str(self.slug())
|
||||
|
||||
def get_QMs(self):
|
||||
def get_open_QMs(self):
|
||||
"""Searches for all QMs that reference this cave."""
|
||||
# qms = self.qm_set.all().order_by('expoyear', 'block__date')
|
||||
qms = QM.objects.filter(cave=self).order_by(
|
||||
"expoyear", "block__date"
|
||||
) # a QuerySet, see https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by
|
||||
return qms # a QuerySet
|
||||
qmsopen = qms.filter(ticked=False)
|
||||
return qmsopen # a QuerySet
|
||||
|
||||
def get_ticked_QMs(self):
|
||||
"""Searches for all QMs that reference this cave."""
|
||||
qms = QM.objects.filter(cave=self).order_by(
|
||||
"expoyear", "block__date"
|
||||
)
|
||||
qmticked = qms.filter(ticked=True)
|
||||
return qmticked # a QuerySet
|
||||
|
||||
def get_QMs(self):
|
||||
qms = self.get_open_QMs() | self.get_ticked_QMs() # set union operation
|
||||
return qms # a QuerySet
|
||||
|
||||
def kat_area(self):
|
||||
for a in self.area.all():
|
||||
if a.kat_area():
|
||||
|
||||
@@ -144,38 +144,19 @@ class QM(TroggleModel):
|
||||
number = models.IntegerField(
|
||||
help_text="this is the sequential number in the year, only unique for CSV imports",
|
||||
)
|
||||
grade = models.CharField(max_length=1, blank=True, null=True, help_text="A/B/C/D/X")
|
||||
cave = models.ForeignKey("Cave", related_name="QMs", blank=True, null=True, on_delete=models.SET_NULL)
|
||||
block = models.ForeignKey("SurvexBlock", null=True, on_delete=models.SET_NULL) # only for QMs from survex files
|
||||
blockname = models.TextField(blank=True, null=True) # NB truncated copy of survexblock name with last char added
|
||||
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 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?!
|
||||
|
||||
GRADE_CHOICES = (
|
||||
("A", "A: Large obvious lead"),
|
||||
("B", "B: Average lead"),
|
||||
("C", "C: Tight unpromising lead"),
|
||||
("D", "D: Dig"),
|
||||
("X", "X: Unclimbable or horrid"),
|
||||
("V", "V: Vertical"),
|
||||
) # also seen "?" in imported data - see urls.py
|
||||
grade = models.CharField(max_length=1, choices=GRADE_CHOICES)
|
||||
expoyear = models.CharField(max_length=4, blank=True, null=True)
|
||||
ticked = models.BooleanField(default=False)
|
||||
location_description = models.TextField(blank=True)
|
||||
nearest_station_description = models.CharField(max_length=400, blank=True, null=True)
|
||||
completion_description = models.TextField(blank=True)
|
||||
completion_date = models.DateField(blank=True, null=True)
|
||||
nearest_station_name = models.CharField(max_length=200, blank=True, null=True)
|
||||
resolution_station_name = models.CharField(max_length=200, blank=True, null=True)
|
||||
nearest_station = models.ForeignKey("SurvexStation", blank=True, null=True, on_delete=models.SET_NULL)
|
||||
area = models.CharField(max_length=100, blank=True, null=True)
|
||||
completion_description = models.TextField(blank=True, null=True)
|
||||
page_ref = models.TextField(blank=True, null=True)
|
||||
comment = models.TextField(blank=True, null=True)
|
||||
|
||||
def __str__(self):
|
||||
@@ -228,8 +209,8 @@ class QM(TroggleModel):
|
||||
),
|
||||
)
|
||||
|
||||
def get_next_by_id(self):
|
||||
def get_next_by_id(self): # called in template
|
||||
return QM.objects.get(id=self.id + 1)
|
||||
|
||||
def get_previous_by_id(self):
|
||||
def get_previous_by_id(self): # called in template
|
||||
return QM.objects.get(id=self.id - 1)
|
||||
|
||||
@@ -536,9 +536,11 @@ def caveQMs(request, slug):
|
||||
def qm(request, cave_id, qm_id, year, grade=None, blockname=None):
|
||||
"""Reports on one specific QM
|
||||
Fixed and working July 2022, for both CSV imported QMs
|
||||
needs refactoring though.
|
||||
|
||||
Needs refactoring though! Uses extremely baroque way of getting the QMs instead of querying for QM objects
|
||||
directly, presumably as a result of a baroque history.
|
||||
|
||||
290 has several QMS with the same number, grade, year (2108) and first 8 chars of the survexblock. This crashes things.
|
||||
Many caves have several QMS with the same number, grade, year (2018) and first 8 chars of the survexblock. This crashes things, so the terminal char of the survexblock name was added
|
||||
"""
|
||||
|
||||
year = int(year)
|
||||
@@ -547,7 +549,7 @@ def qm(request, cave_id, qm_id, year, grade=None, blockname=None):
|
||||
# CSV import QMs, use old technique
|
||||
try:
|
||||
c = getCave(cave_id)
|
||||
manyqms = c.get_QMs()
|
||||
manyqms = c.get_open_QMs() | c.get_ticked_QMs() # set union operation
|
||||
qm = manyqms.get(number=qm_id, expoyear=year)
|
||||
return render(request, "qm.html", {"qm": qm})
|
||||
except QM.DoesNotExist:
|
||||
@@ -565,12 +567,12 @@ def qm(request, cave_id, qm_id, year, grade=None, blockname=None):
|
||||
qmslug = f"{cave_id}-{year}-{blockname=}{qm_id}{grade}"
|
||||
print(f"{qmslug=}")
|
||||
c = getCave(cave_id)
|
||||
manyqms = c.get_QMs()
|
||||
manyqms = c.get_open_QMs() | c.get_ticked_QMs() # set union operation
|
||||
qmqs = manyqms.filter(expoyear=year, blockname=blockname, number=qm_id, grade=grade)
|
||||
if len(qmqs) > 1:
|
||||
for q in qmqs:
|
||||
print(qmqs)
|
||||
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=}"
|
||||
message = f"Multiple QMs with the same cave, year, number, grade AND first-several+terminal 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})
|
||||
else:
|
||||
qm = qmqs.get(expoyear=year, blockname=blockname, number=qm_id, grade=grade)
|
||||
@@ -588,7 +590,7 @@ def qm(request, cave_id, qm_id, year, grade=None, blockname=None):
|
||||
{"badslug": f"Failed get {cave_id=} {year=} {qm_id=} {grade=} {blockname=}"},
|
||||
)
|
||||
except MultipleObjectsReturned:
|
||||
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=}"
|
||||
message = f"Multiple QMs with the same cave, year, number, grade AND first-several+terminal 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
|
||||
|
||||
Reference in New Issue
Block a user