umap-project 2.6.0b1__py3-none-any.whl → 2.6.1__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 (38) hide show
  1. umap/__init__.py +1 -1
  2. umap/decorators.py +2 -3
  3. umap/locale/fa_IR/LC_MESSAGES/django.mo +0 -0
  4. umap/locale/fa_IR/LC_MESSAGES/django.po +9 -9
  5. umap/locale/hu/LC_MESSAGES/django.mo +0 -0
  6. umap/locale/hu/LC_MESSAGES/django.po +18 -18
  7. umap/models.py +29 -16
  8. umap/static/umap/js/modules/data/features.js +10 -5
  9. umap/static/umap/js/modules/data/layer.js +1 -1
  10. umap/static/umap/js/modules/rendering/ui.js +25 -4
  11. umap/static/umap/js/modules/rules.js +16 -3
  12. umap/static/umap/locale/en.js +3 -1
  13. umap/static/umap/locale/en.json +3 -1
  14. umap/static/umap/locale/eu.js +8 -6
  15. umap/static/umap/locale/eu.json +8 -6
  16. umap/static/umap/locale/fa_IR.js +14 -12
  17. umap/static/umap/locale/fa_IR.json +14 -12
  18. umap/static/umap/locale/fr.js +3 -1
  19. umap/static/umap/locale/fr.json +3 -1
  20. umap/static/umap/locale/hu.js +14 -12
  21. umap/static/umap/locale/hu.json +14 -12
  22. umap/static/umap/map.css +2 -2
  23. umap/static/umap/vars.css +1 -0
  24. umap/static/umap/vendors/editable/Leaflet.Editable.js +2079 -1937
  25. umap/static/umap/vendors/markercluster/MarkerCluster.Default.css +1 -1
  26. umap/templatetags/umap_tags.py +1 -1
  27. umap/tests/conftest.py +5 -0
  28. umap/tests/integration/test_browser.py +20 -0
  29. umap/tests/integration/test_conditional_rules.py +102 -17
  30. umap/tests/integration/test_draw_polygon.py +28 -0
  31. umap/tests/test_datalayer.py +63 -33
  32. umap/tests/test_map.py +30 -21
  33. umap/views.py +11 -19
  34. {umap_project-2.6.0b1.dist-info → umap_project-2.6.1.dist-info}/METADATA +6 -6
  35. {umap_project-2.6.0b1.dist-info → umap_project-2.6.1.dist-info}/RECORD +38 -38
  36. {umap_project-2.6.0b1.dist-info → umap_project-2.6.1.dist-info}/WHEEL +0 -0
  37. {umap_project-2.6.0b1.dist-info → umap_project-2.6.1.dist-info}/entry_points.txt +0 -0
  38. {umap_project-2.6.0b1.dist-info → umap_project-2.6.1.dist-info}/licenses/LICENSE +0 -0
@@ -57,4 +57,4 @@
57
57
  }
58
58
  .marker-cluster span {
59
59
  line-height: 30px;
60
- }
60
+ }
@@ -45,7 +45,7 @@ def tilelayer_preview(tilelayer):
45
45
 
46
46
  @register.filter
47
47
  def can_delete_map(map, request):
48
- return map.can_delete(request.user, request)
48
+ return map.can_delete(request)
49
49
 
50
50
 
51
51
  @register.filter
umap/tests/conftest.py CHANGED
@@ -90,3 +90,8 @@ def datalayer(map):
90
90
  @pytest.fixture
91
91
  def tilelayer():
92
92
  return TileLayerFactory()
93
+
94
+
95
+ @pytest.fixture
96
+ def fake_request(rf):
97
+ return rf.get("/")
@@ -176,6 +176,26 @@ def test_filter_works_with_variable_in_labelKey(live_server, page, map):
176
176
  expect(paths).to_have_count(1) # Only polygon
177
177
 
178
178
 
179
+ def test_filter_works_with_missing_name(live_server, page, map):
180
+ map.settings["properties"]["onLoadPanel"] = "databrowser"
181
+ map.save()
182
+ data = deepcopy(DATALAYER_DATA)
183
+ del data["features"][0]["properties"]["name"]
184
+ DataLayerFactory(map=map, data=data, name="foobar")
185
+ page.goto(f"{live_server.url}{map.get_absolute_url()}")
186
+ expect(page.get_by_title("Features in this layer: 3")).to_be_visible()
187
+ markers = page.locator(".leaflet-marker-icon")
188
+ paths = page.locator(".leaflet-overlay-pane path")
189
+ expect(markers).to_have_count(1)
190
+ expect(paths).to_have_count(2)
191
+ page.locator(".filters summary").click()
192
+ filter_ = page.locator("input[name='filter']")
193
+ expect(filter_).to_be_visible()
194
+ filter_.type("foob")
195
+ expect(markers).to_have_count(1)
196
+ expect(paths).to_have_count(0)
197
+
198
+
179
199
  def test_data_browser_can_show_only_visible_features(live_server, page, bootstrap, map):
180
200
  # Zoom on France
181
201
  page.goto(f"{live_server.url}{map.get_absolute_url()}#6/51.000/2.000")
@@ -24,6 +24,7 @@ DATALAYER_DATA1 = {
24
24
  "mynumber": 10,
25
25
  "myboolean": True,
26
26
  "mydate": "2024/04/14 12:19:17",
27
+ "maybeempty": "not empty",
27
28
  },
28
29
  "geometry": {"type": "Point", "coordinates": [0.065918, 48.385442]},
