umap-project 2.6.0b2__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.

umap/__init__.py CHANGED
@@ -1 +1 @@
1
- VERSION = "2.6.0b2"
1
+ VERSION = "2.6.1"
umap/decorators.py CHANGED
@@ -33,12 +33,11 @@ def can_edit_map(view_func):
33
33
  @wraps(view_func)
34
34
  def wrapper(request, *args, **kwargs):
35
35
  map_inst = get_object_or_404(Map, pk=kwargs["map_id"])
36
- user = request.user
37
36
  kwargs["map_inst"] = map_inst # Avoid rerequesting the map in the view
38
37
  if map_inst.edit_status >= map_inst.COLLABORATORS:
39
- can_edit = map_inst.can_edit(user=user, request=request)
38
+ can_edit = map_inst.can_edit(request=request)
40
39
  if not can_edit:
41
- if map_inst.owner and not user.is_authenticated:
40
+ if map_inst.owner and not request.user.is_authenticated:
42
41
  return simple_json_response(login_required=str(LOGIN_URL))
43
42
  return HttpResponseForbidden()
44
43
  return view_func(request, *args, **kwargs)
Binary file
@@ -12,7 +12,7 @@ msgid ""
12
12
  msgstr ""
13
13
  "Project-Id-Version: uMap\n"
14
14
  "Report-Msgid-Bugs-To: \n"
15
- "POT-Creation-Date: 2024-08-30 18:23+0000\n"
15
+ "POT-Creation-Date: 2024-09-04 14:02+0000\n"
16
16
  "PO-Revision-Date: 2013-11-22 14:00+0000\n"
17
17
  "Last-Translator: imni <iriman@chmail.ir>, 2024\n"
18
18
  "Language-Team: Persian (Iran) (http://app.transifex.com/openstreetmap/umap/language/fa_IR/)\n"
@@ -326,19 +326,19 @@ msgstr "این یک نمونهٔ نمایشی است که برای آزمایش
326
326
 
327
327
  #: templates/umap/content_footer.html:5
328
328
  msgid "An OpenStreetMap project"
329
- msgstr ""
329
+ msgstr "پروژه‌ای با اوپن‌استریت‌مپ"
330
330
 
331
331
  #: templates/umap/content_footer.html:6
332
332
  msgid "version"
333
- msgstr ""
333
+ msgstr "نسخه"
334
334
 
335
335
  #: templates/umap/content_footer.html:7
336
336
  msgid "Hosted by"
337
- msgstr ""
337
+ msgstr "میزبانی‌شده در"
338
338
 
339
339
  #: templates/umap/content_footer.html:8
340
340
  msgid "Contact"
341
- msgstr ""
341
+ msgstr "تماس"
342
342
 
343
343
  #: templates/umap/content_footer.html:9 templates/umap/navigation.html:25
344
344
  msgid "Help"
@@ -373,11 +373,11 @@ msgstr "الهام بگیرید، نقشه‌ها را مرور کنید"
373
373
  msgid "You are logged in. Continuing..."
374
374
  msgstr "شما وارد شده‌اید. ادامه..."
375
375
 
376
- #: templates/umap/map_list.html:10 views.py:433
376
+ #: templates/umap/map_list.html:11 views.py:433
377
377
  msgid "by"
378
378
  msgstr "ساختهٔ"
379
379
 
380
- #: templates/umap/map_list.html:18
380
+ #: templates/umap/map_list.html:20
381
381
  msgid "More"
382
382
  msgstr "بیشتر"
383
383
 
@@ -553,12 +553,12 @@ msgstr "جستجو"
553
553
  #: templates/umap/team_detail.html:10
554
554
  #, python-format
555
555
  msgid "Browse %(current_team)s's maps"
556
- msgstr ""
556
+ msgstr "مرور نقشه‌های %(current_team)s"
557
557
 
558
558
  #: templates/umap/team_detail.html:22
559
559
  #, python-format
560
560
  msgid "%(current_team)s has no public maps."
561
- msgstr ""
561
+ msgstr "%(current_team)s نقشهٔ عمومی ندارد."
562
562
 
563
563
  #: templates/umap/team_form.html:24
564
564
  msgid "Delete this team"
umap/models.py CHANGED
@@ -281,8 +281,10 @@ class Map(NamedModel):
281
281
  def get_author(self):
282
282
  return self.team or self.owner
283
283
 
284
- def is_owner(self, user=None, request=None):
285
- if user and self.owner == user:
284
+ def is_owner(self, request=None):
285
+ if not request:
286
+ return False
287
+ if request.user and self.owner == request.user:
286
288
  return True
287
289
  return self.is_anonymous_owner(request)
288
290
 
@@ -297,14 +299,16 @@ class Map(NamedModel):
297
299
  has_anonymous_cookie = False
298
300
  return has_anonymous_cookie
299
301
 
300
- def can_delete(self, user=None, request=None):
301
- if self.owner and user != self.owner:
302
+ def can_delete(self, request=None):
303
+ if not request:
304
+ return False
305
+ if self.owner and request.user != self.owner:
302
306
  return False
303
307
  if not self.owner and not self.is_anonymous_owner(request):
304
308
  return False
305
309
  return True
306
310
 
307
- def can_edit(self, user=None, request=None):
311
+ def can_edit(self, request=None):
308
312
  """
309
313
  Define if a user can edit or not the instance, according to his account
310
314
  or the request.
@@ -318,12 +322,18 @@ class Map(NamedModel):
318
322
  - anyone otherwise (ANONYMOUS)
319
323
  """
320
324
  can = False
321
- if request and not self.owner:
322
- if settings.UMAP_ALLOW_ANONYMOUS and self.is_anonymous_owner(request):
323
- can = True
324
- if self.edit_status == self.ANONYMOUS:
325
+ if not request:
326
+ return False
327
+ user = request.user
328
+ if (
329
+ not self.owner
330
+ and settings.UMAP_ALLOW_ANONYMOUS
331
+ and self.is_anonymous_owner(request)
332
+ ):
333
+ can = True
334
+ elif self.edit_status == self.ANONYMOUS:
325
335
  can = True
