Media was unreachable from either portal, which is why the certificate button on the buyer compliance page returned page-not-found and no document row had anything to click. The cause was structural: the portal and ops hosts proxy location / to the app with a path prefix, so a stored /media/... URL arrives as /portal/media/... and matches no route. Add a download view per portal behind the same role gate as the page that links to it — buyer-visible documents and published certificates for buyers, anything the ops list shows for operations — resolving the stored path safely under MEDIA_ROOT so a traversal or an absolute path is refused. Point the seven templates that list files at the new routes. Also add a portal-wide render sweep: nothing in the suite was fetching the ops or portal pages, so a view could lose its template_name and 500 in front of a user with every test still green. |
||
|---|---|---|
| .. | ||
| ai | ||
| batches | ||
| buyer | ||
| capa | ||
| compliance | ||
| core | ||
| documents | ||
| esg | ||
| guides | ||
| notifications | ||
| ops | ||
| qc | ||
| shipments | ||
| subscriptions | ||
| users | ||
| __init__.py | ||