Commit Graph
1142 Commits
Author SHA1 Message Date
Nathan VasseandNicolas Clerc 4adbe9f2b7 ✨(frontend) wire CTAs into header and standalone file preview
UserProfile now renders AnonymousCTA along with a dropdown menu
(copy link, language picker) when no user is authenticated, so
visitors on a public page can still act on it without the user
menu. CustomFilesPreview gains a CONTEXTUAL mode that swaps in
the right CTA based on auth state, used by the standalone file
preview page which is now wrapped in GlobalLayout to expose the
auth context.
2026-06-04 11:16:40 +02:00
Nathan VasseandNicolas Clerc 82e57aefc5 ✨(frontend) add AnonymousCTA and MyFilesCTA components
AnonymousCTA offers a try-out link and a sign-in button to visitors
landing on a public resource. MyFilesCTA is the authenticated
counterpart, sending the user back to their drive. Translations
cover both CTAs and the anonymous dropdown menu that will live next
to them. Components are consumed in a follow-up commit.
2026-06-04 11:16:40 +02:00
Nathan VasseandNicolas Clerc 3088455abf ⬆️(frontend) bump ui-kit to 0.22.0
Required for the DropdownMenu, useDropdownMenu and Folder exports
used by the upcoming anonymous and my-files CTA components.
2026-06-04 11:16:40 +02:00
Nicolas Clerc a4105a3432 ✨(backend) allow grist file upload
The .grist extension was already in FILE_EXTENSIONS_ALLOWED but
upload failed at MIME type validation because python-magic detects
grist files as application/vnd.sqlite3.
2026-06-03 18:38:46 +02:00
Nicolas Clerc 7ac7dd5ef5 🐛(frontend) add missing export action translations
The folder export button added in cd7bebfc used
the translation key explorer.item.actions.export
without adding the corresponding entries.
2026-06-03 18:23:07 +02:00
Nicolas Clerc 302bff1605 ✅(e2e) cover conversion explorer flow
The conversion flow crosses modal state, API calls, and explorer refreshes.

Cover the expected user path with a mocked conversion ability and placeholder
response.
2026-06-03 16:47:38 +02:00
Nicolas Clerc 4f85801abe ♻️(frontend) generalize duplicating poller to transient items
The same polling loop fits any transient upload state.

Rename the duplicating poller to a transient one driven by
TRANSIENT_UPLOAD_STATES so converting items are picked up without copying
the hook, and the explorer refreshes automatically when background
conversion finishes.
2026-06-03 16:47:38 +02:00
Nicolas Clerc aeb6c9b5c7 ✨(frontend) render converting items as transient rows
A converting file is visible but not ready for normal file actions.

Show the transient state consistently and prevent opening or acting on the item
until conversion completes.
2026-06-03 16:47:38 +02:00
Nicolas Clerc af6ab74e42 ✨(frontend) add conversion modal
Users should understand that opening a legacy file creates an editable copy.

Keep the modal focused on confirmation and let the folder show the ongoing
conversion state.
2026-06-03 16:47:38 +02:00
Nicolas Clerc 462c3e5e7a ✨(frontend) wire conversion API client
The frontend needs to treat conversion as item creation rather than job polling.

Return the placeholder item from the driver so UI state stays aligned with the
explorer list.
2026-06-03 09:28:56 +02:00
Nicolas Clerc 6a07e183ce 🐛(backend) normalize WOPI extension lookup
Uploaded filenames preserve extension case, while WOPI discovery stores
extension keys in lowercase.

Normalize the lookup so legacy files like REPORT.DOC follow the same conversion
path.
2026-06-03 09:28:56 +02:00
Nicolas Clerc 10f5724951 ✨(backend) queue legacy file conversion
Starting a conversion should be quick for the API caller and continue in the
background.

Queue the placeholder-backed conversion task from the item endpoint.
2026-06-03 09:28:56 +02:00
Nicolas Clerc acfd09be8f ✨(backend) expose legacy conversion ability
The explorer needs to know when opening a legacy Office file should start
conversion instead of WOPI editing.

