django-orchestra-test/orchestra/apps/miscellaneous/admin.py

79 lines
2.9 KiB
Python
Raw Normal View History

2014-07-16 15:20:16 +00:00
from django.contrib import admin
from django.core.urlresolvers import reverse
from django.db import models
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
2014-10-24 14:19:34 +00:00
from orchestra.admin import ExtendedModelAdmin
2014-07-16 15:20:16 +00:00
from orchestra.apps.accounts.admin import AccountAdminMixin
from .models import MiscService, Miscellaneous
2014-11-12 16:33:40 +00:00
from orchestra.apps.plugins.admin import SelectPluginAdminMixin, PluginAdapter
class MiscServicePlugin(PluginAdapter):
model = MiscService
name_field = 'name'
2014-10-24 14:19:34 +00:00
class MiscServiceAdmin(ExtendedModelAdmin):
list_display = ('name', 'verbose_name', 'num_instances', 'has_amount', 'is_active')
list_editable = ('has_amount', 'is_active')
list_filter = ('has_amount', 'is_active')
fields = ('verbose_name', 'name', 'description', 'has_amount', 'is_active')
prepopulated_fields = {'name': ('verbose_name',)}
change_readonly_fields = ('name',)
2014-07-16 15:20:16 +00:00
def num_instances(self, misc):
""" return num slivers as a link to slivers changelist view """
2014-07-22 21:47:01 +00:00
num = misc.instances__count
2014-07-16 15:20:16 +00:00
url = reverse('admin:miscellaneous_miscellaneous_changelist')
url += '?service={}'.format(misc.pk)
return mark_safe('<a href="{0}">{1}</a>'.format(url, num))
num_instances.short_description = _("Instances")
num_instances.admin_order_field = 'instances__count'
def get_queryset(self, request):
qs = super(MiscServiceAdmin, self).queryset(request)
return qs.annotate(models.Count('instances', distinct=True))
2014-11-12 16:33:40 +00:00
class MiscellaneousAdmin(AccountAdminMixin, SelectPluginAdminMixin, admin.ModelAdmin):
2014-10-24 14:19:34 +00:00
list_display = ('service', 'amount', 'active', 'account_link')
2014-11-12 16:33:40 +00:00
plugin_field = 'service'
plugin = MiscServicePlugin
2014-07-18 15:32:27 +00:00
2014-11-12 16:33:40 +00:00
def get_service(self, obj):
2014-07-18 15:32:27 +00:00
if obj is None:
2014-11-12 16:33:40 +00:00
return self.plugin.get_plugin(self.plugin_value)().instance
else:
return obj.service
def get_fields(self, request, obj=None):
fields = ['account', 'description', 'is_active']
if obj is not None:
fields = ['account_link', 'description', 'is_active']
service = self.get_service(obj)
if service.has_amount:
fields.insert(-1, 'amount')
# if service.has_identifier:
# fields.insert(1, 'identifier')
return fields
def get_form(self, request, obj=None, **kwargs):
form = super(SelectPluginAdminMixin, self).get_form(request, obj=obj, **kwargs)
service = self.get_service(obj)
def clean_identifier(self, service=service):
validator = settings.MISCELLANEOUS_IDENTIFIER_VALIDATORS.get(service.name, None)
if validator:
validator(self.cleaned_data['identifier'])
form.clean_identifier = clean_identifier
return form
2014-07-16 15:20:16 +00:00
admin.site.register(MiscService, MiscServiceAdmin)
admin.site.register(Miscellaneous, MiscellaneousAdmin)