Can order a generic product now

This commit is contained in:
Nico Schottelius 2020-09-28 21:59:35 +02:00
commit 8d8c4d660c
4 changed files with 135 additions and 46 deletions

View file

@ -563,14 +563,22 @@ class Order(models.Model):
starting_date = models.DateTimeField(default=timezone.now)
ending_date = models.DateTimeField(blank=True, null=True)
# FIXME: ensure the period is defined in the product
recurring_period = models.IntegerField(choices = RecurringPeriod.choices,
default = RecurringPeriod.PER_30D)
price = models.DecimalField(default=0.0,
one_time_price = models.DecimalField(default=0.0,
max_digits=AMOUNT_MAX_DIGITS,
decimal_places=AMOUNT_DECIMALS,
validators=[MinValueValidator(0)])
recurring_price = models.DecimalField(default=0.0,
max_digits=AMOUNT_MAX_DIGITS,
decimal_places=AMOUNT_DECIMALS,
validators=[MinValueValidator(0)])
currency = models.CharField(max_length=32, choices=Currency.choices, default=Currency.CHF)
replaces = models.ForeignKey('self',
related_name='replaced_by',
on_delete=models.CASCADE,
@ -768,6 +776,33 @@ class Order(models.Model):
starting_date=starting_date,
ending_date=ending_date)
def save(self, *args, **kwargs):
one_time_price = 0
recurring_price = 0
# FIXME: support amount independent one time prices
# FIXME: support a base price
if 'features' in self.product.config:
for feature in self.product.config['features']:
# FIXME: support optional features (?)
if not feature in self.config['features']:
raise ValidationError(f"Configuration is missing feature {feature}")
one_time_price += self.product.config['features'][feature]['one_time_price'] * self.config['features'][feature]
recurring_price += self.product.config['features'][feature]['recurring_price'] * self.config['features'][feature]
# IMMUTABLE fields -- need to create new order to modify them
# However this is not enforced here...
if self._state.adding:
self.one_time_price = one_time_price
self.recurring_price = recurring_price
super().save(*args, **kwargs)
def __str__(self):
return f"{self.description} (order={self.id})"