Commit Graph
665 Commits
Author SHA1 Message Date
Manuel RaynaudandGitHub 593c98c7d1 🔧(backend) delete object created in object storage during tests
The tests are using the local object storage configured in the docker
compose stack. Every time a test using the DocumentFactory is executed,
an object is created in the object storage and will stay here but never
used. The data/media directory is growing and time to time we have to
delete it in order to free some gigabytes. In this commit we add a
global conftest responsible to delete the object created during the test
execution. The space will be really free when the object storage
container will be shutdown.
2026-06-09 13:14:58 +00:00
Anthony LC a43883caf0 🔖(patch) release 5.2.1
Changed:
- 💄(frontend) display emoji button on hover

Fixed:
- 🐛(backend) close thread DB connections to fix test teardown
  OperationalError
- 🐛(frontend) fix crash when orphaned threads
- 🐛(backend) order trashbin response by most recently deleted
- 🐛(backend) stream document content with an async
  iterator under ASGI
- 🐛(frontend) fix long titles in table of content
2026-06-05 13:44:21 +02:00
AntoLCandAnthony LC c9829576a5 🌐(i18n) update translated strings
Update translated files with new translations
2026-06-05 13:44:21 +02:00
Manuel RaynaudandGitHub 26670eb588 🐛(backend) stream document content with an async iterator under ASGI
When docs is ran using an ASGI server, the django StreamingHttpResponse
expect to consume an async generator. If a sync generator is used, it
fully consumes it and then return all the content and we loose the
benefits of using a StreamingHttpResponse.
2026-06-04 15:43:41 +00:00
Manuel RaynaudandGitHub 3b9a0f0f2d 🐛(backend) order trashbin reponse by most recently deleted
The trashbin response wasn't ordered at all. We want to order by default
by -deleted_at.
2026-06-04 12:29:52 +00:00
Manuel RaynaudandGitHub ccb44aec6c 🐛(backend) close thread DB connections to fix test teardown OperationalError
When all the tests are ran, there is a PytestWarning log present to warn
us that there is remaining database connection open and can not be
closed. It appears that the tests about concurrence are responsible of
leaving connection open. We need to manually close them in these tests.
2026-06-03 14:43:46 +00:00
Anthony LC 9633f5f7a0 🔖(patch) release 5.2.0
Added:
- (backend) support creating subdoc from file
- (frontend) comment side panel
- (buildpack) add PaaS deployment support, tested with Scalingo
- 🔧(backend) allow configuring settings
  OIDC_OP_USER_ENDPOINT_FORMAT
- ️(helm) create a dedicated svc and deployment for
  yprovider converter
- (backend) allow to leave a document
- (frontend) add the presenter mode
- 📈(backend) create a utils to capture event with posthog
- 🔧(backend) new setting DOCUMENT_ALL_ENDPOINT_ENABLED

Changed:
- ♻️(backend) allow global search in sub documents
- (backend) add a breadcrumb in the search response
- ♻️(frontend) move doc action buttons to fix toolbar
- ️(frontend) add aria-hidden to decorative avatar SVGs
  in share modal
- 🏗️(frontend) move comments to its own folder feature

Fixed:
- 🐛(docs) run migration 0027 without superuser role
- 🐛(backend) prevent admins/owners from overwriting other
  users comments
- 🐛(y-provider) return empty output when converting empty
  Yjs document
- 🐛(backend) use computed_link_reach in
  handle_onboarding_document
- 🐛(frontend) fix toolbar blocknote hidden
- 🐛(frontend) fix application crashes when using
  GTranslate and zoom
- 🐛(frontend) fix emoji pdf not matching
- 🐛(backend) fix UnorderedObjectListWarning for
  DocumentAskForAccess viewset
