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): """Drop `Til You Shop 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_dec_by_sec(self): return "%.1f" % (self.get_price_diff() / self.get_date_delta()) 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()