2
0
mirror of https://expo.survex.com/repositories/troggle/.git synced 2024-12-18 14:32:19 +00:00
troggle/urls.py

324 lines
19 KiB
Python
Raw Normal View History

2011-07-11 01:49:03 +01:00
from django.conf import settings
2023-01-19 21:34:09 +00:00
from django.contrib import admin
from django.urls import include, path, re_path
from django.conf.urls.static import static
2022-03-18 20:00:15 +00:00
from troggle.core.views import statistics, survex
from troggle.core.views.auth import expologin, expologout
from troggle.core.views.caves import (cave3d, caveindex, entranceindex, caveslist,
cavepage, caveslugfwd, caveQMs, edit_cave, cave_debug,
edit_entrance, get_entrances, qm, expo_kml, expo_kmz)
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 (pubspage, indexpage, editexpopage, expofiles_redirect,
expofilessingle, expopage, map, mapfile,
2023-02-02 11:13:02 +00:00
mediapage, spider)
2023-03-16 21:06:52 +00:00
from troggle.core.views.logbooks import (QMs_jsonListView, Expeditions_jsonListView,
2024-07-17 20:58:27 +01:00
Expeditions_tsvListView, expedition, logreport, logentrydelete,
get_logbook_entries, get_people,
logbookentry, notablepersons, person,
personexpedition)
from troggle.core.views.other import (controlpanel, exportlogbook, frontpage,
2023-01-19 21:34:09 +00:00
todos)
from troggle.core.views.prospect import prospecting
from troggle.core.views.scans import (allscans, cavewallets, scansingle,
walletslistperson, walletslistyear)
2024-07-13 13:49:55 +01:00
from troggle.core.views.uploads import dwgupload, photoupload, gpxupload, expofilerename, logbookedit
2023-02-01 21:58:48 +00:00
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.
2020-05-28 01:38:35 +01:00
2020-07-18 16:23:54 +01:00
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>,
2020-07-18 16:23:54 +01:00
<reference to python function in 'core' folder>, <optional name>)
2011-07-11 01:49:03 +01:00
2020-07-18 16:23:54 +01:00
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.
2020-07-18 16:23:54 +01:00
"""
2023-02-02 21:50:40 +00:00
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.
2021-04-21 19:08:42 +01:00
'''
2020-07-18 16:23:54 +01:00
# 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.
2024-07-08 17:48:49 +01:00
# WHen running on the server, apache intercepts all teh /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
2021-03-26 13:51:00 +00:00
if settings.EXPOFILESREMOTE:
expofilesurls = [
2022-03-22 02:22:15 +00:00
path('<path:filepath>', expofiles_redirect, name="expofiles_redirect"), # to http://expo.survex.com/expofiles
path('', expofiles_redirect, {'filepath': ""}, name="expofiles_redirect"),
]
2021-03-26 13:51:00 +00:00
else:
expofilesurls = [
path('', expofilessingle, {'filepath': ""}, name="single"),
2022-03-22 02:22:15 +00:00
path('<path:filepath>', expofilessingle, name="single"), # local copy of EXPOFILES
]
2022-03-02 21:15:24 +00:00
# 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']
2021-03-31 23:41:46 +01:00
# 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.
2023-03-05 18:20:18 +00:00
# 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
2021-03-31 16:14:36 +01:00
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
2021-12-30 00:56:09 +00:00
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.
2023-02-02 11:13:02 +00:00
re_path(r'^(.*)_edit_edit$', spider, name="spider"), # web spider funny
2022-03-18 20:00:15 +00:00
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"),
2011-07-11 01:49:03 +01:00
re_path(r'^admin/doc/', include('django.contrib.admindocs.urls')), # needs docutils Python module (http://docutils.sf.net/).
2023-03-05 18:20:18 +00:00
re_path(r'^admin/', admin.site.urls), # includes admin login & logout urls & /admin/jsi18n/
2021-05-04 14:16:48 +01:00
# Uploads - uploading a file
2023-02-01 21:31:07 +00:00
path('walletedit/', walletedit, name='walletedit'),
2023-01-31 17:13:41 +00:00
path('walletedit/<path:path>', walletedit, name='walletedit'), # path=2020#01
2022-03-13 01:01:00 +00:00
path('photoupload/', photoupload, name='photoupload'), # restricted to current year
path('photoupload/<path:folder>', photoupload, name='photoupload'), # restricted to current year
2024-07-13 13:49:55 +01:00
path('gpxupload/', gpxupload, name='gpxupload'), # restricted to current year
path('gpxupload/<path:folder>', gpxupload, name='gpxupload'), # restricted to current year
2022-03-13 01:01:00 +00:00
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
2023-09-03 21:28:36 +01:00
path('logbookedit/', logbookedit, name='logbookedit'),
2023-08-10 21:17:03 +01:00
path('logbookedit/<slug:slug>', logbookedit, name='logbookedit'),
2021-04-22 02:45:28 +01:00
2023-07-31 13:49:54 +01:00
# Renaming an uploaded file
path('expofilerename/<path:filepath>', expofilerename, name='expofilerename'),
2022-03-18 11:28:35 +00:00
# setting LOGIN_URL = '/accounts/login/' is default.
2023-02-10 00:05:04 +00:00
# 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
2022-03-02 21:15:24 +00:00
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..
2023-10-01 14:10:17 +01:00
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"),
2020-06-18 15:54:40 +01:00
2021-04-22 02:45:28 +01:00
# 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()),
2023-03-16 21:06:52 +00:00
re_path(r'^api/QMs_json$', QMs_jsonListView.as_view()),
2021-04-11 03:02:06 +01:00
# Logbook entries
2023-08-31 16:55:20 +01:00
re_path(r'^logbookentry/(?P<date>.*)/(?P<slug>.*)/?$', logbookentry,name="logbookentry"),
re_path(r'^logbook$', exportlogbook, name='exportlogbook'),
2024-07-14 15:01:44 +01:00
path('logreport/<slug:year>', logreport, name='logreport'),
2024-07-17 20:58:27 +01:00
path('logentrydelete/<slug:year>', logentrydelete, name='logentrydelete'),
2021-04-16 21:28:44 +01:00
# 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"),
2022-07-08 20:19:56 +01:00
re_path(r'^getEntrances/(?P<caveslug>.*)', get_entrances, name = "get_entrances"), # used internally ?
2021-04-16 21:28:44 +01:00
2021-04-11 03:02:06 +01:00
# Cave description pages
2023-09-30 20:09:18 +01:00
path('cave/<slug:slug>', caveslugfwd, name="caveslugfwd"),
2023-03-28 15:37:25 +01:00
path('cave_debug', cave_debug, name="cave_debug"),
2022-03-18 20:00:15 +00:00
re_path(r'^newcave/$', edit_cave, name="newcave"),
re_path(r'^cave/3d/(?P<cave_id>[^/]+).3d$', cave3d, name="cave3d"),
2022-03-18 20:00:15 +00:00
#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
2023-02-02 11:13:02 +00:00
2022-06-19 00:49:07 +01:00
re_path(r'^(.*)_edit$', editexpopage, name="editexpopage"),
2024-07-23 22:43:08 +01:00
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
2023-03-15 13:58:09 +00:00
# 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
2023-03-15 14:22:21 +00:00
# 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"),
2023-03-15 14:22:21 +00:00
# Archaic, kept. This /expo/ prefix only works for expoweb HTML pages not troggle pages
path('expo/<path:path>', expopage, name="expopage"),
2023-07-27 12:40:52 +01:00
2021-04-21 19:08:42 +01:00
# System admin and monitoring
2022-10-08 22:17:53 +01:00
path('statistics', statistics.stats, name="stats"),
path('stats', statistics.stats, name="stats"),
path('pathsreport', statistics.pathsreport, name="pathsreport"),
path('dataissues', statistics.dataissues, name="dataissues"),
2023-01-26 22:36:49 +00:00
path('therionissues', statistics.therionissues, name="therionissues"),
2023-01-29 12:11:47 +00:00
path('surveximport', statistics.surveximport, name="surveximport"),
2023-01-29 12:41:50 +00:00
path('survexdebug', statistics.survexdebug, name="survexdebug"),
2023-10-27 20:28:10 +01:00
path('stations', statistics.stations, name="stations"),
2022-10-08 22:17:53 +01:00
path('aliases/<int:year>',statistics.aliases, name="aliases"),
2021-04-30 03:44:53 +01:00
path('troggle', frontpage, name="frontpage"), # control panel. Shows recent actions.
path('todo/<path:module>', todos, name="todos"),
path('controlpanel', controlpanel, name="controlpanel"),
2011-07-11 01:49:03 +01:00
2021-04-11 03:02:06 +01:00
# The survexfile pages
2023-09-05 19:46:10 +01:00
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"),
2022-03-11 16:22:37 +00:00
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"),
2023-08-05 10:43:06 +01:00
path('survexfilewild', statistics.svxfilewild, name="svxfilewild"),
2023-08-05 11:26:55 +01:00
path('survexfilewild/', statistics.svxfilewild, name="svxfilewild"),
2023-08-05 10:43:06 +01:00
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
2023-01-31 17:13:41 +00:00
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
2023-09-07 19:40:39 +01:00
path('drawings', dwgallfiles, name="dwgallfiles"),
path('drawings/', dwgallfiles, name="dwgallfiles"),
2021-05-04 14:16:48 +01:00
path('dwgfiles', dwgallfiles, name="dwgallfiles"),
path('dwgfiles/', dwgallfiles, name="dwgallfiles"),
2021-05-04 14:16:48 +01:00
path('dwgdataraw/<path:path>', dwgfilesingle, name="dwgfilesingle"),
2021-04-17 23:59:11 +01:00
# QMs pages - must precede other /caves pages?
re_path(r'^cave/qms/([^/]+)/?$', caveQMs, name="caveQMs"),
2023-04-05 23:13:12 +01:00
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.
2021-04-17 23:59:11 +01:00
2021-04-16 21:28:44 +01:00
# Prospecting Guide document
re_path(r'^prospecting_guide/$', prospecting), # disabled. Bad links, incompatible image package use and very, very out of date.
2021-04-16 21:28:44 +01:00
# 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
2023-11-08 20:53:30 +00:00
re_path(r'^map/slippy/map.html', map, name="map"), # Redirects to OpenStreetMap JavaScript. NOT WORKING
2023-11-14 17:43:49 +00:00
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/
2022-02-20 00:21:56 +00:00
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'),
2023-05-01 00:01:41 +01:00
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
2020-06-17 22:55:51 +01:00
]
2011-07-11 01:49:03 +01:00
# 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.
2021-04-10 15:30:29 +01:00
# 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
2023-11-08 13:28:19 +00:00
# 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"