2026-06-03 12:09:39 +02:00
AntoLCandAnthony LC 0ed6167b56 🌐(i18n) update translated strings
Update translated files with new translations
2026-06-03 12:06:56 +02:00
Manuel Raynaud dc692a1594 🔥(backend) remove unused order parameter in Paginator class
In the custom Paginator present in the viewset, an ordering parameter
was set. This parameter is never used by the DRF paginator and can be
removed.
2026-06-02 19:47:38 +02:00
Manuel Raynaud 9bdf36a323 🐛(backend) fix UnorderedObjectListWarning for DocumentAskForAccess
In the tests there is a UnorderedObjectListWarning, we also find this same
warning in the logs in production. This warning appears because the
queryset used by the DocumentAskForAccess paginator is not ordered and
can lead to inconsistent result. Ordering the queryset fix this warning.
2026-06-02 19:47:31 +02:00
Manuel Raynaud 5b70c5aecb 🔧(backend) new setting DOCUMENT_ALL_ENDPOINT_ENABLED
We want to allow or not the usage of the /documents/all/ endpoint. It has
been created to be used for an other purpose than the js client. For
those who don't use it this new settings allow to disable it. By default
it is set to True to keep the same behavior.
2026-06-02 17:28:04 +02:00
Manuel Raynaud 1ebc8d52a0 📈(backend) capture an event when a document is left
When a user leave a document, we want to capture an event.
2026-06-01 17:47:28 +02:00
Manuel Raynaud c91c443b08 📈(backend) capture an event when a document is moved
When a document is moved we want to capture an event. The position and
target_document_id is added to the sent properties.
2026-06-01 17:47:28 +02:00
Manuel Raynaud 0df2d753c4 📈(backend) capture an event when a comment is created
When a new comment is created, we capture an event related to this comment
creation.
2026-06-01 17:47:28 +02:00
Manuel Raynaud ba1a1d469e 📈(backend) capture an event when a thread is created
When a new thread is created, we capture an event related to this thread
creation.
2026-06-01 17:47:27 +02:00
Manuel Raynaud ab1708f6df 📈(backend) capture an event when an access document is deleted
When an access is deleted we want to capture an event.
2026-06-01 17:43:56 +02:00
Manuel Raynaud 0aac4b662b 📈(backend) capture an event when an access document is created
When an access is created we want to capture an event.
2026-06-01 17:41:57 +02:00
Manuel Raynaud 7f4226452f 📈(backend) capture an event when an AI action is used
When an AI action is called from ai_translate, ai_transform and
ai_proxy, an event doc_ai_action is captured with a method property
giving the information from where it is called.
2026-06-01 17:41:57 +02:00
Manuel Raynaud a55b1c61eb 📈(backend) capture an event when a document is mark as a favorite
We want to capture an event when a user flag a document as a favorite.
2026-06-01 17:41:57 +02:00
Manuel Raynaud a05de21d14 📈(backend) capture an event when a document is imported
We want to capture an event when a file is imported. We add in the
properties the type of file imported and if it is in the
create-for-owner api call.
2026-06-01 17:41:56 +02:00
Manuel Raynaud d1476024a7 📈(backend) capture an event when a document is duplicated
We want to capture an event when a document is duplicated. The document
from where come from the duplication is added in the properties.
2026-06-01 17:41:56 +02:00
Manuel Raynaud f4139e3ab0 📈(backend) capture an event when a user logs in
We want to capture an event every time a user logs in.
2026-06-01 17:41:55 +02:00
Manuel Raynaud d495b158c1 📈(backend) capture an event when a document is created and deleted
When a document is created and deleted, we capture an event and we send
it to posthog.
2026-06-01 17:41:55 +02:00
Manuel Raynaud 5eb9c4edd6 📈(backend) create a utils to capture event with posthog
We want to capture event with posthog. We created a utils for this
reposible to send the event or not if posthog is configured.
2026-06-01 17:41:55 +02:00
Manuel Raynaud 76544ab64a ♻️(backend) split posthog configuration
The posthog information were only available using the POSTHOG_KEY
settings. We split it in POSTHOG_KEY and POSTHOG_HOST to use them with
the pyhton posthog sdk
2026-06-01 17:02:43 +02:00
Manuel Raynaud 9f98af1387 (backend) allow to leave a document
We want to allow users to leave a document where they have an access or
they have visited creating a link_trace. All subdocuments should also be
leaved at the same time.
To know if the user can leave a doc we have to check when computing the
abilities if a record is existing in the LinkTrace table. This is a N+1
query situation. To avoid it, we added an annotation in the
DocumentQueryset like we already do to annotate the user role.
There is one edge case where the annotation is made to soon, it is when the
user is visiting a document for the first time, the `get_object` add the
annotation and in the permission, we compute the abilities. The `leave`
property is False because the entry in the LinkTrace table is not made,
when the serializer ask for the abilities again, it is still False. So
in the `retrieve` method in the viewset we force the
`user_has_link_trace` to the correct value.
2026-06-01 16:25:50 +02:00
Manuel Raynaud 7773a5b9bf 🔥(backend) remove masking document code
The mask feature has never been implemented by the frontend application
and it is not what we want to do. We want to implement a feature to
leave a document.
2026-06-01 16:25:50 +02:00
Manuel RaynaudandGitHub a20ba1a78e 🐛(backend) use computed_link_reach in handle_onboarding_document
In the model method User::_handle_onboarding_documents_access we do not
allow using documents with restricted link_reach to be added as
onboarding documents. To check the real link_reach of the document, we
must use instead the computed_link_reach to be sure that a sub document
can also be used and compute its correct link_reach.
2026-05-28 06:50:40 +00:00
Manuel Raynaud fdc99adc78 (backend) add a breadcrumb in the search response
In the search response, we want to display a breadcrumb for every
document returned. For this we added a "parents" property containing a list
documents, all are the parents of the current document (ordered by their
depth). With this we can easily create a breadcrumb.
2026-05-27 17:41:39 +02:00
Manuel Raynaud 31b088c307 ♻️(backend) rename SearchDocumentSerializer in SearchQueryParam
The SearchDocumentSerializer name will be used for a dedicated
serializer for the search endpoint.
2026-05-27 17:41:39 +02:00
Manuel Raynaud d00b3222cf ♻️(backend) allow global search in sub documents
The global search endpoint filtering by title in the database was not
searching for accessible sub documents. We change the how global search
is made: it is now returning accessible sub documents matching the
title query.
2026-05-27 17:41:38 +02:00
Manuel Raynaud b77f7ab6f4 ♻️(backend) rename DocumentViewset::_title_search in _search_title
We rename the private method _title_search in _search_title in the
DocumentViewset for having the search methods prefixed with _search
2026-05-27 17:41:38 +02:00
Anthony LCandManuel Raynaud 7ad9550f54 (backend) add unresolve action to ThreadViewSet
We have now the possibility to unresolve a thread
from the frontend.
We need to add the unresolve action to the
ThreadViewSet.
2026-05-26 12:21:47 +02:00
Anthony LCandManuel Raynaud 7956540b73 👔(backend) add resolved thread to queryset
We need to include resolved threads in the queryset
of the ThreadViewSet, otherwise they won't be
included in the list of threads and we will not be
able to list resolved threads in the side panel.
2026-05-26 10:28:09 +02:00
Amine BOUKERFAandGitHub 3264e29941 🔒(backend) prevent admins from rewriting other users comments
Admins/owners could overwrite another user's comment text and silently
take ownership of it.
Split write permissions: destroy stays broad (author + admin/owner) for
moderation.
    
