# -*- mode: python; coding: utf-8 -*- # Copyright (C) 2017-2019 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.contrib import admin from django.contrib.auth import get_user_model from django.db.models import Q from med.admin import admin_site from .models import GameSave, Player class PlayerInline(admin.TabularInline): model = Player # Do not always show extra players extra = 0 min_num = 5 class GameSaveAdmin(admin.ModelAdmin): inlines = [PlayerInline, ] list_display = ('__str__', 'game_master', 'game_has_ended') date_hierarchy = 'created_at' autocomplete_fields = ('game_master',) def has_change_permission(self, request, obj=None): """ If user is game master then authorize edit """ if obj and obj.game_master == request.user: return True return super().has_change_permission(request, obj) def has_delete_permission(self, request, obj=None): """ If user is game master then authorize deletion """ if obj and obj.game_master == request.user: return True return super().has_delete_permission(request, obj) def add_view(self, request, form_url='', extra_context=None): """ Autoselect game master when creating a new game """ # Make GET data mutable data = request.GET.copy() data['game_master'] = request.user request.GET = data return super().add_view(request, form_url, extra_context) def formfield_for_foreignkey(self, db_field, request, **kwargs): """ Authorize game master change only if user can see all users """ if db_field.name == 'game_master': if not request.user.has_perm('users.view_user'): kwargs['queryset'] = get_user_model().objects.filter( username=request.user.username) return super().formfield_for_foreignkey(db_field, request, **kwargs) def get_queryset(self, request): """ List all game save only if user has view permission else, list only own games and ended games """ queryset = super().get_queryset(request) if request.user.has_perm('sporz.view_gamesave'): return queryset return queryset.filter( Q(game_master=request.user) | Q(game_has_ended=True) ) admin_site.register(GameSave, GameSaveAdmin)