begin refactor product to user orders instead of single order

Signed-off-by: Nico Schottelius <nico@nico-notebook.schottelius.org>
This commit is contained in:
Nico Schottelius 2020-08-09 14:38:10 +02:00
commit 8df1d8dc7c
10 changed files with 224 additions and 90 deletions

View file

@ -53,6 +53,10 @@ def end_of_this_month():
_, last_day = monthrange(a_day.year, a_day.month)
return a_day.replace(day=last_day,hour=23,minute=59,second=59, microsecond=0)
def end_before(a_date):
""" Return suitable datetimefield for ending just before a_date """
return a_date - datetime.timedelta(seconds=1)
def default_payment_delay():
return timezone.now() + BILL_PAYMENT_DELAY
@ -363,30 +367,7 @@ class Order(models.Model):
super().save(*args, **kwargs)
def __str__(self):
return f"{self.description} (order {self.id})"
# def active_before(self, ending_date):
# # Was this order started before the specified ending date?
# if self.starting_date <= ending_date:
# if self.ending_date:
# if self.ending_date > ending_date:
# pass
# Termination needs to be verified, maybe also include checking depending orders
# @property
# def is_terminated_now(self):
# return self.is_terminated_at(timezone.now())
# def is_terminated_at(self, a_date):
# return self.ending_date != None and self.ending_date <= a_date
# def terminate(self):
# if not self.is_terminated:
# self.ending_date = timezone.now()
# self.save()
return f"{self.description} (order={self.id})"
class Bill(models.Model):
"""
@ -433,6 +414,14 @@ class Bill(models.Model):
bill_records = BillRecord.objects.filter(bill=self)
return sum([ br.sum for br in bill_records ])
@classmethod
def create_bills_for_all_users(cls):
"""
Create bills for all users
"""
for owner in get_user_model().objects.all():
cls.create_next_bills_for_user(owner)
@classmethod
def create_next_bills_for_user(cls, owner, ending_date=None):
@ -578,14 +567,6 @@ class Bill(models.Model):
return bill
@classmethod
def create_all_bills(cls):
for owner in get_user_model().objects.all():
# mintime = time of first order
# maxtime = time of last order
# iterate month based through it
cls.create_next_bill_for_user(owner)
class BillRecord(models.Model):
"""
@ -633,10 +614,19 @@ class Product(UncloudModel):
description = "Generic Product"
order = models.ForeignKey(Order,
on_delete=models.CASCADE,
editable=True,
null=True)
orders = models.ManyToManyField(Order)
# one_time_order = models.ForeignKey(Order,
# on_delete=models.CASCADE,
# editable=True,
# null=True,
# related_name='product_one_time')
# recurring_order = models.ForeignKey(Order,
# on_delete=models.CASCADE,
# editable=True,
# null=True,
# related_name='product_recurring')
# FIXME: editable=True -> is in the admin, but also editable in DRF
status = models.CharField(max_length=32,
@ -691,12 +681,10 @@ class Product(UncloudModel):
if not when_to_start:
when_to_start = timezone.now()
if not self.order:
self.create_order_at(when_to_start, recurring_period)
else:
# Update order = create new order
if self.order:
previous_order = self.order
when_to_end = when_to_start - datetime.timedelta(seconds=1)
when_to_end = end_before(when_to_start)
new_order = Order.objects.create(owner=self.owner,
billing_address=self.order.billing_address,
@ -706,11 +694,15 @@ class Product(UncloudModel):
description=str(self),
replaces=self.order)
print(new_order)
self.order.end_date = when_to_end
self.order.save()
self.order = new_order
else:
return self.create_order_at(when_to_start, recurring_period)
@property
def recurring_price(self):
""" implement correct values in the child class """