troggle-unchained/urls.py

233 lines
14 KiB
Python
Raw Normal View History

2011-07-11 01:49:03 +01:00
from django.conf import settings
from django.urls import include, re_path
from django.views.generic.base import RedirectView
2020-05-28 01:38:35 +01:00
from django.views.generic.edit import UpdateView
from django.views.generic.list import ListView
from django.contrib import admin
from django.contrib import auth
2022-03-02 21:15:24 +00:00
from django.urls import path, reverse, resolve
2022-03-18 20:00:15 +00:00
from troggle.core.views import statistics, survex
2022-03-18 11:28:35 +00:00
from troggle.core.views.scans import scansingle, allwallets
2021-05-04 14:16:48 +01:00
from troggle.core.views.drawings import dwgallfiles, dwgfilesingle
2022-03-13 01:01:00 +00:00
from troggle.core.views.uploads import dwgupload, scanupload, photoupload
from troggle.core.views.other import troggle404, frontpage, todos, controlpanel, frontpage
from troggle.core.views.other import exportlogbook
from troggle.core.views.caves import ent, cavepage, caveindex, get_entrances, get_qms, edit_cave, cave3d, caveEntrance, edit_entrance, caveQMs, qm
2021-04-16 21:28:44 +01:00
from troggle.core.views.logbooks import get_logbook_entries, logbookentry, logbookSearch
from troggle.core.views.logbooks import notablepersons, person, get_people
2021-04-16 21:28:44 +01:00
from troggle.core.views.logbooks import expedition, personexpedition, Expeditions_tsvListView, Expeditions_jsonListView
from troggle.core.views.prospect import prospecting_image
from troggle.core.views.prospect import prospecting
2021-04-11 20:00:09 +01:00
from troggle.core.views.statistics import pathsreport, stats, dataissues
2021-04-16 21:28:44 +01:00
from troggle.core.views.expo import expofiles_redirect, expofilessingle, expopage, editexpopage, mediapage, map, mapfile
2021-03-31 21:51:17 +01:00
from troggle.core.views.survex import survexcaveslist, survexcavesingle, svx
from troggle.core.views.auth import expologin, expologout
from troggle.core.views.editor_helpers import image_selector, new_image_form
"""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
"""
todo = '''Replace most re_path() with modern and simpler 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.
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/
# 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.
2021-03-31 16:14:36 +01:00
trogglepatterns = [
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.
2021-03-26 13:51:00 +00:00
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"),
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/).
re_path(r'^admin/', admin.site.urls), # includes admin login & logout urls
2021-05-04 14:16:48 +01:00
# Uploads - uploading a file
2022-03-18 11:28:35 +00:00
path('scanupload/', scanupload, name='scanupload'), # path=2020#01
path('scanupload/<path:path>', scanupload, name='scanupload'), # 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
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
2021-04-22 02:45:28 +01:00
2022-03-18 11:28:35 +00:00
# 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/4.0/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
2021-04-16 21:28:44 +01:00
# Persons - nasty surname recognition logic fails for 19 people!
2021-04-20 23:57:51 +01:00
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"),
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()),
2021-04-11 03:02:06 +01:00
# Logbook entries
re_path(r'^logbookentry/(?P<date>.*)/(?P<slug>.*)/?$', logbookentry,name="logbookentry"),
re_path(r'^logbooksearch/(.*)/?$', logbookSearch), # name 'search' not defined in views/logbooks.py
re_path(r'^logbook(?P<year>\d\d\d\d)\.(?P<extension>.*)/?$', exportlogbook, name='exportlogbook'), # e.g. /logbook2019.html # working but old CSS in
re_path(r'^logbook$', exportlogbook, name='exportlogbook'),
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-03-18 20:00:15 +00:00
re_path(r'^getQMs/(?P<caveslug>.*)', get_qms, name = "get_qms"),
re_path(r'^getEntrances/(?P<caveslug>.*)', get_entrances, name = "get_entrances"),
2021-04-16 21:28:44 +01:00
2021-04-11 03:02:06 +01:00
# Cave description pages
2022-03-18 20:00:15 +00:00
re_path(r'^newcave/$', edit_cave, name="newcave"),
re_path(r'^cave/3d/(?P<cave_id>[^/]+)$', 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
re_path(r'^(?P<slug>[^/]+)_cave_edit/$', edit_cave, name="edit_cave"), # edit_cave needed by cave.html template for url matching
2022-06-19 00:49:07 +01:00
re_path(r'^(.*)_edit$', editexpopage, name="editexpopage"),
2022-03-18 20:00:15 +00:00
re_path(r'^(?P<karea>\d\d\d\d)(?P<subpath>.*)$', cavepage, name="cavepage"), # shorthand /1623/264 or 1623/161/top.htm
2022-03-18 11:28:35 +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
2021-03-31 21:51:17 +01:00
2021-04-16 21:28:44 +01:00
# Entrances
2022-03-18 20:00:15 +00:00
re_path(r'^cave/entrance/([^/]+)/?$', caveEntrance), # lists all entrances !!!BAD, local links fail
re_path(r'^entrance/(?P<caveslug>[^/]+)/(?P<slug>[^/]+)/edit/', edit_entrance, name = "editentrance"), #edit existing entrance
re_path(r'^entrance/new/(?P<caveslug>[^/]+)$', edit_entrance, name = "newentrance"), # new entrance for a cave
2021-04-17 23:59:11 +01:00
2021-04-21 19:08:42 +01:00
# 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"),
2021-05-09 00:55:37 +01:00
path('eastings', statistics.eastings, name="eastings"),
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
path('survexfile', survex.survexcavesingle, {'survex_cave': ''}, name="survexcavessingle"),
path('survexfile/', survex.survexcavesingle, {'survex_cave': ''}, 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:survex_cave>', survex.survexcavesingle, name="survexcavessingle"),
2022-04-18 20:48:49 +01:00
# The survey scans in the wallets. This short-cuts SCANS_URL which is not actually used anywhere!
path('survey_scans/', allwallets, name="allwallets"),
2022-03-18 11:28:35 +00:00
path('survey_scans/<path:path>/', scanupload, name="singlewallet"), # replaced singlewallet()
2021-04-30 03:44:53 +01:00
path('survey_scans/<path:path>/<file>', scansingle, name="scansingle"),
2021-04-11 03:02:06 +01:00
# The tunnel and therion drawings files pages
2021-05-04 14:16:48 +01:00
path('dwgfiles', dwgallfiles, name="dwgallfiles"),
2022-02-20 00:21:56 +00:00
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?
2022-07-05 15:02:43 +01:00
re_path(r'^cave/qms/([^/]+)/?$', caveQMs, name="caveQMs"), # Fixed. July 2022
re_path(r'^cave/qms/(?P<cave_id>[^/]+)/(?P<year>\d\d\d\d)-(?P<qm_id>\d*)(?P<grade>[ABCDXV\?]?)?$', qm, name="qm"), # Fixed. July 2022
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
2021-04-11 03:02:06 +01:00
# This next set are all intercepted by Apache, if it is running.
re_path(r'^photos/(?P<subpath>.*)$', mediapage, {'doc_root': settings.PHOTOS_ROOT}, name="mediapage"), # photo galleries
re_path(r'^site_media/(?P<subpath>.*)$', mediapage, {'doc_root': settings.MEDIA_ROOT}, name="mediapage"), # MEDIA_ROOT: CSS and JS
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
path('javascript/<path:subpath>', mediapage, {'doc_root': settings.JSLIB_ROOT}, name="mediapage"), # JSLIB_URL
re_path(r'^/loser/(?P<subpath>.*)$', mediapage, {'doc_root': settings.SURVEX_DATA}, name="mediapage"), # Oddly not working !?
re_path(r'^map/map.html', map, name="map"), # Redirects to OpenStreetMap JavaScript
re_path(r'^map/(?P<path>.*)$', mapfile, name="mapfile"), # css, js, gpx
# 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'),
2021-04-11 03:02:06 +01:00
# Final catchall which also serves expoweb handbook pages and images
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
2020-06-17 22:55:51 +01:00
urlpatterns = [
# re_path('^%s' % settings.DIR_ROOT, include(trogglepatterns))
re_path('', include(trogglepatterns))
2020-06-17 22:55:51 +01:00
]
# 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
2021-04-02 19:22:53 +01:00
# NEW apache configurations suggested as of 2 April 2021:
# Alias /site-media/ /home/expo/troggle/media/
2022-02-20 00:21:56 +00:00
# Alias /robots.txt /home/expo/troggle/media/robots.txt # does not exist!
# Alias /favicon.ico /home/expo/troggle/media/favicon.ico # comes from /expoweb/* when running runserver
2021-04-02 19:22:53 +01:00
# Alias /javascript /home/expo/troggle/media/jslib # empty
# Alias /search ? # the Xapian text search thinggy
# Alias /kanboard ? # the Kanban Trello-clone thinggy
# Copy of old standard apache configurations:
# Alias /expofiles /home/expo/expofiles
# Alias /photos /home/expo/webphotos
# Alias /map /home/expo/expoweb/map
2022-02-20 00:21:56 +00:00
# Alias /javascript /usr/share/javascript # to be changed, see above
# Alias /robots.txt /home/expo/static/robots.txt # to be changed, see above
# Alias /favicon.ico /home/expo/static/favicon.ico # to be deleted. favicon.ico now in expoweb/
# Alias /static/ /home/expo/static/ # only used by Django admin, tinymce
2022-02-20 00:21:56 +00:00
# ScriptAlias /repositories /home/expo/config/apache/services/hgweb/hgweb.cgi # UPDATE this for git
# ScriptAlias /boe /home/expo/boe/boc/boc.pl
# ScriptAlias /boe-lastyear /home/expo/boe/boc-previous/boc.pl