summaryrefslogtreecommitdiffstats
path: root/core/models_caves.py
diff options
context:
space:
mode:
authorPhilip Sargent <philip.sargent@klebos.com>2020-05-30 01:11:02 +0100
committerPhilip Sargent <philip.sargent@klebos.com>2020-05-30 01:11:02 +0100
commit0776978c9c8d7ee921b446de18b40162ba231aab (patch)
tree7c1873fa42fff63387305c640a0a27334bf4ba6f /core/models_caves.py
parent6568cb890015f43a97248bd48e92de67238ca325 (diff)
downloadtroggle-0776978c9c8d7ee921b446de18b40162ba231aab.tar.gz
troggle-0776978c9c8d7ee921b446de18b40162ba231aab.tar.bz2
troggle-0776978c9c8d7ee921b446de18b40162ba231aab.zip
Import rejigging to fix circular refs
Diffstat (limited to 'core/models_caves.py')
-rw-r--r--core/models_caves.py116
1 files changed, 115 insertions, 1 deletions
diff --git a/core/models_caves.py b/core/models_caves.py
index 4246f6d..44a5ac7 100644
--- a/core/models_caves.py
+++ b/core/models_caves.py
@@ -18,7 +18,7 @@ from django.conf import settings
from django.core.urlresolvers import reverse
from django.template import Context, loader
-from troggle.core.models import *
+from troggle.core.models import TroggleModel, TroggleImageModel, Person, Expedition
from troggle.core.models_survex import *
class Area(TroggleModel):
@@ -406,6 +406,85 @@ class NewSubCave(TroggleModel):
def __str__(self):
return str(self.name)
+class LogbookEntry(TroggleModel):
+ """Single parsed entry from Logbook
+ """
+ LOGBOOK_ENTRY_TYPES = (
+ ("wiki", "Wiki style logbook"),
+ ("html", "Html style logbook")
+ )
+
+ date = models.DateField()#MJG wants to turn this into a datetime such that multiple Logbook entries on the same day can be ordered.ld()
+ expeditionday = models.ForeignKey("ExpeditionDay", null=True)#MJG wants to KILL THIS (redundant information)
+ expedition = models.ForeignKey(Expedition,blank=True,null=True) # yes this is double-
+ title = models.CharField(max_length=settings.MAX_LOGBOOK_ENTRY_TITLE_LENGTH)
+ cave_slug = models.SlugField(max_length=50)
+ place = models.CharField(max_length=100,blank=True,null=True,help_text="Only use this if you haven't chosen a cave")
+ text = models.TextField()
+ slug = models.SlugField(max_length=50)
+ filename = models.CharField(max_length=200,null=True)
+ entry_type = models.CharField(default="wiki",null=True,choices=LOGBOOK_ENTRY_TYPES,max_length=50)
+
+ class Meta:
+ verbose_name_plural = "Logbook Entries"
+ # several PersonTrips point in to this object
+ ordering = ('-date',)
+
+ def __getattribute__(self, item):
+ if item == "cave":
+ #Allow a logbookentries cave to be directly accessed despite not having a proper foreignkey
+ return CaveSlug.objects.get(slug = self.cave_slug).cave
+ # parse error in python3.8
+ # https://stackoverflow.com/questions/41343263/provide-classcell-example-for-python-3-6-metaclass
+ #https://github.com/django/django/pull/7653
+ #return TroggleModel.__getattribute__(item)
+ #return super(LogbookEntry, self).__getattribute__(item) # works in py3.5, fails in 3.8
+ return TroggleModel.__getattribute__(self,item) # works in py 3.5 AND in 3.8
+
+ def __init__(self, *args, **kwargs):
+ if "cave" in list(kwargs.keys()):
+ if kwargs["cave"] is not None:
+ kwargs["cave_slug"] = models_caves.CaveSlug.objects.get(cave=kwargs["cave"], primary=True).slug
+ kwargs.pop("cave")
+ # parse error in python3.8
+ return TroggleModel.__init__(self, *args, **kwargs) # seems OK in 3.5 & 3.8! failure later elsewhere with 3.8
+ #return TroggleModel().__init__(self, *args, **kwargs) # parses OK, fails at runtime in 3.8
+ #return super().__init__(self, *args, **kwargs) # fails in 3.8
+ #return super().__init__(*args, **kwargs) # works in py3.5 fails in 3.8
+ #return super(LogbookEntry, self).__init__(*args, **kwargs) # works in py3.5
+ #return TroggleModel.__init__(*args, **kwargs) # fails in py3.5, runtime fail in 3.8
+
+ def isLogbookEntry(self): # Function used in templates
+ return True
+
+ def get_absolute_url(self):
+ return urllib.parse.urljoin(settings.URL_ROOT, reverse('logbookentry',kwargs={'date':self.date,'slug':self.slug}))
+
+ def __str__(self):
+ return "%s: (%s)" % (self.date, self.title)
+
+ def get_next_by_id(self):
+ LogbookEntry.objects.get(id=self.id+1)
+
+ def get_previous_by_id(self):
+ LogbookEntry.objects.get(id=self.id-1)
+
+ def new_QM_number(self):
+ """Returns """
+ if self.cave:
+ nextQMnumber=self.cave.new_QM_number(self.date.year)
+ else:
+ return None
+ return nextQMnumber
+
+ def new_QM_found_link(self):
+ """Produces a link to a new QM with the next number filled in and this LogbookEntry set as 'found by' """
+ return settings.URL_ROOT + r'/admin/core/qm/add/?' + r'found_by=' + str(self.pk) +'&number=' + str(self.new_QM_number())
+
+ def DayIndex(self):
+ return list(self.expeditionday.logbookentry_set.all()).index(self)
+
+
class QM(TroggleModel):
#based on qm.csv in trunk/expoweb/1623/204 which has the fields:
#"Number","Grade","Area","Description","Page reference","Nearest station","Completion description","Comment"
@@ -510,4 +589,39 @@ class Survey(TroggleModel):
def elevations(self):
return self.scannedimage_set.filter(contents='elevation')
+#
+# 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)
+#
+class PersonTrip(TroggleModel):
+ personexpedition = models.ForeignKey("PersonExpedition",null=True)
+
+ #expeditionday = models.ForeignKey("ExpeditionDay")#MJG wants to KILL THIS (redundant information)
+ #date = models.DateField() #MJG wants to KILL THIS (redundant information)
+ time_underground = models.FloatField(help_text="In decimal hours")
+ logbook_entry = models.ForeignKey(LogbookEntry)
+ is_logbook_entry_author = models.BooleanField(default=False)
+
+
+ # sequencing by person (difficult to solve locally)
+ #persontrip_next = models.ForeignKey('PersonTrip', related_name='pnext', blank=True,null=True)#MJG wants to KILL THIS (and use funstion persontrip_next_auto)
+ #persontrip_prev = models.ForeignKey('PersonTrip', related_name='pprev', blank=True,null=True)#MJG wants to KILL THIS(and use funstion persontrip_prev_auto)
+
+ def persontrip_next(self):
+ futurePTs = PersonTrip.objects.filter(personexpedition = self.personexpedition, logbook_entry__date__gt = self.logbook_entry.date).order_by('logbook_entry__date').all()
+ if len(futurePTs) > 0:
+ return futurePTs[0]
+ else:
+ return None
+
+ def persontrip_prev(self):
+ pastPTs = PersonTrip.objects.filter(personexpedition = self.personexpedition, logbook_entry__date__lt = self.logbook_entry.date).order_by('-logbook_entry__date').all()
+ if len(pastPTs) > 0:
+ return pastPTs[0]
+ else:
+ return None
+
+ def place(self):
+ return self.logbook_entry.cave and self.logbook_entry.cave or self.logbook_entry.place
+ def __str__(self):
+ return "%s (%s)" % (self.personexpedition, self.logbook_entry.date)