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
2020-06-22 00:03:23 +01:00
2022-03-18 20:00:15 +00:00
from troggle . core . views import statistics , survex
2021-04-06 00:49:09 +01:00
from troggle . core . views . auth import expologin , expologout
2023-01-19 18:30:05 +00:00
from troggle . core . views . caves import ( cave3d , caveEntrance , caveindex ,
cavepage , caveQMs , edit_cave ,
2023-01-19 21:34:09 +00:00
edit_entrance , get_entrances , qm )
2023-01-19 18:30:05 +00:00
from troggle . core . views . drawings import dwgallfiles , dwgfilesingle
2022-06-25 23:17:19 +01:00
from troggle . core . views . editor_helpers import image_selector , new_image_form
2023-01-19 18:30:05 +00:00
from troggle . core . views . expo import ( editexpopage , expofiles_redirect ,
expofilessingle , expopage , map , mapfile ,
2023-02-02 11:13:02 +00:00
mediapage , spider )
2023-01-19 18:30:05 +00:00
from troggle . core . views . logbooks import ( Expeditions_jsonListView ,
Expeditions_tsvListView , expedition ,
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
2023-01-19 18:30:05 +00:00
from troggle . core . views . scans import ( allscans , cavewallets , scansingle ,
walletslistperson , walletslistyear )
2023-01-31 17:13:41 +00:00
from troggle . core . views . uploads import dwgupload , photoupload
2023-02-01 21:58:48 +00:00
from troggle . core . views . wallets_edit import walletedit
2021-03-28 03:48:04 +01:00
""" This sets the actualurlpatterns[] and urlpatterns[] lists which django uses
2021-03-21 01:37:52 +00:00
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 .
2021-04-19 01:32:18 +01:00
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 .
2020-07-28 01:22:06 +01:00
The API urls return TSV or JSON and are new in July 2020.
2020-07-18 16:23:54 +01:00
"""
2021-03-21 01:37:52 +00: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.
2020-06-22 00:03:23 +01:00
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
2021-04-28 00:48:20 +01:00
path ( ' ' , expofiles_redirect , { ' filepath ' : " " } , name = " expofiles_redirect " ) ,
]
2021-03-26 13:51:00 +00:00
else :
expofilesurls = [
2021-04-28 00:48:20 +01:00
path ( ' ' , expofilessingle , { ' filepath ' : " " } , name = " single " ) ,
2022-03-22 02:22:15 +00:00
path ( ' <path:filepath> ' , expofilessingle , name = " single " ) , # local copy of EXPOFILES
2021-04-28 00:48:20 +01:00
]
2022-03-02 21:15:24 +00:00
2022-07-31 16:08:28 +01:00
# see https://docs.djangoproject.com/en/dev/topics/auth/default/tiny
2021-04-06 00:49:09 +01:00
# The URLs provided by include('django.contrib.auth.urls') are:
2022-03-04 14:54:49 +00:00
#
2021-04-06 00:49:09 +01:00
# 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
2022-03-05 17:05:15 +00: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 = [
2021-12-30 00:56:09 +00:00
path ( ' expofiles/ ' , include ( expofilesurls ) ) , # intercepted by Apache, if it is running.
2021-04-28 00:48:20 +01:00
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
2021-04-30 21:32:53 +01:00
re_path ( r ' ^people/?$ ' , notablepersons , name = " notablepersons " ) ,
2011-07-11 01:49:03 +01:00
2021-04-19 01:32:18 +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-03-27 18:22:07 +00:00
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
path ( ' dwgupload/<path:folder> ' , dwgupload , name = ' dwgupload ' ) ,
path ( ' dwgupload/ ' , dwgupload , name = ' dwgupload ' ) ,
2021-10-31 17:25:45 +00:00
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.
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
2021-04-06 00:49:09 +01:00
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 " ) ,
2021-04-19 01:32:18 +01:00
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
2021-04-19 01:32:18 +01:00
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
2021-04-19 01:32:18 +01:00
re_path ( r ' ^logbookentry/(?P<date>.*)/(?P<slug>.*)/?$ ' , logbookentry , name = " logbookentry " ) ,
2021-04-28 02:43:09 +01:00
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
2021-04-19 01:32:18 +01:00
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
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
2022-07-31 20:29:17 +01:00
# Edit caves and entrances
2022-07-31 16:08:28 +01:00
re_path ( r ' ^(?P<path>.*)/(?P<slug>[^/]+)_cave_edit/$ ' , edit_cave , name = " edit_cave " ) , # edit_cave needed by cave.html template for url matching
2022-07-31 20:29:17 +01:00
re_path ( r ' ^(?P<path>.*)/(?P<caveslug>[^/]+):(?P<slug>[^:]+)_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 " ) ,
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-07-21 08:32:11 +01: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
2022-07-31 20:29:17 +01:00
2021-04-17 23:59:11 +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 " ) ,
2022-10-08 22:17:53 +01:00
path ( ' eastings ' , statistics . eastings , name = " eastings " ) ,
path ( ' aliases/<int:year> ' , statistics . aliases , name = " aliases " ) ,
2020-06-04 21:57:04 +01:00
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
2021-04-28 00:48:20 +01:00
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
2021-04-27 19:02:11 +01:00
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 " ) ,
2021-04-27 19:02:11 +01:00
path ( ' survexfile/<path:survex_file>.err ' , survex . err , name = " err " ) ,
2021-04-28 00:48:20 +01:00
path ( ' survexfile/<path:survex_cave> ' , survex . survexcavesingle , name = " survexcavessingle " ) ,
2021-04-19 01:32:18 +01:00
2022-07-27 21:22:46 +01:00
# 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()
2022-07-27 21:22:46 +01:00
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'
2022-07-31 16:58:46 +01:00
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 " ) ,
2022-07-27 21:22:46 +01:00
2020-06-04 21:57:04 +01:00
2022-07-27 21:22:46 +01:00
# The tunnel and therion drawings files pageswalletslistcave
2021-05-04 14:16:48 +01:00
path ( ' dwgfiles ' , dwgallfiles , name = " dwgallfiles " ) ,
2022-07-31 16:08:28 +01: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
2021-04-28 00:48:20 +01:00
# QMs pages - must precede other /caves pages?
2022-07-31 16:08:28 +01:00
re_path ( r ' ^cave/qms/([^/]+)/?$ ' , caveQMs , name = " caveQMs " ) ,
2022-07-20 18:47:29 +01:00
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
2022-07-06 13:38:53 +01:00
# 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
2022-03-05 17:05:15 +00:00
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.
2021-04-19 01:32:18 +01:00
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
2021-04-30 00:24:36 +01:00
path ( ' javascript/<path:subpath> ' , mediapage , { ' doc_root ' : settings . JSLIB_ROOT } , name = " mediapage " ) , # JSLIB_URL
2021-04-28 00:48:20 +01:00
re_path ( r ' ^/loser/(?P<subpath>.*)$ ' , mediapage , { ' doc_root ' : settings . SURVEX_DATA } , name = " mediapage " ) , # Oddly not working !?
2021-04-19 01:32:18 +01:00
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
2022-06-25 23:17:19 +01:00
# 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 ' ) ,
2020-06-20 23:08:34 +01:00
2022-07-31 16:08:28 +01:00
# Final catchall which also serves expoweb handbook pages and imagestiny
2021-04-19 01:32:18 +01:00
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
2021-04-27 19:02:11 +01:00
# do NOT allow DIR_ROOT prefix to all urls
2020-06-17 22:55:51 +01:00
urlpatterns = [
2021-04-19 01:32:18 +01:00
re_path ( ' ' , include ( trogglepatterns ) )
2020-06-17 22:55:51 +01:00
]
2021-03-25 16:15:26 +00:00
2021-03-21 01:37:52 +00: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-03-21 01:37:52 +00:00
2021-04-02 19:22:53 +01:00
# NEW apache configurations suggested as of 2 April 2021:
2021-03-21 01:37:52 +00:00
# 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!
2021-03-21 01:37:52 +00:00
# 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
2022-03-05 17:05:15 +00:00
# Alias /search ? # the Xapian text search thinggy
# Alias /kanboard ? # the Kanban Trello-clone thinggy
2021-03-21 01:37:52 +00:00
# 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
2021-03-21 01:37:52 +00:00
2022-02-20 00:21:56 +00:00
# ScriptAlias /repositories /home/expo/config/apache/services/hgweb/hgweb.cgi # UPDATE this for git
2021-03-21 01:37:52 +00:00
# ScriptAlias /boe /home/expo/boe/boc/boc.pl
# ScriptAlias /boe-lastyear /home/expo/boe/boc-previous/boc.pl