from django.conf import settings from django.contrib import admin from django.urls import include, path, re_path from django.conf.urls.static import static from troggle.core.views import statistics, survex from troggle.core.views.auth import expologin, expologout from troggle.core.views.caves import (cave3d, caveEntrance, caveindex, cavepage, caveQMs, edit_cave, cave_debug, edit_entrance, 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, map, mapfile, mediapage, spider) from troggle.core.views.logbooks import (QMs_jsonListView, Expeditions_jsonListView, Expeditions_tsvListView, expedition, get_logbook_entries, get_people, logbookentry, 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, 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( , , ) 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. if settings.EXPOFILESREMOTE: expofilesurls = [ path('', 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('', 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/// [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('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"), 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/', walletedit, name='walletedit'), # path=2020#01 path('photoupload/', photoupload, name='photoupload'), # restricted to current year path('photoupload/', photoupload, name='photoupload'), # restricted to current year path('dwgupload/', dwgupload, name='dwgupload'), path('dwgupload/', dwgupload, name='dwgupload'), path('dwguploadnogit/', dwgupload, {'gitdisable': 'yes'}, name='dwguploadnogit'), # used in testing path('dwguploadnogit/', dwgupload, {'gitdisable': 'yes'}, name='dwguploadnogit'), # used in testing # 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! re_path(r'^person/(?P[A-Z]*[a-z\-\'&;]*)[^a-zA-Z]*(?P[a-z\-\']*[^a-zA-Z]*[\-]*[A-Z]*[a-zA-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 & 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.*)/(?P.*)/?$', logbookentry,name="logbookentry"), re_path(r'^logbook(?P\d\d\d\d)\.(?P.*)/?$', exportlogbook, name='exportlogbook'), # e.g. /logbook2019.html # working but old CSS in re_path(r'^logbook$', exportlogbook, name='exportlogbook'), # Internal. editfile.html template uses these internally 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'^getEntrances/(?P.*)', get_entrances, name = "get_entrances"), # used internally ? # Cave description pages path('cave_debug', cave_debug, name="cave_debug"), re_path(r'^newcave/$', edit_cave, name="newcave"), re_path(r'^cave/3d/(?P[^/]+)$', cave3d, name="cave3d"), #re_path(r'^cave/description/([^/]+)/?$', caves.caveDescription), #!!!BAD, local links fail.. #re_path(r'^cave/(?P[^/]+)/?$', caves.cave, name="cave"), # used only in testing !? XXXXXXXXXXXXXXXXXXXXXXXXXX #re_path(r'^cave/(?P[^/]+)/?(?P[^/])$', ent), #!!!BAD, local links fail..# view_caves.ent # Edit caves and entrances re_path(r'^(?P.*)/(?P[^/]+)_cave_edit/$', edit_cave, name="edit_cave"), # edit_cave needed by cave.html template for url matching re_path(r'^(?P.*)/(?P[^/]+):(?P[^:]+)_entrance_edit', edit_entrance, name = "editentrance"), #edit existing entrance re_path(r'^(?P.*)/(?P[^/]+)_entrance_new$', edit_entrance, name = "newentrance"), # new entrance for a cave re_path(r'^(.*)_edit$', editexpopage, name="editexpopage"), re_path(r'^(?P\d\d\d\d)(?P.*)$', cavepage, name="cavepage"), # shorthand /1623/264 or 1623/161/top.htm # 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 are still public on other servers path('smkridge/', cavepage, {'karea': "1623/"}, name="cavepage"), path('expo/smkridge/', cavepage, {'karea': "1623/"}, name="cavepage"), # Archaic, kept. This /expo/ prefix only works for expoweb HTML pages not troggle pages path('expo/', expopage, name="expopage"), # Entrances re_path(r'^cave/entrance/([^/]+)/?$', caveEntrance), # lists all entrances !!!BAD, local links fail # 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('eastings', statistics.eastings, name="eastings"), path('aliases/',statistics.aliases, name="aliases"), path('troggle', frontpage, name="frontpage"), # control panel. Shows recent actions. path('todo/', todos, name="todos"), path('controlpanel', controlpanel, name="controlpanel"), # 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/.svx', survex.svx, name="svx"), path('survexfile/.3d', survex.threed, name="threed"), path('survexfile/.log', survex.svxlog, name="svxlog"), path('survexfile/.err', survex.err, name="err"), path('survexfile/', survex.survexcavesingle, name="survexcavessingle"), # 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//', walletedit, name="singlewallet"), # replaced singlewallet() path('survey_scans//', scansingle, name="scansingle"), # works, but html href goes direct to /expofiles/ too path('cave/scans/', cavewallets, name="cavewallets"), # like allscans, but for just one cave # The data about the wallets themselves, not the scans inside tehm path('wallets/year/', walletslistyear, name="walletslistyear"), # wallets that are for a specific year, as an integer '1985' re_path('wallets/person/(?P[A-Z]*[a-z\-\'&;]*)[^a-zA-Z]*(?P[a-z\-\']*[^a-zA-Z]*[\-]*[A-Z]*[a-zA-Z\-&;]*)/?', walletslistperson, name="walletslistperson"), # The tunnel and therion drawings files pageswalletslistcave path('dwgfiles', dwgallfiles, name="dwgallfiles"), path('dwgfiles/', dwgallfiles, name="dwgallfiles"), path('dwgdataraw/', 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[^/]+)/(?P\d\d\d\d)-(?P\d*)(?P[ABCDXV\?]?)-?(?P[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. 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 only used by admin pages path('javascript/', mediapage, {'doc_root': settings.JSLIB_ROOT}, name="mediapage"), # JSLIB_URL re_path(r'^/loser/(?P.*)$', 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.*)$', mapfile, name="mapfile"), # css, js, gpx # Helpers to edit HTML re_path(r'^image_selector/(?P.*)', image_selector, name = 'image_selector'), re_path(r'^new_image_form/(?P.*)', new_image_form, name = 'new_image_form'), # 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 # NEW apache configurations suggested as of 2 April 2021: # Alias /site-media/ /home/expo/troggle/media/ # 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 # 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 # 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 # 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