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 @@ CaverT/UPrevNext {% 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.