umap-project 2.8.0a2__py3-none-any.whl → 2.8.0b0__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (34) hide show
  1. umap/__init__.py +1 -1
  2. umap/settings/local_s3.py +45 -0
  3. umap/static/umap/css/form.css +3 -0
  4. umap/static/umap/js/modules/data/features.js +12 -0
  5. umap/static/umap/js/modules/data/layer.js +4 -6
  6. umap/static/umap/js/modules/importer.js +10 -5
  7. umap/static/umap/js/modules/rendering/icon.js +2 -1
  8. umap/static/umap/js/modules/rendering/map.js +7 -7
  9. umap/static/umap/js/modules/rendering/ui.js +6 -2
  10. umap/static/umap/js/modules/request.js +2 -2
  11. umap/static/umap/js/modules/ui/dialog.js +5 -0
  12. umap/static/umap/js/modules/umap.js +27 -6
  13. umap/static/umap/js/umap.controls.js +7 -4
  14. umap/static/umap/js/umap.forms.js +44 -0
  15. umap/static/umap/map.css +34 -166
  16. umap/static/umap/vars.css +0 -1
  17. umap/templates/base.html +2 -0
  18. umap/templates/umap/components/alerts/alert.html +4 -0
  19. umap/templates/umap/css.html +3 -0
  20. umap/templates/umap/js.html +2 -0
  21. umap/templates/umap/map_init.html +2 -0
  22. umap/templates/umap/user_dashboard.html +2 -0
  23. umap/tests/fixtures/test_upload_simple_marker.json +19 -0
  24. umap/tests/integration/test_edit_datalayer.py +11 -0
  25. umap/tests/integration/test_import.py +20 -1
  26. umap/tests/test_dashboard.py +82 -0
  27. umap/tests/test_team_views.py +35 -1
  28. umap/tests/test_views.py +0 -74
  29. umap/views.py +5 -1
  30. {umap_project-2.8.0a2.dist-info → umap_project-2.8.0b0.dist-info}/METADATA +1 -1
  31. {umap_project-2.8.0a2.dist-info → umap_project-2.8.0b0.dist-info}/RECORD +34 -31
  32. {umap_project-2.8.0a2.dist-info → umap_project-2.8.0b0.dist-info}/WHEEL +0 -0
  33. {umap_project-2.8.0a2.dist-info → umap_project-2.8.0b0.dist-info}/entry_points.txt +0 -0
  34. {umap_project-2.8.0a2.dist-info → umap_project-2.8.0b0.dist-info}/licenses/LICENSE +0 -0
umap/__init__.py CHANGED
@@ -1 +1 @@
1
- VERSION = "2.8.0a2"
1
+ VERSION = "2.8.0b0"
@@ -0,0 +1,45 @@
1
+ from umap.settings.local import *
2
+
3
+ DATABASES = {
4
+ "default": {
5
+ "ENGINE": "django.contrib.gis.db.backends.postgis",
6
+ "NAME": "umaps3",
7
+ }
8
+ }
9
+
10
+ STORAGES = {
11
+ "default": {
12
+ "BACKEND": "storages.backends.s3.S3Storage",
13
+ "OPTIONS": {
14
+ "access_key": "OScTD3CClCcO54Ax2DLz",
15
+ "secret_key": "eK9tfPRHoFh0nKLkZpJJoC4RJS1ptGfko3iBBd5k",
16
+ "bucket_name": "umap-default",
17
+ "region_name": "eu",
18
+ "endpoint_url": "http://127.0.0.1:9000",
19
+ },
20
+ },
21
+ "data": {
22
+ "BACKEND": "umap.storage.s3.S3DataStorage",
23
+ "OPTIONS": {
24
+ "access_key": "OScTD3CClCcO54Ax2DLz",
25
+ "secret_key": "eK9tfPRHoFh0nKLkZpJJoC4RJS1ptGfko3iBBd5k",
26
+ "bucket_name": "umap",
27
+ "region_name": "eu",
28
+ "endpoint_url": "http://127.0.0.1:9000",
29
+ },
30
+ },
31
+ "staticfiles": {
32
+ "BACKEND": "storages.backends.s3.S3Storage",
33
+ "OPTIONS": {
34
+ "access_key": "OScTD3CClCcO54Ax2DLz",
35
+ "secret_key": "eK9tfPRHoFh0nKLkZpJJoC4RJS1ptGfko3iBBd5k",
36
+ "bucket_name": "umap-staticfiles",
37
+ "region_name": "eu",
38
+ "endpoint_url": "http://127.0.0.1:9000",
39
+ "default_acl": "public-read",
40
+ # "querystring_auth": False,
41
+ },
42
+ },
43
+ }
44
+
45
+ # STATIC_URL = "http://127.0.0.1:9000/umap-staticfiles/"
@@ -1,3 +1,6 @@
1
+ .umap-form-inline {
2
+ display: inline;
3
+ }
1
4
  input[type="text"], input[type="password"], input[type="date"],
2
5
  input[type="datetime-local"], input[type="email"], input[type="number"],
3
6
  input[type="search"], input[type="tel"], input[type="time"], input[type="file"],
@@ -658,6 +658,18 @@ class Feature {
658
658
  )
659
659
  return items
660
660
  }
661
+
662
+ isActive() {
663
+ return this._umap.activeFeature === this
664
+ }
665
+
666
+ activate() {
667
+ this._umap.activeFeature = this
668
+ }
669
+
670
+ deactivate() {
671
+ if (this._umap.activeFeature === this) this._umap.activeFeature = undefined
672
+ }
661
673
  }
662
674
 
