Full map download endpoint
This commit is contained in:
parent
3472f45159
commit
0be42d39cb
3 changed files with 87 additions and 3 deletions
|
@ -603,3 +603,62 @@ def test_can_send_link_on_anonymous_map_with_cookie(cookieclient, anonymap):
|
||||||
assert resp.status_code == 200
|
assert resp.status_code == 200
|
||||||
assert len(mail.outbox) == 1
|
assert len(mail.outbox) == 1
|
||||||
assert mail.outbox[0].subject == "The uMap edit link for your map: test map"
|
assert mail.outbox[0].subject == "The uMap edit link for your map: test map"
|
||||||
|
|
||||||
|
|
||||||
|
def test_download(client, map, datalayer):
|
||||||
|
url = reverse("map_download", args=(map.pk,))
|
||||||
|
response = client.get(url)
|
||||||
|
assert response.status_code == 200
|
||||||
|
# Test response is a json
|
||||||
|
j = json.loads(response.content.decode())
|
||||||
|
assert j["type"] == "umap"
|
||||||
|
assert j["uri"] == "http://testserver/en/map/test-map_1"
|
||||||
|
assert j["geometry"] == {
|
||||||
|
"coordinates": [13.447265624999998, 48.94415123418794],
|
||||||
|
"type": "Point",
|
||||||
|
}
|
||||||
|
assert j["properties"] == {
|
||||||
|
"datalayersControl": True,
|
||||||
|
"description": "Which is just the Danube, at the end",
|
||||||
|
"displayCaptionOnLoad": False,
|
||||||
|
"displayDataBrowserOnLoad": False,
|
||||||
|
"displayPopupFooter": False,
|
||||||
|
"licence": "",
|
||||||
|
"miniMap": False,
|
||||||
|
"moreControl": True,
|
||||||
|
"name": "Cruising on the Donau",
|
||||||
|
"scaleControl": True,
|
||||||
|
"tilelayer": {
|
||||||
|
"attribution": "© OSM Contributors",
|
||||||
|
"maxZoom": 18,
|
||||||
|
"minZoom": 0,
|
||||||
|
"url_template": "http://{s}.osm.fr/{z}/{x}/{y}.png",
|
||||||
|
},
|
||||||
|
"tilelayersControl": True,
|
||||||
|
"zoom": 7,
|
||||||
|
"zoomControl": True,
|
||||||
|
}
|
||||||
|
assert j["layers"] == [
|
||||||
|
{
|
||||||
|
"_umap_options": {
|
||||||
|
"browsable": True,
|
||||||
|
"displayOnLoad": True,
|
||||||
|
"name": "test datalayer",
|
||||||
|
},
|
||||||
|
"features": [
|
||||||
|
{
|
||||||
|
"geometry": {
|
||||||
|
"coordinates": [13.68896484375, 48.55297816440071],
|
||||||
|
"type": "Point",
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"_umap_options": {"color": "DarkCyan", "iconClass": "Ball"},
|
||||||
|
"description": "Da place anonymous again 755",
|
||||||
|
"name": "Here",
|
||||||
|
},
|
||||||
|
"type": "Feature",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "FeatureCollection",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
|
@ -39,6 +39,11 @@ urlpatterns = [
|
||||||
),
|
),
|
||||||
re_path(r"^i18n/", include("django.conf.urls.i18n")),
|
re_path(r"^i18n/", include("django.conf.urls.i18n")),
|
||||||
re_path(r"^agnocomplete/", include("agnocomplete.urls")),
|
re_path(r"^agnocomplete/", include("agnocomplete.urls")),
|
||||||
|
re_path(
|
||||||
|
r"^map/(?P<map_id>\d+)/download/",
|
||||||
|
can_view_map(views.MapDownload.as_view()),
|
||||||
|
name="map_download",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
i18n_urls = [
|
i18n_urls = [
|
||||||
|
|
|
@ -469,9 +469,7 @@ class MapDetailMixin:
|
||||||
else:
|
else:
|
||||||
map_statuses = AnonymousMapPermissionsForm.STATUS
|
map_statuses = AnonymousMapPermissionsForm.STATUS
|
||||||
datalayer_statuses = AnonymousDataLayerPermissionsForm.STATUS
|
datalayer_statuses = AnonymousDataLayerPermissionsForm.STATUS
|
||||||
properties["edit_statuses"] = [
|
properties["edit_statuses"] = [(i, str(label)) for i, label in map_statuses]
|
||||||
(i, str(label)) for i, label in map_statuses
|
|
||||||
]
|
|
||||||
properties["datalayer_edit_statuses"] = [
|
properties["datalayer_edit_statuses"] = [
|
||||||
(i, str(label)) for i, label in datalayer_statuses
|
(i, str(label)) for i, label in datalayer_statuses
|
||||||
]
|
]
|
||||||
|
@ -606,6 +604,28 @@ class MapView(MapDetailMixin, PermissionsMixin, DetailView):
|
||||||
return Star.objects.filter(by=user, map=self.object).exists()
|
return Star.objects.filter(by=user, map=self.object).exists()
|
||||||
|
|
||||||
|
|
||||||
|
class MapDownload(DetailView):
|
||||||
|
model = Map
|
||||||
|
pk_url_kwarg = "map_id"
|
||||||
|
|
||||||
|
def get_canonical_url(self):
|
||||||
|
return reverse("map_download", args=(self.object.pk,))
|
||||||
|
|
||||||
|
def render_to_response(self, context, *args, **kwargs):
|
||||||
|
geojson = self.object.settings
|
||||||
|
geojson["type"] = "umap"
|
||||||
|
geojson["uri"] = self.request.build_absolute_uri(self.object.get_absolute_url())
|
||||||
|
datalayers = []
|
||||||
|
for datalayer in self.object.datalayer_set.all():
|
||||||
|
with open(datalayer.geojson.path, "rb") as f:
|
||||||
|
layer = json.loads(f.read())
|
||||||
|
if datalayer.settings:
|
||||||
|
layer["_umap_options"] = datalayer.settings
|
||||||
|
datalayers.append(layer)
|
||||||
|
geojson["layers"] = datalayers
|
||||||
|
return simple_json_response(**geojson)
|
||||||
|
|
||||||
|
|
||||||
class MapViewGeoJSON(MapView):
|
class MapViewGeoJSON(MapView):
|
||||||
def get_canonical_url(self):
|
def get_canonical_url(self):
|
||||||
return reverse("map_geojson", args=(self.object.pk,))
|
return reverse("map_geojson", args=(self.object.pk,))
|
||||||
|
|
Loading…
Reference in a new issue