diff --git a/admin_panel/bd_models/admin/guild.py b/admin_panel/bd_models/admin/guild.py index d4ade86c..393e9e9d 100644 --- a/admin_panel/bd_models/admin/guild.py +++ b/admin_panel/bd_models/admin/guild.py @@ -2,12 +2,17 @@ from asgiref.sync import async_to_sync from django.contrib import admin, messages +from django.contrib.admin.utils import quote +from django.urls import reverse +from django.utils.html import format_html from django_admin_action_forms import action_with_form +from django_admin_inline_paginator.admin import InlinePaginated +from nonrelated_inlines.admin import NonrelatedInlineMixin from admin_panel.webhook import notify_admins from ..forms import BlacklistActionForm, BlacklistedListFilter -from ..models import BlacklistedGuild, BlacklistHistory, GuildConfig +from ..models import BallInstance, BlacklistedGuild, BlacklistHistory, GuildConfig from ..utils import BlacklistTabular if TYPE_CHECKING: @@ -15,6 +20,42 @@ from django.http import HttpRequest +class BallInstanceGuildTabular(InlinePaginated, NonrelatedInlineMixin, admin.TabularInline): + model = BallInstance + fk_name = "player" + per_page = 50 + ordering = ("-catch_date",) + fields = ("description", "player", "catch_time", "catch_date") + readonly_fields = ("description", "player", "catch_time", "catch_date") + show_change_link = True + classes = ("collapse",) + can_delete = False + + def get_form_queryset(self, obj: GuildConfig): + return BallInstance.objects.filter(server_id=obj.guild_id).prefetch_related("player") + + @admin.display(description="Time to catch") + def catch_time(self, obj: BallInstance): + if obj.spawned_time: + return str(obj.spawned_time - obj.catch_date) + return "-" + + # adding a countryball cannot work from here since all fields are readonly + def has_add_permission(self, request: "HttpRequest", obj: GuildConfig) -> bool: + return False + + @admin.display(description="Player") + def player(self, obj: BallInstance): + opts = obj.player._meta + admin_url = reverse( + "%s:%s_%s_change" % (self.admin_site.name, opts.app_label, opts.model_name), + None, + (quote(obj.player.pk),), + ) + # Display a link to the admin page. + return format_html(f'{obj.player}') + + @admin.register(GuildConfig) class GuildAdmin(admin.ModelAdmin): list_display = ("guild_id", "spawn_channel", "enabled", "silent", "blacklisted") @@ -24,7 +65,7 @@ class GuildAdmin(admin.ModelAdmin): search_fields = ("guild_id", "spawn_channel") search_help_text = "Search by guild ID or spawn channel ID" - inlines = (BlacklistTabular,) + inlines = (BlacklistTabular, BallInstanceGuildTabular) actions = ("blacklist_guilds",) @admin.display(description="Is blacklisted", boolean=True) diff --git a/admin_panel/bd_models/admin/player.py b/admin_panel/bd_models/admin/player.py index edeb5a1b..9da42a0d 100644 --- a/admin_panel/bd_models/admin/player.py +++ b/admin_panel/bd_models/admin/player.py @@ -39,7 +39,7 @@ def catch_time(self, obj: BallInstance): return "-" # adding a countryball cannot work from here since all fields are readonly - def has_add_permission(self, request: "HttpRequest", obj: "Player | GuildConfig") -> bool: + def has_add_permission(self, request: "HttpRequest", obj: "Player") -> bool: return False @admin.display(description="Server")