663
675
  export class Point extends Feature {
@@ -526,15 +526,13 @@ export class DataLayer extends ServerStored {
526
526
  }
527
527
 
528
528
  async importFromFiles(files, type) {
529
- let all = []
529
+ const toLoad = []
530
530
  for (const file of files) {
531
- const features = await this.importFromFile(file, type)
532
- if (features) {
533
- all = all.concat(features)
534
- }
531
+ toLoad.push(this.importFromFile(file, type))
535
532
  }
533
+ const features = await Promise.all(toLoad)
536
534
  return new Promise((resolve) => {
537
- resolve(all)
535
+ resolve([].concat(...features))
538
536
  })
539
537
  }
540
538
 
@@ -64,7 +64,10 @@ export default class Importer extends Utils.WithTemplate {
64
64
  this.TYPES = ['geojson', 'csv', 'gpx', 'kml', 'osm', 'georss', 'umap']
65
65
  this.IMPORTERS = []
66
66
  this.loadImporters()
67
- this.dialog = new Dialog({ className: 'importers dark' })
67
+ this.dialog = new Dialog({
68
+ className: 'importers dark',
69
+ back: () => this.showImporters(),
70
+ })
68
71
  }
69
72
 
70
73
  loadImporters() {
@@ -172,7 +175,7 @@ export default class Importer extends Utils.WithTemplate {
172
175
  button.addEventListener('click', () => plugin.open(this))
173
176
  grid.appendChild(button)
174
177
  }
175
- this.dialog.open({ template: element, cancel: false, accept: false })
178
+ this.dialog.open({ template: element, cancel: false, accept: false, back: false })
176
179
  }
177
180
 
178
181
  build() {
@@ -355,9 +358,11 @@ export default class Importer extends Utils.WithTemplate {
355
358
 
356
359
  onSuccess(count) {
357
360
  if (count) {
358
- Alert.success(translate('Successfully imported {count} feature(s)'), {
359
- count: count,
360
- })
361
+ Alert.success(
362
+ translate('Successfully imported {count} feature(s)', {
363
+ count: count,
364
+ })
365
+ )
361
366
  } else {
362
367
  Alert.success(translate('Data successfully imported!'))
363
368
  }
@@ -22,7 +22,7 @@ export function getClass(name) {
22
22
 
23
23
  export const RECENT = []
24
24
 
25
- const BaseIcon = L.DivIcon.extend({
25
+ const BaseIcon = DivIcon.extend({
26
26
  initialize: function (options) {
27
27
  const default_options = {
28
28
  iconSize: null, // Made in css
@@ -86,6 +86,7 @@ const DefaultIcon = BaseIcon.extend({
86
86
  },
87
87
 
88
88
  _setIconStyles: function (img, name) {
89
+ if (this.feature.isActive()) this.options.className += ' umap-icon-active'
89
90
  BaseIcon.prototype._setIconStyles.call(this, img, name)
90
91
  const color = this._getColor()
91
92
  const opacity = this._getOpacity()
@@ -233,12 +233,8 @@ const ManageTilelayerMixin = {
233
233
  },
234
234
 
235
235
  updateTileLayers: function () {
236
- const callback = (tilelayer) => {
237
- this.options.tilelayer = tilelayer.toJSON()
238
- this._umap.isDirty = true
239
- }
240
236
  if (this._controls.tilelayersChooser) {
241
- this._controls.tilelayersChooser.openSwitcher({ callback, edit: true })
237
+ this._controls.tilelayersChooser.openSwitcher({ edit: true })
242
238
  }
243
239
  },
244
240
  }
@@ -263,8 +259,12 @@ export const LeafletMap = BaseMap.extend({
263
259
  this.loader.onAdd(this)
264
260
 
265
261
  if (!this.options.noControl) {
266
- DomEvent.on(document.body, 'dataloading', (e) => this.fire('dataloading', e))
267
- DomEvent.on(document.body, 'dataload', (e) => this.fire('dataload', e))
262
+ DomEvent.on(document.body, 'dataloading', (event) =>
263
+ this.fire('dataloading', event.detail)
264
+ )
265
+ DomEvent.on(document.body, 'dataload', (event) =>
266
+ this.fire('dataload', event.detail)
267
+ )
268
268
  this.on('click', this.closeInplaceToolbar)
269
269
  }
270
270
 
@@ -238,11 +238,15 @@ export const LeafletMarker = Marker.extend({
238
238
  },
239
239
 
240
240
  highlight: function () {
241
- DomUtil.addClass(this.options.icon.elements.main, 'umap-icon-active')
241
+ this.feature.activate()
242
+ this._redraw()
243
+ this._bringToFront()
242
244
  },
243
245
 
244
246
  resetHighlight: function () {
245
- DomUtil.removeClass(this.options.icon.elements.main, 'umap-icon-active')
247
+ this.feature.deactivate()
248
+ this._redraw()
249
+ this._resetZIndex()
246
250
  },
247
251
 
248
252
  getPopupToolbarAnchor: function () {
@@ -47,8 +47,8 @@ class BaseRequest {
47
47
  // In case of error, an alert is sent, but non 20X status are not handled
48
48
  // The consumer must check the response status by hand
49
49
  export class Request extends BaseRequest {
50
- fire(name, params) {
51
- document.body.dispatchEvent(new CustomEvent(name, params))
50
+ fire(name, detail) {
51
+ document.body.dispatchEvent(new CustomEvent(name, { detail }))
52
52
  }
53
53
 
54
54
  async _fetch(method, uri, headers, data) {
@@ -6,6 +6,7 @@ const TEMPLATE = `
6
6
  <form method="dialog" data-ref="form">
7
7
  <ul class="buttons">
8
8
  <li><i class="icon icon-16 icon-close" data-close></i></li>
9
+ <li hidden data-ref="back"><i class="icon icon-16 icon-back"></i></li>
9
10
  </ul>
10
11
  <h3 data-ref="message" id="${Math.round(Date.now()).toString(36)}"></h3>
11
12
  <fieldset data-ref="fieldset" role="document">
@@ -123,6 +124,10 @@ export default class Dialog extends WithTemplate {
123
124
  } else {
124
125
  this.elements.template.innerHTML = dialog.template || ''
125
126
  }
127
+ this.elements.back.hidden = !dialog.back
128
+ if (dialog.back) {
129
+ this.elements.back.addEventListener('click', dialog.back)
130
+ }
126
131
 
127
132
  this.focusable = this.getFocusable()
128
133
  this.hasFormData = this.elements.fieldset.elements.length > 0
@@ -218,6 +218,14 @@ export default class Umap extends ServerStored {
218
218
  this.fire('seteditedfeature')
219
219
  }
220
220
 
221
+ get activeFeature() {
222
+ return this._activeFeature
223
+ }
224
+
225
+ set activeFeature(feature) {
226
+ this._activeFeature = feature
227
+ }
228
+
221
229
  setPropertiesFromQueryString() {
222
230
  const asBoolean = (key) => {
223
231
  const value = this.searchParams.get(key)
@@ -570,9 +578,11 @@ export default class Umap extends ServerStored {
570
578
  }
571
579
  this.datalayersLoaded = true
572
580
  this.fire('datalayersloaded')
581
+ const toLoad = []
573
582
  for (const datalayer of this.datalayersIndex) {
574
- if (datalayer.showAtLoad()) await datalayer.show()
583
+ if (datalayer.showAtLoad()) toLoad.push(datalayer.show())
575
584
  }
585
+ await Promise.all(toLoad)
576
586
  this.dataloaded = true
577
587
  this.fire('dataloaded')
578
588
  }
@@ -643,6 +653,12 @@ export default class Umap extends ServerStored {
643
653
  // have changed, we'll be more subtil when we'll remove the
644
654
  // save action
645
655
  this.render(['name', 'user', 'permissions'])
656
+ if (!this._leafletMap.listens('saved')) {
657
+ // When we save only layers, we don't have the map feedback message
658
+ this._leafletMap.on('saved', () => {
659
+ Alert.success(translate('Map has been saved!'))
660
+ })
661
+ }
646
662
  this.fire('saved')
647
663
  }
648
664
 
@@ -1184,7 +1200,7 @@ export default class Umap extends ServerStored {
1184
1200
  geometry() {
1185
1201
  /* Return a GeoJSON geometry Object */
1186
1202
  const latlng = this._leafletMap.latLng(
1187
- this._leafletMap.options.center || this._leafletMap.getCenter()
1203
+ this.properties.center || this._leafletMap.getCenter()
1188
1204
  )
1189
1205
  return {
1190
1206
  type: 'Point',
@@ -1426,9 +1442,14 @@ export default class Umap extends ServerStored {
1426
1442
  const row = DomUtil.create('li', 'orderable', ul)
1427
1443
  DomUtil.createIcon(row, 'icon-drag', translate('Drag to reorder'))
1428
1444
  datalayer.renderToolbox(row)
1429
- const title = DomUtil.add('span', '', row, datalayer.options.name)
1445
+ const builder = new U.FormBuilder(
1446
+ datalayer,
1447
+ [['options.name', { handler: 'EditableText' }]],
1448
+ { className: 'umap-form-inline' }
1449
+ )
1450
+ const form = builder.build()
1451
+ row.appendChild(form)
1430
1452
  row.classList.toggle('off', !datalayer.isVisible())
1431
- title.textContent = datalayer.options.name
1432
1453
  row.dataset.id = stamp(datalayer)
1433
1454
  })
1434
1455
  const onReorder = (src, dst, initialIndex, finalIndex) => {
@@ -1662,8 +1683,8 @@ export default class Umap extends ServerStored {
1662
1683
  }
1663
1684
 
1664
1685
  _setCenterAndZoom() {
1665
- this._leafletMap.options.center = this._leafletMap.getCenter()
1666
- this._leafletMap.options.zoom = this._leafletMap.getZoom()
1686
+ this.properties.center = this._leafletMap.getCenter()
1687
+ this.properties.zoom = this._leafletMap.getZoom()
1667
1688
  this.isDirty = true
1668
1689
  this._defaultExtent = false
1669
1690
  }
@@ -683,10 +683,13 @@ U.TileLayerChooser = L.Control.extend({
683
683
  L.DomEvent.on(
684
684
  el,
685
685
  'click',
686
- function () {
686
+ () => {
687
687
  this.map.selectTileLayer(tilelayer)
688
688
  this.map._controls.tilelayers.setLayers()
689
- if (options?.callback) options.callback(tilelayer)
689
+ if (options?.edit) {
690
+ this.map._umap.properties.tilelayer = tilelayer.toJSON()
691
+ this.map._umap.isDirty = true
692
+ }
690
693
  },
691
694
  this
692
695
  )
@@ -942,11 +945,11 @@ L.Control.Loading.include({
942
945
  },
943
946
 
944
947
  _showIndicator: function () {
945
- L.DomUtil.addClass(this._map._container, 'umap-loading')
948
+ this._map._container.classList.add('umap-loading')
946
949
  },
947
950
 
948
951
  _hideIndicator: function () {
949
- L.DomUtil.removeClass(this._map._container, 'umap-loading')
952
+ this._map._container.classList.remove('umap-loading')
950
953
  },
951
954
  })
952
955
 
@@ -259,6 +259,35 @@ L.FormBuilder.CheckBox.include({
259
259
  },
260
260
  })
261
261
 
262
+ L.FormBuilder.EditableText = L.FormBuilder.Element.extend({
263
+ build: function () {
264
+ this.input = L.DomUtil.create('span', this.options.className || '', this.parentNode)
265
+ this.input.contentEditable = true
266
+ this.fetch()
267
+ L.DomEvent.on(this.input, 'input', this.sync, this)
268
+ L.DomEvent.on(this.input, 'keypress', this.onKeyPress, this)
269
+ },
270
+
271
+ getParentNode: function () {
272
+ return this.form
273
+ },
274
+
275
+ value: function () {
276
+ return this.input.textContent
277
+ },
278
+
279
+ fetch: function () {
280
+ this.input.textContent = this.toHTML()
281
+ },
282
+
283
+ onKeyPress: function (event) {
284
+ if (event.keyCode === 13) {
285
+ event.preventDefault()
286
+ this.input.blur()
287
+ }
288
+ },
289
+ })
290
+
262
291
  L.FormBuilder.ColorPicker = L.FormBuilder.Input.extend({
263
292
  colors: U.COLORS,
264
293
  getParentNode: function () {
@@ -1192,6 +1221,21 @@ U.FormBuilder = L.FormBuilder.extend({
1192
1221
  }
1193
1222
  },
1194
1223
 
1224
+ getter: function (field) {
1225
+ const path = field.split('.')
1226
+ let value = this.obj
1227
+ let sub
1228
+ for (sub of path) {
1229
+ try {
1230
+ value = value[sub]
1231
+ } catch {
1232
+ console.log(field)
1233
+ }
1234
+ }
1235
+ if (value === undefined) values = U.SCHEMA[sub]?.default
1236
+ return value
1237
+ },
1238
+
1195
1239
  finish: (event) => {
1196
1240
  event.helper?.input?.blur()
1197
1241
  },
umap/static/umap/map.css CHANGED
@@ -924,7 +924,6 @@ a.umap-control-caption,
924
924
  width: 2px;
925
925
  }
926
926
  .umap-icon-active {
927
- z-index: var(--zindex-icon-active)!important;
928
927
  opacity: 1.0!important;
929
928
  }
930
929
  .umap-edit-enabled .readonly {
@@ -935,173 +934,42 @@ a.umap-control-caption,
935
934
  /* ********************************* */
936
935
  /* Ajax loader */
937
936
  /* ********************************* */
938
- .umap-loading .umap-loader
939
- {
940
- display: block;
941
- -webkit-animation: shift-rightwards 3s ease-in-out infinite;
942
- -moz-animation: shift-rightwards 3s ease-in-out infinite;
943
- -ms-animation: shift-rightwards 3s ease-in-out infinite;
944
- -o-animation: shift-rightwards 3s ease-in-out infinite;
945
- animation: shift-rightwards 3s ease-in-out infinite;
946
- -webkit-animation-delay: .2s;
947
- -moz-animation-delay: .2s;
948
- -o-animation-delay: .2s;
949
- animation-delay: .2s;
950
- }
951
937
  .umap-loader {
952
- position: absolute;
953
- display: none;
954
- top: 0;
955
- left: 0;
956
- right: 0;
957
- height: 4px;
958
- z-index: var(--zindex-loader);
959
- background-color: #79c1c0 !important;
960
- -webkit-transform: translateX(100%);
961
- -moz-transform: translateX(100%);
962
- -o-transform: translateX(100%);
963
- transform: translateX(100%);
964
- }
965
-
966
-
967
- @-webkit-keyframes shift-rightwards
968
- {
969
- 0%
970
- {
971
- -webkit-transform:translateX(-100%);
972
- -moz-transform:translateX(-100%);
973
- -o-transform:translateX(-100%);
974
- transform:translateX(-100%);
975
- }
976
-
977
- 40%
978
- {
979
- -webkit-transform:translateX(0%);
980
- -moz-transform:translateX(0%);
981
- -o-transform:translateX(0%);
982
- transform:translateX(0%);
983
- }
984
-
985
- 60%
986
- {
987
- -webkit-transform:translateX(0%);
988
- -moz-transform:translateX(0%);
989
- -o-transform:translateX(0%);
990
- transform:translateX(0%);
991
- }
992
-
993
- 100%
994
- {
995
- -webkit-transform:translateX(100%);
996
- -moz-transform:translateX(100%);
997
- -o-transform:translateX(100%);
998
- transform:translateX(100%);
999
- }
1000
-
1001
- }
1002
- @-moz-keyframes shift-rightwards
1003
- {
1004
- 0%
1005
- {
1006
- -webkit-transform:translateX(-100%);
1007
- -moz-transform:translateX(-100%);
1008
- -o-transform:translateX(-100%);
1009
- transform:translateX(-100%);
1010
- }
1011
-
1012
- 40%
1013
- {
1014
- -webkit-transform:translateX(0%);
1015
- -moz-transform:translateX(0%);
1016
- -o-transform:translateX(0%);
1017
- transform:translateX(0%);
1018
- }
1019
-
1020
- 60%
1021
- {
1022
- -webkit-transform:translateX(0%);
1023
- -moz-transform:translateX(0%);
1024
- -o-transform:translateX(0%);
1025
- transform:translateX(0%);
1026
- }
1027
-
1028
- 100%
1029
- {
1030
- -webkit-transform:translateX(100%);
1031
- -moz-transform:translateX(100%);
1032
- -o-transform:translateX(100%);
1033
- transform:translateX(100%);
1034
- }
1035
-
1036
- }
1037
- @-o-keyframes shift-rightwards
1038
- {
1039
- 0%
1040
- {
1041
- -webkit-transform:translateX(-100%);
1042
- -moz-transform:translateX(-100%);
1043
- -o-transform:translateX(-100%);
1044
- transform:translateX(-100%);
1045
- }
1046
-
1047
- 40%
1048
- {
1049
- -webkit-transform:translateX(0%);
1050
- -moz-transform:translateX(0%);
1051
- -o-transform:translateX(0%);
1052
- transform:translateX(0%);
1053
- }
1054
-
1055
- 60%
1056
- {
1057
- -webkit-transform:translateX(0%);
1058
- -moz-transform:translateX(0%);
1059
- -o-transform:translateX(0%);
1060
- transform:translateX(0%);
1061
- }
1062
-
1063
- 100%
1064
- {
1065
- -webkit-transform:translateX(100%);
1066
- -moz-transform:translateX(100%);
1067
- -o-transform:translateX(100%);
1068
- transform:translateX(100%);
1069
- }
1070
-
938
+ width: 100%;
939
+ height: 6px;
940
+ display: inline-block;
941
+ position: absolute;
942
+ background: var(--color-brightCyan);
943
+ overflow: hidden;
944
+ display: none;
945
+ top: 0;
946
+ left: 0;
947
+ right: 0;
948
+ height: 4px;
949
+ z-index: var(--zindex-loader);
950
+ }
951
+ .umap-loader::after {
952
+ content: '';
953
+ box-sizing: border-box;
954
+ width: 0;
955
+ height: 4.8px;
956
+ background: var(--color-darkerGray);
957
+ position: absolute;
958
+ top: 0;
959
+ left: 0;
960
+ animation: animFw 10s linear infinite;
961
+ }
962
+
963
+ @keyframes animFw {
964
+ 0% {
965
+ width: 0;
966
+ }
967
+ 100% {
968
+ width: 100%;
969
+ }
1071
970
  }
1072
- @keyframes shift-rightwards
1073
- {
1074
- 0%
1075
- {
1076
- -webkit-transform:translateX(-100%);
1077
- -moz-transform:translateX(-100%);
1078
- -o-transform:translateX(-100%);
1079
- transform:translateX(-100%);
1080
- }
1081
-
1082
- 40%
1083
- {
1084
- -webkit-transform:translateX(0%);
1085
- -moz-transform:translateX(0%);
1086
- -o-transform:translateX(0%);
1087
- transform:translateX(0%);
1088
- }
1089
-
1090
- 60%
1091
- {
1092
- -webkit-transform:translateX(0%);
1093
- -moz-transform:translateX(0%);
1094
- -o-transform:translateX(0%);
1095
- transform:translateX(0%);
1096
- }
1097
-
1098
- 100%
1099
- {
1100
- -webkit-transform:translateX(100%);
1101
- -moz-transform:translateX(100%);
1102
- -o-transform:translateX(100%);
1103
- transform:translateX(100%);
1104
- }
971
+ .umap-loading .umap-loader {
972
+ display: block;
1105
973
  }
1106
974
 
1107
975
  /* *************************** */
umap/static/umap/vars.css CHANGED
@@ -48,7 +48,6 @@
48
48
  --zindex-autocomplete: 470;
49
49
  --zindex-dialog: 460;
50
50
  --zindex-contextmenu: 455;
51
- --zindex-icon-active: 450;
52
51
  --zindex-tooltip: 445;
53
52
  --zindex-panels: 440;
54
53
  --zindex-controls: 430;
umap/templates/base.html CHANGED
@@ -18,6 +18,7 @@
18
18
  <meta name="viewport"
19
19
  content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
20
20
  {# See https://evilmartians.com/chronicles/how-to-favicon-in-2021-six-files-that-fit-most-needs #}
21
+ {% autoescape off %}
21
22
  <link rel="icon"
22
23
  href="{% static 'umap/favicons/favicon.ico' %}"
23
24
  sizes="32x32">
@@ -28,6 +29,7 @@
28
29
  href="{% static 'umap/favicons/apple-touch-icon.png' %}">
29
30
  <!-- 180×180 -->
30
31
  <link rel="manifest" href="/manifest.webmanifest">
32
+ {% endautoescape %}
31
33
  </head>
32
34
  <body class="{% block body_class %}{% endblock body_class %}">
33
35
  {% block header %}
@@ -1,8 +1,10 @@
1
1
  {% load i18n static %}
2
2
 
3
+ {% autoescape off %}
3
4
  <style type="text/css">
4
5
  @import "{% static 'umap/js/components/alerts/alert.css' %}";
5
6
  </style>
7
+ {% endautoescape %}
6
8
  <template id="umap-alert-template">
7
9
  <div role="dialog" class="dark window umap-alert">
8
10
  <div>
@@ -97,6 +99,7 @@
97
99
  </div>
98
100
  </template>
99
101
  <umap-alert-conflict></umap-alert-conflict>
102
+ {% autoescape off %}
100
103
  <script type="module">
101
104
  import { register } from '{% static 'umap/js/components/base.js' %}'
102
105
  import {
@@ -108,3 +111,4 @@
108
111
  register(uMapAlertCreation, 'umap-alert-creation')
109
112
  register(uMapAlertConflict, 'umap-alert-conflict')
110
113
  </script>
114
+ {% endautoescape %}
@@ -1,5 +1,7 @@
1
1
  {% load static %}
2
2
 
3
+ {% autoescape off %}
4
+
3
5
  <link rel="stylesheet"
4
6
  href="{% static 'umap/vendors/leaflet/leaflet.css' %}" />
5
7
  <link rel="stylesheet"
@@ -39,3 +41,4 @@
39
41
  <link rel="stylesheet" href="{% static 'umap/css/tableeditor.css' %}" />
40
42
  <link rel="stylesheet" href="{% static 'umap/css/bar.css' %}" />
41
43
  <link rel="stylesheet" href="{% static 'umap/theme.css' %}" />
44
+ {% endautoescape %}
@@ -1,5 +1,6 @@
1
1
  {% load static %}
2
2
 
3
+ {% autoescape off %}
3
4
  <script type="module"
4
5
  src="{% static 'umap/vendors/leaflet/leaflet-src.esm.js' %}"
5
6
  defer></script>
@@ -42,3 +43,4 @@
42
43
  <script src="{% static 'umap/js/umap.forms.js' %}" defer></script>
43
44
  <script src="{% static 'umap/js/umap.controls.js' %}" defer></script>
44
45
  <script type="module" src="{% static 'umap/js/components/fragment.js' %}" defer></script>
46
+ {% endautoescape %}
@@ -5,7 +5,9 @@
5
5
  </div>
6
6
  <!-- djlint:off -->
7
7
  <script defer type="module">
8
+ {% autoescape off %}
8
9
  import Umap from '{% static "umap/js/modules/umap.js" %}'
10
+ {% endautoescape %}
9
11
  U.MAP = new Umap("map", {{ map_settings|notag|safe }})
10
12
  </script>
11
13
  <!-- djlint:on -->
@@ -46,7 +46,9 @@
46
46
  {% block bottom_js %}
47
47
  {{ block.super }}
48
48
  <script type="module">
49
+ {% autoescape off %}
49
50
  import Umap from '{% static "umap/js/modules/umap.js" %}'
51
+ {% endautoescape %}
50
52
  const CACHE = {}
51
53
  for (const mapOpener of document.querySelectorAll("button.map-opener")) {
52
54
  mapOpener.addEventListener('click', (event) => {
@@ -0,0 +1,19 @@
1
+ {
2
+ "crs": null,
3
+ "type": "FeatureCollection",
4
+ "features": [
5
+ {
6
+ "type": "Feature",
7
+ "geometry": {
8
+ "coordinates": [
9
+ -1.09314,
10
+ 50.791718
11
+ ],
12
+ "type": "Point"
13
+ },
14
+ "properties": {
15
+ "name": "Portsmouth"
16
+ }
17
+ }
18
+ ]
19
+ }
@@ -221,3 +221,14 @@ def test_deleting_datalayer_should_remove_from_caption(
221
221
  page.locator(".panel.right").get_by_title("Delete layer").click()
222
222
  page.get_by_role("button", name="OK").click()
223
223
  expect(panel.get_by_text("test datalayer")).to_be_hidden()
224
+
225
+
226
+ def test_can_edit_datalayer_name_in_list(live_server, openmap, datalayer, page):
227
+ page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit")
228
+ page.get_by_role("link", name="Manage layers").click()
229
+ page.get_by_text("test datalayer").click()
230
+ page.get_by_text("test datalayer").fill("test datalayer foobar")
231
+ page.get_by_role("button", name="Open browser").click()
232
+ expect(
233
+ page.locator(".panel.left").get_by_text("test datalayer foobar")
234
+ ).to_be_visible()
@@ -9,7 +9,6 @@ from playwright.sync_api import expect
9
9
 
10
10
  from umap.models import DataLayer
11
11
 
12
- from ..base import mock_tiles
13
12
  from .helpers import save_and_get_json
14
13
 
15
14
  pytestmark = pytest.mark.django_db
@@ -765,3 +764,23 @@ def test_import_georss_from_textarea(tilelayer, live_server, page):
765
764
  # A layer has been created
766
765
  expect(layers).to_have_count(1)
767
766
  expect(markers).to_have_count(1)
767
+
768
+
769
+ def test_import_from_multiple_files(live_server, page, tilelayer):
770
+ page.goto(f"{live_server.url}/map/new/")
771
+ page.get_by_title("Import data").click()
772
+ file_input = page.locator("input[type='file']")
773
+ with page.expect_file_chooser() as fc_info:
774
+ file_input.click()
775
+ file_chooser = fc_info.value
776
+ FIXTURES = Path(__file__).parent.parent / "fixtures"
777
+ paths = [
778
+ FIXTURES / "test_upload_data.json",
779
+ FIXTURES / "test_upload_simple_marker.json",
780
+ ]
781
+ file_chooser.set_files(paths)
782
+ markers = page.locator(".leaflet-marker-icon")
783
+ expect(markers).to_have_count(0)
784
+ page.get_by_role("button", name="Import data", exact=True).click()
785
+ # Two in one file, one in the other
786
+ expect(markers).to_have_count(3)
@@ -0,0 +1,82 @@
1
+ import pytest
2
+ from django.contrib.auth import get_user_model
3
+ from django.urls import reverse
4
+
5
+ from umap.models import Map
6
+
7
+ from .base import MapFactory, UserFactory
8
+
9
+ User = get_user_model()
10
+
11
+ pytestmark = pytest.mark.django_db
12
+
13
+
14
+ def test_user_dashboard_is_restricted_to_logged_in(client):
15
+ response = client.get(reverse("user_dashboard"))
16
+ assert response.status_code == 302
17
+ assert response["Location"] == "/en/login/?next=/en/me"
18
+
19
+
20
+ def test_user_dashboard_display_user_maps(client, map):
21
+ client.login(username=map.owner.username, password="123123")
22
+ response = client.get(reverse("user_dashboard"))
23
+ assert response.status_code == 200
24
+ body = response.content.decode()
25
+ assert map.name in body
26
+ assert f"{map.get_absolute_url()}?edit" in body
27
+ assert f"{map.get_absolute_url()}?share" in body
28
+ assert f"/map/{map.pk}/download" in body
29
+ assert "Everyone (public)" in body
30
+ assert "Owner only" in body
31
+
32
+
33
+ def test_user_dashboard_do_not_display_blocked_user_maps(client, map):
34
+ map.share_status = Map.BLOCKED
35
+ map.save()
36
+ client.login(username=map.owner.username, password="123123")
37
+ response = client.get(reverse("user_dashboard"))
38
+ assert response.status_code == 200
39
+ body = response.content.decode()
40
+ assert map.name not in body
41
+
42
+
43
+ def test_user_dashboard_do_not_display_deleted_user_maps(client, map):
44
+ map.share_status = Map.DELETED
45
+ map.save()
46
+ client.login(username=map.owner.username, password="123123")
47
+ response = client.get(reverse("user_dashboard"))
48
+ assert response.status_code == 200
49
+ body = response.content.decode()
50
+ assert map.name not in body
51
+
52
+
53
+ @pytest.mark.parametrize("share_status", [Map.DRAFT, Map.PRIVATE, Map.PUBLIC, Map.OPEN])
54
+ def test_user_dashboard_display_user_team_maps(client, map, team, user, share_status):
55
+ user.teams.add(team)
56
+ user.save()
57
+ map.team = team
58
+ map.share_status = share_status
59
+ map.save()
60
+ assert map.owner != user
61
+ client.login(username=user.username, password="123123")
62
+ response = client.get(reverse("user_dashboard"))
63
+ assert response.status_code == 200
64
+ body = response.content.decode()
65
+ assert map.name in body
66
+ assert map.get_absolute_url() in body
67
+
68
+
69
+ def test_user_dashboard_display_user_maps_distinct(client, map):
70
+ # cf https://github.com/umap-project/umap/issues/1325
71
+ anonymap = MapFactory(name="Map witout owner should not appear")
72
+ user1 = UserFactory(username="user1")
73
+ user2 = UserFactory(username="user2")
74
+ map.editors.add(user1)
75
+ map.editors.add(user2)
76
+ map.save()
77
+ client.login(username=map.owner.username, password="123123")
78
+ response = client.get(reverse("user_dashboard"))
79
+ assert response.status_code == 200
80
+ body = response.content.decode()
81
+ assert body.count(f'<a href="/en/map/test-map_{map.pk}">test map</a>') == 1
82
+ assert body.count(anonymap.name) == 0
@@ -1,7 +1,7 @@
1
1
  import pytest
2
2
  from django.urls import reverse
3
3
 
4
- from umap.models import Team
4
+ from umap.models import Map, Team
5
5
 
6
6
  pytestmark = pytest.mark.django_db
7
7
 
@@ -15,6 +15,40 @@ def test_can_see_team_maps(client, map, team):
15
15
  assert map.name in response.content.decode()
16
16
 
17
17
 
18
+ @pytest.mark.parametrize("share_status", [Map.PRIVATE, Map.DRAFT])
19
+ def test_others_cannot_see_team_private_maps_in_team_page(
20
+ client, map, team, user, share_status
21
+ ):
22
+ map.team = team
23
+ map.share_status = share_status
24
+ map.save()
25
+ url = reverse("team_maps", args=(team.pk,))
26
+ response = client.get(url)
27
+ assert response.status_code == 200
28
+ assert map.name not in response.content.decode()
29
+ # User is not in team
30
+ client.login(username=user.username, password="123123")
31
+ response = client.get(url)
32
+ assert response.status_code == 200
33
+ assert map.name not in response.content.decode()
34
+
35
+
36
+ @pytest.mark.parametrize("share_status", [Map.PRIVATE, Map.DRAFT])
37
+ def test_members_can_see_private_maps_in_team_page(
38
+ client, map, team, user, share_status
39
+ ):
40
+ map.team = team
41
+ map.share_status = share_status
42
+ map.save()
43
+ user.teams.add(team)
44
+ user.save()
45
+ url = reverse("team_maps", args=(team.pk,))
46
+ client.login(username=user.username, password="123123")
47
+ response = client.get(url)
48
+ assert response.status_code == 200
49
+ assert map.name in response.content.decode()
50
+
51
+
18
52
  def test_user_can_see_their_teams(client, team, user):
19
53
  user.teams.add(team)
20
54
  user.save()
umap/tests/test_views.py CHANGED
@@ -267,80 +267,6 @@ def test_change_user_slug(client, user, settings):
267
267
  assert f"/en/user/{user.pk}/" in response.content.decode()
268
268
 
269
269
 
270
- @pytest.mark.django_db
271
- def test_user_dashboard_is_restricted_to_logged_in(client):
272
- response = client.get(reverse("user_dashboard"))
273
- assert response.status_code == 302
274
- assert response["Location"] == "/en/login/?next=/en/me"
275
-
276
-
277
- @pytest.mark.django_db
278
- def test_user_dashboard_display_user_maps(client, map):
279
- client.login(username=map.owner.username, password="123123")
280
- response = client.get(reverse("user_dashboard"))
281
- assert response.status_code == 200
282
- body = response.content.decode()
283
- assert map.name in body
284
- assert f"{map.get_absolute_url()}?edit" in body
285
- assert f"{map.get_absolute_url()}?share" in body
286
- assert f"/map/{map.pk}/download" in body
287
- assert "Everyone (public)" in body
288
- assert "Owner only" in body
289
-
290
-
291
- @pytest.mark.django_db
292
- def test_user_dashboard_do_not_display_blocked_user_maps(client, map):
293
- map.share_status = Map.BLOCKED
294
- map.save()
295
- client.login(username=map.owner.username, password="123123")
296
- response = client.get(reverse("user_dashboard"))
297
- assert response.status_code == 200
298
- body = response.content.decode()
299
- assert map.name not in body
300
-
301
-
302
- @pytest.mark.django_db
303
- def test_user_dashboard_do_not_display_deleted_user_maps(client, map):
304
- map.share_status = Map.DELETED
305
- map.save()
306
- client.login(username=map.owner.username, password="123123")
307
- response = client.get(reverse("user_dashboard"))
308
- assert response.status_code == 200
309
- body = response.content.decode()
310
- assert map.name not in body
311
-
312
-
313
- @pytest.mark.django_db
314
- def test_user_dashboard_display_user_team_maps(client, map, team, user):
315
- user.teams.add(team)
316
- user.save()
317
- map.team = team
318
- map.save()
319
- client.login(username=user.username, password="123123")
320
- response = client.get(reverse("user_dashboard"))
321
- assert response.status_code == 200
322
- body = response.content.decode()
323
- assert map.name in body
324
- assert map.get_absolute_url() in body
325
-
326
-
327
- @pytest.mark.django_db
328
- def test_user_dashboard_display_user_maps_distinct(client, map):
329
- # cf https://github.com/umap-project/umap/issues/1325
330
- anonymap = MapFactory(name="Map witout owner should not appear")
331
- user1 = UserFactory(username="user1")
332
- user2 = UserFactory(username="user2")
333
- map.editors.add(user1)
334
- map.editors.add(user2)
335
- map.save()
336
- client.login(username=map.owner.username, password="123123")
337
- response = client.get(reverse("user_dashboard"))
338
- assert response.status_code == 200
339
- body = response.content.decode()
340
- assert body.count(f'<a href="/en/map/test-map_{map.pk}">test map</a>') == 1
341
- assert body.count(anonymap.name) == 0
342
-
343
-
344
270
  @pytest.mark.django_db
345
271
  def test_logout_should_return_redirect(client, user, settings):
346
272
  client.login(username=user.username, password="123123")
umap/views.py CHANGED
@@ -317,7 +317,11 @@ class TeamMaps(PaginatorMixin, DetailView):
317
317
  context_object_name = "current_team"
318
318
 
319
319
  def get_maps(self):
320
- return Map.public.filter(team=self.object).order_by("-modified_at")
320
+ qs = Map.public
321
+ user = self.request.user
322
+ if user.is_authenticated and user in self.object.users.all():
323
+ qs = Map.objects
324
+ return qs.filter(team=self.object).order_by("-modified_at")
321
325
 
322
326
  def get_context_data(self, **kwargs):
323
327
  kwargs.update(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: umap-project
3
- Version: 2.8.0a2
3
+ Version: 2.8.0b0
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>
@@ -1,4 +1,4 @@
1
- umap/__init__.py,sha256=0_15wRSL9SkA85FevSlxLo6H6SAySXR0t2XW5TtIIQA,20
1
+ umap/__init__.py,sha256=HZ0yMvM34f8qnnOHbQ9kawpYuPlBrkN42-iKFemdmLQ,20
2
2
  umap/admin.py,sha256=LoQytPGK6pLBqZ5QgQ9DIPAxhTG31cTtHOCqO9BY5S4,2645
3
3
  umap/apps.py,sha256=5ssKqPUuNJlapaBmr4LY_HDb7J1NFCT3wzythxQOOfs,109
4
4
  umap/asgi.py,sha256=CuVSNBwNb4AvuaD_Ha3ehtvf-c46ijZoVOSoP6WhXp8,432
@@ -12,7 +12,7 @@ umap/middleware.py,sha256=p8EPW_gYW8Wh2lk0DNIAkZQbYlBZugW7Yq4iiA7L4aE,514
12
12
  umap/models.py,sha256=4SzhKdyWXfJMdzEpCyVPnzbTT-TGbDusAy7SP_8UuwI,17929
13
13
  umap/urls.py,sha256=LA3zxyu-GDo8kVqdyU7_bdbDGhDJV8_yFW4oEPTXw4s,7559
14
14
  umap/utils.py,sha256=19i8ibi-1IXxafT4k_yOHMhD-DsPH74Ll9qw-UrUkM4,5856
15
- umap/views.py,sha256=hMBxefWDUZQUVUb5C477cVyL7hp7OfppZlu4_sw9L4o,46266
15
+ umap/views.py,sha256=Z1_X5FaAhco-O_Np6FP8nXDgG-bqOL005R_qWT_GsMg,46414
16
16
  umap/websocket_server.py,sha256=D9sTHhKg0DG37b8bw7KWTKMDc6TPyTkNLCVkh2mlFOo,6604
17
17
  umap/wsgi.py,sha256=IopIgnDZbCus3XpSetTHnra9VyzWi0Y2tJo-CmfTWCY,1132
18
18
  umap/bin/__init__.py,sha256=iA3ON4A6NCpenrn3q2OgefUKF5QRFIQS-FtS0pxruI8,234
@@ -149,6 +149,7 @@ umap/settings/__init__.py,sha256=aPJkOTk0uFusIBA-uOjdUi10R5Cxt4jl5yv2_uCTUvo,170
149
149
  umap/settings/base.py,sha256=rhaIDby2wSb4v8IBx_6xqHVnIigD4G0xzdHX2-9UfNM,11096
150
150
  umap/settings/dev.py,sha256=pj1mpmZXiI2syW8pB01wcVeqCFABF3V-nlOxArir4cw,386
151
151
  umap/settings/local.py.sample,sha256=wpnoe7qtXer_xBuhWbcbqcSCotTJRu6h8hG7N-sD0b4,3157
152
+ umap/settings/local_s3.py,sha256=tunaCRn_I7P0IZH-UJpB1I5ft2kE0ZIBY8GYZeLYyfM,1387
152
153
  umap/static/.gitignore,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
154
  umap/static/umap/base.css,sha256=oUvs6YBtFZCgOEk7tVhnlkooORFZ5e1I9qSFGNeBrlw,3771
154
155
  umap/static/umap/bitbucket.png,sha256=Z-xsnM3QOUn9tJQ0RjPXCpALghrzaDDZP7wSePSjSr8,9125
@@ -156,16 +157,16 @@ umap/static/umap/content.css,sha256=04_50AU8iF26_979Ds0sMby4LlKIpm3J08zsv1-blIY,
156
157
  umap/static/umap/font.css,sha256=fYmTKNd_Ts6TrmBbnLRgyeUS4vpfxkEqhLR-pkd3KrA,904
157
158
  umap/static/umap/github.png,sha256=Yiw6VX71qO87vNgJaDuirn3JVlUwrzIpkT9vbtROg1o,1564
158
159
  umap/static/umap/keycloak.png,sha256=K-23F1dda0wD_39dXN5KmGqmgFvde6baNiZ8gdk0NyY,16598
159
- umap/static/umap/map.css,sha256=thD4iHeGokMMbMKXj-QFlSwyyjZh5YHSSqUUR8Ts2EM,28473
160
+ umap/static/umap/map.css,sha256=B82ED0WSOrJs4kh943ThK-vi5sU6250DStSsDkfYhVw,25208
160
161
  umap/static/umap/nav.css,sha256=IKB8Ga8TRal8naxjsgrcrnCO2eaKUL3YNofJB9IN9l0,1865
161
162
  umap/static/umap/openstreetmap.png,sha256=xccBb_RsN7uchm7fRowVLjrzmCtj1-1PLByurkdjcr8,19408
162
163
  umap/static/umap/theme.css,sha256=gkbyghlT5kNfz0Qyg1JL7xalqvHVx321eO9qlnvcaAU,49
163
164
  umap/static/umap/twitter.png,sha256=BnVH7PcYlgKW56KHSOMRPevji2DvhJmvzFjl3-iF7c0,3225
164
- umap/static/umap/vars.css,sha256=ckkSD9F7D9-IM8P-6qnU8CAxIPS6yq-rNQnzsoofUPo,1856
165
+ umap/static/umap/vars.css,sha256=OUwPeNbExmoMkyCwmBtqOese9JqjvC87hvJRDP4u4S8,1825
165
166
  umap/static/umap/css/bar.css,sha256=u40xqJQtYgBDfhdELlXxkh9kPmn7T2pMEJQWeiG6EvA,4851
166
167
  umap/static/umap/css/contextmenu.css,sha256=AdPajFTy2M_yHbkMKDYdh45gRO4amNd0OXRYYDNZSI4,437
167
168
  umap/static/umap/css/dialog.css,sha256=9qwy9rOcTQY6SPkteM7dW1t36XQBJVoGETQatSOvffM,879
168
- umap/static/umap/css/form.css,sha256=CPBhU9tXuHeo6yng68v1LQcTEfsdM3nv2VNCWMYW3QM,13589
169
+ umap/static/umap/css/form.css,sha256=BW5R_mr4xXN1HaT97v6IPSFMQUH4tsxOm1eJkrpyVJI,13632
169
170
  umap/static/umap/css/icon.css,sha256=-lFltPt6bgAhzXPWqYW97JTY3Y22dbR7KXoOmLZQiU8,4328
170
171
  umap/static/umap/css/importers.css,sha256=iS3krkVPpqUQlPNQXSyByyho7rHBzxYqm04bPyKo_qY,1455
171
172
  umap/static/umap/css/panel.css,sha256=fRPw-dyrcRegoOxTOWTDjBwuI_aHNPmmBOY16flsCBI,3073
@@ -221,9 +222,9 @@ umap/static/umap/img/source/16-white.svg,sha256=0xOMZOwpZW72QHt4SPao4BEr2lE6kZvW
221
222
  umap/static/umap/img/source/16.svg,sha256=r3ZFL-rjyozbiboXDQOkoCLHW-0LTQa4Di9qF7z7qV0,44441
222
223
  umap/static/umap/img/source/24-white.svg,sha256=t5713m3RdG9vunV2nUhLY4o4xT9v7ke3NY42g9FeAnE,29206
223
224
  umap/static/umap/img/source/24.svg,sha256=2HY-QmZc2_eV3TyqGLlzqgJXCLVbrzKQV5Q6JLWgNiI,38319
224
- umap/static/umap/js/umap.controls.js,sha256=gY3ej4xzkrFsaySkUD_bYXcaSKLgFN6P_e65cDch8hE,29947
225
+ umap/static/umap/js/umap.controls.js,sha256=gk6IFPepAJ6QRAX48PJWwukVjbxpzf3UANw0fF0VabQ,30016
225
226
  umap/static/umap/js/umap.core.js,sha256=FGx6GVcfrE_sn_izOt5r4DLkbO3-bv28jeXV8kwwUio,7029
226
- umap/static/umap/js/umap.forms.js,sha256=X0aTpmG5D2z-bSuD_Rpw73hx3o8Zz7d7qfBuvTpnYW4,31978
227
+ umap/static/umap/js/umap.forms.js,sha256=clc4Kb3F8jpGXlLiilgW6EQtFmEXmnXx9BfmkFEhkFo,32962
227
228
  umap/static/umap/js/components/base.js,sha256=gDb1fGuNCC1KEu4PlQflC1PDNyrulhqLhmlsjyCJpps,1575
228
229
  umap/static/umap/js/components/fragment.js,sha256=-rOrcyPpZ5ihD_hh0C1qrYpaim11JYh5fg0x_od_m5U,379
229
230
  umap/static/umap/js/components/alerts/alert.css,sha256=fSmbDDjXjEYLfgnEAVDhyqWiBOUy2YhVRy0_den-7Dk,4930
@@ -237,32 +238,32 @@ umap/static/umap/js/modules/formatter.js,sha256=drbIxbDGrcHOUtzJtC4B5iKpm8-YNg_b
237
238
  umap/static/umap/js/modules/global.js,sha256=7jm6NLZ5PM2yrkbWHdWkoDFcevgIAMqE-vZQRXcIgEo,934
238
239
  umap/static/umap/js/modules/help.js,sha256=0vsDTFGcPz2coG_LBeGPSUQupZTFUes6kCwQCPBUjuU,9694
239
240
  umap/static/umap/js/modules/i18n.js,sha256=dEpjsWoEZa-Tr5_MDO0tuWkt7kLL3crxXqhttyP-khU,1387
240
- umap/static/umap/js/modules/importer.js,sha256=6wqs2z-jrfcwvSFvmPuJWDnP9s1dUEe2Oi1ili3FZ0M,10961
241
+ umap/static/umap/js/modules/importer.js,sha256=1RTRY9w_fn24lMTlpH_ktbDvvNCO1VHDihN3oSu25co,11045
241
242
  umap/static/umap/js/modules/leaflet-configure.js,sha256=P3aD8iNGxuVNv-xW4Di4txAjNmnlpKtCCzDvPaKEdQ8,243
242
243
  umap/static/umap/js/modules/orderable.js,sha256=zDtcElZ_MVPoGba8Iv9bxOzk4vuN7C-5XVl4UomDYHE,2521
243
244
  umap/static/umap/js/modules/permissions.js,sha256=RxKrfjLo6hdGuAvwQrzUUJJznD5RkmSkAHVMidA9iKQ,8497
244
- umap/static/umap/js/modules/request.js,sha256=hMy3dleGRxstKsksbNa15w7jk4H9-nAV_ub-JdNhDD8,3881
245
+ umap/static/umap/js/modules/request.js,sha256=9GRJoOPbdkHL9OFP6Joaf5wzsJckPyiG2O7AxQciTik,3885
245
246
  umap/static/umap/js/modules/rules.js,sha256=z_QmGH5HdS1HVtJXBjQsGkz7kus_E2NocZAqaP7BN1g,7433
246
247
  umap/static/umap/js/modules/saving.js,sha256=oO6S23KldT19e3xM_iupw0ZDruyyCNHBx5e5wtrejhI,689
247
248
  umap/static/umap/js/modules/schema.js,sha256=RuBO5obpccTPH_iPXRU-lwyj1SoX9bp619tknrPiZjI,13141
248
249
  umap/static/umap/js/modules/share.js,sha256=s1X59VpMqut_Vhg7l7LV2IZDm9obRVbDH9wZbG5kX3c,7182
249
250
  umap/static/umap/js/modules/slideshow.js,sha256=zcRzOMkJvhps1npGRjHkdK4Ce3UkqOsv8OsDgQWO-bg,3567
250
251
  umap/static/umap/js/modules/tableeditor.js,sha256=6p2YE2-NF4NkwLDQkqrl90P_PwOYdFao0-ac_AkOwWs,9854
251
- umap/static/umap/js/modules/umap.js,sha256=VSU8p94tLKZBGeL1NWWmrsT81RTZNW1oROOxsUqeAxI,50071
252
+ umap/static/umap/js/modules/umap.js,sha256=4ZlODvjcUXMV6w1232yV95eD1YlJYajUy4l27E3rRxU,50575
252
253
  umap/static/umap/js/modules/urls.js,sha256=76cFqycj2O8huuoYYBvxnVt2Fc2UDbgrRsiv6lQmcSY,890
253
254
  umap/static/umap/js/modules/utils.js,sha256=fYzo-WjRzDZsdjv3CI9U4Es3AqOfuBCJuRq997m2EfQ,12309
254
- umap/static/umap/js/modules/data/features.js,sha256=rd5WpZoai3u4baWxi_8m2vtwGLuI-9hdH4PGnrjqg_4,31667
255
- umap/static/umap/js/modules/data/layer.js,sha256=uLEVGp3gFq7obA9Ij-RVz-VWqo9SwLQd1uBzmaKYo9o,35101
255
+ umap/static/umap/js/modules/data/features.js,sha256=rYkQ-rMDN6t69K0WyAqyHrg5YAMS3GDbkrK1LrudXAU,31890
256
+ umap/static/umap/js/modules/data/layer.js,sha256=rLoAqwPfxURJNSSweoaq1WsAlxOyGT1yFHAIuta4AsY,35097
256
257
  umap/static/umap/js/modules/importers/cadastrefr.js,sha256=KHqxHleFRFzNi98gegvUM1R6eJorAGGcMft_ktUg-ug,2262
257
258
  umap/static/umap/js/modules/importers/communesfr.js,sha256=6q6ilmYhhuSmgdrvfTyEDNyMLbc9J9Bt8VMZVXB8ZOA,1723
258
259
  umap/static/umap/js/modules/importers/datasets.js,sha256=StZbRiq_1vqe0OO1w66k5Lwzju8RntmHpWe9HWIDfRE,1372
259
260
  umap/static/umap/js/modules/importers/geodatamine.js,sha256=vIxANzNc1TAe3QcZroIxqNvos1vexBmKDTtzErBNiY4,2949
260
261
  umap/static/umap/js/modules/importers/overpass.js,sha256=cY2kb3Fs8tA6PqBjGyc5bI0mg7L1ijapIAkVGwEhSwI,3341
261
- umap/static/umap/js/modules/rendering/icon.js,sha256=hguSJt3wDqe0oSQIm1zrYSbyktKVQUWv-QTo5fYdlc8,7861
262
- umap/static/umap/js/modules/rendering/map.js,sha256=rmI6Y6HHWxWVNokhXl0ADkQDoHzJda5KRdrIZGWrzKI,12956
262
+ umap/static/umap/js/modules/rendering/icon.js,sha256=ZMN6R6ji1au3Iq7XrVLkXgDOzTveU-bMsnFewL0Kaz0,7938
263
+ umap/static/umap/js/modules/rendering/map.js,sha256=tASIpjHaTDlveiErTbmxH4eMywdVMQ9pZjZHQUykSf4,12880
263
264
  umap/static/umap/js/modules/rendering/popup.js,sha256=EHfOSPb8BmbGK6-DcGekfbIDpNjH-y8L2QnpfbJEr3Y,2604
264
265
  umap/static/umap/js/modules/rendering/template.js,sha256=LRLhU8kKoZpvyPR2h1E3XyfS4BY07p3b82KPZPk5rbU,7890
265
- umap/static/umap/js/modules/rendering/ui.js,sha256=KmAoFiLjiA6IqWzn8gK4U7H_361aAIXZjNWVgnxm_go,14323
266
+ umap/static/umap/js/modules/rendering/ui.js,sha256=Pz7vS8jhbTy7k70mXBFwR8OH1McI98NeRCT6Fc_x7pM,14317
266
267
  umap/static/umap/js/modules/rendering/layers/base.js,sha256=DeXxRwTatoxxGStT1tWyNQVCrIkbgd7ZaawIPxWIcOQ,2525
267
268
  umap/static/umap/js/modules/rendering/layers/classified.js,sha256=h4cKB4sZ05MTwlE_kur292HRHxdaSkuwIMmW5JaU-Ac,14679
268
269
  umap/static/umap/js/modules/rendering/layers/cluster.js,sha256=970BbIdiOUQTdNRRRA_4sY2L-1fTe6wb0wBFeuHZxww,3368
@@ -274,7 +275,7 @@ umap/static/umap/js/modules/sync/websocket.js,sha256=1UtvsTAm-gkfpBRcLPykPvDyax3
274
275
  umap/static/umap/js/modules/ui/bar.js,sha256=zoWNOKhs-Sf5pFTlPFoEAysS-AUF6ZlXdO5UA9jom2A,7570
275
276
  umap/static/umap/js/modules/ui/base.js,sha256=8PN8TRIBqTANRufwVvV0XzOdaYQuRCnlWGbTGq8FZiM,2491
276
277
  umap/static/umap/js/modules/ui/contextmenu.js,sha256=VzC94uGUt8DkzC60Gcbz-MxivfSITEqUC91Fkpq1gjk,2550
277
- umap/static/umap/js/modules/ui/dialog.js,sha256=Jh2jb4qjxx_eTGAU9cRZHwWhtyk2HFVg7dkP8eCtBLQ,5403
278
+ umap/static/umap/js/modules/ui/dialog.js,sha256=geAcMf2ajpNpDePDbaOz_kOiWOZWtpOHT7kBYqOHEa0,5620
278
279
  umap/static/umap/js/modules/ui/panel.js,sha256=phPWwCFxQ9AJ9auPPayD5Xtf6yQemQSZHlVlLANfTx0,3240
279
280
  umap/static/umap/js/modules/ui/tooltip.js,sha256=M2KBb5CA4AvaA-6QgfpUKMYQuGXzTqx4ZVA9fkMRBEs,1642
280
281
  umap/static/umap/locale/am_ET.js,sha256=TsgZgJkMMmFAJE0nJIq62r8hHvFgLLjcA6axXQlkbog,33822
@@ -454,7 +455,7 @@ umap/storage/s3.py,sha256=KAYu3vAqXbd5UhaoPxG6zcGtBfKZOzzi-6uY6YEuIcY,1962
454
455
  umap/storage/staticfiles.py,sha256=mxFcenC1JECmpNy4H0e7vX8GObDZVXzs1RPjQFWNd5k,2473
455
456
  umap/templates/404.html,sha256=1yLlD8rSF_9cfjm5FYy--P46HLVbHeFkJiW9nRzM--E,399
456
457
  umap/templates/500.html,sha256=Z8x47OVfYXquAYAlmRB0EJVTCiCaBppFFiFEmoYsMYY,5202
457
- umap/templates/base.html,sha256=_Q0Ikwese3vlUl0pKQdzHDy_oRT9OV4uWh0RGFaYAQA,1499
458
+ umap/templates/base.html,sha256=wb-WxYqyJ-GVQWJYrpVqLE4FYz3hOu0lJic6XL8VPxY,1548
458
459
  umap/templates/auth/user_detail.html,sha256=ud6AnM2ZK9WN8SuAnmKhZlGN0Wbi-GOzy09hoPfL04I,525
459
460
  umap/templates/auth/user_form.html,sha256=h9NZi9KIC_5jkvj5KAsxX5CdiYCrQ2lrl9qpr5ObPcg,1730
460
461
  umap/templates/auth/user_stars.html,sha256=LAGZU50ki2SCqZ0o_NBfN7T2RDl-L_1EGLixu5OH4AY,545
@@ -464,17 +465,17 @@ umap/templates/umap/about_summary.html,sha256=5pvCvX34YHk_XCtZfcRSznvRwi_-UJMioD
464
465
  umap/templates/umap/branding.html,sha256=8IzkIWqiZckgkX9FC-n1v6f8JIB2q7DcX3JHscxsaYA,60
465
466
  umap/templates/umap/content.html,sha256=KfNQ18LcbxFd00tHQeirGy5Vh75qQNM6pj0bQbcy4Bo,2246
466
467
  umap/templates/umap/content_footer.html,sha256=wkdc4Usuq4-vDIJHPxv-KS6KL4gBkUl7ARyU7zz1Zis,1154
467
- umap/templates/umap/css.html,sha256=kOo_21HmUKEfZk6rUtZaBbiidens27wDUH3fdYEoU-k,2266
468
+ umap/templates/umap/css.html,sha256=rlqw64vDT-mpl3Ckv6izFuU-BQHJwXw9Aw1TeFmhL80,2308
468
469
  umap/templates/umap/dashboard_menu.html,sha256=DEzGwiL_U1ntDpY0Ybda5ijDMSNw-n7Vb-V7HrsqYgo,688
469
470
  umap/templates/umap/footer.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
470
471
  umap/templates/umap/header.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
471
472
  umap/templates/umap/home.html,sha256=021I4eVLjMWvhsIqo2k2FADXla2c4UClAJ1uy9R5KVI,839
472
- umap/templates/umap/js.html,sha256=txh_b153ORSG9OSMxgQp9jbZHwtVoWWzt6fBFiIK7sE,2425
473
+ umap/templates/umap/js.html,sha256=5BFbBGsBpebyGgn8yTnj-TEZ1qrWQUTjDC4AJHLdnug,2466
473
474
  umap/templates/umap/locale.js,sha256=AP-mSJQq5RyC3eNaBbk-sOsD80r0_qlvuK1afXdsVo4,112
474
475
  umap/templates/umap/login_popup_end.html,sha256=kcENvhycpVvvIzbNasX1rcSI_67A6pttkWCxy0vHC8g,693
475
476
  umap/templates/umap/map_detail.html,sha256=xMOsbF7NWJ-mpShR0ciJ8MrTeG2OYDm8OIL0yHbW6eg,1192
476
477
  umap/templates/umap/map_fragment.html,sha256=ZRIA3W2tuIecv2LtxyKNSW4k7PmCxRlFmI6TIKC1EV8,152
477
- umap/templates/umap/map_init.html,sha256=rfx8IUol6YTQwBcyaYBEuFDvFzTtFqs5Jh1Yc5gdGbs,285
478
+ umap/templates/umap/map_init.html,sha256=5hX7FE0vN6P70KFf8aKusOCERGzy9JoCPg7oyoIWfLQ,334
478
479
  umap/templates/umap/map_list.html,sha256=Jb-VU3dQdRWsW80nyyRq1Eb6UrhAoIfGleu1cNMJKwc,673
479
480
  umap/templates/umap/map_table.html,sha256=WrH86ybY_GzzRmALfON_oni9aFuIswgOtpTSJ5h8SEY,5778
480
481
  umap/templates/umap/messages.html,sha256=liEsg-I26XHb0FOBAbzFsZl2RfNQtGt-HKoE6jHefbI,190
@@ -487,9 +488,9 @@ umap/templates/umap/success.html,sha256=3FG4yWwtdF3zvVWQ2ZAjCkgv0kcSNZlUjgYy_b-X
487
488
  umap/templates/umap/team_confirm_delete.html,sha256=D4EKfuzVjAexHKPHRsSHpjuAjMNl0iCPtaW2NEGUk2A,448
488
489
  umap/templates/umap/team_detail.html,sha256=4gd8YjvVqGysXNJtzAaZwOpBAADLzJ_ekFRPQp1sHYM,699
489
490
  umap/templates/umap/team_form.html,sha256=yG_zxmJfEwLC5Mof-4SHYcx6lfkOjbGVusQGT7iqSNs,1922
490
- umap/templates/umap/user_dashboard.html,sha256=kMKk8YHDJkLzs9M9ZBMkrshnDtknrt2dn6OXQb3FeMw,2478
491
+ umap/templates/umap/user_dashboard.html,sha256=nls1Nzhwvv1QKI3fOV_2QPuQocCKVZ3STvBKXaKUJZ8,2527
491
492
  umap/templates/umap/user_teams.html,sha256=MfelqIwoLRVjvX-KpVtwqh0I7pNx3oDRhqmSRdpT4bs,1570
492
- umap/templates/umap/components/alerts/alert.html,sha256=eQRALES_PzIP3qs16eXq9SGz2KWODr4VY0tyl_hARCw,3482
493
+ umap/templates/umap/components/alerts/alert.html,sha256=ZvisQkz2GfK2jxEqTosYH72N5gIK1604ATVNa_vHT7U,3564
493
494
  umap/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
494
495
  umap/templatetags/umap_tags.py,sha256=OumX1AI9uWzNP3zbjexTz7lGp10FweW0NRFSsdQ_cuU,1759
495
496
  umap/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -497,6 +498,7 @@ umap/tests/base.py,sha256=x9GVS5eAzc1CHyNxx5gd2w0AJCeHIr4nmX4yak8LhyM,4768
497
498
  umap/tests/conftest.py,sha256=KQCZanCTl1ABLIKOuyxS_cpBoXGiwjDc29jsLBiSWxY,1633
498
499
  umap/tests/settings.py,sha256=tY70LMFXyo_WijswqGyeWai7vBzM62k7IA8pkkbc9y4,816
499
500
  umap/tests/test_clean_tilelayer.py,sha256=wGTd_AHOTmQ4QMswAyc-1_lJmQOSyhY3OahLAusEIdA,2515
501
+ umap/tests/test_dashboard.py,sha256=w9IgKdupP9JpixLqvNl6UKbglgFVN_dG_R9Zvw1SJy0,2880
500
502
  umap/tests/test_datalayer.py,sha256=NWX7o-sLOrq3nHT0GDywz5vtJU4HJhZZh11r_rWxhVA,9539
501
503
  umap/tests/test_datalayer_s3.py,sha256=6V3AK22AXkFNjx5__SyBk0Uj0rTDAjJQv67r7D_MDVc,4155
502
504
  umap/tests/test_datalayer_views.py,sha256=Fx_oQF3hBC2FVHTTjTScXbFS2d7FRKdBL7QFFexvKkg,22880
@@ -506,10 +508,10 @@ umap/tests/test_map.py,sha256=vrtheSMQNk45kBIcJ0QY9K7HKYee5yg4Vnp78DyaIwQ,5170
506
508
  umap/tests/test_map_views.py,sha256=EKLJnQ-xk_bkaJ6P7OJ2bnya5orbaSnWFV8GIYcjDNk,33823
507
509
  umap/tests/test_merge_features.py,sha256=uLZSW00WAI8_nZS0KPP8gg8U4nnky-XGb-VhhKUxv1M,2275
508
510
  umap/tests/test_statics.py,sha256=xKuxT8Xj5Ii7gKISuiSfDj7dpjmJ2Ierby3Lg-haZCg,1264
509
- umap/tests/test_team_views.py,sha256=vExhJ3c1cJ7vgxe0G20UzTKkzR5D2UgAapk09muUg5w,4481
511
+ umap/tests/test_team_views.py,sha256=edmqn_tx4XQ1sEQtB7CpuJT6WwQQiUyUYu8-ESZxFcw,5615
510
512
  umap/tests/test_tilelayer.py,sha256=toVpVutEvMLWKx5uH7ZbGNPGzqICZx1_S2OOpIfYPfQ,603
511
513
  umap/tests/test_utils.py,sha256=noh-AFL3qV-dNZYr8L1acsYC02SI710Bq2ZXV-jBEzk,407
512
- umap/tests/test_views.py,sha256=R8uTHHbZmYcDFpzFiFhNod214v15GI1r1yVJmtqeu2E,18444
514
+ umap/tests/test_views.py,sha256=5KXUH46dtjCItm4nqyrpvgnmM6_YMQ3zjcRPTC8rKBo,15820
513
515
  umap/tests/test_websocket_server.py,sha256=BQ9Sy5VC9kBAfPWVxqcXoi9yfq12nfNvBE_j5rTFk7w,696
514
516
  umap/tests/fixtures/categorized_highway.geojson,sha256=p7QHOd8nXi7yVq37gY6Ca8BXkjaLnDxW9Fq0Zcm3Fk4,15830
515
517
  umap/tests/fixtures/choropleth_region_chomage.geojson,sha256=mVVbYlf92Sr3wWH9ETm43FdHz1U3zjsn91HuU5H5r4Y,21325
@@ -529,6 +531,7 @@ umap/tests/fixtures/test_upload_empty_coordinates.json,sha256=-mJ_1orzUAROfE4PXc
529
531
  umap/tests/fixtures/test_upload_georss.xml,sha256=lfmVA0qGDakCG48jjsLmSIE1U6iZ9yyFuqqX6Srt8Js,1160
530
532
  umap/tests/fixtures/test_upload_missing_name.json,sha256=klSMHb6laTghzU4AdIG1_p5UZ1LbAJCCKnJea0qEFAI,4566
531
533
  umap/tests/fixtures/test_upload_non_linear_ring.json,sha256=WOR0NnJHNUUW6VKzZyIxU7WL1llnAmEVJwCWla6XOds,1525
534
+ umap/tests/fixtures/test_upload_simple_marker.json,sha256=jH15G5PxgVO-DZb4TPxVMAi1_uzhkvZcFkVUb50CS3Q,393
532
535
  umap/tests/integration/__init__.py,sha256=nqQ2miDnSZOKDuFhQ5saFN3qQuK73Cs6xL9Od-mEKG4,57
533
536
  umap/tests/integration/conftest.py,sha256=OTKeDdLBpFUsqFCnHD-QY2X1iv5m4jIaE__4T4qKdDY,2468
534
537
  umap/tests/integration/helpers.py,sha256=vvGX5b-DS2fMVDdeXz1lH2IleZkRHjyL7DVvatJU8Do,344
@@ -545,14 +548,14 @@ umap/tests/integration/test_dashboard.py,sha256=LClLBc8lgDM1-NGhkvUSUMLmMuKt3sR1
545
548
  umap/tests/integration/test_datalayer.py,sha256=cxsf65noYTucEMLuUz8DfJ9abXHhAq0n65MvdBmBRVo,5492
546
549
  umap/tests/integration/test_draw_polygon.py,sha256=Ub_1Witps_BLwMMmQ4M0vPIyQOEQ_Bq82znpJdWpCfY,25385
547
550
  umap/tests/integration/test_draw_polyline.py,sha256=lPr5hz-wHL9oC2B3yveNHC-OxdzWvcf8fHMBZbXTuss,14801
548
- umap/tests/integration/test_edit_datalayer.py,sha256=Q2y7IEd66f637pkjGYRs_EtFsfQJg40Dk-5ey44_LpA,9798
551
+ umap/tests/integration/test_edit_datalayer.py,sha256=vC_bpfw_eMvYzhu3x6E2vS4gDFb55Ud5p64mfRqZBf4,10292
549
552
  umap/tests/integration/test_edit_map.py,sha256=d76M4J6rumDQ6sKaOyTA45dWAkwAOtoUuNkW-GsA-fo,7134
550
553
  umap/tests/integration/test_edit_marker.py,sha256=sj4n2mCYQ-qZ02jFHA566Wg_y9F6oXb1AxddnthSQHI,4746
551
554
  umap/tests/integration/test_edit_polygon.py,sha256=JeIW6NcBltIl958uJ_T-0dRCT5gOo9JrNtULvg7nxf4,5286
552
555
  umap/tests/integration/test_export_map.py,sha256=jH0BXm-7Ov26OEkve9-xKMfRwXwR73zRrZLIQusyUOY,12112
553
556
  umap/tests/integration/test_facets_browser.py,sha256=J--y2rpI__0RIPzcTx4Kn2UwuurFdh-6i_Y4c6GxUyY,10658
554
557
  umap/tests/integration/test_features_id_generation.py,sha256=e99_8AxeMAi53JjVGlsI32zlrXGAU19FHJfTuYdiBVQ,1511
555
- umap/tests/integration/test_import.py,sha256=88ep2QaVJ26GF45dPIjwy9S3yCiVulZkTbEUYLDUPKA,30533
558
+ umap/tests/integration/test_import.py,sha256=dBkj-E9LSUTZvcMK8-MratR5aDz0jLrWEuh6Mek0vzg,31266
556
559
  umap/tests/integration/test_map.py,sha256=2ZO54RFVycJKGczfioX0nU1oCu29FVC9hR6wbT4s1NE,8736
557
560
  umap/tests/integration/test_map_list.py,sha256=l1FImKnJkY7DupYX8waKaUZqhnORR20L8dzaqu-eF8E,1280
558
561
  umap/tests/integration/test_map_preview.py,sha256=kP0vkEiUN7EJNCvZgNeUAzrrXfgwpU0S2UnmOBV4P5A,3540
@@ -572,8 +575,8 @@ umap/tests/integration/test_view_marker.py,sha256=ZLS6-GOWYpjeoYGHiHa7HesXJTLu9w
572
575
  umap/tests/integration/test_view_polygon.py,sha256=NMJC6Nt9VpQ8FIU9Pqq2OspHv49xsWlsoXCr8iBa0VA,2060
573
576
  umap/tests/integration/test_view_polyline.py,sha256=aJoXKmLhJaN0yhPdDCVskZNGx3q3mLDkjVPhZ30cadA,13959
574
577
  umap/tests/integration/test_websocket_sync.py,sha256=Xjn8z7Gj2PAmPmLkMTsHztFmhzsfyE3vg-wfewpA2I4,15511
575
- umap_project-2.8.0a2.dist-info/METADATA,sha256=Z8IXnRgLp4AOUzTAkfRUB5hatnauca2C0V7NrLZieHk,2993
576
- umap_project-2.8.0a2.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
577
- umap_project-2.8.0a2.dist-info/entry_points.txt,sha256=gz-KDQfEsMLBae8ABOD3foJsCYGPW1tA4Y394R_1RW8,39
578
- umap_project-2.8.0a2.dist-info/licenses/LICENSE,sha256=kQtrtRKgiPhcl7aO0-lmvbrNAXu7WHyiXvPrUk-TD2Q,820
579
- umap_project-2.8.0a2.dist-info/RECORD,,
578
+ umap_project-2.8.0b0.dist-info/METADATA,sha256=ekXJ1EOo5be6Xif-mk4mOSVmu58OjcCme27jSfmpLEA,2993
579
+ umap_project-2.8.0b0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
580
+ umap_project-2.8.0b0.dist-info/entry_points.txt,sha256=gz-KDQfEsMLBae8ABOD3foJsCYGPW1tA4Y394R_1RW8,39
581
+ umap_project-2.8.0b0.dist-info/licenses/LICENSE,sha256=kQtrtRKgiPhcl7aO0-lmvbrNAXu7WHyiXvPrUk-TD2Q,820
582
+ umap_project-2.8.0b0.dist-info/RECORD,,