diff options
author | Philip Sargent <philip.sargent@klebos.com> | 2020-05-30 01:11:02 +0100 |
---|---|---|
committer | Philip Sargent <philip.sargent@klebos.com> | 2020-05-30 01:11:02 +0100 |
commit | 0776978c9c8d7ee921b446de18b40162ba231aab (patch) | |
tree | 7c1873fa42fff63387305c640a0a27334bf4ba6f /core/models_caves.py | |
parent | 6568cb890015f43a97248bd48e92de67238ca325 (diff) | |
download | troggle-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.py | 116 |
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) |