diff --git a/core/models.py b/core/models.py index c1aa8b3..052af76 100644 --- a/core/models.py +++ b/core/models.py @@ -5,7 +5,7 @@ import logging import re from subprocess import call -import urllib.parse +from urllib.parse import urljoin from decimal import Decimal, getcontext getcontext().prec=2 #use 2 significant figures for decimal calculations @@ -53,7 +53,7 @@ class TroggleModel(models.Model): return self._meta.object_name def get_admin_url(self): - return urllib.parse.urljoin(settings.URL_ROOT, "/admin/core/" + self.object_name().lower() + "/" + str(self.pk)) + return urljoin(settings.URL_ROOT, "/admin/core/" + self.object_name().lower() + "/" + str(self.pk)) class Meta: abstract = True @@ -84,7 +84,7 @@ class Expedition(TroggleModel): get_latest_by = 'year' def get_absolute_url(self): - return urllib.parse.urljoin(settings.URL_ROOT, reverse('expedition', args=[self.year])) + return urljoin(settings.URL_ROOT, reverse('expedition', args=[self.year])) # construction function. should be moved out def get_expedition_day(self, date): @@ -105,7 +105,7 @@ class Expedition(TroggleModel): return res and res[len(res) - 1] or None class ExpeditionDay(TroggleModel): - expedition = models.ForeignKey("Expedition") + expedition = models.ForeignKey("Expedition",on_delete=models.CASCADE) date = models.DateField() class Meta: @@ -127,9 +127,9 @@ class Person(TroggleModel): #href = models.CharField(max_length=200) orderref = models.CharField(max_length=200) # for alphabetic - user = models.OneToOneField(User, null=True, blank=True) + user = models.OneToOneField(User, null=True, blank=True,on_delete=models.CASCADE) def get_absolute_url(self): - return urllib.parse.urljoin(settings.URL_ROOT,reverse('person',kwargs={'first_name':self.first_name,'last_name':self.last_name})) + return urljoin(settings.URL_ROOT,reverse('person',kwargs={'first_name':self.first_name,'last_name':self.last_name})) class Meta: verbose_name_plural = "People" @@ -168,9 +168,9 @@ class Person(TroggleModel): class PersonExpedition(TroggleModel): """Person's attendance to one Expo """ - expedition = models.ForeignKey(Expedition) - person = models.ForeignKey(Person) - slugfield = models.SlugField(max_length=50,blank=True,null=True) + expedition = models.ForeignKey(Expedition,on_delete=models.CASCADE) + person = models.ForeignKey(Person,on_delete=models.CASCADE) + slugfield = models.SlugField(max_length=50,blank=True, null=True) is_guest = models.BooleanField(default=False) COMMITTEE_CHOICES = ( @@ -181,7 +181,7 @@ class PersonExpedition(TroggleModel): ('research','Expo research coordinator'), ) expo_committee_position = models.CharField(blank=True,null=True,choices=COMMITTEE_CHOICES,max_length=200) - nickname = models.CharField(max_length=100,blank=True,null=True) + nickname = models.CharField(max_length=100,blank=True, null=True) def GetPersonroles(self): res = [ ] @@ -208,7 +208,7 @@ class PersonExpedition(TroggleModel): return self.person.first_name def get_absolute_url(self): - return urllib.parse.urljoin(settings.URL_ROOT, reverse('personexpedition',kwargs={'first_name':self.person.first_name,'last_name':self.person.last_name,'year':self.expedition.year})) + return urljoin(settings.URL_ROOT, reverse('personexpedition',kwargs={'first_name':self.person.first_name,'last_name':self.person.last_name,'year':self.expedition.year})) def surveyedleglength(self): survexblocks = [personrole.survexblock for personrole in self.personrole_set.all() ] diff --git a/core/models_caves.py b/core/models_caves.py index e4b3792..ca2ff25 100644 --- a/core/models_caves.py +++ b/core/models_caves.py @@ -25,7 +25,7 @@ class Area(TroggleModel): short_name = models.CharField(max_length=100) name = models.CharField(max_length=200, blank=True, null=True) description = models.TextField(blank=True,null=True) - parent = models.ForeignKey('Area', blank=True, null=True) + parent = models.ForeignKey('Area', blank=True, null=True,on_delete=models.CASCADE) def __str__(self): if self.parent: return str(self.parent) + " - " + str(self.short_name) @@ -38,14 +38,14 @@ class Area(TroggleModel): return self.parent.kat_area() class CaveAndEntrance(models.Model): - cave = models.ForeignKey('Cave') - entrance = models.ForeignKey('Entrance') - entrance_letter = models.CharField(max_length=20,blank=True,null=True) + cave = models.ForeignKey('Cave',on_delete=models.CASCADE) + entrance = models.ForeignKey('Entrance',on_delete=models.CASCADE) + entrance_letter = models.CharField(max_length=20,blank=True, null=True) def __str__(self): return str(self.cave) + str(self.entrance_letter) class CaveSlug(models.Model): - cave = models.ForeignKey('Cave') + cave = models.ForeignKey('Cave',on_delete=models.CASCADE) slug = models.SlugField(max_length=50, unique = True) primary = models.BooleanField(default=False) @@ -53,7 +53,7 @@ class Cave(TroggleModel): # too much here perhaps, official_name = models.CharField(max_length=160) area = models.ManyToManyField(Area, blank=True) - kataster_code = models.CharField(max_length=20,blank=True,null=True) + kataster_code = models.CharField(max_length=20,blank=True, null=True) kataster_number = models.CharField(max_length=10,blank=True, null=True) unofficial_number = models.CharField(max_length=60,blank=True, null=True) entrances = models.ManyToManyField('Entrance', through='CaveAndEntrance') @@ -65,12 +65,12 @@ class Cave(TroggleModel): kataster_status = models.TextField(blank=True,null=True) underground_centre_line = models.TextField(blank=True,null=True) notes = models.TextField(blank=True,null=True) - length = models.CharField(max_length=100,blank=True,null=True) - depth = models.CharField(max_length=100,blank=True,null=True) - extent = models.CharField(max_length=100,blank=True,null=True) - survex_file = models.CharField(max_length=100,blank=True,null=True) - description_file = models.CharField(max_length=200,blank=True,null=True) - url = models.CharField(max_length=200,blank=True,null=True) + length = models.CharField(max_length=100,blank=True, null=True) + depth = models.CharField(max_length=100,blank=True, null=True) + extent = models.CharField(max_length=100,blank=True, null=True) + survex_file = models.CharField(max_length=100,blank=True, null=True) + description_file = models.CharField(max_length=200,blank=True, null=True) + url = models.CharField(max_length=200,blank=True, null=True) filename = models.CharField(max_length=200) #class Meta: @@ -215,12 +215,12 @@ def getCaveByReference(reference): class OtherCaveName(TroggleModel): name = models.CharField(max_length=160) - cave = models.ForeignKey(Cave) + cave = models.ForeignKey(Cave,on_delete=models.CASCADE) def __str__(self): return str(self.name) class EntranceSlug(models.Model): - entrance = models.ForeignKey('Entrance') + entrance = models.ForeignKey('Entrance',on_delete=models.CASCADE) slug = models.SlugField(max_length=50, unique = True) primary = models.BooleanField(default=False) @@ -260,9 +260,9 @@ class Entrance(TroggleModel): other_station = models.TextField(blank=True, null=True) other_description = models.TextField(blank=True,null=True) bearings = models.TextField(blank=True,null=True) - url = models.CharField(max_length=200,blank=True,null=True) + url = models.CharField(max_length=200,blank=True, null=True) filename = models.CharField(max_length=200) - cached_primary_slug = models.CharField(max_length=200,blank=True,null=True) + cached_primary_slug = models.CharField(max_length=200,blank=True, null=True) def __str__(self): return str(self.slug()) @@ -415,11 +415,11 @@ class LogbookEntry(TroggleModel): ) 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- + expeditionday = models.ForeignKey("ExpeditionDay", null=True,on_delete=models.CASCADE)#MJG wants to KILL THIS (redundant information) + expedition = models.ForeignKey(Expedition,blank=True, null=True,on_delete=models.CASCADE) # 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") + 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) @@ -488,10 +488,10 @@ class LogbookEntry(TroggleModel): 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" - found_by = models.ForeignKey(LogbookEntry, related_name='QMs_found',blank=True, null=True ) - ticked_off_by = models.ForeignKey(LogbookEntry, related_name='QMs_ticked_off',null=True,blank=True) - #cave = models.ForeignKey(Cave) - #expedition = models.ForeignKey(Expedition) + found_by = models.ForeignKey(LogbookEntry, related_name='QMs_found',blank=True, null=True,on_delete=models.CASCADE ) + ticked_off_by = models.ForeignKey(LogbookEntry, related_name='QMs_ticked_off',blank=True, null=True,on_delete=models.CASCADE) + #cave = models.ForeignKey(Cave,on_delete=models.CASCADE) + #expedition = models.ForeignKey(Expedition,on_delete=models.CASCADE) number = models.IntegerField(help_text="this is the sequential number in the year", ) GRADE_CHOICES=( @@ -503,10 +503,10 @@ class QM(TroggleModel): ) grade = models.CharField(max_length=1, choices=GRADE_CHOICES) location_description = models.TextField(blank=True) - nearest_station_description = models.CharField(max_length=400,null=True,blank=True) - nearest_station_name = models.CharField(max_length=200,blank=True,null=True) - nearest_station = models.ForeignKey(SurvexStation,null=True,blank=True) - area = models.CharField(max_length=100,blank=True,null=True) + nearest_station_description = models.CharField(max_length=400,blank=True, null=True) + nearest_station_name = models.CharField(max_length=200,blank=True, null=True) + nearest_station = models.ForeignKey(SurvexStation,blank=True, null=True,on_delete=models.CASCADE) + area = models.CharField(max_length=100,blank=True, null=True) completion_description = models.TextField(blank=True,null=True) comment=models.TextField(blank=True,null=True) @@ -541,18 +541,20 @@ def get_scan_path(instance, filename): # 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) + personexpedition = models.ForeignKey("PersonExpedition",null=True,on_delete=models.CASCADE) - #expeditionday = models.ForeignKey("ExpeditionDay")#MJG wants to KILL THIS (redundant information) + #expeditionday = models.ForeignKey("ExpeditionDay",on_delete=models.CASCADE)#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) + logbook_entry = models.ForeignKey(LogbookEntry,on_delete=models.CASCADE) 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) + #persontrip_next = models.ForeignKey('PersonTrip', related_name='pnext', + #blank=True,null=True,on_delete=models.CASCADE)#MJG wants to KILL THIS (and use funstion persontrip_next_auto) + #persontrip_prev = models.ForeignKey('PersonTrip', related_name='pprev', + #blank=True,null=True,on_delete=models.CASCADE)#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() diff --git a/core/models_survex.py b/core/models_survex.py index 4efdb59..79d16bf 100644 --- a/core/models_survex.py +++ b/core/models_survex.py @@ -1,5 +1,5 @@ import os -import urllib.parse +from urllib.parse import urljoin import re from django.db import models @@ -16,8 +16,8 @@ from django.core.urlresolvers import reverse class SurvexDirectory(models.Model): path = models.CharField(max_length=200) - cave = models.ForeignKey('Cave', blank=True, null=True) - primarysurvexfile = models.ForeignKey('SurvexFile', related_name='primarysurvexfile', blank=True, null=True) + cave = models.ForeignKey('Cave', blank=True, null=True,on_delete=models.CASCADE) + primarysurvexfile = models.ForeignKey('SurvexFile', related_name='primarysurvexfile', blank=True, null=True,on_delete=models.CASCADE) # could also include files in directory but not referenced class Meta: @@ -26,8 +26,8 @@ class SurvexDirectory(models.Model): class SurvexFile(models.Model): path = models.CharField(max_length=200) - survexdirectory = models.ForeignKey("SurvexDirectory", blank=True, null=True) - cave = models.ForeignKey('Cave', blank=True, null=True) + survexdirectory = models.ForeignKey("SurvexDirectory", blank=True, null=True,on_delete=models.CASCADE) + cave = models.ForeignKey('Cave', blank=True, null=True,on_delete=models.CASCADE) class Meta: ordering = ('id',) @@ -53,7 +53,7 @@ class SurvexFile(models.Model): class SurvexEquate(models.Model): - cave = models.ForeignKey('Cave', blank=True, null=True) + cave = models.ForeignKey('Cave', blank=True, null=True,on_delete=models.CASCADE) class SurvexStationLookUpManager(models.Manager): def lookup(self, name): @@ -63,8 +63,8 @@ class SurvexStationLookUpManager(models.Manager): class SurvexStation(models.Model): name = models.CharField(max_length=100) - block = models.ForeignKey('SurvexBlock') - equate = models.ForeignKey('SurvexEquate', blank=True, null=True) + block = models.ForeignKey('SurvexBlock',on_delete=models.CASCADE) + equate = models.ForeignKey('SurvexEquate', blank=True, null=True,on_delete=models.CASCADE) objects = SurvexStationLookUpManager() x = models.FloatField(blank=True, null=True) y = models.FloatField(blank=True, null=True) @@ -82,10 +82,10 @@ class SurvexStation(models.Model): return r # class SurvexLeg(models.Model): - # block = models.ForeignKey('SurvexBlock') - # #title = models.ForeignKey('SurvexTitle') - # stationfrom = models.ForeignKey('SurvexStation', related_name='stationfrom') - # stationto = models.ForeignKey('SurvexStation', related_name='stationto') + # block = models.ForeignKey('SurvexBlock',on_delete=models.CASCADE) + # #title = models.ForeignKey('SurvexTitle',on_delete=models.CASCADE) + # stationfrom = models.ForeignKey('SurvexStation', related_name='stationfrom',on_delete=models.CASCADE) + # stationto = models.ForeignKey('SurvexStation', related_name='stationto',on_delete=models.CASCADE) # tape = models.FloatField() # compass = models.FloatField() # clino = models.FloatField() @@ -111,25 +111,25 @@ class SurvexBlockLookUpManager(models.Manager): class SurvexBlock(models.Model): objects = SurvexBlockLookUpManager() name = models.CharField(max_length=100) - parent = models.ForeignKey('SurvexBlock', blank=True, null=True) + parent = models.ForeignKey('SurvexBlock', blank=True, null=True,on_delete=models.CASCADE) # text = models.TextField() - cave = models.ForeignKey('Cave', blank=True, null=True) + cave = models.ForeignKey('Cave', blank=True, null=True,on_delete=models.CASCADE) date = models.DateField(blank=True, null=True) - expeditionday = models.ForeignKey("ExpeditionDay", null=True) - expedition = models.ForeignKey('Expedition', blank=True, null=True) + expeditionday = models.ForeignKey("ExpeditionDay", null=True,on_delete=models.CASCADE) + expedition = models.ForeignKey('Expedition', blank=True, null=True,on_delete=models.CASCADE) - survexfile = models.ForeignKey("SurvexFile", blank=True, null=True) + survexfile = models.ForeignKey("SurvexFile", blank=True, null=True,on_delete=models.CASCADE) # begin_char = models.IntegerField() # code for where in the survex data files this block sits survexpath = models.CharField(max_length=200) # the path for the survex stations - survexscansfolder = models.ForeignKey("SurvexScansFolder", null=True) + survexscansfolder = models.ForeignKey("SurvexScansFolder", null=True,on_delete=models.CASCADE) #refscandir = models.CharField(max_length=100) - legsall = models.IntegerField() # summary data for this block - legssplay = models.IntegerField() # summary data for this block - legssurfc = models.IntegerField() # summary data for this block - totalleglength = models.FloatField() + legsall = models.IntegerField(null=True) # summary data for this block + legssplay = models.IntegerField(null=True) # summary data for this block + legssurfc = models.IntegerField(null=True) # summary data for this block + totalleglength = models.FloatField(null=True) class Meta: ordering = ('id',) @@ -163,9 +163,9 @@ class SurvexBlock(models.Model): return list(self.expeditionday.survexblock_set.all()).index(self) class SurvexTitle(models.Model): - survexblock = models.ForeignKey('SurvexBlock') + survexblock = models.ForeignKey('SurvexBlock',on_delete=models.CASCADE) title = models.CharField(max_length=200) - cave = models.ForeignKey('Cave', blank=True, null=True) + cave = models.ForeignKey('Cave', blank=True, null=True,on_delete=models.CASCADE) # # member of a SurvexBlock @@ -183,14 +183,14 @@ ROLE_CHOICES = ( ) class SurvexPersonRole(models.Model): - survexblock = models.ForeignKey('SurvexBlock') + 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) - personexpedition = models.ForeignKey('PersonExpedition', blank=True, null=True) - persontrip = models.ForeignKey('PersonTrip', blank=True, null=True) - expeditionday = models.ForeignKey("ExpeditionDay", null=True) + person = models.ForeignKey('Person', blank=True, null=True,on_delete=models.CASCADE) + personexpedition = models.ForeignKey('PersonExpedition', blank=True, null=True,on_delete=models.CASCADE) + persontrip = models.ForeignKey('PersonTrip', blank=True, null=True,on_delete=models.CASCADE) + expeditionday = models.ForeignKey("ExpeditionDay", null=True,on_delete=models.CASCADE) def __str__(self): return str(self.person) + " - " + str(self.survexblock) + " - " + str(self.nrole) @@ -203,7 +203,7 @@ class SurvexScansFolder(models.Model): ordering = ('walletname',) def get_absolute_url(self): - return urllib.parse.urljoin(settings.URL_ROOT, reverse('surveyscansfolder', kwargs={"path":re.sub("#", "%23", self.walletname)})) + return urljoin(settings.URL_ROOT, reverse('surveyscansfolder', kwargs={"path":re.sub("#", "%23", self.walletname)})) def __str__(self): return str(self.walletname) + " (Survey Scans Folder)" @@ -211,13 +211,13 @@ class SurvexScansFolder(models.Model): class SurvexScanSingle(models.Model): ffile = models.CharField(max_length=200) name = models.CharField(max_length=200) - survexscansfolder = models.ForeignKey("SurvexScansFolder", null=True) + survexscansfolder = models.ForeignKey("SurvexScansFolder", null=True,on_delete=models.CASCADE) class Meta: ordering = ('name',) def get_absolute_url(self): - return urllib.parse.urljoin(settings.URL_ROOT, reverse('surveyscansingle', kwargs={"path":re.sub("#", "%23", self.survexscansfolder.walletname), "file":self.name})) + return urljoin(settings.URL_ROOT, reverse('surveyscansingle', kwargs={"path":re.sub("#", "%23", self.survexscansfolder.walletname), "file":self.name})) def __str__(self): return "Survey Scan Image: " + str(self.name) + " in " + str(self.survexscansfolder) diff --git a/flatpages/models.py b/flatpages/models.py index 50cf6aa..7808f09 100644 --- a/flatpages/models.py +++ b/flatpages/models.py @@ -7,6 +7,6 @@ class Redirect(models.Model): class EntranceRedirect(models.Model): originalURL = models.CharField(max_length=200) - entrance = models.ForeignKey(Entrance) + entrance = models.ForeignKey(Entrance,on_delete=models.CASCADE) def __str__(self): return self.entrance.slug