mirror of
https://expo.survex.com/repositories/troggle/.git
synced 2024-12-18 14:32:19 +00:00
353 lines
19 KiB
Python
353 lines
19 KiB
Python
from django.conf import settings
|
|
from django.conf.urls.static import static
|
|
from django.contrib import admin
|
|
from django.urls import include, path, re_path
|
|
|
|
from troggle.core.views import statistics, survex
|
|
from troggle.core.views.auth import expologin, expologout
|
|
from troggle.core.views.caves import (
|
|
cave3d,
|
|
cave_debug,
|
|
caveindex,
|
|
cavepage,
|
|
caveQMs,
|
|
caveslist,
|
|
caveslugfwd,
|
|
edit_cave,
|
|
edit_entrance,
|
|
entranceindex,
|
|
expo_kml,
|
|
expo_kmz,
|
|
get_entrances,
|
|
qm,
|
|
)
|
|
from troggle.core.views.drawings import dwgallfiles, dwgfilesingle
|
|
from troggle.core.views.editor_helpers import image_selector, new_image_form
|
|
from troggle.core.views.expo import (
|
|
editexpopage,
|
|
expofiles_redirect,
|
|
expofilessingle,
|
|
expopage,
|
|
indexpage,
|
|
map,
|
|
mapfile,
|
|
mediapage,
|
|
pubspage,
|
|
spider,
|
|
)
|
|
from troggle.core.views.logbooks import (
|
|
Expeditions_jsonListView,
|
|
Expeditions_tsvListView,
|
|
QMs_jsonListView,
|
|
expedition,
|
|
get_logbook_entries,
|
|
get_people,
|
|
logbookentry,
|
|
logentrydelete,
|
|
logreport,
|
|
notablepersons,
|
|
person,
|
|
personexpedition,
|
|
)
|
|
from troggle.core.views.other import controlpanel, exportlogbook, frontpage, todos
|
|
from troggle.core.views.prospect import prospecting
|
|
from troggle.core.views.scans import allscans, cavewallets, scansingle, walletslistperson, walletslistyear
|
|
from troggle.core.views.uploads import dwgupload, expofilerename, gpxupload, logbookedit, photoupload
|
|
from troggle.core.views.wallets_edit import walletedit
|
|
|
|
"""This sets the actualurlpatterns[] and urlpatterns[] lists which django uses
|
|
to resolve urls - in both directions as these are declarative.
|
|
|
|
HOW THIS WORKS
|
|
This is a "url dispatcher" - something needed by every web framework.
|
|
re_path( <regular expression that matches the thing in the web browser>,
|
|
<reference to python function in 'core' folder>, <optional name>)
|
|
|
|
Django also provides the reverse function: given an an object, provide the URL
|
|
which is vital to writing code for the webapp. So the URL dispatch is declarative.
|
|
|
|
The API urls return TSV or JSON and are new in July 2020.
|
|
"""
|
|
|
|
todo = '''
|
|
- Replace more re_path() with modern and simpler path(). Careful: some have to stay as re_path()
|
|
|
|
- The admin and logout paths need to stay using re_path() as they
|
|
have to be locked to the start.
|
|
|
|
- The final _edit and CATCHALL also have to use re_path().
|
|
|
|
- Test VERY CAREFULLY for each change. It is fragile.
|
|
'''
|
|
|
|
# Many of these patterns do not work because troggle spent many years broken and we have
|
|
# not yet restored all the functions. Some may have never been fully implemented in
|
|
# the first place and what they were intended to provide is obscure.
|
|
|
|
|
|
# WHen running on the server, apache intercepts all the /expofiles/ files so troggle never sees them,
|
|
# so the "content type" is set by whatever apache thinks it should be. Which means .gpx files
|
|
# get treated as XML and the web browser fails to do anything usefull
|
|
|
|
if settings.EXPOFILESREMOTE:
|
|
expofilesurls = [
|
|
path('<path:filepath>', expofiles_redirect, name="expofiles_redirect"), # to http://expo.survex.com/expofiles
|
|
path('', expofiles_redirect, {'filepath': ""}, name="expofiles_redirect"),
|
|
]
|
|
else:
|
|
expofilesurls = [
|
|
path('', expofilessingle, {'filepath': ""}, name="single"),
|
|
path('<path:filepath>', expofilessingle, name="single"), # local copy of EXPOFILES
|
|
]
|
|
|
|
# see https://docs.djangoproject.com/en/dev/topics/auth/default/tiny
|
|
# The URLs provided by include('django.contrib.auth.urls') are:
|
|
#
|
|
# accounts/login/ [name='login']
|
|
# accounts/logout/ [name='logout']
|
|
# accounts/password_change/ [name='password_change']
|
|
# accounts/password_change/done/ [name='password_change_done']
|
|
# accounts/password_reset/ [name='password_reset']
|
|
# accounts/password_reset/done/ [name='password_reset_done']
|
|
# accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
|
|
# accounts/reset/done/ [name='password_reset_complete']
|
|
|
|
# BUT many of these are set up by opinionated Django even if 'django.contrib.auth.urls' is NOT included.
|
|
# Some overlap with 'admin.site.urls' needs to be investigated.
|
|
|
|
# admin.site.urls is urls() which maps to get_urls() which is a function declared
|
|
# in django/contrib/admin/sites.py which for me is
|
|
# /home/philip/p11d5/lib/python3.11/site-packages/django/contrib/admin/sites.py
|
|
|
|
trogglepatterns = [
|
|
path('pubs.htm', pubspage, name="pubspage"), # ~165 hrefs to this url in expoweb files
|
|
#path('', indexpage, name="indexpage"), # ~1,212 hrefs to this url in expoweb files
|
|
path('index.htm', indexpage, name="indexpage"), # ~1,212 hrefs to this url in expoweb files
|
|
|
|
path('expofiles/', include(expofilesurls)), # intercepted by Apache, if it is running.
|
|
path('expofiles', include(expofilesurls)), # curious interaction with the include() here, not just a slash problem.
|
|
|
|
re_path(r'^(.*)_edit_edit$', spider, name="spider"), # web spider funny
|
|
|
|
re_path(r'^caves$', caveindex, name="caveindex"),
|
|
re_path(r'^indxal.htm$', caveindex, name="caveindex"), # ~420 hrefs to this url in expoweb files
|
|
re_path(r'^people/?$', notablepersons, name="notablepersons"),
|
|
path('caveslist', caveslist, name="caveslist"),
|
|
|
|
path('entrances', entranceindex, name="entranceindex"),
|
|
|
|
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 & /admin/jsi18n/
|
|
|
|
# Uploads - uploading a file
|
|
path('walletedit/', walletedit, name='walletedit'),
|
|
path('walletedit/<path:path>', walletedit, name='walletedit'), # path=2020#01
|
|
path('photoupload/', photoupload, name='photoupload'), # restricted to current year
|
|
path('photoupload/<path:folder>', photoupload, name='photoupload'), # restricted to current year
|
|
path('gpxupload/', gpxupload, name='gpxupload'), # restricted to current year
|
|
path('gpxupload/<path:folder>', gpxupload, name='gpxupload'), # restricted to current year
|
|
path('dwgupload/<path:folder>', dwgupload, name='dwgupload'),
|
|
path('dwgupload/', dwgupload, name='dwgupload'),
|
|
path('dwguploadnogit/', dwgupload, {'gitdisable': 'yes'}, name='dwguploadnogit'), # used in testing
|
|
path('dwguploadnogit/<path:folder>', dwgupload, {'gitdisable': 'yes'}, name='dwguploadnogit'), # used in testing
|
|
path('logbookedit/', logbookedit, name='logbookedit'),
|
|
path('logbookedit/<slug:slug>', logbookedit, name='logbookedit'),
|
|
|
|
# Renaming an uploaded file
|
|
path('expofilerename/<path:filepath>', expofilerename, name='expofilerename'),
|
|
|
|
# setting LOGIN_URL = '/accounts/login/' is default.
|
|
# NB setting url pattern name to 'login' instea dof 'expologin' with override Django, see https://docs.djangoproject.com/en/dev/topics/http/urls/#naming-url-patterns
|
|
path('accounts/logout/', expologout, name='expologout'), # same as in django.contrib.auth.urls
|
|
path('accounts/login/', expologin, name='expologin'), # same as in django.contrib.auth.urls
|
|
#re_path(r'^accounts/', include('django.contrib.auth.urls')), # see site-packages\registration\auth_urls_classes.py
|
|
|
|
# Persons - nasty surname recognition logic fails for 19 people! See also Wallets by person below.
|
|
# path('person/<str:name>', person, name="person"), # This is much more complex than it looks..
|
|
path('person/<slug:slug>', person, name="person"),
|
|
#re_path(r'^person/(?P<first_name>[A-Z]*[a-z\-\'&;]*)[^a-zA-Z]*(?P<last_name>[a-z\-\']*[^a-zA-Z]*[\-]*[A-Z]*[a-zA-Z\-&;]*)/?', person, name="person"),
|
|
#re_path(r'^personexpedition/(?P<first_name>[A-Z]*[a-z&;]*)[^a-zA-Z]*(?P<last_name>[A-Z]*[a-zA-Z&;]*)/(?P<year>\d+)/?$', personexpedition, name="personexpedition"),
|
|
path('personexpedition/<slug:slug>/<int:year>', personexpedition, name="personexpedition"),
|
|
|
|
# Expedition master page & API exports
|
|
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()),
|
|
re_path(r'^api/QMs_json$', QMs_jsonListView.as_view()),
|
|
|
|
# Logbook entries
|
|
re_path(r'^logbookentry/(?P<date>.*)/(?P<slug>.*)/?$', logbookentry,name="logbookentry"),
|
|
re_path(r'^logbook$', exportlogbook, name='exportlogbook'),
|
|
path('logreport/<slug:year>', logreport, name='logreport'),
|
|
path('logentrydelete/<slug:year>', logentrydelete, name='logentrydelete'),
|
|
|
|
|
|
# Internal. editfile.html template uses these internally
|
|
re_path(r'^getPeople/(?P<expeditionslug>.*)', get_people, name = "get_people"),
|
|
re_path(r'^getLogBookEntries/(?P<expeditionslug>.*)', get_logbook_entries, name = "get_logbook_entries"),
|
|
re_path(r'^getEntrances/(?P<caveslug>.*)', get_entrances, name = "get_entrances"), # used internally ?
|
|
|
|
# Cave description pages
|
|
path('cave/<slug:slug>', caveslugfwd, name="caveslugfwd"),
|
|
path('cave_debug', cave_debug, name="cave_debug"),
|
|
re_path(r'^newcave/$', edit_cave, name="newcave"),
|
|
re_path(r'^cave/3d/(?P<cave_id>[^/]+).3d$', cave3d, name="cave3d"),
|
|
|
|
#re_path(r'^cave/description/([^/]+)/?$', caves.caveDescription), #!!!BAD, local links fail..
|
|
#re_path(r'^cave/(?P<cave_id>[^/]+)/?$', caves.cave, name="cave"), # used only in testing !? XXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
#re_path(r'^cave/(?P<cave_id>[^/]+)/?(?P<ent_letter>[^/])$', ent), #!!!BAD, local links fail..# view_caves.ent
|
|
|
|
# Edit caves and entrances
|
|
re_path(r'^(?P<path>.*)/(?P<slug>[^/]+)_cave_edit/$', edit_cave, name="edit_cave"), # edit_cave needed by cave.html template for url matching
|
|
re_path(r'^(?P<caveslug>[^/]+):(?P<entslug>[^:]+)_entrance_edit', edit_entrance, name = "editentrance"), #edit existing entrance
|
|
re_path(r'^(?P<path>.*)/(?P<caveslug>[^/]+)_entrance_new$', edit_entrance, name = "newentrance"), # new entrance for a cave
|
|
|
|
re_path(r'^(.*)_edit$', editexpopage, name="editexpopage"),
|
|
re_path(r'^(?P<karea>162\d)(?P<subpath>.*)$', cavepage, name="cavepage"), # shorthand /1623/264 or 1623/161/top.htm or 1623/161/i/stuff.jpg
|
|
# Note that urls eg '/1623/161/l/rl89a.htm' are handled by cavepage which redirects them to 'expopage'
|
|
# Note that _edit$ for a cave description page in a subfolder e.g. /1623/204/204.html_edit gets caught here and breaks with 404
|
|
|
|
# These re-enable archaic URLs which are in old web pages which may still be public on other servers - old
|
|
# path('smkridge/<path:subpath>', cavepagefwd, {'karea': "1623"}, name="cavepagefwd"),
|
|
# path('expo/smkridge/<path:subpath>', cavepagefwd, {'karea': "1623"}, name="cavepagefwd"),
|
|
|
|
# Archaic, kept. This /expo/ prefix only works for expoweb HTML pages not troggle pages
|
|
path('expo/<path:path>', expopage, name="expopage"),
|
|
|
|
# System admin and monitoring
|
|
path('statistics', statistics.stats, name="stats"),
|
|
path('stats', statistics.stats, name="stats"),
|
|
path('pathsreport', statistics.pathsreport, name="pathsreport"),
|
|
path('dataissues', statistics.dataissues, name="dataissues"),
|
|
path('therionissues', statistics.therionissues, name="therionissues"),
|
|
path('surveximport', statistics.surveximport, name="surveximport"),
|
|
path('survexdebug', statistics.survexdebug, name="survexdebug"),
|
|
path('stations', statistics.stations, name="stations"),
|
|
path('aliases/<int:year>',statistics.aliases, name="aliases"),
|
|
|
|
path('troggle', frontpage, name="frontpage"), # control panel. Shows recent actions.
|
|
path('todo/<path:module>', todos, name="todos"),
|
|
path('controlpanel', controlpanel, name="controlpanel"),
|
|
|
|
# The survexfile pages
|
|
path('survexdir', survex.survexdir, name="survexdir"),
|
|
|
|
path('survexfile', survex.survexcavesingle, {'cave_shortname': ''}, name="survexcavessingle"),
|
|
path('survexfile/', survex.survexcavesingle, {'cave_shortname': ''}, name="survexcavessingle"),
|
|
path('survexfile/caves', survex.survexcaveslist, name="survexcaveslist"),
|
|
path('survexfile/caves/', survex.survexcaveslist, name="survexcaveslist"), # auto slash not working
|
|
|
|
path('survexfile/<path:survex_file>.svx', survex.svx, name="svx"),
|
|
path('survexfile/<path:survex_file>.3d', survex.threed, name="threed"),
|
|
path('survexfile/<path:survex_file>.log', survex.svxlog, name="svxlog"),
|
|
path('survexfile/<path:survex_file>.err', survex.err, name="err"),
|
|
path('survexfile/<path:cave_shortname>', survex.survexcavesingle, name="survexcavessingle"),
|
|
|
|
path('survexfilewild', statistics.svxfilewild, name="svxfilewild"),
|
|
path('survexfilewild/', statistics.svxfilewild, name="svxfilewild"),
|
|
path('survexfilewild/<int:year>', statistics.svxfilewild, name="svxfilewild"),
|
|
|
|
|
|
# The survey scans in the wallets. This short-cuts SCANS_URL which is not used anymore and is defunct
|
|
path('survey_scans/', allscans, name="allscans"), # all the scans in all wallets
|
|
path('survey_scans/<path:path>/', walletedit, name="singlewallet"), # replaced singlewallet()
|
|
path('survey_scans/<path:path>/<file>', scansingle, name="scansingle"), # works, but html href goes direct to /expofiles/ too
|
|
path('cave/scans/<slug:caveid>', cavewallets, name="cavewallets"), # like allscans, but for just one cave
|
|
|
|
# The data about the wallets themselves, not the scans inside tehm
|
|
path('wallets/year/<int:year>', walletslistyear, name="walletslistyear"), # wallets that are for a specific year, as an integer '1985'
|
|
# re_path('wallets/person/(?P<first_name>[A-Z]*[a-z\-\'&;]*)[^a-zA-Z]*(?P<last_name>[a-z\-\']*[^a-zA-Z]*[\-]*[A-Z]*[a-zA-Z\-&;]*)/?', walletslistperson, name="walletslistperson"),
|
|
path('wallets/person/<slug:slug>', walletslistperson, name="walletslistperson"),
|
|
|
|
|
|
|
|
# The tunnel and therion drawings files pageswalletslistcave
|
|
path('drawings', dwgallfiles, name="dwgallfiles"),
|
|
path('drawings/', dwgallfiles, name="dwgallfiles"),
|
|
path('dwgfiles', dwgallfiles, name="dwgallfiles"),
|
|
path('dwgfiles/', dwgallfiles, name="dwgallfiles"),
|
|
path('dwgdataraw/<path:path>', dwgfilesingle, name="dwgfilesingle"),
|
|
|
|
# QMs pages - must precede other /caves pages?
|
|
re_path(r'^cave/qms/([^/]+)/?$', caveQMs, name="caveQMs"),
|
|
re_path(r'^cave/openqms/([^/]+)/?$', caveQMs, {'open': True}, name="cave_openQMs"),
|
|
re_path(r'^cave/qms/(?P<cave_id>[^/]+)/(?P<year>\d\d\d\d)-(?P<qm_id>\d*)(?P<grade>[ABCDXV\?]?)-?(?P<blockname>[a-zA-Z]+.*)?$', qm, name="qm"), # Dogs breakfast
|
|
# the resolution of a QM uses several fields together, there is no clean slug field. Artefact of history.
|
|
|
|
# Prospecting Guide document
|
|
re_path(r'^prospecting_guide/$', prospecting), # disabled. Bad links, incompatible image package use and very, very out of date.
|
|
|
|
# This next set are all intercepted by Apache, if it is running, with no problem.
|
|
re_path(r'^photos/(?P<subpath>.*)$', mediapage, {'doc_root': settings.PHOTOS_ROOT}, name="mediapage"), # photo galleries
|
|
re_path(r'^map/slippy/map.html', map, name="map"), # Redirects to OpenStreetMap JavaScript. NOT WORKING
|
|
re_path(r'^map/(?P<path>.*)$', mapfile, name="mapfile"), # css, js, gpx. working. This does not add any troggle menus or headers
|
|
|
|
# This next set are all intercepted by Apache, if it is running, AND troggle must manage these,
|
|
# even though the code is not in the troggle repo
|
|
# Alias /static/ /home/expo/static/
|
|
re_path(r'^static/(?P<subpath>.*)$', mediapage, {'doc_root': settings.MEDIA_ROOT}, name="mediapage"), # STATIC only used by admin pages
|
|
# Alias /javascript /usr/share/javascript
|
|
path('javascript/<path:subpath>', mediapage, {'doc_root': settings.JSLIB_ROOT}, name="mediapage"), # JSLIB_URL
|
|
|
|
|
|
# NOT intercepted by apache
|
|
re_path(r'^site_media/(?P<subpath>.*)$', mediapage, {'doc_root': settings.MEDIA_ROOT}, name="mediapage"), # MEDIA_ROOT: CSS and JS
|
|
|
|
# Fossil ? /loser/caves-1623/171/171.svx fails 404, /loser/docs/smklengths fails 404
|
|
re_path(r'^/loser/(?P<subpath>.*)$', mediapage, {'doc_root': settings.SURVEX_DATA}, name="mediapage"), # Oddly not working !?
|
|
|
|
|
|
# Helpers to edit HTML
|
|
re_path(r'^image_selector/(?P<path>.*)', image_selector, name = 'image_selector'),
|
|
re_path(r'^new_image_form/(?P<path>.*)', new_image_form, name = 'new_image_form'),
|
|
|
|
re_path(r'^expo.kml', expo_kml, name = 'expo.kml'),
|
|
re_path(r'^expo.kmz', expo_kmz, name = 'expo.kmz'),
|
|
|
|
# Final catchall which also serves expoweb handbook pages and imagestiny
|
|
re_path(r'^(.*)$', expopage, name="expopage"), # CATCHALL assumed relative to EXPOWEB
|
|
]
|
|
|
|
# do NOT allow DIR_ROOT prefix to all urls
|
|
|
|
#urlpatterns = static(settings.JSLIB_URL, document_root=settings.JSLIB_ROOT) #For development purposes, in production this should be served statically perhaps from /usr/share/javascript
|
|
#urlpatterns += static(settings.EXPOWEBCACHE_URL, document_root=settings.EXPOWEBCACHE_ROOT) #For development purposes, in production this should be served statically
|
|
urlpatterns = [re_path('', include(trogglepatterns))]
|
|
|
|
# When apache is running these prempt Django so Django never sees them.
|
|
# NB apache has its own ideas about mimetypes, so behaviour may not be identical for .xml files by troggle
|
|
# These directives are in /home/expo/config/apache/expo.conf on the server
|
|
# checked as correct 3 May 2023.
|
|
|
|
#These are the critical ones: /static/ and /javascript/
|
|
#Note that apache does NOT intercept /site-media/
|
|
# Alias /static/ /home/expo/static/
|
|
# Alias /javascript /usr/share/javascript
|
|
#
|
|
# Alias /expofiles /home/expo/expofiles
|
|
# Alias /photos /home/expo/webphotos
|
|
# Alias /map /home/expo/expoweb/map
|
|
# Alias /expowebcache /home/expo/expowebcache/ # no longer used
|
|
# Alias /robots.txt /home/expo/static/robots.txt
|
|
# Alias /favicon.ico /home/expo/static/favicon.ico
|
|
|
|
#This is archaic ?
|
|
# Redirect permanent "/expoimages/" "/expofiles/"
|
|
|
|
# #kanboard, the trello-clone, but need individual user id to be effective
|
|
# Alias /kanboard /home/expo/kanboard
|
|
|
|
# #Search function (xapian-omega)
|
|
# ScriptAlias /search /usr/lib/cgi-bin/omega/omega
|
|
|
|
# ScriptAlias /hgrepositories /home/expo/config/apache/services/hgweb/hgweb.cgi
|
|
|
|
# #bank of expo
|
|
# #current expedition
|
|
# ScriptAlias "/boe" "/home/expo/boe/boc/boc.pl"
|
|
# #archived expedition boe instances
|
|
# ScriptAliasMatch "^/boe-(.*)" "/home/expo/boe/boc-$1/boc.pl"
|
|
|
|
|
|
|