from django.db import models from django.contrib.auth import get_user_model from django.contrib.postgres.fields import HStoreField from django.db.models import Avg from django.utils.translation import ugettext_lazy as _ from autoslug import AutoSlugField # Create your models here. from core.models import AbstractStatusModel, AbstractDateTimeModel from products.models import Product OFFER_STATUS_ACTIVE = 25 OFFER_STATUS_INACTIVE = 50 OFFER_STATUS_CHOICES = ( (OFFER_STATUS_ACTIVE, _('Активный')), (OFFER_STATUS_INACTIVE, _('Неактивный')) ) OFFER_DEFAULT_CHOICE = OFFER_STATUS_INACTIVE class SupplyType(AbstractDateTimeModel): name = models.CharField(max_length=255) term = models.ValueRange() class Offer(AbstractStatusModel): product = models.OneToOneField(Product, on_delete=models.CASCADE, primary_key=True) price = models.DecimalField(max_digits=8, decimal_places=2, null=True, default=0.00) currency = models.CharField(max_length=64, blank=True, null=True, default=None) with_nds = models.BooleanField(default=False) # attributes = HStoreField(blank=True, null=True, default={}) suply_type = models.ForeignKey(SupplyType, on_delete=models.SET_NULL, blank=True, null=True) note = models.TextField(blank=True, null=True) status = models.SmallIntegerField(_('статус'), default=OFFER_DEFAULT_CHOICE, choices=OFFER_STATUS_CHOICES) amount = models.IntegerField(blank=True, null=True) def __str__(self): return self.name class Meta: verbose_name = _('Позиция') verbose_name_plural = _('Позиции') # ------------------------------------------ Buying status --------------------------------------------------- # BUYING_STATUS_IN_CART = 25 BUYING_STATUS_PENDING = 50 BUYING_STATUS_BOUGHT = 75 BUYING_STATUS_CHOICES = ( (BUYING_STATUS_IN_CART, _('В корзине')), (BUYING_STATUS_PENDING, _('Обрабатываеться')), (BUYING_STATUS_BOUGHT, _('Куплен')) ) BUYING_DEFAULT_CHOICE = BUYING_STATUS_IN_CART class Buying(AbstractStatusModel): user = models.ForeignKey(get_user_model(), verbose_name=_('пользователь'), on_delete=models.CASCADE) offer = models.ForeignKey(Offer, verbose_name=_('позиция'), on_delete=models.CASCADE) status = models.SmallIntegerField(_('статус'), default=BUYING_DEFAULT_CHOICE, choices=BUYING_STATUS_CHOICES) amount = models.SmallIntegerField(_('колличество'), default=0) class Meta: verbose_name = _('Покупка') verbose_name_plural = _('Покупки') STATUS_GAINED = 0 STATUS_SPENT = 100 CASHBACK_STATUS_CHOICES = ( (STATUS_GAINED, _('заработанный')), (STATUS_SPENT, _('потраченный')), ) STATUS_DEFAULT = STATUS_GAINED class CashBackManager(models.Manager): def get_gained_cashback_sum(self, user): return self.get_queryset().filter(user=user, status=STATUS_GAINED).aggregate(Avg('amount')) def get_spent_cashback_sum(self, user): return self.get_queryset().filter(user=user, status=STATUS_SPENT).aggregate(Avg('amount')) class BuyingCashback(AbstractDateTimeModel): user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE) buying = models.OneToOneField(Buying, on_delete=models.CASCADE) amount = models.DecimalField(_('Сумма'), 'cashback', 7, 2, default=0) status = models.SmallIntegerField(_('статус'), default=STATUS_DEFAULT, choices=CASHBACK_STATUS_CHOICES) objects = CashBackManager() class Meta: verbose_name_plural = _('cashback') verbose_name = _('cashback')