Merge remote-tracking branch 'origin/develop' into feature/establishment

# Conflicts:
#	apps/establishment/admin.py
#	apps/establishment/serializers.py
This commit is contained in:
Anatoly 2019-08-29 18:19:57 +03:00
commit 46faf6ecee
14 changed files with 205 additions and 12 deletions

View File

@ -2,7 +2,7 @@
from django.contrib import admin from django.contrib import admin
from establishment import models from establishment import models
from django.contrib.contenttypes.admin import GenericTabularInline from django.contrib.contenttypes.admin import GenericTabularInline
from main.models import Award from main.models import Award, MetaDataContent
@admin.register(models.EstablishmentType) @admin.register(models.EstablishmentType)
@ -20,10 +20,15 @@ class AwardInline(GenericTabularInline):
extra = 0 extra = 0
class MetaDataContentInline(GenericTabularInline):
model = MetaDataContent
extra = 0
@admin.register(models.Establishment) @admin.register(models.Establishment)
class EstablishmentAdmin(admin.ModelAdmin): class EstablishmentAdmin(admin.ModelAdmin):
"""Establishment admin.""" """Establishment admin."""
inlines = [AwardInline, ] inlines = [AwardInline, MetaDataContentInline]
@admin.register(models.EstablishmentSchedule) @admin.register(models.EstablishmentSchedule)

View File

@ -0,0 +1,16 @@
from django_filters import FilterSet
from django_filters import rest_framework as filters
from establishment import models
class EstablishmentFilter(FilterSet):
tag_id = filters.NumberFilter(field_name='tags__metadata__id',)
award_id = filters.NumberFilter(field_name='awards__id',)
class Meta:
model = models.Establishment
fields = (
'tag_id',
'award_id'
)

View File

@ -87,6 +87,7 @@ class Establishment(ProjectBaseMixin, ImageMixin, TraslatedFieldsMixin):
default=None, default=None,
verbose_name=_('Price level')) verbose_name=_('Price level'))
awards = generic.GenericRelation(to='main.Award') awards = generic.GenericRelation(to='main.Award')
tags = generic.GenericRelation(to='main.MetaDataContent')
class Meta: class Meta:
"""Meta class.""" """Meta class."""

View File

@ -1,8 +1,9 @@
"""Establishment serializers.""" """Establishment serializers."""
from rest_framework import serializers from rest_framework import serializers
from establishment import models from establishment import models
from timetable import models as timetable_models
from location.serializers import AddressSerializer from location.serializers import AddressSerializer
from main.serializers import MetaDataContentSerializer, AwardSerializer
from timetable.models import Timetable
class EstablishmentTypeSerializer(serializers.ModelSerializer): class EstablishmentTypeSerializer(serializers.ModelSerializer):
@ -35,7 +36,7 @@ class EstablishmentScheduleSerializer(serializers.ModelSerializer):
class Meta: class Meta:
"""Meta class.""" """Meta class."""
model = timetable_models.Timetable model = Timetable
fields = ( fields = (
'weekday', 'weekday',
'lunch_start', 'lunch_start',
@ -53,6 +54,8 @@ class EstablishmentSerializer(serializers.ModelSerializer):
type = EstablishmentTypeSerializer(source='establishment_type') type = EstablishmentTypeSerializer(source='establishment_type')
subtypes = EstablishmentSubTypeSerializer(many=True) subtypes = EstablishmentSubTypeSerializer(many=True)
address = AddressSerializer() address = AddressSerializer()
tags = MetaDataContentSerializer(many=True)
awards = AwardSerializer(many=True)
schedule = EstablishmentScheduleSerializer(source='schedule.schedule', schedule = EstablishmentScheduleSerializer(source='schedule.schedule',
many=True, many=True,
allow_null=True) allow_null=True)
@ -73,5 +76,7 @@ class EstablishmentSerializer(serializers.ModelSerializer):
'subtypes', 'subtypes',
'image', 'image',
'address', 'address',
'schedule' 'tags',
'awards',
'schedule',
) )

View File

