From 4010c9fedea6ed20d0976f0f4b45dcb9cc337dc0 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Tue, 10 Dec 2019 19:16:19 +0300 Subject: [PATCH] News multilang slugs (model && views) --- _dockerfiles/db/Dockerfile | 1 + _dockerfiles/db/hstore.sql | 1 + apps/news/migrations/0039_news_slugs.py | 27 +++++++++++++++++++++++++ apps/news/models.py | 4 ++++ apps/news/views.py | 6 +++++- apps/utils/views.py | 3 +++ project/settings/base.py | 1 + 7 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 _dockerfiles/db/hstore.sql create mode 100644 apps/news/migrations/0039_news_slugs.py diff --git a/_dockerfiles/db/Dockerfile b/_dockerfiles/db/Dockerfile index c3e35955..1a9d28c6 100644 --- a/_dockerfiles/db/Dockerfile +++ b/_dockerfiles/db/Dockerfile @@ -1,3 +1,4 @@ FROM mdillon/postgis:10 RUN localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8 ENV LANG ru_RU.utf8 +COPY hstore.sql /docker-entrypoint-initdb.d \ No newline at end of file diff --git a/_dockerfiles/db/hstore.sql b/_dockerfiles/db/hstore.sql new file mode 100644 index 00000000..97962703 --- /dev/null +++ b/_dockerfiles/db/hstore.sql @@ -0,0 +1 @@ +create extension hstore; \ No newline at end of file diff --git a/apps/news/migrations/0039_news_slugs.py b/apps/news/migrations/0039_news_slugs.py new file mode 100644 index 00000000..e8b996c8 --- /dev/null +++ b/apps/news/migrations/0039_news_slugs.py @@ -0,0 +1,27 @@ +# Generated by Django 2.2.7 on 2019-12-10 13:49 + +import django.contrib.postgres.fields.hstore +from django.db import migrations + +def migrate_slugs(apps, schemaeditor): + News = apps.get_model('news', 'News') + for news in News.objects.all(): + if news.slug: + news.slugs = {'en-GB': news.slug} + news.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('news', '0038_news_backoffice_title'), + ] + + operations = [ + migrations.AddField( + model_name='news', + name='slugs', + field=django.contrib.postgres.fields.hstore.HStoreField(blank=True, default=None, help_text='{"en-GB":"some slug"}', null=True, verbose_name='Slugs for current news obj'), + ), + migrations.RunPython(migrate_slugs, migrations.RunPython.noop) + ] diff --git a/apps/news/models.py b/apps/news/models.py index a2db35b4..465ce8ee 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -12,6 +12,7 @@ from utils.models import (BaseAttributes, TJSONField, TranslatedFieldsMixin, Has FavoritesMixin) from utils.querysets import TranslationQuerysetMixin from django.conf import settings +from django.contrib.postgres.fields import HStoreField class Agenda(ProjectBaseMixin, TranslatedFieldsMixin): @@ -182,6 +183,9 @@ class News(GalleryModelMixin, BaseAttributes, TranslatedFieldsMixin, HasTagsMixi verbose_name=_('End')) slug = models.SlugField(unique=True, max_length=255, verbose_name=_('News slug')) + slugs = HStoreField(null=True, blank=True, default=None, + verbose_name=_('Slugs for current news obj'), + help_text='{"en-GB":"some slug"}') state = models.PositiveSmallIntegerField(default=WAITING, choices=STATE_CHOICES, verbose_name=_('State')) is_highlighted = models.BooleanField(default=False, diff --git a/apps/news/views.py b/apps/news/views.py index a4a5c33a..54868e52 100644 --- a/apps/news/views.py +++ b/apps/news/views.py @@ -31,6 +31,10 @@ class NewsMixinView: qs = qs.by_country_code(country_code) return qs + def get_object(self): + return self.get_queryset() \ + .filter(slugs__values__contains=[self.kwargs['slug']]).first() + class NewsListView(NewsMixinView, generics.ListAPIView): """News list view.""" @@ -46,7 +50,7 @@ class NewsListView(NewsMixinView, generics.ListAPIView): class NewsDetailView(NewsMixinView, generics.RetrieveAPIView): """News detail view.""" - lookup_field = 'slug' + lookup_field = None serializer_class = serializers.NewsDetailWebSerializer def get_queryset(self): diff --git a/apps/utils/views.py b/apps/utils/views.py index 9ac8ca60..379e501b 100644 --- a/apps/utils/views.py +++ b/apps/utils/views.py @@ -9,6 +9,7 @@ from rest_framework.response import Response from gallery.tasks import delete_image from search_indexes.documents import es_update +from news.models import News # JWT @@ -124,6 +125,8 @@ class BaseCreateDestroyMixinView(generics.CreateAPIView, generics.DestroyAPIView lookup_field = 'slug' def get_base_object(self): + if isinstance(self._model, News): + get_object_or_404(self._model, slugs__values__contains=[self.kwargs['slug']]) return get_object_or_404(self._model, slug=self.kwargs['slug']) def es_update_base_object(self): diff --git a/project/settings/base.py b/project/settings/base.py index 5a48c261..31b7b8f7 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -48,6 +48,7 @@ CONTRIB_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.gis', + 'django.contrib.postgres', ]