From 9a7052026b588a6585c0578a515a9a9f0f4a8ce3 Mon Sep 17 00:00:00 2001 From: Dmitriy Kuzmenko Date: Thu, 29 Aug 2019 14:51:55 +0300 Subject: [PATCH] add metadata --- apps/establishment/admin.py | 9 +++- apps/establishment/filters.py | 15 ++++++ apps/establishment/models.py | 1 + apps/establishment/serializers.py | 3 ++ apps/establishment/views.py | 2 + apps/main/admin.py | 16 ++++++ .../migrations/0011_auto_20190829_0821.py | 52 +++++++++++++++++++ apps/main/models.py | 46 ++++++++++++++-- apps/main/serializers.py | 12 +++++ apps/news/models.py | 1 + apps/utils/middleware.py | 1 + 11 files changed, 152 insertions(+), 6 deletions(-) create mode 100644 apps/establishment/filters.py create mode 100644 apps/main/migrations/0011_auto_20190829_0821.py diff --git a/apps/establishment/admin.py b/apps/establishment/admin.py index 7ac20493..63a63098 100644 --- a/apps/establishment/admin.py +++ b/apps/establishment/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin from establishment import models from django.contrib.contenttypes.admin import GenericTabularInline -from main.models import Award +from main.models import Award, MetaDataContent @admin.register(models.EstablishmentType) @@ -20,7 +20,12 @@ class AwardInline(GenericTabularInline): extra = 0 +class MetaDataContentInline(GenericTabularInline): + model = MetaDataContent + extra = 0 + + @admin.register(models.Establishment) class EstablishmentAdmin(admin.ModelAdmin): """Establishment admin.""" - inlines = [AwardInline, ] + inlines = [AwardInline, MetaDataContentInline] diff --git a/apps/establishment/filters.py b/apps/establishment/filters.py new file mode 100644 index 00000000..6fc26991 --- /dev/null +++ b/apps/establishment/filters.py @@ -0,0 +1,15 @@ +from django.utils.translation import ugettext_lazy as _ +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',) + + class Meta: + model = models.Establishment + fields = ( + 'tag_id', + ) diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 74982565..9c2902cd 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -86,6 +86,7 @@ class Establishment(ProjectBaseMixin, ImageMixin, TraslatedFieldsMixin): default=None, verbose_name=_('Price level')) awards = generic.GenericRelation(to='main.Award') + tags = generic.GenericRelation(to='main.MetaDataContent') class Meta: """Meta class.""" diff --git a/apps/establishment/serializers.py b/apps/establishment/serializers.py index 5a77f11c..9ebf83b4 100644 --- a/apps/establishment/serializers.py +++ b/apps/establishment/serializers.py @@ -2,6 +2,7 @@ from rest_framework import serializers from establishment import models from location.serializers import AddressSerializer +from main.serializers import MetaDataContentSerializer class EstablishmentTypeSerializer(serializers.ModelSerializer): @@ -36,6 +37,7 @@ class EstablishmentSerializer(serializers.ModelSerializer): type = EstablishmentTypeSerializer(source='establishment_type') subtypes = EstablishmentSubTypeSerializer(many=True) address = AddressSerializer() + tags = MetaDataContentSerializer(many=True) class Meta: """Meta class.""" @@ -53,4 +55,5 @@ class EstablishmentSerializer(serializers.ModelSerializer): 'subtypes', 'image', 'address', + 'tags', ) diff --git a/apps/establishment/views.py b/apps/establishment/views.py index 7146aac1..a006ada9 100644 --- a/apps/establishment/views.py +++ b/apps/establishment/views.py @@ -2,6 +2,7 @@ from rest_framework import generics, permissions from establishment import models, serializers from utils.views import JWTGenericViewMixin +from establishment import filters class EstablishmentListView(JWTGenericViewMixin, generics.ListAPIView): @@ -10,6 +11,7 @@ class EstablishmentListView(JWTGenericViewMixin, generics.ListAPIView): permission_classes = (permissions.AllowAny,) serializer_class = serializers.EstablishmentSerializer queryset = models.Establishment.objects.all() + filter_class = filters.EstablishmentFilter class EstablishmentTypeListView(JWTGenericViewMixin, generics.ListAPIView): diff --git a/apps/main/admin.py b/apps/main/admin.py index 1666511d..9ff6606a 100644 --- a/apps/main/admin.py +++ b/apps/main/admin.py @@ -23,3 +23,19 @@ class AwardAdmin(admin.ModelAdmin): """Award admin conf.""" # list_display = ['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""" diff --git a/apps/main/migrations/0011_auto_20190829_0821.py b/apps/main/migrations/0011_auto_20190829_0821.py new file mode 100644 index 00000000..6501af58 --- /dev/null +++ b/apps/main/migrations/0011_auto_20190829_0821.py @@ -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'), + ), + ] diff --git a/apps/main/models.py b/apps/main/models.py index 6608feb9..f181fd2c 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -7,8 +7,8 @@ from django.utils.translation import gettext_lazy as _ from django.contrib.contenttypes.models import ContentType from location.models import Country from main import methods -from utils.models import ProjectBaseMixin - +from utils.models import ProjectBaseMixin, TJSONField, TraslatedFieldsMixin +from configuration.models import TranslationSettings # # @@ -199,8 +199,9 @@ class Award(models.Model): def __str__(self): title = 'None' - if self.title and 'en' in self.title: - title = self.title['en'] + lang = TranslationSettings.get_solo().default_language + if self.title and lang in self.title: + title = self.title[lang] return f'id:{self.id}-{title}' @@ -212,3 +213,40 @@ class AwardType(models.Model): def __str__(self): 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) diff --git a/apps/main/serializers.py b/apps/main/serializers.py index 73ec941b..32ddf5a6 100644 --- a/apps/main/serializers.py +++ b/apps/main/serializers.py @@ -79,4 +79,16 @@ class AwardSerializer(serializers.ModelSerializer): # 'title', 'award_type', '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', ] \ No newline at end of file diff --git a/apps/news/models.py b/apps/news/models.py index b6493a9b..e3eff57e 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -1,6 +1,7 @@ """News app models.""" from django.db import models from django.utils.translation import gettext_lazy as _ + from utils.models import BaseAttributes, TJSONField, TraslatedFieldsMixin diff --git a/apps/utils/middleware.py b/apps/utils/middleware.py index 398e4437..3cc57319 100644 --- a/apps/utils/middleware.py +++ b/apps/utils/middleware.py @@ -1,5 +1,6 @@ """Custom middleware.""" from django.utils import translation + from configuration.models import TranslationSettings from translation.models import Language