"""Product app models.""" from django.db import models from django.contrib.postgres.fields import JSONField from django.utils.translation import gettext_lazy as _ from utils.models import (BaseAttributes, ProjectBaseMixin, TranslatedFieldsMixin, TJSONField) class ProductType(TranslatedFieldsMixin, ProjectBaseMixin): """ProductType model.""" name = TJSONField(blank=True, null=True, default=None, verbose_name=_('Name'), help_text='{"en-GB":"some text"}') index_name = models.CharField(max_length=50, unique=True, db_index=True, verbose_name=_('Index name')) use_subtypes = models.BooleanField(_('Use subtypes'), default=True) class Meta: """Meta class.""" verbose_name = _('Product type') verbose_name_plural = _('Product types') class ProductSubType(TranslatedFieldsMixin, ProjectBaseMixin): """ProductSubtype model.""" product_type = models.ForeignKey(ProductType, on_delete=models.CASCADE, related_name='subtypes', verbose_name=_('Product type')) name = TJSONField(blank=True, null=True, default=None, verbose_name=_('Name'), help_text='{"en-GB":"some text"}') index_name = models.CharField(max_length=50, unique=True, db_index=True, verbose_name=_('Index name')) class Meta: """Meta class.""" verbose_name = _('Product type') verbose_name_plural = _('Product types') class ProductManager(models.Manager): """Extended manager for Product model.""" class ProductQuerySet(models.QuerySet): """Product queryset.""" def common(self): return self.filter(category=self.model.COMMON) def online(self): return self.filter(category=self.model.ONLINE) class Product(TranslatedFieldsMixin, BaseAttributes): """Product models.""" COMMON = 0 ONLINE = 1 CATEGORY_CHOICES = ( (COMMON, _('Common')), (ONLINE, _('Online')), ) category = models.PositiveIntegerField(choices=CATEGORY_CHOICES, default=COMMON) name = TJSONField(_('Name'), null=True, blank=True, default=None, help_text='{"en-GB":"some text"}') description = TJSONField(_('Description'), null=True, blank=True, default=None, help_text='{"en-GB":"some text"}') characteristics = JSONField(_('Characteristics')) country = models.ForeignKey('location.Country', on_delete=models.PROTECT, verbose_name=_('Country')) available = models.BooleanField(_('Available'), default=True) type = models.ForeignKey(ProductType, on_delete=models.PROTECT, related_name='products', verbose_name=_('Type')) subtypes = models.ManyToManyField(ProductSubType, related_name='products', verbose_name=_('Subtypes')) objects = ProductManager.from_queryset(ProductQuerySet)() class Meta: """Meta class.""" verbose_name = _('Product') verbose_name_plural = _('Products') class OnlineProductManager(ProductManager): """Extended manger for OnlineProduct model.""" def get_queryset(self): """Overrided get_queryset method.""" return super().get_queryset().online() class OnlineProduct(Product): """Online product.""" objects = OnlineProductManager.from_queryset(ProductQuerySet)() class Meta: """Meta class.""" proxy = True verbose_name = _('Online product') verbose_name_plural = _('Online products')