Make it easier in Django admin to see who has paid, export lists by year, and find payments by email.
Requirements
Paid indicator — Show a green check in admin when a person has a matching payment (Payments.email ↔ MembershipPerson.email, case-insensitive). Display on membership list, person list, and the person inline. Treat as paid for the current calendar year (dues are annual).
CSV year filter — When downloading CSV for payments, memberships by person, or memberships by address, prompt for a year. Payments filter by payment date; memberships filter by record created year.
Payment search — Payments admin must be searchable by email address.
Test plan
Membership/person admin shows paid check when a same-year payment email matches
CSV actions offer a year picker and only include that year
Payments changelist search finds records by email
## Summary
Make it easier in Django admin to see who has paid, export lists by year, and find payments by email.
## Requirements
1. **Paid indicator** — Show a green check in admin when a person has a matching payment (`Payments.email` ↔ `MembershipPerson.email`, case-insensitive). Display on membership list, person list, and the person inline. Treat as paid for the current calendar year (dues are annual).
2. **CSV year filter** — When downloading CSV for payments, memberships by person, or memberships by address, prompt for a year. Payments filter by payment date; memberships filter by record created year.
3. **Payment search** — Payments admin must be searchable by email address.
## Test plan
- [ ] Membership/person admin shows paid check when a same-year payment email matches
- [ ] CSV actions offer a year picker and only include that year
- [ ] Payments changelist search finds records by email
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Make it easier in Django admin to see who has paid, export lists by year, and find payments by email.
Requirements
Payments.email↔MembershipPerson.email, case-insensitive). Display on membership list, person list, and the person inline. Treat as paid for the current calendar year (dues are annual).Test plan