feat(surrenders): public rabbit surrender form + admin review queue #19

Closed
opened 2026-09-11 00:58:10 +01:00 by Hermes · 0 comments
Collaborator

Summary

Add a public, anonymous "surrender a rabbit" form so members of the public can submit a rabbit into our care without needing an account. Nothing is created in the live rabbit records until an admin explicitly accepts the submission.

Public form (/surrender, unauthenticated)

  • Fields: rabbit name, breed/colour, approx. age or DOB, gender, neutered/spayed, health notes, reason for surrender, optional submitter contact (name/phone/email).
  • Mandatory checkbox with legal caveat text, e.g. "I confirm I am legally entitled to surrender this rabbit. I understand that upon acceptance, ownership transfers irrevocably to Casa del Bunnies." Store the checkbox timestamp + a version string of the legal text so we can prove what was agreed to if wording changes later.
  • Honeypot field for basic spam protection (no rate-limiting/captcha per discussion).
  • On submit: creates a SurrenderSubmission row with status=pending. No Rabbit row is created at this point.

Admin queue (/surrenders, admin only)

  • List of submissions grouped/filterable by status (pending/accepted/rejected).
  • Accept: creates a real Rabbit (status=Resident, no hutch assigned — staff place it later from the rabbits page as normal), copies over submitted fields, links SurrenderSubmission.rabbit_id back for traceability, writes an audit log entry.
  • Reject: sets status=rejected + optional admin note. No rabbit created. Record is kept (not deleted).
  • Delete: hard delete, for spam/test junk.
  • Submission data (including contact info) is retained indefinitely for our own records, even for rejected submissions.

Data model

New table SurrenderSubmission: rabbit fields as above, submitter contact fields, legal ack + timestamp + text version, status enum, admin note, rabbit_id FK (nullable, set on accept), timestamps.

Notes

  • Mirrors the existing adopt.py/adoptions.py public-form + admin-management split already in the codebase.
## Summary Add a public, anonymous "surrender a rabbit" form so members of the public can submit a rabbit into our care without needing an account. Nothing is created in the live rabbit records until an admin explicitly accepts the submission. ## Public form (`/surrender`, unauthenticated) - Fields: rabbit name, breed/colour, approx. age or DOB, gender, neutered/spayed, health notes, reason for surrender, optional submitter contact (name/phone/email). - Mandatory checkbox with legal caveat text, e.g. *"I confirm I am legally entitled to surrender this rabbit. I understand that upon acceptance, ownership transfers irrevocably to Casa del Bunnies."* Store the checkbox timestamp + a version string of the legal text so we can prove what was agreed to if wording changes later. - Honeypot field for basic spam protection (no rate-limiting/captcha per discussion). - On submit: creates a `SurrenderSubmission` row with `status=pending`. **No `Rabbit` row is created at this point.** ## Admin queue (`/surrenders`, admin only) - List of submissions grouped/filterable by status (pending/accepted/rejected). - **Accept**: creates a real `Rabbit` (status=`Resident`, no hutch assigned — staff place it later from the rabbits page as normal), copies over submitted fields, links `SurrenderSubmission.rabbit_id` back for traceability, writes an audit log entry. - **Reject**: sets `status=rejected` + optional admin note. No rabbit created. Record is kept (not deleted). - **Delete**: hard delete, for spam/test junk. - Submission data (including contact info) is retained indefinitely for our own records, even for rejected submissions. ## Data model New table `SurrenderSubmission`: rabbit fields as above, submitter contact fields, legal ack + timestamp + text version, status enum, admin note, `rabbit_id` FK (nullable, set on accept), timestamps. ## Notes - Mirrors the existing `adopt.py`/`adoptions.py` public-form + admin-management split already in the codebase.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
cpressland/rabbitdb#19
No description provided.