Commit graph

2070 commits

Author SHA1 Message Date
Yohan Boniface
3998a88d43 wip: use dt/dd for import formats help box 2024-06-14 18:38:43 +02:00
Yohan Boniface
b0e9bbd86c wip: smaller dialog width 2024-06-14 18:38:30 +02:00
Yohan Boniface
35189cc9fb wip(importer): use only one submit button and be smarter to guess action 2024-06-14 18:38:30 +02:00
Yohan Boniface
8dd1c4bc7f wip: remove AutoComplete.URL (can't set class properties yet) 2024-06-14 18:38:30 +02:00
Yohan Boniface
1cefd4c9a7 wip: allow to control geodatamine baseUrl from settings 2024-06-14 18:38:30 +02:00
Yohan Boniface
d35e72dab9 wip: add aspoint attribute to geodatamine URL 2024-06-14 18:38:30 +02:00
Yohan Boniface
4e3228d114 feat: allow to create remote data layer from import panel
And make the form conditional.
2024-06-14 18:38:30 +02:00
Yohan Boniface
dbafe19b7f chore: declare ttl property in schema 2024-06-14 18:38:30 +02:00
Yohan Boniface
16fd5d8ca3 wip: typo 2024-06-14 18:38:30 +02:00
Yohan Boniface
342dcbabbe wip: no need for AVAILABLE_IMPORTERS 2024-06-14 18:38:30 +02:00
Yohan Boniface
f5eea1fe3f wip(naming): replace "plugin" by "importer"
We are not ready yet to talk about plugins
2024-06-14 18:38:30 +02:00
Yohan Boniface
93a189497b wip: control plugins from settings 2024-06-14 18:38:29 +02:00
Yohan Boniface
a7a214d7fe wip: deal with boundary types in geodatamine importer 2024-06-14 18:38:29 +02:00
Yohan Boniface
03ce8e90d6 wip: refactor importer 2024-06-14 18:38:29 +02:00
Yohan Boniface
c7cd87ec8a wip: move presets to importer plugins 2024-06-14 18:38:29 +02:00
Yohan Boniface
b657a5e9b3 wip: simpler importer API 2024-06-14 18:38:29 +02:00
Yohan Boniface
1e4de02694 wip: add a basic importer for commune shapes
Mainly wanted to have two improters to play with, in order to
better understand the common part, and thus the API we may define
between them and the importer panel.
2024-06-14 18:38:29 +02:00
Yohan Boniface
5b914c1bd2 wip: make it simpler to create an autocomplete class 2024-06-14 18:38:29 +02:00
Yohan Boniface
e51347e239 wip: very naive geodatamine and communes importers 2024-06-14 18:38:29 +02:00
Yohan Boniface
22ccd61d87 chore: remove empty help entry inclusion 2024-06-14 18:30:32 +02:00
Yohan Boniface
191fb6d853 chore: reviewing labels with Aurélie 2024-06-14 18:24:56 +02:00
Yohan Boniface
59dbde4f32 chore: make browser labels consistent 2024-06-14 18:24:54 +02:00
Yohan Boniface
d407949138 chore: be more explicit on browser modes 2024-06-14 18:24:10 +02:00
Yohan Boniface
e023321ee5
Merge pull request #1895 from umap-project/request-error-alert
fix: display an alert on any request error
2024-06-14 18:22:54 +02:00
Yohan Boniface
713be1538c chore: change alert CSS sizing 2024-06-14 18:21:44 +02:00
David Larlet
eda3823b3a
Merge pull request #1896 from umap-project/better-alerts
chore: overall alerts improvements
2024-06-14 11:51:46 -04:00
Yohan Boniface
7e86bc6db8 wip: do not display alerts from the maps in a content list page 2024-06-14 17:51:42 +02:00
Yohan Boniface
a2ba35cb93
Merge pull request #1894 from umap-project/fix-feature-edit-icon
fix: use correct icon class in edit feature panel
2024-06-14 17:31:42 +02:00
David Larlet
fb1407cdbf
chore: overall alerts improvements 2024-06-14 11:08:59 -04:00
Yohan Boniface
9dc11ec9f9 wip: fix tests after rebase on master 2024-06-14 16:55:36 +02:00
Yohan Boniface
6bdba1d0ed wip: do not use public class fields yet
Browser support is not enough.
2024-06-14 16:55:36 +02:00
Yohan Boniface
f10d345113 wip: use this.rules.getOption directly 2024-06-14 16:55:36 +02:00
Yohan Boniface
907ba09c45 wip: do not use private property yet
Support is not ready for us.
2024-06-14 16:55:36 +02:00
Yohan Boniface
05ea45acd2 wip: use getter/setter for Rule dynamic properties 2024-06-14 16:55:36 +02:00
Yohan Boniface
7367de5545 wip: deal with boolean values in conditional rules 2024-06-14 16:55:36 +02:00
Yohan Boniface
5ec944fce0 wip: deal with gt/lt and numbers in conditional rules 2024-06-14 16:55:36 +02:00
Yohan Boniface
129f46dd6d wip: add minimal tests for conditional rules 2024-06-14 16:55:36 +02:00
Yohan Boniface
d6ae4744a6 wip: make sure we update rule when condition is changed
And make sure we redraw data on map
2024-06-14 16:55:36 +02:00
Yohan Boniface
805c09e34e wip: allow to deactivate a conditional rule from list 2024-06-14 16:55:36 +02:00
Yohan Boniface
a2d04b9ad4 wip: use direct imports instead of L. global 2024-06-14 16:55:36 +02:00
Yohan Boniface
4f8e453012 wip: allow to reorder rules 2024-06-14 16:55:36 +02:00
Yohan Boniface
05eab25da4 feat: very minimal experimental conditional style rules 2024-06-14 16:55:33 +02:00
Yohan Boniface
15de486425 fix: use correct icon class in edit feature panel 2024-06-14 15:31:16 +02:00
Yohan Boniface
d221a98e78 fix: display an alert on any request error
This used to be the case, but was changed by mistake in the
request refactor (swicht from xhr)
2024-06-14 15:24:01 +02:00
b94995120a refactoring(sync): Simplify the design of the sync engine.
Removes the concept of message dispatcher and message sender, all of
it can be done by the syncengine class, making it easier to grasp.
2024-06-14 00:20:59 +02:00
Yohan Boniface
e968261dff wip: fix more tests 2024-06-13 20:53:07 +02:00
Yohan Boniface
897d4f22f4 chore(tests): make sure we send a valid geojson when data is empty 2024-06-13 20:52:28 +02:00
David Larlet
b863beaec9
chore: fix tests 2024-06-13 14:13:42 -04:00
David Larlet
802d5d9d6c
chore: set default language for tests as en-GB 2024-06-13 13:41:00 -04:00
David Larlet
b197e067e8
fix: listen to the correct event for conflicts 2024-06-12 19:06:28 -04:00
David Larlet
8400b55b9d
chore: direct import of the Alert class in modules 2024-06-12 18:30:40 -04:00
David Larlet
cea2aee88f
chore: rename alert choice to conflict + CSS vars 2024-06-12 18:15:28 -04:00
David Larlet
10e398d222
chore: better alerts CSS 2024-06-12 18:03:05 -04:00
David Larlet
6cb1be1fd4
chore: use direct import for ServerRequest in alerts 2024-06-12 18:03:05 -04:00
David Larlet
ddaafa8cda
chore: scroll when the help box is too big 2024-06-12 18:03:05 -04:00
David Larlet
c0ecc39439
chore: uniformize buttons across panels and alerts 2024-06-12 18:03:05 -04:00
David Larlet
e1f91b393d
chore: do not display zoom alert on save 2024-06-12 18:03:05 -04:00
David Larlet
6bbdec49bf
chore: refactor web components with templates 2024-06-12 18:03:04 -04:00
David Larlet
6f715c109b
chore: improve message/choice in case of conflicts 2024-06-12 18:03:04 -04:00
David Larlet
5c2528900e
chore: Use web components to display alerts + a11y roles 2024-06-12 18:03:04 -04:00
Yohan Boniface
8967ab5901 whore: prettier 2024-06-11 14:12:33 +02:00
Yohan Boniface
50ef073d36
Merge pull request #1883 from umap-project/remove-u-keys
chore: remove U.Keys, and refactor global shorcuts
2024-06-07 18:35:49 +02:00
fc2de3fc53 tests(sync): Change the way the websocket server is run in the tests
Using [pytest-xprocess](https://pytest-xprocess.readthedocs.io/) proved
not being as useful as I thought at first, because it was causing
intermitent failures when starting the process.

The code now directly uses `subprocess.popen` calls to start the server.
The tests are grouped together using the following decorator:

`@pytest.mark.xdist_group(name="websockets")`

Tests now need to be run with the `pytest --dist loadgroup` so that all
tests of the same group happen on the same process.

More details on this blogpost:

  https://blog.notmyidea.org/start-a-process-when-using-pytest-xdist.html
2024-06-07 18:21:30 +02:00
98a7a56701 refactor(sync): rename ws.py to websocket_server.py
Hopefully this is clearer :-)
2024-06-07 18:21:30 +02:00
f42498d195 refactor(sync): Sync layers creation with map.createDataLayer utility.
Rather than having it done inside the datalayer itself. This gives us
more control.
2024-06-07 18:21:30 +02:00
149a0c1680 refactor: rename geometrytoFeatures to geoJSONToLeaflet
Because we are dealing with technologies using overlapping vocabulary,
it is easy to get lost. Hopefully this change makes it clear that it
converts geoJSON inputs in Leaflet / uMap objects.
2024-06-07 18:21:30 +02:00
137cc21af2 feat(sync): Add a proxy to the SyncEngine objects.
It is now possible to create proxy objects using `sync_engine.proxy(object)`.
The returned proxy object will automatically inject `metadata` and
`subject` parameters, after looking for them in the `getSyncMetadata`
method (these are only known to the synced objects).

As a result, the calls are now simplified:

```
this.sync.update("key", "value")
```
2024-06-07 18:21:30 +02:00
4e7ac23b53 refactor(sync): remove formbuilder this._redraw() callbacks.
They are now handled in the `render()` call, so there is no more need
for them here.
2024-06-07 18:21:30 +02:00
5247bf77d3 refactor(sync): Remove syncUpdateProperties function.
The function was only used once, so removing it  simplified the whole
flow.
2024-06-07 18:21:30 +02:00
d3730a99ff fix: use array.includes(string) the proper way.
Because this `syncUpdatedProperties` function is only called once, it
didn't trigger any issue in practice (as the check was always returning
true).
2024-06-07 18:21:30 +02:00
d91c86e7fa feat(websockets): run the WS server as a django management command.
This allows to handle the loading of the settings in a consistant way,
and aditionnaly to provide a way to override the `WEBSOCKET_BACK_HOST`
and `WEBSOCKET_BACK_PORT` settings with arg commands `--host` and
`--port`.

