Polymorphic search

This commit is contained in:
Alexandre Iooss 2019-07-17 12:14:23 +02:00
parent 5110d6a16b
commit 1bfcedd4fe
No known key found for this signature in database
GPG Key ID: 6C79278F3FCDCC02
3 changed files with 100 additions and 53 deletions

View File

@ -3,6 +3,8 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from django.contrib import admin from django.contrib import admin
from polymorphic.admin import PolymorphicParentModelAdmin, \
PolymorphicChildModelAdmin, PolymorphicChildModelFilter
from .models.notes import Alias, Note, NoteClub, NoteSpecial, NoteUser from .models.notes import Alias, Note, NoteClub, NoteSpecial, NoteUser
from .models.transactions import MembershipTransaction, Transaction, \ from .models.transactions import MembershipTransaction, Transaction, \
@ -17,14 +19,32 @@ class AliasInlines(admin.TabularInline):
model = Alias model = Alias
class NoteClubAdmin(admin.ModelAdmin): @admin.register(Note)
class NoteAdmin(PolymorphicParentModelAdmin):
""" """
Admin customisation for NoteClub Parent regrouping all note types as children
"""
child_models = (NoteClub, NoteSpecial, NoteUser)
list_filter = (PolymorphicChildModelFilter, 'is_active',)
# Use a polymorphic list
list_display = ('__str__', 'balance', 'is_active')
polymorphic_list = True
# Organize notes by registration date
date_hierarchy = 'created_at'
ordering = ['-created_at']
# Search by aliases
search_fields = ['alias__name']
@admin.register(NoteClub)
class NoteClubAdmin(PolymorphicChildModelAdmin):
"""
Child for a club note, see NoteAdmin
""" """
inlines = (AliasInlines,) inlines = (AliasInlines,)
list_display = ('club', 'balance', 'is_active')
list_filter = ('is_active',)
search_fields = ['club__name']
# We can't change club after creation or the balance # We can't change club after creation or the balance
readonly_fields = ('club', 'balance') readonly_fields = ('club', 'balance')
@ -42,25 +62,20 @@ class NoteClubAdmin(admin.ModelAdmin):
return False return False
class NoteSpecialAdmin(admin.ModelAdmin): @admin.register(NoteSpecial)
class NoteSpecialAdmin(PolymorphicChildModelAdmin):
""" """
Admin customisation for NoteSpecial Child for a special note, see NoteAdmin
""" """
list_display = ('special_type', 'balance', 'is_active') readonly_fields = ('balance',)
class NoteUserAdmin(admin.ModelAdmin): @admin.register(NoteUser)
class NoteUserAdmin(PolymorphicChildModelAdmin):
""" """
Admin customisation for NoteUser Child for an user note, see NoteAdmin
""" """
inlines = (AliasInlines,) inlines = (AliasInlines,)
list_display = ('user', 'balance', 'is_active')
list_filter = ('is_active',)
search_fields = ['user__username']
# Organize note by registration date
date_hierarchy = 'user__date_joined'
ordering = ['-user__date_joined']
# We can't change user after creation or the balance # We can't change user after creation or the balance
readonly_fields = ('user', 'balance') readonly_fields = ('user', 'balance')
@ -78,18 +93,16 @@ class NoteUserAdmin(admin.ModelAdmin):
return False return False
@admin.register(TransactionTemplate)
class TransactionTemplateAdmin(admin.ModelAdmin): class TransactionTemplateAdmin(admin.ModelAdmin):
""" """
Admin customisation for TransactionTemplate Admin customisation for TransactionTemplate
""" """
list_display = ('name', 'destination', 'amount', 'template_type') list_display = ('name', 'destination', 'amount', 'template_type')
list_filter = ('destination', 'template_type',) list_filter = ('destination', 'template_type',)
# autocomplete_fields = ('destination',)
# Register your models here. # Register other models here.
admin.site.register(NoteClub, NoteClubAdmin)
admin.site.register(NoteSpecial, NoteSpecialAdmin)
admin.site.register(NoteUser, NoteUserAdmin)
admin.site.register(MembershipTransaction) admin.site.register(MembershipTransaction)
admin.site.register(Transaction) admin.site.register(Transaction)
admin.site.register(TransactionTemplate, TransactionTemplateAdmin)

