admin.py 2.3 KB

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