29
30
  },
@@ -35,6 +36,7 @@ DATALAYER_DATA1 = {
35
36
  "mynumber": 12,
36
37
  "myboolean": False,
37
38
  "mydate": "2024/03/13 12:20:20",
39
+ "maybeempty": "",
38
40
  },
39
41
  "geometry": {"type": "Point", "coordinates": [3.55957, 49.767074]},
40
42
  },
@@ -56,6 +58,7 @@ DATALAYER_DATA2 = {
56
58
  "mynumber": 10,
57
59
  "myboolean": "true",
58
60
  "mydate": "2024/08/18 13:14:15",
61
+ "maybeempty": None,
59
62
  },
60
63
  "geometry": {"type": "Point", "coordinates": [0.856934, 45.290347]},
61
64
  },
@@ -69,6 +72,18 @@ DATALAYER_DATA2 = {
69
72
  },
70
73
  "geometry": {"type": "Point", "coordinates": [4.372559, 47.945786]},
71
74
  },
75
+ {
76
+ "type": "Feature",
77
+ "properties": {
78
+ "mytype": "odd",
79
+ "name": "Point 5",
80
+ "mynumber": 10,
81
+ "mydate": "2024-04-14T10:19:17.000Z",
82
+ "myboolean": "notaboolean",
83
+ "maybeempty": "foo",
84
+ },
85
+ "geometry": {"type": "Point", "coordinates": [4.1, 47.3]},
86
+ },
72
87
  ],
