InterestGroup currently has no field for a banner/cover image — only a short icon CharField(max_length=10) (used for an emoji/icon glyph, not an image). The IG dashboard (api/dashboard/ig/) needs a proper banner_image field, plus create/update/read/delete support for it, so each Interest Group can display a banner on its public listing and detail pages.
The events module already solved this exact problem for cover_image / banner_image on events (api/dashboard/events/event_image_utils.py) — file upload, remote-URL fetch with SSRF protection, size/type validation, stale-file cleanup, and absolute-URL resolution for responses. This ticket reuses that pattern for Interest Groups instead of inventing a new one.
Expected Outcome
IG admins/leads can attach a banner image when creating or editing an Interest Group, either by uploading a file or supplying an image URL. InterestGroupAPI (GET), InterestGroupListApi, InterestGroupGetAPI, and InterestGroupCSV all return a banner_image field containing a fully-resolved URL (or null if unset). Deleting an IG, or replacing its banner, removes the now-unused file from storage.
InterestGroup currently has no field for a banner/cover image — only a short icon CharField(max_length=10) (used for an emoji/icon glyph, not an image). The IG dashboard (api/dashboard/ig/) needs a proper banner_image field, plus create/update/read/delete support for it, so each Interest Group can display a banner on its public listing and detail pages.
The events module already solved this exact problem for cover_image / banner_image on events (api/dashboard/events/event_image_utils.py) — file upload, remote-URL fetch with SSRF protection, size/type validation, stale-file cleanup, and absolute-URL resolution for responses. This ticket reuses that pattern for Interest Groups instead of inventing a new one.
banner_imagecolumn to theinterest_grouptable andInterestGroupmodelPOST /api/v1/ig/) and update (PUT /api/v1/ig/<pk>/)POST /api/v1/ig/request/)Expected Outcome
IG admins/leads can attach a banner image when creating or editing an Interest Group, either by uploading a file or supplying an image URL.
InterestGroupAPI(GET),InterestGroupListApi,InterestGroupGetAPI, andInterestGroupCSVall return abanner_imagefield containing a fully-resolved URL (ornullif unset). Deleting an IG, or replacing its banner, removes the now-unused file from storage.