Rework Teams/Positions access control and add full Locations/Opponents CRUD

Team managers/coaches now only see their own teams, can't create teams,
and can view (but not edit) positions -- admins keep full rights.
Locations and Opponents move from read-only stubs to full CRUD, gated
to admins and management-position staff, with a country dropdown
(django-countries) instead of free text. Also: the team list shows
player/staff counts, and deleting a news item's main photo promotes
another one instead of leaving the item without one.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R1gj3J1QPfP38XWpnpbFpy
This commit is contained in:
2026-08-04 12:27:24 +02:00
parent 9a4da9b136
commit e6850232f0
23 changed files with 813 additions and 25 deletions

View File

@@ -3,3 +3,6 @@ from django.apps import AppConfig
class NewsConfig(AppConfig):
name = "news"
def ready(self):
from . import signals # noqa: F401

18
news/signals.py Normal file
View File

@@ -0,0 +1,18 @@
"""Keep NewsPhoto's file in sync with the row: deleting a NewsPhoto -- one at
a time, or in bulk via a News item's cascade -- must also delete the image
from storage, or it just accumulates orphaned files forever.
Connecting a post_delete receiver also stops Django's fast-delete
optimisation for a News cascade, so every NewsPhoto instance (and this
signal) actually runs instead of being collapsed into one bulk SQL DELETE.
"""
from django.db.models.signals import post_delete
from django.dispatch import receiver
from .models import NewsPhoto
@receiver(post_delete, sender=NewsPhoto)
def delete_photo_file(sender, instance, **kwargs):
instance.image.delete(save=False)