from django.conf import settings from django.conf.urls import url, include, re_path from django.views.generic.base import RedirectView from django.views.generic.edit import UpdateView from django.views.generic.list import ListView from django.contrib import admin from django.contrib import auth from django.urls import path, reverse, resolve from troggle.core.views import caves, statistics, survex from troggle.core.views.scans import scansingle, singlewallet, allwallets from troggle.core.views.drawings import dwgallfiles, dwgfilesingle from troggle.core.views.uploads import dwgupload, scanupload 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 from troggle.core.views.logbooks import get_logbook_entries, logbookentry, logbookSearch from troggle.core.views.logbooks import notablepersons, person, get_people 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 from troggle.core.views.statistics import pathsreport, stats, dataissues from troggle.core.views.expo import expofiles_redirect, expofilessingle, expopage, editexpopage, mediapage, map, mapfile from troggle.core.views.survex import survexcaveslist, survexcavesingle, svx from troggle.core.views.auth import expologin, expologout """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 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. ''' # 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, name="single"), # local copy of EXPOFILES path('', expofilessingle, {'filepath': ""}, name="single"), ] # 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/// [name='password_reset_confirm'] # accounts/reset/done/ [name='password_reset_complete'] # these worked in Django 2.2.24 but failed in .25 even though we include django.contrib.auth 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'^caves$', caves.caveindex, name="caveindex"), re_path(r'^indxal.htm$', caves.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 # Uploads - uploading a file path('scanupload/', scanupload, name='scanupload'), # wallet=2020#01, not a path 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 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()), # Logbook entries re_path(r'^logbookentry/(?P.*)/(?P.*)/?$', logbookentry,name="logbookentry"), re_path(r'^logbooksearch/(.*)/?$', logbookSearch), # name 'search' not defined in views/logbooks.py 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'^getQMs/(?P.*)', caves.get_qms, name = "get_qms"), re_path(r'^getEntrances/(?P.*)', caves.get_entrances, name = "get_entrances"), # Cave description pages re_path(r'^newcave/$', caves.edit_cave, name="newcave"), re_path(r'^cave/3d/(?P[^/]+)$', caves.cave3d, name="cave3d"), re_path(r'^cave/description/([^/]+)/?$', caves.caveDescription), re_path(r'^cave/(?P[^/]+)/?$', caves.cave, name="cave"), #!!!BAD, local links fail.. to be checked.. re_path(r'^cave/(?P[^/]+)/?(?P[^/])$', ent), # view_caves.ent re_path(r'^cave/(?P[^/]+)/edit/$', caves.edit_cave, name="edit_cave"), re_path(r'^(?P\d\d\d\d)(?P.*)$', cavepage, name="cavepage"), # shorthand /1623/264 BUT url links break! Stop this.. # 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/via204.html_edit gets caught here and breaks with 404 # Entrances re_path(r'^cave/entrance/([^/]+)/?$', caves.caveEntrance), # lists all entrances !!!BAD, local links fail re_path(r'^entrance/(?P[^/]+)/(?P[^/]+)/edit/', caves.edit_entrance, name = "editentrance"), #edit existing entrance re_path(r'^entrance/new/(?P[^/]+)$', caves.edit_entrance, name = "newentrance"), # new entrance for a cave # 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('eastings', statistics.eastings, name="eastings"), 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.svxraw, name="svxraw"), path('survexfile/.err', survex.err, name="err"), path('survexfile/', survex.survexcavesingle, name="survexcavessingle"), # The survey scans in the wallets path('survey_scans/', allwallets, name="allwallets"), path('survey_scans//', singlewallet, name="singlewallet"), path('survey_scans//', scansingle, name="scansingle"), # The tunnel and therion drawings files pages 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/([^/]+)/?$', caves.caveQMs), # Broken- QMs have no proper link to cave id re_path(r'^cave/(?P[^/]+)/(?P\d\d\d\d)-(?P\d*)(?P[ABCDX]?)?$', caves.qm, name="qm"), # Prospecting Guide document re_path(r'^prospecting_guide/$', prospecting), # 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'^expowebcache/3d/(?P.*)$', mediapage, {'doc_root': settings.THREEDCACHEDIR}, name="mediapage"), 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 # Final catchall which also serves expoweb handbook pages and images re_path(r'^(.*)_edit$', editexpopage, name="editexpopage"), re_path(r'^(.*)$', expopage, name="expopage"), # CATCHALL assumed relative to EXPOWEB ] # do NOT allow DIR_ROOT prefix to all urls urlpatterns = [ # re_path('^%s' % settings.DIR_ROOT, include(trogglepatterns)) 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 ? # teh text search 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