326
- elif user is None:
336
+ elif not user.is_authenticated:
327
337
  can = False
328
338
  elif user == self.owner:
329
339
  can = True
@@ -477,7 +487,7 @@ class DataLayer(NamedModel):
477
487
  path.append(str(self.map.pk))
478
488
  return os.path.join(*path)
479
489
 
480
- def metadata(self, user=None, request=None):
490
+ def metadata(self, request=None):
481
491
  # Retrocompat: minimal settings for maps not saved after settings property
482
492
  # has been introduced
483
493
  obj = self.settings or {
@@ -488,7 +498,7 @@ class DataLayer(NamedModel):
488
498
  obj["old_id"] = self.old_id
489
499
  obj["id"] = self.pk
490
500
  obj["permissions"] = {"edit_status": self.edit_status}
491
- obj["editMode"] = "advanced" if self.can_edit(user, request) else "disabled"
501
+ obj["editMode"] = "advanced" if self.can_edit(request) else "disabled"
492
502
  return obj
493
503
 
494
504
  def clone(self, map_inst=None):
@@ -557,22 +567,25 @@ class DataLayer(NamedModel):
557
567
  if name.startswith(prefixes) and name.endswith(".gz"):
558
568
  self.geojson.storage.delete(os.path.join(root, name))
559
569
 
560
- def can_edit(self, user=None, request=None):
570
+ def can_edit(self, request=None):
561
571
  """
562
572
  Define if a user can edit or not the instance, according to his account
563
573
  or the request.
564
574
  """
565
575
  if self.edit_status == self.INHERIT:
566
- return self.map.can_edit(user, request)
576
+ return self.map.can_edit(request)
567
577
  can = False
578
+ if not request:
579
+ return False
580
+ user = request.user
568
581
  if not self.map.owner:
569
582
  if settings.UMAP_ALLOW_ANONYMOUS and self.map.is_anonymous_owner(request):
570
583
  can = True
571
584
  if self.edit_status == self.ANONYMOUS:
572
585
  can = True
573
- elif user is not None and user == self.map.owner:
586
+ elif user.is_authenticated and user == self.map.owner:
574
587
  can = True
575
- elif user is not None and self.edit_status == self.COLLABORATORS:
588
+ elif user.is_authenticated and self.edit_status == self.COLLABORATORS:
576
589
  if user in self.map.editors.all() or self.map.team in user.teams.all():
577
590
  can = True
578
591
  return can
@@ -508,7 +508,12 @@ class Feature {
508
508
 
509
509
  matchFilter(filter, keys) {
510
510
  filter = filter.toLowerCase()
511
- if (Utils.hasVar(keys)) {
511
+ // When user hasn't touched settings, when a feature has no name
512
+ // it will use the datalayer's name, so let's make the filtering
513
+ // consistent.
514
+ // Also, if the user has defined a labelKey with vars, let's
515
+ // compute before filtering
516
+ if (Utils.hasVar(keys) || keys === 'displayName') {
512
517
  return this.getDisplayName().toLowerCase().indexOf(filter) !== -1
513
518
  }
514
519
  keys = keys.split(',')
@@ -1115,7 +1115,7 @@ export class DataLayer {
1115
1115
  if (this.map.options.filterKey) return this.map.options.filterKey
1116
1116
  if (this.getOption('labelKey')) return this.getOption('labelKey')
1117
1117
  if (this.map.options.sortKey) return this.map.options.sortKey
1118
- return 'name'
1118
+ return 'displayName'
1119
1119
  }
1120
1120
 
1121
1121
  renderLegend(container) {
@@ -498,13 +498,15 @@ const locale = {
498
498
  "Expression is empty": "Esamoldea hutsa dago",
499
499
  "OK": "Ados",
500
500
  "Cancel": "Utzi",
501
- "Attach map to a team": "Attach map to a team",
502
- "Display the polygon inverted": "Display the polygon inverted",
503
- "Proportional circles": "Proportional circles",
501
+ "Attach map to a team": "Erantsi mapa talde bati",
502
+ "Display the polygon inverted": "Bistaratu poligonoa alderantziz",
503
+ "Proportional circles": "Zirkulu proportzionalak",
504
504
  "Property name to compute circles": "Property name to compute circles",
505
- "Min circle radius": "Min circle radius",
506
- "Max circle radius": "Max circle radius",
507
- "Display the open browser control": "Display the open browser control"
505
+ "Min circle radius": "Zirkuluaren gutxieneko erradioa",
506
+ "Max circle radius": "Zirkuluaren gehieneko erradioa",
507
+ "Display the open browser control": "Display the open browser control",
508
+ "Copy as GeoJSON": "Kopiatu GeoJSON gisa",
509
+ "Please zoom in to edit the geometry": "Mesedez, handitu geometria editatzeko"
508
510
  }
509
511
  L.registerLocale("eu", locale)
510
512
  L.setLocale("eu")
@@ -498,11 +498,13 @@
498
498
  "Expression is empty": "Esamoldea hutsa dago",
499
499
  "OK": "Ados",
500
500
  "Cancel": "Utzi",
501
- "Attach map to a team": "Attach map to a team",
502
- "Display the polygon inverted": "Display the polygon inverted",
503
- "Proportional circles": "Proportional circles",
501
+ "Attach map to a team": "Erantsi mapa talde bati",
502
+ "Display the polygon inverted": "Bistaratu poligonoa alderantziz",
503
+ "Proportional circles": "Zirkulu proportzionalak",
504
504
  "Property name to compute circles": "Property name to compute circles",
505
- "Min circle radius": "Min circle radius",
506
- "Max circle radius": "Max circle radius",
507
- "Display the open browser control": "Display the open browser control"
505
+ "Min circle radius": "Zirkuluaren gutxieneko erradioa",
506
+ "Max circle radius": "Zirkuluaren gehieneko erradioa",
507
+ "Display the open browser control": "Display the open browser control",
508
+ "Copy as GeoJSON": "Kopiatu GeoJSON gisa",
509
+ "Please zoom in to edit the geometry": "Mesedez, handitu geometria editatzeko"
508
510
  }
@@ -160,7 +160,7 @@ const locale = {
160
160
  "fill color": "رنگ پرکردن",
161
161
  "fill opacity": "شفافیت پرشدگی",
162
162
  "fill": "پرکردن",
163
- "Fit all data": "Fit all data",
163
+ "Fit all data": "گنجیدن همهٔ داده‌ها",
164
164
  "Format": "قالب",
165
165
  "From zoom": "از زوم",
166
166
  "full backup": "پشتیبان کامل",
@@ -218,7 +218,7 @@ const locale = {
218
218
  "Link to…": "پیوند به…",
219
219
  "Link with text: [[http://example.com|text of the link]]": "پیوند با متن:\n[[http://example.com|text of the link]]",
220
220
  "Long credits": "یادکردهای بلند",
221
- "Longitude": "عرض جغرافیایی",
221
+ "Longitude": "طول جغرافیایی",
222
222
  "Make main shape": "شکل اصلی را ایجاد کنید",
223
223
  "Manage layers": "مدیریت لایه‌ها",
224
224
  "Manual": "دستی",
@@ -237,7 +237,7 @@ const locale = {
237
237
  "max zoom": "بیشینهٔ بزرگنمایی",
238
238
  "Measure distances": "اندازه‌گیری مسافت‌ها",
239
239
  "Merge lines": "ادغام خطوط",
240
- "mi": "مایل",
240
+ "mi": "mi",
241
241
  "miles": "مایل",
242
242
  "min zoom": "کمینهٔ بزرگنمایی",
243
243
  "More controls": "دکمه‌های بیشتر",
@@ -304,7 +304,7 @@ const locale = {
304
304
  "Save this center and zoom": "ذخیره‌سازی این مرکزیت و بزرگنمایی",
305
305
  "Save this location as new feature": "این مکان را به عنوان عنصر جدید ذخیره کنید",
306
306
  "Save": "ذخیره",
307
- "Saved center and zoom": "مرکزیت و بزرگنمایی ذخیره شد",
307
+ "Saved center and zoom": "مرکزیت و بزرگنمایی ذخیره‌شده",
308
308
  "Search location": "جستجوی مکان",
309
309
  "Search": "جستجو",
310
310
  "Secret edit link:": "پیوند محرمانه برای ویرایش:",
@@ -354,14 +354,14 @@ const locale = {
354
354
  "Type char or paste emoji": "نویسه‌ای بنویسید یا شکلکی بچسبانید",
355
355
  "Type of layer": "نوع لایه",
356
356
  "Unable to detect format of file {filename}": "قالب فایل {filename} تشخیص داده نشد",
357
- "Untitled layer": "لایهٔ بدون عنوان",
358
- "Untitled map": "نقشهٔ بدون عنوان",
357
+ "Untitled layer": "لایهٔ بی‌عنوان",
358
+ "Untitled map": "نقشهٔ بی‌عنوان",
359
359
  "Update permissions and editors": "روزآمدسازی مجوزها و ویرایشگران",
360
360
  "Update permissions": "روزآمدسازی مجوزها",
361
361
  "Update who can see and edit the map": "چه کسی می‌تواند نقشه را ببیند و ویرایش کند",
362
362
  "Url": "نشانی اینترنتی",
363
363
  "URL": "URL",
364
- "Use current bounds": "از کران‌های فعلی استفاده شود",
364
+ "Use current bounds": "استفاده از کران‌های فعلی",
365
365
  "Use placeholders with feature properties between brackets, eg. &#123;name&#125;, they will be dynamically replaced by the corresponding values.": "هر کدام از ویژگی‌های عنصر را بین آکولاد قرار دهید و جانگهدار بسازید. مثال: &#123;name&#125;. این جانگهدارها به طور پویا به مقدار متناظرشان تغییر می‌کنند.",
366
366
  "User content credits": "یادکردهای محتوای کاربر",
367
367
  "User interface options": "گزینه‌های رابط کاربری",
@@ -500,11 +500,13 @@ const locale = {
500
500
  "Cancel": "لغو",
501
501
  "Attach map to a team": "Attach map to a team",
502
502
  "Display the polygon inverted": "Display the polygon inverted",
503
- "Proportional circles": "Proportional circles",
504
- "Property name to compute circles": "Property name to compute circles",
505
- "Min circle radius": "Min circle radius",
506
- "Max circle radius": "Max circle radius",
507
- "Display the open browser control": "Display the open browser control"
503
+ "Proportional circles": "دایره‌های نسبی",
504
+ "Property name to compute circles": "نام ویژگی برای محاسبهٔ دایره‌ها",
505
+ "Min circle radius": "کمترین شعاع دایره",
506
+ "Max circle radius": "بیشتری شعاع دایره",
507
+ "Display the open browser control": "نمایش دکمهٔ بازکردن مرورگر",
508
+ "Copy as GeoJSON": "Copy as GeoJSON",
509
+ "Please zoom in to edit the geometry": "لطفاً برای ویرایش هندسه زوم کنید"
508
510
  }
509
511
  L.registerLocale("fa_IR", locale)
510
512
  L.setLocale("fa_IR")
@@ -160,7 +160,7 @@
160
160
  "fill color": "رنگ پرکردن",
161
161
  "fill opacity": "شفافیت پرشدگی",
162
162
  "fill": "پرکردن",
163
- "Fit all data": "Fit all data",
163
+ "Fit all data": "گنجیدن همهٔ داده‌ها",
164
164
  "Format": "قالب",
165
165
  "From zoom": "از زوم",
166
166
  "full backup": "پشتیبان کامل",
@@ -218,7 +218,7 @@
218
218
  "Link to…": "پیوند به…",
219
219
  "Link with text: [[http://example.com|text of the link]]": "پیوند با متن:\n[[http://example.com|text of the link]]",
220
220
  "Long credits": "یادکردهای بلند",
221
- "Longitude": "عرض جغرافیایی",
221
+ "Longitude": "طول جغرافیایی",
222
222
  "Make main shape": "شکل اصلی را ایجاد کنید",
223
223
  "Manage layers": "مدیریت لایه‌ها",
224
224
  "Manual": "دستی",
@@ -237,7 +237,7 @@
237
237
  "max zoom": "بیشینهٔ بزرگنمایی",
238
238
  "Measure distances": "اندازه‌گیری مسافت‌ها",
239
239
  "Merge lines": "ادغام خطوط",
240
- "mi": "مایل",
240
+ "mi": "mi",
241
241
  "miles": "مایل",
242
242
  "min zoom": "کمینهٔ بزرگنمایی",
243
243
  "More controls": "دکمه‌های بیشتر",
@@ -304,7 +304,7 @@
304
304
  "Save this center and zoom": "ذخیره‌سازی این مرکزیت و بزرگنمایی",
305
305
  "Save this location as new feature": "این مکان را به عنوان عنصر جدید ذخیره کنید",
306
306
  "Save": "ذخیره",
307
- "Saved center and zoom": "مرکزیت و بزرگنمایی ذخیره شد",
307
+ "Saved center and zoom": "مرکزیت و بزرگنمایی ذخیره‌شده",
308
308
  "Search location": "جستجوی مکان",
309
309
  "Search": "جستجو",
310
310
  "Secret edit link:": "پیوند محرمانه برای ویرایش:",
@@ -354,14 +354,14 @@
354
354
  "Type char or paste emoji": "نویسه‌ای بنویسید یا شکلکی بچسبانید",
355
355
  "Type of layer": "نوع لایه",
356
356
  "Unable to detect format of file {filename}": "قالب فایل {filename} تشخیص داده نشد",
357
- "Untitled layer": "لایهٔ بدون عنوان",
358
- "Untitled map": "نقشهٔ بدون عنوان",
357
+ "Untitled layer": "لایهٔ بی‌عنوان",
358
+ "Untitled map": "نقشهٔ بی‌عنوان",
359
359
  "Update permissions and editors": "روزآمدسازی مجوزها و ویرایشگران",
360
360
  "Update permissions": "روزآمدسازی مجوزها",
361
361
  "Update who can see and edit the map": "چه کسی می‌تواند نقشه را ببیند و ویرایش کند",
362
362
  "Url": "نشانی اینترنتی",
363
363
  "URL": "URL",
364
- "Use current bounds": "از کران‌های فعلی استفاده شود",
364
+ "Use current bounds": "استفاده از کران‌های فعلی",
365
365
  "Use placeholders with feature properties between brackets, eg. &#123;name&#125;, they will be dynamically replaced by the corresponding values.": "هر کدام از ویژگی‌های عنصر را بین آکولاد قرار دهید و جانگهدار بسازید. مثال: &#123;name&#125;. این جانگهدارها به طور پویا به مقدار متناظرشان تغییر می‌کنند.",
366
366
  "User content credits": "یادکردهای محتوای کاربر",
367
367
  "User interface options": "گزینه‌های رابط کاربری",
@@ -500,9 +500,11 @@
500
500
  "Cancel": "لغو",
501
501
  "Attach map to a team": "Attach map to a team",
502
502
  "Display the polygon inverted": "Display the polygon inverted",
503
- "Proportional circles": "Proportional circles",
504
- "Property name to compute circles": "Property name to compute circles",
505
- "Min circle radius": "Min circle radius",
506
- "Max circle radius": "Max circle radius",
507
- "Display the open browser control": "Display the open browser control"
503
+ "Proportional circles": "دایره‌های نسبی",
504
+ "Property name to compute circles": "نام ویژگی برای محاسبهٔ دایره‌ها",
505
+ "Min circle radius": "کمترین شعاع دایره",
506
+ "Max circle radius": "بیشتری شعاع دایره",
507
+ "Display the open browser control": "نمایش دکمهٔ بازکردن مرورگر",
508
+ "Copy as GeoJSON": "Copy as GeoJSON",
509
+ "Please zoom in to edit the geometry": "لطفاً برای ویرایش هندسه زوم کنید"
508
510
  }
@@ -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")
@@ -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):
umap/views.py CHANGED
@@ -546,7 +546,7 @@ class SessionMixin:
546
546
  data = {}
547
547
  user = self.request.user
548
548
  if hasattr(self, "object"):
549
- data["is_owner"] = self.object.is_owner(user, self.request)
549
+ data["is_owner"] = self.object.is_owner(self.request)
550
550
  if user.is_anonymous:
551
551
  return data
552
552
  return {
@@ -725,20 +725,14 @@ class MapView(MapDetailMixin, PermissionsMixin, DetailView):
725
725
  return self.object.get_absolute_url()
726
726
 
727
727
  def get_datalayers(self):
728
- return [
729
- dl.metadata(self.request.user, self.request)
730
- for dl in self.object.datalayer_set.all()
731
- ]
728
+ return [dl.metadata(self.request) for dl in self.object.datalayer_set.all()]
732
729
 
733
730
  @property
734
731
  def edit_mode(self):
735
732
  edit_mode = "disabled"
736
- if self.object.can_edit(self.request.user, self.request):
733
+ if self.object.can_edit(self.request):
737
734
  edit_mode = "advanced"
738
- elif any(
739
- d.can_edit(self.request.user, self.request)
740
- for d in self.object.datalayer_set.all()
741
- ):
735
+ elif any(d.can_edit(self.request) for d in self.object.datalayer_set.all()):
742
736
  edit_mode = "simple"
743
737
  return edit_mode
744
738
 
@@ -901,7 +895,7 @@ def get_websocket_auth_token(request, map_id, map_inst):
901
895
  map_object: Map = Map.objects.get(pk=map_id)
902
896
 
903
897
  permissions = ["edit"]
904
- if map_object.is_owner(request.user, request):
898
+ if map_object.is_owner(request):
905
899
  permissions.append("owner")
906
900
 
907
901
  if request.user.is_authenticated:
@@ -959,7 +953,7 @@ class AttachAnonymousMap(View):
959
953
  if (
960
954
  self.object.owner
961
955
  or not self.object.is_anonymous_owner(self.request)
962
- or not self.object.can_edit(self.request.user, self.request)
956
+ or not self.object.can_edit(self.request)
963
957
  or not self.request.user.is_authenticated
964
958
  ):
965
959
  return HttpResponseForbidden()
@@ -976,7 +970,7 @@ class SendEditLink(FormLessEditMixin, FormView):
976
970
  if (
977
971
  self.object.owner
978
972
  or not self.object.is_anonymous_owner(self.request)
979
- or not self.object.can_edit(self.request.user, self.request)
973
+ or not self.object.can_edit(self.request)
980
974
  ):
981
975
  return HttpResponseForbidden()
982
976
  form = self.get_form()
@@ -1009,7 +1003,7 @@ class MapDelete(DeleteView):
1009
1003
 
1010
1004
  def form_valid(self, form):
1011
1005
  self.object = self.get_object()
1012
- if not self.object.can_delete(self.request.user, self.request):
1006
+ if not self.object.can_delete(self.request):
1013
1007
  return HttpResponseForbidden(_("Only its owner can delete the map."))
1014
1008
  self.object.delete()
1015
1009
  home_url = reverse("home")
@@ -1186,9 +1180,7 @@ class DataLayerCreate(FormLessEditMixin, GZipMixin, CreateView):
1186
1180
  form.instance.map = self.kwargs["map_inst"]
1187
1181
  self.object = form.save()
1188
1182
  # Simple response with only metadata (including new id)
1189
- response = simple_json_response(
1190
- **self.object.metadata(self.request.user, self.request)
1191
- )
1183
+ response = simple_json_response(**self.object.metadata(self.request))
1192
1184
  response["X-Datalayer-Version"] = self.version
1193
1185
  return response
1194
1186
 
@@ -1242,7 +1234,7 @@ class DataLayerUpdate(FormLessEditMixin, GZipMixin, UpdateView):
1242
1234
  if self.object.map.pk != int(self.kwargs["map_id"]):
1243
1235
  return HttpResponseForbidden()
1244
1236
 
1245
- if not self.object.can_edit(user=self.request.user, request=self.request):
1237
+ if not self.object.can_edit(request=self.request):
1246
1238
  return HttpResponseForbidden()
1247
1239
 
1248
1240
  reference_version = self.request.headers.get("X-Datalayer-Reference")
@@ -1262,7 +1254,7 @@ class DataLayerUpdate(FormLessEditMixin, GZipMixin, UpdateView):
1262
1254
 
1263
1255
  def form_valid(self, form):
1264
1256
  self.object = form.save()
1265
- data = {**self.object.metadata(self.request.user, self.request)}
1257
+ data = {**self.object.metadata(self.request)}
1266
1258
  if self.request.session.get("needs_reload"):
1267
1259
  data["geojson"] = json.loads(self.object.geojson.read().decode())
1268
1260
  self.request.session["needs_reload"] = False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: umap-project
3
- Version: 2.6.0b2
3
+ Version: 2.6.1
4
4
  Summary: Create maps with OpenStreetMap layers in a minute and embed them in your site.
5
5
  Author-email: Yohan Boniface <yb@enix.org>
6
6
  Maintainer-email: David Larlet <david@larlet.fr>
@@ -19,10 +19,10 @@ Requires-Python: >=3.10
19
19
  Requires-Dist: django-agnocomplete==2.2.0
20
20
  Requires-Dist: django-environ==0.11.2
21
21
  Requires-Dist: django-probes==1.7.0
22
- Requires-Dist: django==5.1
22
+ Requires-Dist: django==5.1.1
23
23
  Requires-Dist: pillow==10.4.0
24
24
  Requires-Dist: psycopg==3.2.1
25
- Requires-Dist: pydantic==2.8.2
25
+ Requires-Dist: pydantic==2.9.1
26
26
  Requires-Dist: rcssmin==1.1.2
27
27
  Requires-Dist: requests==2.32.3
28
28
  Requires-Dist: rjsmin==1.2.2
@@ -33,11 +33,11 @@ Provides-Extra: dev
33
33
  Requires-Dist: djlint==1.35.2; extra == 'dev'
34
34
  Requires-Dist: hatch==1.12.0; extra == 'dev'
35
35
  Requires-Dist: isort==5.13.2; extra == 'dev'
36
- Requires-Dist: mkdocs-material==9.5.33; extra == 'dev'
36
+ Requires-Dist: mkdocs-material==9.5.34; extra == 'dev'
37
37
  Requires-Dist: mkdocs-static-i18n==1.2.3; extra == 'dev'
38
38
  Requires-Dist: mkdocs==1.6.1; extra == 'dev'
39
39
  Requires-Dist: pymdown-extensions==10.9; extra == 'dev'
40
- Requires-Dist: ruff==0.6.3; extra == 'dev'
40
+ Requires-Dist: ruff==0.6.4; extra == 'dev'
41
41
  Requires-Dist: vermin==1.6.0; extra == 'dev'
42
42
  Provides-Extra: docker
43
43
  Requires-Dist: uwsgi==2.0.26; extra == 'docker'
@@ -45,7 +45,7 @@ Provides-Extra: test
45
45
  Requires-Dist: factory-boy==3.3.1; extra == 'test'
46
46
  Requires-Dist: playwright>=1.39; extra == 'test'
47
47
  Requires-Dist: pytest-django==4.9.0; extra == 'test'
48
- Requires-Dist: pytest-playwright==0.5.1; extra == 'test'
48
+ Requires-Dist: pytest-playwright==0.5.2; extra == 'test'
49
49
  Requires-Dist: pytest-xdist<4,>=3.5.0; extra == 'test'
50
50
  Requires-Dist: pytest==8.3.2; extra == 'test'
51
51
  Description-Content-Type: text/markdown
@@ -1,18 +1,18 @@
1
- umap/__init__.py,sha256=iw8_56v34cOA8cil0skIng0HnLHzqqzo3IiTem7TSvc,20
1
+ umap/__init__.py,sha256=ro6AJSaqPxSqAiAh2RHXql8v0t7TVU5xIp6-hIVrO9Y,18
2
2
  umap/admin.py,sha256=BSZydLskm87WOovG1dnJztkuFTRKA8zxffUDBzJ4PHE,864
3
3
  umap/apps.py,sha256=5ssKqPUuNJlapaBmr4LY_HDb7J1NFCT3wzythxQOOfs,109
4
4
  umap/autocomplete.py,sha256=WUsbsVBl_KzzEzxB4g3rAoS5-eEvCZGtelVzXeOFV90,444
5
5
  umap/context_processors.py,sha256=tpFuobOUj75OaheysJMIt-Xnq0CFQOMY38e_vohX6dE,534
6
- umap/decorators.py,sha256=95tsPKWtK-Hdy0wcUdB_UdCCiXs8onmEw6XDLj-4H-U,2373
6
+ umap/decorators.py,sha256=t3YdQLuV0WrqMo2bHEbhkpzmxZe0gRNtzUvczruCn-A,2342
7
7
  umap/fields.py,sha256=c32tKWKF8aThrCXDJblwo0n9n2ET6hxBYzEupfr0B4o,900
8
8
  umap/forms.py,sha256=geBn_IVvhbpfswkOZyA1RMgoD6AV33ic9N7gH1M92oE,3994
9
9
  umap/managers.py,sha256=-lBK0xYFRDfX76qDRdLnZOA8jEPYseEwIj8QOiHVM4w,243
10
10
  umap/middleware.py,sha256=p8EPW_gYW8Wh2lk0DNIAkZQbYlBZugW7Yq4iiA7L4aE,514
11
- umap/models.py,sha256=efPfdunwTjKWdnC9WGTQ2n2XAbPt7K6w37q9_A6-ogo,18811
11
+ umap/models.py,sha256=5hCRqQN7pDqK4u_EOqog6nFNtspHUydQDNGmmdZZuyg,19065
12
12
  umap/storage.py,sha256=mxFcenC1JECmpNy4H0e7vX8GObDZVXzs1RPjQFWNd5k,2473
13
13
  umap/urls.py,sha256=OPJ47SOnVMmczfpMBYfKbf6UvCYWCm8sp36K2jczwUE,7476
14
14
  umap/utils.py,sha256=19i8ibi-1IXxafT4k_yOHMhD-DsPH74Ll9qw-UrUkM4,5856
15
- umap/views.py,sha256=ZrE5WFoTbemRscekTKoFGdYtfJp5yYydDRGsYKL5-gs,45387
15
+ umap/views.py,sha256=kkKsaVJ9oqhv3fCYfyVrDXdzFvIqTkC3MUHbbBghWv0,45101
16
16
  umap/websocket_server.py,sha256=igM05T95y7IqidPy8nVrCwbydj_xcCEAqwjZPb0mxyA,3023
17
17
  umap/wsgi.py,sha256=IopIgnDZbCus3XpSetTHnra9VyzWi0Y2tJo-CmfTWCY,1132
18
18
  umap/bin/__init__.py,sha256=iA3ON4A6NCpenrn3q2OgefUKF5QRFIQS-FtS0pxruI8,234
@@ -44,8 +44,8 @@ umap/locale/et/LC_MESSAGES/django.mo,sha256=vGMEot_LXQAQPvJESjgOFeyOgzEzYWYKP0HX
44
44
  umap/locale/et/LC_MESSAGES/django.po,sha256=344_8a7EH06mtLYRIGIIKiFrg8HRWmVdVMJl9pV1oso,12435
45
45
  umap/locale/eu/LC_MESSAGES/django.mo,sha256=guogxd6hL3SbGClGr7QPv0fr1nAaRa4YPY-7C-MAKUA,11101
46
46
  umap/locale/eu/LC_MESSAGES/django.po,sha256=l9zlOHgIkGnH39nSwqf1ydTnQZ3cNdJ8Uo1iyYpBvX8,17674
47
- umap/locale/fa_IR/LC_MESSAGES/django.mo,sha256=QRnrHXPvibiXJ6F53jhT8YLXC6BAwhTXZ8XvNmIIeqM,13581
48
- umap/locale/fa_IR/LC_MESSAGES/django.po,sha256=IkMp1JTU5k7mtK1o_5xc61KditzLBRzlxVLGksnQPOw,20245
47
+ umap/locale/fa_IR/LC_MESSAGES/django.mo,sha256=t4H1hC7blrnjOwIxILrqRuDsRAm_C8w3Z-KQBbCbLnk,14040
48
+ umap/locale/fa_IR/LC_MESSAGES/django.po,sha256=hjk92LrZvSeOP-DzQpj_mp6ik97KiAXqANa7hQnOqbc,20435
49
49
  umap/locale/fi/LC_MESSAGES/django.mo,sha256=-p9kvtfjdJKrbSMEfpdvoZ6jEX_njf-0uqzlvydbhOo,4856
50
50
  umap/locale/fi/LC_MESSAGES/django.po,sha256=Saq5PpycYhmutr6CWPQNYI4UwQbSdxrCWxapwotaB3c,12823
51
51
  umap/locale/fr/LC_MESSAGES/django.mo,sha256=Sn8nXuBFRj4FltY3td4IakYJRpxnkoaZQ7ykctp7AKw,12248
@@ -239,8 +239,8 @@ umap/static/umap/js/modules/slideshow.js,sha256=fMpQ93VU7Uc9Mhxary_vrAdAK8g_P5Ch
239
239
  umap/static/umap/js/modules/tableeditor.js,sha256=o8t6zheQcaZ9Ybp67W8AFnMJvbHgLuJsOXXQajCwX7U,9788
240
240
  umap/static/umap/js/modules/urls.js,sha256=Y_8KJ8CqMDCgV_0E9mc6oohODvRgoNHBx_avL85SR8g,838
241
241
  umap/static/umap/js/modules/utils.js,sha256=TzRJEqlvNpPgv-gqIisWLOv4LtfzvoAeEi1NnD_hPRE,11378
242
- umap/static/umap/js/modules/data/features.js,sha256=49THaqEI-FYPq9UK-g_ziN4yP2y0ZgZTBiYLFHIBlQI,26010
243
- umap/static/umap/js/modules/data/layer.js,sha256=c-lEbIfYd23IGSWyD-iYKuDwYsz60dzyX1xXSDp15-c,33188
242
+ umap/static/umap/js/modules/data/features.js,sha256=W3v7rwgs-ypvcc3neYcxyMOyqbxxGIGY79ahd1zoQzE,26291
243
+ umap/static/umap/js/modules/data/layer.js,sha256=hcEgr1xlIayfMOTGNRIWP9BwluZAnqgoJ1RSAcVZeLw,33195
244
244
  umap/static/umap/js/modules/importers/communesfr.js,sha256=GuBriig7n3-AmtBWByrD43S12bQS_vr6VPlEw3bCL0g,1316
245
245
  umap/static/umap/js/modules/importers/datasets.js,sha256=StZbRiq_1vqe0OO1w66k5Lwzju8RntmHpWe9HWIDfRE,1372
246
246
  umap/static/umap/js/modules/importers/geodatamine.js,sha256=FtrHMVntY4pPelw0uDZCbDVxy5er1ZzDc80zcDpvRnc,2949
@@ -288,10 +288,10 @@ umap/static/umap/locale/es.js,sha256=mC8vLIXS026NP7HjIOShBlPZKGtfgKH7p_4GmNgCpa0
288
288
  umap/static/umap/locale/es.json,sha256=dAH6Yo6iWVSmO5roUs9qH4ANjw6IwnCMQwYyuAefuGM,31506
289
289
  umap/static/umap/locale/et.js,sha256=TKMGYlcb-D8KW8WVXGIAR8wDdgqCmi6pb9GXMbpYFEU,29465
290
290
  umap/static/umap/locale/et.json,sha256=CPkjYxDD3SsBVyiKO24OREw4l3QVOebdXtLakyNyKyo,29400
291
- umap/static/umap/locale/eu.js,sha256=fGE1911GyTM9MD1aHGh4Zzy2nFRPxCLVo-Ij7Zv19A0,31144
292
- umap/static/umap/locale/eu.json,sha256=v4MHfe9NBnKW1M_5PjVtEfUiDq-zlbv-XkV-Rjg67uM,31079
293
- umap/static/umap/locale/fa_IR.js,sha256=tdSTeOKlBOpwHiMVsRom1Wio3cnOHotkYn_Oot_Uizc,37870
294
- umap/static/umap/locale/fa_IR.json,sha256=1InhRKruKSo7V0bfXB0DVnJEl6Kv5pSua6tvA8vteWA,37799
291
+ umap/static/umap/locale/eu.js,sha256=mE1wggWHJHTvuGV-ssScN93um8ULnb_PSgIn32D2O1Y,31311
292
+ umap/static/umap/locale/eu.json,sha256=5sdH-hXljmu6fM-M514QouLN7B0hf1Oc-pojsgC9zS0,31246
293
+ umap/static/umap/locale/fa_IR.js,sha256=3gEG9DjMeGMQZg2Nm7xxghr1loWodtjC1UFGkvO02aA,38112
294
+ umap/static/umap/locale/fa_IR.json,sha256=pbxwHf1S63wo5YyTkOnKKANrcNAuObeOI01eO7Tl6z8,38041
295
295
  umap/static/umap/locale/fi.js,sha256=XUIrgmxg9KjmpDwFKRULr-EmyjjTBhWWA_ylX_nSjvw,30137
296
296
  umap/static/umap/locale/fi.json,sha256=3suDckLIR0BpLA15zLXPAXEY-DnVlbA-YEfeWqx3zfA,30072
297
297
  umap/static/umap/locale/fr.js,sha256=qbhzRxExAYPoRSaOcqcMWNbuhoSgrhJxreQlOXhP1a8,32169
@@ -472,15 +472,15 @@ umap/templates/umap/user_dashboard.html,sha256=pc_5pTzAIW4ggZUl2R6aIKB3cdVFTodBt
472
472
  umap/templates/umap/user_teams.html,sha256=MfelqIwoLRVjvX-KpVtwqh0I7pNx3oDRhqmSRdpT4bs,1570
473
473
  umap/templates/umap/components/alerts/alert.html,sha256=eQRALES_PzIP3qs16eXq9SGz2KWODr4VY0tyl_hARCw,3482
474
474
  umap/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
475
- umap/templatetags/umap_tags.py,sha256=oMXsa80LFM52EcLnF6A_o4_PdvOncLBf33pexaeL8nw,1773
475
+ umap/templatetags/umap_tags.py,sha256=OumX1AI9uWzNP3zbjexTz7lGp10FweW0NRFSsdQ_cuU,1759
476
476
  umap/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
477
477
  umap/tests/base.py,sha256=VsyFT-cqXEL0scSI69WKUdItfagqOZ3t2omINyVpb1M,4471
478
- umap/tests/conftest.py,sha256=IBjTc6bJVB77C83XJ-vhpUTmTbvyTCUi9p5AHqp-8OY,1570
478
+ umap/tests/conftest.py,sha256=KQCZanCTl1ABLIKOuyxS_cpBoXGiwjDc29jsLBiSWxY,1633
479
479
  umap/tests/settings.py,sha256=tY70LMFXyo_WijswqGyeWai7vBzM62k7IA8pkkbc9y4,816
480
- umap/tests/test_datalayer.py,sha256=lonCoyOH8KVKbq8jjz0jZMfSydaOYthRgQfdQy4qY4M,7561
480
+ umap/tests/test_datalayer.py,sha256=auf3u3BDIPianpn08CHkEsKEGq-frseMagAJc1OxXEM,8552
481
481
  umap/tests/test_datalayer_views.py,sha256=oq1azMk0IUgf688a41VJHZO4In7On3Nb72x3wwP_ZVQ,22105
482
482
  umap/tests/test_licence.py,sha256=BxNY3gdKhIoc2u5OPmAkmjCp0jJN-Jm-uPOfAZlpOHA,339
483
- umap/tests/test_map.py,sha256=8jqB5UDHBedMWugEw8dT57vqtziLIdoK-XFku4WVpNo,4464
483
+ umap/tests/test_map.py,sha256=yDSU75RxqCmXyiL90NZbrqvrYtmm6OFoc7SQ0kf0ei0,4874
484
484
  umap/tests/test_map_views.py,sha256=1bd8vqVq3hYQ4m00klMi6Blxcy2dGKzHKRAxx85vfHk,31898
485
485
  umap/tests/test_merge_features.py,sha256=uLZSW00WAI8_nZS0KPP8gg8U4nnky-XGb-VhhKUxv1M,2275
486
486
  umap/tests/test_statics.py,sha256=WJe4DZ-cSfN_wCRD8U9ocl6v5FoXrVwBjU6kI6BOcmY,1252
@@ -510,7 +510,7 @@ umap/tests/integration/conftest.py,sha256=bo-ndi3ARHnkwRGo8fGi6lqTd_LdXWSOpgNyXE
510
510
  umap/tests/integration/helpers.py,sha256=vvGX5b-DS2fMVDdeXz1lH2IleZkRHjyL7DVvatJU8Do,344
511
511
  umap/tests/integration/test_anonymous_owned_map.py,sha256=nsj9VNJ-uP8gToR-eYxBipE20s3DACfQaddpmvwqUBs,10606
512
512
  umap/tests/integration/test_basics.py,sha256=_XC0ojQU_HpBvkIPSt1g_rW1B0vjmAko8FSJ7WOD67M,3760
513
- umap/tests/integration/test_browser.py,sha256=Vzzqv7i_fH73dKz0qIsyhdKMJRCfnEbwmCGlcFt2D7M,16992
513
+ umap/tests/integration/test_browser.py,sha256=pFPeUlPG5Kpk9EhiHJmSenBpVRI3k15Ad8qBha48YJQ,17820
514
514
  umap/tests/integration/test_caption.py,sha256=UykDB2WpyFl0sbXGrSJ1IAJTM0PzYajPyz-XWaqUBws,1795
515
515
  umap/tests/integration/test_categorized_layer.py,sha256=1MJopDBMLUd_NN2NVqWoePuNPS42RbNlXOwXeyKdZo8,5586
516
516
  umap/tests/integration/test_choropleth.py,sha256=MOgWxPiv39wU7v6kwEJ6sfN3P3xTf_ABQo7hxQa_Y1M,3775
@@ -545,8 +545,8 @@ umap/tests/integration/test_view_marker.py,sha256=sPZBbX5jF8WkbAl3Q9eta7a80E2rPX
545
545
  umap/tests/integration/test_view_polygon.py,sha256=I7wR6DUrictIMrCPKajCrruJVLry4ZRDdjSs8q0XaOg,1829
546
546
  umap/tests/integration/test_view_polyline.py,sha256=n1QVIdl-Xg9yN9o-Jc6VnPhFAuUspsgY0odiUe_jJC4,1598
547
547
  umap/tests/integration/test_websocket_sync.py,sha256=sdMjvZsCImhceQiFvSBHKo4dR6HJPl7-D0NItl2QsNU,10530
548
- umap_project-2.6.0b2.dist-info/METADATA,sha256=-VTYCkc0BWt6p3N8AWNRrslWOqlUzSOYNVJy2gRv2zA,2679
549
- umap_project-2.6.0b2.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
550
- umap_project-2.6.0b2.dist-info/entry_points.txt,sha256=gz-KDQfEsMLBae8ABOD3foJsCYGPW1tA4Y394R_1RW8,39
551
- umap_project-2.6.0b2.dist-info/licenses/LICENSE,sha256=kQtrtRKgiPhcl7aO0-lmvbrNAXu7WHyiXvPrUk-TD2Q,820
552
- umap_project-2.6.0b2.dist-info/RECORD,,
548
+ umap_project-2.6.1.dist-info/METADATA,sha256=FOZHPJzvEJiZDd6Iu7gY7U2H7PK8F3rEem_CDOHTKVs,2679
549
+ umap_project-2.6.1.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
550
+ umap_project-2.6.1.dist-info/entry_points.txt,sha256=gz-KDQfEsMLBae8ABOD3foJsCYGPW1tA4Y394R_1RW8,39
551
+ umap_project-2.6.1.dist-info/licenses/LICENSE,sha256=kQtrtRKgiPhcl7aO0-lmvbrNAXu7WHyiXvPrUk-TD2Q,820
552
+ umap_project-2.6.1.dist-info/RECORD,,