admin.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.contrib import admin
  4. from polymorphic.admin import PolymorphicChildModelAdmin
  5. from coin.vpn.models import VPNConfiguration
  6. from coin.configuration.admin import ConfigurationAdminFormMixin, IPSubnetInline
  7. from coin.utils import delete_selected
  8. class VPNConfigurationInline(admin.StackedInline):
  9. model = VPNConfiguration
  10. # fk_name = 'offersubscription'
  11. exclude = ('password',)
  12. readonly_fields = ['configuration_ptr', 'login']
  13. class VPNConfigurationAdmin(ConfigurationAdminFormMixin, PolymorphicChildModelAdmin):
  14. base_model = VPNConfiguration
  15. list_display = ('offersubscription', 'activated', 'login',
  16. 'ipv4_endpoint', 'ipv6_endpoint', 'comment')
  17. list_filter = ('activated',)
  18. search_fields = ('login', 'comment',
  19. # TODO: searching on member directly doesn't work
  20. 'offersubscription__member__first_name',
  21. 'offersubscription__member__last_name',
  22. 'offersubscription__member__email')
  23. actions = (delete_selected, "generate_endpoints", "generate_endpoints_v4",
  24. "generate_endpoints_v6", "activate", "deactivate")
  25. exclude = ("password",)
  26. inline = VPNConfigurationInline
  27. # TODO: this should be done in the generic configuration admin.
  28. inlines = (IPSubnetInline, )
  29. def get_readonly_fields(self, request, obj=None):
  30. if obj:
  31. return ['login',]
  32. else:
  33. return []
  34. def set_activation(self, request, queryset, value):
  35. count = 0
  36. # We must update each object individually, because we want to run
  37. # the save() method to update the backend.
  38. for vpn in queryset:
  39. if vpn.activated != value:
  40. vpn.activated = value
  41. vpn.full_clean()
  42. vpn.save()
  43. count += 1
  44. action = "activated" if value else "deactivated"
  45. msg = "{} VPN subscription(s) {}.".format(count, action)
  46. self.message_user(request, msg)
  47. def activate(self, request, queryset):
  48. self.set_activation(request, queryset, True)
  49. activate.short_description = "Activate selected VPNs"
  50. def deactivate(self, request, queryset):
  51. self.set_activation(request, queryset, False)
  52. deactivate.short_description = "Deactivate selected VPNs"
  53. def generate_endpoints_generic(self, request, queryset, v4=True, v6=True):
  54. count = 0
  55. for vpn in queryset:
  56. if vpn.generate_endpoints(v4, v6):
  57. vpn.full_clean()
  58. vpn.save()
  59. count += 1
  60. msg = "{} VPN subscription(s) updated.".format(count)
  61. self.message_user(request, msg)
  62. def generate_endpoints(self, request, queryset):
  63. self.generate_endpoints_generic(request, queryset)
  64. generate_endpoints.short_description = "Generate IPv4 and IPv6 endpoints"
  65. def generate_endpoints_v4(self, request, queryset):
  66. self.generate_endpoints_generic(request, queryset, v6=False)
  67. generate_endpoints_v4.short_description = "Generate IPv4 endpoints"
  68. def generate_endpoints_v6(self, request, queryset):
  69. self.generate_endpoints_generic(request, queryset, v4=False)
  70. generate_endpoints_v6.short_description = "Generate IPv6 endpoints"
  71. admin.site.register(VPNConfiguration, VPNConfigurationAdmin)