gm-192: in progress
This commit is contained in:
parent
cc51e36457
commit
d321866dc2
|
|
@ -40,8 +40,7 @@ class PasswordResetConfirmView(JWTGenericViewMixin):
|
|||
queryset = models.User.objects.active()
|
||||
|
||||
def get_object(self):
|
||||
"""Override get_object method
|
||||
"""
|
||||
"""Override get_object method"""
|
||||
queryset = self.filter_queryset(self.get_queryset())
|
||||
uidb64 = self.kwargs.get('uidb64')
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ from django.utils.translation import gettext_lazy as _
|
|||
|
||||
from comment.models import Comment
|
||||
from establishment import models
|
||||
from main.models import Award, MetaDataContent
|
||||
from main.models import Award
|
||||
from review import models as review_models
|
||||
|
||||
|
||||
|
|
@ -24,11 +24,6 @@ class AwardInline(GenericTabularInline):
|
|||
extra = 0
|
||||
|
||||
|
||||
class MetaDataContentInline(GenericTabularInline):
|
||||
model = MetaDataContent
|
||||
extra = 0
|
||||
|
||||
|
||||
class ContactPhoneInline(admin.TabularInline):
|
||||
"""Contact phone inline admin."""
|
||||
model = models.ContactPhone
|
||||
|
|
@ -56,8 +51,7 @@ class EstablishmentAdmin(admin.ModelAdmin):
|
|||
"""Establishment admin."""
|
||||
list_display = ['id', '__str__', 'image_tag', ]
|
||||
inlines = [
|
||||
AwardInline, MetaDataContentInline,
|
||||
ContactPhoneInline, ContactEmailInline,
|
||||
AwardInline, ContactPhoneInline, ContactEmailInline,
|
||||
ReviewInline, CommentInline]
|
||||
|
||||
|
||||
|
|
@ -85,3 +79,13 @@ class MenuAdmin(admin.ModelAdmin):
|
|||
return obj.category_translated
|
||||
|
||||
category_translated.short_description = _('category')
|
||||
|
||||
|
||||
@admin.register(models.EstablishmentTypeTagCategory)
|
||||
class EstablishmentTypeTagCategory(admin.ModelAdmin):
|
||||
"""EstablishmentTypeTagCategory admin."""
|
||||
|
||||
|
||||
@admin.register(models.EstablishmentTag)
|
||||
class EstablishmentTag(admin.ModelAdmin):
|
||||
"""EstablishmentTag admin."""
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
# Generated by Django 2.2.4 on 2019-10-08 07:47
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('tag', '0001_initial'),
|
||||
('establishment', '0031_establishment_slug'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='EstablishmentTypeTagCategory',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('establishment_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tag_categories', to='establishment.EstablishmentType', verbose_name='establishment type')),
|
||||
('tag_category', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='est_type_tag_categories', to='tag.TagCategory', verbose_name='tag category')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'establishment type tag categories',
|
||||
'verbose_name_plural': 'establishment type tag categories',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='EstablishmentTag',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('establishment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tags', to='establishment.Establishment', verbose_name='establishment')),
|
||||
('tag', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tags', to='tag.Tag', verbose_name='tag')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'establishment tag',
|
||||
'verbose_name_plural': 'establishment tags',
|
||||
},
|
||||
),
|
||||
]
|
||||
|
|
@ -76,11 +76,13 @@ class EstablishmentQuerySet(models.QuerySet):
|
|||
|
||||
def with_base_related(self):
|
||||
"""Return qs with related objects."""
|
||||
return self.select_related('address').prefetch_related(
|
||||
models.Prefetch('tags',
|
||||
MetaDataContent.objects.select_related(
|
||||
'metadata__category'))
|
||||
)
|
||||
return self.select_related('address')
|
||||
# todo: fix this
|
||||
# return self.select_related('address').prefetch_related(
|
||||
# models.Prefetch('tags',
|
||||
# MetaDataContent.objects.select_related(
|
||||
# 'metadata__category'))
|
||||
# )
|
||||
|
||||
def with_extended_related(self):
|
||||
return self.select_related('establishment_type').\
|
||||
|
|
@ -546,3 +548,53 @@ 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 EstablishmentTag(models.Model):
|
||||
"""Establishment tag model."""
|
||||
tag = models.ForeignKey('tag.Tag',
|
||||
on_delete=models.SET_NULL, null=True,
|
||||
related_name='tags',
|
||||
verbose_name=_('tag'))
|
||||
establishment = models.ForeignKey('establishment.Establishment',
|
||||
on_delete=models.SET_NULL, null=True,
|
||||
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)
|
||||
|
||||
|
||||
class EstablishmentTypeTagCategory(models.Model):
|
||||
"""Tag categories based on establishment type."""
|
||||
establishment_type = models.ForeignKey(EstablishmentType,
|
||||
on_delete=models.SET_NULL, null=True,
|
||||
related_name='tag_categories',
|
||||
verbose_name=_('establishment type'))
|
||||
tag_category = models.ForeignKey('tag.TagCategory',
|
||||
on_delete=models.SET_NULL, null=True,
|
||||
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')
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
from rest_framework import serializers
|
||||
from tag.serializers import TagBaseSerializer
|
||||
from establishment import models
|
||||
from establishment.serializers import (
|
||||
EstablishmentBaseSerializer, PlateSerializer, ContactEmailsSerializer,
|
||||
|
|
@ -6,6 +7,7 @@ from establishment.serializers import (
|
|||
EstablishmentTypeSerializer)
|
||||
|
||||
from utils.decorators import with_base_attributes
|
||||
from utils.serializers import TranslatedField
|
||||
|
||||
from main.models import Currency
|
||||
|
||||
|
|
@ -74,6 +76,21 @@ class EstablishmentRUDSerializer(EstablishmentBaseSerializer):
|
|||
]
|
||||
|
||||
|
||||
class EstablishmentTagCategoryListSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for intermediate model EstablishmentTypeTagCategories."""
|
||||
label_translated = TranslatedField(source='tag_category.label_translated')
|
||||
tags = TagBaseSerializer(source='tag_category.tags', many=True)
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
model = models.EstablishmentTypeTagCategory
|
||||
fields = [
|
||||
'id',
|
||||
'label_translated',
|
||||
'tags',
|
||||
]
|
||||
|
||||
|
||||
class SocialNetworkSerializers(serializers.ModelSerializer):
|
||||
"""Social network serializers."""
|
||||
class Meta:
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@ from comment.serializers import common as comment_serializers
|
|||
from establishment import models
|
||||
from favorites.models import Favorites
|
||||
from location.serializers import AddressBaseSerializer
|
||||
from main.models import MetaDataContent
|
||||
from main.serializers import MetaDataContentSerializer, AwardSerializer, CurrencySerializer
|
||||
from main.serializers import AwardSerializer, CurrencySerializer
|
||||
from tag import models as tag_models
|
||||
from review import models as review_models
|
||||
from timetable.serialziers import ScheduleRUDSerializer
|
||||
from utils import exceptions as utils_exceptions
|
||||
|
|
@ -89,25 +89,32 @@ class MenuRUDSerializers(ProjectModelSerializer):
|
|||
class EstablishmentTypeSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for EstablishmentType model."""
|
||||
|
||||
name_translated = serializers.CharField(allow_null=True)
|
||||
name_translated = TranslatedField()
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
|
||||
model = models.EstablishmentType
|
||||
fields = ('id', 'name_translated')
|
||||
fields = ('id', 'name', 'name_translated')
|
||||
extra_kwargs = {
|
||||
'name': {'write_only': True}
|
||||
}
|
||||
|
||||
|
||||
class EstablishmentSubTypeSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for EstablishmentSubType models."""
|
||||
|
||||
name_translated = serializers.CharField(allow_null=True)
|
||||
name_translated = TranslatedField()
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
|
||||
model = models.EstablishmentSubType
|
||||
fields = ('id', 'name_translated')
|
||||
fields = ('id', 'name', 'name_translated', 'establishment_type')
|
||||
extra_kwargs = {
|
||||
'name': {'write_only': True},
|
||||
'establishment_type': {'write_only': True}
|
||||
}
|
||||
|
||||
|
||||
class ReviewSerializer(serializers.ModelSerializer):
|
||||
|
|
@ -138,14 +145,42 @@ class EstablishmentEmployeeSerializer(serializers.ModelSerializer):
|
|||
fields = ('id', 'name', 'position_translated', 'awards', 'priority')
|
||||
|
||||
|
||||
class EstablishmentCategoryTagListSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for establishment category tags."""
|
||||
label_translated = TranslatedField()
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
model = tag_models.TagCategory
|
||||
fields = [
|
||||
'id',
|
||||
'label_translated',
|
||||
]
|
||||
|
||||
|
||||
class EstablishmentTagListSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for establishment tags."""
|
||||
label_translated = TranslatedField(source='tag.label_translated')
|
||||
category = EstablishmentCategoryTagListSerializer(source='tag.category')
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
model = tag_models.Tag
|
||||
fields = [
|
||||
'id',
|
||||
'label_translated',
|
||||
'category',
|
||||
]
|
||||
|
||||
|
||||
class EstablishmentBaseSerializer(ProjectModelSerializer):
|
||||
"""Base serializer for Establishment model."""
|
||||
|
||||
preview_image = serializers.URLField(source='preview_image_url')
|
||||
slug = serializers.SlugField(allow_blank=False, required=True, max_length=50)
|
||||
address = AddressBaseSerializer()
|
||||
tags = MetaDataContentSerializer(many=True)
|
||||
in_favorites = serializers.BooleanField(allow_null=True)
|
||||
tags = EstablishmentTagListSerializer(many=True)
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
|
|
@ -305,18 +340,3 @@ class EstablishmentFavoritesCreateSerializer(serializers.ModelSerializer):
|
|||
'content_object': validated_data.pop('establishment')
|
||||
})
|
||||
return super().create(validated_data)
|
||||
|
||||
|
||||
class EstablishmentTagListSerializer(serializers.ModelSerializer):
|
||||
"""List establishment tag serializer."""
|
||||
id = serializers.IntegerField(source='metadata.id')
|
||||
label_translated = serializers.CharField(
|
||||
source='metadata.label_translated', read_only=True, allow_null=True)
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
model = MetaDataContent
|
||||
fields = [
|
||||
'id',
|
||||
'label_translated',
|
||||
]
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@ urlpatterns = [
|
|||
name='schedule-rud'),
|
||||
path('<int:pk>/schedule/', views.EstablishmentScheduleCreateView.as_view(),
|
||||
name='schedule-create'),
|
||||
path('<int:pk>/tags/categories/', views.EstablishmentTagCategoryListView.as_view(),
|
||||
name='tag-category-list'),
|
||||
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'),
|
||||
|
|
@ -26,4 +28,8 @@ urlpatterns = [
|
|||
path('emails/<int:pk>/', views.EmailRUDView.as_view(), name='emails-rud'),
|
||||
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/<int:pk>/', views.EstablishmentTypeRUDView.as_view(), name='type-rud'),
|
||||
path('subtypes/', views.EstablishmentSubtypeListCreateView.as_view(), name='subtype-list'),
|
||||
path('subtypes/<int:pk>/', views.EstablishmentSubtypeRUDView.as_view(), name='subtype-rud'),
|
||||
]
|
||||
|
|
@ -1,9 +1,9 @@
|
|||
"""Establishment app views."""
|
||||
|
||||
from django.shortcuts import get_object_or_404
|
||||
from rest_framework import generics
|
||||
|
||||
from establishment import models
|
||||
from establishment import serializers
|
||||
from establishment import models, serializers
|
||||
from timetable.serialziers import ScheduleRUDSerializer, ScheduleCreateSerializer
|
||||
|
||||
|
||||
class EstablishmentMixinViews:
|
||||
|
|
@ -25,6 +25,62 @@ class EstablishmentRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|||
serializer_class = serializers.EstablishmentRUDSerializer
|
||||
|
||||
|
||||
class EstablishmentScheduleRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||
"""Establishment schedule RUD view"""
|
||||
serializer_class = ScheduleRUDSerializer
|
||||
|
||||
def get_object(self):
|
||||
"""
|
||||
Returns the object the view is displaying.
|
||||
"""
|
||||
establishment_pk = self.kwargs['pk']
|
||||
schedule_id = self.kwargs['schedule_id']
|
||||
|
||||
establishment = get_object_or_404(klass=models.Establishment.objects.all(),
|
||||
pk=establishment_pk)
|
||||
schedule = get_object_or_404(klass=establishment.schedule,
|
||||
id=schedule_id)
|
||||
|
||||
# May raise a permission denied
|
||||
self.check_object_permissions(self.request, establishment)
|
||||
self.check_object_permissions(self.request, schedule)
|
||||
|
||||
return schedule
|
||||
|
||||
|
||||
class EstablishmentScheduleCreateView(generics.CreateAPIView):
|
||||
"""Establishment schedule Create view"""
|
||||
serializer_class = ScheduleCreateSerializer
|
||||
|
||||
|
||||
class EstablishmentTagCategoryListView(EstablishmentMixinViews, generics.ListAPIView):
|
||||
"""View for establishment tag categories."""
|
||||
serializer_class = serializers.EstablishmentTagCategoryListSerializer
|
||||
pagination_class = None
|
||||
|
||||
def get_object(self):
|
||||
"""
|
||||
Returns the object the view is displaying.
|
||||
"""
|
||||
queryset = super(EstablishmentTagCategoryListView, self).get_queryset()
|
||||
|
||||
# Perform the lookup filtering.
|
||||
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
|
||||
|
||||
filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
|
||||
obj = get_object_or_404(queryset, **filter_kwargs)
|
||||
|
||||
# May raise a permission denied
|
||||
self.check_object_permissions(self.request, obj)
|
||||
|
||||
return obj
|
||||
|
||||
def get_queryset(self):
|
||||
"""Overridden get_queryset method."""
|
||||
establishment = self.get_object()
|
||||
return establishment.establishment_type.tag_categories.all()
|
||||
|
||||
|
||||
class MenuListCreateView(generics.ListCreateAPIView):
|
||||
"""Menu list create view."""
|
||||
serializer_class = serializers.MenuSerializers
|
||||
|
|
@ -100,3 +156,35 @@ class EmployeeRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|||
"""Social RUD view."""
|
||||
serializer_class = serializers.EmployeeBackSerializers
|
||||
queryset = models.Employee.objects.all()
|
||||
|
||||
|
||||
class EstablishmentTypeListCreateView(generics.ListCreateAPIView):
|
||||
"""Establishment type list/create view."""
|
||||
serializer_class = serializers.EstablishmentTypeSerializer
|
||||
queryset = models.EstablishmentType.objects.all()
|
||||
pagination_class = None
|
||||
|
||||
|
||||
class EstablishmentTypeRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||
"""Establishment type retrieve/update/destroy view."""
|
||||
serializer_class = serializers.EstablishmentTypeSerializer
|
||||
queryset = models.EstablishmentType.objects.all()
|
||||
|
||||
|
||||
class EstablishmentSubtypeListCreateView(generics.ListCreateAPIView):
|
||||
"""Establishment subtype list/create view."""
|
||||
serializer_class = serializers.EstablishmentSubTypeSerializer
|
||||
queryset = models.EstablishmentSubType.objects.all()
|
||||
pagination_class = None
|
||||
|
||||
|
||||
class EstablishmentSubtypeRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||
"""Establishment subtype retrieve/update/destroy view."""
|
||||
serializer_class = serializers.EstablishmentSubTypeSerializer
|
||||
queryset = models.EstablishmentSubType.objects.all()
|
||||
|
||||
|
||||
class EstablishmentTagListCreateView(generics.ListCreateAPIView):
|
||||
"""Establishment tag list/create view."""
|
||||
serializer_class = serializers.EstablishmentTagListSerializer
|
||||
queryset = models.EstablishmentTag.objects.all()
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ from establishment import filters
|
|||
from establishment import models, serializers
|
||||
from main import methods
|
||||
from main.models import MetaDataContent
|
||||
from timetable.serialziers import ScheduleRUDSerializer, ScheduleCreateSerializer
|
||||
from utils.pagination import EstablishmentPortionPagination
|
||||
|
||||
|
||||
|
|
@ -19,9 +18,10 @@ class EstablishmentMixinView:
|
|||
permission_classes = (permissions.AllowAny,)
|
||||
|
||||
def get_queryset(self):
|
||||
"""Overrided method 'get_queryset'."""
|
||||
return models.Establishment.objects.published().with_base_related().\
|
||||
annotate_in_favorites(self.request.user)
|
||||
"""Overridden method 'get_queryset'."""
|
||||
return models.Establishment.objects.published() \
|
||||
.with_base_related() \
|
||||
.annotate_in_favorites(self.request.user)
|
||||
|
||||
|
||||
class EstablishmentListView(EstablishmentMixinView, generics.ListAPIView):
|
||||
|
|
@ -187,31 +187,3 @@ class EstablishmentTagListView(generics.ListAPIView):
|
|||
return MetaDataContent.objects.by_content_type(app_label='establishment',
|
||||
model='establishment')\
|
||||
.distinct('metadata__label')
|
||||
|
||||
|
||||
class EstablishmentScheduleRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||
"""Establishment schedule RUD view"""
|
||||
serializer_class = ScheduleRUDSerializer
|
||||
|
||||
def get_object(self):
|
||||
"""
|
||||
Returns the object the view is displaying.
|
||||
"""
|
||||
establishment_pk = self.kwargs['pk']
|
||||
schedule_id = self.kwargs['schedule_id']
|
||||
|
||||
establishment = get_object_or_404(klass=models.Establishment.objects.all(),
|
||||
pk=establishment_pk)
|
||||
schedule = get_object_or_404(klass=establishment.schedule,
|
||||
id=schedule_id)
|
||||
|
||||
# May raise a permission denied
|
||||
self.check_object_permissions(self.request, establishment)
|
||||
self.check_object_permissions(self.request, schedule)
|
||||
|
||||
return schedule
|
||||
|
||||
|
||||
class EstablishmentScheduleCreateView(generics.CreateAPIView):
|
||||
"""Establishment schedule Create view"""
|
||||
serializer_class = ScheduleCreateSerializer
|
||||
|
|
|
|||
|
|
@ -25,22 +25,6 @@ class AwardAdmin(admin.ModelAdmin):
|
|||
# list_display_links = ['id', '__str__']
|
||||
|
||||
|
||||
@admin.register(models.MetaData)
|
||||
class MetaDataAdmin(admin.ModelAdmin):
|
||||
"""MetaData admin."""
|
||||
|
||||
|
||||
@admin.register(models.MetaDataCategory)
|
||||
class MetaDataCategoryAdmin(admin.ModelAdmin):
|
||||
"""MetaData admin."""
|
||||
list_display = ['id', 'country', 'content_type']
|
||||
|
||||
|
||||
@admin.register(models.MetaDataContent)
|
||||
class MetaDataContentAdmin(admin.ModelAdmin):
|
||||
"""MetaDataContent admin"""
|
||||
|
||||
|
||||
@admin.register(models.Currency)
|
||||
class CurrencContentAdmin(admin.ModelAdmin):
|
||||
"""CurrencContent admin"""
|
||||
|
|
|
|||
|
|
@ -353,7 +353,6 @@ class Carousel(models.Model):
|
|||
return self.content_object.establishment_type.name_translated
|
||||
|
||||
|
||||
|
||||
class Page(models.Model):
|
||||
"""Page model."""
|
||||
|
||||
|
|
|
|||
|
|
@ -30,17 +30,18 @@ class EstablishmentDocument(Document):
|
|||
properties=OBJECT_FIELD_PROPERTIES)
|
||||
},
|
||||
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)
|
||||
# todo: need to fix
|
||||
# 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)
|
||||
address = fields.ObjectField(
|
||||
properties={
|
||||
'id': fields.IntegerField(),
|
||||
|
|
|
|||
0
apps/tag/__init__.py
Normal file
0
apps/tag/__init__.py
Normal file
12
apps/tag/admin.py
Normal file
12
apps/tag/admin.py
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
from django.contrib import admin
|
||||
from .models import Tag, TagCategory
|
||||
|
||||
|
||||
@admin.register(Tag)
|
||||
class TagAdmin(admin.ModelAdmin):
|
||||
"""Admin model for model Tag."""
|
||||
|
||||
|
||||
@admin.register(TagCategory)
|
||||
class TagCategoryAdmin(admin.ModelAdmin):
|
||||
"""Admin model for model TagCategory."""
|
||||
7
apps/tag/apps.py
Normal file
7
apps/tag/apps.py
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
from django.apps import AppConfig
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
|
||||
class TagConfig(AppConfig):
|
||||
name = 'tag'
|
||||
verbose_name = _('tag')
|
||||
44
apps/tag/migrations/0001_initial.py
Normal file
44
apps/tag/migrations/0001_initial.py
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
# Generated by Django 2.2.4 on 2019-10-08 07:47
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import utils.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('location', '0010_auto_20190904_0711'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='TagCategory',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('label', utils.models.TJSONField(blank=True, default=None, help_text='{"en-GB":"some text"}', null=True, verbose_name='label')),
|
||||
('public', models.BooleanField(default=False)),
|
||||
('country', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='location.Country')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'tag category',
|
||||
'verbose_name_plural': 'tag categories',
|
||||
},
|
||||
bases=(utils.models.TranslatedFieldsMixin, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Tag',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('label', utils.models.TJSONField(blank=True, default=None, help_text='{"en-GB":"some text"}', null=True, verbose_name='label')),
|
||||
('category', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tags', to='tag.TagCategory', verbose_name='category')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'tag',
|
||||
'verbose_name_plural': 'tags',
|
||||
},
|
||||
bases=(utils.models.TranslatedFieldsMixin, models.Model),
|
||||
),
|
||||
]
|
||||
0
apps/tag/migrations/__init__.py
Normal file
0
apps/tag/migrations/__init__.py
Normal file
51
apps/tag/models.py
Normal file
51
apps/tag/models.py
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
"""Tag app models."""
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from configuration.models import TranslationSettings
|
||||
from utils.models import TJSONField, TranslatedFieldsMixin
|
||||
|
||||
|
||||
class Tag(TranslatedFieldsMixin, models.Model):
|
||||
"""Tag model."""
|
||||
label = TJSONField(
|
||||
_('label'), null=True, blank=True,
|
||||
default=None, help_text='{"en-GB":"some text"}')
|
||||
category = models.ForeignKey('TagCategory',
|
||||
on_delete=models.SET_NULL, null=True,
|
||||
related_name='tags',
|
||||
verbose_name='category')
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('tag')
|
||||
verbose_name_plural = _('tags')
|
||||
|
||||
def __str__(self):
|
||||
label = 'None'
|
||||
lang = TranslationSettings.get_solo().default_language
|
||||
if self.label and lang in self.label:
|
||||
label = self.label[lang]
|
||||
return f'id:{self.id}-{label}'
|
||||
|
||||
|
||||
class TagCategory(TranslatedFieldsMixin, models.Model):
|
||||
"""Tag base category model."""
|
||||
label = TJSONField(
|
||||
_('label'), null=True, blank=True,
|
||||
default=None, help_text='{"en-GB":"some text"}')
|
||||
country = models.ForeignKey('location.Country',
|
||||
on_delete=models.SET_NULL, null=True,
|
||||
default=None)
|
||||
|
||||
public = models.BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('tag category')
|
||||
verbose_name_plural = _('tag categories')
|
||||
|
||||
def __str__(self):
|
||||
label = 'None'
|
||||
lang = TranslationSettings.get_solo().default_language
|
||||
if self.label and lang in self.label:
|
||||
label = self.label[lang]
|
||||
return f'id:{self.id}-{label}'
|
||||
44
apps/tag/serializers.py
Normal file
44
apps/tag/serializers.py
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
"""Tag serializers."""
|
||||
from rest_framework import serializers
|
||||
from . import models
|
||||
from utils.serializers import TranslatedField
|
||||
|
||||
|
||||
class TagBaseSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for model Tag."""
|
||||
label_translated = TranslatedField()
|
||||
|
||||
class Meta:
|
||||
model = models.Tag
|
||||
fields = [
|
||||
'id',
|
||||
'label',
|
||||
'label_translated',
|
||||
'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')
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
model = models.TagCategory
|
||||
fields = [
|
||||
'id',
|
||||
'label',
|
||||
'label_translated',
|
||||
'country',
|
||||
'country_translated',
|
||||
'public',
|
||||
]
|
||||
extra_kwargs = {
|
||||
'label': {'write_only': True},
|
||||
'country': {'write_only': True},
|
||||
}
|
||||
3
apps/tag/tests.py
Normal file
3
apps/tag/tests.py
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
10
apps/tag/urls.py
Normal file
10
apps/tag/urls.py
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
"""Urlconf for app tag."""
|
||||
from django.urls import path
|
||||
from . import views
|
||||
|
||||
app_name = 'tag'
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.TagListCreateView.as_view(), name='list-create'),
|
||||
path('category/', views.TagCategoryListCreateView.as_view(), name='category-list-create'),
|
||||
]
|
||||
18
apps/tag/views.py
Normal file
18
apps/tag/views.py
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
"""Tag views."""
|
||||
from rest_framework import generics
|
||||
|
||||
from . import serializers, models
|
||||
|
||||
|
||||
class TagListCreateView(generics.ListCreateAPIView):
|
||||
"""List/create tag view."""
|
||||
queryset = models.Tag.objects.all()
|
||||
serializer_class = serializers.TagBaseSerializer
|
||||
pagination_class = None
|
||||
|
||||
|
||||
class TagCategoryListCreateView(generics.ListCreateAPIView):
|
||||
"""List/create tag category view."""
|
||||
queryset = models.TagCategory.objects.all()
|
||||
serializer_class = serializers.TagCategoryBaseSerializer
|
||||
pagination_class = None
|
||||
|
|
@ -72,6 +72,7 @@ PROJECT_APPS = [
|
|||
'comment.apps.CommentConfig',
|
||||
'favorites.apps.FavoritesConfig',
|
||||
'rating.apps.RatingConfig',
|
||||
'tag.apps.TagConfig',
|
||||
]
|
||||
|
||||
EXTERNAL_APPS = [
|
||||
|
|
|
|||
|
|
@ -7,5 +7,7 @@ urlpatterns = [
|
|||
namespace='gallery')),
|
||||
path('establishments/', include('establishment.urls.back')),
|
||||
path('location/', include('location.urls.back')),
|
||||
path('news/', include('news.urls.back'))
|
||||
path('news/', include('news.urls.back')),
|
||||
path('tags/', include(('tag.urls', 'tag'),
|
||||
namespace='tag'))
|
||||
]
|
||||
Loading…
Reference in New Issue
Block a user