diff --git a/settings.py b/settings.py
index cc7cdc4..7e8b1a5 100644
--- a/settings.py
+++ b/settings.py
@@ -141,6 +141,7 @@ MIDDLEWARE = [
'django.contrib.admindocs.middleware.XViewMiddleware', # this and docutils needed by admindocs
'django.contrib.messages.middleware.MessageMiddleware', # Cookie-based and session-based message support. Needed by admin system
'django.middleware.clickjacking.XFrameOptionsMiddleware', # clickjacking protection via the X-Frame-Options header
+ #'django.middleware.security.SecurityMiddleware', # SECURE_HSTS_SECONDS, SECURE_CONTENT_TYPE_NOSNIFF, SECURE_BROWSER_XSS_FILTER, SECURE_REFERRER_POLICY, and SECURE_SSL_REDIRECT
#'troggle.core.middleware.SmartAppendSlashMiddleware' # needs adapting after Dj2.0
]
diff --git a/templates/expedition.html b/templates/expedition.html
index 6c3e186..3533e28 100644
--- a/templates/expedition.html
+++ b/templates/expedition.html
@@ -12,11 +12,11 @@
Other years:
{% for otherexpedition in expeditions %}
- {% ifequal otherexpedition expedition %}
+ {% if otherexpedition == expedition %}
| {{otherexpedition.year}}
{% else %}
| {{ otherexpedition.year }}
- {% endifequal %}
+ {% endif %}
{% endfor %}
See also the documentation index for this Expo
diff --git a/templates/logbookentry.html b/templates/logbookentry.html
index 5691c4e..1af88bd 100644
--- a/templates/logbookentry.html
+++ b/templates/logbookentry.html
@@ -31,11 +31,11 @@
Caver | T/U | Prev | Next |
{% for persontrip in logbookentry.persontrip_set.all %}
- {% ifequal persontrip.personexpedition logbookentry.author %}
+ {% if persontrip.personexpedition == logbookentry.author %}
{% else %}
|
- {% endifequal %}
+ {% endif %}
{{persontrip.personexpedition.person}}
|
diff --git a/templates/personexpedition.html b/templates/personexpedition.html
index 48e94ac..fd52fe1 100644
--- a/templates/personexpedition.html
+++ b/templates/personexpedition.html
@@ -14,11 +14,11 @@
Other years:
{% for otherpersonexpedition in personexpedition.person.personexpedition_set.all %}
- {% ifequal otherpersonexpedition personexpedition %}
+ {% if otherpersonexpedition == personexpedition %}
| {{otherpersonexpedition.expedition.year}}
{% else %}
| {{ otherpersonexpedition.expedition.year }}
- {% endifequal %}
+ {% endif %}
{% endfor %}
diff --git a/templates/svxcaveseveral.html b/templates/svxcaveseveral.html
index d0412be..a0e2f97 100644
--- a/templates/svxcaveseveral.html
+++ b/templates/svxcaveseveral.html
@@ -50,11 +50,11 @@
{% endif %}
- {% ifequal survexfile survexdirectory.primarysurvexfile %}
+ {% if survexfile == survexdirectory.primarysurvexfile %}
{% url "svx" survexfile.path %}
{% else %}
{% url "svx" survexfile.path %}
- {% endifequal %}
+ {% endif %}
|
{% for survexblock in survexfile.survexblock_set.all %}
diff --git a/templates/svxcavesingle.html b/templates/svxcavesingle.html
index a53889f..a17231d 100644
--- a/templates/svxcavesingle.html
+++ b/templates/svxcavesingle.html
@@ -50,11 +50,11 @@ to go to a form to correct the online data.
{% endif %}
- {% ifequal survexfile survexdirectory.primarysurvexfile %}
+ {% if survexfile == survexdirectory.primarysurvexfile %}
{% url "svx" survexfile.path %}
{% else %}
{% url "svx" survexfile.path %}
- {% endifequal %}
+ {% endif %}
|
{% for survexblock in survexfile.survexblock_set.all %}
diff --git a/urls.py b/urls.py
index 2895afe..8fcabdb 100644
--- a/urls.py
+++ b/urls.py
@@ -1,5 +1,5 @@
from django.conf import settings
-from django.conf.urls import url, include
+from django.conf.urls import url, include, re_path
from django.views.generic.base import RedirectView
from django.views.generic.edit import UpdateView
from django.views.generic.list import ListView
@@ -24,7 +24,7 @@ to resolve urls - in both directions as these are declarative.
HOW THIS WORKS
This is a "url dispatcher" - something needed by every web framework.
-url( ,
+re_path( ,
, )
Django also provides the reverse function: given an an object, provide the URL
@@ -41,11 +41,11 @@ The API urls return TSV or JSON and are new in July 2020.
if settings.EXPOFILESREMOTE:
expofilesurls = [
- url(r'^(?P.*)$', expofiles_redirect, name="expofiles_redirect"), # to http://expo.survex.com/expofiles
+ re_path(r'^(?P.*)$', expofiles_redirect, name="expofiles_redirect"), # to http://expo.survex.com/expofiles
]
else:
expofilesurls = [
- url(r'^(?P.*)$', expofilessingle, name="single"), # local copy of EXPOFILES
+ re_path(r'^(?P.*)$', expofilessingle, name="single"), # local copy of EXPOFILES
]
# The URLs provided by include('django.contrib.auth.urls') are:
@@ -60,124 +60,124 @@ else:
# accounts/reset/done/ [name='password_reset_complete']
trogglepatterns = [
- url(r'^expofiles/', include(expofilesurls)),
+ re_path(r'^expofiles/', include(expofilesurls)),
- url(r'^troggle$', other.frontpage, name="frontpage"), # control panel. Shows recent actions.
- url(r'^caves$', caves.caveindex, name="caveindex"),
- url(r'^indxal.htm$', caves.caveindex, name="caveindex"), # ~420 hrefs to this url in expoweb files
- url(r'^people/?$', personindex, name="personindex"),
+ re_path(r'^troggle$', other.frontpage, name="frontpage"), # control panel. Shows recent actions.
+ re_path(r'^caves$', caves.caveindex, name="caveindex"),
+ re_path(r'^indxal.htm$', caves.caveindex, name="caveindex"), # ~420 hrefs to this url in expoweb files
+ re_path(r'^people/?$', personindex, name="personindex"),
- url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # needs docutils Python module (http://docutils.sf.net/).
- url(r'^admin/', admin.site.urls), # includes admin login & logout urls
+ re_path(r'^admin/doc/', include('django.contrib.admindocs.urls')), # needs docutils Python module (http://docutils.sf.net/).
+ re_path(r'^admin/', admin.site.urls), # includes admin login & logout urls
# setting LOGIN_URL = '/accounts/login/' is default
# url ENDS WITH this string
- url(r'logout/$', expologout, name='expologout'), # higher precedence than /accounts/logout
- url(r'login/$', expologin, name='expologin'), # higher precedence than /accounts/login
- #url(r'^accounts/', include('django.contrib.auth.urls')), # from Dj3.0, see site-packages\registration\auth_urls_classes.py
+ re_path(r'logout/$', expologout, name='expologout'), # higher precedence than /accounts/logout
+ re_path(r'login/$', expologin, name='expologin'), # higher precedence than /accounts/login
+ #re_path(r'^accounts/', include('django.contrib.auth.urls')), # from Dj3.0, see site-packages\registration\auth_urls_classes.py
# Persons - nasty surname recognition logic fails for 19 people!
-# url(r'^person/(?P\d*)/?$', person), makes Ruairidh MacLeod work but kills MacLean
-# url(r'^person/(\w+_\w+)$', logbooks.person, name="person"),
- url(r'^person/(?P[A-Z]*[a-z\-\'&;]*)[^a-zA-Z]*(?P[a-z\-\']*[^a-zA-Z]*[A-Z]*[a-z\-&;]*)/?', person, name="person"),
- url(r'^personexpedition/(?P[A-Z]*[a-z&;]*)[^a-zA-Z]*(?P[A-Z]*[a-zA-Z&;]*)/(?P\d+)/?$', personexpedition, name="personexpedition"),
+# re_path(r'^person/(?P\d*)/?$', person), makes Ruairidh MacLeod work but kills MacLean
+# re_path(r'^person/(\w+_\w+)$', logbooks.person, name="person"),
+ re_path(r'^person/(?P[A-Z]*[a-z\-\'&;]*)[^a-zA-Z]*(?P[a-z\-\']*[^a-zA-Z]*[A-Z]*[a-z\-&;]*)/?', person, name="person"),
+ re_path(r'^personexpedition/(?P[A-Z]*[a-z&;]*)[^a-zA-Z]*(?P[A-Z]*[a-zA-Z&;]*)/(?P\d+)/?$', personexpedition, name="personexpedition"),
# Expedition master page
- url(r'^expedition/(\d+)$', expedition, name="expedition"),
- url(r'^api/expeditions_tsv$', Expeditions_tsvListView.as_view()),
- url(r'^api/expeditions_json$', Expeditions_jsonListView.as_view()),
+ re_path(r'^expedition/(\d+)$', expedition, name="expedition"),
+ re_path(r'^api/expeditions_tsv$', Expeditions_tsvListView.as_view()),
+ re_path(r'^api/expeditions_json$', Expeditions_jsonListView.as_view()),
# Logbook entries
- url(r'^logbookentry/(?P.*)/(?P.*)/?$', logbookentry,name="logbookentry"),
- url(r'^newfile', other.newFile, name="newFile"), # oddly broken, needs investigating more
- url(r'^logbooksearch/(.*)/?$', logbookSearch),
- url(r'^logbook(?P\d\d\d\d)\.(?P.*)/?$', other.downloadLogbook),
- url(r'^logbook/?$', other.downloadLogbook, name="downloadlogbook"),
+ re_path(r'^logbookentry/(?P.*)/(?P.*)/?$', logbookentry,name="logbookentry"),
+ re_path(r'^newfile', other.newFile, name="newFile"), # oddly broken, needs investigating more
+ re_path(r'^logbooksearch/(.*)/?$', logbookSearch),
+ re_path(r'^logbook(?P\d\d\d\d)\.(?P.*)/?$', other.downloadLogbook),
+ re_path(r'^logbook/?$', other.downloadLogbook, name="downloadlogbook"),
# Internal. editfile.html template uses these internally
- url(r'^getPeople/(?P.*)', get_people, name = "get_people"),
- url(r'^getLogBookEntries/(?P.*)', get_logbook_entries, name = "get_logbook_entries"),
- url(r'^getQMs/(?P.*)', caves.get_qms, name = "get_qms"),
- url(r'^getEntrances/(?P.*)', caves.get_entrances, name = "get_entrances"),
+ re_path(r'^getPeople/(?P.*)', get_people, name = "get_people"),
+ re_path(r'^getLogBookEntries/(?P.*)', get_logbook_entries, name = "get_logbook_entries"),
+ re_path(r'^getQMs/(?P.*)', caves.get_qms, name = "get_qms"),
+ re_path(r'^getEntrances/(?P.*)', caves.get_entrances, name = "get_entrances"),
# Cave description pages
- url(r'^cave/new/$', caves.edit_cave, name="newcave"),
- url(r'^cave/3d/(?P[^/]+)$', caves.cave3d, name="cave3d"),
- url(r'^cave/(?P[^/]+)/?$', caves.cave, name="cave"),
- url(r'^cave/(?P[^/]+)/?(?P[^/])$', ent), # view_caves.ent
- url(r'^cave/(?P[^/]+)/edit/$', caves.edit_cave, name="edit_cave"),
+ re_path(r'^cave/new/$', caves.edit_cave, name="newcave"),
+ re_path(r'^cave/3d/(?P[^/]+)$', caves.cave3d, name="cave3d"),
+ re_path(r'^cave/(?P[^/]+)/?$', caves.cave, name="cave"),
+ re_path(r'^cave/(?P[^/]+)/?(?P[^/])$', ent), # view_caves.ent
+ re_path(r'^cave/(?P[^/]+)/edit/$', caves.edit_cave, name="edit_cave"),
- url(r'^cave/entrance/([^/]+)/?$', caves.caveEntrance),
- url(r'^cave/description/([^/]+)/?$', caves.caveDescription),
- url(r'^cave/logbook/([^/]+)/?$', caves.caveLogbook),
- url(r'^(?P\d\d\d\d)(?P.*)$', cavepage, name="cavepage"), # shorthand /1623/264 BUT url links may break
+ re_path(r'^cave/entrance/([^/]+)/?$', caves.caveEntrance),
+ re_path(r'^cave/description/([^/]+)/?$', caves.caveDescription),
+ re_path(r'^cave/logbook/([^/]+)/?$', caves.caveLogbook),
+ re_path(r'^(?P\d\d\d\d)(?P.*)$', cavepage, name="cavepage"), # shorthand /1623/264 BUT url links may break
# Note that urls eg '1623/161/l/rl89a.htm' are handled by cavepage which redirects them to 'expopage'
# Entrances
- url(r'^entrance/(?P[^/]+)/(?P[^/]+)/edit/', caves.edit_entrance, name = "editentrance"),
- url(r'^entrance/new/(?P[^/]+)$', caves.edit_entrance, name = "newentrance"),
+ re_path(r'^entrance/(?P[^/]+)/(?P[^/]+)/edit/', caves.edit_entrance, name = "editentrance"),
+ re_path(r'^entrance/new/(?P[^/]+)$', caves.edit_entrance, name = "newentrance"),
- url(r'^statistics/?$', statistics.stats, name="stats"),
- url(r'^stats/?$', statistics.stats, name="stats"),
- url(r'^pathsreport.*$', statistics.pathsreport, name="pathsreport"),
- url(r'^dataissues/?$', statistics.dataissues, name="dataissues"),
+ re_path(r'^statistics/?$', statistics.stats, name="stats"),
+ re_path(r'^stats/?$', statistics.stats, name="stats"),
+ re_path(r'^pathsreport.*$', statistics.pathsreport, name="pathsreport"),
+ re_path(r'^dataissues/?$', statistics.dataissues, name="dataissues"),
- url(r'^controlpanel/?$', other.controlPanel, name="controlpanel"),
+ re_path(r'^controlpanel/?$', other.controlPanel, name="controlpanel"),
# The survexfile pages
- url(r'^survexfile/(?P.*?)\.svx$', survex.svx, name="svx"),
- url(r'^survexfile/(?P.*?)\.3d$', survex.threed, name="threed"),
- url(r'^survexfile/(?P.*?)\.log$', survex.svxraw),
- url(r'^survexfile/(?P.*?)\.err$', survex.err),
+ re_path(r'^survexfile/(?P.*?)\.svx$', survex.svx, name="svx"),
+ re_path(r'^survexfile/(?P.*?)\.3d$', survex.threed, name="threed"),
+ re_path(r'^survexfile/(?P.*?)\.log$', survex.svxraw),
+ re_path(r'^survexfile/(?P.*?)\.err$', survex.err),
- url(r'^survexfile/caves/$', survex.survexcaveslist, name="survexcaveslist"),
- url(r'^survexfile/caves$', survex.survexcaveslist, name="survexcaveslist"), # auto slash not working
- url(r'^survexfile/(?P.*)$', survex.survexcavesingle, name="survexcavessingle"),
+ re_path(r'^survexfile/caves/$', survex.survexcaveslist, name="survexcaveslist"),
+ re_path(r'^survexfile/caves$', survex.survexcaveslist, name="survexcaveslist"), # auto slash not working
+ re_path(r'^survexfile/(?P.*)$', survex.survexcavesingle, name="survexcavessingle"),
- url(r'^survey_scans/$', surveys.surveyscansfolders, name="surveyscansfolders"),
- url(r'^survey_scans/(?P[^/]+)/$', surveys.surveyscansfolder, name="surveyscansfolder"),
- url(r'^survey_scans/(?P[^/]+)/(?P[^/]+)$',
+ re_path(r'^survey_scans/$', surveys.surveyscansfolders, name="surveyscansfolders"),
+ re_path(r'^survey_scans/(?P[^/]+)/$', surveys.surveyscansfolder, name="surveyscansfolder"),
+ re_path(r'^survey_scans/(?P[^/]+)/(?P[^/]+)$',
surveys.surveyscansingle, name="surveyscansingle"),
# The tunnel and therion drawings files pages
- url(r'^tunneldata/$', surveys.tunneldata, name="tunneldata"),
- url(r'^tunneldataraw/(?P.+?\.xml)$', surveys.dwgfilesingle, name="dwgfilesingle"),
- url(r'^tunneldataraw/(?P.+?\.th)$', surveys.dwgfilesingle, name="dwgfilesingle"),
- url(r'^tunneldataraw/(?P.+?\.th2)$', surveys.dwgfilesingle, name="dwgfilesingle"),
-# url(r'^tunneldatainfo/(?P.+?\.xml)$', surveys.tunnelfileinfo, name="tunnelfileinfo"), # parses tunnel for info
- url(r'^tunneldataraw/(?P.+?\.xml)/upload$', surveys.tunnelfileupload, name="tunnelfileupload"),
+ re_path(r'^tunneldata/$', surveys.tunneldata, name="tunneldata"),
+ re_path(r'^tunneldataraw/(?P.+?\.xml)$', surveys.dwgfilesingle, name="dwgfilesingle"),
+ re_path(r'^tunneldataraw/(?P.+?\.th)$', surveys.dwgfilesingle, name="dwgfilesingle"),
+ re_path(r'^tunneldataraw/(?P.+?\.th2)$', surveys.dwgfilesingle, name="dwgfilesingle"),
+# re_path(r'^tunneldatainfo/(?P.+?\.xml)$', surveys.tunnelfileinfo, name="tunnelfileinfo"), # parses tunnel for info
+ re_path(r'^tunneldataraw/(?P.+?\.xml)/upload$', surveys.tunnelfileupload, name="tunnelfileupload"),
# QMs pages - must precede other /caves pages
- url(r'^cave/qms/([^/]+)/?$', caves.caveQMs), # blank page usually
- url(r'^cave/(?P[^/]+)/(?P\d\d\d\d)-(?P\d*)(?P[ABCDX]?)?$', caves.qm, name="qm"),
- url(r'^cave/(?P[^/]+)/qm\.csv/?$', other.downloadQMs, name="downloadqms"),
- url(r'^newqmnumber/?$', other.ajax_QM_number, ), # blank page if no ch given
-# url(r'^downloadqms$', other.downloadQMs), # MultiValueDictKeyError
+ re_path(r'^cave/qms/([^/]+)/?$', caves.caveQMs), # blank page usually
+ re_path(r'^cave/(?P[^/]+)/(?P\d\d\d\d)-(?P\d*)(?P[ABCDX]?)?$', caves.qm, name="qm"),
+ re_path(r'^cave/(?P[^/]+)/qm\.csv/?$', other.downloadQMs, name="downloadqms"),
+ re_path(r'^newqmnumber/?$', other.ajax_QM_number, ), # blank page if no ch given
+# re_path(r'^downloadqms$', other.downloadQMs), # MultiValueDictKeyError
# Prospecting Guide document
- url(r'^prospecting_guide/$', prospecting),
- url(r'^prospecting/(?P[^.]+).png$', prospecting_image, name="prospecting_image"),
+ re_path(r'^prospecting_guide/$', prospecting),
+ re_path(r'^prospecting/(?P[^.]+).png$', prospecting_image, name="prospecting_image"),
# This next set are all intercepted by Apache, if it is running.
- url(r'^photos/(?P.*)$', mediapage, {'doc_root': settings.PHOTOS_ROOT}, name="mediapage"), # photo galleries
- url(r'^site_media/(?P.*)$', mediapage, {'doc_root': settings.MEDIA_ROOT}, name="mediapage"), # MEDIA_ROOT: CSS and JS
- url(r'^static/(?P.*)$', mediapage, {'doc_root': settings.MEDIA_ROOT}, name="mediapage"), # STATIC is in MEDIA now!
- url(r'^javascript/(?P.*)$', mediapage, {'doc_root': settings.JSLIB_ROOT}, name="mediapage"), # JSLIB_URL
- url(r'^expowebcache/3d/(?P.*)$', mediapage, {'doc_root': settings.THREEDCACHEDIR}, name="mediapage"),
- url(r'^map/map.html', map, name="map"), # Redirects to OpenStreetMap JavaScript
- url(r'^map/(?P.*)$', mapfile, name="mapfile"), # css, js, gpx
+ re_path(r'^photos/(?P.*)$', mediapage, {'doc_root': settings.PHOTOS_ROOT}, name="mediapage"), # photo galleries
+ re_path(r'^site_media/(?P.*)$', mediapage, {'doc_root': settings.MEDIA_ROOT}, name="mediapage"), # MEDIA_ROOT: CSS and JS
+ re_path(r'^static/(?P.*)$', mediapage, {'doc_root': settings.MEDIA_ROOT}, name="mediapage"), # STATIC is in MEDIA now!
+ re_path(r'^javascript/(?P.*)$', mediapage, {'doc_root': settings.JSLIB_ROOT}, name="mediapage"), # JSLIB_URL
+ re_path(r'^expowebcache/3d/(?P.*)$', mediapage, {'doc_root': settings.THREEDCACHEDIR}, name="mediapage"),
+ re_path(r'^map/map.html', map, name="map"), # Redirects to OpenStreetMap JavaScript
+ re_path(r'^map/(?P.*)$', mapfile, name="mapfile"), # css, js, gpx
# Final catchall which also serves expoweb handbook pages and images
- url(r'^(.*)_edit$', editexpopage, name="editexpopage"),
- url(r'^(.*)$', expopage, name="expopage"), # CATCHALL assumed relative to EXPOWEB
+ re_path(r'^(.*)_edit$', editexpopage, name="editexpopage"),
+ re_path(r'^(.*)$', expopage, name="expopage"), # CATCHALL assumed relative to EXPOWEB
]
# do not allow DIR_ROOT prefix to all urls
urlpatterns = [
- # url('^%s' % settings.DIR_ROOT, include(trogglepatterns))
- url('', include(trogglepatterns))
+ # re_path('^%s' % settings.DIR_ROOT, include(trogglepatterns))
+ re_path('', include(trogglepatterns))
]
# When apache is running these prempt Django so Django never sees them.