umap-project 2.1.3__py3-none-any.whl → 2.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of umap-project might be problematic. Click here for more details.

Files changed (200) hide show
  1. umap/__init__.py +1 -1
  2. umap/context_processors.py +1 -0
  3. umap/locale/br/LC_MESSAGES/django.mo +0 -0
  4. umap/locale/en/LC_MESSAGES/django.po +32 -32
  5. umap/locale/hu/LC_MESSAGES/django.mo +0 -0
  6. umap/locale/it/LC_MESSAGES/django.mo +0 -0
  7. umap/locale/ms/LC_MESSAGES/django.mo +0 -0
  8. umap/migrations/0020_alter_tilelayer_url_template.py +19 -0
  9. umap/migrations/0021_remove_map_description.py +16 -0
  10. umap/models.py +8 -6
  11. umap/settings/base.py +1 -0
  12. umap/static/umap/base.css +43 -156
  13. umap/static/umap/content.css +7 -25
  14. umap/static/umap/css/icon.css +112 -0
  15. umap/static/umap/css/panel.css +140 -0
  16. umap/static/umap/img/16-white.svg +5 -1
  17. umap/static/umap/img/16.svg +7 -4
  18. umap/static/umap/img/24-white.svg +3 -1
  19. umap/static/umap/img/24.svg +3 -4
  20. umap/static/umap/img/source/16-white.svg +176 -940
  21. umap/static/umap/img/source/16.svg +8 -5
  22. umap/static/umap/img/source/24-white.svg +5 -3
  23. umap/static/umap/img/source/24.svg +6 -7
  24. umap/static/umap/js/modules/browser.js +97 -73
  25. umap/static/umap/js/modules/dompurify.js +12 -0
  26. umap/static/umap/js/modules/facets.js +149 -0
  27. umap/static/umap/js/modules/global.js +9 -1
  28. umap/static/umap/js/modules/i18n.js +7 -0
  29. umap/static/umap/js/modules/orderable.js +84 -0
  30. umap/static/umap/js/modules/panel.js +76 -0
  31. umap/static/umap/js/modules/request.js +0 -1
  32. umap/static/umap/js/modules/schema.js +324 -223
  33. umap/static/umap/js/modules/urls.js +1 -16
  34. umap/static/umap/js/modules/utils.js +340 -0
  35. umap/static/umap/js/umap.autocomplete.js +40 -25
  36. umap/static/umap/js/umap.controls.js +227 -369
  37. umap/static/umap/js/umap.core.js +77 -366
  38. umap/static/umap/js/umap.datalayer.permissions.js +1 -1
  39. umap/static/umap/js/umap.features.js +62 -42
  40. umap/static/umap/js/umap.forms.js +128 -36
  41. umap/static/umap/js/umap.icon.js +11 -4
  42. umap/static/umap/js/umap.importer.js +78 -57
  43. umap/static/umap/js/umap.js +179 -156
  44. umap/static/umap/js/umap.layer.js +79 -40
  45. umap/static/umap/js/umap.permissions.js +13 -9
  46. umap/static/umap/js/umap.popup.js +26 -30
  47. umap/static/umap/js/umap.share.js +12 -9
  48. umap/static/umap/js/umap.tableeditor.js +4 -6
  49. umap/static/umap/js/umap.ui.js +10 -60
  50. umap/static/umap/locale/am_ET.js +243 -227
  51. umap/static/umap/locale/am_ET.json +21 -9
  52. umap/static/umap/locale/ar.js +243 -227
  53. umap/static/umap/locale/ar.json +21 -9
  54. umap/static/umap/locale/ast.js +243 -227
  55. umap/static/umap/locale/ast.json +21 -9
  56. umap/static/umap/locale/bg.js +243 -227
  57. umap/static/umap/locale/bg.json +21 -9
  58. umap/static/umap/locale/br.js +253 -237
  59. umap/static/umap/locale/br.json +25 -13
  60. umap/static/umap/locale/ca.js +243 -227
  61. umap/static/umap/locale/ca.json +21 -9
  62. umap/static/umap/locale/cs_CZ.js +243 -227
  63. umap/static/umap/locale/cs_CZ.json +21 -9
  64. umap/static/umap/locale/da.js +243 -227
  65. umap/static/umap/locale/da.json +21 -9
  66. umap/static/umap/locale/de.js +243 -227
  67. umap/static/umap/locale/de.json +21 -9
  68. umap/static/umap/locale/el.js +243 -227
  69. umap/static/umap/locale/el.json +21 -9
  70. umap/static/umap/locale/en.js +243 -234
  71. umap/static/umap/locale/en.json +22 -10
  72. umap/static/umap/locale/en_US.json +21 -9
  73. umap/static/umap/locale/es.js +243 -227
  74. umap/static/umap/locale/es.json +21 -9
  75. umap/static/umap/locale/et.js +243 -227
  76. umap/static/umap/locale/et.json +21 -9
  77. umap/static/umap/locale/eu.js +227 -199
  78. umap/static/umap/locale/eu.json +1 -1
  79. umap/static/umap/locale/fa_IR.js +243 -227
  80. umap/static/umap/locale/fa_IR.json +21 -9
  81. umap/static/umap/locale/fi.js +243 -227
  82. umap/static/umap/locale/fi.json +21 -9
  83. umap/static/umap/locale/fr.js +243 -234
  84. umap/static/umap/locale/fr.json +21 -9
  85. umap/static/umap/locale/gl.js +243 -227
  86. umap/static/umap/locale/gl.json +21 -9
  87. umap/static/umap/locale/he.js +243 -227
  88. umap/static/umap/locale/he.json +21 -9
  89. umap/static/umap/locale/hr.js +243 -227
  90. umap/static/umap/locale/hr.json +21 -9
  91. umap/static/umap/locale/hu.js +243 -234
  92. umap/static/umap/locale/hu.json +21 -9
  93. umap/static/umap/locale/id.js +243 -227
  94. umap/static/umap/locale/id.json +21 -9
  95. umap/static/umap/locale/is.js +243 -227
  96. umap/static/umap/locale/is.json +21 -9
  97. umap/static/umap/locale/it.js +243 -234
  98. umap/static/umap/locale/it.json +21 -9
  99. umap/static/umap/locale/ja.js +243 -227
  100. umap/static/umap/locale/ja.json +21 -9
  101. umap/static/umap/locale/ko.js +243 -227
  102. umap/static/umap/locale/ko.json +21 -9
  103. umap/static/umap/locale/lt.js +243 -227
  104. umap/static/umap/locale/lt.json +21 -9
  105. umap/static/umap/locale/ms.js +243 -234
  106. umap/static/umap/locale/ms.json +22 -10
  107. umap/static/umap/locale/nl.js +246 -230
  108. umap/static/umap/locale/nl.json +21 -9
  109. umap/static/umap/locale/no.js +243 -227
  110. umap/static/umap/locale/no.json +21 -9
  111. umap/static/umap/locale/pl.js +243 -227
  112. umap/static/umap/locale/pl.json +21 -9
  113. umap/static/umap/locale/pl_PL.json +21 -9
  114. umap/static/umap/locale/pt.js +243 -227
  115. umap/static/umap/locale/pt.json +21 -9
  116. umap/static/umap/locale/pt_BR.js +243 -227
  117. umap/static/umap/locale/pt_BR.json +21 -9
  118. umap/static/umap/locale/pt_PT.js +243 -227
  119. umap/static/umap/locale/pt_PT.json +21 -9
  120. umap/static/umap/locale/ro.js +243 -227
  121. umap/static/umap/locale/ro.json +21 -9
  122. umap/static/umap/locale/ru.js +243 -227
  123. umap/static/umap/locale/ru.json +21 -9
  124. umap/static/umap/locale/si.js +1 -1
  125. umap/static/umap/locale/si.json +1 -1
  126. umap/static/umap/locale/sk_SK.js +243 -227
  127. umap/static/umap/locale/sk_SK.json +21 -9
  128. umap/static/umap/locale/sl.js +243 -227
  129. umap/static/umap/locale/sl.json +21 -9
  130. umap/static/umap/locale/sr.js +243 -227
  131. umap/static/umap/locale/sr.json +21 -9
  132. umap/static/umap/locale/sv.js +243 -227
  133. umap/static/umap/locale/sv.json +21 -9
  134. umap/static/umap/locale/th_TH.js +243 -227
  135. umap/static/umap/locale/th_TH.json +21 -9
  136. umap/static/umap/locale/tr.js +243 -227
  137. umap/static/umap/locale/tr.json +21 -9
  138. umap/static/umap/locale/uk_UA.js +243 -227
  139. umap/static/umap/locale/uk_UA.json +21 -9
  140. umap/static/umap/locale/vi.js +243 -227
  141. umap/static/umap/locale/vi.json +21 -9
  142. umap/static/umap/locale/vi_VN.json +21 -9
  143. umap/static/umap/locale/zh.js +243 -227
  144. umap/static/umap/locale/zh.json +21 -9
  145. umap/static/umap/locale/zh_CN.json +21 -9
  146. umap/static/umap/locale/zh_TW.Big5.json +21 -9
  147. umap/static/umap/locale/zh_TW.js +243 -234
  148. umap/static/umap/locale/zh_TW.json +21 -9
  149. umap/static/umap/map.css +124 -264
  150. umap/static/umap/test/DataLayer.js +463 -0
  151. umap/static/umap/test/Feature.js +0 -226
  152. umap/static/umap/test/TableEditor.js +104 -0
  153. umap/static/umap/test/Util.js +0 -521
  154. umap/static/umap/test/index.html +0 -1
  155. umap/static/umap/unittests/URLs.js +1 -1
  156. umap/static/umap/unittests/utils.js +610 -0
  157. umap/static/umap/vars.css +9 -0
  158. umap/static/umap/vendors/dompurify/purify.es.mjs +1525 -0
  159. umap/static/umap/vendors/formbuilder/Leaflet.FormBuilder.js +1 -0
  160. umap/static/umap/vendors/iconlayers/iconLayers.js +1 -1
  161. umap/templates/umap/css.html +2 -0
  162. umap/templates/umap/js.html +0 -1
  163. umap/templates/umap/map_detail.html +4 -0
  164. umap/templates/umap/map_table.html +12 -10
  165. umap/templatetags/umap_tags.py +5 -0
  166. umap/tests/integration/conftest.py +12 -1
  167. umap/tests/integration/test_anonymous_owned_map.py +27 -5
  168. umap/tests/integration/test_basics.py +21 -0
  169. umap/tests/integration/test_browser.py +12 -25
  170. umap/tests/integration/test_choropleth.py +1 -1
  171. umap/tests/integration/test_dashboard.py +10 -0
  172. umap/tests/integration/test_datalayer.py +8 -6
  173. umap/tests/integration/test_edit_datalayer.py +24 -19
  174. umap/tests/integration/test_edit_map.py +189 -2
  175. umap/tests/integration/test_edit_marker.py +120 -0
  176. umap/tests/integration/test_edit_polygon.py +122 -0
  177. umap/tests/integration/test_facets_browser.py +104 -14
  178. umap/tests/integration/test_import.py +72 -20
  179. umap/tests/integration/test_map.py +19 -17
  180. umap/tests/integration/test_map_list.py +28 -0
  181. umap/tests/integration/test_owned_map.py +10 -10
  182. umap/tests/integration/test_picto.py +5 -5
  183. umap/tests/integration/test_querystring.py +9 -15
  184. umap/tests/integration/test_slideshow.py +0 -5
  185. umap/tests/integration/test_statics.py +3 -2
  186. umap/tests/integration/test_tableeditor.py +1 -5
  187. umap/tests/integration/test_tilelayer.py +10 -0
  188. umap/tests/integration/test_view_marker.py +64 -0
  189. umap/tests/integration/test_view_polygon.py +59 -0
  190. umap/tests/integration/test_view_polyline.py +51 -0
  191. umap/tests/test_map_views.py +13 -0
  192. {umap_project-2.1.3.dist-info → umap_project-2.2.0.dist-info}/METADATA +12 -12
  193. {umap_project-2.1.3.dist-info → umap_project-2.2.0.dist-info}/RECORD +198 -182
  194. {umap_project-2.1.3.dist-info → umap_project-2.2.0.dist-info}/WHEEL +1 -1
  195. umap/static/umap/vendors/dompurify/purify.min.js +0 -3
  196. umap/static/umap/vendors/dompurify/purify.min.js.map +0 -1
  197. /umap/tests/integration/{test_polygon.py → test_draw_polygon.py} +0 -0
  198. /umap/tests/integration/{test_polyline.py → test_draw_polyline.py} +0 -0
  199. {umap_project-2.1.3.dist-info → umap_project-2.2.0.dist-info}/entry_points.txt +0 -0
  200. {umap_project-2.1.3.dist-info → umap_project-2.2.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,8 @@
1
1
  import json
2
+ import platform
2
3
  import re
3
4
  from pathlib import Path
5
+ from time import sleep
4
6
 
5
7
  import pytest
6
8
  from playwright.sync_api import expect
@@ -10,11 +12,30 @@ from umap.models import DataLayer
10
12
  pytestmark = pytest.mark.django_db
11
13
 
12
14
 
15
+ def test_layers_list_is_updated(live_server, tilelayer, page):
16
+ page.goto(f"{live_server.url}/map/new/")
17
+ modifier = "Cmd" if platform.system() == "Darwin" else "Ctrl"
18
+ page.get_by_role("link", name=f"Import data ({modifier}+I)").click()
19
+ # Should work
20
+ page.get_by_label("Choose the layer to import").select_option(
21
+ label="Import in a new layer"
22
+ )
23
+ page.get_by_role("link", name="Manage layers").click()
24
+ page.get_by_role("button", name="Add a layer").click()
25
+ page.locator('input[name="name"]').click()
26
+ page.locator('input[name="name"]').fill("foobar")
27
+ page.get_by_role("link", name=f"Import data ({modifier}+I)").click()
28
+ # Should still work
29
+ page.get_by_label("Choose the layer to import").select_option(
30
+ label="Import in a new layer"
31
+ )
32
+ # Now layer should be visible in the options
33
+ page.get_by_label("Choose the layer to import").select_option(label="foobar")
34
+
35
+
13
36
  def test_umap_import_from_file(live_server, tilelayer, page):
14
37
  page.goto(f"{live_server.url}/map/new/")
15
- button = page.get_by_title("Import data")
16
- expect(button).to_be_visible()
17
- button.click()
38
+ page.get_by_title("Import data").click()
18
39
  file_input = page.locator("input[type='file']")
19
40
  with page.expect_file_chooser() as fc_info:
20
41
  file_input.click()
@@ -24,34 +45,38 @@ def test_umap_import_from_file(live_server, tilelayer, page):
24
45
  button = page.get_by_role("button", name="Import", exact=True)
25
46
  expect(button).to_be_visible()
26
47
  button.click()
27
- layers = page.locator(".umap-browse-datalayers li")
28
- expect(layers).to_have_count(2)
29
- nonloaded = page.locator(".umap-browse-datalayers li.off")
30
- expect(nonloaded).to_have_count(1)
31
48
  assert file_input.input_value()
32
49
  # Close the import panel
33
50
  page.keyboard.press("Escape")
51
+ # Reopen
52
+ page.get_by_title("Import data").click()
53
+ sleep(1) # Wait for CSS transition to happen
34
54
  assert not file_input.input_value()
35
55
  expect(page.locator(".umap-main-edit-toolbox .map-name")).to_have_text(
36
56
  "Carte sans nom"
37
57
  )
58
+ page.get_by_title("See layers").click()
59
+ layers = page.locator(".umap-browser .datalayer")
60
+ expect(layers).to_have_count(2)
61
+ nonloaded = page.locator(".umap-browser .datalayer.off")
62
+ expect(nonloaded).to_have_count(1)
38
63
 
39
64
 
40
65
  def test_umap_import_from_textarea(live_server, tilelayer, page, settings):
41
66
  settings.UMAP_ALLOW_ANONYMOUS = True
42
67
  page.goto(f"{live_server.url}/map/new/")
68
+ page.get_by_role("button", name="See layers").click()
43
69
  page.get_by_title("Import data").click()
44
70
  textarea = page.locator(".umap-upload textarea")
45
71
  path = Path(__file__).parent.parent / "fixtures/test_upload_data.umap"
46
72
  textarea.fill(path.read_text())
47
73
  page.locator('select[name="format"]').select_option("umap")
48
74
  page.get_by_role("button", name="Import", exact=True).click()
49
- layers = page.locator(".umap-browse-datalayers li")
75
+ layers = page.locator(".umap-browser .datalayer")
50
76
  expect(layers).to_have_count(2)
51
77
  expect(page.locator(".umap-main-edit-toolbox .map-name")).to_have_text(
52
78
  "Imported map"
53
79
  )
54
- page.get_by_role("button", name="See data layers").click()
55
80
  expect(page.get_by_text("Tunnels")).to_be_visible()
56
81
  expect(page.get_by_text("Cities")).to_be_visible()
57
82
  expect(page.locator(".leaflet-control-minimap")).to_be_visible()
@@ -67,7 +92,8 @@ def test_umap_import_from_textarea(live_server, tilelayer, page, settings):
67
92
 
68
93
  def test_import_geojson_from_textarea(tilelayer, live_server, page):
69
94
  page.goto(f"{live_server.url}/map/new/")
70
- layers = page.locator(".umap-browse-datalayers li")
95
+ page.get_by_title("See layers").click()
96
+ layers = page.locator(".umap-browser .datalayer")
71
97
  markers = page.locator(".leaflet-marker-icon")
72
98
  paths = page.locator("path")
73
99
  expect(markers).to_have_count(0)
@@ -91,7 +117,8 @@ def test_import_geojson_from_textarea(tilelayer, live_server, page):
91
117
 
92
118
  def test_import_kml_from_textarea(tilelayer, live_server, page):
93
119
  page.goto(f"{live_server.url}/map/new/")
94
- layers = page.locator(".umap-browse-datalayers li")
120
+ page.get_by_title("See layers").click()
121
+ layers = page.locator(".umap-browser .datalayer")
95
122
  markers = page.locator(".leaflet-marker-icon")
96
123
  paths = page.locator("path")
97
124
  expect(markers).to_have_count(0)
@@ -115,7 +142,8 @@ def test_import_kml_from_textarea(tilelayer, live_server, page):
115
142
 
116
143
  def test_import_gpx_from_textarea(tilelayer, live_server, page):
117
144
  page.goto(f"{live_server.url}/map/new/")
118
- layers = page.locator(".umap-browse-datalayers li")
145
+ page.get_by_title("See layers").click()
146
+ layers = page.locator(".umap-browser .datalayer")
119
147
  markers = page.locator(".leaflet-marker-icon")
120
148
  paths = page.locator("path")
121
149
  expect(markers).to_have_count(0)
@@ -139,7 +167,8 @@ def test_import_gpx_from_textarea(tilelayer, live_server, page):
139
167
 
140
168
  def test_import_osm_from_textarea(tilelayer, live_server, page):
141
169
  page.goto(f"{live_server.url}/map/new/")
142
- layers = page.locator(".umap-browse-datalayers li")
170
+ page.get_by_title("See layers").click()
171
+ layers = page.locator(".umap-browser .datalayer")
143
172
  markers = page.locator(".leaflet-marker-icon")
144
173
  expect(markers).to_have_count(0)
145
174
  expect(layers).to_have_count(0)
@@ -158,7 +187,8 @@ def test_import_osm_from_textarea(tilelayer, live_server, page):
158
187
 
159
188
  def test_import_csv_from_textarea(tilelayer, live_server, page):
160
189
  page.goto(f"{live_server.url}/map/new/")
161
- layers = page.locator(".umap-browse-datalayers li")
190
+ page.get_by_title("See layers").click()
191
+ layers = page.locator(".umap-browser .datalayer")
162
192
  markers = page.locator(".leaflet-marker-icon")
163
193
  expect(markers).to_have_count(0)
164
194
  expect(layers).to_have_count(0)
@@ -177,7 +207,8 @@ def test_import_csv_from_textarea(tilelayer, live_server, page):
177
207
 
178
208
  def test_can_import_in_existing_datalayer(live_server, datalayer, page, openmap):
179
209
  page.goto(f"{live_server.url}{openmap.get_absolute_url()}")
180
- layers = page.locator(".umap-browse-datalayers li")
210
+ page.get_by_title("See layers").click()
211
+ layers = page.locator(".umap-browser .datalayer")
181
212
  markers = page.locator(".leaflet-marker-icon")
182
213
  expect(markers).to_have_count(1)
183
214
  expect(layers).to_have_count(1)
@@ -195,7 +226,8 @@ def test_can_import_in_existing_datalayer(live_server, datalayer, page, openmap)
195
226
 
196
227
  def test_can_replace_datalayer_data(live_server, datalayer, page, openmap):
197
228
  page.goto(f"{live_server.url}{openmap.get_absolute_url()}")
198
- layers = page.locator(".umap-browse-datalayers li")
229
+ page.get_by_title("See layers").click()
230
+ layers = page.locator(".umap-browser .datalayer")
199
231
  markers = page.locator(".leaflet-marker-icon")
200
232
  expect(markers).to_have_count(1)
201
233
  expect(layers).to_have_count(1)
@@ -214,7 +246,8 @@ def test_can_replace_datalayer_data(live_server, datalayer, page, openmap):
214
246
 
215
247
  def test_can_import_in_new_datalayer(live_server, datalayer, page, openmap):
216
248
  page.goto(f"{live_server.url}{openmap.get_absolute_url()}")
217
- layers = page.locator(".umap-browse-datalayers li")
249
+ page.get_by_title("See layers").click()
250
+ layers = page.locator(".umap-browser .datalayer")
218
251
  markers = page.locator(".leaflet-marker-icon")
219
252
  expect(markers).to_have_count(1)
220
253
  expect(layers).to_have_count(1)
@@ -317,7 +350,8 @@ def test_import_geometry_collection(live_server, page, tilelayer):
317
350
  ],
