class BaseDataMartImage( with_metaclass(deferred.ForeignKeyBuilder, models.Model)): """ ENG: ManyToMany relation from the polymorphic Datamart to a set of images. RUS: Связь многие-ко многим от полиморфной Витрины данных к изображениям. """ image = image.FilerImageField(verbose_name=_('Image')) data_mart = deferred.ForeignKey('BaseDataMart', verbose_name=_('DataMart')) order = models.SmallIntegerField(default=0, blank=False, null=False, db_index=True) class Meta: """ RUS: Метаданные класса. """ abstract = True verbose_name = _("DataMart Image") verbose_name_plural = _("DataMart Images") ordering = ('order', ) def __str__(self): """ RUS: Строковое представление данных. """ return "{}".format(self.image)
class RecipeStep(GenericBaseModel): """ RecipeStep class - inherits from GenericBaseModel This class represents the step for a recipe preparation """ text = models.TextField(verbose_name=_(u'Text'), blank=True, null=True) recipe = models.ForeignKey(Recipe, verbose_name=_(u'Recipe')) order = models.IntegerField(verbose_name=_(u'Order'), blank=True, null=True) duration = models.IntegerField(verbose_name=_(u'Duration (min.)'), blank=True, null=True) image = image.FilerImageField(related_name="recipes_steps", verbose_name=_(u'Image'), null=True, blank=True) def __unicode__(self): ret = self.text[:40] if len(self.text) > 40: ret += "..." return ret class Meta: ordering = ['order', 'id']
class BaseEntityImage(with_metaclass(deferred.ForeignKeyBuilder, models.Model)): """ ENG: ManyToMany relation from the polymorphic Entity to a set of images. RUS: Связь многие-ко многим от полиморфной Сущности к изображениям. """ image = image.FilerImageField(verbose_name=_('Image')) entity = deferred.ForeignKey('BaseEntity', verbose_name=_('Entity')) order = models.SmallIntegerField(default=0, blank=False, null=False, db_index=True) class Meta: """ RUS: Метаданные класса. """ abstract = True verbose_name = _("Entity Image") verbose_name_plural = _("Entity Images") ordering = ('order', ) unique_together = (('image', 'entity'), ) def __str__(self): """ RUS: Строковое представление данных. """ return "{}".format(self.image)
class HoverAnimation(plugin_base.CMSPlugin): static_image = image.FilerImageField( verbose_name=_("static image"), related_name='hoveranimation_staticimage_set') animation = image.FilerImageField( verbose_name=_("animation"), related_name='hoveranimation_animation_set') objects = cmsplugin_filer_utils.FilerPluginManager( select_related=('static_image', 'animation')) def __unicode__(self): if self.static_image: return posixpath.basename(self.static_image.path) elif self.animation: return posixpath.basename(self.animation.path) return "<empty>"
class Commodity(CMSPageReferenceMixin, TranslatableModelMixin, BaseProduct): """ Generic Product Commodity to be used whenever the merchant does not require product specific attributes and just required a placeholder field to add arbitrary data. """ # common product fields product_code = models.CharField(_("Product code"), max_length=255, unique=True) unit_price = MoneyField(_("Unit price"), decimal_places=3, help_text=_("Net price for this product")) # controlling the catalog order = models.PositiveIntegerField(verbose_name=_("Sort by"), db_index=True) cms_pages = models.ManyToManyField( 'cms.Page', through=ProductPage, help_text=_("Choose list view this product shall appear on.")) sample_image = image.FilerImageField( verbose_name=_("Sample Image"), blank=True, null=True, help_text=_("Sample image used in the catalog's list view.")) show_breadcrumb = models.BooleanField( _("Show Breadcrumb"), default=True, help_text=_( "Shall the detail page show the product's breadcrumb.")) placeholder = PlaceholderField("Commodity Details") # translatable fields for the catalog's list- and detail views product_name = TranslatedField() slug = TranslatedField() caption = TranslatedField() # filter expression used to search for a product item using the Select2 widget lookup_fields = ( 'product_code__startswith', 'product_name__icontains', ) objects = ProductManager() class Meta: app_label = app_settings.APP_LABEL ordering = ('order', ) verbose_name = _("Commodity") verbose_name_plural = _("Commodities") def __str__(self): return self.product_code def get_price(self, request): return self.unit_price
class Recipe(GenericBaseModel): """ Recipe class - inherits from GenericBaseModel """ title = models.CharField(max_length=200, verbose_name=_(u'Title')) summary = models.CharField(max_length=500, verbose_name=_(u'Summary'), blank=True, null=True) preparation_time = models.CharField(max_length=100, verbose_name=_(u'Title'), blank=True, null=True) difficulty = models.IntegerField(verbose_name=_(u'Difficulty'), choices=DIFFICULTY_CHOICES) category = models.ForeignKey(Category, verbose_name=_(u'Category')) is_for_vegan = models.BooleanField(verbose_name=_(u'Vegan Friendly'), default=False) is_for_vegetarian = models.BooleanField( verbose_name=_(u'Vegetarian Friendly'), default=False) area = models.ForeignKey(AdministrativeArea, verbose_name=_(u'Area'), null=True, blank=True) country = models.ForeignKey(Country, verbose_name=_(u'Country')) image = image.FilerImageField(related_name="recipes", verbose_name=_(u'Image'), null=True, blank=True) suggested_wine = models.ManyToManyField(Wine, verbose_name=_(u'Suggested Wine'), related_name='recipes', null=True, blank=True) author = models.ForeignKey(User, verbose_name=_(u'Author')) fork_origin = models.ForeignKey('self', verbose_name=_(u'Fork Origin'), blank=True, null=True) #Use django-tagging application here tags = TagField() objects = models.Manager() pub_objects = PublishedManager() veg_objects = VegManager() def __unicode__(self): return self.title class Meta: ordering = ['title']
class Wine(GenericBaseModel): """ Wine class - inherits from GenericBaseModel """ name = models.CharField(max_length=200, verbose_name=_(u'Wine Name')) description = models.TextField(verbose_name=_(u'Wine Description'), null=True, blank=True) image = image.FilerImageField(verbose_name=_(u'Image'), null=True, blank=True) code = models.CharField(max_length=20, verbose_name=_(u'Code')) traditional_code = models.IntegerField(verbose_name=_(u'Traditional Code'), choices=WINE_TRADITIONAL_TYPES, default=1) european_code = models.IntegerField(verbose_name=_(u'EU Code'), choices=WINE_EUROPEAN_TYPES, default=1) place = models.ForeignKey(Location, verbose_name=_(u'Location'), null=True, blank=True) cooperative = models.CharField(max_length=200, verbose_name=_(u'Cooperative'), null=True, blank=True) area = models.ForeignKey(AdministrativeArea, verbose_name=_(u'Area')) suggest_temperature = models.IntegerField( verbose_name=_(u'Temperature(°C)'), null=True, blank=True) estate_bottled = models.BooleanField(verbose_name=_(u'Estate Bottled'), default=False) alcohol_percentage = models.FloatField(verbose_name=_(u'Alcohol(%)')) year = models.IntegerField(verbose_name=_(u'Year')) grape_type = models.ManyToManyField(GrapeType, verbose_name=_(u'Grape Type'), related_name='wines', null=True, blank=True) rating = models.PositiveIntegerField( verbose_name=_(u'Rating'), default=1, help_text=_(u'This field is used wine prices (min=1, max=5)')) kind = models.IntegerField(verbose_name=_(u'Kind'), choices=WINE_KIND_LIST) tags = TagField() def __unicode__(self): return self.name class Meta: ordering = ['name']
class QualityLabel(models.Model): ordering = models.PositiveIntegerField(_("Ordering"), default=10) name = models.CharField(_("Quality Label"), max_length=150, unique=True) logo = image.FilerImageField(on_delete=models.CASCADE) class Meta: verbose_name = _("Quality label") verbose_name_plural = _("Quality lables") def __str__(self): return self.name
class VariantImage(models.Model): image = image.FilerImageField(on_delete=models.CASCADE) product = models.ForeignKey( SofaVariant, on_delete=models.CASCADE, blank=True, ) order = models.SmallIntegerField(default=0) class Meta: abstract = False verbose_name = _("Product Image") verbose_name_plural = _("Product Images") ordering = ['order']
class BaseProductImage(with_metaclass(deferred.ForeignKeyBuilder, models.Model)): """ ManyToMany relation from the polymorphic Product to a set of images. """ image = image.FilerImageField() product = deferred.ForeignKey(BaseProduct) order = models.SmallIntegerField(default=0, blank=False, null=False) class Meta: abstract = True verbose_name = ugettext_lazy("Product Image") verbose_name_plural = ugettext_lazy("Product Images") ordering = ('order', )
class BaseProductImage(models.Model, metaclass=deferred.ForeignKeyBuilder): """ ManyToMany relation from the polymorphic Product to a set of images. """ image = image.FilerImageField(on_delete=models.CASCADE) product = deferred.ForeignKey( BaseProduct, on_delete=models.CASCADE, ) order = models.SmallIntegerField(default=0) class Meta: abstract = True verbose_name = _("Product Image") verbose_name_plural = _("Product Images") ordering = ['order']
class Product(models.Model): name = models.CharField(max_length=120, verbose_name=_('Product name'), ) category = TreeForeignKey(Category, verbose_name=_('Category'), ) feature = models.ForeignKey(Feature, null=True, blank=True) brand = models.ForeignKey(Brands, verbose_name=_('Brand'), ) description = RichTextUploadingField(blank=True, null=True, verbose_name=_('Description'), ) characters = RichTextUploadingField(blank=True, null=True, verbose_name=_('Characters'), ) owner = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('Product Owner'), related_name='products', ) volume = models.ForeignKey(VolumeType, verbose_name=_('Volume type')) updated = models.DateField(auto_now=True, auto_created=True, ) available_in_stock = models.BooleanField(default=True, verbose_name=_('Available in stock')) is_recommended = models.BooleanField(default=False, verbose_name=_('Is recommended')) price = models.DecimalField(decimal_places=2, max_digits=10, verbose_name=_('Price'), null=True, blank=True, ) is_top = models.BooleanField(default=False) image_0 = image.FilerImageField(verbose_name=_('First image'), null=True, related_name='product_image0') image_1 = image.FilerImageField(verbose_name=_('Second image'), null=True, blank=True, related_name='product_image1') image_2 = image.FilerImageField(verbose_name=_('Third image'), null=True, blank=True, related_name='product_image2') default_image = models.CharField(choices=( ('image_0', 'First image', ), ('image_1', 'Second image', ), ('image_2', 'Third image', ), ), max_length=60, default='image_0') def __str__(self): return "{}".format(self.name) def is_color_exist(self, obj): return self.variations.all().first().color def get_default_image(self): return getattr(self, self.default_image) def get_all_images(self): images = list() images.append(self.image_0) if self.image_1: images.append(self.image_1) if self.image_2: images.append(self.image_2) return images def get_price(self): if not self.price: self.price = self.get_default_variation().price self.save() return self.price def get_default_variation(self): return self.variations.first() def get_variations(self): return self.variations.filter(product=self).distinct('name') def get_reviews(self): return self.product_reviews.filter(is_approved=True) def get_absolute_url(self): return reverse('products:product_detail', args=[self.category.slug, self.pk]) class Meta: verbose_name = _('Product') verbose_name_plural = _('Products')
class Commodity(CMSPageReferenceMixin, CommodityMixin, BaseProduct): """ Generic Product Commodity to be used whenever the merchant does not require product specific attributes and just required a placeholder field to add arbitrary data. """ # common product fields product_name = models.CharField( max_length=255, verbose_name=_("Product Name"), ) product_code = models.CharField( _("Product code"), max_length=255, unique=True, ) unit_price = MoneyField( _("Unit price"), decimal_places=3, help_text=_("Net price for this product"), ) # controlling the catalog order = models.PositiveIntegerField( verbose_name=_("Sort by"), db_index=True, ) cms_pages = models.ManyToManyField( 'cms.Page', through=ProductPage, help_text=_("Choose list view this product shall appear on."), ) sample_image = image.FilerImageField( verbose_name=_("Sample Image"), blank=True, null=True, default=None, on_delete=models.SET_DEFAULT, help_text=_("Sample image used in the catalog's list view."), ) show_breadcrumb = models.BooleanField( _("Show Breadcrumb"), default=True, help_text=_( "Shall the detail page show the product's breadcrumb."), ) placeholder = PlaceholderField("Commodity Details") quantity = models.PositiveIntegerField( _("Quantity"), default=0, validators=[MinValueValidator(0)], help_text=_("Available quantity in stock")) # common fields for the catalog's list- and detail views slug = models.SlugField(verbose_name=_("Slug")) caption = HTMLField( verbose_name=_("Caption"), blank=True, null=True, help_text=_("Short description for the catalog list view."), ) # filter expression used to search for a product item using the Select2 widget lookup_fields = ['product_code__startswith', 'product_name__icontains'] objects = BaseProductManager() class Meta: app_label = app_settings.APP_LABEL ordering = ('order', ) verbose_name = _("Commodity") verbose_name_plural = _("Commodities") def __str__(self): return self.product_code