Expose the decision on item abilities so the frontend can keep the flow item-
based.
2026-06-02 15:23:42 +02:00
Nicolas Clerc 20596fa98a ✨(backend) add placeholder-backed conversion service
Users need immediate feedback in the current folder while conversion continues
in the background.

Create the target item up front and complete it once converted bytes are
available.
2026-06-02 15:23:42 +02:00
Nicolas Clerc a67efc234b ✨(backend) add converting upload state
Converted files should appear in the folder immediately while Celery is still
working.

Add a dedicated transient state instead of overloading upload or duplication
states.
2026-06-02 15:23:42 +02:00
Nicolas Clerc a997fa826f ✨(backend) build short-lived WOPI source URLs
OnlyOffice must fetch the source bytes from Drive during server-side conversion.

Use short-lived WOPI access URLs so conversion does not depend on direct object
storage reachability.
2026-06-02 15:23:42 +02:00
Nicolas Clerc b4fc5ec2a3 ✨(backend) add legacy conversion policy helpers
Legacy Office formats need an explicit conversion policy before they can be
opened for editing.

Keep the mapping small and configuration-driven so the backend only converts
formats intentionally forced by the WOPI client.
2026-06-02 15:23:42 +02:00
Nicolas Clerc 88e2693704 ✨(backend) add OnlyOffice conversion backend
Drive needs a server-side path to convert legacy Office files without opening an
interactive editor session.

Use OnlyOffice's conversion API as the first supported provider for the POC.
2026-06-02 15:23:42 +02:00
Nicolas Clerc cd7bebfcb8 ✨(frontend) add folder export action
Expose the backend folder ZIP export from explorer folder menus
through the Download action.
2026-05-28 10:43:52 +02:00
Nicolas Clerc ded840a6e1 ✨(backend) add folder export streaming endpoint
Issue #412 asks for a way to download an entire folder. Add a
GET /items/<id>/export/ action that streams a recursive ZIP archive of
the folder, preserving the directory hierarchy and skipping soft-deleted
or not-yet-uploaded descendants.
2026-05-28 10:43:52 +02:00
Nicolas Clerc 7b12fdb92a ➕(backend) add zipstream-ng dependency
Used to stream a zip archive of a folder's content over HTTP without
buffering the whole archive in memory.
2026-05-28 10:42:53 +02:00
Nicolas Clerc c610e1bb28 ✨(backend) add export ability on folders
Introduce a new "export" entry in Item.get_abilities, true only for
folders the user can read. Will be the gate for the upcoming recursive
folder export endpoint.
2026-05-28 10:42:53 +02:00
Nicolas Clerc afc78fb77f 🧑‍💻(backend) add reconciliation demo command
Seed two accounts and a CSV to exercise the reconciliation flow end to end
through the admin and the frontend.
2026-05-27 17:36:47 +02:00
Nicolas Clerc 6f926c61b4 ✨(frontend) add user reconciliation confirmation pages
Let users confirm by email that they control both accounts, closing the
reconciliation flow on the frontend.
2026-05-27 17:36:47 +02:00
Nicolas Clerc 9995a2af30 📝(doc) document user account reconciliation
Explain the CSV import flow and the form URL setting so admins can run
account merges.
2026-05-27 17:36:47 +02:00
Nicolas Clerc ff184e1336 ✨(backend) add reconciliation email confirmation endpoint
Let users confirm by email that they control both accounts before the
merge is allowed to run.
2026-05-27 17:36:47 +02:00
Nicolas Clerc e2538680de ✨(backend) add user reconciliation admin
Give admins a UI to import reconciliation CSVs and trigger the actual
merge once both addresses are confirmed.
2026-05-27 17:36:47 +02:00
Nicolas Clerc 0ce6c56bd4 ✨(backend) add user reconciliation csv import task
Let an admin bulk-create reconciliation requests from an external CSV
export instead of entering each pair by hand.
2026-05-27 17:36:47 +02:00
Nicolas Clerc df47d3ccf9 ✨(backend) add user reconciliation models
Merge an inactive account's content into the active one once both email
addresses are confirmed, so users keep a single account.
2026-05-27 17:36:47 +02:00
Nicolas Clerc fcf459d536 ✨(backend) add generic send_email method on user model
The user reconciliation flow needs to send templated emails to users.
2026-05-27 08:02:08 +02:00
Nicolas Clerc 06d841c5a1 🔥(backend) drop deprecated numchild columns from item
The _deprecated_numchild and _deprecated_numchild_folder fields were
kept temporarily to preserve the underlying columns during the tree
model transition. The columns are no longer read or written, so the
fields and their columns can now be removed.
2026-05-26 09:25:17 +02:00
RolletQuentinandManuel Raynaud 3293ce5269 🐛(backend) replace VersionId by Etag for WOPI
When we try to get the VersionId from the s3 response
but this one is not send by the s3 storage (garage for example),
we get a 500 error.
To fix this issue we use the ETag sent by the object storage to track
the version id. This ETag is present also when versionning is not
implemented.

