mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-03 17:08:47 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			229 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			229 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay
 | 
						|
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
						|
 | 
						|
from django.contrib import admin
 | 
						|
from django.utils.translation import gettext_lazy as _
 | 
						|
from polymorphic.admin import PolymorphicChildModelAdmin, \
 | 
						|
    PolymorphicChildModelFilter, PolymorphicParentModelAdmin
 | 
						|
from note_kfet.admin import admin_site
 | 
						|
 | 
						|
from .models.notes import Alias, Note, NoteClub, NoteSpecial, NoteUser, Trust
 | 
						|
from .models.transactions import Transaction, TemplateCategory, TransactionTemplate, \
 | 
						|
    RecurrentTransaction, MembershipTransaction, SpecialTransaction
 | 
						|
from .templatetags.pretty_money import pretty_money
 | 
						|
 | 
						|
 | 
						|
class AliasInlines(admin.TabularInline):
 | 
						|
    """
 | 
						|
    Define user and club aliases when editing their note
 | 
						|
    """
 | 
						|
    extra = 0
 | 
						|
    model = Alias
 | 
						|
 | 
						|
 | 
						|
class TrustInlines(admin.TabularInline):
 | 
						|
    """
 | 
						|
    Define trusts when editing the trusting note
 | 
						|
    """
 | 
						|
    model = Trust
 | 
						|
    fk_name = "trusting"
 | 
						|
    extra = 0
 | 
						|
    readonly_fields = ("trusted",)
 | 
						|
 | 
						|
 | 
						|
@admin.register(Note, site=admin_site)
 | 
						|
class NoteAdmin(PolymorphicParentModelAdmin):
 | 
						|
    """
 | 
						|
    Parent regrouping all note types as children
 | 
						|
    """
 | 
						|
    child_models = (NoteClub, NoteSpecial, NoteUser)
 | 
						|
    list_filter = (
 | 
						|
        PolymorphicChildModelFilter,
 | 
						|
        'is_active',
 | 
						|
    )
 | 
						|
 | 
						|
    # Use a polymorphic list
 | 
						|
    list_display = ('pretty', 'balance', 'is_active')
 | 
						|
    polymorphic_list = True
 | 
						|
 | 
						|
    # Organize notes by registration date
 | 
						|
    date_hierarchy = 'created_at'
 | 
						|
 | 
						|
    # Search by aliases
 | 
						|
    search_fields = ['alias__name']
 | 
						|
 | 
						|
 | 
						|
@admin.register(NoteClub, site=admin_site)
 | 
						|
class NoteClubAdmin(PolymorphicChildModelAdmin):
 | 
						|
    """
 | 
						|
    Child for a club note, see NoteAdmin
 | 
						|
    """
 | 
						|
    inlines = (AliasInlines,)
 | 
						|
 | 
						|
    # We can't change club after creation or the balance
 | 
						|
    readonly_fields = ('club', 'balance')
 | 
						|
    search_fields = ('club',)
 | 
						|
 | 
						|
    def has_add_permission(self, request):
 | 
						|
        """
 | 
						|
        A club note should not be manually added
 | 
						|
        """
 | 
						|
        return False
 | 
						|
 | 
						|
    def has_delete_permission(self, request, obj=None):
 | 
						|
        """
 | 
						|
        A club note should not be manually removed
 | 
						|
        """
 | 
						|
        return False
 | 
						|
 | 
						|
 | 
						|
@admin.register(NoteSpecial, site=admin_site)
 | 
						|
class NoteSpecialAdmin(PolymorphicChildModelAdmin):
 | 
						|
    """
 | 
						|
    Child for a special note, see NoteAdmin
 | 
						|
    """
 | 
						|
    readonly_fields = ('balance',)
 | 
						|
 | 
						|
    def has_add_permission(self, request):
 | 
						|
        """
 | 
						|
        A club note should not be manually added
 | 
						|
        """
 | 
						|
        return False
 | 
						|
 | 
						|
    def has_delete_permission(self, request, obj=None):
 | 
						|
        """
 | 
						|
        A club note should not be manually removed
 | 
						|
        """
 | 
						|
        return False
 | 
						|
 | 
						|
 | 
						|
@admin.register(NoteUser, site=admin_site)
 | 
						|
class NoteUserAdmin(PolymorphicChildModelAdmin):
 | 
						|
    """
 | 
						|
    Child for an user note, see NoteAdmin
 | 
						|
    """
 | 
						|
    inlines = (AliasInlines, TrustInlines)
 | 
						|
 | 
						|
    # We can't change user after creation or the balance
 | 
						|
    readonly_fields = ('user', 'balance')
 | 
						|
 | 
						|
    def has_add_permission(self, request):
 | 
						|
        """
 | 
						|
        An user note should not be manually added
 | 
						|
        """
 | 
						|
        return False
 | 
						|
 | 
						|
    def has_delete_permission(self, request, obj=None):
 | 
						|
        """
 | 
						|
        An user note should not be manually removed
 | 
						|
        """
 | 
						|
        return False
 | 
						|
 | 
						|
 | 
						|
