From 7bc73d1ca8aae35d01848418ff76ba60fb2cea66 Mon Sep 17 00:00:00 2001 From: Philip Sargent Date: Tue, 13 Apr 2021 00:50:12 +0100 Subject: move models_survex to models/survex.py --- core/models/survex.py | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 core/models/survex.py (limited to 'core/models/survex.py') diff --git a/core/models/survex.py b/core/models/survex.py new file mode 100644 index 0000000..989b9a6 --- /dev/null +++ b/core/models/survex.py @@ -0,0 +1,209 @@ +import os +from urllib.parse import urljoin +import re + +from django.db import models +from django.conf import settings +from django.urls import reverse + + +class SurvexDirectory(models.Model): + path = models.CharField(max_length=200) + cave = models.ForeignKey('Cave', blank=True, null=True,on_delete=models.SET_NULL) + primarysurvexfile = models.ForeignKey('SurvexFile', related_name='primarysurvexfile', blank=True, null=True,on_delete=models.SET_NULL) + # could also include files in directory but not referenced + + class Meta: + ordering = ('id',) + + # Don't change from the default as that breaks troggle webpages and internal referencing! + # def __str__(self): + # return "[SurvexDirectory:"+str(self.path) + "-" + str(self.primarysurvexfile.path) + "-" + str(self.cave)+"]" + + +class SurvexFile(models.Model): + path = models.CharField(max_length=200) + survexdirectory = models.ForeignKey("SurvexDirectory", blank=True, null=True,on_delete=models.SET_NULL) + cave = models.ForeignKey('Cave', blank=True, null=True,on_delete=models.SET_NULL) + + class Meta: + ordering = ('id',) + + # Don't change from the default as that breaks troggle webpages and internal referencing! + # def __str__(self): + # return "[SurvexFile:"+str(self.path) + "-" + str(self.survexdirectory) + "-" + str(self.cave)+"]" + + def exists(self): + fname = os.path.join(settings.SURVEX_DATA, self.path + ".svx") + return os.path.isfile(fname) + + def OpenFile(self): + fname = os.path.join(settings.SURVEX_DATA, self.path + ".svx") + return open(fname) + + def SetDirectory(self): + dirpath = os.path.split(self.path)[0] + # pointless search every time we import a survex file if we know there are no duplicates.. + # don't use this for initial import. + survexdirectorylist = SurvexDirectory.objects.filter(cave=self.cave, path=dirpath) + if survexdirectorylist: + self.survexdirectory = survexdirectorylist[0] + else: + survexdirectory = SurvexDirectory(path=dirpath, cave=self.cave, primarysurvexfile=self) + survexdirectory.save() + self.survexdirectory = survexdirectory + self.save() + + +class SurvexStationLookUpManager(models.Manager): + def lookup(self, name): + blocknames, sep, stationname = name.rpartition(".") + return self.get(block = SurvexBlock.objects.lookup(blocknames), + name__iexact = stationname) + +class SurvexStation(models.Model): + name = models.CharField(max_length=100) + block = models.ForeignKey('SurvexBlock', null=True,on_delete=models.SET_NULL) +# equate = models.ForeignKey('SurvexEquate', blank=True, null=True,on_delete=models.SET_NULL) + objects = SurvexStationLookUpManager() + x = models.FloatField(blank=True, null=True) + y = models.FloatField(blank=True, null=True) + z = models.FloatField(blank=True, null=True) + + def path(self): + r = self.name + b = self.block + while True: + if b.name: + r = b.name + "." + r + if b.parent: + b = b.parent + else: + return r + +# +# Single SurvexBlock +# +class SurvexBlockLookUpManager(models.Manager): + def lookup(self, name): + if name == "": + blocknames = [] + else: + blocknames = name.split(".") + block = SurvexBlock.objects.get(parent=None, survexfile__path=settings.SURVEX_TOPNAME) + for blockname in blocknames: + block = SurvexBlock.objects.get(parent=block, name__iexact=blockname) + return block + +class SurvexBlock(models.Model): + objects = SurvexBlockLookUpManager() + name = models.CharField(max_length=100) + title = models.CharField(max_length=200) + parent = models.ForeignKey('SurvexBlock', blank=True, null=True,on_delete=models.SET_NULL) + cave = models.ForeignKey('Cave', blank=True, null=True,on_delete=models.SET_NULL) + + date = models.DateField(blank=True, null=True) + expeditionday = models.ForeignKey("ExpeditionDay", null=True,on_delete=models.SET_NULL) + expedition = models.ForeignKey('Expedition', blank=True, null=True,on_delete=models.SET_NULL) + + survexfile = models.ForeignKey("SurvexFile", blank=True, null=True,on_delete=models.SET_NULL) + survexpath = models.CharField(max_length=200) # the path for the survex stations + + scansfolder = models.ForeignKey("ScansFolder", null=True,on_delete=models.SET_NULL) + + legsall = models.IntegerField(null=True) # summary data for this block + legslength = models.FloatField(null=True) + + class Meta: + ordering = ('id',) + + # Don't change from the original as that breaks troggle webpages and internal referencing! + # def __str__(self): + # return "[SurvexBlock:"+ str(self.name) + "-path:" + \ + # str(self.survexpath) + "-cave:" + \ + # str(self.cave) + "]" + def __str__(self): + return self.name and str(self.name) or 'no name' + + def isSurvexBlock(self): # Function used in templates + return True + + def GetPersonroles(self): + res = [ ] + for personrole in self.survexpersonrole_set.order_by('personexpedition'): + if res and res[-1]['person'] == personrole.personexpedition.person: + res[-1]['roles'] += ", " + str(personrole.nrole) + else: + res.append({'person':personrole.personexpedition.person, 'expeditionyear':personrole.personexpedition.expedition.year, 'roles':str(personrole.nrole)}) + return res + + def DayIndex(self): + return list(self.expeditionday.survexblock_set.all()).index(self) +# +# member of a SurvexBlock +# +ROLE_CHOICES = ( + ('insts','Instruments'), + ('dog','Other'), + ('notes','Notes'), + ('pics','Pictures'), + ('tape','Tape measure'), + ('useless','Useless'), + ('helper','Helper'), + ('disto','Disto'), + ('consultant','Consultant'), + ) + +class SurvexPersonRole(models.Model): + survexblock = models.ForeignKey('SurvexBlock',on_delete=models.CASCADE) + nrole = models.CharField(choices=ROLE_CHOICES, max_length=200, blank=True, null=True) + # increasing levels of precision + personname = models.CharField(max_length=100) + person = models.ForeignKey('Person', blank=True, null=True,on_delete=models.SET_NULL) + personexpedition = models.ForeignKey('PersonExpedition', blank=True, null=True,on_delete=models.SET_NULL) + persontrip = models.ForeignKey('PersonTrip', blank=True, null=True,on_delete=models.SET_NULL) + expeditionday = models.ForeignKey("ExpeditionDay", null=True,on_delete=models.SET_NULL) + + def __str__(self): + return str(self.person) + " - " + str(self.survexblock) + " - " + str(self.nrole) + +class ScansFolder(models.Model): + fpath = models.CharField(max_length=200) + walletname = models.CharField(max_length=200) + + class Meta: + ordering = ('walletname',) + + def get_absolute_url(self): + return urljoin(settings.URL_ROOT, reverse('surveyscansfolder', kwargs={"path":re.sub("#", "%23", self.walletname)})) + + def __str__(self): + return str(self.walletname) + " (Survey Scans Folder)" + +class SingleScan(models.Model): + ffile = models.CharField(max_length=200) + name = models.CharField(max_length=200) + scansfolder = models.ForeignKey("ScansFolder", null=True,on_delete=models.SET_NULL) + + class Meta: + ordering = ('name',) + + def get_absolute_url(self): + return urljoin(settings.URL_ROOT, reverse('surveyscansingle', kwargs={"path":re.sub("#", "%23", self.scansfolder.walletname), "file":self.name})) + + def __str__(self): + return "Survey Scan Image: " + str(self.name) + " in " + str(self.scansfolder) + +class TunnelFile(models.Model): + tunnelpath = models.CharField(max_length=200) + tunnelname = models.CharField(max_length=200) + bfontcolours = models.BooleanField(default=False) # UNUSED now, can be deleted + manyscansfolders = models.ManyToManyField("ScansFolder") # implicitly links via folders to scans to SVX files + scans = models.ManyToManyField("SingleScan") # implicitly links via scans to SVX files + tunnelcontains = models.ManyToManyField("TunnelFile") # case when its a frame type + filesize = models.IntegerField(default=0) + npaths = models.IntegerField(default=0) + survexfiles = models.ManyToManyField("SurvexFile") # direct link to SVX files - not populated yet + + class Meta: + ordering = ('tunnelpath',) \ No newline at end of file -- cgit v1.2.3