forked from expo/troggle
Start of creating kmz file, with entrance photos and links to expo.survex.com
This commit is contained in:
parent
ea7c29a54e
commit
f7fca58c57
@ -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")
|
||||
|
||||
|
||||
|
BIN
kmz_icons/camp.png
Normal file
BIN
kmz_icons/camp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.5 KiB |
BIN
kmz_icons/large_cave.png
Normal file
BIN
kmz_icons/large_cave.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
BIN
kmz_icons/small_cave.png
Normal file
BIN
kmz_icons/small_cave.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.4 KiB |
10
templates/entrance.kml
Normal file
10
templates/entrance.kml
Normal file
@ -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 %}
|
55
templates/entrance_html.kml
Normal file
55
templates/entrance_html.kml
Normal file
@ -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>
|
@ -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>0.7</scale>
|
||||
<scale>1.0</scale>
|
||||
<Icon>
|
||||
<href>http://maps.google.com/mapfiles/kml/shapes/placemark_circle.png</href>
|
||||
<href>icons/small_cave.png</href>
|
||||
</Icon>
|
||||
</IconStyle>
|
||||
<LabelStyle>
|
||||
<scale>0.7</scale>
|
||||
</LabelStyle>
|
||||
</Style>
|
||||
<Style id="hl">
|
||||
<Style id="small_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/small_cave.png</href>
|
||||
</Icon>
|
||||
</IconStyle>
|
||||
<LabelStyle>
|
||||
<scale>0.7</scale>
|
||||
</LabelStyle>
|
||||
</Style>
|
||||
<StyleMap id="default">
|
||||
<StyleMap id="small_cave">
|
||||
<Pair>
|
||||
<key>normal</key>
|
||||
<styleUrl>#default0</styleUrl>
|
||||
<styleUrl>#small_cave_</styleUrl>
|
||||
</Pair>
|
||||
<Pair>
|
||||
<key>highlight</key>
|
||||
<styleUrl>#hl</styleUrl>
|
||||
<styleUrl>#small_cave_hl</styleUrl>
|
||||
</Pair>
|
||||
</StyleMap>
|
||||
|
||||
<Style id="large_cave_">
|
||||
<IconStyle>
|
||||
<scale>1.0</scale>
|
||||
<Icon>
|
||||
<href>icons/large_cave.png</href>
|
||||
</Icon>
|
||||
</IconStyle>
|
||||
<LabelStyle>
|
||||
<scale>0.7</scale>
|
||||
</LabelStyle>
|
||||
</Style>
|
||||
<Style id="large_cave_hl">
|
||||
<IconStyle>
|
||||
<scale>2.0</scale>
|
||||
<Icon>
|
||||
<href>icons/large_cave.png</href>
|
||||
</Icon>
|
||||
</IconStyle>
|
||||
<LabelStyle>
|
||||
<scale>0.7</scale>
|
||||
</LabelStyle>
|
||||
</Style>
|
||||
<StyleMap id="large_cave">
|
||||
<Pair>
|
||||
<key>normal</key>
|
||||
<styleUrl>#large_cave_</styleUrl>
|
||||
</Pair>
|
||||
<Pair>
|
||||
<key>highlight</key>
|
||||
<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>
|
||||
|
3
urls.py
3
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
|
||||
|
Loading…
Reference in New Issue
Block a user