symposion_app/vendor/registrasion/registrasion/admin.py
James Polley fcfdb10ede Display Condition type in list views
* Whether a Flag is disable-if-false or enable-if-true is a very
  important detail
* But one that's easy to get wrong
* And it's hard to spot problems without inspecting every single flag

This change adds the Condition into the various admin list views, so
that it's easier to scan them all for problems and look for inconsistencies.
2017-12-22 18:43:02 +11:00

238 lines
6.3 KiB
Python

from django.contrib import admin
from django.core.exceptions import ObjectDoesNotExist
from django.utils.translation import ugettext_lazy as _
import nested_admin
from registrasion.models import conditions
from registrasion.models import inventory
class EffectsDisplayMixin(object):
def effects(self, obj):
return list(obj.effects())
# Inventory admin
class ProductInline(admin.TabularInline):
model = inventory.Product
@admin.register(inventory.Category)
class CategoryAdmin(admin.ModelAdmin):
model = inventory.Category
fields = ("name", "description", "required", "render_type",
"limit_per_user", "order",)
list_display = ("name", "description")
inlines = [
ProductInline,
]
@admin.register(inventory.Product)
class ProductAdmin(admin.ModelAdmin):
model = inventory.Product
list_display = ("name", "category", "description")
list_filter = ("category", )
# Discounts
class DiscountForProductInline(admin.TabularInline):
model = conditions.DiscountForProduct
verbose_name = _("Product included in discount")
verbose_name_plural = _("Products included in discount")
class DiscountForCategoryInline(admin.TabularInline):
model = conditions.DiscountForCategory
verbose_name = _("Category included in discount")
verbose_name_plural = _("Categories included in discount")
@admin.register(conditions.TimeOrStockLimitDiscount)
class TimeOrStockLimitDiscountAdmin(admin.ModelAdmin, EffectsDisplayMixin):
list_display = (
"description",
"start_time",
"end_time",
"limit",
"effects",
)
ordering = ("start_time", "end_time", "limit")
inlines = [
DiscountForProductInline,
DiscountForCategoryInline,
]
@admin.register(conditions.IncludedProductDiscount)
class IncludedProductDiscountAdmin(admin.ModelAdmin, EffectsDisplayMixin):
def enablers(self, obj):
return list(obj.enabling_products.all())
list_display = ("description", "enablers", "effects")
inlines = [
DiscountForProductInline,
DiscountForCategoryInline,
]
@admin.register(conditions.SpeakerDiscount)
class SpeakerDiscountAdmin(admin.ModelAdmin, EffectsDisplayMixin):
fields = ("description", "is_presenter", "is_copresenter", "proposal_kind")
list_display = ("description", "is_presenter", "is_copresenter", "effects")
ordering = ("-is_presenter", "-is_copresenter")
inlines = [
DiscountForProductInline,
DiscountForCategoryInline,
]
@admin.register(conditions.GroupMemberDiscount)
class GroupMemberDiscountAdmin(admin.ModelAdmin, EffectsDisplayMixin):
fields = ("description", "group")
list_display = ("description", "effects")
inlines = [
DiscountForProductInline,
DiscountForCategoryInline,
]
# Vouchers
class VoucherDiscountInline(nested_admin.NestedStackedInline):
model = conditions.VoucherDiscount
verbose_name = _("Discount")
# TODO work out why we're allowed to add more than one?
max_num = 1
extra = 1
inlines = [
DiscountForProductInline,
DiscountForCategoryInline,
]
class VoucherFlagInline(nested_admin.NestedStackedInline):
model = conditions.VoucherFlag
verbose_name = _("Product and category enabled by voucher")
verbose_name_plural = _("Products and categories enabled by voucher")
# TODO work out why we're allowed to add more than one?
max_num = 1
extra = 1
@admin.register(inventory.Voucher)
class VoucherAdmin(nested_admin.NestedAdmin):
def effects(self, obj):
''' List the effects of the voucher in the admin. '''
out = []
try:
voucher_condition = obj.voucherflag.condition
except ObjectDoesNotExist:
voucher_condition = None
try:
discount_effects = obj.voucherdiscount.effects()
except ObjectDoesNotExist:
discount_effects = None
try:
enabling_effects = obj.voucherflag.effects()
except ObjectDoesNotExist:
enabling_effects = None
if discount_effects:
out.append("Discounts: " + str(list(discount_effects)))
if voucher_condition:
out.append("Condition: " + obj.voucherflag.get_condition_display())
if enabling_effects:
out.append("Enables: " + str(list(enabling_effects)))
return "\n".join(out)
model = inventory.Voucher
list_display = ("recipient", "code", "effects")
inlines = [
VoucherDiscountInline,
VoucherFlagInline,
]
# Enabling conditions
@admin.register(conditions.ProductFlag)
class ProductFlagAdmin(
nested_admin.NestedAdmin,
EffectsDisplayMixin):
def enablers(self, obj):
return list(obj.enabling_products.all())
model = conditions.ProductFlag
fields = ("description", "enabling_products", "condition", "products",
"categories"),
list_display = ("description", "condition", "enablers", "effects")
# Enabling conditions
@admin.register(conditions.CategoryFlag)
class CategoryFlagAdmin(
nested_admin.NestedAdmin,
EffectsDisplayMixin):
model = conditions.CategoryFlag
fields = ("description", "enabling_category", "condition", "products",
"categories"),
list_display = ("description", "condition", "enabling_category", "effects")
ordering = ("enabling_category",)
@admin.register(conditions.SpeakerFlag)
class SpeakerFlagAdmin(nested_admin.NestedAdmin, EffectsDisplayMixin):
model = conditions.SpeakerFlag
fields = ("description", "is_presenter", "is_copresenter", "proposal_kind",
"products", "categories")
list_display = ("description", "is_presenter", "is_copresenter", "effects")
ordering = ("-is_presenter", "-is_copresenter")
@admin.register(conditions.GroupMemberFlag)
class GroupMemberFlagAdmin(admin.ModelAdmin, EffectsDisplayMixin):
fields = ("description", "group", "products", "categories")
list_display = ("description", "condition", "effects")
@admin.register(conditions.TimeOrStockLimitFlag)
class TimeOrStockLimitFlagAdmin(admin.ModelAdmin, EffectsDisplayMixin):
list_display = (
"description",
"condition",
"start_time",
"end_time",
"limit",
"effects",
)
ordering = ("start_time", "end_time", "limit")