This also:
- introduces a new DataLayerManager
- removes the _umap_options coming from the geojson form the server
- removes all backup related functions (now we have undo/redo)
fix#2674
This also:
- introduces a new DataLayerManager
- removes the _umap_options coming from the geojson form the server
- removes all backup related functions (now we have undo/redo)
Co-authored-by: David Larlet <david@larlet.fr>
When loading remote data fails, the layer is in state "unloaded", and
thus it was not possible to save it.
This "isLoaded" check is made for non remote layer so that we don't save
it by mistake with no data.
Also, let's allow to edit non loaded layers, this check was there when
settings was not on db, so not all loaded at map init, again not to
override with incomplete metadata.
Currently, we just skip those, but sometimes togeojson produces this
output from a KML.
This will create one feature per geometry, while in an ideal world this
should be a multi, but we lack reliable geometry tools to merge the
geometries without risking to create mistakes.
So let's say it's a first improvement.
Currently, we just skip those, but sometimes togeojson produces this
output from a KML.
This will create one feature per geometry, while in an ideal world this
should be a multi, but we lack reliable geometry tools to merge the
geometries without risking to create mistakes.
So let's say it's a first improvement.
When loading remote data fails, the layer is in state "unloaded",
and thus it was not possible to save it.
This "isLoaded" check is made for non remote layer so that we don't
save it by mistake with no data.
Also, let's allow to edit non loaded layers, this check was there
when settings was not on db, so not all loaded at map init, again
not to override with incomplete metadata.
- env vars and config files can be loaded from existing secrets
- chart is deployed on a helm repository
to make the helm repository work with github pages, create an empty
orphaned branch called gh-pages, and under settings>pages>source select
deploy from branch and use gh-pages
Basically, when the search is "joe" we first try to search for an exact
account named "joe", and fallback to normal flow when nothing matches.
fix#2591
Basically, when the search is "joe" we first try to search for
an exact account named "joe", and fallback to normal flow when
nothing matches.
fix#2591
Basically, it means "no shape".