@ -8,4 +8,5 @@ app_name = 'establishment'
urlpatterns = [ urlpatterns = [
path('', views.EstablishmentListView.as_view(), name='list'), path('', views.EstablishmentListView.as_view(), name='list'),
path('<int:pk>/', views.EstablishmentRetrieveView.as_view(), name='detail'),
] ]

View File

@ -2,6 +2,7 @@
from rest_framework import generics, permissions from rest_framework import generics, permissions
from establishment import models, serializers from establishment import models, serializers
from utils.views import JWTGenericViewMixin from utils.views import JWTGenericViewMixin
from establishment import filters
class EstablishmentListView(JWTGenericViewMixin, generics.ListAPIView): class EstablishmentListView(JWTGenericViewMixin, generics.ListAPIView):
@ -10,6 +11,15 @@ class EstablishmentListView(JWTGenericViewMixin, generics.ListAPIView):
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
serializer_class = serializers.EstablishmentSerializer serializer_class = serializers.EstablishmentSerializer
queryset = models.Establishment.objects.all() queryset = models.Establishment.objects.all()
filter_class = filters.EstablishmentFilter
class EstablishmentRetrieveView(JWTGenericViewMixin, generics.RetrieveAPIView):
"""Resource for getting a establishment."""
permission_classes = (permissions.AllowAny,)
serializer_class = serializers.EstablishmentSerializer
queryset = models.Establishment.objects.all()
class EstablishmentTypeListView(JWTGenericViewMixin, generics.ListAPIView): class EstablishmentTypeListView(JWTGenericViewMixin, generics.ListAPIView):
@ -18,3 +28,4 @@ class EstablishmentTypeListView(JWTGenericViewMixin, generics.ListAPIView):
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
serializer_class = serializers.EstablishmentTypeSerializer serializer_class = serializers.EstablishmentTypeSerializer
queryset = models.EstablishmentType.objects.all() queryset = models.EstablishmentType.objects.all()

View File

@ -23,3 +23,19 @@ class AwardAdmin(admin.ModelAdmin):
"""Award admin conf.""" """Award admin conf."""
# list_display = ['id', '__str__'] # list_display = ['id', '__str__']
# 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"""

View File

