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.
 
 
 
 

103 lines
3.6 KiB

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')