Skip to content

Release 26.2.2#681

Merged
jason-ford-codecov merged 3 commits intomainfrom
release/26.2.2
Feb 3, 2026
Merged

Release 26.2.2#681
jason-ford-codecov merged 3 commits intomainfrom
release/26.2.2

Conversation

@codecov-releaser
Copy link
Contributor

@codecov-releaser codecov-releaser commented Feb 2, 2026

Release PR for 26.2.2
I've updated the version name and committed: 50489e0.


Note

Medium Risk
Adds a bulk management command that can create/modify Stripe subscription schedules across many customers; misuse or bugs could impact billing if run without --dry-run/proper filters. Version bump and migration are low risk but accompany the release.

Overview
Bumps the application version to 26.2.2 (updates VERSION and adds a core migration to persist the new version in Constants).

Adds a new Django management command apply_subscription_schedules to bulk-create Stripe subscription schedules for selected owners, supporting filtering (owner IDs, current plan, service, seat ranges), pagination, --dry-run, and --force (releases an existing schedule before recreating). The command is designed to be idempotent by skipping subscriptions already scheduled or already on the target Stripe price/quantity.

Written by Cursor Bugbot for commit e2c2baf. This will update automatically on new commits. Configure here.

@calvin-codecov calvin-codecov requested a review from a team as a code owner February 2, 2026 19:40
"proration_behavior": "none",
},
],
)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing cleanup leaves orphaned schedule on partial failure

Medium Severity

If SubscriptionSchedule.create() succeeds but SubscriptionSchedule.modify() fails, the created schedule is left attached to the subscription without the intended target plan phases. On subsequent runs, the idempotency check sees the subscription "already has schedule" and skips it, leaving the subscription stuck with an improperly configured schedule that won't transition to the target plan. The command claims to be idempotent but this failure mode breaks that guarantee.

Additional Locations (1)

Fix in Cursor Fix in Web

@sentry
Copy link

sentry bot commented Feb 2, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.39%. Comparing base (2918025) to head (e2c2baf).
⚠️ Report is 3 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #681      +/-   ##
==========================================
- Coverage   92.43%   92.39%   -0.04%     
==========================================
  Files        1297     1298       +1     
  Lines       47730    47760      +30     
  Branches     1606     1610       +4     
==========================================
+ Hits        44119    44128       +9     
- Misses       3302     3323      +21     
  Partials      309      309              
Flag Coverage Δ
apiunit 96.36% <ø> (ø)
sharedintegration 37.24% <0.00%> (-0.08%) ⬇️
sharedunit 85.34% <100.00%> (-0.12%) ⬇️
workerintegration 58.59% <ø> (ø)
workerunit 90.33% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@codecov-notifications
Copy link

codecov-notifications bot commented Feb 2, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

📢 Thoughts on this report? Let us know!

@codspeed-hq
Copy link

codspeed-hq bot commented Feb 2, 2026

Merging this PR will not alter performance

✅ 9 untouched benchmarks


Comparing release/26.2.2 (e2c2baf) with main (fde288c)

Open in CodSpeed

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

owners = owners.filter(plan_user_count__gte=options["min_quantity"])

if options["max_quantity"]:
owners = owners.filter(plan_user_count__lte=options["max_quantity"])
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Falsy check skips filter when quantity is zero

Medium Severity

The --min-quantity and --max-quantity filters use truthiness checks (if options["min_quantity"]:) instead of is not None checks. Since 0 is falsy in Python, passing --max-quantity 0 would silently skip the filter entirely, causing all subscriptions to be processed instead of only those with zero seats. This could lead to unintended billing changes. The same file correctly uses is not None for target_quantity (lines 260, 266), making this inconsistency likely an oversight.

Fix in Cursor Fix in Web

@jason-ford-codecov jason-ford-codecov added this pull request to the merge queue Feb 3, 2026
github-merge-queue bot pushed a commit that referenced this pull request Feb 3, 2026
* Prepare release 26.2.2

* add version 26.2.2 migration

* chore: retrigger CI checks

---------

Co-authored-by: Calvin Yau <[email protected]>
Co-authored-by: jasonford <[email protected]>
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks Feb 3, 2026
@jason-ford-codecov jason-ford-codecov added this pull request to the merge queue Feb 3, 2026
Merged via the queue into main with commit 1108177 Feb 3, 2026
53 checks passed
@jason-ford-codecov jason-ford-codecov deleted the release/26.2.2 branch February 3, 2026 19:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants