|
@@ -46,6 +46,7 @@ class AbstractResource(AbstractItem):
|
|
UNIT_U = 'u'
|
|
UNIT_U = 'u'
|
|
UNIT_IPV4 = 'ipv4'
|
|
UNIT_IPV4 = 'ipv4'
|
|
UNIT_ETHERNET_PORT = 'eth'
|
|
UNIT_ETHERNET_PORT = 'eth'
|
|
|
|
+ UNIT_SERVICE = 'services'
|
|
|
|
|
|
capacity_unit = models.CharField(
|
|
capacity_unit = models.CharField(
|
|
max_length=10,
|
|
max_length=10,
|
|
@@ -55,6 +56,7 @@ class AbstractResource(AbstractItem):
|
|
(UNIT_U, 'U'),
|
|
(UNIT_U, 'U'),
|
|
(UNIT_IPV4, 'IPv4'),
|
|
(UNIT_IPV4, 'IPv4'),
|
|
(UNIT_ETHERNET_PORT, 'ports'),
|
|
(UNIT_ETHERNET_PORT, 'ports'),
|
|
|
|
+ (UNIT_SERVICE, 'services'),
|
|
),
|
|
),
|
|
blank=True,
|
|
blank=True,
|
|
)
|
|
)
|
|
@@ -214,7 +216,7 @@ class GoodUse(AbstractUse):
|
|
return monthly_share/subscriptions_count
|
|
return monthly_share/subscriptions_count
|
|
|
|
|
|
|
|
|
|
-class Service(AbstractItem):
|
|
|
|
|
|
+class Service(AbstractResource):
|
|
""" A service we sell
|
|
""" A service we sell
|
|
|
|
|
|
(considered monthly)
|
|
(considered monthly)
|
|
@@ -227,13 +229,28 @@ class Service(AbstractItem):
|
|
Good,
|
|
Good,
|
|
through=GoodUse,
|
|
through=GoodUse,
|
|
related_name='using_services')
|
|
related_name='using_services')
|
|
- # services = models.ManyToMany('Service') #TODO
|
|
|
|
|
|
|
|
subscriptions_count = models.PositiveIntegerField(default=0)
|
|
subscriptions_count = models.PositiveIntegerField(default=0)
|
|
|
|
+ reusable = models.BooleanField(
|
|
|
|
+ "Ré-utilisable", default=False,
|
|
|
|
+ help_text="Peut-être utilisé par d'autres services")
|
|
|
|
+
|
|
|
|
+ @property
|
|
|
|
+ def price(self):
|
|
|
|
+ return self.get_prices()['total_costs_price']
|
|
|
|
+
|
|
|
|
+ def save(self, *args, **kwargs):
|
|
|
|
+ if self.reusable:
|
|
|
|
+ self.capacity_unit = self.UNIT_SERVICE
|
|
|
|
+ self.total_capacity = self.subscriptions_count
|
|
|
|
+ return super().save(*args, **kwargs)
|
|
|
|
|
|
def get_absolute_url(self):
|
|
def get_absolute_url(self):
|
|
return reverse('detail-service', kwargs={'pk': self.pk})
|
|
return reverse('detail-service', kwargs={'pk': self.pk})
|
|
|
|
|
|
|
|
+ def get_use_class(self):
|
|
|
|
+ return ServiceUse
|
|
|
|
+
|
|
def get_prices(self):
|
|
def get_prices(self):
|
|
costs_uses = CostUse.objects.filter(service=self)
|
|
costs_uses = CostUse.objects.filter(service=self)
|
|
goods_uses = GoodUse.objects.filter(service=self)
|
|
goods_uses = GoodUse.objects.filter(service=self)
|
|
@@ -258,3 +275,15 @@ class Service(AbstractItem):
|
|
'total_goods_value_share': total_goods_value_share,
|
|
'total_goods_value_share': total_goods_value_share,
|
|
'unit_goods_value_share': unit_goods_value_share,
|
|
'unit_goods_value_share': unit_goods_value_share,
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def validate_reusable_service(v):
|
|
|
|
+ if not Service.objects.get(pk=v).reusable:
|
|
|
|
+ raise ValidationError('{} is not a reusable service'.format(v))
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class ServiceUse(AbstractUse):
|
|
|
|
+ resource = models.ForeignKey(
|
|
|
|
+ Service, related_name='dependent_services',
|
|
|
|
+ limit_choices_to={'reusable': True},
|
|
|
|
+ validators=[validate_reusable_service])
|