You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.0 KiB
76 lines
2.0 KiB
from datetime import datetime
|
|
|
|
from django.db import models
|
|
from store.models import ProductVariation
|
|
|
|
|
|
def get_change(current, previous):
|
|
if current == previous:
|
|
return 100.0
|
|
try:
|
|
return (abs(current - previous) / previous) * 100.0
|
|
except ZeroDivisionError:
|
|
return 0
|
|
|
|
|
|
class DTYSModel(models.Model):
|
|
product = models.ForeignKey(ProductVariation)
|
|
|
|
price_start = models.IntegerField()
|
|
price_end = models.IntegerField()
|
|
price_stopped = models.IntegerField(default=0)
|
|
|
|
start_date = models.DateField()
|
|
start_time = models.TimeField()
|
|
|
|
end_date = models.DateField()
|
|
end_time = models.TimeField()
|
|
|
|
is_stopped = models.BooleanField(default=False)
|
|
is_public = models.BooleanField(default=False)
|
|
|
|
@property
|
|
def end_datetime(self):
|
|
return datetime.combine(self.end_date, self.end_time)
|
|
|
|
@property
|
|
def start_datetime(self):
|
|
return datetime.combine(self.start_date, self.start_time)
|
|
|
|
def get_price_diff(self):
|
|
return self.price_start - self.price_end
|
|
|
|
def _time_percent(self):
|
|
time_percent = get_change(
|
|
self.get_delta_now(),
|
|
self.get_date_delta()
|
|
)
|
|
return time_percent
|
|
|
|
def get_delta_now(self):
|
|
"""in seconds"""
|
|
from django.utils import timezone as tz
|
|
_now = tz.now()
|
|
return (self.end_datetime - _now).total_seconds()
|
|
|
|
def get_date_delta(self):
|
|
""" in seconds """
|
|
return (self.end_datetime - self.start_datetime).total_seconds()
|
|
|
|
def get_current_price(self):
|
|
dec_from_price = (self.get_price_diff() * (self._time_percent() / 100))
|
|
price_current = self.price_start - dec_from_price
|
|
|
|
return price_current
|
|
|
|
def current_price_format(self):
|
|
return "%.1f" % self.get_current_price()
|
|
|
|
def stop(self):
|
|
"""Stop this DTYS"""
|
|
self.is_stopped = True
|
|
|
|
if not self.price_stopped:
|
|
self.price_stopped = max(self.price_end, self.get_current_price())
|
|
|
|
self.save()
|
|
|