Merge branch 'feature/gm-192' into feature/gm-148
This commit is contained in:
commit
92529f4c5b
|
|
@ -80,17 +80,17 @@ class MenuAdmin(admin.ModelAdmin):
|
|||
|
||||
category_translated.short_description = _('category')
|
||||
|
||||
|
||||
@admin.register(models.EstablishmentTypeTagCategory)
|
||||
class EstablishmentTypeTagCategoryAdmin(admin.ModelAdmin):
|
||||
"""EstablishmentTypeTagCategory admin."""
|
||||
|
||||
|
||||
@admin.register(models.EstablishmentSubTypeTagCategory)
|
||||
class EstablishmentSubTypeTagCategoryAdmin(admin.ModelAdmin):
|
||||
"""EstablishmentTypeTagCategory admin."""
|
||||
|
||||
|
||||
@admin.register(models.EstablishmentTag)
|
||||
class EstablishmentTagAdmin(admin.ModelAdmin):
|
||||
"""EstablishmentTag admin."""
|
||||
#
|
||||
# @admin.register(models.EstablishmentTypeTagCategory)
|
||||
# class EstablishmentTypeTagCategoryAdmin(admin.ModelAdmin):
|
||||
# """EstablishmentTypeTagCategory admin."""
|
||||
#
|
||||
#
|
||||
# @admin.register(models.EstablishmentSubTypeTagCategory)
|
||||
# class EstablishmentSubTypeTagCategoryAdmin(admin.ModelAdmin):
|
||||
# """EstablishmentTypeTagCategory admin."""
|
||||
#
|
||||
#
|
||||
# @admin.register(models.EstablishmentTag)
|
||||
# class EstablishmentTagAdmin(admin.ModelAdmin):
|
||||
# """EstablishmentTag admin."""
|
||||
|
|
|
|||
54
apps/establishment/migrations/0037_auto_20191015_1404.py
Normal file
54
apps/establishment/migrations/0037_auto_20191015_1404.py
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
# Generated by Django 2.2.4 on 2019-10-15 14:04
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('tag', '0002_auto_20191009_1408'),
|
||||
('establishment', '0036_auto_20191011_1356'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='establishmenttag',
|
||||
name='establishment',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='establishmenttag',
|
||||
name='tag',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='establishmenttypetagcategory',
|
||||
name='establishment_type',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='establishmenttypetagcategory',
|
||||
name='tag_category',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='establishment',
|
||||
name='tags',
|
||||
field=models.ManyToManyField(related_name='establishments', to='tag.Tag', verbose_name='Tag'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='establishmentsubtype',
|
||||
name='tag_categories',
|
||||
field=models.ManyToManyField(related_name='establishment_subtypes', to='tag.TagCategory', verbose_name='Tag'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='establishmenttype',
|
||||
name='tag_categories',
|
||||
field=models.ManyToManyField(related_name='establishment_types', to='tag.TagCategory', verbose_name='Tag'),
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='EstablishmentSubTypeTagCategory',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='EstablishmentTag',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='EstablishmentTypeTagCategory',
|
||||
),
|
||||
]
|
||||
|
|
@ -28,15 +28,16 @@ class EstablishmentTypeQuerySet(models.QuerySet):
|
|||
|
||||
def with_base_related(self):
|
||||
"""Return QuerySet with base related."""
|
||||
return self.prefetch_related(
|
||||
models.Prefetch('tag_categories',
|
||||
EstablishmentTypeTagCategory.objects.select_related('tag_category')),
|
||||
models.Prefetch('establishmentsubtype_set',
|
||||
EstablishmentSubType.objects.prefetch_related(
|
||||
models.Prefetch(
|
||||
'tag_categories',
|
||||
EstablishmentSubTypeTagCategory.objects.select_related('tag_category'))))
|
||||
)
|
||||
return self
|
||||
# return self.prefetch_related(
|
||||
# models.Prefetch('tag_categories',
|
||||
# EstablishmentTypeTagCategory.objects.select_related('tag_category')),
|
||||
# models.Prefetch('establishmentsubtype_set',
|
||||
# EstablishmentSubType.objects.prefetch_related(
|
||||
# models.Prefetch(
|
||||
# 'tag_categories',
|
||||
# EstablishmentSubTypeTagCategory.objects.select_related('tag_category'))))
|
||||
# )
|
||||
|
||||
|
||||
# todo: establishment type&subtypes check
|
||||
|
|
@ -48,6 +49,9 @@ class EstablishmentType(TranslatedFieldsMixin, ProjectBaseMixin):
|
|||
name = TJSONField(blank=True, null=True, default=None, verbose_name=_('Description'),
|
||||
help_text='{"en-GB":"some text"}')
|
||||
use_subtypes = models.BooleanField(_('Use subtypes'), default=True)
|
||||
tag_categories = models.ManyToManyField('tag.TagCategory',
|
||||
related_name='establishment_types',
|
||||
verbose_name=_('Tag'))
|
||||
|
||||
objects = EstablishmentTypeQuerySet.as_manager()
|
||||
|
||||
|
|
@ -76,6 +80,9 @@ class EstablishmentSubType(ProjectBaseMixin, TranslatedFieldsMixin):
|
|||
establishment_type = models.ForeignKey(EstablishmentType,
|
||||
on_delete=models.CASCADE,
|
||||
verbose_name=_('Type'))
|
||||
tag_categories = models.ManyToManyField('tag.TagCategory',
|
||||
related_name='establishment_subtypes',
|
||||
verbose_name=_('Tag'))
|
||||
|
||||
objects = EstablishmentSubTypeManager()
|
||||
|
||||
|
|
@ -95,14 +102,15 @@ class EstablishmentQuerySet(models.QuerySet):
|
|||
|
||||
def with_base_related(self):
|
||||
"""Return qs with related objects."""
|
||||
return self.select_related('address', 'establishment_type').prefetch_related(
|
||||
models.Prefetch('tags',
|
||||
EstablishmentTag.objects.select_related('tag')),
|
||||
models.Prefetch('establishment_type__tag_categories',
|
||||
EstablishmentTypeTagCategory.objects.select_related('tag_category')),
|
||||
models.Prefetch('establishment_type__establishmentsubtype_set',
|
||||
EstablishmentSubType.objects.prefetch_related('tag_categories')),
|
||||
)
|
||||
return self
|
||||
# return self.select_related('address', 'establishment_type').prefetch_related(
|
||||
# models.Prefetch('tags',
|
||||
# EstablishmentTag.objects.select_related('tag')),
|
||||
# models.Prefetch('establishment_type__tag_categories',
|
||||
# EstablishmentTypeTagCategory.objects.select_related('tag_category')),
|
||||
# models.Prefetch('establishment_type__establishmentsubtype_set',
|
||||
# EstablishmentSubType.objects.prefetch_related('tag_categories')),
|
||||
# )
|
||||
|
||||
def with_extended_related(self):
|
||||
return self.select_related('establishment_type').\
|
||||
|
|
@ -321,7 +329,11 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin):
|
|||
verbose_name=_('Establishment slug'), editable=True)
|
||||
|
||||
awards = generic.GenericRelation(to='main.Award', related_query_name='establishment')
|
||||
tags = generic.GenericRelation(to='main.MetaDataContent')
|
||||
# todo: remove after data merge
|
||||
# tags = generic.GenericRelation(to='main.MetaDataContent')
|
||||
tags = models.ManyToManyField('tag.Tag', related_name='establishments',
|
||||
verbose_name=_('Tag'))
|
||||
old_tags = generic.GenericRelation(to='main.MetaDataContent')
|
||||
reviews = generic.GenericRelation(to='review.Review')
|
||||
comments = generic.GenericRelation(to='comment.Comment')
|
||||
favorites = generic.GenericRelation(to='favorites.Favorites')
|
||||
|
|
@ -576,81 +588,81 @@ class SocialNetwork(models.Model):
|
|||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
#
|
||||
# class EstablishmentTagQuerySet(models.QuerySet):
|
||||
# """Establishment tag QuerySet."""
|
||||
#
|
||||
# def by_country_code(self, code):
|
||||
# """Return establishment tags by establishment country code."""
|
||||
# return self.filter(establishment__address__city__country__code=code)
|
||||
|
||||
class EstablishmentTagQuerySet(models.QuerySet):
|
||||
"""Establishment tag QuerySet."""
|
||||
|
||||
def by_country_code(self, code):
|
||||
"""Return establishment tags by establishment country code."""
|
||||
return self.filter(establishment__address__city__country__code=code)
|
||||
|
||||
|
||||
class EstablishmentTag(models.Model):
|
||||
"""Establishment tag model."""
|
||||
tag = models.ForeignKey('tag.Tag',
|
||||
on_delete=models.CASCADE,
|
||||
related_name='tags',
|
||||
verbose_name=_('tag'))
|
||||
establishment = models.ForeignKey('establishment.Establishment',
|
||||
on_delete=models.CASCADE,
|
||||
related_name='tags',
|
||||
verbose_name=_('establishment'))
|
||||
objects = EstablishmentTagQuerySet.as_manager()
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('establishment tag')
|
||||
verbose_name_plural = _('establishment tags')
|
||||
|
||||
|
||||
class EstablishmentTypeTagCategoryQuerySet(models.QuerySet):
|
||||
"""EstablishmentTypeTagCategory QuerySet."""
|
||||
|
||||
def by_country_code(self, code):
|
||||
"""Return establishment tags by country code"""
|
||||
return self.filter(tag_category__country__code=code)
|
||||
|
||||
def with_base_related(self):
|
||||
"""Return with related relations."""
|
||||
return self.select_related('establishment_type', 'tag_category')
|
||||
|
||||
|
||||
class EstablishmentTypeTagCategory(models.Model):
|
||||
"""Tag categories based on establishment type."""
|
||||
establishment_type = models.ForeignKey(EstablishmentType,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='tag_categories',
|
||||
verbose_name=_('establishment type'))
|
||||
tag_category = models.ForeignKey('tag.TagCategory',
|
||||
on_delete=models.CASCADE,
|
||||
related_name='est_type_tag_categories',
|
||||
verbose_name=_('tag category'))
|
||||
objects = EstablishmentTypeTagCategoryQuerySet.as_manager()
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('establishment type tag categories')
|
||||
verbose_name_plural = _('establishment type tag categories')
|
||||
|
||||
|
||||
class EstablishmentSubTypeTagCategoryQuerySet(models.QuerySet):
|
||||
"""QuerySet for tag categories based on establishment subtype."""
|
||||
|
||||
def with_base_related(self):
|
||||
"""Return queryset with base related."""
|
||||
return self.select_related('establishment_subtype', 'tag_category')
|
||||
|
||||
|
||||
class EstablishmentSubTypeTagCategory(models.Model):
|
||||
"""Tag categories based on establishment subtype."""
|
||||
establishment_subtype = models.ForeignKey(EstablishmentSubType,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='tag_categories',
|
||||
verbose_name=_('establishment subtype'))
|
||||
tag_category = models.ForeignKey('tag.TagCategory',
|
||||
on_delete=models.CASCADE,
|
||||
related_name='est_subtype_tag_categories',
|
||||
verbose_name=_('tag category'))
|
||||
objects = EstablishmentSubTypeTagCategoryQuerySet.as_manager()
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('establishment subtype tag categories')
|
||||
verbose_name_plural = _('establishment subtype tag categories')
|
||||
#
|
||||
# class EstablishmentTag(models.Model):
|
||||
# """Establishment tag model."""
|
||||
# tag = models.ForeignKey('tag.Tag',
|
||||
# on_delete=models.CASCADE,
|
||||
# related_name='tags',
|
||||
# verbose_name=_('tag'))
|
||||
# establishment = models.ForeignKey('establishment.Establishment',
|
||||
# on_delete=models.CASCADE,
|
||||
# related_name='tags',
|
||||
# verbose_name=_('establishment'))
|
||||
# objects = EstablishmentTagQuerySet.as_manager()
|
||||
#
|
||||
# class Meta:
|
||||
# verbose_name = _('establishment tag')
|
||||
# verbose_name_plural = _('establishment tags')
|
||||
#
|
||||
#
|
||||
# class EstablishmentTypeTagCategoryQuerySet(models.QuerySet):
|
||||
# """EstablishmentTypeTagCategory QuerySet."""
|
||||
#
|
||||
# def by_country_code(self, code):
|
||||
# """Return establishment tags by country code"""
|
||||
# return self.filter(tag_category__country__code=code)
|
||||
#
|
||||
# def with_base_related(self):
|
||||
# """Return with related relations."""
|
||||
# return self.select_related('establishment_type', 'tag_category')
|
||||
#
|
||||
#
|
||||
# class EstablishmentTypeTagCategory(models.Model):
|
||||
# """Tag categories based on establishment type."""
|
||||
# establishment_type = models.ForeignKey(EstablishmentType,
|
||||
# on_delete=models.CASCADE,
|
||||
# related_name='tag_categories',
|
||||
# verbose_name=_('establishment type'))
|
||||
# tag_category = models.ForeignKey('tag.TagCategory',
|
||||
# on_delete=models.CASCADE,
|
||||
# related_name='est_type_tag_categories',
|
||||
# verbose_name=_('tag category'))
|
||||
# objects = EstablishmentTypeTagCategoryQuerySet.as_manager()
|
||||
#
|
||||
# class Meta:
|
||||
# verbose_name = _('establishment type tag categories')
|
||||
# verbose_name_plural = _('establishment type tag categories')
|
||||
#
|
||||
#
|
||||
# class EstablishmentSubTypeTagCategoryQuerySet(models.QuerySet):
|
||||
# """QuerySet for tag categories based on establishment subtype."""
|
||||
#
|
||||
# def with_base_related(self):
|
||||
# """Return queryset with base related."""
|
||||
# return self.select_related('establishment_subtype', 'tag_category')
|
||||
#
|
||||
#
|
||||
# class EstablishmentSubTypeTagCategory(models.Model):
|
||||
# """Tag categories based on establishment subtype."""
|
||||
# establishment_subtype = models.ForeignKey(EstablishmentSubType,
|
||||
# on_delete=models.CASCADE,
|
||||
# related_name='tag_categories',
|
||||
# verbose_name=_('establishment subtype'))
|
||||
# tag_category = models.ForeignKey('tag.TagCategory',
|
||||
# on_delete=models.CASCADE,
|
||||
# related_name='est_subtype_tag_categories',
|
||||
# verbose_name=_('tag category'))
|
||||
# objects = EstablishmentSubTypeTagCategoryQuerySet.as_manager()
|
||||
#
|
||||
# class Meta:
|
||||
# verbose_name = _('establishment subtype tag categories')
|
||||
# verbose_name_plural = _('establishment subtype tag categories')
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ from establishment import models
|
|||
from establishment.serializers import (
|
||||
EstablishmentBaseSerializer, PlateSerializer, ContactEmailsSerializer,
|
||||
ContactPhonesSerializer, SocialNetworkRelatedSerializers,
|
||||
EstablishmentTypeBaseSerializer, EstablishmentSubTypeBaseSerializer,
|
||||
EstablishmentTypeTagCategoryBaseSerializer)
|
||||
EstablishmentTypeBaseSerializer, EstablishmentSubTypeBaseSerializer)
|
||||
# EstablishmentTypeTagCategoryBaseSerializer)
|
||||
from main.models import Currency
|
||||
from tag.serializers import TagBaseSerializer
|
||||
from utils.decorators import with_base_attributes
|
||||
|
|
@ -146,94 +146,94 @@ class EmployeeBackSerializers(serializers.ModelSerializer):
|
|||
]
|
||||
|
||||
|
||||
class EstablishmentTagCreateSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for model EstablishmentTag."""
|
||||
class Meta:
|
||||
model = models.EstablishmentTag
|
||||
fields = [
|
||||
'tag',
|
||||
'establishment'
|
||||
]
|
||||
extra_kwargs = {
|
||||
'tag': {'write_only': True},
|
||||
'establishment': {'write_only': True},
|
||||
}
|
||||
|
||||
def validate(self, attrs):
|
||||
"""Validate method."""
|
||||
establishment = attrs.get('establishment')
|
||||
tag = attrs.get('tag')
|
||||
|
||||
# Check if tag is already added to establishment.
|
||||
if establishment.tags.filter(tag=tag).exists():
|
||||
raise serializers.ValidationError(detail={'detail': _('Tag is already added.')})
|
||||
|
||||
# Сhecking tag availability for establishment type.
|
||||
if not establishment.establishment_type.use_subtypes:
|
||||
qs = establishment.establishment_type.tag_categories.filter(tag_category=tag.category)
|
||||
else:
|
||||
# Сhecking tag availability for establishment subtype.
|
||||
qs = establishment.establishment_type.tag_categories.filter(
|
||||
establishmentsubtype_set__tag_category=tag.category)
|
||||
if not qs.exists():
|
||||
raise serializers.ValidationError(
|
||||
detail={'detail': _('Tag is not available for this establishment type|subtype.')})
|
||||
return attrs
|
||||
# class EstablishmentTagCreateSerializer(serializers.ModelSerializer):
|
||||
# """Serializer for model EstablishmentTag."""
|
||||
# class Meta:
|
||||
# model = models.EstablishmentTag
|
||||
# fields = [
|
||||
# 'tag',
|
||||
# 'establishment'
|
||||
# ]
|
||||
# extra_kwargs = {
|
||||
# 'tag': {'write_only': True},
|
||||
# 'establishment': {'write_only': True},
|
||||
# }
|
||||
#
|
||||
# def validate(self, attrs):
|
||||
# """Validate method."""
|
||||
# establishment = attrs.get('establishment')
|
||||
# tag = attrs.get('tag')
|
||||
#
|
||||
# # Check if tag is already added to establishment.
|
||||
# if establishment.tags.filter(tag=tag).exists():
|
||||
# raise serializers.ValidationError(detail={'detail': _('Tag is already added.')})
|
||||
#
|
||||
# # Сhecking tag availability for establishment type.
|
||||
# if not establishment.establishment_type.use_subtypes:
|
||||
# qs = establishment.establishment_type.tag_categories.filter(tag_category=tag.category)
|
||||
# else:
|
||||
# # Сhecking tag availability for establishment subtype.
|
||||
# qs = establishment.establishment_type.tag_categories.filter(
|
||||
# establishmentsubtype_set__tag_category=tag.category)
|
||||
# if not qs.exists():
|
||||
# raise serializers.ValidationError(
|
||||
# detail={'detail': _('Tag is not available for this establishment type|subtype.')})
|
||||
# return attrs
|
||||
|
||||
|
||||
class EstablishmentSubTypeTagCategoryBaseSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for intermediate model EstablishmentSubTypeTagCategories."""
|
||||
id = serializers.IntegerField(source='tag_category.id', read_only=True)
|
||||
label_translated = TranslatedField(source='tag_category.label_translated')
|
||||
tags = TagBaseSerializer(source='tag_category.tags', many=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
model = models.EstablishmentSubTypeTagCategory
|
||||
fields = [
|
||||
'id',
|
||||
'label_translated',
|
||||
'tags',
|
||||
'establishment_subtype',
|
||||
'tag_category',
|
||||
]
|
||||
extra_kwargs = {
|
||||
'establishment_subtype': {'write_only': True},
|
||||
'tag_category': {'write_only': True},
|
||||
}
|
||||
|
||||
def validate(self, attrs):
|
||||
"""Override validate method."""
|
||||
if models.EstablishmentTypeTagCategory.objects.filter(
|
||||
establishment_type=attrs.get('establishment_type'),
|
||||
tag_category=attrs.get('tag_category')).exists():
|
||||
raise serializers.ValidationError(detail={'detail': _('Objects is already attached.')})
|
||||
return attrs
|
||||
|
||||
|
||||
class EstablishmentSubTypeSerializer(EstablishmentSubTypeBaseSerializer):
|
||||
"""Extended serializer for EstablishmentSubType model with tags."""
|
||||
tag_categories = EstablishmentSubTypeTagCategoryBaseSerializer(many=True, read_only=True)
|
||||
|
||||
class Meta(EstablishmentSubTypeBaseSerializer.Meta):
|
||||
"""Meta class"""
|
||||
fields = [
|
||||
'id',
|
||||
'name_translated',
|
||||
'tag_categories'
|
||||
]
|
||||
|
||||
|
||||
class EstablishmentTagsByType(EstablishmentTypeBaseSerializer):
|
||||
"""Tags by establishment type"""
|
||||
tag_categories = EstablishmentTypeTagCategoryBaseSerializer(many=True)
|
||||
subtypes = EstablishmentSubTypeSerializer(many=True, source='establishmentsubtype_set')
|
||||
|
||||
class Meta(EstablishmentTypeBaseSerializer.Meta):
|
||||
"""Meta class."""
|
||||
fields = [
|
||||
'id',
|
||||
'name_translated',
|
||||
'tag_categories',
|
||||
'subtypes',
|
||||
]
|
||||
# class EstablishmentSubTypeTagCategoryBaseSerializer(serializers.ModelSerializer):
|
||||
# """Serializer for intermediate model EstablishmentSubTypeTagCategories."""
|
||||
# id = serializers.IntegerField(source='tag_category.id', read_only=True)
|
||||
# label_translated = TranslatedField(source='tag_category.label_translated')
|
||||
# tags = TagBaseSerializer(source='tag_category.tags', many=True, read_only=True)
|
||||
#
|
||||
# class Meta:
|
||||
# """Meta class."""
|
||||
# model = models.EstablishmentSubTypeTagCategory
|
||||
# fields = [
|
||||
# 'id',
|
||||
# 'label_translated',
|
||||
# 'tags',
|
||||
# 'establishment_subtype',
|
||||
# 'tag_category',
|
||||
# ]
|
||||
# extra_kwargs = {
|
||||
# 'establishment_subtype': {'write_only': True},
|
||||
# 'tag_category': {'write_only': True},
|
||||
# }
|
||||
#
|
||||
# def validate(self, attrs):
|
||||
# """Override validate method."""
|
||||
# if models.EstablishmentTypeTagCategory.objects.filter(
|
||||
# establishment_type=attrs.get('establishment_type'),
|
||||
# tag_category=attrs.get('tag_category')).exists():
|
||||
# raise serializers.ValidationError(detail={'detail': _('Objects is already attached.')})
|
||||
# return attrs
|
||||
#
|
||||
#
|
||||
# class EstablishmentSubTypeSerializer(EstablishmentSubTypeBaseSerializer):
|
||||
# """Extended serializer for EstablishmentSubType model with tags."""
|
||||
# tag_categories = EstablishmentSubTypeTagCategoryBaseSerializer(many=True, read_only=True)
|
||||
#
|
||||
# class Meta(EstablishmentSubTypeBaseSerializer.Meta):
|
||||
# """Meta class"""
|
||||
# fields = [
|
||||
# 'id',
|
||||
# 'name_translated',
|
||||
# 'tag_categories'
|
||||
# ]
|
||||
#
|
||||
#
|
||||
# class EstablishmentTagsByType(EstablishmentTypeBaseSerializer):
|
||||
# """Tags by establishment type"""
|
||||
# tag_categories = EstablishmentTypeTagCategoryBaseSerializer(many=True)
|
||||
# subtypes = EstablishmentSubTypeSerializer(many=True, source='establishmentsubtype_set')
|
||||
#
|
||||
# class Meta(EstablishmentTypeBaseSerializer.Meta):
|
||||
# """Meta class."""
|
||||
# fields = [
|
||||
# 'id',
|
||||
# 'name_translated',
|
||||
# 'tag_categories',
|
||||
# 'subtypes',
|
||||
# ]
|
||||
|
|
|
|||
|
|
@ -139,34 +139,34 @@ class EstablishmentSubTypeBaseSerializer(serializers.ModelSerializer):
|
|||
}
|
||||
|
||||
|
||||
class EstablishmentTypeTagCategoryBaseSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for intermediate model EstablishmentTypeTagCategories."""
|
||||
id = serializers.IntegerField(source='tag_category.id', read_only=True)
|
||||
label_translated = TranslatedField(source='tag_category.label_translated')
|
||||
tags = TagBaseSerializer(source='tag_category.tags', many=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
model = models.EstablishmentTypeTagCategory
|
||||
fields = [
|
||||
'id',
|
||||
'label_translated',
|
||||
'tags',
|
||||
'establishment_type',
|
||||
'tag_category',
|
||||
]
|
||||
extra_kwargs = {
|
||||
'establishment_type': {'write_only': True},
|
||||
'tag_category': {'write_only': True},
|
||||
}
|
||||
|
||||
def validate(self, attrs):
|
||||
"""Override validate method."""
|
||||
if models.EstablishmentTypeTagCategory.objects.filter(
|
||||
establishment_type=attrs.get('establishment_type'),
|
||||
tag_category=attrs.get('tag_category')).exists():
|
||||
raise serializers.ValidationError(detail={'detail': _('Objects is already attached.')})
|
||||
return attrs
|
||||
# class EstablishmentTypeTagCategoryBaseSerializer(serializers.ModelSerializer):
|
||||
# """Serializer for intermediate model EstablishmentTypeTagCategories."""
|
||||
# id = serializers.IntegerField(source='tag_category.id', read_only=True)
|
||||
# label_translated = TranslatedField(source='tag_category.label_translated')
|
||||
# tags = TagBaseSerializer(source='tag_category.tags', many=True, read_only=True)
|
||||
#
|
||||
# class Meta:
|
||||
# """Meta class."""
|
||||
# model = models.EstablishmentTypeTagCategory
|
||||
# fields = [
|
||||
# 'id',
|
||||
# 'label_translated',
|
||||
# 'tags',
|
||||
# 'establishment_type',
|
||||
# 'tag_category',
|
||||
# ]
|
||||
# extra_kwargs = {
|
||||
# 'establishment_type': {'write_only': True},
|
||||
# 'tag_category': {'write_only': True},
|
||||
# }
|
||||
#
|
||||
# def validate(self, attrs):
|
||||
# """Override validate method."""
|
||||
# if models.EstablishmentTypeTagCategory.objects.filter(
|
||||
# establishment_type=attrs.get('establishment_type'),
|
||||
# tag_category=attrs.get('tag_category')).exists():
|
||||
# raise serializers.ValidationError(detail={'detail': _('Objects is already attached.')})
|
||||
# return attrs
|
||||
|
||||
|
||||
class EstablishmentEmployeeSerializer(serializers.ModelSerializer):
|
||||
|
|
@ -184,19 +184,19 @@ class EstablishmentEmployeeSerializer(serializers.ModelSerializer):
|
|||
model = models.Employee
|
||||
fields = ('id', 'name', 'position_translated', 'awards', 'priority')
|
||||
|
||||
|
||||
class EstablishmentTagSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for intermediate model EstablishmentTag."""
|
||||
id = serializers.IntegerField(source='tag.id')
|
||||
label_translated = serializers.CharField(source='tag.label_translated')
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
model = models.EstablishmentTag
|
||||
fields = [
|
||||
'id',
|
||||
'label_translated'
|
||||
]
|
||||
#
|
||||
# class EstablishmentTagSerializer(serializers.ModelSerializer):
|
||||
# """Serializer for intermediate model EstablishmentTag."""
|
||||
# id = serializers.IntegerField(source='tag.id')
|
||||
# label_translated = serializers.CharField(source='tag.label_translated')
|
||||
#
|
||||
# class Meta:
|
||||
# """Meta class."""
|
||||
# model = models.EstablishmentTag
|
||||
# fields = [
|
||||
# 'id',
|
||||
# 'label_translated'
|
||||
# ]
|
||||
|
||||
|
||||
class EstablishmentBaseSerializer(ProjectModelSerializer):
|
||||
|
|
@ -206,7 +206,7 @@ class EstablishmentBaseSerializer(ProjectModelSerializer):
|
|||
slug = serializers.SlugField(allow_blank=False, required=True, max_length=50)
|
||||
address = AddressBaseSerializer()
|
||||
in_favorites = serializers.BooleanField(allow_null=True)
|
||||
tags = EstablishmentTagSerializer(many=True)
|
||||
tags = TagBaseSerializer(read_only=True, many=True)
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ urlpatterns = [
|
|||
name='schedule-rud'),
|
||||
path('<int:pk>/schedule/', views.EstablishmentScheduleCreateView.as_view(),
|
||||
name='schedule-create'),
|
||||
path('attach-tag/', views.EstablishmentTagCreateView.as_view(), name='attach-tag'),
|
||||
# path('attach-tag/', views.EstablishmentTagCreateView.as_view(), name='attach-tag'),
|
||||
path('menus/', views.MenuListCreateView.as_view(), name='menu-list'),
|
||||
path('menus/<int:pk>/', views.MenuRUDView.as_view(), name='menu-rud'),
|
||||
path('plates/', views.PlateListCreateView.as_view(), name='plates'),
|
||||
|
|
@ -28,12 +28,12 @@ urlpatterns = [
|
|||
path('employees/', views.EmployeeListCreateView.as_view(), name='employees'),
|
||||
path('employees/<int:pk>/', views.EmployeeRUDView.as_view(), name='employees-rud'),
|
||||
path('types/', views.EstablishmentTypeListCreateView.as_view(), name='type-list'),
|
||||
path('types/tags/', views.EstablishmentTypeTagListView.as_view(), name='type-tag-list'),
|
||||
# path('types/tags/', views.EstablishmentTypeTagListView.as_view(), name='type-tag-list'),
|
||||
path('types/<int:pk>/', views.EstablishmentTypeRUDView.as_view(), name='type-rud'),
|
||||
path('types/attach-tag-category/', views.EstablishmentTypeAttachTagCategoryView.as_view(),
|
||||
name='type-attach-tag-category'),
|
||||
# path('types/attach-tag-category/', views.EstablishmentTypeAttachTagCategoryView.as_view(),
|
||||
# name='type-attach-tag-category'),
|
||||
path('subtypes/', views.EstablishmentSubtypeListCreateView.as_view(), name='subtype-list'),
|
||||
path('subtypes/<int:pk>/', views.EstablishmentSubtypeRUDView.as_view(), name='subtype-rud'),
|
||||
path('subtypes/attach-tag-category/', views.EstablishmentSubTypeAttachTagCategoryView.as_view(),
|
||||
name='subtype-attach-tag-category'),
|
||||
# path('subtypes/attach-tag-category/', views.EstablishmentSubTypeAttachTagCategoryView.as_view(),
|
||||
# name='subtype-attach-tag-category'),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ app_name = 'establishment'
|
|||
|
||||
urlpatterns = [
|
||||
path('', views.EstablishmentListView.as_view(), name='list'),
|
||||
path('types/tags/', views.EstablishmentTypeTagListView.as_view(), name='type-tag-list'),
|
||||
# path('types/tags/', views.EstablishmentTypeTagListView.as_view(), name='type-tag-list'),
|
||||
path('recent-reviews/', views.EstablishmentRecentReviewListView.as_view(),
|
||||
name='recent-reviews'),
|
||||
path('slug/<slug:slug>/', views.EstablishmentRetrieveView.as_view(), name='detail'),
|
||||
|
|
|
|||
|
|
@ -55,24 +55,24 @@ class EstablishmentScheduleCreateView(generics.CreateAPIView):
|
|||
serializer_class = ScheduleCreateSerializer
|
||||
|
||||
|
||||
class EstablishmentTypeAttachTagCategoryView(generics.CreateAPIView):
|
||||
"""Attach tag category to establishment type."""
|
||||
serializer_class = serializers.EstablishmentTypeTagCategoryBaseSerializer
|
||||
|
||||
def get_queryset(self):
|
||||
"""Override get_queryset method."""
|
||||
return models.EstablishmentTypeTagCategory.objects.with_base_related()
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
"""Overridden post-method."""
|
||||
super(EstablishmentTypeAttachTagCategoryView, self).post(request)
|
||||
return Response(status=status.HTTP_200_OK)
|
||||
# class EstablishmentTypeAttachTagCategoryView(generics.CreateAPIView):
|
||||
# """Attach tag category to establishment type."""
|
||||
# serializer_class = serializers.EstablishmentTypeTagCategoryBaseSerializer
|
||||
#
|
||||
# def get_queryset(self):
|
||||
# """Override get_queryset method."""
|
||||
# return models.EstablishmentTypeTagCategory.objects.with_base_related()
|
||||
#
|
||||
# def post(self, request, *args, **kwargs):
|
||||
# """Overridden post-method."""
|
||||
# super(EstablishmentTypeAttachTagCategoryView, self).post(request)
|
||||
# return Response(status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class EstablishmentTagCreateView(EstablishmentMixinViews, generics.CreateAPIView):
|
||||
"""Attach tag to establishment."""
|
||||
serializer_class = serializers.EstablishmentTagCreateSerializer
|
||||
|
||||
# class EstablishmentTagCreateView(EstablishmentMixinViews, generics.CreateAPIView):
|
||||
# """Attach tag to establishment."""
|
||||
# serializer_class = serializers.EstablishmentTagCreateSerializer
|
||||
#
|
||||
|
||||
class MenuListCreateView(generics.ListCreateAPIView):
|
||||
"""Menu list create view."""
|
||||
|
|
@ -164,13 +164,13 @@ class EstablishmentTypeRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|||
queryset = models.EstablishmentType.objects.all()
|
||||
|
||||
|
||||
class EstablishmentTypeTagListView(generics.ListAPIView):
|
||||
"""List of tags with categories by establishment type."""
|
||||
serializer_class = serializers.EstablishmentTagsByType
|
||||
queryset = models.EstablishmentType.objects.with_base_related()
|
||||
filter_class = EstablishmentTypeTagFilter
|
||||
permission_classes = (permissions.AllowAny, )
|
||||
pagination_class = None
|
||||
# class EstablishmentTypeTagListView(generics.ListAPIView):
|
||||
# """List of tags with categories by establishment type."""
|
||||
# serializer_class = serializers.EstablishmentTagsByType
|
||||
# queryset = models.EstablishmentType.objects.with_base_related()
|
||||
# filter_class = EstablishmentTypeTagFilter
|
||||
# permission_classes = (permissions.AllowAny, )
|
||||
# pagination_class = None
|
||||
|
||||
|
||||
class EstablishmentSubtypeListCreateView(generics.ListCreateAPIView):
|
||||
|
|
@ -186,15 +186,15 @@ class EstablishmentSubtypeRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|||
queryset = models.EstablishmentSubType.objects.all()
|
||||
|
||||
|
||||
class EstablishmentSubTypeAttachTagCategoryView(generics.CreateAPIView):
|
||||
"""Attach tag category to establishment subtype."""
|
||||
serializer_class = serializers.EstablishmentSubTypeTagCategoryBaseSerializer
|
||||
|
||||
def get_queryset(self):
|
||||
"""Override get_queryset method."""
|
||||
return models.EstablishmentSubTypeTagCategory.objects.with_base_related()
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
"""Overridden post-method."""
|
||||
super(EstablishmentSubTypeAttachTagCategoryView, self).post(request)
|
||||
return Response(status=status.HTTP_200_OK)
|
||||
# class EstablishmentSubTypeAttachTagCategoryView(generics.CreateAPIView):
|
||||
# """Attach tag category to establishment subtype."""
|
||||
# serializer_class = serializers.EstablishmentSubTypeTagCategoryBaseSerializer
|
||||
#
|
||||
# def get_queryset(self):
|
||||
# """Override get_queryset method."""
|
||||
# return models.EstablishmentSubTypeTagCategory.objects.with_base_related()
|
||||
#
|
||||
# def post(self, request, *args, **kwargs):
|
||||
# """Overridden post-method."""
|
||||
# super(EstablishmentSubTypeAttachTagCategoryView, self).post(request)
|
||||
# return Response(status=status.HTTP_200_OK)
|
||||
|
|
|
|||
|
|
@ -24,15 +24,15 @@ class NewsDocument(Document):
|
|||
country = fields.ObjectField(properties={'id': fields.IntegerField(),
|
||||
'code': fields.KeywordField()})
|
||||
web_url = fields.KeywordField(attr='web_url')
|
||||
tags = fields.ObjectField(
|
||||
properties={
|
||||
'id': fields.IntegerField(attr='metadata.id'),
|
||||
'label': fields.ObjectField(attr='metadata.label_indexing',
|
||||
properties=OBJECT_FIELD_PROPERTIES),
|
||||
'category': fields.ObjectField(attr='metadata.category',
|
||||
properties={'id': fields.IntegerField()})
|
||||
},
|
||||
multi=True)
|
||||
# tags = fields.ObjectField(
|
||||
# properties={
|
||||
# 'id': fields.IntegerField(attr='metadata.id'),
|
||||
# 'label': fields.ObjectField(attr='metadata.label_indexing',
|
||||
# properties=OBJECT_FIELD_PROPERTIES),
|
||||
# 'category': fields.ObjectField(attr='metadata.category',
|
||||
# properties={'id': fields.IntegerField()})
|
||||
# },
|
||||
# multi=True)
|
||||
|
||||
class Django:
|
||||
|
||||
|
|
|
|||
48
apps/tag/filters.py
Normal file
48
apps/tag/filters.py
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
"""Tag app filters."""
|
||||
from django_filters import rest_framework as filters
|
||||
from tag import models
|
||||
|
||||
|
||||
class TagCategoryFilterSet(filters.FilterSet):
|
||||
"""TagCategory filterset."""
|
||||
|
||||
# Object type choices
|
||||
NEWS = 'news'
|
||||
ESTABLISHMENT = 'establishment'
|
||||
|
||||
TYPE_CHOICES = (
|
||||
(NEWS, 'News'),
|
||||
(ESTABLISHMENT, 'Establishment'),
|
||||
)
|
||||
|
||||
type = filters.MultipleChoiceFilter(choices=TYPE_CHOICES,
|
||||
method='filter_by_type')
|
||||
|
||||
# Establishment type choices
|
||||
RESTAURANT = 'restaurant'
|
||||
|
||||
ESTABLISHMENT_TYPE_CHOICES = (
|
||||
(RESTAURANT, 'restaurant'),
|
||||
)
|
||||
|
||||
establishment_type = filters.MultipleChoiceFilter(
|
||||
choices=ESTABLISHMENT_TYPE_CHOICES,
|
||||
method='filter_by_establishment_type')
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
|
||||
model = models.TagCategory
|
||||
fields = ('type',
|
||||
'establishment_type', )
|
||||
|
||||
def filter_by_type(self, queryset, name, value):
|
||||
if self.NEWS in value:
|
||||
queryset = queryset.for_news()
|
||||
if self.ESTABLISHMENT in value:
|
||||
queryset = queryset.for_establishments()
|
||||
return queryset
|
||||
|
||||
# todo: filter by establishment type
|
||||
def filter_by_establishment_type(self, queryset, name, value):
|
||||
return queryset.for_establishments()
|
||||
|
|
@ -32,8 +32,16 @@ class Tag(TranslatedFieldsMixin, models.Model):
|
|||
class TagCategoryQuerySet(models.QuerySet):
|
||||
"""Extended queryset for TagCategory model."""
|
||||
|
||||
def by_news_type(self, news_type):
|
||||
return self.filter(news_types=news_type)
|
||||
def with_base_related(self):
|
||||
return self.prefetch_related('tags')
|
||||
|
||||
def for_news(self):
|
||||
return self.filter(news_types__isnull=True)
|
||||
|
||||
def for_establishments(self):
|
||||
return self.filter(models.Q(est_subtype_tag_categories__isnull=True) |
|
||||
models.Q(est_type_tag_categories__isnull=True)).\
|
||||
distinct()
|
||||
|
||||
def with_related(self):
|
||||
return self.select_related('country').prefetch_related('tags')
|
||||
|
|
|
|||
|
|
@ -13,23 +13,29 @@ class TagBaseSerializer(serializers.ModelSerializer):
|
|||
"""Meta class."""
|
||||
|
||||
model = models.Tag
|
||||
fields = [
|
||||
fields = (
|
||||
'id',
|
||||
'label',
|
||||
'label_translated',
|
||||
)
|
||||
|
||||
|
||||
class TagBackOfficeSerializer(TagBaseSerializer):
|
||||
"""Serializer for Tag model for Back office users."""
|
||||
|
||||
class Meta(TagBaseSerializer.Meta):
|
||||
"""Meta class."""
|
||||
|
||||
fields = TagBaseSerializer.Meta.fields + (
|
||||
'label',
|
||||
'category'
|
||||
]
|
||||
extra_kwargs = {
|
||||
'label': {'write_only': True},
|
||||
'category': {'write_only': True}
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
class TagCategoryBaseSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for model TagCategory."""
|
||||
|
||||
label_translated = TranslatedField()
|
||||
country_translated = TranslatedField(source='country.name_translated')
|
||||
tags = TagBaseSerializer(many=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
|
|
@ -37,23 +43,29 @@ class TagCategoryBaseSerializer(serializers.ModelSerializer):
|
|||
model = models.TagCategory
|
||||
fields = (
|
||||
'id',
|
||||
'label',
|
||||
'label_translated',
|
||||
'country',
|
||||
'country_translated',
|
||||
'public',
|
||||
'tags'
|
||||
)
|
||||
extra_kwargs = {
|
||||
'label': {'write_only': True},
|
||||
'country': {'write_only': True},
|
||||
}
|
||||
|
||||
|
||||
class TagCategoryDetailSerializer(TagCategoryBaseSerializer):
|
||||
|
||||
tags = TagBaseSerializer(many=True)
|
||||
|
||||
class Meta(TagCategoryBaseSerializer.Meta):
|
||||
"""Meta class."""
|
||||
|
||||
fields = TagCategoryBaseSerializer.Meta.fields + ('tags', )
|
||||
|
||||
|
||||
class TagCategoryBackOfficeDetailSerializer(TagCategoryDetailSerializer):
|
||||
|
||||
country_translated = TranslatedField(source='country.name_translated')
|
||||
|
||||
class Meta(TagCategoryDetailSerializer.Meta):
|
||||
"""Meta class."""
|
||||
|
||||
fields = TagCategoryDetailSerializer.Meta.fields + (
|
||||
'news_types',
|
||||
'country',
|
||||
'country_translated',
|
||||
)
|
||||
|
|
|
|||
0
apps/tag/urls/__init__.py
Normal file
0
apps/tag/urls/__init__.py
Normal file
|
|
@ -1,10 +1,16 @@
|
|||
"""Urlconf for app tag."""
|
||||
from django.urls import path
|
||||
from . import views
|
||||
from rest_framework.routers import SimpleRouter
|
||||
from tag import views
|
||||
|
||||
app_name = 'tag'
|
||||
|
||||
router = SimpleRouter()
|
||||
router.register(r'', views.TagViewSet)
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.TagListCreateView.as_view(), name='list-create'),
|
||||
path('category/', views.TagCategoryListCreateView.as_view(), name='category-list-create'),
|
||||
]
|
||||
|
||||
urlpatterns += router.urls
|
||||
16
apps/tag/urls/web.py
Normal file
16
apps/tag/urls/web.py
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
"""Tag app urlpatterns web users."""
|
||||
from rest_framework.routers import SimpleRouter
|
||||
from tag import views
|
||||
|
||||
|
||||
app_name = 'tag'
|
||||
|
||||
router = SimpleRouter()
|
||||
router.register(r'categories', views.TagCategoryViewSet)
|
||||
|
||||
urlpatterns = [
|
||||
|
||||
]
|
||||
|
||||
urlpatterns += router.urls
|
||||
|
||||
|
|
@ -1,19 +1,33 @@
|
|||
"""Tag views."""
|
||||
from rest_framework import generics
|
||||
from tag import serializers, models
|
||||
from rest_framework import generics, viewsets, mixins
|
||||
from tag import filters, models, serializers
|
||||
from rest_framework import permissions
|
||||
|
||||
|
||||
class TagListCreateView(generics.ListCreateAPIView):
|
||||
class TagViewSet(mixins.ListModelMixin, mixins.CreateModelMixin,
|
||||
mixins.UpdateModelMixin, mixins.DestroyModelMixin,
|
||||
viewsets.GenericViewSet):
|
||||
"""List/create tag view."""
|
||||
|
||||
queryset = models.Tag.objects.all()
|
||||
serializer_class = serializers.TagBaseSerializer
|
||||
pagination_class = None
|
||||
queryset = models.Tag.objects.all()
|
||||
serializer_class = serializers.TagBackOfficeSerializer
|
||||
|
||||
|
||||
class TagCategoryListCreateView(generics.ListCreateAPIView):
|
||||
"""List/create tag category view."""
|
||||
|
||||
queryset = models.TagCategory.objects.all()
|
||||
serializer_class = serializers.TagCategoryBaseSerializer
|
||||
pagination_class = None
|
||||
permission_classes = (permissions.AllowAny, )
|
||||
queryset = models.TagCategory.objects.all()
|
||||
serializer_class = serializers.TagCategoryBackOfficeDetailSerializer
|
||||
|
||||
|
||||
class TagCategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
|
||||
"""ViewSet for TagCategory model."""
|
||||
|
||||
filterset_class = filters.TagCategoryFilterSet
|
||||
pagination_class = None
|
||||
permission_classes = (permissions.AllowAny, )
|
||||
queryset = models.TagCategory.objects.with_base_related()
|
||||
serializer_class = serializers.TagCategoryBaseSerializer
|
||||
|
|
|
|||
|
|
@ -211,8 +211,8 @@ REST_FRAMEWORK = {
|
|||
'COERCE_DECIMAL_TO_STRING': False,
|
||||
'DEFAULT_AUTHENTICATION_CLASSES': (
|
||||
# JWT
|
||||
'utils.authentication.GMJWTAuthentication',
|
||||
'rest_framework.authentication.SessionAuthentication',
|
||||
# 'utils.authentication.GMJWTAuthentication',
|
||||
),
|
||||
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.AcceptHeaderVersioning',
|
||||
'DEFAULT_VERSION': (AVAILABLE_VERSIONS['current'],),
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ urlpatterns = [
|
|||
path('establishments/', include('establishment.urls.back')),
|
||||
path('location/', include('location.urls.back')),
|
||||
path('news/', include('news.urls.back')),
|
||||
path('tags/', include(('tag.urls', 'tag'), namespace='tag')),
|
||||
path('tags/', include(('tag.urls.back', 'tag'), namespace='tag')),
|
||||
path('account/', include('account.urls.back')),
|
||||
path('comment/', include('comment.urls.back')),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ urlpatterns = [
|
|||
path('location/', include('location.urls.web')),
|
||||
path('main/', include('main.urls')),
|
||||
path('recipes/', include('recipe.urls.web')),
|
||||
path('tags/', include('tag.urls.web')),
|
||||
path('translation/', include('translation.urls')),
|
||||
path('comments/', include('comment.urls.web')),
|
||||
path('favorites/', include('favorites.urls')),
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user