add metadata

This commit is contained in:
Dmitriy Kuzmenko 2019-08-29 14:51:55 +03:00
parent e3ad562680
commit 9a7052026b
11 changed files with 152 additions and 6 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,7 +20,12 @@ 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]

View File

@ -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',
)

View File

@ -86,6 +86,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

@ -2,6 +2,7 @@
from rest_framework import serializers from rest_framework import serializers
from establishment import models from establishment import models
from location.serializers import AddressSerializer from location.serializers import AddressSerializer
from main.serializers import MetaDataContentSerializer
class EstablishmentTypeSerializer(serializers.ModelSerializer): class EstablishmentTypeSerializer(serializers.ModelSerializer):
@ -36,6 +37,7 @@ 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)
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -53,4 +55,5 @@ class EstablishmentSerializer(serializers.ModelSerializer):
'subtypes', 'subtypes',
'image', 'image',
'address', 'address',
'tags',
) )

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,7 @@ 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 EstablishmentTypeListView(JWTGenericViewMixin, generics.ListAPIView): class EstablishmentTypeListView(JWTGenericViewMixin, generics.ListAPIView):

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

@ -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
# #
# #
@ -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

@ -80,3 +80,15 @@ class AwardSerializer(serializers.ModelSerializer):
'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

@ -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