318
351
  }
319
352
  page.goto(f"{live_server.url}/map/new/")
320
- layers = page.locator(".umap-browse-datalayers li")
353
+ page.get_by_title("See layers").click()
354
+ layers = page.locator(".umap-browser .datalayer")
321
355
  markers = page.locator(".leaflet-marker-icon")
322
356
  paths = page.locator("path")
323
357
  expect(markers).to_have_count(0)
@@ -352,7 +386,8 @@ def test_import_multipolygon(live_server, page, tilelayer):
352
386
  },
353
387
  }
354
388
  page.goto(f"{live_server.url}/map/new/")
355
- layers = page.locator(".umap-browse-datalayers li")
389
+ page.get_by_title("See layers").click()
390
+ layers = page.locator(".umap-browser .datalayer")
356
391
  paths = page.locator("path")
357
392
  expect(paths).to_have_count(0)
358
393
  expect(layers).to_have_count(0)
@@ -383,7 +418,8 @@ def test_import_multipolyline(live_server, page, tilelayer):
383
418
  ],
384
419
  }
385
420
  page.goto(f"{live_server.url}/map/new/")
386
- layers = page.locator(".umap-browse-datalayers li")
421
+ page.get_by_title("See layers").click()
422
+ layers = page.locator(".umap-browser .datalayer")
387
423
  paths = page.locator("path")