Signed-off-by: Mohamed El Amine BOUKERFA <boukerfa.ma@gmail.com>
2026-05-26 10:26:31 +02:00
Amine BOUKERFAandGitHub 8d42f814b7 (backend) validate user-provided document id is a valid UUID
Reject client-supplied IDs that are not valid UUIDs
when creating a document

Signed-off-by: Mohamed El Amine BOUKERFA <boukerfa.ma@gmail.com>
2026-05-26 07:57:36 +00:00
Manuel RaynaudandGitHub 24d58a1aa5 🔧(backend) allow configuring settings OIDC_OP_USER_ENDPOINT_FORMAT
The djang-lasuite package manages the settings
OIDC_OP_USER_ENDPOINT_FORMAT allowing to enforce the format use by the
user endpoint. By default it is set to `AUTO`.
2026-05-21 14:24:31 +00:00
c9cf3b6550 (buildpack) add PaaS deployment support, tested with Scalingo
Replaces #1020

- fixes
https://github.com/suitenumerique/docs/pull/1020#discussion_r2314089799
by creating a `deploy/` directory, making room for a deploy/docker
directory later
- fixes
https://github.com/suitenumerique/docs/pull/1020#issuecomment-3886237213
by adding documentation in docs/installation
- in general, follow the same changes as we did in
https://github.com/suitenumerique/meet/pull/957

Tested successfuly on Scalingo

Co-authored-by: Sylvain Zimmer <sylvain@sylvainzimmer.com>
2026-05-19 10:08:20 +00:00
Maximilian BoschandGitHub 0f14981d5b 🐛(backend) fix inclusion of modules with uv_build
Same fix as https://github.com/suitenumerique/meet/pull/1199 for meet.

Signed-off-by: Maximilian Bosch <maximilian@mbosch.me>
2026-05-18 07:56:58 +00:00
Manuel Raynaud abd03d1ac0 🐛(docs) run migration 0027 without superuser role
The migration 00227 must be run with a postgres superuser, most af
managed postgresql database can not be run using this kind of user.
Ti fix this, we use postgresql unnacent function instead of accessing C
function.
2026-05-13 08:18:01 +02:00
Mohamed El Amine BOUKERFAandManuel Raynaud 562ed0da3e (backend) delete accesses and invitations on move when scope changes
When a document is moved outside its current permission scope (root
document, cross-tree move, or promotion to root), its direct accesses
and pending invitations are now deleted server-side within the same
atomic transaction as the move itself. This ensures consistency: if
the move fails, deletions are rolled back.

