Skip to content

Commit fe038ee

Browse files
authored
Fix selected layers in screenshot (#341)
* fix tests * fix restoration layers context * add changelog entry * fix filter context restoration * add changelog entry * improve code quality * improve Javascript quality code * Update CHANGES.md * improve js code quality * fix restoration layers context * add language in mapentity url for screamshotter * fix quality * change entry in changelog * add tests * Update fullurl in test_views.py for testing * improve map_capture tests * fix quality
1 parent 09df0c4 commit fe038ee

File tree

3 files changed

+76
-3
lines changed

3 files changed

+76
-3
lines changed

CHANGES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ CHANGELOG
77
**Bug fixes**
88

99
- Fix filter context restoration
10+
- Fix layer restoration in screenshot
11+
1012

1113
8.14.5 (2025-10-30)
1214
-----------------------

mapentity/views/base.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from django.shortcuts import get_object_or_404
1414
from django.urls import reverse
1515
from django.utils import timezone
16+
from django.utils.translation import get_language
1617
from django.views import View, static
1718
from django.views.decorators.csrf import csrf_exempt
1819
from django.views.decorators.http import require_http_methods
@@ -189,9 +190,7 @@ def map_screenshot(request):
189190
context["print"] = True
190191
printcontext = json.dumps(context)
191192
contextencoded = quote(printcontext)
192-
map_url += (
193-
f"?auth_token={TokenManager.generate_token()}&context={contextencoded}"
194-
)
193+
map_url += f"?lang={get_language()}&auth_token={TokenManager.generate_token()}&context={contextencoded}"
195194

196195
msg = f"Capture {map_url}"
197196
logger.debug(msg)

test_project/test_app/tests/test_views.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
import os
23
from unittest import mock
34

@@ -11,7 +12,9 @@
1112
from django.core.management import call_command
1213
from django.test import RequestFactory, TestCase
1314
from django.test.utils import override_settings
15+
from django.urls import reverse
1416
from django.utils.encoding import force_str
17+
from django.utils.translation import get_language
1518
from faker import Faker
1619
from faker.providers import geo
1720
from freezegun import freeze_time
@@ -666,3 +669,72 @@ def test_filter_view_creates_full_generic_filter(self):
666669
response = self.client.get(City.get_filter_url())
667670
self.assertContains(response, '<input type="text" name="name"')
668671
self.assertContains(response, '<input type="hidden" name="bbox"')
672+
673+
674+
class MapScreenshotTest(BaseTest):
675+
context = {
676+
"mapview": {"lat": 42.771211138625894, "lng": 1.336212158203125, "zoom": 9},
677+
"maplayers": ["OSM", "Cadastre", "Signalétiques", "POI", "▣ Tronçons"],
678+
"filter": "",
679+
"sortcolumns": {},
680+
"fullurl": "https://test.fr/path/list/",
681+
"url": "/path/list/",
682+
"selector": "#map",
683+
"viewport": {"width": 1854, "height": 481},
684+
"timestamp": 1762525783907,
685+
}
686+
687+
@mock.patch("mapentity.helpers.requests.get")
688+
def test_map_screenshot_success(self, mock_capture):
689+
self.login()
690+
691+
mock_capture.return_value.content = b"fake_png_data"
692+
mock_capture.return_value.status_code = 200
693+
694+
data = {"printcontext": json.dumps(self.context)}
695+
696+
response = self.client.post(reverse("mapentity:map_screenshot"), data)
697+
698+
self.assertEqual(response.status_code, 200)
699+
self.assertEqual(response["Content-Type"], "image/png")
700+
self.assertIn("attachment", response["Content-Disposition"])
701+
self.assertEqual(response.content, b"fake_png_data")
702+
703+
args, kwargs = mock_capture.call_args
704+
called_url = args[0]
705+
706+
# check mapentity url
707+
self.assertTrue(called_url.startswith("http"))
708+
self.assertIn(f"lang%3D{get_language()}", called_url)
709+
self.assertIn("auth_token", called_url)
710+
self.assertIn("context", called_url)
711+
712+
# check screamshotter url
713+
self.assertIn("width=1854", called_url)
714+
self.assertIn("height=481", called_url)
715+
self.assertIn("selector=%23map", called_url)
716+
717+
def test_map_screenshot_invalid_json_context(self):
718+
self.login()
719+
720+
data = {"printcontext": "json_error"}
721+
722+
with self.assertLogs(level="INFO") as cm:
723+
response = self.client.post(reverse("mapentity:map_screenshot"), data)
724+
self.assertEqual(response.status_code, 400)
725+
self.assertIn(
726+
"ERROR:mapentity.views.base:Expecting value: line 1 column 1 (char 0)",
727+
cm.output[0],
728+
)
729+
730+
def test_map_screenshot_invalid_length_context(self):
731+
self.login()
732+
733+
data = {"printcontext": "{" + "test" * 1000 + "}"}
734+
735+
with self.assertLogs(level="INFO") as cm:
736+
response = self.client.post(reverse("mapentity:map_screenshot"), data)
737+
self.assertEqual(response.status_code, 400)
738+
self.assertIn(
739+
"ERROR:mapentity.views.base:Print context is way too big", cm.output[0]
740+
)

0 commit comments

Comments
 (0)