388
424
  expect(paths).to_have_count(0)
389
425
  expect(layers).to_have_count(0)
@@ -397,3 +433,19 @@ def test_import_multipolyline(live_server, page, tilelayer):
397
433
  # A layer has been created
398
434
  expect(layers).to_have_count(1)
399
435
  expect(paths).to_have_count(1)
436
+
437
+
438
+ def test_import_csv_without_valid_latlon_headers(tilelayer, live_server, page):
439
+ page.goto(f"{live_server.url}/map/new/")
440
+ page.get_by_title("See layers").click()
441
+ layers = page.locator(".umap-browser .datalayer")
442
+ markers = page.locator(".leaflet-marker-icon")
443
+ page.get_by_title("Import data").click()
444
+ textarea = page.locator(".umap-upload textarea")
445
+ textarea.fill("a,b,c\n12.23,48.34,mypoint\n12.23,48.34,mypoint2")
446
+ page.locator('select[name="format"]').select_option("csv")
447
+ page.get_by_role("button", name="Import", exact=True).click()
448
+ # FIXME do not create a layer
449
+ expect(layers).to_have_count(1)
450
+ expect(markers).to_have_count(0)
451
+ expect(page.locator(".umap-alert")).to_be_visible()
@@ -42,10 +42,10 @@ def test_default_view_without_datalayer_should_use_default_center(
42
42
  ):