Signed-off-by: Mohamed El Amine BOUKERFA <boukerfa.ma@gmail.com>
2026-05-12 15:56:59 +02:00
Gustavo TrottandGitHub cd75a17f45 🐛(backend) support creating subdoc from file
The children/ endpoint was missing file upload support that the root
documents endpoint already had. Added file-to-YJS conversion handling to
subdocument creation.
2026-05-11 18:02:03 +02:00
Manuel Raynaud db467407cf 🔖(minor) release 5.1.0
Added

- ️(frontend) add skeleton on content loading #2254
- ️(frontend) close websocket connection when user change tab #2264

Changed

- 🏗️(core) migrate from pip to uv

Fixed

- 🩺(project) reload app if front and back unsync #2276
- 🐛(frontend) fix patch and comments #2273
- 🐛(frontend) interlinking are exported correctly in print mode #2269
- 💬(frontend) add missing link in onboarding description #2233
- 🐛(frontend) sanitize pasted and dropped content in document title #2210
- 🐛(frontend) Emoji menu doesn't display above comment box #2229
- 🐛(frontend) Block menu doesn't stay open on 1st line #2229
- 🐛(frontend) The "+" on the first line of a new doc doesn't work #2229
- 🐛(backend) manage race condition between GET and PATCH content #2271
- 🐛(backend) replace document creation table locks with retry strategy #2274

Security

- 🔒️(frontend) sanitize color during collaboration #2270
2026-05-11 15:57:02 +02:00
github-actions[bot]andManuel Raynaud 4d68f39623 🌐(i18n) update translated strings
update translated strings
2026-05-07 16:56:19 +02:00
Anthony LC 67773ef2d9 🩺(project) reload app if front and back unsync
We observe some cases where the frontend and
backend versions can get out of sync, which can
cause issues.
To mitigate this, we want to implement a mechanism
that detects when the frontend and backend
versions are mismatched and triggers a
reload of the application to ensure they are in sync.
2026-05-07 14:20:05 +02:00
Manuel Raynaud 8fc13d75dc ♻️(backend) migrate from setuptool to uv_build as build backend
We already migrate from pip to uv to manage our dependencies. We can also
migrate the build backend from setuptool to uv_build.
In the pyproject file, the readme property has been removed, because
uv_build try to read it, but the readme is at the root of the project
and not copied into the Dockerfile instructions. This readme can be used
when the package is published on pypi but it is not the case for Docs.
2026-05-07 13:09:43 +02:00
Manuel Raynaud aea6fbef9b 🏗️(core) migrate from pip to uv
We want to remove the usage of pip in order to use uv as python package
manager.
2026-05-07 13:09:42 +02:00
Manuel Raynaud a47c35195d 🐛(backend) replace document creation table locks with retry strategy
We have situation where the number of locks in the database can increase
dangerously creating deadlock situation. To remove this situation we
decided to change the strategy to manage document creation concurrency.
We decided to use a retry strategy, trying to create the document
multiple times while a usable path is found. To avoid having an
inifinite loop, we use a max_attempts counter configurable using the
setting TREEBEARD_PATH_COMPUTE_RETRY_MAX_ATTEMPTS
2026-05-07 11:52:48 +02:00
Manuel Raynaud 8f67b37d70 ♻️(backend) split core/utils.py module
We need to split the core/utils.py in multiple submodule created in
core/utils/*.py. We need to do this to avoir circular import between
this module and the models module.
2026-05-07 11:45:57 +02:00
Manuel RaynaudandGitHub 0b20d9f435 🐛(backend) manage race condition between GET and PATCH content
When a PATCH and a GET on the content endpoint are made at the same time
for different users a race condition can happen and the metadata
returned
by the S3 head_object can be outdated when the object is fetched leading
to an error raised because the Content-Length header does not match the
size of the response body. To avoid this, we no longer used head_object
followed bu get_object, we have to manage
everything in one call with the get_object. The get_object also accepts
as parameters an etag or last-modified header and will return a 304 if
the content has not changed, so we can use this to not return the entire
body if this one has not changed.
2026-05-07 09:43:20 +00:00