View File

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-07-16 15:21+0200\n" "POT-Creation-Date: 2019-07-17 11:51+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -13,122 +13,144 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: apps.py:11 models/notes.py:39 #: apps.py:11 models/notes.py:41
msgid "note" msgid "note"
msgstr "note" msgstr "note"
#: models/notes.py:21 #: models/notes.py:22
msgid "account balance" msgid "account balance"
msgstr "solde du compte" msgstr "solde du compte"
#: models/notes.py:22 #: models/notes.py:23
msgid "in centimes, money credited for this instance" msgid "in centimes, money credited for this instance"
msgstr "en centimes, argent crédité pour cette instance" msgstr "en centimes, argent crédité pour cette instance"
#: models/notes.py:25 #: models/notes.py:27
msgid "active" msgid "active"
msgstr "actif" msgstr "actif"
#: models/notes.py:28 #: models/notes.py:30
msgid "" msgid ""
"Designates whether this note should be treated as active. Unselect this " "Designates whether this note should be treated as active. Unselect this "
"instead of deleting notes." "instead of deleting notes."
msgstr "" msgstr ""
"Indique si la note est active. Désactiver cela plutôt que supprimer la note." "Indique si la note est active. Désactiver cela plutôt que supprimer la note."
#: models/notes.py:33 #: models/notes.py:35
msgid "display image" msgid "display image"
msgstr "image affichée" msgstr "image affichée"
#: models/notes.py:40 #: models/notes.py:42
msgid "notes" msgid "notes"
msgstr "notes" msgstr "notes"
#: models/notes.py:54 #: models/notes.py:53
msgid "user"
msgstr ""
#: models/notes.py:57
msgid "one's note" msgid "one's note"
msgstr "note d'un utilisateur" msgstr "note d'un utilisateur"
#: models/notes.py:55 #: models/notes.py:58
msgid "users note" msgid "users note"
msgstr "notes des utilisateurs" msgstr "notes des utilisateurs"
#: models/notes.py:69 #: models/notes.py:61
#, python-format
msgid "%(user)s's note"
msgstr "Note de %(user)s"
#: models/notes.py:72
msgid "club"
msgstr "club"
#: models/notes.py:76
msgid "club note" msgid "club note"
msgstr "note d'un club" msgstr "note d'un club"
#: models/notes.py:70 #: models/notes.py:77
msgid "clubs notes" msgid "clubs notes"
msgstr "notes des clubs" msgstr "notes des clubs"
#: models/notes.py:83 models/transactions.py:31 models/transactions.py:64 #: models/notes.py:80
#, python-format
msgid "Note for %(club)s club"
msgstr "Note du club %(club)s"
#: models/notes.py:93 models/transactions.py:32 models/transactions.py:65
msgid "type" msgid "type"
msgstr "type" msgstr "type"
#: models/notes.py:89 #: models/notes.py:99
msgid "special note" msgid "special note"
msgstr "note spéciale" msgstr "note spéciale"
#: models/notes.py:90 #: models/notes.py:100
msgid "special notes" msgid "special notes"
msgstr "notes spéciales" msgstr "notes spéciales"
#: models/notes.py:98 models/transactions.py:18 #: models/notes.py:111 models/transactions.py:18
msgid "name" msgid "name"
msgstr "nom" msgstr "nom"
#: models/notes.py:108 #: models/notes.py:121
msgid "alias" msgid "alias"
msgstr "alias" msgstr "alias"
#: models/notes.py:109 #: models/notes.py:122
msgid "aliases" msgid "aliases"
msgstr "alias" msgstr "alias"
#: models/transactions.py:25 models/transactions.py:51 #: models/transactions.py:25 models/transactions.py:52
#: models/transactions.py:54 #: models/transactions.py:55
msgid "destination" msgid "destination"
msgstr "destination" msgstr "destination"
#: models/transactions.py:28 models/transactions.py:61 #: models/transactions.py:28 models/transactions.py:62
msgid "amount" msgid "amount"
msgstr "montant" msgstr "montant"
#: models/transactions.py:36 #: models/transactions.py:29
msgid "in centimes"
msgstr "en centimes"
#: models/transactions.py:37
msgid "transaction template" msgid "transaction template"
msgstr "modèle de transaction" msgstr "modèle de transaction"
#: models/transactions.py:37 #: models/transactions.py:38
msgid "transaction templates" msgid "transaction templates"
msgstr "modèles de transaction" msgstr "modèles de transaction"
#: models/transactions.py:45 #: models/transactions.py:46
msgid "source" msgid "source"
msgstr "source" msgstr "source"
#: models/transactions.py:58 #: models/transactions.py:59
msgid "quantity" msgid "quantity"
msgstr "quantité" msgstr "quantité"
#: models/transactions.py:68 #: models/transactions.py:69
msgid "description" msgid "description"
msgstr "description" msgstr "description"
#: models/transactions.py:71 #: models/transactions.py:72
msgid "valid" msgid "valid"
msgstr "valide" msgstr "valide"
#: models/transactions.py:75 #: models/transactions.py:76
msgid "transaction" msgid "transaction"
msgstr "transaction" msgstr "transaction"
#: models/transactions.py:76 #: models/transactions.py:77
msgid "transactions" msgid "transactions"
msgstr "transactions" msgstr "transactions"
#: models/transactions.py:87 #: models/transactions.py:88
msgid "membership transaction" msgid "membership transaction"
msgstr "transaction d'adhésion" msgstr "transaction d'adhésion"
#: models/transactions.py:88 #: models/transactions.py:89
msgid "membership transactions" msgid "membership transactions"
msgstr "transactions d'adhésion" msgstr "transactions d'adhésion"

View File

@ -36,6 +36,10 @@ class Note(PolymorphicModel):
max_length=255, max_length=255,
blank=True, blank=True,
) )
created_at = models.DateTimeField(
verbose_name=_('created at'),
auto_now_add=True,
)
class Meta: class Meta:
verbose_name = _("note") verbose_name = _("note")
@ -50,6 +54,7 @@ class NoteUser(Note):
settings.AUTH_USER_MODEL, settings.AUTH_USER_MODEL,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='note', related_name='note',
verbose_name=_('user'),
) )
class Meta: class Meta:
@ -68,12 +73,16 @@ class NoteClub(Note):
'member.Club', 'member.Club',
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='note', related_name='note',
verbose_name=_('club'),
) )
class Meta: class Meta:
verbose_name = _("club note") verbose_name = _("club note")
verbose_name_plural = _("clubs notes") verbose_name_plural = _("clubs notes")
def __str__(self):
return _("Note for %(club)s club") % {'club': str(self.club)}
class NoteSpecial(Note): class NoteSpecial(Note):
""" """
@ -94,6 +103,9 @@ class NoteSpecial(Note):
verbose_name = _("special note") verbose_name = _("special note")
verbose_name_plural = _("special notes") verbose_name_plural = _("special notes")
def __str__(self):
return self.special_type
class Alias(models.Model): class Alias(models.Model):
""" """