1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
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 reverse, resolve
from troggle.core.views import surveys, other, caves, statistics, survex
from troggle.core.views.other import troggle404, frontpage
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( <regular expression that matches the thing in the web browser>,
<reference to python function in 'core' folder>, <optional name>)
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.
"""
#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<path>.*)$', expofiles_redirect, name="expofiles_redirect"), # to http://expo.survex.com/expofiles
]
else:
expofilesurls = [
re_path(r'^(?P<filepath>.*)$', 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/<uidb64>/<token>/ [name='password_reset_confirm']
# accounts/reset/done/ [name='password_reset_complete']
trogglepatterns = [
re_path(r'^expofiles/', include(expofilesurls)),
re_path(r'^troggle$', other.frontpage, name="frontpage"), # control panel. Shows recent actions.
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
# 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<person_id>\d*)/?$', person), makes Ruairidh MacLeod work but kills MacLean
# re_path(r'^person/(\w+_\w+)$', logbooks.person, name="person"),
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-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"),
# Expedition master page
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<date>.*)/(?P<slug>.*)/?$', logbookentry,name="logbookentry"),
re_path(r'^newfile', other.newFile, name="newFile"), # oddly broken, needs investigating more
re_path(r'^logbooksearch/(.*)/?$', logbookSearch),
re_path(r'^logbook(?P<year>\d\d\d\d)\.(?P<extension>.*)/?$', other.downloadLogbook),
re_path(r'^logbook/?$', other.downloadLogbook, name="downloadlogbook"),
# 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"),
re_path(r'^getQMs/(?P<caveslug>.*)', caves.get_qms, name = "get_qms"),
re_path(r'^getEntrances/(?P<caveslug>.*)', 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<cave_id>[^/]+)$', caves.cave3d, name="cave3d"),
re_path(r'^cave/(?P<cave_id>[^/]+)/?$', caves.cave, name="cave"),
re_path(r'^cave/(?P<cave_id>[^/]+)/?(?P<ent_letter>[^/])$', ent), # view_caves.ent
re_path(r'^cave/(?P<slug>[^/]+)/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<karea>\d\d\d\d)(?P<subpath>.*)$', 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<caveslug>[^/]+)/(?P<slug>[^/]+)/edit/', caves.edit_entrance, name = "editentrance"),
re_path(r'^entrance/new/(?P<caveslug>[^/]+)$', caves.edit_entrance, name = "newentrance"),
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'^controlpanel/?$', other.controlPanel, name="controlpanel"),
# The survexfile pages
re_path(r'^survexfile/(?P<survex_file>.*?)\.svx$', survex.svx, name="svx"),
re_path(r'^survexfile/(?P<survex_file>.*?)\.3d$', survex.threed, name="threed"),
re_path(r'^survexfile/(?P<survex_file>.*?)\.log$', survex.svxraw),
re_path(r'^survexfile/(?P<survex_file>.*?)\.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_cave>.*)$', survex.survexcavesingle, name="survexcavessingle"),
re_path(r'^survey_scans/$', surveys.surveyscansfolders, name="surveyscansfolders"),
re_path(r'^survey_scans/(?P<path>[^/]+)/$', surveys.surveyscansfolder, name="surveyscansfolder"),
re_path(r'^survey_scans/(?P<path>[^/]+)/(?P<file>[^/]+)$',
surveys.surveyscansingle, name="surveyscansingle"),
# The tunnel and therion drawings files pages
re_path(r'^tunneldata/$', surveys.tunneldata, name="tunneldata"),
re_path(r'^tunneldataraw/(?P<path>.+?\.xml)$', surveys.dwgfilesingle, name="dwgfilesingle"),
re_path(r'^tunneldataraw/(?P<path>.+?\.th)$', surveys.dwgfilesingle, name="dwgfilesingle"),
re_path(r'^tunneldataraw/(?P<path>.+?\.th2)$', surveys.dwgfilesingle, name="dwgfilesingle"),
# re_path(r'^tunneldatainfo/(?P<path>.+?\.xml)$', surveys.tunnelfileinfo, name="tunnelfileinfo"), # parses tunnel for info
re_path(r'^tunneldataraw/(?P<path>.+?\.xml)/upload$', surveys.tunnelfileupload, name="tunnelfileupload"),
# QMs pages - must precede other /caves pages
re_path(r'^cave/qms/([^/]+)/?$', caves.caveQMs), # blank page usually
re_path(r'^cave/(?P<cave_id>[^/]+)/(?P<year>\d\d\d\d)-(?P<qm_id>\d*)(?P<grade>[ABCDX]?)?$', caves.qm, name="qm"),
re_path(r'^cave/(?P<cave_id>[^/]+)/qm\.csv/?$', other.downloadQMs, name="downloadqms"),
re_path(r'^newqmnumber/?$', other.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<name>[^.]+).png$', prospecting_image, name="prospecting_image"),
# 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
re_path(r'^static/(?P<subpath>.*)$', mediapage, {'doc_root': settings.MEDIA_ROOT}, name="mediapage"), # STATIC is in MEDIA now!
re_path(r'^javascript/(?P<subpath>.*)$', mediapage, {'doc_root': settings.JSLIB_ROOT}, name="mediapage"), # JSLIB_URL
re_path(r'^expowebcache/3d/(?P<subpath>.*)$', 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<path>.*)$', 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
|