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 +1 -1
- umap/decorators.py +2 -3
- umap/locale/fa_IR/LC_MESSAGES/django.mo +0 -0
- umap/locale/fa_IR/LC_MESSAGES/django.po +9 -9
- umap/models.py +29 -16
- umap/static/umap/js/modules/data/features.js +6 -1
- umap/static/umap/js/modules/data/layer.js +1 -1
- umap/static/umap/locale/eu.js +8 -6
- umap/static/umap/locale/eu.json +8 -6
- umap/static/umap/locale/fa_IR.js +14 -12
- umap/static/umap/locale/fa_IR.json +14 -12
- umap/templatetags/umap_tags.py +1 -1
- umap/tests/conftest.py +5 -0
- umap/tests/integration/test_browser.py +20 -0
- umap/tests/test_datalayer.py +63 -33
- umap/tests/test_map.py +30 -21
- umap/views.py +11 -19
- {umap_project-2.6.0b2.dist-info → umap_project-2.6.1.dist-info}/METADATA +6 -6
- {umap_project-2.6.0b2.dist-info → umap_project-2.6.1.dist-info}/RECORD +22 -22
- {umap_project-2.6.0b2.dist-info → umap_project-2.6.1.dist-info}/WHEEL +0 -0
- {umap_project-2.6.0b2.dist-info → umap_project-2.6.1.dist-info}/entry_points.txt +0 -0
- {umap_project-2.6.0b2.dist-info → umap_project-2.6.1.dist-info}/licenses/LICENSE +0 -0
umap/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
VERSION = "2.6.
|
|
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(
|
|
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-
|
|
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:
|
|
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:
|
|
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,
|
|
285
|
-
if
|
|
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,
|
|
301
|
-
if
|
|
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,
|
|
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
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
if
|
|
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
|
|
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,
|
|
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(
|
|
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,
|
|
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(
|
|
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
|
|
586
|
+
elif user.is_authenticated and user == self.map.owner:
|
|
574
587
|
can = True
|
|
575
|
-
elif user
|
|
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
|
-
|
|
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 '
|
|
1118
|
+
return 'displayName'
|
|
1119
1119
|
}
|
|
1120
1120
|
|
|
1121
1121
|
renderLegend(container) {
|
umap/static/umap/locale/eu.js
CHANGED
|
@@ -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": "
|
|
502
|
-
"Display the polygon inverted": "
|
|
503
|
-
"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": "
|
|
506
|
-
"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")
|
umap/static/umap/locale/eu.json
CHANGED
|
@@ -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": "
|
|
502
|
-
"Display the polygon inverted": "
|
|
503
|
-
"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": "
|
|
506
|
-
"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
|
}
|
umap/static/umap/locale/fa_IR.js
CHANGED
|
@@ -160,7 +160,7 @@ const locale = {
|
|
|
160
160
|
"fill color": "رنگ پرکردن",
|
|
161
161
|
"fill opacity": "شفافیت پرشدگی",
|
|
162
162
|
"fill": "پرکردن",
|
|
163
|
-
"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. {name}, they will be dynamically replaced by the corresponding values.": "هر کدام از ویژگیهای عنصر را بین آکولاد قرار دهید و جانگهدار بسازید. مثال: {name}. این جانگهدارها به طور پویا به مقدار متناظرشان تغییر میکنند.",
|
|
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": "
|
|
504
|
-
"Property name to compute circles": "
|
|
505
|
-
"Min circle radius": "
|
|
506
|
-
"Max circle radius": "
|
|
507
|
-
"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": "
|
|
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. {name}, they will be dynamically replaced by the corresponding values.": "هر کدام از ویژگیهای عنصر را بین آکولاد قرار دهید و جانگهدار بسازید. مثال: {name}. این جانگهدارها به طور پویا به مقدار متناظرشان تغییر میکنند.",
|
|
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": "
|
|
504
|
-
"Property name to compute circles": "
|
|
505
|
-
"Min circle radius": "
|
|
506
|
-
"Max circle radius": "
|
|
507
|
-
"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
|
}
|
umap/templatetags/umap_tags.py
CHANGED
umap/tests/conftest.py
CHANGED
|
@@ -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")
|
umap/tests/test_datalayer.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
86
|
+
assert map.can_edit(request)
|
|
81
87
|
|
|
82
88
|
|
|
83
|
-
def test_anonymous_user_should_not_be_allowed_for_anonymous_map(
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
48
|
-
umap/locale/fa_IR/LC_MESSAGES/django.po,sha256=
|
|
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=
|
|
243
|
-
umap/static/umap/js/modules/data/layer.js,sha256=
|
|
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=
|
|
292
|
-
umap/static/umap/locale/eu.json,sha256=
|
|
293
|
-
umap/static/umap/locale/fa_IR.js,sha256=
|
|
294
|
-
umap/static/umap/locale/fa_IR.json,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
549
|
-
umap_project-2.6.
|
|
550
|
-
umap_project-2.6.
|
|
551
|
-
umap_project-2.6.
|
|
552
|
-
umap_project-2.6.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|