release: v1.4.1 - #9545
Conversation
* feat: add command to reactivate workspace members with error handling * fix: address review comments on reactivate command - normalize email input to match User.save lowercasing - fix grammar in error messages - limit save to is_active so audit fields are not clobbered Claude-Session: https://claude.ai/code/session_01NGjXVUi4D8JGWy7b7KDNaN * fix: normalize inputs before validation and report partial reactivation - strip slug/email before the required checks so whitespace-only args are rejected - bump updated_at and pass disable_auto_set_user so the audit fields survive - report the restored role, inactive project memberships, and inactive accounts Claude-Session: https://claude.ai/code/session_01NGjXVUi4D8JGWy7b7KDNaN --------- Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
list() omitted the trailing slash while every sibling method and the Django route require /users/notifications/. Self-hosted (Traefik) surfaces the upstream 404 as 500; unread badge still works. Fixes #9489
Added an annotation to the WorkspaceModulesEndpoint to aggregate member IDs into an array, ensuring that only active members are included. This change improves the data structure returned by the API, allowing for better handling of member information in the frontend. Updated the corresponding utility function to handle potential null values for member IDs.
… Create View modal (#9542) Replaced the icon button styling with a more generic button styling for the dropdown component to ensure consistency across the UI. This change enhances the visual coherence of the dropdown button's appearance.
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
React Doctor found no new issues. 🎉 Reviewed by React Doctor for commit |
There was a problem hiding this comment.
🟢 Ready to approve
The changes are low-risk and consistent with existing patterns, with only a minor optional performance nit noted in the module ordering helper.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Pull request overview
Release v1.4.1 updates several small areas across docs, frontend utilities/UI, services, and the API to improve module/member handling, align notification endpoints, and add an admin utility command.
Changes:
- Add “Managed hosting” (Zenith) option to the README getting-started table.
- Improve module client-side ordering/filtering robustness and align workspace module API payloads with
member_ids. - Normalize workspace notification API calls to the canonical trailing-slash route and add a management command to reactivate workspace members.
File summaries
| File | Description |
|---|---|
| README.md | Adds a managed hosting deployment option link/button. |
| packages/utils/src/module.ts | Uses toSorted() for name ordering and guards member_ids against undefined. |
| packages/services/src/workspace/notification.service.ts | Updates notifications endpoint to include trailing slash. |
| apps/web/core/services/workspace-notification.service.ts | Updates notifications endpoint to include trailing slash (web app). |
| apps/web/core/components/dropdowns/layout.tsx | Switches dropdown button styling helper to standard button styling. |
| apps/api/plane/db/management/commands/reactivate_workspace_member.py | Adds Django management command to reactivate an inactive workspace member. |
| apps/api/plane/app/views/workspace/module.py | Annotates workspace modules with member_ids via ArrayAgg + Coalesce for consistent API output. |
Review details
- Files reviewed: 7/7 changed files
- Comments generated: 1
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
| if (orderByKey === "name") orderedModules = [...modules].toSorted((a, b) => naturalSort(a.name, b.name)); | ||
| if (orderByKey === "-name") orderedModules = [...modules].toSorted((a, b) => naturalSort(b.name, a.name)); |
* fix(api): enforce FILE_SIZE_LIMIT on published Space asset upload
The public Space asset upload endpoint
(POST /api/public/assets/v2/anchor/{anchor}/) trusted the client-supplied
`size` value end-to-end: it was stored on the FileAsset and passed straight
to generate_presigned_post(), which uses it as the S3/MinIO policy bound
(["content-length-range", 1, file_size]). This let an authenticated user
obtain a signed upload policy exceeding the instance's FILE_SIZE_LIMIT.
Cap the value with `size_limit = min(size, settings.FILE_SIZE_LIMIT)` and use
it consistently for the stored asset metadata and the presigned POST policy,
matching every other asset upload endpoint.
* fix(api): clamp Space asset size to a valid lower bound
Address review feedback: reject malformed (non-integer) `size` with 400 and
clamp the value to [1, FILE_SIZE_LIMIT] via max(1, min(...)) so the presigned
content-length-range is always valid and no non-positive size is persisted.
✨ Features
Workspace Member Reactivation Command
Self-hosted administrators can now restore a deactivated workspace member straight from the command line, without editing the database by hand. Running
reactivate_workspace_member <workspace-slug> <email>re-enables the membership and reports the role the member is restored to.⬆️ Enhancements
🐞 Bug fixes
🛡️ Security
FILE_SIZE_LIMIT. The size is now clamped to the instance limit and malformed values are rejected.