mirror of https://gitlab.crans.org/bde/nk20
Polymorphic search
This commit is contained in:
parent
5110d6a16b
commit
1bfcedd4fe
|
@ -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)
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue