From 9f447477c3b99a48ebdb252c91b7a93277840c25 Mon Sep 17 00:00:00 2001 From: evgeniy-st Date: Tue, 20 Aug 2019 14:04:04 +0300 Subject: [PATCH] SiteInterfaceDictionary --- apps/translation/admin.py | 9 ++++-- .../0002_siteinterfacedictionary.py | 30 +++++++++++++++++++ apps/translation/models.py | 27 +++++++++++++++++ apps/translation/serializers.py | 18 +++++++++++ apps/translation/urls.py | 4 +++ apps/translation/views.py | 29 ++++++++++++++++++ 6 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 apps/translation/migrations/0002_siteinterfacedictionary.py diff --git a/apps/translation/admin.py b/apps/translation/admin.py index 02b46ec5..d7cad36a 100644 --- a/apps/translation/admin.py +++ b/apps/translation/admin.py @@ -1,7 +1,12 @@ from django.contrib import admin -from translation.models import Language +from translation import models -@admin.register(Language) +@admin.register(models.Language) class LanguageAdmin(admin.ModelAdmin): """Language admin.""" + + +@admin.register(models.SiteInterfaceDictionary) +class SiteInterfaceDictionaryAdmin(admin.ModelAdmin): + """Site interface dictionary admin conf.""" diff --git a/apps/translation/migrations/0002_siteinterfacedictionary.py b/apps/translation/migrations/0002_siteinterfacedictionary.py new file mode 100644 index 00000000..3040a21d --- /dev/null +++ b/apps/translation/migrations/0002_siteinterfacedictionary.py @@ -0,0 +1,30 @@ +# Generated by Django 2.2.4 on 2019-08-20 09:58 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('translation', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='SiteInterfaceDictionary', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')), + ('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')), + ('page', models.CharField(db_index=True, max_length=255, verbose_name='Page')), + ('keywords', models.CharField(max_length=255, verbose_name='Keywords')), + ('text', django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=None, help_text='{"en":"some text"}', null=True, verbose_name='Text')), + ], + options={ + 'verbose_name': 'Site interface dictionary', + 'verbose_name_plural': 'Site interface dictionary', + }, + ), + ] diff --git a/apps/translation/models.py b/apps/translation/models.py index ed0ce8c3..f675b315 100644 --- a/apps/translation/models.py +++ b/apps/translation/models.py @@ -1,6 +1,8 @@ """Translation app models.""" +from django.contrib.postgres.fields import JSONField from django.db import models from django.utils.translation import gettext_lazy as _ +from utils.models import ProjectBaseMixin, LocaleManagerMixin class LanguageQuerySet(models.QuerySet): @@ -34,3 +36,28 @@ class Language(models.Model): def __str__(self): """String method""" return f'{self.title} ({self.locale})' + + +class SiteInterfaceDictionaryManager(LocaleManagerMixin): + """Extended manager for SiteInterfaceDictionary model.""" + + +class SiteInterfaceDictionary(ProjectBaseMixin): + """Site interface dictionary model.""" + + page = models.CharField(max_length=255, db_index=True, + verbose_name=_('Page')) + keywords = models.CharField(max_length=255, verbose_name='Keywords') + text = JSONField(_('Text'), null=True, blank=True, + default=None, help_text='{"en":"some text"}') + + objects = SiteInterfaceDictionaryManager() + + class Meta: + """Meta class.""" + + verbose_name = _('Site interface dictionary') + verbose_name_plural = _('Site interface dictionary') + + def __str__(self): + return f'{self.page}: {self.keywords}' diff --git a/apps/translation/serializers.py b/apps/translation/serializers.py index de703681..d5d8d553 100644 --- a/apps/translation/serializers.py +++ b/apps/translation/serializers.py @@ -12,3 +12,21 @@ class LanguageSerializer(serializers.ModelSerializer): 'title', 'locale' ] + + +class SiteInterfaceDictionarySerializer(serializers.ModelSerializer): + """Serializer for model SiteInterfaceDictionary.""" + + text_trans = serializers.CharField(read_only=True) + text = serializers.JSONField(write_only=True) + + class Meta: + """Meta class.""" + model = models.SiteInterfaceDictionary + fields = [ + 'id', + 'page', + 'keywords', + 'text', + 'text_trans', + ] diff --git a/apps/translation/urls.py b/apps/translation/urls.py index ddcafe4a..507ce165 100644 --- a/apps/translation/urls.py +++ b/apps/translation/urls.py @@ -9,4 +9,8 @@ urlpatterns = [ name='languages'), path('languages//', views.LanguageRetrieveUpdateDestroyView.as_view(), name='language'), + path('site/', views.SiteInterfaceDictionaryView.as_view(), + name='site-interface'), + path('site//', views.SiteInterfaceDictionaryRUDView.as_view(), + name='site-interface-rud'), ] diff --git a/apps/translation/views.py b/apps/translation/views.py index 64d59c70..e3b90673 100644 --- a/apps/translation/views.py +++ b/apps/translation/views.py @@ -1,6 +1,7 @@ """Translation app views.""" from rest_framework import generics, permissions from translation import models, serializers +from utils.views import JWTGenericViewMixin # Mixins @@ -22,3 +23,31 @@ class LanguageListCreateView(LanguageViewMixin, generics.ListCreateAPIView): class LanguageRetrieveUpdateDestroyView(LanguageViewMixin, generics.RetrieveUpdateDestroyAPIView): """Retrieve, Update, Destroy view for model Language""" + + +class SiteInterfaceDictionaryMixin: + + # todo: refactor this + def get_queryset(self): + locale = self._get_locale(self.request) or 'en' + return models.SiteInterfaceDictionary.objects.annotate_localized_fields( + locale=locale) + +class SiteInterfaceDictionaryView(JWTGenericViewMixin, + SiteInterfaceDictionaryMixin, + generics.ListCreateAPIView): + """Site interface dictionary LC view.""" + + pagination_class = None + permission_classes = (permissions.IsAuthenticatedOrReadOnly,) + serializer_class = serializers.SiteInterfaceDictionarySerializer + filter_fields = ['page', 'keywords'] + + +class SiteInterfaceDictionaryRUDView(JWTGenericViewMixin, + SiteInterfaceDictionaryMixin, + generics.RetrieveUpdateDestroyAPIView): + """Site interface dictionary RUD view.""" + + permission_classes = (permissions.AllowAny,) + serializer_class = serializers.SiteInterfaceDictionarySerializer