Without this change, because of how we are currently loading our
settings, we would require the settings the be exposed by the
`umap.settings.__init__` file.

Previous implementations were exposing these settings, with the
following code:

```python
settings_as_dict = {k: v for k, v in globals().items() if k.isupper()}
  ```
2024-06-07 18:21:30 +02:00
940ae77602 settings: Make the websocket settings clearer.
It is now using `WEBSOCKET_BACK_HOST`, `WEBSOCKET_BACK_PORT` and
`WEBSOCKET_FRONT_URI`.

We need to take in consideration that the "front" WebSocket address
(that clients will connect to) might be different than the "back" ip and
port which are bound in the host.

This happens for instance for reverse proxies, or when running inside
a container.

We considered using a `WEBSOCKET_TLS` setting, to try guessing the
"front" address based on `WEBSOCKET_HOST`, `WEBSOCKET_PORT` and
`WEBSOCKET_TLS`, but as the back and front address can differ, this
would need to introduce a `WEBSOCKET_URI` in any case, so we went with
just using it, and not adding an extra `WEBSOCKET_TLS`.
2024-06-07 18:21:30 +02:00
90780fbf6d fixup: changes after @ybon's review. 2024-06-07 18:21:30 +02:00
50b7188647 fix(sync): sync the reference-version across peers
This allows the merge algorithm to not be lost when receiving changes.
Without this change, the optimistic merge algorithm isn't able to make
the distinction between peers, and features end up duplicated.
2024-06-07 18:21:30 +02:00
516c3d9a0d tests(sync): Add a test ensuring cloned features aren't duplicated
This is currently a bug in the current implementation. Hopefully fixed
in later commits.
2024-06-07 18:21:30 +02:00
b5eee142e7 test(sync): Ensure feature properties are synced 2024-06-07 18:21:30 +02:00
b1a4053b2e chore(sync): remove belongsTo for now
As it requires more discussion, it will happen in a separate
pull-request.
2024-06-07 18:21:30 +02:00
8fc116e7a8 chore(test): remove empty test 2024-06-07 18:21:30 +02:00
dfbdc1f975 chore(test): fix a typo
(but I would really like to see what web socker would look like)
2024-06-07 18:21:30 +02:00
db50c6cdd6 chore(sync): relax some validation logic on the websocket server
Messages are now checked for conformity with the procol we defined, but
stop at the `operation` boundary. Values aren't checked.
2024-06-07 18:21:30 +02:00
bc1dec245b chore(sync): Sync engine now retrieves auth token
It's now it's responsability to get the authentication token from
the http server and pass it to the websocket server, it will make it
possible to redo the roundtrip when getting disconnected.
2024-06-07 18:21:30 +02:00
82ede035d6 chore(sync): use sync=false everywhere to stop propagation
In some cases, you want to stop the propagation of events. The previous
code was using `fromSync=true` and `sync=false` interchangeably. This
makes it use `sync=false` everywhere.
2024-06-07 18:21:30 +02:00
637ab67b93 chore(utils): remove console.log calls 2024-06-07 18:21:30 +02:00
5a565dd2ee fix(schema): dashArray belongs to features as well 2024-06-07 18:21:30 +02:00
10a68a75e4 test(sync): Ensure datalayer properties are synced 2024-06-07 18:21:30 +02:00
d10a7b70f1 test(sync): Ensure map properties are synced
This tests that the name of the map, and that zoom-control visibility is
properly synced over websockets.
2024-06-07 18:21:30 +02:00
6f7dd61023 test(sync): ensure polygon drag-n-drop is synced 2024-06-07 18:21:30 +02:00
ad4d6ac672 test(sync): Ensure polygons and their edits can be synced 2024-06-07 18:21:30 +02:00
5feabd4c14 test(sync): Marker drag-n-drop and delete are synced 2024-06-07 18:21:30 +02:00
80f7efc810 tests(sync): Test that marker sync works properly
This commit handles the start and stop of the websocket server during
the tests, using the xprocess library
2024-06-07 18:21:30 +02:00
d0e2d900f7 chore(tests): Rename "collaboration" tests to "optimistic merge"
As "collaboration" can be mistaken between "websocket" and
"server-merge". This naming makes it explicit.
2024-06-07 18:21:30 +02:00
92676e03ae chore(sync): Add message-dispatcher unit tests 2024-06-07 18:21:30 +02:00
74a1670c9d feat(sync): Add JS unittests for updateObjectValue, and refactor.
The new implementation uses `reduce`, in the hopes of producing a more
readable version than old-style loops and reassignment of object values.
2024-06-07 18:21:30 +02:00
9be613e3ce feat(sync): add tests for the websocket token view 2024-06-07 18:21:30 +02:00
80eaa151de refactor(sync): Remove unnecessary complexity
Because we're relying on the `geoJSONToFeatures` method, we don't need
anymore updaters, the default ones (map, datalayer, feature) are enough.

It also makes the codebase compatible with our eslint configuration.
2024-06-07 18:21:30 +02:00
9e36476abe chore(sync) make the test pass 2024-06-07 18:21:30 +02:00
d5bff22081 fix(sync) only send datalayer options 2024-06-07 18:21:30 +02:00
898a3e93b2 fix(sync): do not call getSyncMetadata if it doesn't exist
This can arise when the form isn't bound to a "syncable" object. We
might want to provide an utility to check an object is *syncable*, or a
specific form to not attempt to sync objects which don't need it.
2024-06-07 18:21:30 +02:00
8e5c434988 feat(sync): Allow the sync of datalayer creation 2024-06-07 18:21:30 +02:00
458d68a4bb fix(sync): allow features geometries to be synced
By defining the `geometry` property in the schema.
2024-06-07 18:21:30 +02:00