@ -0,0 +1,52 @@
# Generated by Django 2.2.4 on 2019-08-29 08:21
from django.db import migrations, models
import django.db.models.deletion
import utils.models
class Migration(migrations.Migration):
dependencies = [
('contenttypes', '0002_remove_content_type_name'),
('location', '0008_auto_20190827_1302'),
('main', '0010_award_title'),
]
operations = [
migrations.CreateModel(
name='MetaData',
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":"some text"}', null=True, verbose_name='label')),
],
options={
'verbose_name': 'metadata',
'verbose_name_plural': 'metadata',
},
bases=(utils.models.TraslatedFieldsMixin, models.Model),
),
migrations.CreateModel(
name='MetaDataContent',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('object_id', models.PositiveIntegerField()),
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')),
('metadata', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.MetaData')),
],
),
migrations.CreateModel(
name='MetaDataCategory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('public', models.BooleanField()),
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')),
('country', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='location.Country')),
],
),
migrations.AddField(
model_name='metadata',
name='category',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.MetaDataCategory', verbose_name='category'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 2.2.4 on 2019-08-29 11:55
from django.db import migrations
import utils.models
class Migration(migrations.Migration):
dependencies = [
('main', '0011_auto_20190829_0821'),
]
operations = [
migrations.AlterField(
model_name='award',
name='title',
field=utils.models.TJSONField(blank=True, default=None, help_text='{"en":"some text"}', null=True, verbose_name='title'),
),
]

View File

@ -7,8 +7,8 @@ from django.utils.translation import gettext_lazy as _
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from location.models import Country from location.models import Country
from main import methods from main import methods
from utils.models import ProjectBaseMixin from utils.models import ProjectBaseMixin, TJSONField, TraslatedFieldsMixin
from configuration.models import TranslationSettings
# #
# #
@ -185,10 +185,10 @@ class SiteFeature(ProjectBaseMixin):
unique_together = ('site_settings', 'feature') unique_together = ('site_settings', 'feature')
class Award(models.Model): class Award(TraslatedFieldsMixin, models.Model):
"""Award model.""" """Award model."""
award_type = models.ForeignKey('main.AwardType', on_delete=models.CASCADE) award_type = models.ForeignKey('main.AwardType', on_delete=models.CASCADE)
title = JSONField( title = TJSONField(
_('title'), null=True, blank=True, _('title'), null=True, blank=True,
default=None, help_text='{"en":"some text"}') default=None, help_text='{"en":"some text"}')
vintage_year = models.CharField(_('vintage year'), max_length=255, default='') vintage_year = models.CharField(_('vintage year'), max_length=255, default='')
@ -199,8 +199,9 @@ class Award(models.Model):
def __str__(self): def __str__(self):
title = 'None' title = 'None'
if self.title and 'en' in self.title: lang = TranslationSettings.get_solo().default_language
title = self.title['en'] if self.title and lang in self.title:
title = self.title[lang]
return f'id:{self.id}-{title}' return f'id:{self.id}-{title}'
@ -212,3 +213,40 @@ class AwardType(models.Model):
def __str__(self): def __str__(self):
return self.name return self.name
class MetaDataCategory(models.Model):
"""MetaData category model."""
country = models.ForeignKey(
'location.Country', null=True, default=None, on_delete=models.CASCADE)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
public = models.BooleanField()
class MetaData(TraslatedFieldsMixin, models.Model):
"""MetaData model."""
label = TJSONField(
_('label'), null=True, blank=True,
default=None, help_text='{"en":"some text"}')
category = models.ForeignKey(
MetaDataCategory, verbose_name=_('category'), on_delete=models.CASCADE)
class Meta:
verbose_name = _('metadata')
verbose_name_plural = _('metadata')
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 MetaDataContent(models.Model):
"""MetaDataContent model."""
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
metadata = models.ForeignKey(MetaData, on_delete=models.CASCADE)

View File

@ -1,5 +1,6 @@
"""Main app serializers.""" """Main app serializers."""
from rest_framework import serializers from rest_framework import serializers
from main import models from main import models
@ -72,11 +73,26 @@ class SiteSettingsSerializer(serializers.ModelSerializer):
class AwardSerializer(serializers.ModelSerializer): class AwardSerializer(serializers.ModelSerializer):
"""Award serializer.""" """Award serializer."""
title_translated = serializers.CharField(read_only=True, allow_null=True)
class Meta: class Meta:
model = models.Award model = models.Award
fields = [ fields = [
# 'title', 'id',
'title_translated',
'award_type', 'award_type',
'vintage_year', 'vintage_year',
] ]
class MetaDataContentSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(source='metadata.id', read_only=True,)
label_translated = serializers.CharField(
source='metadata.label_translated', read_only=True, allow_null=True)
class Meta:
model = models.MetaDataContent
fields = [
'id',
'label_translated',
]

View File

@ -8,10 +8,21 @@ class NewsListFilterSet(django_filters.FilterSet):
"""FilterSet for News list""" """FilterSet for News list"""
is_highlighted = django_filters.BooleanFilter() is_highlighted = django_filters.BooleanFilter()
title = django_filters.CharFilter(method='by_title')
class Meta: class Meta:
"""Meta class""" """Meta class"""
model = models.News model = models.News
fields = ( fields = (
'title',
'is_highlighted', 'is_highlighted',
) )
def by_title(self, queryset, name, value):
"""Crappy search by title according to locale"""
if value:
locale = self.request.locale
filters = {f'{name}__{locale}': value}
return queryset.filter(**filters)
else:
return queryset

View File

@ -1,6 +1,7 @@
"""News app models.""" """News app models."""
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from utils.models import BaseAttributes, TJSONField, TraslatedFieldsMixin from utils.models import BaseAttributes, TJSONField, TraslatedFieldsMixin

View File

@ -1,5 +1,6 @@
"""Custom middleware.""" """Custom middleware."""
from django.utils import translation from django.utils import translation
from configuration.models import TranslationSettings from configuration.models import TranslationSettings
from translation.models import Language from translation.models import Language