added wine region
This commit is contained in:
parent
37d745eeaa
commit
e41b539ed7
|
|
@ -19,6 +19,16 @@ class CityAdmin(admin.ModelAdmin):
|
||||||
"""City admin."""
|
"""City admin."""
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(models.WineRegion)
|
||||||
|
class WineRegionAdmin(admin.ModelAdmin):
|
||||||
|
"""WineRegion admin."""
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(models.WineAppellation)
|
||||||
|
class WineAppellationAdmin(admin.ModelAdmin):
|
||||||
|
"""WineAppellation admin."""
|
||||||
|
|
||||||
|
|
||||||
@admin.register(models.Address)
|
@admin.register(models.Address)
|
||||||
class AddressAdmin(admin.OSMGeoAdmin):
|
class AddressAdmin(admin.OSMGeoAdmin):
|
||||||
"""Address admin."""
|
"""Address admin."""
|
||||||
|
|
|
||||||
|
|
@ -131,6 +131,49 @@ class Address(models.Model):
|
||||||
return self.city.country_id
|
return self.city.country_id
|
||||||
|
|
||||||
|
|
||||||
|
class WineRegionQuerySet(models.QuerySet):
|
||||||
|
"""Wine region queryset."""
|
||||||
|
|
||||||
|
|
||||||
|
class WineRegion(TranslatedFieldsMixin, models.Model):
|
||||||
|
"""Wine region model."""
|
||||||
|
STR_FIELD_NAME = 'name'
|
||||||
|
|
||||||
|
name = TJSONField(verbose_name=_('Name'),
|
||||||
|
help_text='{"en-GB":"some text"}')
|
||||||
|
country = models.ForeignKey(Country, on_delete=models.PROTECT,
|
||||||
|
verbose_name=_('country'))
|
||||||
|
|
||||||
|
objects = WineRegionQuerySet.as_manager()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""Meta class."""
|
||||||
|
verbose_name_plural = _('wine regions')
|
||||||
|
verbose_name = _('wine region')
|
||||||
|
|
||||||
|
|
||||||
|
class WineAppellationQuerySet(models.QuerySet):
|
||||||
|
"""Wine appellation queryset."""
|
||||||
|
|
||||||
|
|
||||||
|
class WineAppellation(TranslatedFieldsMixin, models.Model):
|
||||||
|
"""Wine appellation model."""
|
||||||
|
STR_FIELD_NAME = 'name'
|
||||||
|
|
||||||
|
name = TJSONField(verbose_name=_('Name'),
|
||||||
|
help_text='{"en-GB":"some text"}')
|
||||||
|
wine_region = models.ForeignKey(WineRegion, on_delete=models.PROTECT,
|
||||||
|
related_name='appellations',
|
||||||
|
verbose_name=_('wine region'))
|
||||||
|
|
||||||
|
objects = WineAppellationQuerySet.as_manager()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""Meta class."""
|
||||||
|
verbose_name_plural = _('wine appellations')
|
||||||
|
verbose_name = _('wine appellation')
|
||||||
|
|
||||||
|
|
||||||
# todo: Make recalculate price levels
|
# todo: Make recalculate price levels
|
||||||
@receiver(post_save, sender=Country)
|
@receiver(post_save, sender=Country)
|
||||||
def run_recalculate_price_levels(sender, instance, **kwargs):
|
def run_recalculate_price_levels(sender, instance, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -148,3 +148,33 @@ class AddressDetailSerializer(AddressBaseSerializer):
|
||||||
'city_id',
|
'city_id',
|
||||||
'city',
|
'city',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class WineAppellationBaseSerializer(serializers.ModelSerializer):
|
||||||
|
"""Wine appellations."""
|
||||||
|
name_translated = TranslatedField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""Meta class."""
|
||||||
|
model = models.WineAppellation
|
||||||
|
fields = [
|
||||||
|
'id',
|
||||||
|
'name_translated',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class WineRegionBaseSerializer(serializers.ModelSerializer):
|
||||||
|
"""Wine region serializer."""
|
||||||
|
name_translated = TranslatedField()
|
||||||
|
country = CountrySerializer()
|
||||||
|
appellations = WineAppellationBaseSerializer(many=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""Meta class."""
|
||||||
|
model = models.WineRegion
|
||||||
|
fields = [
|
||||||
|
'id',
|
||||||
|
'name_translated',
|
||||||
|
'country',
|
||||||
|
'appellations',
|
||||||
|
]
|
||||||
|
|
|
||||||
|
|
@ -134,6 +134,10 @@ class Product(TranslatedFieldsMixin, BaseAttributes):
|
||||||
verbose_name=_('establishment'))
|
verbose_name=_('establishment'))
|
||||||
public_mark = models.PositiveIntegerField(blank=True, null=True, default=None,
|
public_mark = models.PositiveIntegerField(blank=True, null=True, default=None,
|
||||||
verbose_name=_('public mark'),)
|
verbose_name=_('public mark'),)
|
||||||
|
wine_region = models.ForeignKey('location.WineRegion', on_delete=models.PROTECT,
|
||||||
|
related_name='wines',
|
||||||
|
blank=True, null=True,
|
||||||
|
verbose_name=_('wine region'))
|
||||||
|
|
||||||
objects = ProductManager.from_queryset(ProductQuerySet)()
|
objects = ProductManager.from_queryset(ProductQuerySet)()
|
||||||
|
|
||||||
|
|
@ -143,6 +147,13 @@ class Product(TranslatedFieldsMixin, BaseAttributes):
|
||||||
verbose_name = _('Product')
|
verbose_name = _('Product')
|
||||||
verbose_name_plural = _('Products')
|
verbose_name_plural = _('Products')
|
||||||
|
|
||||||
|
def clean_fields(self, exclude=None):
|
||||||
|
super().clean_fields(exclude=exclude)
|
||||||
|
if self.product_type.index_name == ProductType.WINE and not self.wine_region:
|
||||||
|
raise ValidationError(_('wine_region field must be specified.'))
|
||||||
|
if not self.product_type.index_name == ProductType.WINE and self.wine_region:
|
||||||
|
raise ValidationError(_('wine_region field must not be specified.'))
|
||||||
|
|
||||||
|
|
||||||
class OnlineProductManager(ProductManager):
|
class OnlineProductManager(ProductManager):
|
||||||
"""Extended manger for OnlineProduct model."""
|
"""Extended manger for OnlineProduct model."""
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from utils.serializers import TranslatedField
|
from utils.serializers import TranslatedField
|
||||||
from product.models import Product, ProductSubType, ProductType
|
from product.models import Product, ProductSubType, ProductType
|
||||||
|
from location.serializers import WineRegionBaseSerializer
|
||||||
|
|
||||||
|
|
||||||
class ProductSubTypeBaseSerializer(serializers.ModelSerializer):
|
class ProductSubTypeBaseSerializer(serializers.ModelSerializer):
|
||||||
|
|
@ -39,6 +40,7 @@ class ProductBaseSerializer(serializers.ModelSerializer):
|
||||||
category_display = serializers.CharField(source='get_category_display')
|
category_display = serializers.CharField(source='get_category_display')
|
||||||
product_type = ProductTypeBaseSerializer()
|
product_type = ProductTypeBaseSerializer()
|
||||||
subtypes = ProductSubTypeBaseSerializer(many=True)
|
subtypes = ProductSubTypeBaseSerializer(many=True)
|
||||||
|
wine_region = WineRegionBaseSerializer(allow_null=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Meta class."""
|
"""Meta class."""
|
||||||
|
|
@ -52,4 +54,5 @@ class ProductBaseSerializer(serializers.ModelSerializer):
|
||||||
'product_type',
|
'product_type',
|
||||||
'subtypes',
|
'subtypes',
|
||||||
'public_mark',
|
'public_mark',
|
||||||
|
'wine_region',
|
||||||
]
|
]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user