|
@@ -1,6 +1,8 @@
|
|
# -*- coding: utf-8 -*-
|
|
# -*- coding: utf-8 -*-
|
|
from __future__ import unicode_literals
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
|
|
+import logging
|
|
|
|
+
|
|
from django.db import models
|
|
from django.db import models
|
|
from polymorphic import PolymorphicModel
|
|
from polymorphic import PolymorphicModel
|
|
from coin.offers.models import OfferSubscription
|
|
from coin.offers.models import OfferSubscription
|
|
@@ -17,7 +19,7 @@ technical informations of a subscription.
|
|
|
|
|
|
To add a new configuration backend, you have to create a new app with a model
|
|
To add a new configuration backend, you have to create a new app with a model
|
|
which inherit from Configuration.
|
|
which inherit from Configuration.
|
|
-Your model can implement Meta verbose_name to have human readable name and a
|
|
|
|
|
|
+Your model can implement Meta verbose_name to have human readable name and a
|
|
url_namespace variable to specify the url namespace used by this model.
|
|
url_namespace variable to specify the url namespace used by this model.
|
|
"""
|
|
"""
|
|
|
|
|
|
@@ -35,9 +37,9 @@ class Configuration(PolymorphicModel):
|
|
Génère automatiquement la liste de choix possibles de configurations
|
|
Génère automatiquement la liste de choix possibles de configurations
|
|
en fonction des classes enfants de Configuration
|
|
en fonction des classes enfants de Configuration
|
|
"""
|
|
"""
|
|
- return tuple((x().__class__.__name__,x()._meta.verbose_name)
|
|
|
|
|
|
+ return tuple((x().__class__.__name__,x()._meta.verbose_name)
|
|
for x in Configuration.__subclasses__())
|
|
for x in Configuration.__subclasses__())
|
|
-
|
|
|
|
|
|
+
|
|
def model_name(self):
|
|
def model_name(self):
|
|
return self.__class__.__name__
|
|
return self.__class__.__name__
|
|
model_name.short_description = 'Nom du modèle'
|
|
model_name.short_description = 'Nom du modèle'
|
|
@@ -52,7 +54,7 @@ class Configuration(PolymorphicModel):
|
|
Une url doit être nommée "details"
|
|
Une url doit être nommée "details"
|
|
"""
|
|
"""
|
|
from django.core.urlresolvers import reverse
|
|
from django.core.urlresolvers import reverse
|
|
- return reverse('%s:details' % self.get_url_namespace(),
|
|
|
|
|
|
+ return reverse('%s:details' % self.get_url_namespace(),
|
|
args=[str(self.id)])
|
|
args=[str(self.id)])
|
|
|
|
|
|
def get_url_namespace(self):
|
|
def get_url_namespace(self):
|
|
@@ -70,8 +72,38 @@ class Configuration(PolymorphicModel):
|
|
verbose_name = 'configuration'
|
|
verbose_name = 'configuration'
|
|
|
|
|
|
|
|
|
|
|
|
+@receiver(post_save, sender=OfferSubscription)
|
|
|
|
+def offer_subscription_event(sender, **kwargs):
|
|
|
|
+ os = kwargs['instance']
|
|
|
|
+
|
|
|
|
+ if not hasattr(os, 'configuration'):
|
|
|
|
+ config_cls = None
|
|
|
|
+ for subconfig_cls in Configuration.__subclasses__():
|
|
|
|
+ if subconfig_cls().__class__.__name__ == os.offer.configuration_type:
|
|
|
|
+ config_cls = subconfig_cls
|
|
|
|
+ break
|
|
|
|
+
|
|
|
|
+ if config_cls is not None:
|
|
|
|
+ config = config_cls.objects.create(offersubscription=os)
|
|
|
|
+ for offer_ip_pool in os.offer.offerippool_set.order_by('-to_assign'):
|
|
|
|
+ IPSubnet.objects.create(
|
|
|
|
+ configuration=config,
|
|
|
|
+ ip_pool=offer_ip_pool.ip_pool)
|
|
|
|
+ config.save()
|
|
|
|
+
|
|
|
|
+
|
|
@receiver(post_save, sender=IPSubnet)
|
|
@receiver(post_save, sender=IPSubnet)
|
|
|
|
+def subnet_event_save(sender, **kwargs):
|
|
|
|
+ kwargs["signal_type"] = "save"
|
|
|
|
+ subnet_event(sender, **kwargs)
|
|
|
|
+
|
|
|
|
+
|
|
@receiver(post_delete, sender=IPSubnet)
|
|
@receiver(post_delete, sender=IPSubnet)
|
|
|
|
+def subnet_event_delete(sender, **kwargs):
|
|
|
|
+ kwargs["signal_type"] = "delete"
|
|
|
|
+ subnet_event(sender, **kwargs)
|
|
|
|
+
|
|
|
|
+subnet_log = logging.getLogger("coin.subnets")
|
|
def subnet_event(sender, **kwargs):
|
|
def subnet_event(sender, **kwargs):
|
|
"""Fires when a subnet is created, modified or deleted. We tell the
|
|
"""Fires when a subnet is created, modified or deleted. We tell the
|
|
configuration backend to do whatever it needs to do with it.
|
|
configuration backend to do whatever it needs to do with it.
|
|
@@ -105,5 +137,22 @@ def subnet_event(sender, **kwargs):
|
|
config = subnet.configuration
|
|
config = subnet.configuration
|
|
if hasattr(config, 'subnet_event'):
|
|
if hasattr(config, 'subnet_event'):
|
|
config.subnet_event()
|
|
config.subnet_event()
|
|
|
|
+
|
|
|
|
+ offer = config.offersubscription.offer
|
|
|
|
+ member = config.offersubscription.member
|
|
|
|
+ ip = subnet.inet
|
|
|
|
+
|
|
|
|
+ if kwargs['signal_type'] == "save":
|
|
|
|
+ msg = "Allocating IP %s to member %s (%s - %s %s) for offer %s"
|
|
|
|
+ elif kwargs['signal_type'] == "delete":
|
|
|
|
+ msg = "Deallocating IP %s from member %s (%s - %s %s) (was offer %s)"
|
|
|
|
+ else:
|
|
|
|
+ # Does not happens
|
|
|
|
+ msg = ""
|
|
|
|
+
|
|
|
|
+ subnet_log.info(msg % (ip, str(member.pk),
|
|
|
|
+ member.username, member.first_name, member.last_name,
|
|
|
|
+ offer.name))
|
|
|
|
+
|
|
except ObjectDoesNotExist:
|
|
except ObjectDoesNotExist:
|
|
pass
|
|
pass
|