from django.contrib import admin, messages from django_object_actions import ( DjangoObjectActions, action, takes_instance_or_queryset, ) from submissions.tasks import sync_event_game_scopes_task from .models import EventGame, Game class EventGameInline(admin.TabularInline): model = EventGame extra = 0 @admin.register(Game) class GameAdmin(admin.ModelAdmin): list_display = ["name", "steam_app_id", "updated_at"] search_fields = ["name", "steam_app_id"] readonly_fields = ["created_at", "updated_at"] inlines = [EventGameInline] @admin.register(EventGame) class EventGameAdmin(DjangoObjectActions, admin.ModelAdmin): list_display = ["game", "event", "enabled", "has_apibot_token"] list_filter = ["event", "enabled"] search_fields = ["game__name", "event__name"] actions = ["sync_scopes"] change_actions = ["sync_scopes"] @admin.display(description="AAndT token", boolean=True) def has_apibot_token(self, obj): return bool(obj.apibot_token) @action( label="Sync scopes", description="Sync scopes from AAndT for selected EventGames", ) @takes_instance_or_queryset def sync_scopes(self, request, queryset): tokened = queryset.exclude(apibot_token__isnull=True).exclude(apibot_token="") skipped = queryset.count() - tokened.count() for event_game in tokened: sync_event_game_scopes_task.enqueue(event_game.id) self.message_user( request, f"Queued scope sync for {tokened.count()} EventGame(s)." ) if skipped: self.message_user( request, f"Skipped {skipped} EventGame(s) with no AAndT token configured.", level=messages.WARNING, )