43
43
  datalayer.settings["displayOnLoad"] = False
44
44
  datalayer.save()
45
- page.goto(f"{live_server.url}{map.get_absolute_url()}")
45
+ page.goto(f"{live_server.url}{map.get_absolute_url()}?onLoadPanel=datalayers")
46
46
  # Hash is defined, so map is initialized
47
47
  expect(page).to_have_url(re.compile(r".*#7/48\..+/13\..+"))
48
- layers = page.locator(".umap-browse-datalayers li")
48
+ layers = page.locator(".umap-browser .datalayer h5")
49
49
  expect(layers).to_have_count(1)
50
50
 
51
51
 
@@ -56,10 +56,10 @@ def test_default_view_latest_without_datalayer_should_use_default_center(
56
56
  datalayer.save()
57
57
  map.settings["properties"]["defaultView"] = "latest"
58
58
  map.save()
59
- page.goto(f"{live_server.url}{map.get_absolute_url()}")
59
+ page.goto(f"{live_server.url}{map.get_absolute_url()}?onLoadPanel=datalayers")
60
60
  # Hash is defined, so map is initialized
61
61
  expect(page).to_have_url(re.compile(r".*#7/48\..+/13\..+"))
62
- layers = page.locator(".umap-browse-datalayers li")
62
+ layers = page.locator(".umap-browser .datalayer h5")
63
63
  expect(layers).to_have_count(1)
64
64
 
65
65
 
@@ -70,21 +70,22 @@ def test_default_view_data_without_datalayer_should_use_default_center(
70
70
  datalayer.save()
71
71
  map.settings["properties"]["defaultView"] = "data"
72
72
  map.save()
73
- page.goto(f"{live_server.url}{map.get_absolute_url()}")
73
+ page.goto(f"{live_server.url}{map.get_absolute_url()}?onLoadPanel=datalayers")
74
74
  # Hash is defined, so map is initialized
75
75
  expect(page).to_have_url(re.compile(r".*#7/48\..+/13\..+"))
76
- layers = page.locator(".umap-browse-datalayers li")
76
+ layers = page.locator(".umap-browser .datalayer h5")
77
77
  expect(layers).to_have_count(1)
78
78
 
79
79
 
80
80
  def test_default_view_latest_with_marker(map, live_server, datalayer, page):
81
81
  map.settings["properties"]["defaultView"] = "latest"
82
82
  map.save()
83
- page.goto(f"{live_server.url}{map.get_absolute_url()}")
83
+ page.goto(f"{live_server.url}{map.get_absolute_url()}?onLoadPanel=datalayers")
84
84
  # Hash is defined, so map is initialized
85
85
  expect(page).to_have_url(re.compile(r".*#7/48\..+/14\..+"))
86
- layers = page.locator(".umap-browse-datalayers li")
86
+ layers = page.locator(".umap-browser .datalayer h5")
87
87
  expect(layers).to_have_count(1)
88
+ expect(page.locator(".leaflet-popup")).to_be_visible()
88
89
 
89
90
 
90
91
  def test_default_view_latest_with_line(map, live_server, page):
@@ -109,9 +110,9 @@ def test_default_view_latest_with_line(map, live_server, page):
109
110
  DataLayerFactory(map=map, data=data)
110
111
  map.settings["properties"]["defaultView"] = "latest"
111
112
  map.save()
112
- page.goto(f"{live_server.url}{map.get_absolute_url()}")
113
+ page.goto(f"{live_server.url}{map.get_absolute_url()}?onLoadPanel=datalayers")
113
114
  expect(page).to_have_url(re.compile(r".*#8/48\..+/2\..+"))
114
- layers = page.locator(".umap-browse-datalayers li")
115
+ layers = page.locator(".umap-browser .datalayer h5")
115
116
  expect(layers).to_have_count(1)
116
117
 
117
118
 
@@ -140,9 +141,9 @@ def test_default_view_latest_with_polygon(map, live_server, page):
140
141
  DataLayerFactory(map=map, data=data)
141
142
  map.settings["properties"]["defaultView"] = "latest"
142
143
  map.save()
143
- page.goto(f"{live_server.url}{map.get_absolute_url()}")
144
+ page.goto(f"{live_server.url}{map.get_absolute_url()}?onLoadPanel=datalayers")
144
145
  expect(page).to_have_url(re.compile(r".*#8/48\..+/2\..+"))
145
- layers = page.locator(".umap-browse-datalayers li")
146
+ layers = page.locator(".umap-browser .datalayer h5")
146
147
  expect(layers).to_have_count(1)
147
148
 
148
149
 
@@ -168,10 +169,10 @@ def test_remote_layer_should_not_be_used_as_datalayer_for_created_features(
168
169
  }
169
170
  datalayer.save()
170
171
  page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit")
171
- toggle = page.get_by_role("button", name="See data layers")
172
+ toggle = page.get_by_role("button", name="See layers")
172
173
  expect(toggle).to_be_visible()
173
174
  toggle.click()
174
- layers = page.locator(".umap-browse-datalayers li")
175
+ layers = page.locator(".umap-browser .datalayer h5")
175
176
  expect(layers).to_have_count(1)
176
177
  map_el = page.locator("#map")
177
178
  add_marker = page.get_by_title("Draw a marker")
@@ -179,10 +180,11 @@ def test_remote_layer_should_not_be_used_as_datalayer_for_created_features(
179
180
  marker = page.locator(".leaflet-marker-icon")
180
181
  expect(marker).to_have_count(0)
181
182
  add_marker.click()
182
- map_el.click(position={"x": 100, "y": 100})
183
+ map_el.click(position={"x": 500, "y": 100})
183
184
  expect(marker).to_have_count(1)
184
185
  # A new datalayer has been created to host this created feature
185
186
  # given the remote one cannot accept new features
187
+ page.get_by_title("See layers").click()
186
188
  expect(layers).to_have_count(2)
187
189
 
188
190
 
@@ -195,9 +197,9 @@ def test_can_hide_datalayer_from_caption(openmap, live_server, datalayer, page):
195
197
  toggle.click()
196
198
  layers = page.locator(".umap-caption .datalayer-legend")
197
199
  expect(layers).to_have_count(1)
198
- found = page.locator("#umap-ui-container").get_by_text(datalayer.name)
200
+ found = page.locator(".panel.left.on").get_by_text(datalayer.name)
199
201
  expect(found).to_be_visible()
200
- hidden = page.locator("#umap-ui-container").get_by_text(other.name)
202
+ hidden = page.locator(".panel.left.on").get_by_text(other.name)
201
203
  expect(hidden).to_be_hidden()
202
204
 
203
205
 
@@ -0,0 +1,28 @@
1
+ import pytest
2
+ from playwright.sync_api import expect
3
+
4
+ pytestmark = pytest.mark.django_db
5
+
6
+
7
+ def test_should_not_render_any_control(live_server, tilelayer, page, map):
8
+ map.settings["properties"]["onLoadPanel"] = "databrowser"
9
+ map.settings["properties"]["miniMap"] = True
10
+ map.settings["properties"]["captionBar"] = True
11
+ map.save()
12
+ # Make sure those controls are visible in normal view
13
+ page.goto(f"{live_server.url}{map.get_absolute_url()}")
14
+ expect(page.locator(".leaflet-control-minimap")).to_be_visible()
15
+ expect(page.locator(".umap-browser")).to_be_visible()
16
+ expect(page.locator(".umap-caption-bar")).to_be_visible()
17
+ expect(page.locator(".leaflet-control-zoom")).to_be_visible()
18
+ expect(page.locator(".leaflet-control-attribution")).to_be_visible()
19
+
20
+ # Now load home page to have the list view
21
+ page.goto(live_server.url)
22
+ map_el = page.locator(".map_fragment")
23
+ expect(map_el).to_be_visible()
24
+ expect(map_el.locator(".leaflet-control-minimap")).to_be_hidden()
25
+ expect(map_el.locator(".umap-browser")).to_be_hidden()
26
+ expect(map_el.locator(".umap-caption-bar")).to_be_hidden()
27
+ expect(map_el.locator(".leaflet-control-zoom")).to_be_hidden()
28
+ expect(map_el.locator(".leaflet-control-attribution")).to_be_hidden()
@@ -22,7 +22,7 @@ def test_map_update_with_owner(map, live_server, login):
22
22
  expect(save).to_be_visible()
23
23
  add_marker = page.get_by_title("Draw a marker")
24
24
  expect(add_marker).to_be_visible()
25
- edit_settings = page.get_by_title("Edit map properties")
25
+ edit_settings = page.get_by_title("Map advanced properties")
26
26
  expect(edit_settings).to_be_visible()
27
27
  edit_permissions = page.get_by_title("Update permissions and editors")
28
28
  expect(edit_permissions).to_be_visible()
@@ -49,7 +49,7 @@ def test_map_update_with_anonymous_but_editable_datalayer(
49
49
  enable.click()
50
50
  add_marker = page.get_by_title("Draw a marker")
51
51
  expect(add_marker).to_be_visible()
52
- edit_settings = page.get_by_title("Edit map properties")
52
+ edit_settings = page.get_by_title("Map advanced properties")
53
53
  expect(edit_settings).to_be_hidden()
54
54
  edit_permissions = page.get_by_title("Update permissions and editors")
55
55
  expect(edit_permissions).to_be_hidden()
@@ -97,7 +97,7 @@ def test_map_update_with_editor(map, live_server, login, user):
97
97
  expect(save).to_be_visible()
98
98
  add_marker = page.get_by_title("Draw a marker")
99
99
  expect(add_marker).to_be_visible()
100
- edit_settings = page.get_by_title("Edit map properties")
100
+ edit_settings = page.get_by_title("Map advanced properties")
101
101
  expect(edit_settings).to_be_visible()
102
102
  edit_permissions = page.get_by_title("Update permissions and editors")
103
103
  expect(edit_permissions).to_be_visible()
@@ -126,7 +126,7 @@ def test_permissions_form_with_editor(map, datalayer, live_server, login, user):
126
126
  def test_owner_has_delete_map_button(map, live_server, login):
127
127
  page = login(map.owner)
128
128
  page.goto(f"{live_server.url}{map.get_absolute_url()}?edit")
129
- settings = page.get_by_title("Edit map properties")
129
+ settings = page.get_by_title("Map advanced properties")
130
130
  expect(settings).to_be_visible()
131
131
  settings.click()
132
132
  advanced = page.get_by_text("Advanced actions")
@@ -154,7 +154,7 @@ def test_editor_do_not_have_delete_map_button(map, live_server, login, user):
154
154
  map.save()
155
155
  page = login(user)
156
156
  page.goto(f"{live_server.url}{map.get_absolute_url()}?edit")
157
- settings = page.get_by_title("Edit map properties")
157
+ settings = page.get_by_title("Map advanced properties")
158
158
  expect(settings).to_be_visible()
159
159
  settings.click()
160
160
  advanced = page.get_by_text("Advanced actions")
@@ -187,7 +187,7 @@ def test_can_change_perms_after_create(tilelayer, live_server, login, user):
187
187
  page.goto(f"{live_server.url}/en/map/new")
188
188
  # Create a layer
189
189
  page.get_by_title("Manage layers").click()
190
- page.get_by_role("button", name="Add a layer").click()
190
+ page.get_by_title("Add a layer").click()
191
191
  page.locator("input[name=name]").fill("Layer 1")
192
192
  save = page.get_by_role("button", name="Save")
193
193
  expect(save).to_be_visible()
@@ -236,16 +236,16 @@ def test_can_change_owner(map, live_server, login, user):
236
236
  def test_can_delete_datalayer(live_server, map, login, datalayer):
237
237
  page = login(map.owner)
238
238
  page.goto(f"{live_server.url}{map.get_absolute_url()}?edit")
239
- layers = page.locator(".umap-browse-datalayers li")
239
+ page.get_by_title("See layers").click()
240
+ layers = page.locator(".umap-browser .datalayer")
240
241
  markers = page.locator(".leaflet-marker-icon")
241
242
  expect(layers).to_have_count(1)
242
243
  expect(markers).to_have_count(1)
243
244
  page.get_by_role("link", name="Manage layers").click()
244
245
  page.once("dialog", lambda dialog: dialog.accept())
245
- page.locator("#umap-ui-container").get_by_title("Delete layer").click()
246
+ page.locator(".panel.right").get_by_title("Delete layer").click()
246
247
  with page.expect_response(re.compile(r".*/datalayer/delete/.*")):
247
248
  page.get_by_role("button", name="Save").click()
248
249
  expect(markers).to_have_count(0)
249
250
  # FIXME does not work, resolve to 1 element, even if this command is empty:
250
- # document.querySelectorAll(".umap-browse-datalayers li")
251
- # expect(layers).to_have_count(0)
251
+ expect(layers).to_have_count(0)
@@ -44,7 +44,7 @@ def test_can_change_picto_at_map_level(openmap, live_server, page, pictos):
44
44
  expect(marker).to_have_count(1)
45
45
  # Should have default img
46
46
  expect(marker).to_have_attribute("src", "/static/umap/img/marker.svg")
47
- edit_settings = page.get_by_title("Edit map properties")
47
+ edit_settings = page.get_by_title("Map advanced properties")
48
48
  expect(edit_settings).to_be_visible()
49
49
  edit_settings.click()
50
50
  shape_settings = page.get_by_text("Default shape properties")
@@ -152,7 +152,7 @@ def test_can_use_remote_url_as_picto(openmap, live_server, page, pictos):
152
152
  expect(marker).to_have_count(1)
153
153
  # Should have default img
154
154
  expect(marker).to_have_attribute("src", "/static/umap/img/marker.svg")
155
- edit_settings = page.get_by_title("Edit map properties")
155
+ edit_settings = page.get_by_title("Map advanced properties")
156
156
  expect(edit_settings).to_be_visible()
157
157
  edit_settings.click()
158
158
  shape_settings = page.get_by_text("Default shape properties")
@@ -171,7 +171,7 @@ def test_can_use_remote_url_as_picto(openmap, live_server, page, pictos):
171
171
  input_el.blur()
172
172
  expect(marker).to_have_attribute("src", "https://foo.bar/img.jpg")
173
173
  # Now close and reopen the form, it should still be the URL tab
174
- close = page.locator("#umap-ui-container .toolbox").get_by_title("Close")
174
+ close = page.locator(".panel.right.on .toolbox").get_by_title("Close")
175
175
  expect(close).to_be_visible()
176
176
  close.click()
177
177
  edit_settings.click()
@@ -191,7 +191,7 @@ def test_can_use_char_as_picto(openmap, live_server, page, pictos):
191
191
  marker = page.locator(".umap-div-icon span")
192
192
  # Should have default img, so not a span
193
193
  expect(marker).to_have_count(0)
194
- edit_settings = page.get_by_title("Edit map properties")
194
+ edit_settings = page.get_by_title("Map advanced properties")
195
195
  expect(edit_settings).to_be_visible()
196
196
  edit_settings.click()
197
197
  shape_settings = page.get_by_text("Default shape properties")
@@ -210,7 +210,7 @@ def test_can_use_char_as_picto(openmap, live_server, page, pictos):
210
210
  expect(marker).to_have_count(1)
211
211
  expect(marker).to_have_text("♩")
212
212
  # Now close and reopen the form, it should still be the URL tab
213
- close = page.locator("#umap-ui-container .toolbox").get_by_title("Close")
213
+ close = page.locator(".panel.right.on .toolbox").get_by_title("Close")
214
214
  expect(close).to_be_visible()
215
215
  close.click()
216
216
  edit_settings.click()
@@ -15,30 +15,24 @@ def test_scale_control(map, live_server, datalayer, page):
15
15
 
16
16
 
17
17
  def test_datalayers_control(map, live_server, datalayer, page):
18
- control = page.locator(".umap-browse-toggle")
19
- box = page.locator(".umap-browse-datalayers")
20
- more = page.get_by_title("More controls")
18
+ control = page.locator(".umap-control-browse")
19
+ browser = page.locator(".umap-browser")
21
20
  page.goto(f"{live_server.url}{map.get_absolute_url()}")
22
21
  expect(control).to_be_visible()
23
- expect(box).to_be_hidden()
22
+ expect(browser).to_be_hidden()
24
23
  page.goto(f"{live_server.url}{map.get_absolute_url()}?datalayersControl=true")
25
24
  expect(control).to_be_visible()
26
- expect(box).to_be_hidden()
25
+ expect(browser).to_be_hidden()
27
26
  page.goto(f"{live_server.url}{map.get_absolute_url()}?datalayersControl=null")
28
27
  expect(control).to_be_hidden()
29
- expect(more).to_be_visible()
30
- more.click()
31
- expect(control).to_be_visible()
32
- expect(box).to_be_hidden()
28
+ expect(browser).to_be_hidden()
33
29
  page.goto(f"{live_server.url}{map.get_absolute_url()}?datalayersControl=false")
34
30
  expect(control).to_be_hidden()
35
- expect(more).to_be_visible()
36
- more.click()
37
- expect(control).to_be_hidden()
38
- expect(box).to_be_hidden()
31
+ expect(browser).to_be_hidden()
32
+ # Retrocompat
39
33
  page.goto(f"{live_server.url}{map.get_absolute_url()}?datalayersControl=expanded")
40
- expect(control).to_be_hidden()
41
- expect(box).to_be_visible()
34
+ expect(control).to_be_visible()
35
+ expect(browser).to_be_visible()
42
36
 
43
37
 
44
38
  def test_can_deactivate_wheel_from_query_string(map, live_server, page):
@@ -1,11 +1,6 @@
1
- from pathlib import Path
2
-
3
1
  import pytest
4
- from django.core.files.base import ContentFile
5
2
  from playwright.sync_api import expect
6
3
 
7
- from umap.models import Map, Pictogram
8
-
9
4
  from ..base import DataLayerFactory
10
5
 
11
6
  pytestmark = pytest.mark.django_db
@@ -40,7 +40,8 @@ def test_javascript_have_been_loaded(
40
40
  expect(page).to_have_url(re.compile(r".*#7/48\..+/13\..+"))
41
41
  expect(page).to_have_url(re.compile(r".*/fr/"))
42
42
  # Should be in French, so hashed locale file has been loaded correctly
43
- button = page.get_by_text("Voir les calques")
43
+ button = page.get_by_role("button", name="Voir les calques")
44
44
  expect(button).to_be_visible()
45
- layers = page.locator(".umap-browse-datalayers li")
45
+ button.click()
46
+ layers = page.locator(".umap-browser .datalayer")
46
47
  expect(layers).to_have_count(1)
@@ -2,17 +2,13 @@ import json
2
2
  import re
3
3
  from pathlib import Path
4
4
 
5
- from playwright.sync_api import expect
6
-
7
5
  from umap.models import DataLayer
8
6
 
9
7
 
10
8
  def test_table_editor(live_server, openmap, datalayer, page):
11
9
  page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit")
12
10
  page.get_by_role("link", name="Manage layers").click()
13
- page.locator("#umap-ui-container").get_by_title(
14
- "Edit properties in a table"
15
- ).click()
11
+ page.locator(".panel").get_by_title("Edit properties in a table").click()
16
12
  page.once("dialog", lambda dialog: dialog.accept(prompt_text="newprop"))
17
13
  page.get_by_text("Add a new property").click()
18
14
  page.locator('input[name="newprop"]').fill("newvalue")
@@ -112,3 +112,13 @@ def test_map_should_display_custom_tilelayer(map, live_server, tilelayers, page)
112
112
  iconTiles = page.locator(".leaflet-iconLayers .leaflet-iconLayers-layer")
113
113
  # The second of the list should be the current
114
114
  expect(iconTiles.nth(1)).to_have_css("background-image", url_pattern)
115
+
116
+
117
+ def test_can_have_smart_text_in_attribution(tilelayer, map, live_server, page):
118
+ map.settings["properties"]["tilelayer"]["attribution"] = (
119
+ "© [[http://www.openstreetmap.org/copyright|OpenStreetMap]] contributors"
120
+ )
121
+ map.save()
122
+ page.goto(f"{live_server.url}{map.get_absolute_url()}")
123
+ expect(page.get_by_text("© OpenStreetMap contributors")).to_be_visible()
124
+ expect(page.get_by_role("link", name="OpenStreetMap")).to_be_visible()
@@ -0,0 +1,64 @@
1
+ from copy import deepcopy
2
+
3
+ import pytest
4
+ from playwright.sync_api import expect
5
+
6
+ from ..base import DataLayerFactory
7
+
8
+ pytestmark = pytest.mark.django_db
9
+
10
+ DATALAYER_DATA = {
11
+ "type": "FeatureCollection",
12
+ "features": [
13
+ {
14
+ "type": "Feature",
15
+ "properties": {
16
+ "name": "test marker",
17
+ "description": "Some description",
18
+ },
19
+ "geometry": {
20
+ "type": "Point",
21
+ "coordinates": [14.6889, 48.5529],
22
+ },
23
+ },
24
+ ],
25
+ }
26
+
27
+
28
+ @pytest.fixture
29
+ def bootstrap(map, live_server):
30
+ DataLayerFactory(map=map, data=DATALAYER_DATA)
31
+
32
+
33
+ def test_should_open_popup_on_click(live_server, map, page, bootstrap):
34
+ page.goto(f"{live_server.url}{map.get_absolute_url()}")
35
+ expect(page.locator(".umap-icon-active")).to_be_hidden()
36
+ page.locator(".leaflet-marker-icon").click()
37
+ expect(page.locator(".umap-icon-active")).to_be_visible()
38
+ expect(page.locator(".leaflet-popup-content-wrapper")).to_be_visible()
39
+ expect(page.get_by_role("heading", name="test marker")).to_be_visible()
40
+ expect(page.get_by_text("Some description")).to_be_visible()
41
+ # Close popup
42
+ page.locator("#map").click()
43
+ expect(page.locator(".umap-icon-active")).to_be_hidden()
44
+
45
+
46
+ def test_should_handle_locale_var_in_description(live_server, map, page):
47
+ data = deepcopy(DATALAYER_DATA)
48
+ data["features"][0]["properties"]["description"] = (
49
+ "this is a link to [[https://domain.org/?locale={locale}|Wikipedia]]"
50
+ )
51
+ DataLayerFactory(map=map, data=data)
52
+ page.goto(f"{live_server.url}{map.get_absolute_url()}")
53
+ page.locator(".leaflet-marker-icon").click()
54
+ link = page.get_by_role("link", name="Wikipedia")
55
+ expect(link).to_be_visible()
56
+ expect(link).to_have_attribute("href", "https://domain.org/?locale=en")
57
+
58
+
59
+ def test_should_display_tooltip_with_variable(live_server, map, page, bootstrap):
60
+ map.settings["properties"]["showLabel"] = True
61
+ map.settings["properties"]["labelKey"] = "Foo {name}"
62
+ map.save()
63
+ page.goto(f"{live_server.url}{map.get_absolute_url()}")
64
+ expect(page.get_by_text("Foo test marker")).to_be_visible()