It's a 48x48 max square (but if image is smaller it will stay smaller),
popup and tooltip always centered.
Let's see how this will be used and add more controls if needed later
(like size, center position…).
Also I've added a small border to the default white round icon, so it's
visible even on a white background.
(Not sure why the flower size is 47.8 instead of 48, cf screenshot,
sounds like a Leaflet rounding issue…)
cf #125
cf #2283
Note: this PR uses ArrayField, which is Postgres only, so this would
officially remove the support of spatialite as it is. I'm not sure at
all uMap still works with spatialite, so maybe that the opportunity to
either add spatialite in the CI and make sure we support it, or remove
it and only target Postgres/PostGIS.
Todo:
- [ ] undo/sync a version restore
- [x] add test for scenario where two peers create a layer and one click
on save (both should be saved)
- [x] undo/sync of conditional rules
- [x] undo/sync of filter management from table editor
When editing Rule(s), we are not editing the map data itself, but a
sort of proxy objects. This was done mainly because map.properties.rules
is an array of object, and at this time Leaflet.FormBuilder did not know
how to edit an array (something like properties.rules.0.condition).
Now that we integrated FormBuilder, it still does not know how to do this
but we could teach it, or find another way (real Proxy or use reference
to the original object in the Rule).
Some geojson have been removed by mistake time ago (cf #1003), when
someone tries to load a map referencing them, it was until recently just
showing an error message, but since recently we try to get the metadata
from it, and this will crash.
Some geojson have been removed by mistake time ago (cf #1003), when someone
tries to load a map referencing them, it was until recently just
showing an error message, but since recently we try to get the
metadata from it, and this will crash.
This importer takes a CSV as input, sends it to the BAN API, and
then paste it into the import textarea, so it can be imported as usual.
Co-authored-by: David Larlet <david@larlet.fr>
The button is already on the edit bar.
Would be nicer to have a css transition (like for the bar itself), but
at least with this change it is not duplicated.
The problem we've tried to fix is, during sync:
- peer A is editing a feature
- peer B changes the datalayer of this feature
- edit panel is closed for peer A
The problem we've tried to fix is, during sync:
- peer A is editing a feature
- peer B changes the datalayer of this feature
- edit panel is closed for peer A
Co-authored-by: Alexis Métaireau <alexis@notmyidea.org>
Bumps [django](https://github.com/django/django) from 5.1.6 to 5.1.7.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="691e945530"><code>691e945</code></a>
[5.1.x] Bumped version for 5.1.7 release.</li>
<li><a
href="8dbb44d342"><code>8dbb44d</code></a>
[5.1.x] Fixed CVE-2025-26699 -- Mitigated potential DoS in wordwrap
template ...</li>
<li><a
href="d7dc1f6db0"><code>d7dc1f6</code></a>
[5.1.x] Fixed typo in docs/ref/checks.txt.</li>
<li><a
href="dbd94e7ac9"><code>dbd94e7</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/36227">#36227</a>
-- Fixed outdated PostgreSQL documentation links.</li>
<li><a
href="cc405e1546"><code>cc405e1</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/36128">#36128</a>
-- Clarified auto-generated unique constraint on m2m thr...</li>
<li><a
href="03ace756ea"><code>03ace75</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/36217">#36217</a>
-- Restored pre_save/post_save signal emission via LogEn...</li>
<li><a
href="76a9f12b60"><code>76a9f12</code></a>
[5.1.x] Added some heading labels to to docs/topics/cache.txt.</li>
<li><a
href="558c616c95"><code>558c616</code></a>
[5.1.x] Added stub release notes and release date for 5.1.7, 5.0.13, and
4.2.20.</li>
<li><a
href="11243cc8f3"><code>11243cc</code></a>
[5.1.x] Added security guideline on reasonable size limitations when
renderin...</li>
<li><a
href="b80288a16d"><code>b80288a</code></a>
[5.1.x] Added security reporting guidelines.</li>
<li>Additional commits viewable in <a
href="https://github.com/django/django/compare/5.1.6...5.1.7">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/umap-project/umap/network/alerts).
</details>
Bumps [psycopg](https://github.com/psycopg/psycopg) from 3.2.4 to 3.2.5.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/psycopg/psycopg/blob/master/docs/news.rst">psycopg's
changelog</a>.</em></p>
<blockquote>
<p>.. currentmodule:: psycopg</p>
<p>.. index::
single: Release notes
single: News</p>
<h1><code>psycopg</code> release notes</h1>
<h2>Future releases</h2>
<p>Python 3.3.0 (unreleased)
^^^^^^^^^^^^^^^^^^^^^^^^^</p>
<ul>
<li>Drop support for Python 3.8.</li>
</ul>
<h2>Current release</h2>
<p>Psycopg 3.2.5
^^^^^^^^^^^^^</p>
<ul>
<li>3x faster UUID loading thanks to C implementation
(🎟️<code>[#447](https://github.com/psycopg/psycopg/issues/447),
[#998](https://github.com/psycopg/psycopg/issues/998)</code>).</li>
</ul>
<p>Psycopg 3.2.4
^^^^^^^^^^^^^</p>
<ul>
<li>Don't lose notifies received whilst the
<code>~Connection.notifies()</code> iterator
is not running
(🎫<code>[#962](https://github.com/psycopg/psycopg/issues/962)</code>).</li>
<li>Make sure that the notifies callback is called during the use of the
<code>~Connection.notifies()</code> generator
(🎫<code>[#972](https://github.com/psycopg/psycopg/issues/972)</code>).</li>
<li>Raise the correct error returned by the database (such as
<code>!AdminShutdown</code>
or <code>!IdleInTransactionSessionTimeout</code>) instead of a generic
<code>OperationalError</code> when a server error causes a client
disconnection
(🎫<code>[#988](https://github.com/psycopg/psycopg/issues/988)</code>).</li>
<li>Build macOS dependencies from sources instead using the Homebrew
versions
in order to avoid problems with <code>MACOSX_DEPLOYMENT_TARGET</code>
(🎫<code>[#858](https://github.com/psycopg/psycopg/issues/858)</code>).</li>
<li>Bump libpq to 17.2 in Linux and macOS binary packages.</li>
<li>Bump libpq to 16.4 in Windows binary packages, using the <code>vcpkg
library</code>__
(🎫<code>[#966](https://github.com/psycopg/psycopg/issues/966)</code>).</li>
</ul>
<p>.. __: <a
href="https://vcpkg.io/en/package/libpq">https://vcpkg.io/en/package/libpq</a></p>
<p>Psycopg 3.2.3
^^^^^^^^^^^^^</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="664b2a12d6"><code>664b2a1</code></a>
chore: bump psycopg package version to 3.2.5</li>
<li><a
href="cd6589bf35"><code>cd6589b</code></a>
chore: bump build libraries</li>
<li><a
href="68f8603ec6"><code>68f8603</code></a>
Merge branch 'cython-uuid-3.2' into maint-3.2</li>
<li><a
href="dd1cefc3ee"><code>dd1cefc</code></a>
docs: mention UUID speedup in release news</li>
<li><a
href="7f950cb843"><code>7f950cb</code></a>
chore(c): remove C UUIDDumper and UUIDBinaryDumper</li>
<li><a
href="393e162fc3"><code>393e162</code></a>
perf(uuid): speed up UUID creation using a writable subclass</li>
<li><a
href="57a3889949"><code>57a3889</code></a>
perf(c): use PyObject_CallFunctionObjArgs in UUIDBinaryLoader</li>
<li><a
href="88f73fedd2"><code>88f73fe</code></a>
perf(c): use PyObject_CallFunctionObjArgs in UUIDLoader</li>
<li><a
href="3a9ade78e7"><code>3a9ade7</code></a>
test(c): test UUID.<strong>slots</strong></li>
<li><a
href="811cb51123"><code>811cb51</code></a>
perf(c): Use hex_to_int_map in UUIDLoader</li>
<li>Additional commits viewable in <a
href="https://github.com/psycopg/psycopg/compare/3.2.4...3.2.5">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
- always redirect user from map to their profile page when they used a
deprecated backend to log in
- change the Twitter image to make clear it is to be removed
- always redirect user from map to their profile page when they
used a deprecated backend to log in
- change the Twitter image to make clear it is to be removed
Co-authored-by: David Larlet <david@larlet.fr>
We think it's useless now that we use "editable:edited" event everywhere
(vs using the "editable:commit" which was triggered also after a delete,
when closing the edit panel)
That fix does not really fix the original issue, but it makes it
impactless, and I think it's safer anyway to have upsert idempotent.
The pattern to reproduce is:
- peer A create a synced map, add a datalayer, save it
- peer B loads the map, click on edit
- at this time, peer B have twice the datalayer data, once from the
server AND once from the sync
So a better fix would be to make that peer B send a meaningfull HLC to
peer A I guess.
For this we may save the last HLC is the map properties, or maybe try to
merge the "reference_version" and the HLC.
I first tried to handle this on Leaflet.Editable side, to make it fire
the "editable:edited" event we use to trigger the sync, but deciding
what to do with a feature on escape needs some decisions that seems hard
to implement in a generic way in Leaflet.Editable.
We call stopDrawing, which then calls cancelDrawing, so here one need to
decide if cancelDrawing should keep the already drawn line (but cancel
the point being drawn) or cancel everything.
This is why I end up making this change in uMap itself.
To reproduce:
- create a map
- saved it
- change the "syncEnabled" setting to on
- save again
- open another tab with this map
- switch on edit mode
In this case, the second client will try to authenticate:
- once switch on edit mode
- and once receiving the operation message from peer A about the
syncEnabled (which calls render, which calls initSyncEngine in in this
case)
I think we want to keep render to call initSyncEngine, so if a map owner
switch off the syncEnabled setting, this will (should) disconnect the
other peers.
That fix does not really fix the original issue, but it make it impactless.
The pattern is:
- peer A create a synced map, add a datalayer, save it
- peer B loads the map, click on edit
- at this time, peer B have twice the datalayer data, once from the server
AND once from the sync
So a better fix would be to make that peer B send a meaningfull HLC to
peer A I guess.
For this we may save the last HLC is the map properties, or maybe try
to merge the "reference_version" and the HLC.
I first tried to handle this on Leaflet.Editable side, to make
it fire the "editable:edited" event we use to trigger the sync,
but deciding what to do with a feature on escape needs some
decisions that seems hard to implement in a generic way in
Leaflet.Editable.
We call stopDrawing, which then calls cancelDrawing, so here
one need to decide if cancelDrawing should keep the already
drawn line (but cancel the point being drawn) or cancel
everything.
This is why I end up making this change in uMap itself.
To reproduce:
- create a map
- saved it
- change the "syncEnabled" setting to on
- save again
- open another tab with this map
- switch on edit mode
In this case, the second client will try to authenticate:
- once switch on edit mode
- and once receiving the operation message from peer A about the
syncEnabled (which calls render, which calls initSyncEngine in
in this case)
I think we want to keep render to call initSyncEngine, so if a map
owner switch off the syncEnabled setting, this will (should) disconnect
the other peers.
When a peer save the map, other peers in dirty state should not need to
save the map anymore.
That implementation uses the lastKnownHLC as a reference, but it changes
all dirty states at once. Another impementation could be to have each
object sync its dirty state, but in this case we do not have a HLC per
object as reference, and it also creates more messages.
ping @almet if you're around and wanna have a fresh look. :)
And remove Leaflet.Toolbar dependency.
This also teach ContextMenu how to display icons instead of
text and how to render in horizontal orientation instead of
vertical.
Until now, it was displayed on the path (line or polygon) "center". So
when zoomed in, if the center is not on the screen, the tooltip will not
be visible.
Until now, it was displayed on the path (line or polygon)
"center". So when zoomed in, if the center is not on the
screen, the tooltip will not be visible.
I've chosen to keep the one in the "lint" step, instead of a
dedicated step, so to prevent one more container to be built at
each run (did I say "to save trees" ?) :p
When we introduced the DataLayer.settings property, we did not run a
migration for existing datalayers (because there are millions in the
French server).
Now that we simplified the `DataLayer.isLoaded()` logic in the client,
we want to be sure that created DataLayer on the client have full
metadata.
When we introduced the DataLayer.settings property, we did not run
a migration for existing datalayers (because there are millions in the
French server).
Now that we simplified the `DataLayer.isLoaded()` logic in the client,
we want to be sure that created DataLayer on the client have full
metadata.
Co-authored-by: David Larlet <david@larlet.fr>
At the end, we only need two states: has this datalayer loaded the
data it should load ? yes / no.
Whether it local or remote data should not be a matter.
The scenario to reproduce is:
- peer A creates a datalayer
- peer B add a marker on that datalayer
- peer B saves the datalayer
Before this fix, after the save, peer A would get a new _referenceVersion
for this datalayer, and the render method would make a hide/show,
which would refetch the data from the server, duplicating it.
So forcing the _loaded to be true in this situation prevent this.
We may want to rework the "_loaded" pattern, maybe with the server
returning in a datalayer metadata the length of the data it get for
this given datalayer, so the client knows if it is worth getting
data for a layer when itself (the client) does not have any.
Co-authored-by: David Larlet <david@larlet.fr>
When a peer save the map, other peers in dirty state should not need
to save the map anymore.
That implementation uses the lastKnownHLC as a reference, but it changes
all dirty states at once. Another impementation could be to have each
object sync its dirty state, but in this case we do not have a HLC per
object as reference, and it also creates more messages.
Co-authored-by: David Larlet <david@larlet.fr>
This is more unified between markers and paths, and it allows paths to
be synced as soon as they have been drawn (instead of when closing the
edit panel, which created a race condition when changing its properties
that were then synced to other while the feature itself was not).
This also:
- change the "set center and zoom" to be a panel instead of
a direct action (including the "defaultView" setting
- refactor the "get started dialog"
This is a first step to remove our dependency to the unmaintained
Leaflet.Toolbar plugin.
When moving a path, this will put a once time listener on "moveend". If
we delete this feature, and move the map, we should not execute the
event callback.
A better fix would be to cancel the event listener on delete, but that
is much more work given how we deal with Leaflet events right now.
When moving a path, this will put a once time listener on "moveend".
If we delete this feature, and move the map, we should not execute the
event callback.
A better fix would be to cancel the event listener on delete, but that
is much more work given how we deal with Leaflet events right now.
This is more unified between markers and paths, and it allows paths to
be synced as soon as they have been drawn (instead of when closing the
edit panel, which created a race condition when changing its properties
that were then synced to other while the feature itself was not).
Otherwise, when an infinite alert replace an alert with a finite duration,
this first alert timeout will close the second alert.
Co-authored-by: David Larlet <david@larlet.fr>
This is not the same as the short `SITE_NAME` which is displayed as the
title of the (home)page for instance.
The plan is to set `SITE_DESCRIPTION` as `uMap OpenStreetMap` for the
OSM instance and `uMap agents publics` for the ANCT one.
When deleting a datalayer, it will now be moved to a state "deleted",
and it will only be deleted for real when running the command `umap
empty_trash`.
This is what we already do for the map itself, but until now if a user
deleted a only a datalayer by mistake (not the map itself) it could not
retrieve it.
When deleting a datalayer, it will now be moved to a state "deleted", and
it will only be deleted for real when running the command `umap empty_trash`.
This is what we already do for the map itself, but until now if a user
deleted a only a datalayer by mistake (not the map itself) it could not retrieve
it.
## TODO
- [x] add expire to peers registry hash in redis, as for now when the
server closes the connection we have extra users (edit: we cleaned
manually, as HEXPIRE is not available in FOSS version of Redis)
- [x] make that the peer uuid is created by the client, so when it
reconnects, it uses the same, and does not create a new one
- [ ] see if we can use a connection_pool
- [x] use dynamic websocket_uri (that must include the map id)
- [x] integrate Redis in playwright tests
Related to helm Charts:
Currently the reference to secret is done by
```
envFrom:
- secretRef:
name: {{ .Release.Name }}-env
```
[Link](https://github.com/umap-project/umap/blob/master/charts/umap/templates/deployment.yaml#L67C1-L69C44)
but secret object is created like this:
```
metadata:
name: {{ include "umap.fullname" . }}-env
```
[Link](https://github.com/umap-project/umap/blob/master/charts/umap/templates/secret-env.yaml#L4C3-L4C4)
Works as long as no Sub-Chart feature is used, when individual
configuration is stored within a git repo.
Then the subchart name is added to fullname. (And I think if custom
fullName is set)
To be safe, `{{ include "umap.fullname" . }}` is correct.
Should be no breaking change, when it is working at the moment. (Because
then both return same value)
It is only a breaking change, if it is not working at the moment.
We want the datalayer index properties to be updated when a user set
a property on the feature, as this property name may not yet be in the
index (which is used later for autocomplete, select…).
fix#2430
Not exactly sure how to make this DRY. What we want is to mark the layer
visibility as "controlled by user" as soon as they click on a
show/hide/showAll/hideAll button, so we do not try to infer the
visibility from the from/toZoom settings.
We wanted to use the HEXPIRE command, but discovered that this command
is only available since the Redis 7.4 version (the latest), and this version
does not have an OSI compliant licence, so it is generally not installable
through common packages managers. The OSS fork is Valkey, but it still does
not have the HEXPIRE command.
So we decide to clean those keys manually, and in order no do this clean
task at each websocket connection, we only do it when we are the first user
to connect to a given map.
Co-authored-by: David Larlet <david@larlet.fr>
fix#2430
Not exactly sure how to make this DRY. What we want is to mark the
layer visibility as "controlled by user" as soon as they click on a
show/hide/showAll/hideAll button, so we do not try to infer the
visibility from the from/toZoom settings.
fix#2280
That's a first step, which:
- internalize Formbuilder as a bunch of modules
- use Javascript classes instead of Leaflet ones
- remove dependencies to Leaflet (L.DomUtil…)
- replaces `L.FormBuilder` by `Form` (in theory generic, but not quite)
and `U.FormBuilder` by `MutatingForm` (knows about isDirty,
`inheritable` and such)
There is much more room for refactor, but let's do it step by step!
fix#2268
There is a tricky choice to do: the delete actually occurs in two
times, first the datalayer is hidden from the UI and set as "deleted"
(this can then be undone) then at next "save" it will totally removed.
When syncing, given we removed the "reset/undo" feature for now, and
because it was simpler, I decide to do both step in once.
When working on a proper "undo/redo", we may challenge this choice
again.
fix#2268
There is a tricky choice to do: the delete actually occurs in two
times, first the datalayer is hidden from the UI and set as "deleted"
(this can then be undone) then at next "save" it will totally removed.
When syncing, given we removed the "reset/undo" feature for now, and
because it was simpler, I decide to do both step in once.
When working on a proper "undo/redo", we may challenge this choice
again.
We now set the "closeRequested" on the receiver itself, otherwise there
is a race condition between the reconnect (which create a new transport)
and the onclose checking closeRequest on an old transport.
We now save the "closeRequested" on the receiver itself, other wise
there is a race condition between the reconnect (which create a new
transport) and the onclose checking closeRequest on an old transport.
Bumps
[pymdown-extensions](https://github.com/facelessuser/pymdown-extensions)
from 10.12 to 10.13.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/facelessuser/pymdown-extensions/releases">pymdown-extensions's
releases</a>.</em></p>
<blockquote>
<h2>10.13</h2>
<ul>
<li><strong>NEW</strong>: Snippets: Allow multiple line numbers or line
number blocks separated by <code>,</code>.</li>
<li><strong>NEW</strong>: Snippets: Allow using a negative index for
number start indexes and end indexes. Negative indexes are converted to
positive indexes based on the number of lines in the snippet.</li>
<li><strong>FIX</strong>: Snippets: Properly capture empty newline at
end of file.</li>
<li><strong>FIX</strong>: Snippets: Fix issue where when non sections of
files are included, section labels are not stripped.</li>
<li><strong>FIX</strong>: BetterEm: Fixes for complex cases.</li>
<li><strong>FIX</strong>: Blocks: More consistent handling of empty
newlines in block processor extensions.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="36858c6b85"><code>36858c6</code></a>
Mention negative indexing in Snippets documentation</li>
<li><a
href="271950fb0d"><code>271950f</code></a>
More consistent newline handling in blocks extensions (<a
href="https://redirect.github.com/facelessuser/pymdown-extensions/issues/2553">#2553</a>)</li>
<li><a
href="9e26f64ee5"><code>9e26f64</code></a>
Allow negative indexes (<a
href="https://redirect.github.com/facelessuser/pymdown-extensions/issues/2552">#2552</a>)</li>
<li><a
href="1789d6094e"><code>1789d60</code></a>
Docs: Update JS deps</li>
<li><a
href="55ccf795df"><code>55ccf79</code></a>
Allow specifying multiple line selection blocks (<a
href="https://redirect.github.com/facelessuser/pymdown-extensions/issues/2551">#2551</a>)</li>
<li><a
href="f6102ac0dc"><code>f6102ac</code></a>
Fix some complex cases in BetterEm (<a
href="https://redirect.github.com/facelessuser/pymdown-extensions/issues/2547">#2547</a>)</li>
<li><a
href="9df48dbc84"><code>9df48db</code></a>
Strip sections from included file (<a
href="https://redirect.github.com/facelessuser/pymdown-extensions/issues/2541">#2541</a>)</li>
<li><a
href="377e8ff46d"><code>377e8ff</code></a>
Correctly document StripHTML defaults (<a
href="https://redirect.github.com/facelessuser/pymdown-extensions/issues/2535">#2535</a>)</li>
<li><a
href="68c70f9d12"><code>68c70f9</code></a>
Fix broken link to options in block-caption plugin page (<a
href="https://redirect.github.com/facelessuser/pymdown-extensions/issues/2533">#2533</a>)</li>
<li>See full diff in <a
href="https://github.com/facelessuser/pymdown-extensions/compare/10.12...10.13">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Here are the main fixes:
- mark a synched datalayer as loaded (so the peer does not try to get
data from the server)
- do not mark synched datalayers as dirty
- properly consume the lastKnownHLC, so to get an accurate list of
operations
fix#2219
This is a port of this PR: #2235
(But it was easier to copy-paste than rebase, given the split of umap.js
and co.)
Co-authored-by: Alexis Métaireau <alexis@notmyidea.org>
Co-authored-by: David Larlet <david@larlet.fr>
This could have been a four letters fix (adding class "text"), but I've
seen that `Caption` was still using `DomUtil` instead of `WithTemplate`,
so I made this little effort more…
There are two situations where we want to create "non dirty" datalayers:
- at normal load, we create datalayers that already exist in DB
- at sync, we create datalayers that will be saved by other peer
Otherwise, when they will get the "_referenceVersion" later, they
will call the server to fetch the data (while they already have
the data, from the sync itself)
Otherwise, when the marker is redrawn by Leaflet itself, it will lose
the status (the class we added manually will not be added by Leaflet).
Eg. if we click on a marker on the map border, this will move the map to
make the marker popup fit the screen, and thus this will redraw the
marker icon, which will then lose the "active" flag class.
Otherwise, when the marker is redrawn by Leaflet itself, it will lose
the status (the class we added manually will not be added by Leaflet).
Eg. if we click on a marker on the map border, this will move the map
to make the marker popup fit the screen, and thus this will redraw the
marker icon, which will then lose the "active" flag class.
UMap will look into the schema for default values, but untill now
FormBuilder wasn't.
This fix is not the real fix we want, but let's make this last until
then.
The real fix is to refactor schema and make obj.properties a Proxy
object that will then be consumed by FormBuilder as it is now.
UMap will look into the schema for default values, but untill now
FormBuilder wasn't.
This fix is not the real fix we want, but let's make this last until
then.
The real fix is to refactor schema and make obj.properties a Proxy
object that will then be consumed by FormBuilder as it is now.
We basically make the all import chain return the results as promise, so
the importer can act at the end of the process and:
- zoom only to the imported data (in case the layer already as some)
- display a counter of imported data when import is successfull
- display an alert when nothing has been imported
cf #564
This should only be used in localhost, but there are a bunch of check
and it's often that we need to add print to understand why the URL does
not validate, which is usually an issue with the SITE_URL or this kind.
So let's make those print permanent.
We basically make the all import chain return the results as promise, so
the importer can act at the end of the process and:
- zoom only to the imported data (in case the layer already as some)
- display a counter of imported data when import is successfull
- display an alert when nothing has been imported
cf #564
This should only be used in localhost, but there are a bunch of
check and it's often that we need to add print to understand why
the URL does not validate, which is usually an issue with the SITE_URL
or this kind. So let's make those print permanent.
This adds two now storage classes, `UmapFileSystem` and `UmapS3`.
The first class now handle the current storage behaviour (which was in
the DataLayer class), and the second one the S3 support.
Todo:
- [x] unit tests for the S3 class
- [x] understand how to deal with gzip in S3
- [x] clone
fix#2290
This PR introduce two new share_status: `DRAFT` and `DELETED`.
So all status are now:
(DRAFT, _("Draft (private)")),
(PUBLIC, _("Everyone (public)")),
(OPEN, _("Anyone with link")),
(PRIVATE, _("Editors and team only")),
(BLOCKED, _("Blocked")),
(DELETED, _("Deleted")),
Here are the impact of such introduction, on the draft side:
- by default maps are now create in draft status, and they are not
visible from others than owner (or collaborators if any); this can be
changed for a given instance with the setting
`UMAP_DEFAULT_SHARE_STATUS`
- now even anonymous owned maps have a share status, given one of the
goals is to make a better distinction between maps ready to be shared
and other, this also apply to maps without logged in owners

- when the map in in draft mode, the "Save" button on the frontend says
"Save draft", so to make the state clear

- now the visibility of the map is immediately visible on the top bar
(while before this was only displayed after first save)

Note: add the end `DRAFT` and `PRIVATE` are very similar, but I made the
choice to keep the two, so one can still distinguish their draft maps
from their ready map they want to keep private.
On the delete side:
- when deleting a map, it's now set as `share_status=DELETED`, which act
as a sort of trash; so it become easier to recover a map, with it's full
datalayers, etc. (the only thing which will not be restored is the
previous share_status, which should be draft again after a restore; the
restore function itself is not implemented)
- there is a new command `empty_trash` which delete for real maps in
DELETED status and with last_modified > 30 days (by default, can be
changed with a command line argument)
- deleted maps disappear from all views: home, search, dashboard…
- in the future, we could create a new view "My Trash", where one could
see their deleted map not yet deleted for real (and that should be the
opportunity to also add the `restore` function, which for now can be
done by simply changing the share_status from the shell or the admin)
- all the purgatory related code has been removed
fix#2207
Broken since
20b2290d00
Since started as a simple fix, but:
- I first thought my previous fix of the failing test
`test_import_umap_from_textarea` was not a real fix, so I changed a bit
the way we mock tiles URL in tests, but at the end the test was failing
for good reasons
- since 20b2290d00 the reset of tilelayer
was not called anymore after importing a umap file, so I first made a
quick fix for this
- then I decided to refactor a bit more render and propagate, so
`importRaw` would pass the exact imported properties (instead of trying
to blindly target with some properties), and to remove a call to
`propagate`, which at the end should disappear in favor of `render` with
better targeting
Bumps [django](https://github.com/django/django) from 5.1.3 to 5.1.4.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2d4add11fd"><code>2d4add1</code></a>
[5.1.x] Bumped version for 5.1.4 release.</li>
<li><a
href="6943d61818"><code>6943d61</code></a>
[5.1.x] Fixed CVE-2024-53908 -- Prevented SQL injections in direct
HasKeyLook...</li>
<li><a
href="bbc74a7f7e"><code>bbc74a7</code></a>
[5.1.x] Fixed CVE-2024-53907 -- Mitigated potential DoS in
strip_tags().</li>
<li><a
href="5b4d949d7c"><code>5b4d949</code></a>
[5.1.x] Removed question marks from headings in
docs/topics/db/fixtures.txt.</li>
<li><a
href="6e3e7353e0"><code>6e3e735</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/35950">#35950</a>
-- Restored refreshing of relations when fields deferred.</li>
<li><a
href="ee2698dcca"><code>ee2698d</code></a>
[5.1.x] Removed reference to "removing older versions of
Django" in tutorial.</li>
<li><a
href="bed70e2c00"><code>bed70e2</code></a>
[5.1.x] Upgraded to Python 3.12, Ubuntu 24.04, and enabled
fail_on_warning fo...</li>
<li><a
href="5f82a5e4c7"><code>5f82a5e</code></a>
[5.1.x] Added stub release notes and release date for 5.1.4, 5.0.10, and
4.2.17.</li>
<li><a
href="4b262408aa"><code>4b26240</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/35942">#35942</a>
-- Fixed createsuperuser crash on Python 3.13+ when user...</li>
<li><a
href="08ac8c1b44"><code>08ac8c1</code></a>
[5.1.x] Updated maintainers of Django Debug Toolbar to Django
Commons.</li>
<li>Additional commits viewable in <a
href="https://github.com/django/django/compare/5.1.3...5.1.4">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/umap-project/umap/network/alerts).
</details>

I initially just wanted to work on that simple Panoramax feature, but
faced a bunch of bugs!
- one bad var remaining since whatever refactor (and no tests for this
popup template!)
- title was duplicated, since whatever refactor (and not tests for
this…)
- title text was in black on blue background
fix#2289
Let's add "nom" in OSM France and ANCT instances, then, to make users
experience smoother (a lot of imported data contains a "nom" column, and
no "name" nor "title").
In other words: fill in the "tags" input with the latest typed
expression.
Otherwise, when making tries with overpass imports, one have to type it
again and again (it's available through the autocomplete, though, but
it's not obvious and it's less friendly IMHO).
In other words: fill in the "tags" input with the latest
typed expression.
Otherwise, when making tries with overpass imports, one have to
type it again and again (it's available through the autocomplete,
though, but it's not obvious and it's less friendly IMHO).
We often need to compute the text/icon constrast color, but often
the element is not yet in the DOM, so we can't get the background
easily. Let's have a fallback for that instead of trying to have
"load" events everywhere.
While working on a helm chart, we do not control the creation of the db
URL, which use "postgres://" instead of "postgis://", so Django does not
set the correct engine. So let's be explicit here.
While working on a helm chart, we do not control the creation of
the db URL, which use "postgres://" instead of "postgis://", so
Django does not set the correct engine.
This also tries to rework a bit the "reflow" process, which how to edit
the UI when something changes in the data.
The idea is to build the whole HTML, then:
- the `propagate` method tries to change the UI with targetted CSS
selector, but anywhere
- while `render` hide/show some elements
This is not the destination, but just another step. We certainly need to
refactor the SCHEMA to make the next step (as we want to associate some
data change to UI change).
This also tries to rework a bit the "reflow" process, which how
to edit the UI when something changes in the data.
The idea is to build the whole HTML, then:
- the `propagate` method tries to change the UI with targetted CSS
selector, but anywhere
- while `render` hide/show some elements
This is not the destination, but just another step. We certainly
need to refactor the SCHEMA to make the next step (as we want to associate
some data change to UI change).
Side note (for another PR I'd say): this usually occurs on a non saved
map, but in case the map already exist and is in sync mode, should we
sync each property (safer but one call per property) or the whole
properties object (lighter, but may override unwanted things in remote,
and currently there is no method to do so).
Bumps [rcssmin](https://github.com/ndparker/rcssmin) from 1.1.3 to
1.2.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ndparker/rcssmin/blob/master/CHANGES">rcssmin's
changelog</a>.</em></p>
<blockquote>
<p>Changes with version 1.2.0</p>
<p>*) Add support for nesting selector (&)</p>
<p>*) Update project boilerplate</p>
<p>Changes with version 1.1.3</p>
<p>*) Add support for Python 3.13</p>
<p>*) Update project boilerplate</p>
<p>Changes with version 1.1.2</p>
<p>*) Add support for Python 3.12</p>
<p>*) Add musllinux wheels</p>
<p>*) Update project boilerplate</p>
<p>Changes with version 1.1.1</p>
<p>*) Add support for Python 3.11</p>
<p>*) Update project boilerplate</p>
<p>Changes with version 1.1.0</p>
<p>*) quoted data urls which are not base64 encoded keep their spaces
now (<a
href="https://redirect.github.com/ndparker/rcssmin/issues/8">#8</a>)</p>
<p>*) Add x86_64, i686 and aarch64 wheels</p>
<p>*) Update python support: 2.7, 3.6+</p>
<p>*) Both python 2 and 3 now accept bytes and text as input. All other
types now
raise a TypeError. Before they possibly have been converted to a string,
depending on the python version and the implementation. Python 3 also
accepts bytearray input.</p>
<p>*) Support for PyPy and Jython is no longer tested. Patches are
accepted,
though.</p>
<p>*) The python version will only accept the C implementation if the
versions
match exactly. This should prevent using older installed C versions.
Fixes <a
href="https://redirect.github.com/ndparker/rcssmin/issues/11">#11</a>.
This issue is now more relevant since <a
href="https://redirect.github.com/ndparker/rcssmin/issues/7">#7</a> is
fixed.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5396f5ec39"><code>5396f5e</code></a>
Bump version to 1.2.0</li>
<li><a
href="81da21987b"><code>81da219</code></a>
Update benchmarks</li>
<li><a
href="1f9ff6d2d8"><code>1f9ff6d</code></a>
Add support for nesting selector (&)</li>
<li><a
href="eac70b68c2"><code>eac70b6</code></a>
Add pyproject.toml, update dependencies</li>
<li><a
href="c1beaf0f1c"><code>c1beaf0</code></a>
update gpg info</li>
<li>See full diff in <a
href="https://github.com/ndparker/rcssmin/compare/1.1.3...1.2.0">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.7.3 to 0.7.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.7.4</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>flake8-datetimez</code>] Detect usages of
<code>datetime.max</code>/<code>datetime.min</code>
(<code>DTZ901</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14288">#14288</a>)</li>
<li>[<code>flake8-logging</code>] Implement
<code>root-logger-calls</code> (<code>LOG015</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14302">#14302</a>)</li>
<li>[<code>flake8-no-pep420</code>] Detect empty implicit namespace
packages (<code>INP001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14236">#14236</a>)</li>
<li>[<code>flake8-pyi</code>] Add "replace with
<code>Self</code>" fix (<code>PYI019</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14238">#14238</a>)</li>
<li>[<code>perflint</code>] Implement quick-fix for
<code>manual-list-comprehension</code> (<code>PERF401</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/13919">#13919</a>)</li>
<li>[<code>pylint</code>] Implement <code>shallow-copy-environ</code>
(<code>W1507</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14241">#14241</a>)</li>
<li>[<code>ruff</code>] Implement <code>none-not-at-end-of-union</code>
(<code>RUF036</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14314">#14314</a>)</li>
<li>[<code>ruff</code>] Implementation <code>unsafe-markup-call</code>
from <code>flake8-markupsafe</code> plugin (<code>RUF035</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14224">#14224</a>)</li>
<li>[<code>ruff</code>] Report problems for <code>attrs</code>
dataclasses (<code>RUF008</code>, <code>RUF009</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14327">#14327</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-boolean-trap</code>] Exclude dunder methods that
define operators (<code>FBT001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14203">#14203</a>)</li>
<li>[<code>flake8-pyi</code>] Add "replace with
<code>Self</code>" fix (<code>PYI034</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14217">#14217</a>)</li>
<li>[<code>flake8-pyi</code>] Always autofix
<code>duplicate-union-members</code> (<code>PYI016</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14270">#14270</a>)</li>
<li>[<code>flake8-pyi</code>] Improve autofix for nested and mixed type
unions for <code>unnecessary-type-union</code> (<code>PYI055</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14272">#14272</a>)</li>
<li>[<code>flake8-pyi</code>] Mark fix as unsafe when type annotation
contains comments for <code>duplicate-literal-member</code>
(<code>PYI062</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14268">#14268</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Use the current working directory to resolve settings from
<code>ruff.configuration</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14352">#14352</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Avoid conflicts between <code>PLC014</code>
(<code>useless-import-alias</code>) and <code>I002</code>
(<code>missing-required-import</code>) by considering
<code>lint.isort.required-imports</code> for <code>PLC014</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14287">#14287</a>)</li>
<li>[<code>flake8-type-checking</code>] Skip quoting annotation if it
becomes invalid syntax (<code>TCH001</code>)</li>
<li>[<code>flake8-pyi</code>] Avoid using <code>typing.Self</code> in
stub files pre-Python 3.11 (<code>PYI034</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14230">#14230</a>)</li>
<li>[<code>flake8-pytest-style</code>] Flag <code>pytest.raises</code>
call with keyword argument <code>expected_exception</code>
(<code>PT011</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14298">#14298</a>)</li>
<li>[<code>flake8-simplify</code>] Infer "unknown" truthiness
for literal iterables whose items are all unpacks (<code>SIM222</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/14263">#14263</a>)</li>
<li>[<code>flake8-type-checking</code>] Fix false positives for
<code>typing.Annotated</code> (<code>TCH001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14311">#14311</a>)</li>
<li>[<code>pylint</code>] Allow <code>await</code> at the top-level
scope of a notebook (<code>PLE1142</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14225">#14225</a>)</li>
<li>[<code>pylint</code>] Fix miscellaneous issues in
<code>await-outside-async</code> detection (<code>PLE1142</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14218">#14218</a>)</li>
<li>[<code>pyupgrade</code>] Avoid applying PEP 646 rewrites in invalid
contexts (<code>UP044</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14234">#14234</a>)</li>
<li>[<code>pyupgrade</code>] Detect permutations in redundant open modes
(<code>UP015</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14255">#14255</a>)</li>
<li>[<code>refurb</code>] Avoid triggering
<code>hardcoded-string-charset</code> for reordered sets
(<code>FURB156</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14233">#14233</a>)</li>
<li>[<code>refurb</code>] Further special cases added to
<code>verbose-decimal-constructor</code> (<code>FURB157</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14216">#14216</a>)</li>
<li>[<code>refurb</code>] Use <code>UserString</code> instead of
non-existent <code>UserStr</code> (<code>FURB189</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14209">#14209</a>)</li>
<li>[<code>ruff</code>] Avoid treating lowercase letters as <code>#
noqa</code> codes (<code>RUF100</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14229">#14229</a>)</li>
<li>[<code>ruff</code>] Do not report when <code>Optional</code> has no
type arguments (<code>RUF013</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14181">#14181</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Add "Notebook behavior" section for <code>F704</code>,
<code>PLE1142</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14266">#14266</a>)</li>
<li>Document comment policy around fix safety (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14300">#14300</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.7.4</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>flake8-datetimez</code>] Detect usages of
<code>datetime.max</code>/<code>datetime.min</code>
(<code>DTZ901</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14288">#14288</a>)</li>
<li>[<code>flake8-logging</code>] Implement
<code>root-logger-calls</code> (<code>LOG015</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14302">#14302</a>)</li>
<li>[<code>flake8-no-pep420</code>] Detect empty implicit namespace
packages (<code>INP001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14236">#14236</a>)</li>
<li>[<code>flake8-pyi</code>] Add "replace with
<code>Self</code>" fix (<code>PYI019</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14238">#14238</a>)</li>
<li>[<code>perflint</code>] Implement quick-fix for
<code>manual-list-comprehension</code> (<code>PERF401</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/13919">#13919</a>)</li>
<li>[<code>pylint</code>] Implement <code>shallow-copy-environ</code>
(<code>W1507</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14241">#14241</a>)</li>
<li>[<code>ruff</code>] Implement <code>none-not-at-end-of-union</code>
(<code>RUF036</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14314">#14314</a>)</li>
<li>[<code>ruff</code>] Implementation <code>unsafe-markup-call</code>
from <code>flake8-markupsafe</code> plugin (<code>RUF035</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14224">#14224</a>)</li>
<li>[<code>ruff</code>] Report problems for <code>attrs</code>
dataclasses (<code>RUF008</code>, <code>RUF009</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14327">#14327</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-boolean-trap</code>] Exclude dunder methods that
define operators (<code>FBT001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14203">#14203</a>)</li>
<li>[<code>flake8-pyi</code>] Add "replace with
<code>Self</code>" fix (<code>PYI034</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14217">#14217</a>)</li>
<li>[<code>flake8-pyi</code>] Always autofix
<code>duplicate-union-members</code> (<code>PYI016</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14270">#14270</a>)</li>
<li>[<code>flake8-pyi</code>] Improve autofix for nested and mixed type
unions for <code>unnecessary-type-union</code> (<code>PYI055</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14272">#14272</a>)</li>
<li>[<code>flake8-pyi</code>] Mark fix as unsafe when type annotation
contains comments for <code>duplicate-literal-member</code>
(<code>PYI062</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14268">#14268</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Use the current working directory to resolve settings from
<code>ruff.configuration</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14352">#14352</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Avoid conflicts between <code>PLC014</code>
(<code>useless-import-alias</code>) and <code>I002</code>
(<code>missing-required-import</code>) by considering
<code>lint.isort.required-imports</code> for <code>PLC014</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14287">#14287</a>)</li>
<li>[<code>flake8-type-checking</code>] Skip quoting annotation if it
becomes invalid syntax (<code>TCH001</code>)</li>
<li>[<code>flake8-pyi</code>] Avoid using <code>typing.Self</code> in
stub files pre-Python 3.11 (<code>PYI034</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14230">#14230</a>)</li>
<li>[<code>flake8-pytest-style</code>] Flag <code>pytest.raises</code>
call with keyword argument <code>expected_exception</code>
(<code>PT011</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14298">#14298</a>)</li>
<li>[<code>flake8-simplify</code>] Infer "unknown" truthiness
for literal iterables whose items are all unpacks (<code>SIM222</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/14263">#14263</a>)</li>
<li>[<code>flake8-type-checking</code>] Fix false positives for
<code>typing.Annotated</code> (<code>TCH001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14311">#14311</a>)</li>
<li>[<code>pylint</code>] Allow <code>await</code> at the top-level
scope of a notebook (<code>PLE1142</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14225">#14225</a>)</li>
<li>[<code>pylint</code>] Fix miscellaneous issues in
<code>await-outside-async</code> detection (<code>PLE1142</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14218">#14218</a>)</li>
<li>[<code>pyupgrade</code>] Avoid applying PEP 646 rewrites in invalid
contexts (<code>UP044</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14234">#14234</a>)</li>
<li>[<code>pyupgrade</code>] Detect permutations in redundant open modes
(<code>UP015</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14255">#14255</a>)</li>
<li>[<code>refurb</code>] Avoid triggering
<code>hardcoded-string-charset</code> for reordered sets
(<code>FURB156</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14233">#14233</a>)</li>
<li>[<code>refurb</code>] Further special cases added to
<code>verbose-decimal-constructor</code> (<code>FURB157</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14216">#14216</a>)</li>
<li>[<code>refurb</code>] Use <code>UserString</code> instead of
non-existent <code>UserStr</code> (<code>FURB189</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14209">#14209</a>)</li>
<li>[<code>ruff</code>] Avoid treating lowercase letters as <code>#
noqa</code> codes (<code>RUF100</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14229">#14229</a>)</li>
<li>[<code>ruff</code>] Do not report when <code>Optional</code> has no
type arguments (<code>RUF013</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14181">#14181</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Add "Notebook behavior" section for <code>F704</code>,
<code>PLE1142</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14266">#14266</a>)</li>
<li>Document comment policy around fix safety (<a
href="https://redirect.github.com/astral-sh/ruff/pull/14300">#14300</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ed7b98cf9b"><code>ed7b98c</code></a>
Bump version to 0.7.4 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/14358">#14358</a>)</li>
<li><a
href="6591775cd9"><code>6591775</code></a>
[<code>flake8-type-checking</code>] Skip quoting annotation if it
becomes invalid syntax...</li>
<li><a
href="1f82731856"><code>1f82731</code></a>
Use CWD to resolve settings from <code>ruff.configuration</code> (<a
href="https://redirect.github.com/astral-sh/ruff/issues/14352">#14352</a>)</li>
<li><a
href="874da9c400"><code>874da9c</code></a>
[red-knot] Display raw characters for string literal (<a
href="https://redirect.github.com/astral-sh/ruff/issues/14351">#14351</a>)</li>
<li><a
href="375cead202"><code>375cead</code></a>
Sync vendored typeshed stubs (<a
href="https://redirect.github.com/astral-sh/ruff/issues/14350">#14350</a>)</li>
<li><a
href="9ec690b8f8"><code>9ec690b</code></a>
[red-knot] Add support for string annotations (<a
href="https://redirect.github.com/astral-sh/ruff/issues/14151">#14151</a>)</li>
<li><a
href="a48d779c4e"><code>a48d779</code></a>
[red-knot] function signature representation (<a
href="https://redirect.github.com/astral-sh/ruff/issues/14304">#14304</a>)</li>
<li><a
href="ba6c7f6897"><code>ba6c7f6</code></a>
[<code>pylint</code>] Remove check for dot in alias name in
`useless-import-alias (PLC04...</li>
<li><a
href="8095ff0e55"><code>8095ff0</code></a>
enforce required imports even with useless alias (<a
href="https://redirect.github.com/astral-sh/ruff/issues/14287">#14287</a>)</li>
<li><a
href="24cd592a1d"><code>24cd592</code></a>
Avoid module lookup for known classes when possible (<a
href="https://redirect.github.com/astral-sh/ruff/issues/14343">#14343</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.7.3...0.7.4">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Side note (for another PR I'd say): this usually occurs on a non
saved map, but in case the map already exist and is in sync mode,
should we sync each property (safer but one call per property)
or the whole properties object (lighter, but may override unwanted
things in remote, and currently there is no method to do so).
This make it possible to synchronize datalayers before their creation on
the server, allowing at the same time to solve issues related to them
not being saved (e.g. duplication of geometries)
We use the DataLayer._referenceVersion to track if a DataLayer has been
saved on the server.
After a save, the _referenceVersion is synched with other peers.
To pass the reference version from the server to the frontend, we have two
options:
- use a header
- populate the `options.version` field
In the case of a GET on a Datalayer, we could not use the `options` scenario
because:
- the value in the file is not up to date (it was the value the client has
before the save)
- the python cannot change it on the fly, as the file is served by nginx
So we decided to keep using a header. But on the map view, we load all
datalayers metadatas in the map options, so here we cannot use the header
scenario, so in this specific case we had to populate `options._referenceVersion`.
At the same time, we also changed:
- Umap.options.umap_id => Umap.id
- DataLayer.umap_id => Datalayer.id
- fixed the version number returned by DataLayer.version_metadata
Long awaited step! Very intrusive change!
The `umap.js` old papa js style is now moved to modules, and split in
two, as we did for layers and features: one module is for the data part,
and the other is for the rendering part, and this one inherits from
Leaflet.
Sadly, the split between those two modules is not as clear as I'd like
it to be, as some functions my be interpreted or not as rendering.
What is now moved to the rendering module is all elements that inherit
from Leaflet, so what concerns the map itself, but also controls in of
the Leaflet world (inheriting from L.Control). In the other hand, UI
elements that does not inherit from Leaflet are kept on the `umap.js`
module (panels, tooltip, contextmenu…).
Also, `Umap` as a `properties` key, to follow geojson spec, and
distinguish from `LeafletMap.options`.
This is a first step, that will need more work, but as tests pass, I'd
suggest to merge if we agree on the choices and continue working with
other (smaller) PRs (and I'll take care of rebasing current other PRs).
Some specific points I've in mind that does not smell good:
- umap.js module still uses some Leaflet utils
- Umap and LeafletMap have a reference to each other
- umap.js module still need Leaflet events
- layers and feature still need to have reference to both Umap and
LeafletMap
Bumps [djlint](https://github.com/djlint/djLint) from 1.35.2 to 1.36.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/djlint/djLint/releases">djlint's
releases</a>.</em></p>
<blockquote>
<h2>v1.36.1</h2>
<ul>
<li>Improve performance by ~30%. Thanks, <a
href="https://github.com/oliverhaas"><code>@oliverhaas</code></a>.</li>
</ul>
<h2>v1.36.0</h2>
<h3>Feature</h3>
<ul>
<li>Add support for <code>djlint.toml</code> config file. The format is
identical to <code>pyproject.toml</code>, but it does not use
<code>[tool.djlint]</code> table.</li>
</ul>
<h3>Fix</h3>
<ul>
<li>Do not format HTML in attributes. Thanks, <a
href="https://github.com/oliverhaas"><code>@oliverhaas</code></a>.</li>
<li>Fix using <code>js_config</code> instead of
<code>css_config</code>.</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Increase performance by ~30% by using regex more efficiently and
caching more stuff.</li>
</ul>
<h2>v1.35.4</h2>
<p>Compiled <a
href="https://mypyc.readthedocs.io/en/stable/introduction.html">mypyc</a>
wheels are now also available, which improve performance by ~21% over
Pure Python. They will be automatically installed by your package
manager when available for your platform. Pure Python wheel is still
available.</p>
<p>Other changes have been made to improve performance, thanks to <a
href="https://github.com/JCWasmx86"><code>@JCWasmx86</code></a>. See
the <a
href="https://github.com/djlint/djLint/compare/v1.35.3...v1.35.4">commits</a>
for more details.</p>
<p>Formatting performance comparison with the previous version (tested
on <a
href="https://github.com/openedx/edx-platform">https://github.com/openedx/edx-platform</a>
with single thread):</p>
<table>
<thead>
<tr>
<th>Version</th>
<th>Seconds</th>
</tr>
</thead>
<tbody>
<tr>
<td>v1.35.3</td>
<td>20.39</td>
</tr>
<tr>
<td>v1.35.4 pure Python</td>
<td>14.39</td>
</tr>
<tr>
<td>v1.35.4 compiled</td>
<td>11.35</td>
</tr>
</tbody>
</table>
<h2>v1.35.3</h2>
<p>This release significantly improves performance, especially for large
files and large projects.</p>
<p>Formatting <a
href="https://github.com/openedx/edx-platform">https://github.com/openedx/edx-platform</a>
took 87 seconds in the previous version, now it takes only 4 seconds
(>2000% speedup)! Tested on a 32-core computer.</p>
<ul>
<li>Performance improved by caching some functions. Thanks to <a
href="https://github.com/JCWasmx86"><code>@JCWasmx86</code></a>!</li>
<li>Removed the limitation on the number of workers introduced in
v1.35.0.</li>
<li>Drop Python 3.8 support.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/djlint/djLint/blob/master/CHANGELOG.md">djlint's
changelog</a>.</em></p>
<blockquote>
<h2>[1.36.1] - 2024-11-07</h2>
<ul>
<li>Improve performance by ~30%. Thanks, <a
href="https://github.com/oliverhaas"><code>@oliverhaas</code></a>.</li>
</ul>
<h2>[1.36.0] - 2024-11-05</h2>
<h3>Feature</h3>
<ul>
<li>Add support for <code>djlint.toml</code> config file. The format is
identical to <code>pyproject.toml</code>, but it does not use
<code>[tool.djlint]</code> table.</li>
</ul>
<h3>Fix</h3>
<ul>
<li>Do not format HTML in attributes. Thanks, <a
href="https://github.com/oliverhaas"><code>@oliverhaas</code></a>.</li>
<li>Fix using <code>js_config</code> instead of
<code>css_config</code>.</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Increase performance by ~30% by using regex more efficiently and
caching more stuff.</li>
</ul>
<h2>[1.35.4] - 2024-11-01</h2>
<p>Compiled <a
href="https://mypyc.readthedocs.io/en/stable/introduction.html">mypyc</a>
wheels are now also available, which improve performance by ~21% over
Pure Python. They will be automatically installed by your package
manager when available for your platform. Pure Python wheel is still
available.</p>
<p>Other changes have been made to improve performance, thanks to <a
href="https://github.com/JCWasmx86"><code>@JCWasmx86</code></a>. See
the <a
href="https://github.com/djlint/djLint/compare/v1.35.3...v1.35.4">commits</a>
for more details.</p>
<p>Formatting performance comparison with the previous version (tested
on <a
href="https://github.com/openedx/edx-platform">https://github.com/openedx/edx-platform</a>
with single thread):</p>
<table>
<thead>
<tr>
<th>Version</th>
<th>Seconds</th>
</tr>
</thead>
<tbody>
<tr>
<td>v1.35.3</td>
<td>20.39</td>
</tr>
<tr>
<td>v1.35.4 pure Python</td>
<td>14.39</td>
</tr>
<tr>
<td>v1.35.4 compiled</td>
<td>11.35</td>
</tr>
</tbody>
</table>
<h2>[1.35.3] - 2024-10-30</h2>
<p>This release significantly improves performance, especially for large
files and large projects.</p>
<p>Formatting <a
href="https://github.com/openedx/edx-platform">https://github.com/openedx/edx-platform</a>
took 87 seconds in the previous version, now it takes only 4 seconds
(>2000% speedup)! Tested on a 32-core computer.</p>
<ul>
<li>Performance improved by caching some functions. Thanks to <a
href="https://github.com/JCWasmx86"><code>@JCWasmx86</code></a>!</li>
<li>Removed the limitation on the number of workers introduced in
v1.35.0.</li>
<li>Drop Python 3.8 support.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f908697f4e"><code>f908697</code></a>
chore: v1.36.1</li>
<li><a
href="92e2e84f64"><code>92e2e84</code></a>
chore(deps): lock file maintenance</li>
<li><a
href="96fec0e0e1"><code>96fec0e</code></a>
chore(deps): update dependency
<code>@ianvs/prettier-plugin-sort-imports</code> to v4.4.0</li>
<li><a
href="a7050555f8"><code>a705055</code></a>
chore(deps): lock file maintenance</li>
<li><a
href="21dc6a12d7"><code>21dc6a1</code></a>
perf: simple skip for unformatted blocks (<a
href="https://redirect.github.com/djlint/djLint/issues/1005">#1005</a>)</li>
<li><a
href="9dc7ea3cb6"><code>9dc7ea3</code></a>
chore(deps): lock file maintenance</li>
<li><a
href="14530c8356"><code>14530c8</code></a>
chore: v1.36.0</li>
<li><a
href="d97be3b90e"><code>d97be3b</code></a>
fix: types.py -> types.pyi</li>
<li><a
href="012ee62d47"><code>012ee62</code></a>
chore(deps): lock file maintenance</li>
<li><a
href="1afeeb87cf"><code>1afeeb8</code></a>
fix: fix type hint</li>
<li>Additional commits viewable in <a
href="https://github.com/djlint/djLint/compare/v1.35.2...v1.36.1">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Bumps [django](https://github.com/django/django) from 5.1.2 to 5.1.3.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="69bf08e3a3"><code>69bf08e</code></a>
[5.1.x] Bumped version for 5.1.3 release.</li>
<li><a
href="e3984ca5d1"><code>e3984ca</code></a>
[5.1.x] Added release date for 5.1.3.</li>
<li><a
href="4ae358122b"><code>4ae3581</code></a>
[5.1.x] Made minor edits to form fields docs.</li>
<li><a
href="9fa2d235c9"><code>9fa2d23</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/35876">#35876</a>
-- Displayed non-ASCII fieldset names when rendering Mod...</li>
<li><a
href="5045dab4f9"><code>5045dab</code></a>
[5.1.x] Added missing lang attributes to html elements in docs.</li>
<li><a
href="ffc67aac1e"><code>ffc67aa</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/35864">#35864</a>
-- Documented EmailMessage.connection is ignored when us...</li>
<li><a
href="4915feaaf7"><code>4915fea</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/35873">#35873</a>
-- Corrected Form.as_table() call in form docs.</li>
<li><a
href="b57a8395b5"><code>b57a839</code></a>
[5.1.x] Refs <a
href="https://redirect.github.com/django/django/issues/35844">#35844</a>
-- Expanded compatibility for expected error messages in ...</li>
<li><a
href="c5ddc8550c"><code>c5ddc85</code></a>
[5.1.x] Corrected note on importing fields in model field reference
docs.</li>
<li><a
href="0a1091f118"><code>0a1091f</code></a>
[5.1.x] Removed unneeded OS reference on running the test suite in
contributi...</li>
<li>Additional commits viewable in <a
href="https://github.com/django/django/compare/5.1.2...5.1.3">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
The last refactor of the save process
(0fdb70ce66) has introduced a bug: the
save flow was not more stopped when a layer fail to save. This ends with
a broken UI, as the map is not dirty anymore, so the save button is not
active anymore, while at least one layer still needs to be saved.
Save can fail in two scenarios:
- there is a conflict (status 412)
- the server is down or as an issue (eg. disk is full)
I tried a more modest scenario (listening for status in map.save and
recallign the map save after a conflict), but this ended with calling
map.save uselessly even more.
So I decided to try this refactor, which also totally remove the useless
map.save we were sending at each save until now.
Bumps [uwsgi](https://uwsgi-docs.readthedocs.io/en/latest/) from 2.0.27
to 2.0.28.
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
The last refactor of the save process (0fdb70ce66)
has introduced a bug: the save flow was not more stopped when a layer fail to save.
This ends with a broken UI, as the map is not dirty anymore, so the save button
is not active anymore, while at least one layer still needs to be saved.
Save can fail in two scenarios:
- there is a conflict (status 412)
- the server is down or as an issue (eg. disk is full)
I tried a more modest scenario (listening for status in map.save and
recallign the map save after a conflict), but this ended with calling
map.save uselessly even more.
So I decided to try this refactor, which also totally remove the useless
map.save we were sending at each save until now.
And only this panel.
This was creating a weird bug, steps to reproduce:
- create a marker
- shift-click on the marker to edit the layer (so without explicitly
closing the panel)
- try to type the layer name: the panel would close
This is also because currently the schema and render() are too dump, and
when any `name` is changed then the `data` reflow is called, while it
should not when editing the datalayer name.
We want to:
- have more targeted schema
- have more specific reflow in render
But that's for other PRs!
When finishing drawing a polygon/line, Leaflet.Editable will send
both `editable:drawing:end` and `editable:drawing:commit`. In normal
flow, we only need to listen to the later, and we only need to
listen for the former in the case of pressing escape while drawing.
And only this panel.
This was creating a weird bug, steps to reproduce:
- create a marker
- shift-click on the marker to edit the layer (so without explicitly
closing the panel)
- try to type the layer name: the panel would close
This is also because currently the schema and render() are too
dump, and when any `name` is changed then the `data` reflow is
called, while it should not when editing the datalayer name.
We want to:
- have more targeted schema
- have more specific reflow in render
But that's for other PRs!
fix#2232
A classified layer needs to have compiled the data to known its
classes/categories.
This commit review the way we build the legend: instead of creating with
the whole caption panel, we just set a container and we populate it
later. This opens the door for live changing the legend when editing the
layer.
But we have to clarify that "reactive" pattern at some point, as we have
some concurrent pattern laying around: the `render()`, which coupled
with the schema and this is nice, but for now it's a bit rough (changing
the whole UI each time); the `propagate` way, which is more specific,
but not coupled to the schema; the `dataChanged`; and the `onDataLoaded`
now, which is a bit different, as it's about the data being loaded, not
changed/modified, but for the DOM it may at the end be the same. Well,
food for thoughts…
fix#2232
A classified layer needs to have compiled the data to known its
classes/categories.
This commit review the way we build the legend: instead of creating
with the whole caption panel, we just set a container and we populate
it later. This opens the door for live changing the legend when
editing the layer.
But we have to clarify that "reactive" pattern at some point, as we
have some concurrent pattern laying around: the `render()`, which
coupled with the schema and this is nice, but for now it's a bit rough
(changing the whole UI each time); the `propagate` way, which is
more specific, but not coupled to the schema; the `dataChanged`; and
the `onDataLoaded` now, which is a bit different, as it's about the
data being loaded, not changed/modified, but for the DOM it may at
the end be the same. Well, food for thoughts…
fix#2097
cf #1500

This is an alternative proposal for #2097:
- adding the button near the "Filter" toggle was a bit ugly, CSS/HTML
talking, because this "Filters" box is a details/summary
- I thought that other needs could live in the same place: a link to
download the filtered/visible data, and a button to show the map data
extent
The "toggle all" button works this way:
- if one or more layers are shown, it will hide those layers
- otherwise it will show all layers
I've preferred not to change the button icon according to map state,
because I didn't find a reliable way to do so, thus I'm afraid to have
inconsistency, but I can't try harder if needed.
Related: I'm thinking of adding a "Download" button for each layers, as
it's a request that comes quite often.
@Aurelie-Jallut could you have a look ? :)
Bumps [hatch](https://github.com/pypa/hatch) from 1.12.0 to 1.13.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pypa/hatch/releases">hatch's
releases</a>.</em></p>
<blockquote>
<h2>Hatchling v1.13.0</h2>
<p><em><strong>Added:</strong></em></p>
<ul>
<li>Update the set of known trove classifiers to version 2023.2.8</li>
</ul>
<h2>Hatch v1.13.0</h2>
<p><em><strong>Added:</strong></em></p>
<ul>
<li>Support managing Python 3.13 distributions</li>
</ul>
<h2>Hatchling v1.12.2</h2>
<p><em><strong>Fixed:</strong></em></p>
<ul>
<li>Add <code>macos-max-compat</code> option to the <code>wheel</code>
target that is enabled by default to support the latest version 22.0 of
the <code>packaging</code> library</li>
</ul>
<h2>Hatchling v1.12.1</h2>
<p><em><strong>Fixed:</strong></em></p>
<ul>
<li>Fix minor regression in the PEP 517/660 function signatures that was
discovered by Fedora</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4e3c515bb1"><code>4e3c515</code></a>
release Hatch v1.13.0</li>
<li><a
href="204c0cdc30"><code>204c0cd</code></a>
Support managing Python 3.13 distributions (<a
href="https://redirect.github.com/pypa/hatch/issues/1753">#1753</a>)</li>
<li>See full diff in <a
href="https://github.com/pypa/hatch/compare/hatch-v1.12.0...hatch-v1.13.0">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material)
from 9.5.39 to 9.5.40.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/squidfunk/mkdocs-material/releases">mkdocs-material's
releases</a>.</em></p>
<blockquote>
<h2>mkdocs-material-9.5.40</h2>
<ul>
<li>Updated Latvian translations</li>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7597">#7597</a>:
Social cards not using site name on home page</li>
</ul>
<p>Thanks go to <a
href="https://github.com/pekkaklarck"><code>@pekkaklarck</code></a> and
<a href="https://github.com/klejejs"><code>@klejejs</code></a> for
their contributions</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG">mkdocs-material's
changelog</a>.</em></p>
<blockquote>
<p>mkdocs-material-9.5.40 (2024-10-10)</p>
<ul>
<li>Updated Latvian translations</li>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7597">#7597</a>:
Social cards not using site name on home page</li>
</ul>
<p>mkdocs-material-9.5.39+insiders-4.53.14 (2024-09-29)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7567">#7567</a>:
Empty headlines when using typeset plugin with anchorlinks</li>
</ul>
<p>mkdocs-material-9.5.39 (2024-09-29)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7226">#7226</a>:
not staying on page when using mike's canonical versioning</li>
</ul>
<p>mkdocs-material-9.5.38 (2024-09-26)</p>
<ul>
<li>Added Albanian translations</li>
</ul>
<p>mkdocs-material-9.5.37 (2024-09-25)</p>
<ul>
<li>Added 4th and 5th level ordered list styles</li>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7548">#7548</a>:
Tags have no spacing in search</li>
</ul>
<p>mkdocs-material-9.5.36 (2024-09-21)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7544">#7544</a>:
Social cards incorrectly rendering HTML entities</li>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7542">#7542</a>:
Improved support for setting custom list styles</li>
</ul>
<p>mkdocs-material-9.5.35 (2024-09-18)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7498">#7498</a>:
Search not showing for Vietnamese language</li>
</ul>
<p>mkdocs-material-9.5.34+insiders-4.53.13 (2024-09-14)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7520">#7520</a>:
Social plugin errors for generated files (MkDocs 1.6+)</li>
</ul>
<p>mkdocs-material-9.5.34 (2024-08-31)</p>
<ul>
<li>Updated Mermaid.js to version 11 (latest)</li>
</ul>
<p>mkdocs-material-9.5.33 (2024-08-23)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7453">#7453</a>:
Incorrect position of tooltip when sorting table</li>
</ul>
<p>mkdocs-material-9.5.32 (2024-08-19)</p>
<ul>
<li>Fixed RXSS vulnerability via deep link in search results</li>
<li>Added support for fetching latest release from GitLab</li>
</ul>
<p>mkdocs-material-9.5.31+insiders-4.53.12 (2024-08-02)</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="921e522a51"><code>921e522</code></a>
Prepare 9.5.40 release</li>
<li><a
href="829d1c8db2"><code>829d1c8</code></a>
Fixed social cards not using site name on homepage (<a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7608">#7608</a>)</li>
<li><a
href="cf2b39d1c2"><code>cf2b39d</code></a>
Documentation</li>
<li><a
href="10177cc275"><code>10177cc</code></a>
Documentation (<a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7604">#7604</a>)</li>
<li><a
href="f0c99d89da"><code>f0c99d8</code></a>
Documentation (<a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7602">#7602</a>)</li>
<li><a
href="a9be02645b"><code>a9be026</code></a>
Fixed file watching for Chokidar 4</li>
<li><a
href="2014b634e8"><code>2014b63</code></a>
Fixed file watching for Chokidar 4</li>
<li><a
href="25b2107b53"><code>25b2107</code></a>
Updated dependencies</li>
<li><a
href="a83d44a7c8"><code>a83d44a</code></a>
Updated publishing guide (<a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7584">#7584</a>)</li>
<li><a
href="ffcabcaa15"><code>ffcabca</code></a>
Merge pull request <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7582">#7582</a>
from yanyongyu/schema/validation-anchors</li>
<li>Additional commits viewable in <a
href="https://github.com/squidfunk/mkdocs-material/compare/9.5.39...9.5.40">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Bumps [django](https://github.com/django/django) from 5.1.1 to 5.1.2.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c499184f19"><code>c499184</code></a>
[5.1.x] Bumped version for 5.1.2 release.</li>
<li><a
href="6e07a7769f"><code>6e07a77</code></a>
[5.1.x] Added release date for 5.1.2.</li>
<li><a
href="17fa7592af"><code>17fa759</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/35809">#35809</a>
-- Set background color for selected rows in the admin's...</li>
<li><a
href="e245f62d00"><code>e245f62</code></a>
[5.1.x] Updated translations from Transifex.</li>
<li><a
href="6bedb102e9"><code>6bedb10</code></a>
[5.1.x] Reindented attributes and methods for classes in
docs/ref/middleware....</li>
<li><a
href="bf64ac3567"><code>bf64ac3</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/35670">#35670</a>
-- Clarified the return value for LoginRequiredMiddlewar...</li>
<li><a
href="53031136f5"><code>5303113</code></a>
[5.1.x] Relocated path() explanation to docs/ref/urls.txt to simplify
tutoria...</li>
<li><a
href="22bce642a9"><code>22bce64</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/35734">#35734</a>
-- Used JSONB_BUILD_OBJECT database function on PostgreS...</li>
<li><a
href="9e146b27ad"><code>9e146b2</code></a>
[5.1.x] Made cosmetic edits to the Steering council docs.</li>
<li><a
href="251180f7f9"><code>251180f</code></a>
[5.1.x] Removed setting the release schedule from Steering Council
prerogativ...</li>
<li>Additional commits viewable in <a
href="https://github.com/django/django/compare/5.1.1...5.1.2">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
I first thought about marking test as flaky one by one, but my
impression is mainly all playwright test can become flacky, and we
actually only see some as their appear in the list.
offsetParent will return whatever positionned parent element, so
when clicking on a marker it will be the marker container.
And we cannot add the contextmenu inside the map container, as it
the focusout element will be sent before the click action happen
on any item of the contextmenu.
The tricky thing is that the Map.is_owner() method check for cookies on
the request, but at create this cookie is not set yet on the request, so
we have to deal with an exception here.
fix#2176
The tricky thing is that the Map.is_owner() method check for cookies
on the request, but at create this cookie is not set yet on the
request, so we have to deal with an exception here.
fix#2176
The main issue was because we overrided the `getLatLngs` function in our
PointMixin class, so I changed the way feature get the latlngs from the
UI classes. Plus getting CircleMarker to inherit more from Marker,
through PointMixin.
fix#2171
Until now, uMap was not deleting files on delete, which can increase
file storage a lot after some time.
The files are not deleted, but moved to a "purgatory" folder, from where
they can be deleted after some time.
This bug has been introduced when spliting features, as we now only set
the Leaflet Polygon options with setStyle, will the `interactive` option
is only used in the init by Leaflet.
See https://github.com/Leaflet/Leaflet/pull/9475
Bumps
[pymdown-extensions](https://github.com/facelessuser/pymdown-extensions)
from 10.11.1 to 10.11.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/facelessuser/pymdown-extensions/releases">pymdown-extensions's
releases</a>.</em></p>
<blockquote>
<h2>10.11.2</h2>
<ul>
<li><strong>FIX</strong>: SuperFences: Fix a regression where certain
patterns could cause a hang.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a9940657c9"><code>a994065</code></a>
Fix SuperFence pattern should require options to be separated by a space
(<a
href="https://redirect.github.com/facelessuser/pymdown-extensions/issues/2480">#2480</a>)</li>
<li><a
href="96e19e6865"><code>96e19e6</code></a>
Remove more duplicate words</li>
<li><a
href="3f6fbbb633"><code>3f6fbbb</code></a>
Typos: remove various duplicated words</li>
<li>See full diff in <a
href="https://github.com/facelessuser/pymdown-extensions/compare/10.11.1...10.11.2">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
[//]: # (dependabot-start)
⚠️ **Dependabot is rebasing this PR** ⚠️
Rebasing might not happen immediately, so don't worry if this takes some
time.
Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.
---
[//]: # (dependabot-end)
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material)
from 9.5.36 to 9.5.39.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/squidfunk/mkdocs-material/releases">mkdocs-material's
releases</a>.</em></p>
<blockquote>
<h2>mkdocs-material-9.5.39</h2>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7226">#7226</a>:
not staying on page when using mike's canonical versioning</li>
</ul>
<p>Thanks go to <a
href="https://github.com/ilyagr"><code>@ilyagr</code></a> for their
contributions</p>
<h2>mkdocs-material-9.5.38</h2>
<ul>
<li>Added Albanian translations</li>
</ul>
<p>Thanks go to <a
href="https://github.com/gerardkraja"><code>@gerardkraja</code></a> for
their contributions</p>
<h2>mkdocs-material-9.5.37</h2>
<ul>
<li>Added 4th and 5th level ordered list styles</li>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7548">#7548</a>:
Tags have no spacing in search</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG">mkdocs-material's
changelog</a>.</em></p>
<blockquote>
<p>mkdocs-material-9.5.39+insiders-4.53.14 (2024-09-29)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7567">#7567</a>:
Empty headlines when using typeset plugin with anchorlinks</li>
</ul>
<p>mkdocs-material-9.5.39 (2024-09-29)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7226">#7226</a>:
not staying on page when using mike's canonical versioning</li>
</ul>
<p>mkdocs-material-9.5.38 (2024-09-26)</p>
<ul>
<li>Added Albanian translations</li>
</ul>
<p>mkdocs-material-9.5.37 (2024-09-25)</p>
<ul>
<li>Added 4th and 5th level ordered list styles</li>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7548">#7548</a>:
Tags have no spacing in search</li>
</ul>
<p>mkdocs-material-9.5.36 (2024-09-21)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7544">#7544</a>:
Social cards incorrectly rendering HTML entities</li>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7542">#7542</a>:
Improved support for setting custom list styles</li>
</ul>
<p>mkdocs-material-9.5.35 (2024-09-18)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7498">#7498</a>:
Search not showing for Vietnamese language</li>
</ul>
<p>mkdocs-material-9.5.34+insiders-4.53.13 (2024-09-14)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7520">#7520</a>:
Social plugin errors for generated files (MkDocs 1.6+)</li>
</ul>
<p>mkdocs-material-9.5.34 (2024-08-31)</p>
<ul>
<li>Updated Mermaid.js to version 11 (latest)</li>
</ul>
<p>mkdocs-material-9.5.33 (2024-08-23)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7453">#7453</a>:
Incorrect position of tooltip when sorting table</li>
</ul>
<p>mkdocs-material-9.5.32 (2024-08-19)</p>
<ul>
<li>Fixed RXSS vulnerability via deep link in search results</li>
<li>Added support for fetching latest release from GitLab</li>
</ul>
<p>mkdocs-material-9.5.31+insiders-4.53.12 (2024-08-02)</p>
<ul>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7410">#7410</a>:
Instant previews jump on content tabs with anchor links</li>
<li>Fixed <a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7408">#7408</a>:
Instant previews jump on content tabs</li>
</ul>
<p>mkdocs-material-9.5.31 (2024-08-02)</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="70db88f414"><code>70db88f</code></a>
Prepare 9.5.39 release</li>
<li><a
href="187705e3b8"><code>187705e</code></a>
Updated dependencies</li>
<li><a
href="56fdb282d0"><code>56fdb28</code></a>
Adjusted code copy button documentation</li>
<li><a
href="aeb9492c08"><code>aeb9492</code></a>
Fixed stay no page functionality when using mike's canonical versioning
(<a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7559">#7559</a>)</li>
<li><a
href="50a15becc8"><code>50a15be</code></a>
Updated link to step-by-step guide on YouTube</li>
<li><a
href="117250a462"><code>117250a</code></a>
Prepare 9.5.38 release</li>
<li><a
href="74ca2341ac"><code>74ca234</code></a>
Added Albanian translations</li>
<li><a
href="84ddbba7ef"><code>84ddbba</code></a>
Prepare 9.5.37 release</li>
<li><a
href="fd984136ba"><code>fd98413</code></a>
Documentation (<a
href="https://redirect.github.com/squidfunk/mkdocs-material/issues/7557">#7557</a>)</li>
<li><a
href="573d23d147"><code>573d23d</code></a>
Updated dependencies</li>
<li>Additional commits viewable in <a
href="https://github.com/squidfunk/mkdocs-material/compare/9.5.36...9.5.39">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Bumps
[pymdown-extensions](https://github.com/facelessuser/pymdown-extensions)
from 10.10.1 to 10.11.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/facelessuser/pymdown-extensions/releases">pymdown-extensions's
releases</a>.</em></p>
<blockquote>
<h2>10.11.1</h2>
<ul>
<li><strong>Fix</strong>: SuperFences: Fix regression where an omitted
language in conjunction with options in the fenced header
can cause a fence to not be parsed.</li>
</ul>
<h2>10.11</h2>
<ul>
<li><strong>NEW</strong>: SuperFences: Allow fenced code to be parsed in
the form <code>```lang {.class #id}</code>.</li>
</ul>
<h2>10.10.2</h2>
<ul>
<li><strong>FIX</strong>: BetterEm: Add better support for <code>*em,
**em,strong***</code> and <code>_em, __em,strong___</code> cases.</li>
<li><strong>FIX</strong>: Caret: Add better support for <code>*sup,
**sup,ins***</code>.</li>
<li><strong>FIX</strong>: Tilde: Add better support for <code>*sub,
**sub,del***</code>.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d43141d7b0"><code>d43141d</code></a>
Fix omitted language case (<a
href="https://redirect.github.com/facelessuser/pymdown-extensions/issues/2472">#2472</a>)</li>
<li><a
href="79dabb16c0"><code>79dabb1</code></a>
Another attempt to fix MathJax loading issues in docs</li>
<li><a
href="4b54d02a0f"><code>4b54d02</code></a>
Support alternate fenced header form (<a
href="https://redirect.github.com/facelessuser/pymdown-extensions/issues/2470">#2470</a>)</li>
<li><a
href="8355b4565f"><code>8355b45</code></a>
Attempt to fix issues with instant loading</li>
<li><a
href="448972add0"><code>448972a</code></a>
Fix bad example</li>
<li><a
href="f8f8c579b9"><code>f8f8c57</code></a>
Bump version</li>
<li><a
href="7a95865558"><code>7a95865</code></a>
Add support for <code>*tag1 **tag1,tag2***</code> cases for
<code>*</code>, <code>_</code>, <code>~</code>, and <code>^</code> (<a
href="https://redirect.github.com/facelessuser/pymdown-extensions/issues/2467">#2467</a>)</li>
<li><a
href="5f0e3fc972"><code>5f0e3fc</code></a>
Docs: Turn off instant loading until we figure out MathJax issue with
it</li>
<li>See full diff in <a
href="https://github.com/facelessuser/pymdown-extensions/compare/10.10.1...10.11.1">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Bumps [psycopg](https://github.com/psycopg/psycopg) from 3.2.2 to 3.2.3.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/psycopg/psycopg/blob/master/docs/news.rst">psycopg's
changelog</a>.</em></p>
<blockquote>
<p>.. currentmodule:: psycopg</p>
<p>.. index::
single: Release notes
single: News</p>
<h1><code>psycopg</code> release notes</h1>
<h2>Current release</h2>
<p>Psycopg 3.2.3
^^^^^^^^^^^^^</p>
<ul>
<li>Release binary packages including PostgreSQL 17 libpq
(🎫<code>[#852](https://github.com/psycopg/psycopg/issues/852)</code>).</li>
</ul>
<p>Psycopg 3.2.2
^^^^^^^^^^^^^</p>
<ul>
<li>Drop <code>!TypeDef</code> specifications as string from public
modules, as they cannot
be composed by users as <code>!typing</code> objects previously could
(🎫<code>[#860](https://github.com/psycopg/psycopg/issues/860)</code>).</li>
<li>Release Python 3.13 binary packages.</li>
</ul>
<p>Psycopg 3.2.1
^^^^^^^^^^^^^</p>
<ul>
<li>Fix packaging metadata breaking <code>[c]</code>,
<code>[binary]</code> dependencies
(🎫<code>[#853](https://github.com/psycopg/psycopg/issues/853)</code>).</li>
</ul>
<h2>Psycopg 3.2</h2>
<p>.. rubric:: New top-level features</p>
<ul>
<li>Add support for integer, floating point, boolean <code>NumPy scalar
types</code>__
(🎫<code>[#332](https://github.com/psycopg/psycopg/issues/332)</code>).</li>
<li>Add <code>!timeout</code> and <code>!stop_after</code> parameters to
<code>Connection.notifies()</code>
(🎫<code>340</code>).</li>
<li>Allow dumpers to return <code>!None</code>, to be converted to NULL
(🎫<code>[#377](https://github.com/psycopg/psycopg/issues/377)</code>).</li>
<li>Add :ref:<code>raw-query-cursors</code> to execute queries using
placeholders in
PostgreSQL format (<code>$1</code>, <code>$2</code>...)
(🎟️<code>[#560](https://github.com/psycopg/psycopg/issues/560),
[#839](https://github.com/psycopg/psycopg/issues/839)</code>).</li>
<li>Add <code>capabilities</code> object to :ref:<code>inspect the libpq
capabilities <capabilities></code>
(🎫<code>[#772](https://github.com/psycopg/psycopg/issues/772)</code>).</li>
<li>Add <code>~rows.scalar_row</code> to return scalar values from a
query
(🎫<code>[#723](https://github.com/psycopg/psycopg/issues/723)</code>).</li>
<li>Add <code>~Connection.cancel_safe()</code> for encrypted and
non-blocking cancellation
when using libpq v17. Use such method internally to implement</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ce8f07321b"><code>ce8f073</code></a>
chore: bump psycopg package version to 3.2.3</li>
<li><a
href="9af9267bdb"><code>9af9267</code></a>
Merge pull request <a
href="https://redirect.github.com/psycopg/psycopg/issues/917">#917</a>
from psycopg/pg17</li>
<li><a
href="9c9369bea4"><code>9c9369b</code></a>
docs: mention PostgreSQL 17 in binary packages in the news file</li>
<li><a
href="d0b1a3ab0a"><code>d0b1a3a</code></a>
ci: install flex to build libpq</li>
<li><a
href="17e8d85f69"><code>17e8d85</code></a>
ci(macos): fix dylib path for postgres 17 from brew</li>
<li><a
href="d06613299a"><code>d066132</code></a>
ci(macos): update brew to install PostgreSQL 17</li>
<li><a
href="2cc362e4dc"><code>2cc362e</code></a>
ci: bump to PostgreSQL 17 in binary packages</li>
<li><a
href="810bfcf09c"><code>810bfcf</code></a>
chore: add PostgreSQL 17 TRANSACTION_TIMEOUT error</li>
<li><a
href="2a0242163b"><code>2a02421</code></a>
ci: Add PostgreSQL 17 to CI test grid, remove PostgreSQL 11</li>
<li><a
href="bea783d394"><code>bea783d</code></a>
fix(windows): resolve absolute path to libpq</li>
<li>Additional commits viewable in <a
href="https://github.com/psycopg/psycopg/compare/3.2.2...3.2.3">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Bumps [uwsgi](https://uwsgi-docs.readthedocs.io/en/latest/) from 2.0.26
to 2.0.27.
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
- Operations are now stored locally in memory. All operations are tied
to an HLC (Hybrid Logical Clock), making it possible to order them
concistently.
- Messages are handled in their `on*` methods, leading to a clearer
implementation.
- When a new peer joins, it asks a random peer for the list of
operations, and re-apply them locally.
- Messages types names have been updated to follow CamelCase, and to be
similar across the client and the server.
- Pass `sync=False` to `makeFeature` in the updaters, to avoid
generating duplicate operations on message retrieval.
The main issue was because we overrided the `getLatLngs` function
in our PointMixin class, so I changed the way feature get the latlngs
from the UI classes.
fix#2171
Until now, uMap was not deleting files on delete, which can increase
file storage a lot after some time.
The files are not deleted, but moved to a "purgatory" folder, from
where they can be deleted after some time.
This bug has been introduced when spliting features, as we now
only set the Leaflet Polygon options with setStyle, will the
`interactive` option is only used in the init by Leaflet.
See https://github.com/Leaflet/Leaflet/pull/9475fix#2149
The primary coordinates is a two-elements Array in Point.coordinates,
but FormBuilder does not know how to edit an Array, so we edit the
`ui._latlngs` instead.
The proper fix would have been to teach FormBuilder how to edit an
Array, but that path is way longer, and given we plan to refactor
it totally, let's wait for that.
fix#2144
So we can integrate the changelog in the release, instead of having
a commit after the release.
You need to have a GITHUB_TOKEN env var, with a read only bearer
coming from https://github.com/settings/tokens
In the same move, refactor the can_edit/_view/_delete functions to
only take the request, which is what really happen in the code, and
adapt the test in that way.
This should improve the edit experience with huge geometries. So one
can still edit the properties event if the path is big, and should
zoom in to allow the geometry to be editable.
Otherwise when scrolling the table, the input will not appear at
the expected position, and may even appear outside of the view when
the table is bigger than the viewport.
Drawback: the table will resize its columns when the input/textarea
is created (as position: sticky is in the flow). So I've also removed
the width reset.
fix#2071
That's a bit of an experiment, so to see what needs to be done:
- move the icon in the 24px svg normal and white to it's on the same
place as in the 16px
- replace the JS code (which used a :before class) to use a <i> element
- remove the old CSS class
I've a concern that the way we create elements using the loadTemplate is
more verbose and not DRY, let's discuss this :)
Since a2ca3a1436, the panel/popup
template uses loadTemplate, which used to remove all white spaces
from the inner html. We had to do this to workaround white space
breaking the slideshow toolbox buttons.
So this commits fixes this problem in another way: do not remove
white space (usefull for text content in popup/panels), but use
a display: flex instead of inline-block.
Since 8ddc570e23 we lost the link
request <=> map, so the "dataloading" and "dataload" events are
global to the DOM, so when loading a list of maps, all instances
react to all dataloading events, which makes the list a mess.
I'd prefer to keep this loading indicator per map, but it's much
easier to just hide it, so let's go that way.
We tried to have only one listened at map level, but we get into
troubles with bindTooltip({permanent: false} and MarkerClusterGroup
stoping the event to each the map.
Let's go back to previous behaviour, and try later to clean this
event management.
And move properties to shema.js. Given those keys does not have
a "guessable" handler, let's have a "customHandlers" prop to deal
with those (instead of keeping them outside of the schema…)
fix#2006
This is a small step in the direction of spliting the data part
and the rendering part.
Basically in modules/data relies the data part, and in modules/rendering
the rendering part, which at some point in the history should be
the only place where we use and inherit from Leaflet, including utils
and such.
Given `setViewFromQueryString` is now async, the slideshow may start
before it is run and thus it has called `initCaptionBar`, so let's
call it directly (and it's not linked to query string, so…)
so it does not increase the cell width and does not change all
the table size.
Actually, there is still a small size change as we remove the cell
content before adding the input/textarea, but more subtle than before
Steps to reproduce:
- click in any BlurInput
- change to any value
- click outside the input => the value will be set to the object
- click again in the input
- change value to the initial
- click outside => the value will not be set
This is because the BlurInput in sync on blur, and it was comparing
the current field value with an "initial" one, only set at build.
This check is made because we don't want to trigger an edit when a
user click in a blurinput and click outside without changing the value.
We want to be able to await function there.
Specifically, we want to await the data creation when it comes from
the `data` url param, so when we also consume the `feature` url param,
that feature is already on the map so we can open it
This mainly allows to dynamically load the third party libraries.
In the same process, those libs have changed:
- tokml => switch to placemarkio fork, more up to date and available
as ESM
- togpx => switch to geojson-to-gpx, more up to date and available as
ESM (note: this lib does not export polygons, because they do not
make sense in GPX world, while the previous was converting them as
lines before)
This introduces a `sync=true/false` parameter that can be passed along
when loading data from our own server, in which case we don't want to
send "operation" messages.
This commits adds a way to differenciate "end of edit" events that are
triggered rightfully and the one which are triggered during the deletion
of a feature.
Also, directly call the `sync.upsert()` method after the move happened.
We removed line breaks management on the JS side so to manage it
in CSS, but this CSS was only active on popup/panels for features.
Let's have a class for this, and add it to the map description to
(about panel).
FormBuilder will break when reimporting an exported map with this
default value (at the casting to object was only made on the init,
so reimporting will override this to null again).
alert.js was importing request.js which then imports alert.js
In the process, we moved the post to send the email out of the
alert.js file, and thus tried another pattern to communicate data
between an alert and its caller.
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.
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
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.
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")
```
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()}
```
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`.
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.
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.
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.
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.
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.
Removing the `id` from the feature when cloning makes it generate a new
one. Without this change, the cloned feature keep the already existing
`id`, and during sync, the original object is lost (replaced by the
clone).
Nobody wants to be replaced by a clone.
The goal being for it to be hidden for now.
- Add a `is_owner` method on the map and use it in the view
- Remove duplicated line in `global.js`
- Rename `Datalayer` to `DataLayer` everywhere
- Move the sync flag in the map options (next to slideshow)
`WEBSOCKET_ENABLED`, `WEBSOCKET_HOST`, `WEBSOCKET_PORT` and
`WEBSOCKET_URI` have been added.
They are being transmitted to the client via the `map.options`.
When `WEBSOCKET_ENABLED` is set to `False`, the client doesn't have
the ability to be synced.
This changes how the syncEngine works. At the moment, it's always
instanciated, even if no syncing is configured. It just does nothing.
This is to avoid doing `if (engine) engine.update()` calls everywhere
we use it.
You now need to `start()` and `stop()` it.
This also changes the interface between the synced classes and the sync
engine.
The sync engines only requires two methods now:
- `getSyncMetadata()` which returns all the metadata needed, including
the `engine`.
- `render()` which renders the object, updating the needed parts.
Added a new `geometryToFeature` method in `umap.layer.js` which can
update a given geometry if needed.
A new `id` property can also be passed to the features on creation, to
make it possible to have the same features `id` on different peers.
Synced objects now expose different methods, such as:
- `getSyncEngine` which returns the location of the sync object.
- `getMetadata` which returns the associated metadata with the object.
Hooks have been added when features are created or changed, so the
changes can be synced with other peers.
Authentication is now done using a signed token provided by the Django
server, sent by the JS client and checked by the WebSocket server.
The token contains a `permissions` key that's checked to ensure the user
has access to the map "room", where events will be shared by the peers.
A new SyncEngine module has been added to the JavaScript code. It aims
to sync the local changes with remote ones. This first implementation
relies on a websocket connection.
There is one "room" per map, and the server relays messages to all the
other connected peers.
Messages are checked for compliance with what's allowed as a security
measure. They should also be checked in the clients to avoid potential
attack vectors.
Basically, we do not add `<br>` anymore, but instead let the newline
and use the css `white-space: pre-line;`. Also remove new lines after
title.
While doing that change, I needed to reorder regex so the ones needing
a newline before would still have it (bullets points).
I've added tests and removed some to cover those changes.
fix#1854
> Since their release in 2005, Google Maps-based tools have become the de facto solutions for a variety of online cartographic projects. Their success has been accompanied by a range of critiques denouncing the individualistic market-based logic imposed by these mapping services. Alternative options to this dominant model have been released since then; uMap is one of them. <mark>uMap is a free, open-source online mapping platform that builds on OpenStreetMap to enable anyone to easily publish web maps individually or collaboratively.</mark> In this paper, we reflect on the potential and limits of uMap based on our own experiences of deploying it in six different mapping projects. Through these experiences, uMap appears particularly well-suited for collaborative mapping projects, due to its ease in connecting to remote data and its high level of interoperability with a range of other applications. On the other hand, uMap seems less relevant for crowdmapping projects, due to its lack of built-in options to manage and control public contributions. Finally, the open-source philosophy of uMap, combined with its simplicity of use and its strong collaborative capacity, make it a great option for activist mapping projects as well as for pedagogical purposes to teach a range of topics including online collaborative cartography.
## [Mapping the CUNY Digital History Archive](https://cuny.manifoldapp.org/read/mapping-the-cuny-digital-history-archive) (2024-05)
> This article discusses the implementation of the Learning CUNY History project, designed as an open education praxis for teaching and learning. It’s an example of a project-based assignment for undergraduate students and has evolved to explore the impact of integrating digital archives and digital mapping as instructional-digital tools. The project activates the CUNY Digital History Archive as a method of developing students’ digital literacy skills and investigates the potential to facilitate students’ learning. The archive is activated through student investigations and writings related to archival materials. Students then map the items as an interactive semester assignment. The project is described as occurring over three phases, and compares different digital mapping platforms. <mark>Ultimately, after careful consideration since its pilot phase, the project utilizes Open Street Map and uMap.</mark>
## [uMap 2 and beyond 🚀](https://www.openstreetmap.org/user/David%20Larlet/diary/403560) (2024-02-23)
> A [major version](https://pypi.org/project/umap-project/2.0.0/) of uMap has been released last week.
>
> <mark>This release is inauguring a new era in versioning uMap</mark>: in the future, we’ll take care of better documenting breaking changes, so expect more major releases from now on. More details on [how we version](https://docs.umap-project.org/en/master/release/#when-to-make-a-release).
>
> A comprehensive changelog for that version is available in our technical documentation. Most of the changes for a major version are indeed technical, we are taking care of people deploying and maintaining instances with that approach. User-facing features are deployed continuously with our minor versions. We think that scheme is more valuable for the community.
## [Adding collaboration on uMap, third update](https://blog.notmyidea.org/adding-collaboration-on-umap-third-update.html) (2024-02-15)
> I’ve spent the last few weeks working on uMap, still with the goal of bringing real-time collaboration to the maps. I’m not there yet, but <mark>I’ve made some progress that I will relate here</mark>.
## [Adding Real-Time Collaboration to uMap, second week](https://blog.notmyidea.org/adding-real-time-collaboration-to-umap-second-week.html) (2023-11-21)
> I continued working on uMap, an open-source map-making tool to create and share customizable maps, based on Open Street Map data.
>
> <mark>Here is a summary of what I did:</mark>
>
> * I reviewed, rebased and made some minor changes to [a pull request which makes it possible to merge geojson features together](https://github.com/umap-project/umap/pull/772) ;
> * I’ve explored around the idea of using SQLite inside the browser, for two reasons : it could make it possible to use the [Spatialite](https://www.gaia-gis.it/fossil/libspatialite/index) extension, and it might help us to implement a CRDT with [cr-sqlite](https://github.com/vlcn-io/cr-sqlite) ;
> * I learned a lot about the SIG field. This is a wide ecosystem with lots of moving parts, which I understand a bit better now.
## [Adding Real-Time Collaboration to uMap, first week](https://blog.notmyidea.org/adding-real-time-collaboration-to-umap-first-week.html) (2023-11-11)
> Last week, I’ve been lucky to start working on uMap, an open-source map-making tool to create and share customizable maps, based on Open Street Map data.
>
> <mark>My goal is to add real-time collaboration to uMap</mark>, but we first want to be sure to understand the issue correctly. There are multiple ways to solve this, so one part of the journey is to understand the problem properly (then, we’ll be able to chose the right path forward).
## [uMap: fine-grained permissions and more](https://www.openstreetmap.org/user/David%20Larlet/diary/402475) (2023-09-27)
> We finally managed to tackle a very popular feature request: [datalayers’ fine-grained permissions](https://github.com/umap-project/umap/pull/1307) 🎉. This is a huge step forward, <mark>allowing for a given map owner to only open a particular datalayer to edition</mark>. It will help people with contributive maps who need to setup a stable/fixed base layer. It also paved the way for even more control over the objects that are allowed for addition and/or edition. Please share with us your desired workflows.
## [Some news about uMap!](https://www.openstreetmap.org/user/ybon/diary/402248) (2023-08-25)
> Since a few month, <mark>uMap has been integrated in a French state incubator</mark>, so things are moving quite a lot!
>
> uMap is now ten years old, and is deployed on many instances around the world. The one I know well is hosted by OSM France, and is close to reach one million maps created and 100.000 users.
>
> This incubation program is ported by the French [“Accélérateur d’initiatives citoyennes”](https://citoyens.transformation.gouv.fr/), it includes coaches and a small budget for non tech needs (UI/UX…). One goal of this program is to find financial support for uMap development and maintainance. A French administration, the [Agence pour la cohésion des territoires](https://agence-cohesion-territoires.gouv.fr/), is the first uMap financial backer since a few months. This allowed us to put up a small team to work, part time, in uMap […]
## [uMap: A Free, Open-Source Alternative to Google My Maps](https://cartographicperspectives.org/index.php/journal/article/view/1729) (2022-02-08)
> Since their release in 2005, Google Maps-based tools have become the de facto solutions for a variety of online cartographic projects. Their success has been accompanied by a range of critiques denouncing the individualistic market-based logic imposed by these mapping services. Alternative options to this dominant model have been released since then; uMap is one of them. <mark>uMap is a free, open-source online mapping platform that builds on OpenStreetMap to enable anyone to easily publish web maps individually or collaboratively.</mark> In this paper, we reflect on the potential and limits of uMap based on our own experiences of deploying it in six different mapping projects. Through these experiences, uMap appears particularly well-suited for collaborative mapping projects, due to its ease in connecting to remote data and its high level of interoperability with a range of other applications. On the other hand, uMap seems less relevant for crowdmapping projects, due to its lack of built-in options to manage and control public contributions. Finally, the open-source philosophy of uMap, combined with its simplicity of use and its strong collaborative capacity, make it a great option for activist mapping projects as well as for pedagogical purposes to teach a range of topics including online collaborative cartography.
> Le numérique peut-il aider à franchir les murs de l’École? L’École peut-elle aider à s’affranchir des enfermements numériques? Double défi joliment relevé par Hervé Baronnet, professeur des écoles dans l’académie de Bordeaux, membre de la Fabrique des Communs Pédagogiques. <mark>Avec le logiciel libre de cartographie numérique uMap, les élèves sont invités à des «balades pédagogiques»</mark>: à explorer et à s’approprier un territoire en produisant des cartes collaboratives et créatives. Présentée à la Journée Du Libre Educatif le 29 mars 2024 à Créteil, la démarche, inspirante, «enseigne des savoirs de manière interactive, concrète et mémorable. » Elle forge le désir et la capacité d’élargir, de découvrir, de conquérir son espace de vie. «En sortant de l’école / Nous avons rencontré / Un grand chemin de fer / Qui nous a emmenés / Tout autour de la terre / Dans un wagon doré» (Jacques Prévert) ….
## [Créer des cartes interactives personnalisées: uMap ou Leaflet?](https://www.d-booker.fr/content/242-creer-des-cartes-interactives-personnalisees-umap-ou-leaflet) (2025-02-01)
> Dans ce guide, nous comparerons deux solutions libres populaires : uMap, une plateforme en ligne intuitive, et Leaflet, une bibliothèque JavaScript puissante.
[Article complet →](https://www.d-booker.fr/content/242-creer-des-cartes-interactives-personnalisees-umap-ou-leaflet){ .md-button }
> La dernière version 2.4.X ouvre la voie à deux fonctionnalités majeures demandées: la collaboration en temps réel et les assistants d’import de données à distance en un clic.
> En outre, des améliorations mineures et des corrections de bogues ont rendu l’outil plus stable et plus utilisable.
[Article complet →](https://www.openstreetmap.org/user/David%20Larlet/diary/404654#vers-umap-3-){ .md-button }
## [uMap au cœur de la communication des Chambres d’agriculture](https://umap.dev.incubateur.anct.gouv.fr/blog/umap-au-cur-de-la-communication-des-chambres-dagriculture/) (2024-07-10)
> Un témoignage de Frédéric Guimier, Consultant Communication et projets numériques au sein de la Chambre d’agriculture Pays de la Loire.
[Article complet →](https://umap.incubateur.anct.gouv.fr/blog/umap-au-cur-de-la-communication-des-chambres-dagriculture/){ .md-button }
## [Recenser les cabanes en pierres sèches: projet culturel &collaboratif](https://insidemap.eu/recenser-les-cabanes-en-pierres-seches-projet-culturel-collaboratif/) (2024-07-02)
> Une trouvaille impromptue sur uMap, en balayant les cartes qui s’affichent: un carroyage et des dizaines de points, qui au clic affichent des photographies de constructions en pierres sèches. <mark>Il restait à tirer le fil pour comprendre l’ampleur du projet: le recensement des centaines de cabanes</mark>, relayé sur des sites Internet et adossée à une base de données, Wikipedra. Merci à Jean Louis Barthe pour cette très belle découverte et ses explications.
[Article complet →](https://insidemap.eu/recenser-les-cabanes-en-pierres-seches-projet-culturel-collaboratif/){ .md-button }
## [Partager l’information & mieux prévenir le risque inondation avec uMap](https://umap.incubateur.anct.gouv.fr/blog/partager-linformation-mieux-prevenir-le-risque-inondation-avec-umap/) (2024-06-10)
> Dans les montagnes des Hautes-Pyrénées, les gaves connaissent régulièrement des crues torrentielles, avec comme conséquence des risques majeurs dans les vallées. <mark>Voici la présentation d’un projet global qui associe communication et analyse technique sur un outil cartographique basé sur uMap.</mark> Le syndicat mixte du Pays de Lourdes et des Vallées des Gaves propose un portail d’information consacré à la mémoire des inondations pour sensibiliser les maires et la population des Vallées des Gaves. Benoît Thouary, chargé d’études au service prévention des inondations, géographe de formation spécialisé en prévention des risques naturels, présente cette approche très complète, adossée à des archives multimédias et à une base de données.
[Article complet →](https://umap.incubateur.anct.gouv.fr/blog/partager-linformation-mieux-prevenir-le-risque-inondation-avec-umap/){ .md-button }
## [La cartographie numérique pour mieux lire et mieux écrire](https://eduscol.education.fr/4032/la-cartographie-numerique-pour-mieux-lire-et-mieux-ecrire) (2024-06)
> uMap est une plateforme de cartographie libre et gratuite qui fait partie du SILL (Socle Interministériel des Logiciels Libres). Elle propose par défaut uniquement des fonds de cartes récents, accompagnés d’outils de cartographie similaires à ceux d’Édugéo et de Geoportail, avec des fonctionnalités intéressantes de sauvegarde et de partage des cartes. Il est possible d’ajouter des fonds de cartes anciens en suivant la démarche indiquée avec l’exemple de la carte de Metz 1872.
[Article complet →](https://eduscol.education.fr/4032/la-cartographie-numerique-pour-mieux-lire-et-mieux-ecrire){ .md-button }
## [Carte des arbres remarquables, la suite…](https://insidemap.eu/carte-des-arbres-remarquables-la-suite/) (2024-05-25)
> Depuis la première version de la carte en mars 2019, les données ont pu changer et les fonctionnalités d’uMap ont évolué. Voilà l’occasion de refaire la carte et d’explorer d’autres approches. Bien entendu les fonctionnalités de diaporama sont toujours actives sur la carte d’origine.
>
> <mark>Les données sur les arbres remarquables sont à disposition sur le portail gouvernemental data.gouv.fr.</mark> Pour automatiser leur import, il est intéressant de choisir le lien…
[Article complet →](https://insidemap.eu/carte-des-arbres-remarquables-la-suite/){ .md-button }
## [Tutoriel : cartographier votre commune, ses voies et ses adresses, avec uMap](https://adresse.data.gouv.fr/blog/utilisez-umap-pour-visualiser-vos-adresses) (2024-05-13)
> Il peut parfois s’avérer utile, dans le cadre d’un travail préparatoire ou pour une présentation, de créer une carte personnalisée de sa commune. À cet effet, <mark>l’ANCT met à disposition un outil, libre et open-source, à destination des agents publics pour créer des cartes en ligne</mark>, uMap.
>
> Cet outil, par ailleurs accessible sur d’autres instances pour le grand public ([uMap OSMFr](https://umap.openstreetmap.fr/) et [FramaCarte](https://framacarte.org/)), se distingue par sa grande polyvalence et ses fonctionnalités avancées de personnalisation. L’instance [uMap ANCT](https://umap.incubateur.anct.gouv.fr/) vise à mieux intégrer cet outil avec les autres outils des agents, à développer des fonctionnalités spécifiques et des configurations sur mesure, ainsi que faciliter un support dédié.
[Article complet →](https://adresse.data.gouv.fr/blog/utilisez-umap-pour-visualiser-vos-adresses){ .md-button }
> Le numérique peut-il aider à franchir les murs de l’École? L’École peut-elle aider à s’affranchir des enfermements numériques? Double défi joliment relevé par Hervé Baronnet, professeur des écoles dans l’académie de Bordeaux, membre de la Fabrique des Communs Pédagogiques. <mark>Avec le logiciel libre de cartographie numérique uMap, les élèves sont invités à des «balades pédagogiques»</mark>: à explorer et à s’approprier un territoire en produisant des cartes collaboratives et créatives. Présentée à la Journée Du Libre Educatif le 29 mars 2024 à Créteil, la démarche, inspirante, «enseigne des savoirs de manière interactive, concrète et mémorable. » Elle forge le désir et la capacité d’élargir, de découvrir, de conquérir son espace de vie. «En sortant de l’école / Nous avons rencontré / Un grand chemin de fer / Qui nous a emmenés / Tout autour de la terre / Dans un wagon doré» (Jacques Prévert) ….
[Article complet →](https://www.cafepedagogique.net/2024/03/29/herve-baronnet-libres-balades-pedagogiques/){ .md-button }
## [Blogueur Food & Voyage : ajouter des cartes interactives à vos articles](https://blog.jawg.io/ajouter-des-cartes-interactives-a-vos-articles-de-blog/) (2023-03-21)
> Qui a déjà consulté un blog pour des conseils de voyage ou des idées de restaurants à tester? … Everybody? C’est bien ce qui me semblait😁
>
> Et qui parmi vous, a dû <mark>copier-coller le nom de ces lieux suggérés dans un moteur de recherche pour avoir une idée plus précise d’où ils se situaient?</mark> Bon… je me sens moins seule!
>
> Je vous donne un exemple, vous cherchez un café sympa sur Paris et vous tombez sur l’article «Les 10 cafés les plus cosy de Paris. » Super, il n’y a plus qu’à les trouver. Sauf que, vous jetez un coup d’œil à l’adresse… euh le 9e, c’est quels stations de métro ça? 🤔😅
[Article complet →](https://blog.jawg.io/ajouter-des-cartes-interactives-a-vos-articles-de-blog/){ .md-button }
uMap vous offre la possibilité de concevoir rapidement des cartes personnalisées avec des fonds OpenStreetMap (OSM) et de les intégrer facilement à votre site.
- 📺 Regarder les [vidéos](videos.md).
- 📺 Regarder les [vidéos](videos.md) et les [articles](articles.md).
- 🤓 Consulter les tutoriels selon votre niveau.
- 🤔 Explorer les [les questions/réponses de la FAQ](support/faq.md).
- 🤕 Parcourir [la liste des erreurs possibles](support/errors.md).
* `Lien avec texte: [[http://exemple.fr|texte du lien]]` → Lien avec texte: [texte du lien](http://example.com)
* `--- pour un séparateur horizontal` ⤵ <hr>
## Quels sont les raccourcis clavier? {: #keyboard-shortcuts}
Sur macOS, utliser `Cmd` à la place de `Ctrl`.
### Génériques
* `Ctrl+F` → ouvre le panneau de recherche
* `Ctrl+E` → bascule en mode édition
* `Escape` → ferme le panneau ou la fenêtre dialogue ouverte
* `Shift+drag` sur la carte → zoom vers cette zone
* `Shift+click` sur les boutons de zoom → zoom ou dézoom de trois niveaux
### En mode édition
* `Ctrl+E` → retour à l’aperçu
* `Ctrl+S` → sauvegarde la carte
* `Ctrl+Z` → annule tous les changements depuis la dernière sauvegarde
* `Ctrl+M` → ajouter un nouveau marqueur
* `Ctrl+P` → commence un nouveau polygone
* `Ctrl+L` → commence une nouvelle ligne
* `Ctrl+I` → ouvre le panneau d’import de données
* `Ctrl+O` → ouvre le panneau d’import et le navigateur de fichiers
* `Ctrl++` → zoom
* `Ctrl+-` → dézoome
* `Shift+click` sur un élément → ouvre le panneau d’édition de cet élément
* `Ctrl+Shift+click` sur un élément → ouvre le panneau d’édition du calque de cet élément
## Quelle syntaxe est acceptée dans les règles de formattage conditionnel? {: #conditional-rules }
* `macolonne=impair` → cible les éléments dont la colonne `macolonne` vaut `impair`
* `macolonne!=impair` → cible les éléments dont la colonne `macolonne` est absente ou dont la valeur est différente de `impair`
* `macolonne>12` → cible les éléments dont la colonne `macolonne` est supérieur au nombre `12`
* `macolonne<12.34` → cible les éléments dont la colonne `macolonne` est inférieure au nombre `12.34`
* `macolonne=` → cible les éléments dont la colonne `macolonne` est vide
* `macolonne!=` → cible les éléments dont la colonne `macolonne` n'est pas vide
* `macolonne=true/false` → cible les éléments dont la colonne `macolonne` est explicitement `true` (ou `false`)
* `macolonne!=true/false` → cible les éléments dont la colonne `macolonne` est différente de `true` (ou `false`)
Quand la condition est vraie pour un élément donné, le style associé sera appliqué.
## Comment utiliser les variables ? {: #variables}
Utiliser une variable est aussi simple que `{variable}`.
Il est possible de définir une seconde variable de repli, dans le cas où la première ne serait pas définie: `{variable|repli}`
La valeur de repli peut être une chaîne, définie entre guillemets: `{variable|"repli"}`
Il est possible d'enchaîner plusieurs variables: `{variable|autrevariable|"une chaîne"}`
Il est possible d'utiliser une variable à l'intérieur d'une URL: `[[https://domain.org/?locale={locale}|Wikipedia]]`
Ou même comme chemin vers une image: `{{{variable}}}` (noter le triple `{}`).
### Variables disponibles pour les éléments de la carte:
Ces variables peuvent être utilisées dans le champ description d'un élément, ou comme gabarit manuel de popup.
Toute propriété de l'élément sera disponible, ainsi que:
- `{lat}/{lng}` → la position de l'élément (ou le centroïde dans le cas d'une ligne ou d'un polygone)
- `{alt}` → l'altitude (pour les points uniquement), si elle est définie dans les données
- `{locale}` → la langue sous la forme `fr` ou `fr_CA` quand une variante est utilisée
- `{lang}` → la langue sous la forme `fr` ou `fr-ca` quand une variante est utilisée
- `{measure}` → la longueur d'une ligne ou la surface d'un polygone
- `{gain}`/`{loss}` → la dénivelée positive/négative d'une ligne (seulement si elle contient les altitudes)
- `{rank}` → la rang d'un élément dans son calque
- `{layer}` → le nom du calque de l'élément
- `{zoom}` → le zoom actuel de la carte
### Variables disponibles dans les URL de données distantes:
- `{bbox}` → la bbox de la carte sous la forme `sud_ouest_lng,sud_ouest_lat,nord_est_lng,nord_est_lat`
- `{north}/{top}` → la latitude nord de la vue actuelle de la carte
- `{south}/{bottom}` → la latitude sud de la vue actuelle de la carte
- `{east}/{right}` → la longitude est de la vue actuelle de la carte
- `{west}/{left}` → la longitude ouest de la vue actuelle de la carte
- `{zoom}` → le zoom actuel de la carte
- `{lat}` → la latitude du centre actuel de la carte
- `{lng}` → la longitude du centre actuel de la carte
## Quels statuts peut avoir une carte? {: #map-statuses}
### En accès
* **Brouillon (privé)**: Vous seul et votre équipe pouvez accéder à la carte.
* **Tout le monde (public)**: Tout le monde peut accéder à la carte, qui est visible dans la recherche et la page d’accueil. La carte est indexée dans les moteurs de recherche (Google, etc.).
* **Quiconque a le lien**: La carte est visible par toutes les personnes qui en ont le lien. Elle n’est pas indexée dans les moteurs de recherche.
* **Éditeurs et équipe seulement**: Vous seul et votre équipe pouvez accéder à la carte.
Les personnes affichant une carte à laquelle elles n’ont pas accès auront une page d’erreur 403.
### En édition
* **Propriétaire uniquement**: Vous seul pouvez modifier la carte.
* **Éditeurs et équipe seulement**: Vous seul et votre équipe pouvez modifier la carte.
* **Tout le monde**: Tout le monde peut modifier la carte, même les comptes anonymes.
Pour les cartes créées sans compte:
* **Modifiable seulement avec le lien d’édition secret**: Seules les personnes avec un lien d’édition pourront modifier la carte.
Ces réglages sont aussi disponibles pour chaque calque.
Le tableau de bord s’ouvre, il affiche l’ensemble des cartes que
vous créez ainsi que les équipes auxquelles vous participez.
Ce gros marqueur bleu n’est pas très explicite pour figurer un camping.
Remédions à cela. Dans le panneau latéral visible lorsqu’un marqueur est
sélectionné, le menu **Propriétés de la forme** permet de modifier
l’apparence du marqueur :
!!! french-instance "Pour les agents publics"
Associer une carte à une équipe vous permet d’afficher le nom de cette équipe au lieu du vôtre sur une carte (noms de votre commune, de votre service,…). Une équipe peut se composer d’une seule personne.
- **Couleur** : cliquer sur `définir` permet de choisir une couleur.
Notez que vous pouvez définir une couleur par [son nom
CSS](http://www.w3schools.com/cssref/css_colors.asp) ou par son code
héxadécimal, que vous pouvez choisir par exemple avec ce [sélecteur
de couleurs](http://htmlcolorcodes.com/fr/selecteur-de-couleur/).
- **Forme de l’icône** : le choix `Par défaut` correspond au marqueur
actuel, les autres choix sont Cercle, Goutte et Épingle.
- **Image de l’icône** : cliquer sur `définir` pour choisir parmi une
centaine de pictogrammes. Notez que le picto n’est affiché que pour
les formes d’icônes `Par défaut` et `Goutte`.
### 2. Créer une équipe
Voici le marqueur obtenu avec les propriétés ci-contre :
différents éléments de notre carte, nous pouvons leur associer une
étiquette. L’onglet **Options d’interaction** permet de contrôler
l’affichage d’une étiquette associée à chaque élément :
- **Afficher une étiquette** active son affichage, elle est alors
placée automatiquement
- **Direction de l’étiquette** vous permet de fixer la position, à
droite ou à gauche de l’élément, ou encore au-dessus ou en-dessous
- **Afficher seulement au survol** de la souris est une option
intéressante si la carte est dense : afficher toutes les étiquettes
surchagerait la carte
- **Étiquette cliquable** permet d’afficher l’infobulle correspondante
si l’utilisateur clique sur l’étiquette, et non seulement en cas de
clic sur la *géométrie* de l’élément.
## Faisons le point
Notre deuxième carte est déjà plus intéressante que la première, et nous
savons la retrouver facilement. Nous avons vu comment créer, *styliser*
et modifier points et lignes. Nous n’avons pas traité ici des polygones,
qui représentent des surfaces. Certaines fonctionnalités propres aux
polygones méritent d’être détaillées, ce que nous ferons dans le
tutoriel [Le cas des polygones](8-polygons.md).
Pour le moment voyons comment nous pouvons davantage
[personnaliser notre carte](4-customize-map.md).
??? info "Licence"
Travail initié par Antoine Riche sur [Carto’Cité](https://wiki.cartocite.fr/doku.php?id=umap:3_-_j_utilise_un_compte_et_cree_une_belle_carte) sous licence [CC-BY-SA 4](https://creativecommons.org/licenses/by-sa/4.0/deed.fr).
Une fois l’équipe créée, il reste encore à donner les droits de modification
d’une carte à ses membres. Pour ce faire : ouvrez la carte,
puis sur cliquez sur «Editer» et cliquez en haut de page
à droite du titre sur «Visibilité : Définir qui peut voir et modifier la carte».

différents éléments de notre carte, nous pouvons leur associer une
étiquette. L’onglet **Options d’interaction** permet de contrôler
l’affichage d’une étiquette associée à chaque élément :
- **Afficher une étiquette** active son affichage, elle est alors
placée automatiquement
- **Direction de l’étiquette** vous permet de fixer la position, à
droite ou à gauche de l’élément, ou encore au-dessus ou en-dessous
- **Afficher seulement au survol** de la souris est une option
intéressante si la carte est dense : afficher toutes les étiquettes
surchagerait la carte
- **Étiquette cliquable** permet d’afficher l’infobulle correspondante
si l’utilisateur clique sur l’étiquette, et non seulement en cas de
clic sur la *géométrie* de l’élément.
## Faisons le point
Notre deuxième carte est déjà plus intéressante que la première, et nous
savons la retrouver facilement. Nous avons vu comment créer, *styliser*
et modifier points et lignes. Nous n’avons pas traité ici des polygones,
qui représentent des surfaces. Certaines fonctionnalités propres aux
polygones méritent d’être détaillées, ce que nous ferons dans le
tutoriel [Le cas des polygones](8-polygons.md).
Pour le moment voyons comment nous pouvons davantage
[personnaliser notre carte](4-customize-map.md).
??? info "Licence"
Travail initié par Antoine Riche sur [Carto’Cité](https://wiki.cartocite.fr/doku.php?id=umap:3_-_j_utilise_un_compte_et_cree_une_belle_carte) sous licence [CC-BY-SA 4](https://creativecommons.org/licenses/by-sa/4.0/deed.fr).
- cas pratique : utiliser un jeu de données placé sur data.gouv.fr
## L’open data (données ouvertes)
Outre les données produites par ma communauté OpenStreetMap, accessibles sur [GeoDataMine](https://geodatamine.fr/) et dans [l’assistant d’import de données de uMap](6-one-click-data-import.md), les ressources d’open data sont nombreuses et variées. En effet, les collectivités de plus de 3 500 habitants et les services publics doivent placer leurs données en open data conformément à la [Loi pour une République numérique](https://www.vie-publique.fr/eclairage/20301-loi-republique-numerique-7-octobre-2016-loi-lemaire-quels-changements). Le service public de la donnée organise leur publication sur [data.gouv.fr](https://www.data.gouv.fr/fr/) qui est un portail généraliste.
Il existe également des bases plus adaptées à des jeux de données, par exemple les archives, des données géographiques, socio-économiques… Les collectivités mettent parfois aussi directement leurs données à disposition sur leurs portails open data. Des éditeurs de solutions proposent également des bases de données.
## 1. Formats de données utilisés par uMap
### geojson
Ce format est utilisé pour des données de type point, ligne, chaîne de caractères, polygone.
Toutes les propriétés sont importées dans uMap.
❓ Usage très large dans uMap.
### gpx
Ce format ouvert permet l’échange de coordonnées géographiques issues de GPS, points de cheminement (*waypoints*), traces (*tracks*) ou itinéraires (*routes*).
Propriétés importées dans uMap : `name`, `desc`. (format pour des itinéraires)
❓ Les fichiers gpx peuvent provenir d’enregistrements personnels, par exemple de traces recueillies randonnées.
### kml
Format propriétaire qui contient des coordonnées géographiques, balisage, styles pour représenter des points, des lignes et des polygones.
Propriétés importées dans uMap : `name`, `description`.
### csv
C’est un format texte ouvert représentant des données tabulaires sous forme de valeurs séparées par des virgules. Pour utiliser un fichier Excel, il faut d’abord le convertir en `.csv`.
Propriétés importées dans uMap : virgule, tabulation ou point virgule pour séparer des valeurs. La projection SRS WGS84 est implicite. Seuls les points géométriques sont importés. L’importation se référera au titre dans les entêtes de colonnes de `lat` et `lon` au début de l’entête, et est insensible à la casse (peu importe les majuscules ou minuscules). Toutes les autres colonnes sont importées en tant que propriétés.
❓ Usage très large dans uMap, aussi bien pour des données en *open data* que pour ses propres données.
### umap
C’est le format d’enregistrement d’une carte, très utilisé par exemple pour cloner une carte sur l’instance OSM et l’importer sur l’instance uMap pour les agents publics. uMap importe toutes les données de la carte, y compris les calques et les propriétés. Il s’agit d’un bon moyen de sauvegarder sa carte uMap.
❓ Voir plus loin, comment cloner une carte uMap.
Ainsi qu’osm et georss.
## 2. S’orienter sur data.gouv.fr
La plateforme [data.gouv.fr](https://www.data.gouv.fr/fr/) propose des données harmonisées, précise la date de mise à jour et permet de contacter l’administrateur qui a déposé le jeu de données. Il suffit d’utiliser l’outil de recherche pour préciser sa demande puis sélectionner le résultat voulu.
La principale difficulté : savoir quel jeu de données répondrait au besoin. Dans ce cas, il est conseillé de regarder aussi les « thématiques » et les « réutilisations » en bas de page d’accueil.
## 3. Gallica ! les archives de la Bibliothèque Nationale de France
La [base Gallica](https://gallica.bnf.fr/accueil/fr/content/accueil-fr?mode=desktop) est particulièrement utile pour afficher dans uMap des images, des cartes postales, des fonds de cartes anciennes. Il n’est pas obligatoire de télécharger l’illustration, certaines cartes se contentent de placer le lien pour qu’elle s’affiche:
### Vues de villes aux XVIe et XVIIe siècles

[Lien vers la carte en ligne](https://umap.openstreetmap.fr/fr/map/vues-de-villes-aux-xvie-et-xviie-siecles_635544#7/46.241/-1.329){ .md-button }
Deux exemples utilisant un plan ancien comme fond, en plus des images anciennes qui s’affichent en cliquant sur un pointeur :
### Photographies de Marseille 1862 à 1866 par A. Terris

[Lien vers la carte en ligne](https://umap.openstreetmap.fr/nl/map/photographies-de-marseille-1862-a-1866-par-a-terri_277962#14/43.2909/5.3815){ .md-button }
### Metz 1872

[Lien vers la carte en ligne](https://umap.incubateur.anct.gouv.fr/fr/map/metz-1872_50#13/49.1201/6.1419){ .md-button }
Dans ces deux derniers cas, le fond de carte doit être «redressé» avant d’être utilisé dans uMap comme [fond personnalisé](https://forum.openstreetmap.fr/t/integrer-un-fonds-de-carte-personnalise-sur-umap/19606).
## 4. Bases de données statistiques
uMap permet de représenter des données quantitatives par le biais de [cercles proportionnels](8-proportional-circles.md) ou de [cartes choroplèthes](10-embed-remote-data.md#produire-une-carte-de-chaleur-ou-heatmap) c’est à dire des plages de couleurs.
L’[INSEE](https://www.insee.fr/fr/accueil) et [Eurostat](https://ec.europa.eu/eurostat/fr/data/database) permettent de télécharger des fichiers statistiques généralistes.
Une fois un fichier enregistré, il faut vérifier le format des données et le modifier au besoin. Attention par exemple aux cellules fusionnées et aux espaces entre les séries de zéro.
## 5. Cloner une carte uMap
Pour utiliser les données d’une carte sur un autre fond, en faire plusieurs versions, il suffit de cloner la carte.
Exemple de besoin : présenter sur un site Internet la même carte plusieurs fois, en diversifiant le centrage et les fonds de cartes. La même carte initiale fournit plusieurs vues provenant de clones.
!!! french-instance "Pour les agents publics"
Cette fonctionnalité permet également d’importer sur [l’instance uMap agents publics](https://umap.incubateur.anct.gouv.fr/fr/) une carte réalisée sur une autre instance.
Voici les actions :
- sauvegardez la carte que vous souhaitez cloner
- créez une nouvelle carte - pour cloner la carte sur une nouvelle instance : connectez-vous à la nouvelle instance puis créez cette nouvelle carte et
- importez la carte.
Les deux cartes co-existent, une modification sur une carte n’impacte pas l’autre carte. Si la carte est partagée sur un site Internet, il faut veiller à **mettre à jour le lien** en cas de changement d’instance.
>Permet de partager la carte ou d’en exporter les données.</shot-scraper>
puis une fois l’écran latéral affiché :

Cliquez sur « Sauvegarde complète » en bas.
### 2. Créer une carte et importer le fichier
Quitter cet écran, créer une nouvelle carte puis cliquer à droite sur « Importer des données » puis une fois l’écran latéral affiché :

Le format de l’import reconnaît uMap et le précise.
Cliquez sur « Importer », puis enregistrez.
## 6. Cas pratique : utiliser un jeu de données placé sur data.gouv.fr
Pour un usage dans uMap, les fichiers doivent contenir les coordonnées géographiques des objets. Si le fichier choisi n’en contient pas, voir [ici](12-display-grist-data.md#2-geocoder-des-adresses-pour-les-agents-publics-seulement) comment les ajouter (géocodage).
Voici les actions pour dresser la carte des arbres remarquables à Metz : rechercher les données, les importer dans uMap et les retravailler pour améliorer le placement des étiquettes.
### Rechercher les données
La plateforme ouverte des données publiques françaises recense des milliers de jeux de données. Rechercher « Arbres Metz » dans l’outil de recherche.
Deux solutions pour utiliser ces données :
* récupérer le fichier au format json : il faudra mettre à jour la carte de temps en temps lorsque les données sources sont mises à jour. Bénéfice : une carte à jour à une date précise.
ou
* utiliser le lien vers les données : dans ce cas, la carte se mettra automatiquement à jour (suppression d’arbres coupés par exemple, ajout de nouveaux). Inconvénient : la carte est une carte au temps T, on ne conserve pas l’historique dans ce cas.

Vous avez le choix. Une fois le fichier téléchargé ou le lien copié, cliquer dans la carte sur uMap le bouton "Importer des données" dans la barre de droite puis dans le cadre au choix:
* Parcourir les fichiers téléchargés et choisir le fichier des arbres remarquables au format Geojson
ou
* Coller l’URL stable dansla ligne prévue


Dans « Choisir le format des données » : sélectionner `Geojson`. Dans le cas où vous choisissez l’URL stable, vous pouvez choisir `Associer au calque comme données distantes` et dans ce cas la carte se met automatiquement à jour si le fichier est modifié.
Choisir `Copier dans le calque` pour que la carte reste telle quelle à une date T.
La carte se centre automatiquement sur Metz et tous les arbres remarquables sont placés:

Les informations présentes dans le fichier sont répercutées et accessibles dans un tableau ou en cliquant sur chaque arbre.
### Modifier l’apparence des pointeurs pour adapter à la charte d’un site
Sélectionner le calque dans la barre de droite et modifier ses réglages en cliquant sur le petit stylo:

Nom : Arbres remarquables (ou par exemple Feuillus ou Arbres de plus de 50 ans…), autant de possibilités que de calques et de couleurs. Puis cliquer sur les propriétés de la forme pour choisir la couleur et la forme du pointeur, mais aussi les options d’interaction: afficher une étiquette au survol par exemple.

### Afficher les noms des arbres au survol
Toutes les données affichables dans l’étiquette sont présentées dans les colonnes du tableau associé au calque. Cliquez sur l’explorateur de données à gauche puis sur le visuel "Éditer dans un tableau" (juste à gauche de la corbeille):
Dans le cas du fichier des arbres remarquables de Metz, le nom des arbres est renseigné comme `nom_commun` et `nom_latin`. Or dans uMap, par défaut, les étiquettes qui s’affichent utilisent `name`. Pour que le nom commun s’affiche, il faut remplacer `name` par `nom_commun` à droite dans les «Propriétés avancées» (Panneau d’information de ce calque):

Pour que l’étiquette s’affiche seulement au survol, choisir `Caché` un peu plus bas dans «Afficher une étiquette».
!!! note
- Pour s’entraîner, ouvrir les réglages, la carte peut être clonée ici :
- Importer les contours des départements ou des régions
- Importer un point d’intérêt (bibliothèques, parkings, …) qui est enregistré sur OpenStreetMap
## Procédons par étapes
Il est conseillé de vérifier si les données n’existent pas avant de se lancer dans leur dessin. On peut gagner un temps précieux avec l’assistant d’importation intégré dans uMap et conserver une carte qui n’est pas trop lourde au chargement.
Voilà les deux actions à effectuer une fois une carte préexistante, ou une nouvelle carte vierge ouverte:
- Cliquez sur l’outil d’import de données dans la barre de droite puis sélectionnez les données déjà prêtes à l’emploi
- Cliquez sur «Importer» et le cas échéant enjolivez la carte, car des figurés par défaut sont utilisés
uMap permet d’utiliser des données produites par de nombreux services et placées en open data sous différents formats. Nous verrons ultérieurement (niveau intermédiaire) où rechercher ces sources. D’ores et déjà, vous pouvez utiliser l’assistant d’importation pour récupérer en un clic des contours administratifs et des points d’intérêt.
### Ressources disponibles (20/09/2024)
Au 20 septembre 2024, les imports suivants sont disponibles:
- contour d’une commune
- contours des départements et des régions
- données issues d’OpenStreetMap placées dans [GeoDataMine](https://geodatamine.fr/). Comme son nom l’indique, GeoDataMine est une véritable mine de données très utiles pour les services publics:
- Aire de jeux
- Aménagements cyclables
- Banques et DAB
- Base Adresse
- Bibliothèques
- Cimetière
- Cinémas
- Commerces
- Covoiturage
- Déchets et recyclage… jusqu’à Toilettes
- overpass : pour se familiariser avec les types de requêtes à renseigner dans l’assistant, consulter les tutos plus avancés et la [page wiki](https://wiki.openstreetmap.org/wiki/Overpass_turbo/Wizard)
!!! note
Il manque des données? N’hésitez pas à contribuer pour les ajouter et vous en serez les premiers bénéficiaires!
### Cliquez sur l’outil d’import des données
Voici un bref passage en revu des différents imports proposés et pour finir l’import de la localisation des bibliothèques de Clermont- Ferrand:

## 1. Importer le contour d’une commune
Cliquez sur l’outil d’importation en bas de la barre de droite, puis cliquez sur le lien «Assistants d’import».
Cliquez sur «Communes France» et sélectionnez la commune souhaitée dans une liste déroulante. Une fois la commune sélectionnée, le format est reconnu automatiquement (geojson) puis le type de calque (cliquer sur « ? » pour savoir quel choix opérer)
1. Pour que les données soient simplement copiées, choisir «Copier dans le calque».
2. Pour que la carte évolue si le contour change, choisir «Associer au calque comme donnée distante».
!!! note
Le code affiché n’est pas le code postal mais le code INSEE de la commune.
Voici le résultat avec la commune d’Arles (la plus vaste de France métropolitaine, un gain certain si on fait l’économie de dessiner son contour !)

Une fois cet import réalisé, tout est réglable : couleur de contour, de fond, affichage oui non d’une étiquette.
## 2. Importer les contours des départements ou des régions
Cliquez sur l’outil d’importation en bas de la barre de droite, puis cliquez sur le lien «Assistants d’import».
Cliquez sur «Contours nationaux» puis soit départements, soit régions et enfin le type de calque (voir supra l’explication). Tous les départements sont importés :

## 3. Importer un point d’intérêt issu de GeoDataMine
Cliquez sur l’outil d’importation en bas de la barre de droite, puis cliquez sur le lien «Assistants d’import».
Cliquez sur «GeoDataMine (thèmes OSM) » et sélectionnez les informations souhaitées, routes, bâtiments, commerces, services publics, …
Par exemple, en sélectionnant les points d’eau potable de la CA du Grand Avignon, puis «Copier dans un calque»

Voici une réelle économie de temps plutôt que de placer pointeur après pointeur tous les points d’eau.
## 4. La carte combinée
Bien entendu, on peut tout à fait combiner les différentes couches d’information et présenter par exemple la carte des Points d’eau potable dans la CA du Grand Avignon, avec les contours des communes qui composent l’EPCI, du département et de la région:
### Points d’eau potable du Grand Avignon

[Voir la carte en plein écran](https://umap.openstreetmap.fr/fr/map/points-deau-potable-grand-avignon_1116739?scaleControl=false&miniMap=false&scrollWheelZoom=true&zoomControl=true&editMode=disabled&moreControl=true&searchControl=null&tilelayersControl=null&embedControl=null&datalayersControl=true&onLoadPanel=none&captionBar=false&captionMenus=true#11/43.9889/4.7962){ .md-button }
Il faudra dans ce cas supprimer toutes les informations inutiles dans le tableau de données qui est accessible dans la barre de gauche pour chaque calque.
Pour gagner du temps: sélectionner tous les départements et désélectionner seulement le Vaucluse, puis cliquer sur «Supprimer les lignes sélectionnées».
Nous allons importer des données quantitatives et les représenter sous forme de cercles proportionnels. On peut aussi représenter des données distantes par cercles proportionnels (voir les tutoriels plus avancés).
### 1. Vérifier le format du fichier
Pour être utilisable dans uMap, le fichier doit être enregistré au format `.csv`, il doit intégrer les cordonnées géographiques. Sans ces deux conditions, le fichier de données n’est pas traité.
Il faut également éviter les mises en forme du type espace entre des blocs de trois zéros, sans quoi les cercles ne seront pas proportionnels, mais tous de même taille.
Si la latitude et la longitude ne sont pas présentes, le fichier doit être géocodé.
Le site de la Base Adresse Nationale propose un outil très pratique: <https://adresse.data.gouv.fr/csv>
Il suffit de placer un fichier au format `.csv` contenant des adresses et de cliquer sur «géocodage». L’outil en ligne ajoute les coordonnées géographiques des adresses.
### 2. Importer le fichier dans uMap
Cliquer sur l’outil d’importation en barre de droite:
Puis choisir le fichier, par exemple ici la population municipale du Cher, le format est `.csv` et cliquer sur «importer»:

Toutes les communes sont représentées par un pointeur. Il reste juste à préciser que les données de ce calque doivent être affichées par cercles proportionnels. Pour ce faire, cliquer sur l’outil «Gérer les calques» en barre de droite:
Puis dans le menu déroulant, sélectionner «Cercles proportionnels» et la donnée de votre tableau que vous voulez représenter en cercles proportionnels:
Il est tout à fait possible de régler la proportionnalité sur les barres de rayon minimum et maximum pour modifier le rendu: l’écart est alors amplifié ou plutôt écrasé.
!!! notes
Pour modifier les couleurs des cercles, voir le tutoriel
[Dessiner sur sa carte](/fr/tutorials/4-draw-items/).
<iframetitle="Faire la carte de son marché de Noël"width="560"height="315"src="https://tube.numerique.gouv.fr/videos/embed/7d3a95ad-37dc-4af1-ac15-17992cb95869"frameborder="0"allowfullscreen=""sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>
## Atelier «Afficher des donnees Grist dans uMap»
<iframetitle="Atelier Afficher des donnees Grist dans uMap"width="560"height="315"src="https://tube.numerique.gouv.fr/videos/embed/517beed6-ed57-430d-ad76-61e0c4784338"frameborder="0"allowfullscreen=""sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>
## Transformer un tableau Grist en carte avec uMap
<iframetitle="Transformer une table Grist en carte avec uMap"width="560"height="315"src="https://tube.numerique.gouv.fr/videos/embed/9e5b09d5-c660-41a0-8591-cae347c88e65"frameborder="0"allowfullscreen=""sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>
## uMap incubé par l’État, ça donne quoi?
<iframetitle="uMap incubé par l’État, ça donne quoi ?"width="560"height="315"src="https://peertube.openstreetmap.fr/videos/embed/c564dcfd-4b0b-4796-86ac-ca8624226cd3"frameborder="0"allowfullscreen=""sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>
## uMap a 10 ans, bilan et perspectives
<iframetitle="uMap a 10 ans, bilan et perspectives"width="560"height="315"src="https://peertube.openstreetmap.fr/videos/embed/f4f122d4-0ff5-4015-bd64-ea507ad5f5b5"frameborder="0"allowfullscreen=""sandbox="allow-same-origin allow-scripts allow-popups"></iframe>
* `Link with text: [[http://example.com|text of the link]]` → Link with text: [text of the link](http://example.com)
* `--- for a horizontal rule` ⤵ <hr>
## What are the available keyboard shortcuts? {: #keyboard-shortcuts}
With macOS, replace `Ctrl` by `Cmd`.
### Globals
* `Ctrl+F` → open search panel
* `Ctrl+E` → switch to edit mode
* `Escape` → close open panel or dialog
* `Shift+drag` on the map → zoom to this map extent
* `Shift+click` on the zoom buttons → zoom in/out by 3 levels
### In edit mode
* `Ctrl+E` → back to preview mode
* `Ctrl+S` → save map
* `Ctrl+Z` → undo all changes until last save
* `Ctrl+M` → add a new marker
* `Ctrl+P` → start a new polygon
* `Ctrl+L` → start a new line
* `Ctrl+I` → open importer panel
* `Ctrl+O` → open importer panel and file browser
* `Ctrl++` → zoom in
* `Ctrl+-` → zoom out
* `Shift+click` on a feature → edit this feature
* `Ctrl+Shift+click` on a feature → edit this feature layer
## Which syntax is allowed in conditional rules? {: #conditional-rules }
* `mycolumn=odd` → will match features whose column `mycolumn` equal `odd`
* `mycolumn!=odd` → will match features whose column `mycolumn` is missing or different from `odd`
* `mycolumn>12` → will match features whose column `mycolumn` is greater than `12` (as number)
* `mycolumn<12.34` → will match features whose column `mycolumn` is lower than `12.34` (as number)
* `mycolumn=` → will match features whose column `mycolumn` has no or null value
* `mycolumn!=` → will match features whose column `mycolumn` has any defined
* `mycolumn=true/false` → will match features whose column `mycolumn` is explicitely `true` (or `false`)
* `mycolumn!=true/false` → will match features whose column `mycolumn` is different from `true` (or `false`)
When the condition match, the associated style will be applied to the corresponding feature.
## How to use variables? {: #variables}
In general, using a variable is as simple as `{myvar}`.
It's possible to define another variable as fallback of the first one like this: `{myvar|fallbackvar}`.
To fallback to a string, add it between double quotes: `{myvar|"fallback"}`.
It's possible to combine more variables: `{myvar|othervar|"some string"}`.
It's possible to use a variable inside an URL, for example: `[[https://domain.org/?locale={locale}|Wikipedia]]`.
Or even as source for an image: `{{{myvar}}}` (note the triple `{}`).
### Available variables for features:
Those variables can be used in a feature description, or in popup content templates.
Any property of the feature will be available, plus:
- `{lat}/{lng}` → the feature position (or centroid in case of line or polygon)
- `{alt}` → the altitude of a marker, if defined in the data
- `{locale}` → the locale in the form `en` or `en_US` when a variant is used
- `{lang}` → the lang in the form `en` or `en-us` when a variant is used
- `{measure}` → the length of a line or the area of a polygon
- `{gain}`/`{loss}` → the elevation gain/loss of a line (only if it contains the altitude information)
- `{rank}` → the rank of the feature in the layer
- `{layer}` → the name of the feature's layer
- `{zoom}` → the current map zoom
### Available variables in URL for remote data:
- `{bbox}` → the current bbox of the map in the form `southwest_lng,southwest_lat,northeast_lng,northeast_lat`
- `{north}/{top}` → the North latitude of the current map view
- `{south}/{bottom}` → the South latitude of the current map view
- `{east}/{right}` → the East longitude of the current map view
- `{west}/{left}` → the West longitude of the current map view
- `{zoom}` → the current map zoom
- `{lat}` → the latitude of the current map center
- `{lng}` → the longitude of the current map center
## Which statuses can have a map? {: #map-statuses}
### Access statuses
* **Draft (private)**: Only you and your collaborators are able to see the map.
* **Everybody (public)**: Everybody can see your map, it is listed on search results and potentially the homepage. It is indexed by search engines like Google.
* **Anyone with link**: The map will be accessible only to people knowing the link. The map is not indexed by search engines.
* **Editors and team only**: Only you and your collaborators will be able to see the map.
Providing a link of a map to unallowed people will display a `403 Forbidden` error.
### Edit statuses
* **Owner only**: only the owner of the map can edit it.
* **Editors and team only**: the owner, editors and members of the linked team will be able to edit the map.
* **Everyone**: Everybody can edit the map without even being logged in.
Only for maps created without an account:
* **Only editable with secret edit link**: Only people with a secret link will be able to edit the map.
An official uMap docker image is [available on the docker hub](https://hub.docker.com/r/umap/umap). But, if you prefer to run it with docker compose, here is the configuration file:
```yaml title="docker-compose.yml"
version: '3'
services:
db:
# check https://hub.docker.com/r/postgis/postgis to see available versions
@ -15,7 +14,7 @@ services:
app:
# Check https://hub.docker.com/r/umap/umap/tags to find the latest version
image: umap/umap:2.0.2
image: umap/umap:2.9.3
ports:
# modify the external port (8001, on the left) if desired, but make sure it matches SITE_URL, below
- "8001:8000"
@ -49,3 +48,45 @@ User accounts can be managed via the Django admin page ({SITE_URL}/admin). The r
```bash
umap createsuperuser
```
##Developping with Docker
If you want to develop with podman or docker, here are commands that might be useful, given that you have a postgreSQL server running locally and that your settings are located at `umap.conf`:
You can build the docker image with:
```bash
podman build -t umap .
```
And run it with:
```bash
podman run -v ./umap.conf:/tmp/umap.conf -e UMAP_SETTINGS=/tmp/umap.conf -it --network host umap
```
## Real time collaboration
To enable real time collaboration when using Docker, a Redis service must be added. Something like this in `docker-compose.py` world:
Here are some configuration files to use umap with nginx and [uWSGI](https://uwsgi-docs.readthedocs.io/en/latest/), a server for python, which will handle your processes for you.
See [WSGI](wsgi.md) or [ASGI](asgi.md) for a basic setup.
```nginx title="nginx.conf"
upstream umap {
server unix:///srv/umap/uwsgi.sock;
}
Then consider adding this configuration
server {
# the port your site will be served on
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
# the domain name it will serve for
server_name your-domain.org;
charset utf-8;
# max upload size
client_max_body_size 5M; # adjust to taste
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass umap;
include /srv/umap/uwsgi_params;
}
}
```
## uWSGI
```nginx title="uwsgi_params"
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
```
```ini title="uwsgi.ini"
[uwsgi]
uid = umap
gid = users
# Python related settings
# the base directory (full path)
chdir = /srv/umap/
# umap's wsgi module
module = umap.wsgi
# the virtualenv (full path)
home = /srv/umap/venv
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# the socket (use the full path to be safe)
socket = /srv/umap/uwsgi.sock
# ... with appropriate permissions - may be needed