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()
|
queryset = models.User.objects.active()
|
||||||
|
|
||||||
def get_object(self):
|
def get_object(self):
|
||||||
"""Override get_object method
|
"""Override get_object method"""
|
||||||
"""
|
|
||||||
queryset = self.filter_queryset(self.get_queryset())
|
queryset = self.filter_queryset(self.get_queryset())
|
||||||
uidb64 = self.kwargs.get('uidb64')
|
uidb64 = self.kwargs.get('uidb64')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from comment.models import Comment
|
from comment.models import Comment
|
||||||
from establishment import models
|
from establishment import models
|
||||||
from main.models import Award, MetaDataContent
|
from main.models import Award
|
||||||
from review import models as review_models
|
from review import models as review_models
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -24,11 +24,6 @@ class AwardInline(GenericTabularInline):
|
||||||
extra = 0
|
extra = 0
|
||||||
|
|
||||||
|
|
||||||
class MetaDataContentInline(GenericTabularInline):
|
|
||||||
model = MetaDataContent
|
|
||||||
extra = 0
|
|
||||||
|
|
||||||
|
|
||||||
class ContactPhoneInline(admin.TabularInline):
|
class ContactPhoneInline(admin.TabularInline):
|
||||||
"""Contact phone inline admin."""
|
"""Contact phone inline admin."""
|
||||||
model = models.ContactPhone
|
model = models.ContactPhone
|
||||||
|
|
@ -56,8 +51,7 @@ class EstablishmentAdmin(admin.ModelAdmin):
|
||||||
"""Establishment admin."""
|
"""Establishment admin."""
|
||||||
list_display = ['id', '__str__', 'image_tag', ]
|
list_display = ['id', '__str__', 'image_tag', ]
|
||||||
inlines = [
|
inlines = [
|
||||||
AwardInline, MetaDataContentInline,
|
AwardInline, ContactPhoneInline, ContactEmailInline,
|
||||||
ContactPhoneInline, ContactEmailInline,
|
|
||||||
ReviewInline, CommentInline]
|
ReviewInline, CommentInline]
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -84,4 +78,14 @@ class MenuAdmin(admin.ModelAdmin):
|
||||||
"""Get user's short name."""
|
"""Get user's short name."""
|
||||||
return obj.category_translated
|
return obj.category_translated
|
||||||
|
|
||||||
category_translated.short_description = _('category')
|
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):
|
def with_base_related(self):
|
||||||
"""Return qs with related objects."""
|
"""Return qs with related objects."""
|
||||||
return self.select_related('address').prefetch_related(
|
return self.select_related('address')
|
||||||
models.Prefetch('tags',
|
# todo: fix this
|
||||||
MetaDataContent.objects.select_related(
|
# return self.select_related('address').prefetch_related(
|
||||||
'metadata__category'))
|
# models.Prefetch('tags',
|
||||||
)
|
# MetaDataContent.objects.select_related(
|
||||||
|
# 'metadata__category'))
|
||||||
|
# )
|
||||||
|
|
||||||
def with_extended_related(self):
|
def with_extended_related(self):
|
||||||
return self.select_related('establishment_type').\
|
return self.select_related('establishment_type').\
|
||||||
|
|
@ -546,3 +548,53 @@ class SocialNetwork(models.Model):
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.title
|
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 rest_framework import serializers
|
||||||
|
from tag.serializers import TagBaseSerializer
|
||||||
from establishment import models
|
from establishment import models
|
||||||
from establishment.serializers import (
|
from establishment.serializers import (
|
||||||
EstablishmentBaseSerializer, PlateSerializer, ContactEmailsSerializer,
|
EstablishmentBaseSerializer, PlateSerializer, ContactEmailsSerializer,
|
||||||
|
|
@ -6,6 +7,7 @@ from establishment.serializers import (
|
||||||
EstablishmentTypeSerializer)
|
EstablishmentTypeSerializer)
|
||||||
|
|
||||||
from utils.decorators import with_base_attributes
|
from utils.decorators import with_base_attributes
|
||||||
|
from utils.serializers import TranslatedField
|
||||||
|
|
||||||
from main.models import Currency
|
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):
|
class SocialNetworkSerializers(serializers.ModelSerializer):
|
||||||
"""Social network serializers."""
|
"""Social network serializers."""
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ from comment.serializers import common as comment_serializers
|
||||||
from establishment import models
|
from establishment import models
|
||||||
from favorites.models import Favorites
|
from favorites.models import Favorites
|
||||||
from location.serializers import AddressBaseSerializer
|
from location.serializers import AddressBaseSerializer
|
||||||
from main.models import MetaDataContent
|
from main.serializers import AwardSerializer, CurrencySerializer
|
||||||
from main.serializers import MetaDataContentSerializer, AwardSerializer, CurrencySerializer
|
from tag import models as tag_models
|
||||||
from review import models as review_models
|
from review import models as review_models
|
||||||
from timetable.serialziers import ScheduleRUDSerializer
|
from timetable.serialziers import ScheduleRUDSerializer
|
||||||
from utils import exceptions as utils_exceptions
|
from utils import exceptions as utils_exceptions
|
||||||
|
|
@ -89,25 +89,32 @@ class MenuRUDSerializers(ProjectModelSerializer):
|
||||||
class EstablishmentTypeSerializer(serializers.ModelSerializer):
|
class EstablishmentTypeSerializer(serializers.ModelSerializer):
|
||||||
"""Serializer for EstablishmentType model."""
|
"""Serializer for EstablishmentType model."""
|
||||||
|
|
||||||
name_translated = serializers.CharField(allow_null=True)
|
name_translated = TranslatedField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Meta class."""
|
"""Meta class."""
|
||||||
|
|
||||||
model = models.EstablishmentType
|
model = models.EstablishmentType
|
||||||
fields = ('id', 'name_translated')
|
fields = ('id', 'name', 'name_translated')
|
||||||
|
extra_kwargs = {
|
||||||
|
'name': {'write_only': True}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class EstablishmentSubTypeSerializer(serializers.ModelSerializer):
|
class EstablishmentSubTypeSerializer(serializers.ModelSerializer):
|
||||||
"""Serializer for EstablishmentSubType models."""
|
"""Serializer for EstablishmentSubType models."""
|
||||||
|
|
||||||
name_translated = serializers.CharField(allow_null=True)
|
name_translated = TranslatedField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Meta class."""
|
"""Meta class."""
|
||||||
|
|
||||||
model = models.EstablishmentSubType
|
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):
|
class ReviewSerializer(serializers.ModelSerializer):
|
||||||
|
|
@ -138,14 +145,42 @@ class EstablishmentEmployeeSerializer(serializers.ModelSerializer):
|
||||||
fields = ('id', 'name', 'position_translated', 'awards', 'priority')
|
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):
|
class EstablishmentBaseSerializer(ProjectModelSerializer):
|
||||||
"""Base serializer for Establishment model."""
|
"""Base serializer for Establishment model."""
|
||||||
|
|
||||||
preview_image = serializers.URLField(source='preview_image_url')
|
preview_image = serializers.URLField(source='preview_image_url')
|
||||||
slug = serializers.SlugField(allow_blank=False, required=True, max_length=50)
|
slug = serializers.SlugField(allow_blank=False, required=True, max_length=50)
|
||||||
address = AddressBaseSerializer()
|
address = AddressBaseSerializer()
|
||||||
tags = MetaDataContentSerializer(many=True)
|
|
||||||
in_favorites = serializers.BooleanField(allow_null=True)
|
in_favorites = serializers.BooleanField(allow_null=True)
|
||||||
|
tags = EstablishmentTagListSerializer(many=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Meta class."""
|
"""Meta class."""
|
||||||
|
|
@ -305,18 +340,3 @@ class EstablishmentFavoritesCreateSerializer(serializers.ModelSerializer):
|
||||||
'content_object': validated_data.pop('establishment')
|
'content_object': validated_data.pop('establishment')
|
||||||
})
|
})
|
||||||
return super().create(validated_data)
|
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'),
|
name='schedule-rud'),
|
||||||
path('<int:pk>/schedule/', views.EstablishmentScheduleCreateView.as_view(),
|
path('<int:pk>/schedule/', views.EstablishmentScheduleCreateView.as_view(),
|
||||||
name='schedule-create'),
|
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/', views.MenuListCreateView.as_view(), name='menu-list'),
|
||||||
path('menus/<int:pk>/', views.MenuRUDView.as_view(), name='menu-rud'),
|
path('menus/<int:pk>/', views.MenuRUDView.as_view(), name='menu-rud'),
|
||||||
path('plates/', views.PlateListCreateView.as_view(), name='plates'),
|
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('emails/<int:pk>/', views.EmailRUDView.as_view(), name='emails-rud'),
|
||||||
path('employees/', views.EmployeeListCreateView.as_view(), name='employees'),
|
path('employees/', views.EmployeeListCreateView.as_view(), name='employees'),
|
||||||
path('employees/<int:pk>/', views.EmployeeRUDView.as_view(), name='employees-rud'),
|
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'),
|
||||||
]
|
]
|
||||||
|
|
@ -4,4 +4,4 @@ from establishment.urls.common import urlpatterns as common_urlpatterns
|
||||||
|
|
||||||
urlpatterns = []
|
urlpatterns = []
|
||||||
|
|
||||||
urlpatterns.extend(common_urlpatterns)
|
urlpatterns.extend(common_urlpatterns)
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
"""Establishment app views."""
|
"""Establishment app views."""
|
||||||
|
from django.shortcuts import get_object_or_404
|
||||||
from rest_framework import generics
|
from rest_framework import generics
|
||||||
|
|
||||||
from establishment import models
|
from establishment import models, serializers
|
||||||
from establishment import serializers
|
from timetable.serialziers import ScheduleRUDSerializer, ScheduleCreateSerializer
|
||||||
|
|
||||||
|
|
||||||
class EstablishmentMixinViews:
|
class EstablishmentMixinViews:
|
||||||
|
|
@ -25,6 +25,62 @@ class EstablishmentRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||||
serializer_class = serializers.EstablishmentRUDSerializer
|
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):
|
class MenuListCreateView(generics.ListCreateAPIView):
|
||||||
"""Menu list create view."""
|
"""Menu list create view."""
|
||||||
serializer_class = serializers.MenuSerializers
|
serializer_class = serializers.MenuSerializers
|
||||||
|
|
@ -100,3 +156,35 @@ class EmployeeRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||||
"""Social RUD view."""
|
"""Social RUD view."""
|
||||||
serializer_class = serializers.EmployeeBackSerializers
|
serializer_class = serializers.EmployeeBackSerializers
|
||||||
queryset = models.Employee.objects.all()
|
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 establishment import models, serializers
|
||||||
from main import methods
|
from main import methods
|
||||||
from main.models import MetaDataContent
|
from main.models import MetaDataContent
|
||||||
from timetable.serialziers import ScheduleRUDSerializer, ScheduleCreateSerializer
|
|
||||||
from utils.pagination import EstablishmentPortionPagination
|
from utils.pagination import EstablishmentPortionPagination
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -19,9 +18,10 @@ class EstablishmentMixinView:
|
||||||
permission_classes = (permissions.AllowAny,)
|
permission_classes = (permissions.AllowAny,)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
"""Overrided method 'get_queryset'."""
|
"""Overridden method 'get_queryset'."""
|
||||||
return models.Establishment.objects.published().with_base_related().\
|
return models.Establishment.objects.published() \
|
||||||
annotate_in_favorites(self.request.user)
|
.with_base_related() \
|
||||||
|
.annotate_in_favorites(self.request.user)
|
||||||
|
|
||||||
|
|
||||||
class EstablishmentListView(EstablishmentMixinView, generics.ListAPIView):
|
class EstablishmentListView(EstablishmentMixinView, generics.ListAPIView):
|
||||||
|
|
@ -187,31 +187,3 @@ class EstablishmentTagListView(generics.ListAPIView):
|
||||||
return MetaDataContent.objects.by_content_type(app_label='establishment',
|
return MetaDataContent.objects.by_content_type(app_label='establishment',
|
||||||
model='establishment')\
|
model='establishment')\
|
||||||
.distinct('metadata__label')
|
.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__']
|
# 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)
|
@admin.register(models.Currency)
|
||||||
class CurrencContentAdmin(admin.ModelAdmin):
|
class CurrencContentAdmin(admin.ModelAdmin):
|
||||||
"""CurrencContent admin"""
|
"""CurrencContent admin"""
|
||||||
|
|
|
||||||
|
|
@ -353,7 +353,6 @@ class Carousel(models.Model):
|
||||||
return self.content_object.establishment_type.name_translated
|
return self.content_object.establishment_type.name_translated
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Page(models.Model):
|
class Page(models.Model):
|
||||||
"""Page model."""
|
"""Page model."""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,17 +30,18 @@ class EstablishmentDocument(Document):
|
||||||
properties=OBJECT_FIELD_PROPERTIES)
|
properties=OBJECT_FIELD_PROPERTIES)
|
||||||
},
|
},
|
||||||
multi=True)
|
multi=True)
|
||||||
tags = fields.ObjectField(
|
# todo: need to fix
|
||||||
properties={
|
# tags = fields.ObjectField(
|
||||||
'id': fields.IntegerField(attr='metadata.id'),
|
# properties={
|
||||||
'label': fields.ObjectField(attr='metadata.label_indexing',
|
# 'id': fields.IntegerField(attr='metadata.id'),
|
||||||
properties=OBJECT_FIELD_PROPERTIES),
|
# 'label': fields.ObjectField(attr='metadata.label_indexing',
|
||||||
'category': fields.ObjectField(attr='metadata.category',
|
# properties=OBJECT_FIELD_PROPERTIES),
|
||||||
properties={
|
# 'category': fields.ObjectField(attr='metadata.category',
|
||||||
'id': fields.IntegerField(),
|
# properties={
|
||||||
})
|
# 'id': fields.IntegerField(),
|
||||||
},
|
# })
|
||||||
multi=True)
|
# },
|
||||||
|
# multi=True)
|
||||||
address = fields.ObjectField(
|
address = fields.ObjectField(
|
||||||
properties={
|
properties={
|
||||||
'id': fields.IntegerField(),
|
'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',
|
'comment.apps.CommentConfig',
|
||||||
'favorites.apps.FavoritesConfig',
|
'favorites.apps.FavoritesConfig',
|
||||||
'rating.apps.RatingConfig',
|
'rating.apps.RatingConfig',
|
||||||
|
'tag.apps.TagConfig',
|
||||||
]
|
]
|
||||||
|
|
||||||
EXTERNAL_APPS = [
|
EXTERNAL_APPS = [
|
||||||
|
|
|
||||||
|
|
@ -7,5 +7,7 @@ urlpatterns = [
|
||||||
namespace='gallery')),
|
namespace='gallery')),
|
||||||
path('establishments/', include('establishment.urls.back')),
|
path('establishments/', include('establishment.urls.back')),
|
||||||
path('location/', include('location.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