Co-authored-by: RolletQuentin <rolletquen@gmail.com>
2026-05-18 14:25:39 +02:00
renovate[bot]andNicolas Clerc 4ecc4d7a46 ⬆️(dependencies) update django to v5.2.14 [SECURITY] 2026-05-13 10:03:25 +02:00
Manuel Raynaud 90a5dff1f9 ⬆️(dependencies) update urllib3 to v2.7.0 [SECURITY]
Update to patch CVE CVE-2026-44431 and CVE-2026-44432
2026-05-12 15:02:51 +02:00
Nathan Vasse 74b0f84ea0 ♻️(frontend) move mime imports to ui-kit
Some imports were re exported from the mime type file. Let's
import directly from ui-kit.
2026-05-11 14:58:06 +02:00
Nathan Vasse 18d8b22eb7 📝(doc) update changelog
Update the changelog based on the recent commits about
file previewer.
2026-05-11 14:48:22 +02:00
Nathan Vasse 10d72079ae ✅(frontend) replace per-format preview tests with smoke tests
Detailed FilePreview behavior is now covered by Playwright CT inside
the ui-kit repo, so the drive e2e suite only keeps integration smoke
checks: upload -> open -> render for PDF, image, video, audio, plus
prev/next navigation across files.
2026-05-06 17:19:45 +02:00
Nathan Vasse 3ddd7e5db5 ♻️(frontend) replace custom file preview with ui-kit FilePreview
The ui-kit ships a complete FilePreview (PDF, image, video, audio,
WOPI, error/unsupported, navigation, controls), so we drop the in-app
implementation under features/ui/preview/ and keep only a thin
CustomFilesPreview wrapper that maps Item to FilePreviewType, plugs
in the share modal, info sidebar and posthog event.

The WOPI editor is moved to its own features/wopi/ folder and
openWopiInNewTab now takes a FilePreviewType to match the ui-kit
onOpenInEditor callback. The file_preview translation block moves to
the ui-kit too.
2026-05-06 17:19:45 +02:00
Nathan Vasse b7d635b7bf ♻️(frontend) delegate file icons to ui-kit FileIcon
The ui-kit now ships FileIcon along with mime-category and icon-set
utilities, so we drop the local catalog (MIME_MAP, KNOWN_EXTENSIONS,
getMimeCategory, getIconByMimeType, FolderIcon, WorkspaceIcon) and
keep only the drive-specific extensions: folders and suspicious
uploads, exposed through getItemExtendedIcon. ItemIcon falls back to
ui-kit FileIcon for everything else.
2026-05-06 17:19:45 +02:00
Nathan Vasse d99116edb8 ⬆️(frontend) upgrade ui-kit version
Upgrade to the latest version that includes FileIcon, mimetype utils
and FilePreview.
2026-05-06 17:19:45 +02:00
Manuel Raynaud 9add4753d1 🔖(minor) bump release version 0.18.0
Added

