kopia lustrzana https://github.com/longclawshop/longclaw
rodzic
e87c3faca3
commit
a34edc0088
|
@ -21,7 +21,7 @@ class ProductBase(Page):
|
||||||
def price_range(self):
|
def price_range(self):
|
||||||
''' Calculate the price range of the products variants
|
''' Calculate the price range of the products variants
|
||||||
'''
|
'''
|
||||||
ordered = self.variants.order_by('price')
|
ordered = self.variants.order_by('base_price')
|
||||||
if ordered:
|
if ordered:
|
||||||
return ordered.first().price, ordered.last().price
|
return ordered.first().price, ordered.last().price
|
||||||
else:
|
else:
|
||||||
|
@ -39,7 +39,7 @@ class ProductVariantBase(models.Model):
|
||||||
"""
|
"""
|
||||||
Base model for creating product variants
|
Base model for creating product variants
|
||||||
"""
|
"""
|
||||||
price = models.DecimalField(max_digits=12, decimal_places=2)
|
base_price = models.DecimalField(max_digits=12, decimal_places=2)
|
||||||
ref = models.CharField(max_length=32)
|
ref = models.CharField(max_length=32)
|
||||||
stock = models.IntegerField(default=0)
|
stock = models.IntegerField(default=0)
|
||||||
|
|
||||||
|
@ -52,7 +52,24 @@ class ProductVariantBase(models.Model):
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return self.ref
|
return self.ref
|
||||||
|
|
||||||
|
@property
|
||||||
|
def price(self):
|
||||||
|
"""Can be overridden in concrete implementations in
|
||||||
|
order to generate the price dynamically.
|
||||||
|
|
||||||
|
Override the property like so:
|
||||||
|
|
||||||
|
@ProductVariantBase.price.getter
|
||||||
|
def price(self):
|
||||||
|
...
|
||||||
|
|
||||||
|
"""
|
||||||
|
return self.base_price
|
||||||
|
|
||||||
def get_product_title(self):
|
def get_product_title(self):
|
||||||
|
"""Retrieve the title of the related product.
|
||||||
|
If no related product, just return the ``ref`` of this model
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
return self.product.title
|
return self.product.title
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
|
|
|
@ -14,6 +14,7 @@ class TestProducts(WagtailPageTests):
|
||||||
|
|
||||||
def test_variant_price(self):
|
def test_variant_price(self):
|
||||||
variant = ProductVariantFactory()
|
variant = ProductVariantFactory()
|
||||||
|
self.assertTrue(variant.price == variant.base_price * 10)
|
||||||
self.assertTrue(variant.price > 0)
|
self.assertTrue(variant.price > 0)
|
||||||
|
|
||||||
def test_price_range(self):
|
def test_price_range(self):
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.11.5 on 2017-09-17 12:47
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('products', '0004_auto_20170903_1132'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='productvariant',
|
||||||
|
old_name='price',
|
||||||
|
new_name='base_price',
|
||||||
|
),
|
||||||
|
]
|
|
@ -16,15 +16,18 @@ class Product(ProductBase):
|
||||||
description = RichTextField()
|
description = RichTextField()
|
||||||
content_panels = ProductBase.content_panels + [
|
content_panels = ProductBase.content_panels + [
|
||||||
FieldPanel('description'),
|
FieldPanel('description'),
|
||||||
|
InlinePanel('variants')
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@property
|
|
||||||
def first_image(self):
|
|
||||||
return self.images.first()
|
|
||||||
|
|
||||||
class ProductVariant(ProductVariantBase):
|
class ProductVariant(ProductVariantBase):
|
||||||
'''Basic product variant for testing
|
'''Basic product variant for testing
|
||||||
'''
|
'''
|
||||||
product = ParentalKey(Product, related_name='variants')
|
product = ParentalKey('products.Product', related_name='variants')
|
||||||
description = RichTextField()
|
description = RichTextField()
|
||||||
|
|
||||||
|
@ProductVariantBase.price.getter
|
||||||
|
def price(self):
|
||||||
|
"""Make the price dynamic to check that longclaw works with ``get_price``
|
||||||
|
"""
|
||||||
|
return self.base_price * 10
|
||||||
|
|
|
@ -79,7 +79,7 @@ class ProductVariantFactory(factory.django.DjangoModelFactory):
|
||||||
|
|
||||||
product = factory.SubFactory(ProductFactory)
|
product = factory.SubFactory(ProductFactory)
|
||||||
description = factory.Faker('text')
|
description = factory.Faker('text')
|
||||||
price = factory.Faker('pyfloat', positive=True, left_digits=2, right_digits=2)
|
base_price = factory.Faker('pyfloat', positive=True, left_digits=2, right_digits=2)
|
||||||
ref = factory.Faker('pystr', min_chars=3, max_chars=10)
|
ref = factory.Faker('pystr', min_chars=3, max_chars=10)
|
||||||
stock = factory.Faker('pyint')
|
stock = factory.Faker('pyint')
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue