summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/views/caves.py51
-rw-r--r--kmz_icons/camp.pngbin0 -> 9694 bytes
-rw-r--r--kmz_icons/large_cave.pngbin0 -> 11828 bytes
-rw-r--r--kmz_icons/small_cave.pngbin0 -> 8643 bytes
-rw-r--r--templates/entrance.kml10
-rw-r--r--templates/entrance_html.kml55
-rw-r--r--templates/expo.kml113
-rw-r--r--urls.py3
8 files changed, 159 insertions, 73 deletions
diff --git a/core/views/caves.py b/core/views/caves.py
index b5a13f4..82e9d64 100644
--- a/core/views/caves.py
+++ b/core/views/caves.py
@@ -1,10 +1,15 @@
import os
import re
import subprocess
+import tempfile
+import zipfile
+import urllib
+from bs4 import BeautifulSoup
+
from pathlib import Path
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
-from django.http import HttpResponse, HttpResponseNotFound, HttpResponseRedirect
+from django.http import HttpResponse, HttpResponseNotFound, HttpResponseRedirect, FileResponse
from django.shortcuts import render
from django.urls import NoReverseMatch, reverse
@@ -17,6 +22,8 @@ from troggle.core.views import expo
from troggle.settings import CAVEDESCRIPTIONS, ENTRANCEDESCRIPTIONS
from troggle.parsers.caves import read_cave, read_entrance
+from django.template import loader
+from django.utils.safestring import mark_safe
from .auth import login_required_if_public
@@ -628,3 +635,45 @@ def expo_kml(request):
},
content_type = "application/vnd.google-earth.kml+xml"
)
+
+def expo_kmz(request):
+ notablecaves = set(getnotablecaves())
+ #Zip file written to a file, to save this function using too much memory
+ with tempfile.TemporaryDirectory() as tmpdirname:
+ zippath = os.path.join(tmpdirname, 'expo.kmz')
+ with zipfile.ZipFile(zippath, 'w', compression=zipfile.ZIP_DEFLATED) as myzip:
+ entrances = []
+ for e in Entrance.objects.all():
+ html = loader.get_template("entrance_html.kml").render({"entrance": e}, request)
+ soup=BeautifulSoup(html)
+ for img in soup.find_all("img"):
+ #src_orig = img['src']
+ src = urllib.parse.urljoin(e.cavelist()[0].url.rpartition("/")[0] + "/", img['src'])
+ img['src'] = src
+ p = os.path.join(settings.EXPOWEB, src)
+ #print(e.cavelist()[0].url, e.cavelist()[0].url.rpartition("/")[0] + "/", src_orig, p)
+ if os.path.isfile(p):
+ myzip.write(p, src)
+ for a in soup.find_all("a"):
+ try:
+ ao = a['href']
+ aa = urllib.parse.urljoin(e.cavelist()[0].url.rpartition("/")[0] + "/", ao)
+ a['href'] = urllib.parse.urljoin("https://expo.survex.com/", aa)
+ print(e.cavelist()[0].url.rpartition("/")[0] + "/", ao, a['href'])
+ except:
+ pass
+ html = mark_safe(soup.prettify("utf-8").decode("utf-8"))
+
+ size = {True: "large", False:"small"}[bool(set(e.cavelist()) & notablecaves)]
+
+ entrances.append(loader.get_template("entrance.kml").render({"entrance": e, "html": html, "size": size}, request))
+
+ s = loader.get_template("expo.kml").render({"entrances": entrances}, request)
+ myzip.writestr("expo.kml", s)
+ for f in os.listdir(settings.KMZ_ICONS_PATH):
+ p = os.path.join(settings.KMZ_ICONS_PATH, f)
+ if os.path.isfile(p):
+ myzip.write(p, os.path.join("icons", f))
+ return FileResponse(open(zippath, 'rb'), content_type="application/vnd.google-earth.kmz .kmz")
+
+
diff --git a/kmz_icons/camp.png b/kmz_icons/camp.png
new file mode 100644
index 0000000..57dd2c6
--- /dev/null
+++ b/kmz_icons/camp.png
Binary files differ
diff --git a/kmz_icons/large_cave.png b/kmz_icons/large_cave.png
new file mode 100644
index 0000000..06b7d2c
--- /dev/null
+++ b/kmz_icons/large_cave.png
Binary files differ
diff --git a/kmz_icons/small_cave.png b/kmz_icons/small_cave.png
new file mode 100644
index 0000000..2d5a8ed
--- /dev/null
+++ b/kmz_icons/small_cave.png
Binary files differ
diff --git a/templates/entrance.kml b/templates/entrance.kml
new file mode 100644
index 0000000..77bb014
--- /dev/null
+++ b/templates/entrance.kml
@@ -0,0 +1,10 @@
+ {% if entrance.latlong %}
+ <Placemark>
+ <name>{{ entrance.slug }}</name>
+ <description><![CDATA[{{ html }}]]></description>
+ <styleUrl>#{{ size }}_cave</styleUrl>
+ <Point>
+ <coordinates>{{ entrance.latlong.1 }},{{ entrance.latlong.0 }},0</coordinates>
+ </Point>
+ </Placemark>
+ {% endif %}
diff --git a/templates/entrance_html.kml b/templates/entrance_html.kml
new file mode 100644
index 0000000..b45b11b
--- /dev/null
+++ b/templates/entrance_html.kml
@@ -0,0 +1,55 @@
+<dl>
+ <a href="{{entrance.cavelist.0.url }}">Cave: {{entrance.cavelist.0.name }}</a>
+ {% if entrance.marking %}
+ <dt>Marking</dt><dd>{{ entrance.marking_val|safe }}</dd>
+ {% endif %}
+ {% if entrance.marking_comment %}
+ <dt>Marking Comment</dt><dd>{{ entrance.marking_comment|safe }}</dd>
+ {% endif %}
+ {% if entrance.findability %}
+ <dt>Findability</dt><dd>{{ entrance.findability_val|safe }}</dd>
+ {% endif %}
+ {% if entrance.findability_comment %}
+ <dt>Findability Comment</dt><dd>{{ entrance.findability_comment|safe }}</dd>
+ {% endif %}
+ {% if entrance.location_description %}
+ <dt>Location</dt><dd>{{ entrance.location_description|safe }}</dd>
+ {% endif %}
+ {% if entrance.approach %}
+ <dt>Approach</dt><dd>{{ entrance.approach|safe }}</dd>
+ {% endif %}
+ {% if entrance.map_description %}
+ <dt>Map</dt><dd>{{ entrance.map_description|safe }}</dd>
+ {% endif %}
+ {% if entrance.underground_description %}
+ <dt>Underground</dt><dd>{{ entrance.underground_description|safe }}</dd>
+ {% endif %}
+ {% if entrance.photo %}
+ <dt>Photo</dt><dd>{{ entrance.photo|safe }}</dd>
+ {% endif %}
+ {% if entrance.entrance_description %}
+ <dt>Description</dt><dd>{{ entrance.entrance_description|safe }}</dd>
+ {% endif %}
+ {% if entrance.explorers %}
+ <dt>Explorers</dt><dd>{{ entrance.explorers|safe }}</dd>
+ {% endif %}
+ {% if entrance.northing %}
+ <dt>Location</dt><dd>?BMN? Northing: {{ entrance.northing|safe }}, Easting: {{ entrance.easting|safe }}, {{ entrance.alt|safe }}m</dd>
+ {% endif %}
+ {% if entrance.tag_station %}
+ <dt>Tag Location</dt><dd>{{ entrance.tag_station }} {{ entrance.tag.latlong.0|floatformat:5 }}N {{ entrance.tag.latlong.1|floatformat:5 }}E - UTM33 {{ entrance.tag.y|floatformat:0 }}, {{ entrance.tag.x|floatformat:0 }}, {{ entrance.tag.z|floatformat:0 }}m</dd>
+ {% endif %}
+ {% if entrance.bearings %}
+ <dt>Bearings</dt><dd>{{ entrance.bearings|safe }}</dd>
+ {% endif %}
+ {% if entrance.exact_station %}
+ <dt>Exact Station</dt><dd>{{ entrance.exact_station|safe }} {{ entrance.exact_location.latlong.0|floatformat:5 }}N {{ entrance.exact_location.latlong.1|floatformat:5 }}E - UTM33 {{ entrance.exact_location.y|floatformat:0 }}, {{ entrance.exact_location.x|floatformat:0 }}, {{ entrance.exact_location.z|floatformat:0 }}m</dd>
+ {% endif %}
+ {% if entrance.other_station %}
+ <dt>Other Station</dt><dd>{{ entrance.other_station|safe }}
+ {% if entrance.other_description %}
+ - {{ entrance.other_description|safe }}
+ {% endif %} {{ entrance.other_location.latlong.0|floatformat:5 }}N {{ entrance.other_location.latlong.1|floatformat:5 }}E - UTM33 {{ entrance.other_location.y|floatformat:0 }}, {{ entrance.other_location.x|floatformat:0 }}, {{ entrance.other_location.z|floatformat:0 }}m
+ </dd>
+ {% endif %}
+</dl>
diff --git a/templates/expo.kml b/templates/expo.kml
index 9179ee9..3861276 100644
--- a/templates/expo.kml
+++ b/templates/expo.kml
@@ -2,104 +2,75 @@
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<name>Expo.KML</name>
- <Style id="default0">
+ <Style id="small_cave_">
<IconStyle>
+ <scale>1.0</scale>
+ <Icon>
+ <href>icons/small_cave.png</href>
+ </Icon>
+ </IconStyle>
+ <LabelStyle>
+ <scale>0.7</scale>
+ </LabelStyle>
+ </Style>
+ <Style id="small_cave_hl">
+ <IconStyle>
+ <scale>2.0</scale>
+ <Icon>
+ <href>icons/small_cave.png</href>
+ </Icon>
+ </IconStyle>
+ <LabelStyle>
<scale>0.7</scale>
+ </LabelStyle>
+ </Style>
+ <StyleMap id="small_cave">
+ <Pair>
+ <key>normal</key>
+ <styleUrl>#small_cave_</styleUrl>
+ </Pair>
+ <Pair>
+ <key>highlight</key>
+ <styleUrl>#small_cave_hl</styleUrl>
+ </Pair>
+ </StyleMap>
+
+ <Style id="large_cave_">
+ <IconStyle>
+ <scale>1.0</scale>
<Icon>
- <href>http://maps.google.com/mapfiles/kml/shapes/placemark_circle.png</href>
+ <href>icons/large_cave.png</href>
</Icon>
</IconStyle>
<LabelStyle>
<scale>0.7</scale>
</LabelStyle>
</Style>
- <Style id="hl">
+ <Style id="large_cave_hl">
<IconStyle>
- <scale>0.84</scale>
+ <scale>2.0</scale>
<Icon>
- <href>http://maps.google.com/mapfiles/kml/shapes/placemark_circle_highlight.png</href>
+ <href>icons/large_cave.png</href>
</Icon>
</IconStyle>
<LabelStyle>
<scale>0.7</scale>
</LabelStyle>
</Style>
- <StyleMap id="default">
+ <StyleMap id="large_cave">
<Pair>
<key>normal</key>
- <styleUrl>#default0</styleUrl>
+ <styleUrl>#large_cave_</styleUrl>
</Pair>
<Pair>
<key>highlight</key>
- <styleUrl>#hl</styleUrl>
+ <styleUrl>#large_cave_hl</styleUrl>
</Pair>
</StyleMap>
<Folder>
<name>Expo.KML</name>
{% for entrance in entrances %}
- {% if entrance.latlong %}
- <Placemark>
- <name>{{ entrance.slug }}</name>
- <description><![CDATA[ <dl>
- {% if entrance.marking %}
- <dt>Marking</dt><dd>{{ entrance.marking_val|safe }}</dd>
- {% endif %}
- {% if entrance.marking_comment %}
- <dt>Marking Comment</dt><dd>{{ entrance.marking_comment|safe }}</dd>
- {% endif %}
- {% if entrance.findability %}
- <dt>Findability</dt><dd>{{ entrance.findability_val|safe }}</dd>
- {% endif %}
- {% if entrance.findability_comment %}
- <dt>Findability Comment</dt><dd>{{ entrance.findability_comment|safe }}</dd>
- {% endif %}
- {% if entrance.location_description %}
- <dt>Location</dt><dd>{{ entrance.location_description|safe }}</dd>
- {% endif %}
- {% if entrance.approach %}
- <dt>Approach</dt><dd>{{ entrance.approach|safe }}</dd>
- {% endif %}
- {% if entrance.map_description %}
- <dt>Map</dt><dd>{{ entrance.map_description|safe }}</dd>
- {% endif %}
- {% if entrance.underground_description %}
- <dt>Underground</dt><dd>{{ entrance.underground_description|safe }}</dd>
- {% endif %}
- {% if entrance.photo %}
- <dt>Photo</dt><dd>{{ entrance.photo|safe }}</dd>
- {% endif %}
- {% if entrance.entrance_description %}
- <dt>Description</dt><dd>{{ entrance.entrance_description|safe }}</dd>
- {% endif %}
- {% if entrance.explorers %}
- <dt>Explorers</dt><dd>{{ entrance.explorers|safe }}</dd>
- {% endif %}
- {% if entrance.northing %}
- <dt>Location</dt><dd>?BMN? Northing: {{ entrance.northing|safe }}, Easting: {{ entrance.easting|safe }}, {{ entrance.alt|safe }}m</dd>
- {% endif %}
- {% if entrance.tag_station %}
- <dt>Tag Location</dt><dd>{{ entrance.tag_station }} UTM33 {{ entrance.tag.y|floatformat:0 }}, {{ entrance.tag.x|floatformat:0 }}, {{ entrance.tag.z|floatformat:0 }}m</dd>
- {% endif %}
- {% if entrance.bearings %}
- <dt>Bearings</dt><dd>{{ entrance.bearings|safe }}</dd>
- {% endif %}
- {% if entrance.exact_station %}
- <dt>Exact Station</dt><dd>{{ entrance.exact_station|safe }} UTM33 {{ entrance.exact_location.y|floatformat:0 }}, {{ entrance.exact_location.x|floatformat:0 }}, {{ entrance.exact_location.z|floatformat:0 }}m</dd>
- {% endif %}
- {% if entrance.other_station %}
- <dt>Other Station</dt><dd>{{ entrance.other_station|safe }}
- {% if entrance.other_description %}
- - {{ entrance.other_description|safe }}
- {% endif %} UTM33 {{ entrance.other_location.y|floatformat:0 }}, {{ entrance.other_location.x|floatformat:0 }}, {{ entrance.other_location.z|floatformat:0 }}m
- </dd>
- {% endif %}
- </dl> ]]></description>
- <styleUrl>#default</styleUrl>
- <Point>
- <coordinates>{{ entrance.latlong.1 }},{{ entrance.latlong.0 }},0</coordinates>
- </Point>
- </Placemark>
- {% endif %}
+ {{ entrance }}
{% endfor %}
</Folder>
</Document>
diff --git a/urls.py b/urls.py
index 1fca988..c7fc81c 100644
--- a/urls.py
+++ b/urls.py
@@ -8,7 +8,7 @@ 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, expo_kml)
+ edit_entrance, get_entrances, qm, expo_kml, expo_kmz)
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,
@@ -232,6 +232,7 @@ trogglepatterns = [
re_path(r'^new_image_form/(?P<path>.*)', new_image_form, name = 'new_image_form'),
re_path(r'^expo.kml', expo_kml, name = 'expo.kml'),
+ re_path(r'^expo.kmz', expo_kmz, name = 'expo.kmz'),
# Final catchall which also serves expoweb handbook pages and imagestiny
re_path(r'^(.*)$', expopage, name="expopage"), # CATCHALL assumed relative to EXPOWEB