Browse Source

Filter offersubscription select field of configuration childs form in admin to avoid wrong choices

Fabs 10 years ago
parent
commit
bb52609953

+ 14 - 3
coin/configuration/admin.py

@@ -1,9 +1,17 @@
 # -*- coding: utf-8 -*-
 from django.contrib import admin
-from coin.configuration.models import Configuration
 from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin
 
-class ConfigurationAdmin(PolymorphicParentModelAdmin):
+from coin.configuration.models import Configuration
+from coin.configuration.forms import ConfigurationForm
+
+"""
+Implementation note : When creating child admin class, you have to inherit
+ConfigurationAdminFormMixin. This make use of ConfigurationForm form that
+filter offersubscription select input to avoid selecting wrong subscription.
+"""
+
+class ParentConfigurationAdmin(PolymorphicParentModelAdmin):
     base_model = Configuration
     polymorphic_list = True
     list_display = ('model_name','configuration_type_name', 'offersubscription', 'offer_subscription_member')
@@ -21,4 +29,7 @@ class ConfigurationAdmin(PolymorphicParentModelAdmin):
         """
         return (tuple((x.base_model, x) for x in PolymorphicChildModelAdmin.__subclasses__()))
 
-admin.site.register(Configuration, ConfigurationAdmin)
+class ConfigurationAdminFormMixin(object):
+    form = ConfigurationForm
+
+admin.site.register(Configuration, ParentConfigurationAdmin)

+ 26 - 0
coin/configuration/forms.py

@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+
+from django.forms import ModelForm
+from django.db.models import Q
+
+from coin.offers.models import OfferSubscription
+from coin.configuration.models import Configuration
+
+
+class ConfigurationForm(ModelForm):
+
+    class Meta:
+        model = Configuration
+
+    def __init__(self, *args, **kwargs):
+        """
+        This filter the offersubscription select field in configurations forms
+        to only display subscription that are the sames type of actual configuration
+        and that haven't already a configuration associated with
+        """
+        super(ConfigurationForm, self).__init__(*args, **kwargs)
+        if self.instance:
+            queryset = OfferSubscription.objects.filter(
+                Q(offer__configuration_type=self.instance.model_name) & (
+                Q(configuration=None) | Q(configuration=self.instance.pk)))
+            self.fields['offersubscription'].queryset = queryset

+ 1 - 1
coin/configuration/models.py

@@ -56,4 +56,4 @@ class Configuration(PolymorphicModel):
         if self.url_namespace:
             return self.url_namespace
         else:
-            return self.model_name().lower()
+            return self.model_name().lower()

+ 0 - 8
coin/offers/backends.py

@@ -4,7 +4,6 @@
 repetitive tasks."""
 
 from django.core.exceptions import ValidationError
-from django.db.models import Q
 
 from coin.offers.models import OfferSubscription
 
@@ -32,10 +31,3 @@ class ValidateBackendType(object):
             raise ValidationError('Administrative subscription must have a "{}" backend.'.format(self.backend))
 
 
-def filter_subscriptions(backend_name, instance):
-    """Helper function for configuration backends, allowing to filter
-    subscriptions that have the right """
-    return Q(offer__backend=backend_name) & (
-        # Select "unassociated" subscriptions, plus our own
-        # subscription (in case we are editing the object).
-        Q((backend_name, None)) | Q((backend_name, instance.pk)))

+ 2 - 4
coin/vpn/admin.py

@@ -3,7 +3,7 @@ from django.contrib import admin
 from polymorphic.admin import PolymorphicChildModelAdmin
 
 from coin.vpn.models import VPNConfiguration
-# from coin.vpn.forms import VPNConfigurationForm
+from coin.configuration.admin import ConfigurationAdminFormMixin
 
 
 class VPNConfigurationInline(admin.StackedInline):
@@ -12,7 +12,7 @@ class VPNConfigurationInline(admin.StackedInline):
     readonly_fields = ['configuration_ptr']
 
 
-class VPNConfigurationAdmin(PolymorphicChildModelAdmin):
+class VPNConfigurationAdmin(ConfigurationAdminFormMixin, PolymorphicChildModelAdmin):
     base_model = VPNConfiguration
     list_display = ('offersubscription', 'activated', 'login',
                     'ipv4_endpoint', 'ipv6_endpoint', 'comment')
@@ -27,8 +27,6 @@ class VPNConfigurationAdmin(PolymorphicChildModelAdmin):
     exclude = ("password",)
     inline = VPNConfigurationInline
 
-    # form = VPNConfigurationForm
-
     def get_readonly_fields(self, request, obj=None):
         if obj:
             return ['login',]

+ 0 - 21
coin/vpn/forms.py

@@ -1,21 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from django.forms import ModelForm
-
-from coin.offers.models import OfferSubscription
-from coin.offers.backends import filter_subscriptions
-from coin.vpn.models import VPNConfiguration
-
-
-# class VPNConfigurationForm(ModelForm):
-
-#     class Meta:
-#         model = VPNConfiguration
-
-#     def __init__(self, *args, **kwargs):
-#         super(VPNConfigurationForm, self).__init__(*args, **kwargs)
-#         if self.instance:
-#             query = filter_subscriptions(self.instance.backend_name,
-#                                          self.instance)
-#             queryset = OfferSubscription.objects.filter(query)
-#             self.fields['administrative_subscription'].queryset = queryset

+ 5 - 1
coin/vpn/models.py

@@ -15,7 +15,11 @@ from coin import validation
 
 class VPNConfiguration(CoinLdapSyncMixin, Configuration):
     url_namespace = "vpn"
-
+    # backend_name = "openvpn_ldap"
+    # administrative_subscription = models.OneToOneField(
+    #     'offers.OfferSubscription',
+    #     related_name=backend_name,
+    #     validators=[ValidateBackendType(backend_name)])
     activated = models.BooleanField(default=False)
     login = models.CharField(max_length=50, unique=True, blank=True,
                              help_text="leave empty for automatic generation")