From 640e1e3b5e428eb11e247299ce213eb690e23e52 Mon Sep 17 00:00:00 2001 From: Philip Sargent Date: Thu, 18 Jun 2020 12:10:42 +0100 Subject: [PATCH] cleaner warnings but site_media still not ok --- .gitignore | 1 + README.txt | 7 + core/migrations/0002_auto_20200617_1631.py | 34 --- models.py | 226 ------------------- models_survex.py | 239 --------------------- profiles/urls.py | 4 +- requirements1.18.19.txt | 7 + urls.py | 4 +- wookey-exposerver-recipe.txt | 8 +- 9 files changed, 26 insertions(+), 504 deletions(-) delete mode 100644 core/migrations/0002_auto_20200617_1631.py delete mode 100644 models.py delete mode 100644 models_survex.py create mode 100644 requirements1.18.19.txt diff --git a/.gitignore b/.gitignore index 600a288..76c0d7c 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ tunnel-import.log posnotfound troggle.sqlite-journal loadsurvexblks.log +logbktrips.shelve diff --git a/README.txt b/README.txt index ca5646b..5528911 100644 --- a/README.txt +++ b/README.txt @@ -164,6 +164,13 @@ for when it is searching for packages (both django and troggle). Ensure that the path to the troggle/ directory is in the list. It should be at the top, which is where the current working directory is. +Now: +python manage.py check -v 3 --deploy +which will give security warnings for deployment. + +python manage.py check -Wall +Goives warnings of deprecated Django which should be fixed asap. + Registering troggle as a django application ------------------------------------------- In your troggle directory run diff --git a/core/migrations/0002_auto_20200617_1631.py b/core/migrations/0002_auto_20200617_1631.py deleted file mode 100644 index 6a6abe4..0000000 --- a/core/migrations/0002_auto_20200617_1631.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('core', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='survexblock', - name='legsall', - field=models.IntegerField(), - ), - migrations.AlterField( - model_name='survexblock', - name='legssplay', - field=models.IntegerField(), - ), - migrations.AlterField( - model_name='survexblock', - name='legssurfc', - field=models.IntegerField(), - ), - migrations.AlterField( - model_name='survexblock', - name='totalleglength', - field=models.FloatField(), - ), - ] diff --git a/models.py b/models.py deleted file mode 100644 index 68ffe7a..0000000 --- a/models.py +++ /dev/null @@ -1,226 +0,0 @@ -import string -import os -import datetime -import logging -import re -from subprocess import call - -from urllib.parse import urljoin -from decimal import Decimal, getcontext -getcontext().prec=2 #use 2 significant figures for decimal calculations - -import settings - -from django.db import models -from django.contrib import admin -from django.contrib.auth.models import User -from django.contrib.contenttypes.models import ContentType -from django.conf import settings -from django.core.urlresolvers import reverse -from django.template import Context, loader - -import troggle.core.models_survex - -def get_related_by_wikilinks(wiki_text): - found=re.findall(settings.QM_PATTERN,wiki_text) - res=[] - for wikilink in found: - qmdict={'urlroot':settings.URL_ROOT,'cave':wikilink[2],'year':wikilink[1],'number':wikilink[3]} - try: - cave_slugs = models_caves.CaveSlug.objects.filter(cave__kataster_number = qmdict['cave']) - qm=QM.objects.get(found_by__cave_slug__in = cave_slugs, - found_by__date__year = qmdict['year'], - number = qmdict['number']) - res.append(qm) - except QM.DoesNotExist: - print(('fail on '+str(wikilink))) - - return res - -try: - logging.basicConfig(level=logging.DEBUG, - filename=settings.LOGFILE, - filemode='w') -except: -# Opening of file for writing is going to fail currently, so decide it doesn't matter for now - pass - -#This class is for adding fields and methods which all of our models will have. -class TroggleModel(models.Model): - new_since_parsing = models.BooleanField(default=False, editable=False) - non_public = models.BooleanField(default=False) - def object_name(self): - return self._meta.object_name - - def get_admin_url(self): - return urljoin(settings.URL_ROOT, "/admin/core/" + self.object_name().lower() + "/" + str(self.pk)) - - class Meta: - abstract = True - -class DataIssue(TroggleModel): - date = models.DateTimeField(auto_now_add=True, blank=True) - parser = models.CharField(max_length=50, blank=True, null=True) - message = models.CharField(max_length=400, blank=True, null=True) - - class Meta: - ordering = ['date'] - - def __str__(self): - return "%s - %s" % (self.parser, self.message) - -# -# single Expedition, usually seen by year -# -class Expedition(TroggleModel): - year = models.CharField(max_length=20, unique=True) - name = models.CharField(max_length=100) - - def __str__(self): - return self.year - - class Meta: - ordering = ('-year',) - get_latest_by = 'year' - - def get_absolute_url(self): - return urljoin(settings.URL_ROOT, reverse('expedition', args=[self.year])) - - # construction function. should be moved out - def get_expedition_day(self, date): - expeditiondays = self.expeditionday_set.filter(date=date) - if expeditiondays: - assert len(expeditiondays) == 1 - return expeditiondays[0] - res = ExpeditionDay(expedition=self, date=date) - res.save() - return res - - def day_min(self): - res = self.expeditionday_set.all() - return res and res[0] or None - - def day_max(self): - res = self.expeditionday_set.all() - return res and res[len(res) - 1] or None - -class ExpeditionDay(TroggleModel): - expedition = models.ForeignKey("Expedition") - date = models.DateField() - - class Meta: - ordering = ('date',) - - def GetPersonTrip(self, personexpedition): - personexpeditions = self.persontrip_set.filter(expeditionday=self) - return personexpeditions and personexpeditions[0] or None - -class Person(TroggleModel): - """single Person, can go on many years - """ - first_name = models.CharField(max_length=100) - last_name = models.CharField(max_length=100) - fullname = models.CharField(max_length=200) - is_vfho = models.BooleanField(help_text="VFHO is the Vereines für Höhlenkunde in Obersteier, a nearby Austrian caving club.", default=False) - mug_shot = models.CharField(max_length=100, blank=True,null=True) - blurb = models.TextField(blank=True,null=True) - - #href = models.CharField(max_length=200) - orderref = models.CharField(max_length=200) # for alphabetic - user = models.OneToOneField(User, null=True, blank=True) - def get_absolute_url(self): - return urljoin(settings.URL_ROOT,reverse('person',kwargs={'first_name':self.first_name,'last_name':self.last_name})) - - class Meta: - verbose_name_plural = "People" - ordering = ('orderref',) # "Wookey" makes too complex for: ('last_name', 'first_name') - - def __str__(self): - if self.last_name: - return "%s %s" % (self.first_name, self.last_name) - return self.first_name - - - def notability(self): - notability = Decimal(0) - max_expo_val = 0 - - max_expo_year = Expedition.objects.all().aggregate(models.Max('year')) - max_expo_val = int(max_expo_year['year__max']) + 1 - - for personexpedition in self.personexpedition_set.all(): - if not personexpedition.is_guest: - print((personexpedition.expedition.year)) - notability += Decimal(1) / (max_expo_val - int(personexpedition.expedition.year)) - return notability - - def bisnotable(self): - return self.notability() > Decimal(1)/Decimal(3) - - def surveyedleglength(self): - return sum([personexpedition.surveyedleglength() for personexpedition in self.personexpedition_set.all()]) - - def first(self): - return self.personexpedition_set.order_by('-expedition')[0] - def last(self): - return self.personexpedition_set.order_by('expedition')[0] - -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) - - is_guest = models.BooleanField(default=False) - COMMITTEE_CHOICES = ( - ('leader','Expo leader'), - ('medical','Expo medical officer'), - ('treasurer','Expo treasurer'), - ('sponsorship','Expo sponsorship coordinator'), - ('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) - - def GetPersonroles(self): - res = [ ] - for personrole in self.personrole_set.order_by('survexblock'): - if res and res[-1]['survexpath'] == personrole.survexblock.survexpath: - res[-1]['roles'] += ", " + str(personrole.role) - else: - res.append({'date':personrole.survexblock.date, 'survexpath':personrole.survexblock.survexpath, 'roles':str(personrole.role)}) - return res - - class Meta: - ordering = ('-expedition',) - #order_with_respect_to = 'expedition' - - def __str__(self): - return "%s: (%s)" % (self.person, self.expedition) - - #why is the below a function in personexpedition, rather than in person? - AC 14 Feb 09 - def name(self): - if self.nickname: - return "%s (%s) %s" % (self.person.first_name, self.nickname, self.person.last_name) - if self.person.last_name: - return "%s %s" % (self.person.first_name, self.person.last_name) - return self.person.first_name - - def get_absolute_url(self): - 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() ] - return sum([survexblock.totalleglength for survexblock in set(survexblocks)]) - - # would prefer to return actual person trips so we could link to first and last ones - def day_min(self): - res = self.persontrip_set.aggregate(day_min=Min("expeditionday__date")) - return res["day_min"] - - def day_max(self): - res = self.persontrip_set.all().aggregate(day_max=models.Max("expeditionday__date")) - return res["day_max"] - - diff --git a/models_survex.py b/models_survex.py deleted file mode 100644 index aed8003..0000000 --- a/models_survex.py +++ /dev/null @@ -1,239 +0,0 @@ -import os -from urllib.parse import urljoin -import re - -from django.db import models -from django.conf import settings -from django.core.urlresolvers import reverse - - -########################################################### -# These will allow browsing and editing of the survex data -########################################################### -# Needs to add: -# Equates -# reloading - -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) - # could also include files in directory but not referenced - - class Meta: - ordering = ('id',) - - -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) - - class Meta: - ordering = ('id',) - - 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] - 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 SurvexEquate(models.Model): - cave = models.ForeignKey('Cave', blank=True, null=True) - -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') - equate = models.ForeignKey('SurvexEquate', blank=True, null=True) - 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 - -# 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') - # tape = models.FloatField() - # compass = models.FloatField() - # clino = models.FloatField() -class SurvexLeg(): - tape = 0.0 - compass = 0.0 - clino = 0.0 - -# -# 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) - parent = models.ForeignKey('SurvexBlock', blank=True, null=True) -# text = models.TextField() - cave = models.ForeignKey('Cave', blank=True, null=True) - - date = models.DateField(blank=True, null=True) - expeditionday = models.ForeignKey("ExpeditionDay", null=True) - expedition = models.ForeignKey('Expedition', blank=True, null=True) - - survexfile = models.ForeignKey("SurvexFile", blank=True, null=True) -# 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) - #refscandir = models.CharField(max_length=100) - - 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',) - - def isSurvexBlock(self): # Function used in templates - return True - - def __str__(self): - return self.name and str(self.name) or 'no name' - - def GetPersonroles(self): - res = [ ] - for personrole in self.personrole_set.order_by('personexpedition'): - if res and res[-1]['person'] == personrole.personexpedition.person: - res[-1]['roles'] += ", " + str(personrole.role) - else: - res.append({'person':personrole.personexpedition.person, 'expeditionyear':personrole.personexpedition.expedition.year, 'roles':str(personrole.role)}) - return res - - def MakeSurvexStation(self, name): - ssl = self.survexstation_set.filter(name=name) - if ssl: - assert len(ssl) == 1 - return ssl[0] - #print name - ss = SurvexStation(name=name, block=self) - #ss.save() - return ss - - def DayIndex(self): - return list(self.expeditionday.survexblock_set.all()).index(self) - -class SurvexTitle(models.Model): - survexblock = models.ForeignKey('SurvexBlock') - title = models.CharField(max_length=200) - cave = models.ForeignKey('Cave', blank=True, null=True) - -# -# 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') - 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) - - def __str__(self): - return str(self.person) + " - " + str(self.survexblock) + " - " + str(self.nrole) - -class SurvexScansFolder(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 SurvexScanSingle(models.Model): - ffile = models.CharField(max_length=200) - name = models.CharField(max_length=200) - survexscansfolder = models.ForeignKey("SurvexScansFolder", null=True) - - class Meta: - ordering = ('name',) - - def get_absolute_url(self): - 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) - -class TunnelFile(models.Model): - tunnelpath = models.CharField(max_length=200) - tunnelname = models.CharField(max_length=200) - bfontcolours = models.BooleanField(default=False) - survexscansfolders = models.ManyToManyField("SurvexScansFolder") - survexscans = models.ManyToManyField("SurvexScanSingle") - survexblocks = models.ManyToManyField("SurvexBlock") - tunnelcontains = models.ManyToManyField("TunnelFile") # case when its a frame type - filesize = models.IntegerField(default=0) - npaths = models.IntegerField(default=0) - survextitles = models.ManyToManyField("SurvexTitle") - - - class Meta: - ordering = ('tunnelpath',) \ No newline at end of file diff --git a/profiles/urls.py b/profiles/urls.py index d10894d..da8a7d7 100644 --- a/profiles/urls.py +++ b/profiles/urls.py @@ -27,7 +27,7 @@ from django.conf.urls import * from profiles import views -urlpatterns = patterns('', +urlpatterns = [ url(r'^select/$', views.select_profile, name='profiles_select_profile'), @@ -43,4 +43,4 @@ urlpatterns = patterns('', url(r'^$', views.profile_list, name='profiles_profile_list'), - ) + ] diff --git a/requirements1.18.19.txt b/requirements1.18.19.txt new file mode 100644 index 0000000..4f291e5 --- /dev/null +++ b/requirements1.18.19.txt @@ -0,0 +1,7 @@ +Django==1.8.19 +django-extensions==2.2.9 +django-registration==2.0 +Pillow==7.1.0 +six==1.15.0 +sqlparse==0.3.1 +Unidecode==1.1.0 diff --git a/urls.py b/urls.py index c1de61c..3acb9d5 100644 --- a/urls.py +++ b/urls.py @@ -26,6 +26,7 @@ actualurlpatterns = [ url(r'^troggle$', views_other.frontpage, name="frontpage"), url(r'^caves$', views_caves.caveindex, name="caveindex"), + url(r'^indxal.htm$', views_caves.caveindex, name="caveindex"), url(r'^people/?$', views_logbooks.personindex, name="personindex"), url(r'^newqmnumber/?$', views_other.ajax_QM_number, ), @@ -83,10 +84,9 @@ actualurlpatterns = [ url(r'^downloadqms$', views_other.downloadQMs), url(r'^admin/doc/?', include('django.contrib.admindocs.urls')), # needs docutils Python module (http://docutils.sf.net/). -# url(r'^admin/', include(admin.site.urls)), url(r'^admin/', admin.site.urls), url(r'^accounts/', include('registration.backends.default.urls')), - url(r'^profiles/', include('profiles.urls')), + url(r'^profiles/', include('profiles.urls')), # not used ? Delete this entire app then. # (r'^personform/(.*)$', personForm), diff --git a/wookey-exposerver-recipe.txt b/wookey-exposerver-recipe.txt index b3edf7b..f548060 100644 --- a/wookey-exposerver-recipe.txt +++ b/wookey-exposerver-recipe.txt @@ -75,4 +75,10 @@ apt install python-django-registration python-django-imagekit python-django-tiny then hold them to stop them being upgraded by unattended upgrades: echo "python-django hold" | sudo dpkg --set-selections echo "python-django-common hold" | sudo dpkg --set-selections -echo "python-django-doc hold" | sudo dpkg --set-selections \ No newline at end of file +echo "python-django-doc hold" | sudo dpkg --set-selections + +Optimizing server +I've tweaked the apache and mysql settings to make them a bit more suitable for a small machine. Seems to have shaved 200MB or so off the idling footprint. +https://www.narga.net/optimizing-apachephpmysql-low-memory-server/ + +(just discovered 'ab' for running apache performance tests - handy).