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(verbose_name="Начальная цена") price_end = models.IntegerField(verbose_name="Конечная цена (минимальная)") price_stopped = models.IntegerField(verbose_name="Прайс заказа", default=0) start_date = models.DateField(verbose_name='Дата начала') start_time = models.TimeField(verbose_name='Время начала') end_date = models.DateField(verbose_name='Дата окончания') end_time = models.TimeField(verbose_name='Время окончания') is_stopped = models.BooleanField(verbose_name="Остановлен", default=False) is_public = models.BooleanField(verbose_name="Опубликован", default=False) is_ordered = models.BooleanField(verbose_name="Заказан", 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 self.price_stopped == 0: self.price_stopped = max(self.price_end, self.get_current_price()) self.save()