admin.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.contrib import admin
  4. from django.utils.translation import ugettext_lazy as _
  5. from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin
  6. from coin.resources.models import IPSubnet
  7. from coin.configuration.models import Configuration
  8. from coin.configuration.forms import ConfigurationForm
  9. """
  10. Implementation note : When creating child admin class, you have to inherit
  11. ConfigurationAdminFormMixin. This make use of ConfigurationForm form that
  12. filter offersubscription select input to avoid selecting wrong subscription.
  13. """
  14. class IPSubnetInline(admin.TabularInline):
  15. model = IPSubnet
  16. extra = 0
  17. class ParentConfigurationAdmin(PolymorphicParentModelAdmin):
  18. base_model = Configuration
  19. polymorphic_list = True
  20. list_display = ('model_name','configuration_type_name', 'offersubscription', 'offer_subscription_member')
  21. def offer_subscription_member(self, config):
  22. return config.offersubscription.member
  23. offer_subscription_member.short_description = _("Member")
  24. def get_child_models(self):
  25. """
  26. Renvoi la liste des modèles enfants de Configuration
  27. ex :((VPNConfiguration, VPNConfigurationAdmin),
  28. (ADSLConfiguration, ADSLConfigurationAdmin))
  29. """
  30. return (tuple((x.base_model, x) for x in PolymorphicChildModelAdmin.__subclasses__()))
  31. def get_urls(self):
  32. """
  33. Fix a django-polymorphic bug that randomly set wrong url for a child
  34. model in admin.
  35. This remove somes dummy urls that have not to be returned by the parent model
  36. https://github.com/chrisglass/django_polymorphic/issues/105
  37. """
  38. urls = super(ParentConfigurationAdmin, self).get_urls()
  39. for model, _ in self.get_child_models():
  40. admin = self._get_real_admin_by_model(model)
  41. for admin_url in admin.get_urls():
  42. for url in urls:
  43. if url.name == admin_url.name:
  44. urls.remove(url)
  45. return urls
  46. class ConfigurationAdminFormMixin(object):
  47. base_form = ConfigurationForm
  48. # For each child (admin object for configurations), this will display
  49. # an inline form to assign IP addresses.
  50. inlines = (IPSubnetInline, )
  51. admin.site.register(Configuration, ParentConfigurationAdmin)