- ✨(backend) add organization metrics to usage API
- ✨(backend) add entitlements context and can_upload reason
- ✨(frontend) add entitlement disclaimer modal
- ✨(frontend) render PDF previews at per-page dimensions

Fixed

- 🐛(backend) accept CDFV2 mimetype from newer libmagic
- 🐛(backend) better transaction management on duplicate action

Removed

- 🔥(backend) remove mirroring feature
v0.18.0-preprod v0.18.0
2026-05-04 16:47:06 +02:00
Nathan Vasse 6569287391 ✨(backend) capture item_duplicate posthog event
Duplication is currently invisible to product analytics because the
event is fired from the API rather than the UI. Emit it from the
viewset right after the duplicate row is created so the duplicated
item context (workspace, mimetype, ...) is attached to the event.
2026-05-04 15:58:32 +02:00
Nathan Vasse 1e97297ae2 ✨(frontend) capture column type change posthog event
Track when users customize their column layout so product can see
which columns get adopted vs ignored. The event carries the slot
plus old and new column types to support funnel analysis.
2026-05-04 15:49:53 +02:00
Nathan Vasse 4cc02f7959 ✨(frontend) match event properties in posthog e2e helper
Asserting only on the event name is not enough when the same event is
emitted from multiple call sites with different payloads. Expose
expectEventSentWithProps so specs can pin down the expected slot or
context, and keep the captured properties available alongside the
existing names array.
2026-05-04 15:49:53 +02:00
Manuel Raynaud d6e27ba5a1 🔊(backend) log wopi max expected file size in get_file_content action
In the get_file_content action we want to log the received max expected
file size when this one is lower than the file size the user wants to
edit. This will help us to correctly configure the WOPI host.
2026-05-04 14:33:18 +02:00
e35549707c ✨(settings) Allow configuring PKCE for the SSO
Co-Authored-by: Tom Hubrecht <github@mail.hubrecht.ovh>
2026-04-30 08:15:46 +02:00
Manuel Raynaud 68abb54dbb 🐛(backend) better transaction management on duplicate action
On the duplicate action we are using the decorator @transaction.atomic
to be sure that the duplicated item and its accesses are correctly
created. The problem with that is that the celery task doing the file
duplication on the object storage can be executed before the transaction
is commited leading to an error saying that the duplicated_item does not
exists.
2026-04-29 22:07:56 +02:00
Nathan Vasse 6049113dfe 🐛(backend) accept CDFV2 mimetype from newer libmagic
Scalingo's Ubuntu runtime ships a newer libmagic that returns
application/CDFV2 for legacy .doc/.xls/.ppt files, where Alpine's
older libmagic (used in our Docker image) returns the older label
application/x-ole-storage. Both describe the same OLE2 / Composite
Document File V2 container.

detect_mimetype() already treats application/x-ole-storage as a
generic content-detection result and falls back to extension-based
detection (yielding application/msword, application/vnd.ms-excel,
etc.). Without the same handling for CDFV2, legacy .doc uploads on
Scalingo are rejected by the mimetype allow-list with
"mimetype not allowed application/CDFV2 for filename ...".
2026-04-29 12:15:02 +02:00
Nathan Vasse 7a95dcf38a 📝(doc) update changelog
Fix the mis-added entries inside the previous release back to
the unreleased one. And add new entry for the pdf mixed pages
size rendering.
2026-04-29 11:37:08 +02:00
Nathan Vasse 679805b244 ✅(frontend) add e2e tests for mixed PDF page sizes
Cover the per-page-dimensions path with a 17-page fixture
spanning portrait, landscape, square, wide-banner and tall-strip
ratios. Asserts that rendered pages and thumbnails match each
page's real aspect ratio, that page-input jumps land precisely
across mixed ratios, and that the virtual-list total height
matches the sum of per-page heights.
2026-04-29 11:02:53 +02:00