@admin.register(Transaction, site=admin_site)
 | 
						|
class TransactionAdmin(PolymorphicParentModelAdmin):
 | 
						|
    """
 | 
						|
    Admin customisation for Transaction
 | 
						|
    """
 | 
						|
    child_models = (Transaction, RecurrentTransaction, MembershipTransaction, SpecialTransaction)
 | 
						|
    list_display = ('created_at', 'poly_source', 'poly_destination',
 | 
						|
                    'quantity', 'amount', 'valid')
 | 
						|
    list_filter = ('valid',)
 | 
						|
 | 
						|
    def poly_source(self, obj):
 | 
						|
        """
 | 
						|
        Force source to resolve polymorphic object
 | 
						|
        """
 | 
						|
        return str(obj.source)
 | 
						|
 | 
						|
    poly_source.short_description = _('source')
 | 
						|
 | 
						|
    def poly_destination(self, obj):
 | 
						|
        """
 | 
						|
        Force destination to resolve polymorphic object
 | 
						|
        """
 | 
						|
        return str(obj.destination)
 | 
						|
 | 
						|
    poly_destination.short_description = _('destination')
 | 
						|
 | 
						|
    def get_readonly_fields(self, request, obj=None):
 | 
						|
        """
 | 
						|
        Only valid can be edited after creation
 | 
						|
        Else the amount of money would not be transferred
 | 
						|
        """
 | 
						|
        return 'created_at', 'source', 'destination', 'quantity', 'amount' if obj else ()
 | 
						|
 | 
						|
 | 
						|
@admin.register(MembershipTransaction, site=admin_site)
 | 
						|
class MembershipTransactionAdmin(PolymorphicChildModelAdmin):
 | 
						|
    """
 | 
						|
    Admin customisation for MembershipTransaction
 | 
						|
    """
 | 
						|
 | 
						|
    def get_readonly_fields(self, request, obj=None):
 | 
						|
        """
 | 
						|
        Only valid can be edited after creation
 | 
						|
        Else the amount of money would not be transferred
 | 
						|
        """
 | 
						|
        return ('created_at', 'source', 'destination', 'quantity', 'amount') if obj else ()
 | 
						|
 | 
						|
 | 
						|
@admin.register(RecurrentTransaction, site=admin_site)
 | 
						|
class RecurrentTransactionAdmin(PolymorphicChildModelAdmin):
 | 
						|
    """
 | 
						|
    Admin customisation for RecurrentTransaction
 | 
						|
    """
 | 
						|
 | 
						|
    def get_readonly_fields(self, request, obj=None):
 | 
						|
        """
 | 
						|
        Only valid can be edited after creation
 | 
						|
        Else the amount of money would not be transferred
 | 
						|
        """
 | 
						|
        return ('created_at', 'source', 'destination', 'quantity', 'amount') if obj else ()
 | 
						|
 | 
						|
 | 
						|
@admin.register(SpecialTransaction, site=admin_site)
 | 
						|
class SpecialTransactionAdmin(PolymorphicChildModelAdmin):
 | 
						|
    """
 | 
						|
    Admin customisation for SpecialTransaction
 | 
						|
    """
 | 
						|
 | 
						|
    def get_readonly_fields(self, request, obj=None):
 | 
						|
        """
 | 
						|
        Only valid can be edited after creation
 | 
						|
        Else the amount of money would not be transferred
 | 
						|
        """
 | 
						|
        return ('created_at', 'source', 'destination', 'quantity', 'amount') if obj else ()
 | 
						|
 | 
						|
 | 
						|
@admin.register(TransactionTemplate, site=admin_site)
 | 
						|
class TransactionTemplateAdmin(admin.ModelAdmin):
 | 
						|
    """
 | 
						|
    Admin customisation for TransactionTemplate
 | 
						|
    """
 | 
						|
    list_display = ('name', 'poly_destination', 'pretty_amount', 'category', 'display', 'highlighted',)
 | 
						|
    list_filter = ('category', 'display', 'highlighted',)
 | 
						|
    search_fields = ('name', 'destination__club__name', 'amount',)
 | 
						|
    autocomplete_fields = ('destination',)
 | 
						|
 | 
						|
    def poly_destination(self, obj):
 | 
						|
        """
 | 
						|
        Force destination to resolve polymorphic object
 | 
						|
        """
 | 
						|
        return str(obj.destination)
 | 
						|
 | 
						|
    poly_destination.short_description = _('destination')
 | 
						|
 | 
						|
    def pretty_amount(self, obj):
 | 
						|
        return pretty_money(obj.amount)
 | 
						|
 | 
						|
    pretty_amount.short_description = _("amount")
 | 
						|
 | 
						|
 | 
						|
@admin.register(TemplateCategory, site=admin_site)
 | 
						|
class TemplateCategoryAdmin(admin.ModelAdmin):
 | 
						|
    """
 | 
						|
    Admin customisation for TransactionTemplate
 | 
						|
    """
 | 
						|
    list_display = ('name',)
 |