from django.conf import settings from django.urls import path 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 reverse, resolve from troggle.core.views import caves, statistics, survex from troggle.core.views.surveys import scansingle, singlewallet, allwallets, dwgdata, dwgfilesingle, dwgfileupload from troggle.core.views.other import troggle404, frontpage, todos, controlpanel, frontpage, scanupload from troggle.core.views.other import downloadlogbook, ajax_QM_number, downloadQMs 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 personindex, 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() ''' #handler404 = 'troggle.core.views.other.troggle404' # can't get this to work. but 404.html is default anyway # 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 = [ re_path(r'^(?P.*)$', expofiles_redirect, name="expofiles_redirect"), # to http://expo.survex.com/expofiles ] else: expofilesurls = [ re_path(r'^(?P.*)$', expofilessingle, name="single"), # local copy of EXPOFILES ] # 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'] trogglepatterns = [ re_path(r'^expofiles/', include(expofilesurls)), 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/?$', personindex, name="personindex"), 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 path('scanupload', scanupload, name='scanupload'), # setting LOGIN_URL = '/accounts/login/' is default # url ENDS WITH this string re_path(r'logout/$', expologout, name='expologout'), # higher precedence than /accounts/logout re_path(r'login/$', expologin, name='expologin'), # higher precedence than /accounts/login #re_path(r'^accounts/', include('django.contrib.auth.urls')), # from Dj3.0, 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.*)/?$', downloadlogbook), # e.g. /logbook2019.html # working but old CSS in template re_path(r'^logbook/?$', downloadlogbook, name="downloadlogbook"), # 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'^cave/new/$', caves.edit_cave, name="newcave"), re_path(r'^cave/3d/(?P[^/]+)$', caves.cave3d, name="cave3d"), re_path(r'^cave/(?P[^/]+)/?$', caves.cave, name="cave"), 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'^cave/entrance/([^/]+)/?$', caves.caveEntrance), re_path(r'^cave/description/([^/]+)/?$', caves.caveDescription), re_path(r'^cave/logbook/([^/]+)/?$', caves.caveLogbook), re_path(r'^(?P\d\d\d\d)(?P.*)$', cavepage, name="cavepage"), # shorthand /1623/264 BUT url links may break # Note that urls eg '1623/161/l/rl89a.htm' are handled by cavepage which redirects them to 'expopage' # Entrances re_path(r'^entrance/(?P[^/]+)/(?P[^/]+)/edit/', caves.edit_entrance, name = "editentrance"), re_path(r'^entrance/new/(?P[^/]+)$', caves.edit_entrance, name = "newentrance"), # System admin and monitoring re_path(r'^statistics/?$', statistics.stats, name="stats"), re_path(r'^stats/?$', statistics.stats, name="stats"), re_path(r'^pathsreport.*$', statistics.pathsreport, name="pathsreport"), re_path(r'^dataissues/?$', statistics.dataissues, name="dataissues"), re_path(r'^troggle$', frontpage, name="frontpage"), # control panel. Shows recent actions. re_path(r'^todo/(?P.*)$', todos, name="todos"), re_path(r'^controlpanel/?$', controlpanel, name="controlpanel"), # The survexfile pages re_path(r'^survexfile/(?P.*?)\.svx$', survex.svx, name="svx"), re_path(r'^survexfile/(?P.*?)\.3d$', survex.threed, name="threed"), re_path(r'^survexfile/(?P.*?)\.log$', survex.svxraw), re_path(r'^survexfile/(?P.*?)\.err$', survex.err), re_path(r'^survexfile/caves/$', survex.survexcaveslist, name="survexcaveslist"), re_path(r'^survexfile/caves$', survex.survexcaveslist, name="survexcaveslist"), # auto slash not working re_path(r'^survexfile/(?P.*)$', survex.survexcavesingle, name="survexcavessingle"), re_path(r'^survey_scans/$', allwallets, name="allwallets"), re_path(r'^survey_scans/(?P[^/]+)/$', singlewallet, name="singlewallet"), re_path(r'^survey_scans/(?P[^/]+)/(?P[^/]+)$', scansingle, name="scansingle"), # The tunnel and therion drawings files pages re_path(r'^dwgdata/$', dwgdata, name="dwgdata"), re_path(r'^dwgdataraw/(?P.+?\.xml)$', dwgfilesingle, name="dwgfilesingle"), re_path(r'^dwgdataraw/(?P.+?\.th)$', dwgfilesingle, name="dwgfilesingle"), re_path(r'^dwgdataraw/(?P.+?\.th2)$', dwgfilesingle, name="dwgfilesingle"), # re_path(r'^dwgdatainfo/(?P.+?\.xml)$', dwgfileinfo, name="dwgfileinfo"), # parses tunnel for info re_path(r'^dwgdataraw/(?P.+?\.xml)/upload$', dwgfileupload, name="dwgfileupload"), # Not working # QMs pages - must precede other /caves pages re_path(r'^cave/qms/([^/]+)/?$', caves.caveQMs), # blank page usually re_path(r'^cave/(?P[^/]+)/(?P\d\d\d\d)-(?P\d*)(?P[ABCDX]?)?$', caves.qm, name="qm"), re_path(r'^cave/(?P[^/]+)/qm\.csv/?$', downloadQMs, name="downloadqms"), re_path(r'^newqmnumber/?$', ajax_QM_number, ), # blank page if no ch given # re_path(r'^downloadqms$', other.downloadQMs), # MultiValueDictKeyError # Prospecting Guide document re_path(r'^prospecting_guide/$', prospecting), # re_path(r'^prospecting/(?P[^.]+).png$', prospecting_image, name="prospecting_image"), broken, won't repair. # 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 is in MEDIA now! re_path(r'^javascript/(?P.*)$', 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'^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 # Alias /favicon.ico /home/expo/troggle/media/favicon.ico # comes from /expoweb/* when running runserver # Alias /javascript /home/expo/troggle/media/jslib # empty # 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 # Alias /robots.txt /home/expo/static/robots.txt # to be changed # Alias /favicon.ico /home/expo/static/favicon.ico # to be changed # Alias /static/ /home/expo/static/ # ScriptAlias /repositories /home/expo/config/apache/services/hgweb/hgweb.cgi # ScriptAlias /boe /home/expo/boe/boc/boc.pl # ScriptAlias /boe-lastyear /home/expo/boe/boc-previous/boc.pl