73
88
  "_umap_options": {
74
89
  "name": "Calque 2",
@@ -85,9 +100,9 @@ def test_simple_equal_rule_at_load(live_server, page, map):
85
100
  DataLayerFactory(map=map, data=DATALAYER_DATA2)
86
101
  page.goto(f"{live_server.url}{map.get_absolute_url()}#6/48.948/1.670")
87
102
  markers = page.locator(".leaflet-marker-icon .icon_container")
88
- expect(markers).to_have_count(4)
103
+ expect(markers).to_have_count(5)
89
104
  colors = getColors(markers)
90
- assert colors.count("rgb(240, 248, 255)") == 2
105
+ assert colors.count("rgb(240, 248, 255)") == 3
91
106
 
92
107
 
93
108
  def test_simple_not_equal_rule_at_load(live_server, page, map):
@@ -99,9 +114,9 @@ def test_simple_not_equal_rule_at_load(live_server, page, map):
99
114
  DataLayerFactory(map=map, data=DATALAYER_DATA2)
100
115
  page.goto(f"{live_server.url}{map.get_absolute_url()}#6/48.948/1.670")
101
116
  markers = page.locator(".leaflet-marker-icon .icon_container")
102
- expect(markers).to_have_count(4)
117
+ expect(markers).to_have_count(5)
103
118
  colors = getColors(markers)
104
- assert colors.count("rgb(240, 248, 255)") == 2
119
+ assert colors.count("rgb(240, 248, 255)") == 3
105
120
 
106
121
 
107
122
  def test_gt_rule_with_number_at_load(live_server, page, map):
@@ -113,7 +128,7 @@ def test_gt_rule_with_number_at_load(live_server, page, map):
113
128
  DataLayerFactory(map=map, data=DATALAYER_DATA2)
114
129
  page.goto(f"{live_server.url}{map.get_absolute_url()}#6/48.948/1.670")
115
130
  markers = page.locator(".leaflet-marker-icon .icon_container")
116
- expect(markers).to_have_count(4)
131
+ expect(markers).to_have_count(5)
117
132
  colors = getColors(markers)
118
133
  assert colors.count("rgb(240, 248, 255)") == 2
119
134
 
@@ -127,9 +142,9 @@ def test_lt_rule_with_number_at_load(live_server, page, map):
127
142
  DataLayerFactory(map=map, data=DATALAYER_DATA2)
128
143
  page.goto(f"{live_server.url}{map.get_absolute_url()}#6/48.948/1.670")
129
144
  markers = page.locator(".leaflet-marker-icon .icon_container")
130
- expect(markers).to_have_count(4)
145
+ expect(markers).to_have_count(5)
131
146
  colors = getColors(markers)
132
- assert colors.count("rgb(240, 248, 255)") == 3
147
+ assert colors.count("rgb(240, 248, 255)") == 4
133
148
 
134
149
 
135
150
  def test_lt_rule_with_float_at_load(live_server, page, map):
@@ -141,9 +156,9 @@ def test_lt_rule_with_float_at_load(live_server, page, map):
141
156
  DataLayerFactory(map=map, data=DATALAYER_DATA2)
142
157
  page.goto(f"{live_server.url}{map.get_absolute_url()}#6/48.948/1.670")
143
158
  markers = page.locator(".leaflet-marker-icon .icon_container")
144
- expect(markers).to_have_count(4)
159
+ expect(markers).to_have_count(5)
145
160
  colors = getColors(markers)
146
- assert colors.count("rgb(240, 248, 255)") == 3
161
+ assert colors.count("rgb(240, 248, 255)") == 4
147
162
 
148
163
 
149
164
  def test_equal_rule_with_boolean_at_load(live_server, page, map):
@@ -155,7 +170,77 @@ def test_equal_rule_with_boolean_at_load(live_server, page, map):
155
170
  DataLayerFactory(map=map, data=DATALAYER_DATA2)
156
171
  page.goto(f"{live_server.url}{map.get_absolute_url()}#6/48.948/1.670")
157
172
  markers = page.locator(".leaflet-marker-icon .icon_container")
158
- expect(markers).to_have_count(4)
173
+ expect(markers).to_have_count(5)
174
+ colors = getColors(markers)
175
+ assert colors.count("rgb(240, 248, 255)") == 2
176
+
177
+
178
+ def test_equal_rule_with_boolean_not_true_at_load(live_server, page, map):
179
+ map.settings["properties"]["rules"] = [
180
+ {"condition": "myboolean!=true", "options": {"color": "aliceblue"}}
181
+ ]
182
+ map.save()
183
+ DataLayerFactory(map=map, data=DATALAYER_DATA1)
184
+ DataLayerFactory(map=map, data=DATALAYER_DATA2)
185
+ page.goto(f"{live_server.url}{map.get_absolute_url()}#6/48.948/1.670")
186
+ markers = page.locator(".leaflet-marker-icon .icon_container")
187
+ expect(markers).to_have_count(5)
188
+ colors = getColors(markers)
189
+ assert colors.count("rgb(240, 248, 255)") == 3
190
+
191
+
192
+ def test_equal_rule_with_boolean_false_at_load(live_server, page, map):
193
+ map.settings["properties"]["rules"] = [
194
+ {"condition": "myboolean=false", "options": {"color": "aliceblue"}}
195
+ ]
196
+ map.save()
197
+ DataLayerFactory(map=map, data=DATALAYER_DATA1)
198
+ DataLayerFactory(map=map, data=DATALAYER_DATA2)
199
+ page.goto(f"{live_server.url}{map.get_absolute_url()}#6/48.948/1.670")
200
+ markers = page.locator(".leaflet-marker-icon .icon_container")
201
+ expect(markers).to_have_count(5)
202
+ colors = getColors(markers)
203
+ assert colors.count("rgb(240, 248, 255)") == 1
204
+
205
+
206
+ def test_equal_rule_with_boolean_not_false_at_load(live_server, page, map):
207
+ map.settings["properties"]["rules"] = [
208
+ {"condition": "myboolean!=false", "options": {"color": "aliceblue"}}
209
+ ]
210
+ map.save()
211
+ DataLayerFactory(map=map, data=DATALAYER_DATA1)
212
+ DataLayerFactory(map=map, data=DATALAYER_DATA2)
213
+ page.goto(f"{live_server.url}{map.get_absolute_url()}#6/48.948/1.670")
214
+ markers = page.locator(".leaflet-marker-icon .icon_container")
215
+ expect(markers).to_have_count(5)
216
+ colors = getColors(markers)
217
+ assert colors.count("rgb(240, 248, 255)") == 4
218
+
219
+
220
+ def test_empty_rule_at_load(live_server, page, map):
221
+ map.settings["properties"]["rules"] = [
222
+ {"condition": "maybeempty=", "options": {"color": "aliceblue"}}
223
+ ]
224
+ map.save()
225
+ DataLayerFactory(map=map, data=DATALAYER_DATA1)
226
+ DataLayerFactory(map=map, data=DATALAYER_DATA2)
227
+ page.goto(f"{live_server.url}{map.get_absolute_url()}#6/48.948/1.670")
228
+ markers = page.locator(".leaflet-marker-icon .icon_container")
229
+ expect(markers).to_have_count(5)
230
+ colors = getColors(markers)
231
+ assert colors.count("rgb(240, 248, 255)") == 3
232
+
233
+
234
+ def test_not_empty_rule_at_load(live_server, page, map):
235
+ map.settings["properties"]["rules"] = [
236
+ {"condition": "maybeempty!=", "options": {"color": "aliceblue"}}
237
+ ]
238
+ map.save()
239
+ DataLayerFactory(map=map, data=DATALAYER_DATA1)
240
+ DataLayerFactory(map=map, data=DATALAYER_DATA2)
241
+ page.goto(f"{live_server.url}{map.get_absolute_url()}#6/48.948/1.670")
242
+ markers = page.locator(".leaflet-marker-icon .icon_container")
243
+ expect(markers).to_have_count(5)
159
244
  colors = getColors(markers)
160
245
  assert colors.count("rgb(240, 248, 255)") == 2
161
246
 
@@ -165,7 +250,7 @@ def test_can_create_new_rule(live_server, page, openmap):
165
250
  DataLayerFactory(map=openmap, data=DATALAYER_DATA2)
166
251
  page.goto(f"{live_server.url}{openmap.get_absolute_url()}#6/48.948/1.670")
167
252
  markers = page.locator(".leaflet-marker-icon .icon_container")
168
- expect(markers).to_have_count(4)
253
+ expect(markers).to_have_count(5)
169
254
  page.get_by_role("button", name="Edit").click()
170
255
  page.get_by_role("link", name="Map advanced properties").click()
171
256
  page.get_by_text("Conditional style rules").click()
@@ -175,7 +260,7 @@ def test_can_create_new_rule(live_server, page, openmap):
175
260
  page.locator(".umap-field-color .define").first.click()
176
261
  page.get_by_title("AliceBlue").first.click()
177
262
  colors = getColors(markers)
178
- assert colors.count("rgb(240, 248, 255)") == 2
263
+ assert colors.count("rgb(240, 248, 255)") == 3
179
264
 
180
265
 
181
266
  def test_can_deactive_rule_from_list(live_server, page, openmap):
@@ -187,9 +272,9 @@ def test_can_deactive_rule_from_list(live_server, page, openmap):
187
272
  DataLayerFactory(map=openmap, data=DATALAYER_DATA2)
188
273
  page.goto(f"{live_server.url}{openmap.get_absolute_url()}#6/48.948/1.670")
189
274
  markers = page.locator(".leaflet-marker-icon .icon_container")
190
- expect(markers).to_have_count(4)
275
+ expect(markers).to_have_count(5)
191
276
  colors = getColors(markers)
192
- assert colors.count("rgb(240, 248, 255)") == 2
277
+ assert colors.count("rgb(240, 248, 255)") == 3
193
278
  page.get_by_role("button", name="Edit").click()
194
279
  page.get_by_role("link", name="Map advanced properties").click()
195
280
  page.get_by_text("Conditional style rules").click()
@@ -198,7 +283,7 @@ def test_can_deactive_rule_from_list(live_server, page, openmap):
198
283
  assert colors.count("rgb(240, 248, 255)") == 0
199
284
  page.get_by_role("button", name="Show/hide layer").click()
200
285
  colors = getColors(markers)
201
- assert colors.count("rgb(240, 248, 255)") == 2
286
+ assert colors.count("rgb(240, 248, 255)") == 3
202
287
 
203
288
 
204
289
  def test_autocomplete_datalist(live_server, page, openmap):
@@ -209,9 +294,9 @@ def test_autocomplete_datalist(live_server, page, openmap):
209
294
  page.get_by_role("button", name="Add rule").click()
210
295
  panel = page.locator(".panel.right.on")
211
296
  datalist = panel.locator(".umap-field-condition datalist option")
212
- expect(datalist).to_have_count(5)
297
+ expect(datalist).to_have_count(6)
213
298
  values = {option.inner_text() for option in datalist.all()}
214
- assert values == {"myboolean", "mytype", "mynumber", "mydate", "name"}
299
+ assert values == {"myboolean", "mytype", "mynumber", "mydate", "name", "maybeempty"}
215
300
  page.get_by_placeholder("key=value or key!=value").fill("mytype")
216
301
  expect(datalist).to_have_count(4)
217
302
  values = {option.inner_text() for option in datalist.all()}
@@ -464,3 +464,31 @@ def test_can_draw_a_polygon_and_invert_it(live_server, page, tilelayer, settings
464
464
  # Click elsewhere on the map, it should now show the popup
465
465
  map.click(position={"x": 250, "y": 250})
466
466
  expect(popup).to_be_visible()
467
+
468
+
469
+ def test_vertexmarker_not_shown_if_too_many(live_server, map, page, settings):
470
+ geojson = '{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[3.350602,48.438077],[3.349287,48.438082],[3.34921,48.438124],[3.348519,48.438108],[3.34546,48.437416],[3.343752,48.436955],[3.339092,48.435705],[3.333756,48.434278],[3.330224,48.433336],[3.326293,48.43229],[3.323154,48.430374],[3.32129,48.429238],[3.321234,48.429191],[3.321164,48.429221],[3.320893,48.429117],[3.320766,48.42912],[3.320575,48.429213],[3.320289,48.429303],[3.320042,48.429427],[3.319659,48.429542],[3.319215,48.429622],[3.318547,48.429691],[3.317845,48.429671],[3.317751,48.429698],[3.316503,48.430404],[3.316247,48.430481],[3.316101,48.431152],[3.316181,48.431164],[3.315466,48.432852],[3.315229,48.432981],[3.314785,48.433076],[3.314588,48.432699],[3.314474,48.432376],[3.314197,48.431965],[3.313812,48.431626],[3.313264,48.431253],[3.312393,48.430865],[3.311687,48.43069],[3.311471,48.430693],[3.311199,48.430622],[3.310632,48.430628],[3.30879,48.430373],[3.307032,48.430298],[3.306597,48.430211],[3.306301,48.430213],[3.306137,48.430161],[3.305651,48.430165],[3.304839,48.430046],[3.303726,48.429803],[3.302861,48.42972],[3.302237,48.429635],[3.300559,48.429488],[3.300396,48.429435],[3.299502,48.429335],[3.298528,48.429198],[3.298176,48.429201],[3.296263,48.429039],[3.296267,48.429307],[3.296237,48.429425],[3.295882,48.429848],[3.295665,48.429789],[3.295397,48.430056],[3.295377,48.430132],[3.295186,48.430421],[3.295198,48.430531],[3.295344,48.430735],[3.296077,48.431333],[3.295938,48.431617],[3.29576,48.43168],[3.294082,48.431442],[3.292288,48.431198],[3.292303,48.431101],[3.29082,48.431007],[3.29043,48.430975],[3.290451,48.431129],[3.290115,48.431105],[3.289097,48.430993],[3.289185,48.430805],[3.288545,48.430699],[3.288311,48.430684],[3.287686,48.430687],[3.287456,48.431129],[3.287465,48.43122],[3.288277,48.431574],[3.28896,48.431915],[3.288937,48.431969],[3.289431,48.432499],[3.289672,48.43292],[3.289871,48.433156],[3.29036,48.433602],[3.290557,48.433724],[3.290781,48.433809],[3.291035,48.433857],[3.291537,48.434024],[3.291819,48.434151],[3.292118,48.434341],[3.292479,48.434677],[3.292929,48.435388],[3.293207,48.435792],[3.293881,48.43672],[3.293762,48.436772],[3.294056,48.437209],[3.294117,48.437385],[3.294618,48.437579],[3.294465,48.437764],[3.294424,48.438087],[3.294357,48.438293],[3.293776,48.438817],[3.293308,48.439323],[3.292929,48.439844],[3.292671,48.440235],[3.29233,48.440924],[3.291807,48.441432],[3.29161,48.441661],[3.291402,48.44196],[3.291265,48.442663],[3.291255,48.442806],[3.291328,48.443126],[3.291407,48.443202],[3.291574,48.443473],[3.292253,48.444495],[3.292329,48.444596],[3.293056,48.445276],[3.293138,48.445309],[3.293368,48.445628],[3.293661,48.445985],[3.29374,48.446117],[3.29396,48.446372],[3.294304,48.446627],[3.294761,48.446912],[3.295881,48.447668],[3.295849,48.447688],[3.296837,48.448338],[3.297547,48.44891],[3.297465,48.44892],[3.297188,48.449195],[3.297597,48.449543],[3.297753,48.449701],[3.297845,48.449851],[3.298264,48.450055],[3.298478,48.450121],[3.298946,48.450221],[3.299309,48.450317],[3.299359,48.450237],[3.300493,48.450461],[3.301087,48.450674],[3.301703,48.45101],[3.301995,48.451197],[3.3024,48.451534],[3.302702,48.45174],[3.303329,48.452007],[3.304029,48.452197],[3.304569,48.452446],[3.304803,48.452502],[3.305096,48.452877],[3.30567,48.453409],[3.305998,48.453617],[3.306329,48.453567],[3.306999,48.453359],[3.307147,48.453453],[3.307452,48.453162],[3.307621,48.452853],[3.307637,48.452428],[3.307707,48.452345],[3.307741,48.452152],[3.307605,48.451823],[3.307551,48.45153],[3.307474,48.451395],[3.307218,48.451316],[3.307069,48.45119],[3.307261,48.450528],[3.307483,48.449868],[3.307603,48.449365],[3.30774,48.448909],[3.307598,48.448808],[3.307761,48.448604],[3.307863,48.447956],[3.307886,48.447645],[3.307972,48.447245],[3.308239,48.446362],[3.308306,48.446042],[3.308487,48.445329],[3.308442,48.444844],[3.308479,48.444713],[3.308967,48.443542],[3.309235,48.442927],[3.309464,48.442289],[3.309372,48.442046],[3.309621,48.441616],[3.310152,48.441065],[3.310213,48.440729],[3.310237,48.440329],[3.310167,48.439906],[3.31076,48.439111],[3.31118,48.438009],[3.311161,48.437961],[3.311906,48.437902],[3.312261,48.437839],[3.312486,48.437744],[3.31306,48.437674],[3.312613,48.438361],[3.312487,48.43883],[3.312493,48.439136],[3.312443,48.439388],[3.312598,48.440393],[3.312739,48.440752],[3.312879,48.440985],[3.313263,48.441305],[3.313916,48.441515],[3.314457,48.441565],[3.315105,48.44156],[3.31581,48.441607],[3.317056,48.441849],[3.318361,48.442198],[3.319041,48.442408],[3.319287,48.442604],[3.319343,48.442711],[3.320216,48.443117],[3.320709,48.443437],[3.32126,48.444007],[3.321788,48.444776],[3.322181,48.445618],[3.322479,48.445616],[3.32283,48.445577],[3.323344,48.445663],[3.324048,48.445693],[3.324695,48.445562],[3.324992,48.445559],[3.325558,48.445482],[3.325963,48.445479],[3.327479,48.445592],[3.327939,48.445678],[3.328502,48.445481],[3.328942,48.445392],[3.329169,48.44538],[3.330112,48.445466],[3.330715,48.445575],[3.330881,48.44557],[3.332155,48.445373],[3.33243,48.445375],[3.332727,48.445438],[3.3332,48.445588],[3.333358,48.445683],[3.333737,48.446027],[3.333998,48.446169],[3.334135,48.446334],[3.334611,48.447294],[3.33488,48.447909],[3.334992,48.447959],[3.335297,48.448013],[3.336516,48.448161],[3.336874,48.44825],[3.337258,48.448531],[3.337442,48.448737],[3.337525,48.448936],[3.337649,48.448967],[3.338263,48.448902],[3.33836,48.44894],[3.338765,48.44921],[3.339281,48.449513],[3.339464,48.449515],[3.339877,48.448856],[3.339867,48.448673],[3.340611,48.447311],[3.341744,48.447535],[3.343846,48.447943],[3.345266,48.448152],[3.345478,48.447345],[3.345816,48.446774],[3.345976,48.446809],[3.346142,48.44657],[3.346,48.446493],[3.346043,48.446099],[3.346047,48.445835],[3.346203,48.44558],[3.34717,48.444977],[3.347471,48.444638],[3.347571,48.444466],[3.347583,48.444183],[3.347678,48.443989],[3.348162,48.443428],[3.348326,48.443259],[3.348351,48.443136],[3.34831,48.442736],[3.348141,48.442484],[3.348246,48.442411],[3.348271,48.442293],[3.348097,48.442202],[3.347875,48.442142],[3.347773,48.441997],[3.34751,48.441531],[3.347394,48.441212],[3.349317,48.441364],[3.349478,48.441055],[3.349528,48.44103],[3.350119,48.441039],[3.350252,48.440793],[3.35052,48.440779],[3.350618,48.440612],[3.35069,48.440129],[3.350806,48.43921],[3.350792,48.439037],[3.350698,48.438594],[3.350566,48.438327],[3.350602,48.438077]]]},"properties":{"nom":"Grisy-sur-Seine","code":"77218","codeDepartement":"77","siren":"217702182","codeEpci":"200040251","codeRegion":"11","codesPostaux":["77480"],"population":107},"id":"g0OTg"}'
471
+ settings.UMAP_ALLOW_ANONYMOUS = True
472
+ page.goto(f"{live_server.url}/en/map/new/#15/48.4395/3.3189")
473
+ page.get_by_title("Import data").click()
474
+ page.locator(".umap-upload textarea").fill(geojson)
475
+ page.locator('select[name="format"]').select_option("geojson")
476
+ page.get_by_role("button", name="Import data", exact=True).click()
477
+ page.locator("path").click()
478
+ page.get_by_role("link", name="Toggle edit mode (⇧+Click)").click()
479
+ expect(page.locator("#umap-tooltip-container")).to_contain_text(
480
+ "Please zoom in to edit the geometry"
481
+ )
482
+ expect(page.locator(".leaflet-vertex-icon")).to_be_hidden()
483
+ page.get_by_label("Zoom in").click()
484
+ expect(page.locator("#umap-tooltip-container")).to_contain_text(
485
+ "Please zoom in to edit the geometry"
486
+ )
487
+ page.get_by_label("Zoom in").click()
488
+ page.wait_for_timeout(500)
489
+ page.get_by_label("Zoom out").click()
490
+ page.wait_for_timeout(500)
491
+ expect(page.locator(".leaflet-vertex-icon")).to_be_hidden()
492
+ expect(page.locator("#umap-tooltip-container")).to_contain_text(
493
+ "Please zoom in to edit the geometry"
494
+ )
@@ -1,7 +1,7 @@
1
- import os
2
1
  from pathlib import Path
3
2
 
4
3
  import pytest
4
+ from django.contrib.auth.models import AnonymousUser
5
5
  from django.core.files.base import ContentFile
6
6
 
7
7
  from umap.models import DataLayer, Map
@@ -100,28 +100,33 @@ def test_should_remove_old_versions_on_save(map, settings):
100
100
  assert names == [Path(datalayer.geojson.name).name, newer, medium]
101
101
 
102
102
 
103
- def test_anonymous_cannot_edit_in_editors_mode(datalayer):
103
+ def test_anonymous_cannot_edit_in_editors_mode(datalayer, fake_request):
104
104
  datalayer.edit_status = DataLayer.COLLABORATORS
105
105
  datalayer.save()
106
- assert not datalayer.can_edit()
106
+ fake_request.user = AnonymousUser()
107
+ assert not datalayer.can_edit(fake_request)
107
108
 
108
109
 
109
- def test_owner_can_edit_in_editors_mode(datalayer, user):
110
+ def test_owner_can_edit_in_editors_mode(datalayer, user, fake_request):
110
111
  datalayer.edit_status = DataLayer.COLLABORATORS
111
112
  datalayer.save()
112
- assert datalayer.can_edit(datalayer.map.owner)
113
+ fake_request.user = datalayer.map.owner
114
+ assert datalayer.can_edit(fake_request)
113
115
 
114
116
 
115
- def test_editor_can_edit_in_collaborators_mode(datalayer, user):
117
+ def test_editor_can_edit_in_collaborators_mode(datalayer, user, fake_request):
116
118
  map = datalayer.map
117
119
  map.editors.add(user)
118
120
  map.save()
119
121
  datalayer.edit_status = DataLayer.COLLABORATORS
120
122
  datalayer.save()
121
- assert datalayer.can_edit(user)
123
+ fake_request.user = user
124
+ assert datalayer.can_edit(fake_request)
122
125
 
123
126
 
124
- def test_team_members_can_edit_in_collaborators_mode(datalayer, user, team):
127
+ def test_team_members_can_edit_in_collaborators_mode(
128
+ datalayer, user, team, fake_request
129
+ ):
125
130
  user.teams.add(team)
126
131
  user.save()
127
132
  map = datalayer.map
@@ -129,60 +134,69 @@ def test_team_members_can_edit_in_collaborators_mode(datalayer, user, team):
129
134
  map.save()
130
135
  datalayer.edit_status = DataLayer.COLLABORATORS
131
136
  datalayer.save()
132
- assert datalayer.can_edit(user)
137
+ fake_request.user = user
138
+ assert datalayer.can_edit(fake_request)
133
139
 
134
140
 
135
- def test_anonymous_can_edit_in_public_mode(datalayer):
141
+ def test_anonymous_can_edit_in_public_mode(datalayer, fake_request):
136
142
  datalayer.edit_status = DataLayer.ANONYMOUS
137
143
  datalayer.save()
138
- assert datalayer.can_edit()
144
+ fake_request.user = AnonymousUser()
145
+ assert datalayer.can_edit(fake_request)
139
146
 
140
147
 
141
- def test_owner_can_edit_in_public_mode(datalayer, user):
148
+ def test_owner_can_edit_in_public_mode(datalayer, user, fake_request):
142
149
  datalayer.edit_status = DataLayer.ANONYMOUS
143
150
  datalayer.save()
144
- assert datalayer.can_edit(datalayer.map.owner)
151
+ fake_request.user = datalayer.map.owner
152
+ assert datalayer.can_edit(fake_request)
145
153
 
146
154
 
147
- def test_editor_can_edit_in_public_mode(datalayer, user):
155
+ def test_editor_can_edit_in_public_mode(datalayer, user, fake_request):
148
156
  map = datalayer.map
149
157
  map.editors.add(user)
150
158
  map.save()
151
159
  datalayer.edit_status = DataLayer.ANONYMOUS
152
160
  datalayer.save()
153
- assert datalayer.can_edit(user)
161
+ fake_request.user = user
162
+ assert datalayer.can_edit(fake_request)
154
163
 
155
164
 
156
- def test_anonymous_cannot_edit_in_anonymous_owner_mode(datalayer):
165
+ def test_anonymous_cannot_edit_in_anonymous_owner_mode(datalayer, fake_request):
157
166
  datalayer.edit_status = DataLayer.OWNER
158
167
  datalayer.save()
159
168
  map = datalayer.map
160
169
  map.owner = None
161
170
  map.save()
162
- assert not datalayer.can_edit()
171
+ fake_request.user = AnonymousUser()
172
+ assert not datalayer.can_edit(fake_request)
163
173
 
164
174
 
165
- def test_owner_can_edit_in_inherit_mode_and_map_in_owner_mode(datalayer):
175
+ def test_owner_can_edit_in_inherit_mode_and_map_in_owner_mode(datalayer, fake_request):
166
176
  datalayer.edit_status = DataLayer.INHERIT
167
177
  datalayer.save()
168
178
  map = datalayer.map
169
179
  map.edit_status = Map.OWNER
170
180
  map.save()
171
- assert datalayer.can_edit(map.owner)
181
+ fake_request.user = map.owner
182
+ assert datalayer.can_edit(fake_request)
172
183
 
173
184
 
174
- def test_editors_cannot_edit_in_inherit_mode_and_map_in_owner_mode(datalayer, user):
185
+ def test_editors_cannot_edit_in_inherit_mode_and_map_in_owner_mode(
186
+ datalayer, user, fake_request
187
+ ):
175
188
  datalayer.edit_status = DataLayer.INHERIT
176
189
  datalayer.save()
177
190
  map = datalayer.map
178
191
  map.editors.add(user)
179
192
  map.edit_status = Map.OWNER
180
193
  map.save()
181
- assert not datalayer.can_edit(user)
194
+ fake_request.user = user
195
+ assert not datalayer.can_edit(fake_request)
182
196
 
183
197
 
184
198
  def test_team_members_cannot_edit_in_inherit_mode_and_map_in_owner_mode(
185
- datalayer, user, team
199
+ datalayer, user, team, fake_request
186
200
  ):
187
201
  datalayer.edit_status = DataLayer.INHERIT
188
202
  datalayer.save()
@@ -192,50 +206,66 @@ def test_team_members_cannot_edit_in_inherit_mode_and_map_in_owner_mode(
192
206
  map.team = team
193
207
  map.edit_status = Map.OWNER
194
208
  map.save()
195
- assert not datalayer.can_edit(user)
209
+ fake_request.user = user
210
+ assert not datalayer.can_edit(fake_request)
196
211
 
197
212
 
198
- def test_anonymous_cannot_edit_in_inherit_mode_and_map_in_owner_mode(datalayer):
213
+ def test_anonymous_cannot_edit_in_inherit_mode_and_map_in_owner_mode(
214
+ datalayer, fake_request
215
+ ):
199
216
  datalayer.edit_status = DataLayer.INHERIT
200
217
  datalayer.save()
201
218
  map = datalayer.map
202
219
  map.edit_status = Map.OWNER
203
220
  map.save()
204
- assert not datalayer.can_edit()
221
+ fake_request.user = AnonymousUser()
222
+ assert not datalayer.can_edit(fake_request)
205
223
 
206
224
 
207
- def test_owner_can_edit_in_inherit_mode_and_map_in_editors_mode(datalayer):
225
+ def test_owner_can_edit_in_inherit_mode_and_map_in_editors_mode(
226
+ datalayer, fake_request
227
+ ):
208
228
  datalayer.edit_status = DataLayer.INHERIT
209
229
  datalayer.save()
210
230
  map = datalayer.map
211
231
  map.edit_status = Map.COLLABORATORS
212
232
  map.save()
213
- assert datalayer.can_edit(map.owner)
233
+ fake_request.user = map.owner
234
+ assert datalayer.can_edit(fake_request)
214
235
 
215
236
 
216
- def test_editors_can_edit_in_inherit_mode_and_map_in_editors_mode(datalayer, user):
237
+ def test_editors_can_edit_in_inherit_mode_and_map_in_editors_mode(
238
+ datalayer, user, fake_request
239
+ ):
217
240
  datalayer.edit_status = DataLayer.INHERIT
218
241
  datalayer.save()
219
242
  map = datalayer.map
220
243
  map.editors.add(user)
221
244
  map.edit_status = Map.COLLABORATORS
222
245
  map.save()
223
- assert datalayer.can_edit(user)
246
+ fake_request.user = user
247
+ assert datalayer.can_edit(fake_request)
224
248
 
225
249
 
226
- def test_anonymous_cannot_edit_in_inherit_mode_and_map_in_editors_mode(datalayer):
250
+ def test_anonymous_cannot_edit_in_inherit_mode_and_map_in_editors_mode(
251
+ datalayer, fake_request
252
+ ):
227
253
  datalayer.edit_status = DataLayer.INHERIT
228
254
  datalayer.save()
229
255
  map = datalayer.map
230
256
  map.edit_status = Map.COLLABORATORS
231
257
  map.save()
232
- assert not datalayer.can_edit()
258
+ fake_request.user = AnonymousUser()
259
+ assert not datalayer.can_edit(fake_request)
233
260
 
234
261
 
235
- def test_anonymous_can_edit_in_inherit_mode_and_map_in_public_mode(datalayer):
262
+ def test_anonymous_can_edit_in_inherit_mode_and_map_in_public_mode(
263
+ datalayer, fake_request
264
+ ):
236
265
  datalayer.edit_status = DataLayer.INHERIT
237
266
  datalayer.save()
238
267
  map = datalayer.map
239
268
  map.edit_status = Map.ANONYMOUS
240
269
  map.save()
241
- assert datalayer.can_edit()
270
+ fake_request.user = AnonymousUser()
271
+ assert datalayer.can_edit(fake_request)
umap/tests/test_map.py CHANGED
@@ -9,63 +9,69 @@ from .base import MapFactory
9
9
  pytestmark = pytest.mark.django_db
10
10
 
11
11
 
12
- def test_anonymous_can_edit_if_status_anonymous(map):
13
- anonymous = AnonymousUser()
12
+ def test_anonymous_can_edit_if_status_anonymous(map, fake_request):
14
13
  map.edit_status = map.ANONYMOUS
15
14
  map.save()
16
- assert map.can_edit(anonymous)
15
+ fake_request.user = AnonymousUser()
16
+ assert map.can_edit(fake_request)
17
17
 
18
18
 
19
- def test_anonymous_cannot_edit_if_not_status_anonymous(map):
20
- anonymous = AnonymousUser()
19
+ def test_anonymous_cannot_edit_if_not_status_anonymous(map, fake_request):
21
20
  map.edit_status = map.OWNER
22
21
  map.save()
23
- assert not map.can_edit(anonymous)
22
+ fake_request.user = AnonymousUser()
23
+ assert not map.can_edit(fake_request)
24
24
 
25
25
 
26
- def test_non_editors_can_edit_if_status_anonymous(map, user):
26
+ def test_non_editors_can_edit_if_status_anonymous(map, user, fake_request):
27
27
  assert map.owner != user
28
28
  map.edit_status = map.ANONYMOUS
29
29
  map.save()
30
- assert map.can_edit(user)
30
+ fake_request.user = user
31
+ assert map.can_edit(fake_request)
31
32
 
32
33
 
33
- def test_non_editors_cannot_edit_if_not_status_anonymous(map, user):
34
+ def test_non_editors_cannot_edit_if_not_status_anonymous(map, user, fake_request):
34
35
  map.edit_status = map.OWNER
35
36
  map.save()
36
- assert not map.can_edit(user)
37
+ fake_request.user = user
38
+ assert not map.can_edit(fake_request)
37
39
 
38
40
 
39
- def test_editors_cannot_edit_if_status_owner(map, user):
41
+ def test_editors_cannot_edit_if_status_owner(map, user, fake_request):
40
42
  map.edit_status = map.OWNER
41
43
  map.editors.add(user)
42
44
  map.save()
43
- assert not map.can_edit(user)
45
+ fake_request.user = user
46
+ assert not map.can_edit(fake_request)
44
47
 
45
48
 
46
- def test_editors_can_edit_if_status_collaborators(map, user):
49
+ def test_editors_can_edit_if_status_collaborators(map, user, fake_request):
47
50
  map.edit_status = map.COLLABORATORS
48
51
  map.editors.add(user)
49
52
  map.save()
50
- assert map.can_edit(user)
53
+ fake_request.user = user
54
+ assert map.can_edit(fake_request)
51
55
 
52
56
 
53
- def test_team_members_cannot_edit_if_status_owner(map, user, team):
57
+ def test_team_members_cannot_edit_if_status_owner(map, user, team, fake_request):
54
58
  user.teams.add(team)
55
59
  user.save()
56
60
  map.edit_status = map.OWNER
57
61
  map.team = team
58
62
  map.save()
59
- assert not map.can_edit(user)
63
+ fake_request.user = user
64
+ assert not map.can_edit(fake_request)
60
65
 
61
66
 
62
- def test_team_members_can_edit_if_status_collaborators(map, user, team):
67
+ def test_team_members_can_edit_if_status_collaborators(map, user, team, fake_request):
63
68
  user.teams.add(team)
64
69
  user.save()
65
70
  map.edit_status = map.COLLABORATORS
66
71
  map.team = team
67
72
  map.save()
68
- assert map.can_edit(user)
73
+ fake_request.user = user
74
+ assert map.can_edit(fake_request)
69
75
 
70
76
 
71
77
  def test_logged_in_user_should_be_allowed_for_anonymous_map_with_anonymous_edit_status(
@@ -77,14 +83,17 @@ def test_logged_in_user_should_be_allowed_for_anonymous_map_with_anonymous_edit_
77
83
  url = reverse("map_update", kwargs={"map_id": map.pk})
78
84
  request = rf.get(url)
79
85
  request.user = user
80
- assert map.can_edit(user, request)
86
+ assert map.can_edit(request)
81
87
 
82
88
 
83
- def test_anonymous_user_should_not_be_allowed_for_anonymous_map(map, user, rf): # noqa
89
+ def test_anonymous_user_should_not_be_allowed_for_anonymous_map(
90
+ map, user, fake_request
91
+ ):
84
92
  map.owner = None
85
93
  map.edit_status = map.OWNER
86
94
  map.save()
87
- assert not map.can_edit()
95
+ fake_request.user = AnonymousUser()
96
+ assert not map.can_edit(fake_request)
88
97
 
89
98
 
90
99
  def test_clone_should_return_new_instance(map, user):