You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
What this issue is, in plain English: Unglue.it historically offered three campaign types; two of them — Pledge (Kickstarter-style) and Buy-to-Unglue (sales advance an ungluing date) — are being retired. "Retired" means: no new campaigns of those types can be created or launched, while the two live legacy campaigns (#126 Lagos 2060, #137) keep operating under their original terms. An earlier attempt (#1168) did this incompletely at the model layer; this issue scoped doing it properly across model, UI, migration, ToS, and tests.
Status: implemented — all checkboxes done via PR #1213 (retire-pledge-b2u-1195, 11 commits). The PR is CC+Codex+LGTM after a 3-round adversarial review (verdict), deployed on test.unglue.it with a test-suite red-list identical to master's baseline (zero new failures), and live-verified (ToS, FAQ, /rightsholders/).
Split out from #1168, where the FAQ-copy PR also disabled new Pledge/Buy-to-Unglue campaigns at the model level — but incompletely. Do this as a deliberate patch.
Background:#1168 reduced Campaign.type choices to THANKS only and blocks launching REWARDS/BUY2UNGLUE. The copy edits there are fine and ship separately; this issue tracks doing the actual retirement coherently.
Fix crash: the new may_launch = False for REWARDS/BUY2UNGLUE appends no problem message, but activate() reads self.problems[0] → IndexError instead of a clean UnglueitError when an old-type campaign is activated directly. Append a launch-block problem message. (Retire Pledge & Buy-to-Unglue campaigns (#1195) #1213a4734082 + hardened fail-closed in bf4611ad: anything ≠ THANKS is unlaunchable with a clean message; regression tests incl. unknown type 99.)
Campaign.typedefault=REWARDS becomes a non-choice → set default=THANKS (or keep choices and gate differently). (default=THANKS; legacy choices retained so existing campaigns validate/display.)
Add the migration for the choices change (Django 4.2 serializes choices; makemigrations --check will flag it). (core/migrations/0030_retire_pledge_b2u.py — state-only, no DDL; applied + --check verified clean on test.)
UI/creation paths still offer Pledge/B2U:rh_views.py still initializes new campaigns as type 2; rh_works.html, manage_campaign.html, work.html, faq_b2u.html still present those flows. Make the front-end consistent with 'no new Pledge/B2U.' (All creation paths closed: rh_views.py c_type→THANKS, OpenCampaignForm offers/accepts THANKS only, rh_works.html rewritten; also FAQ menu, libraries.html, rh_intro.html. manage_campaign.html/work.html/faq_b2u.html deliberately retained — they display/manage existing legacy campaigns, per the block-new-only decision below; faq_b2u.html stays URL-reachable for legacy supporters but is de-linked from nav.)
Tests: existing tests assume default pledge campaigns can launch — update for legacy type 1/2 behavior. (force_activate() helper simulates pre-retirement launches; new CampaignRetirementTests; payment/tests.py pinned to type=REWARDS; THANKS launch-and-activate covered.)
BLUF (updated 2026-08-03)
What this issue is, in plain English: Unglue.it historically offered three campaign types; two of them — Pledge (Kickstarter-style) and Buy-to-Unglue (sales advance an ungluing date) — are being retired. "Retired" means: no new campaigns of those types can be created or launched, while the two live legacy campaigns (#126 Lagos 2060, #137) keep operating under their original terms. An earlier attempt (#1168) did this incompletely at the model layer; this issue scoped doing it properly across model, UI, migration, ToS, and tests.
Status: implemented — all checkboxes done via PR #1213 (
retire-pledge-b2u-1195, 11 commits). The PR isCC+Codex+LGTMafter a 3-round adversarial review (verdict), deployed on test.unglue.it with a test-suite red-list identical to master's baseline (zero new failures), and live-verified (ToS, FAQ, /rightsholders/).What remains before this closes:
Split out from #1168, where the FAQ-copy PR also disabled new Pledge/Buy-to-Unglue campaigns at the model level — but incompletely. Do this as a deliberate patch.
Background: #1168 reduced
Campaign.typechoices to THANKS only and blocks launching REWARDS/BUY2UNGLUE. The copy edits there are fine and ship separately; this issue tracks doing the actual retirement coherently.Required work (CC + Codex review of #1168):
may_launch = Falsefor REWARDS/BUY2UNGLUE appends no problem message, butactivate()readsself.problems[0]→IndexErrorinstead of a cleanUnglueitErrorwhen an old-type campaign is activated directly. Append a launch-block problem message. (Retire Pledge & Buy-to-Unglue campaigns (#1195) #1213a4734082+ hardened fail-closed inbf4611ad: anything ≠ THANKS is unlaunchable with a clean message; regression tests incl. unknown type 99.)Campaign.typedefault=REWARDSbecomes a non-choice → setdefault=THANKS(or keep choices and gate differently). (default=THANKS; legacy choices retained so existing campaigns validate/display.)choiceschange (Django 4.2 serializes choices;makemigrations --checkwill flag it). (core/migrations/0030_retire_pledge_b2u.py— state-only, no DDL; applied +--checkverified clean on test.)rh_views.pystill initializes new campaigns as type 2;rh_works.html,manage_campaign.html,work.html,faq_b2u.htmlstill present those flows. Make the front-end consistent with 'no new Pledge/B2U.' (All creation paths closed:rh_views.pyc_type→THANKS,OpenCampaignFormoffers/accepts THANKS only,rh_works.htmlrewritten; also FAQ menu,libraries.html,rh_intro.html.manage_campaign.html/work.html/faq_b2u.htmldeliberately retained — they display/manage existing legacy campaigns, per the block-new-only decision below;faq_b2u.htmlstays URL-reachable for legacy supporters but is de-linked from nav.)force_activate()helper simulates pre-retirement launches; newCampaignRetirementTests;payment/tests.pypinned totype=REWARDS; THANKS launch-and-activate covered.)Refs #1168 (copy PR), Eric's intent: 'Buy-to-Unglue, Pledge no longer offered.'