added wine region

This commit is contained in:
Anatoly 2019-10-27 18:42:51 +03:00
parent 37d745eeaa
commit e41b539ed7
5 changed files with 97 additions and 0 deletions

View File

@ -19,6 +19,16 @@ class CityAdmin(admin.ModelAdmin):
"""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)
class AddressAdmin(admin.OSMGeoAdmin):
"""Address admin."""

View File

@ -131,6 +131,49 @@ class Address(models.Model):
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
@receiver(post_save, sender=Country)
def run_recalculate_price_levels(sender, instance, **kwargs):

View File

@ -148,3 +148,33 @@ class AddressDetailSerializer(AddressBaseSerializer):
'city_id',
'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',
]

View File

@ -134,6 +134,10 @@ class Product(TranslatedFieldsMixin, BaseAttributes):
verbose_name=_('establishment'))
public_mark = models.PositiveIntegerField(blank=True, null=True, default=None,
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)()
@ -143,6 +147,13 @@ class Product(TranslatedFieldsMixin, BaseAttributes):
verbose_name = _('Product')
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):
"""Extended manger for OnlineProduct model."""

View File

@ -2,6 +2,7 @@
from rest_framework import serializers
from utils.serializers import TranslatedField
from product.models import Product, ProductSubType, ProductType
from location.serializers import WineRegionBaseSerializer
class ProductSubTypeBaseSerializer(serializers.ModelSerializer):
@ -39,6 +40,7 @@ class ProductBaseSerializer(serializers.ModelSerializer):
category_display = serializers.CharField(source='get_category_display')
product_type = ProductTypeBaseSerializer()
subtypes = ProductSubTypeBaseSerializer(many=True)
wine_region = WineRegionBaseSerializer(allow_null=True)
class Meta:
"""Meta class."""
@ -52,4 +54,5 @@ class ProductBaseSerializer(serializers.ModelSerializer):
'product_type',
'subtypes',
'public_mark',
'wine_region',
]