News multilang slugs (model && views)

This commit is contained in:
Kuroshini 2019-12-10 19:16:19 +03:00
parent 34173afb05
commit 4010c9fede
7 changed files with 42 additions and 1 deletions

View File

@ -1,3 +1,4 @@
FROM mdillon/postgis:10 FROM mdillon/postgis:10
RUN localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8 RUN localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8
ENV LANG ru_RU.utf8 ENV LANG ru_RU.utf8
COPY hstore.sql /docker-entrypoint-initdb.d

View File

@ -0,0 +1 @@
create extension hstore;

View File

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

View File

@ -12,6 +12,7 @@ from utils.models import (BaseAttributes, TJSONField, TranslatedFieldsMixin, Has
FavoritesMixin) FavoritesMixin)
from utils.querysets import TranslationQuerysetMixin from utils.querysets import TranslationQuerysetMixin
from django.conf import settings from django.conf import settings
from django.contrib.postgres.fields import HStoreField
class Agenda(ProjectBaseMixin, TranslatedFieldsMixin): class Agenda(ProjectBaseMixin, TranslatedFieldsMixin):
@ -182,6 +183,9 @@ class News(GalleryModelMixin, BaseAttributes, TranslatedFieldsMixin, HasTagsMixi
verbose_name=_('End')) verbose_name=_('End'))
slug = models.SlugField(unique=True, max_length=255, slug = models.SlugField(unique=True, max_length=255,
verbose_name=_('News slug')) 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, state = models.PositiveSmallIntegerField(default=WAITING, choices=STATE_CHOICES,
verbose_name=_('State')) verbose_name=_('State'))
is_highlighted = models.BooleanField(default=False, is_highlighted = models.BooleanField(default=False,

View File

@ -31,6 +31,10 @@ class NewsMixinView:
qs = qs.by_country_code(country_code) qs = qs.by_country_code(country_code)
return qs return qs
def get_object(self):
return self.get_queryset() \
.filter(slugs__values__contains=[self.kwargs['slug']]).first()
class NewsListView(NewsMixinView, generics.ListAPIView): class NewsListView(NewsMixinView, generics.ListAPIView):
"""News list view.""" """News list view."""
@ -46,7 +50,7 @@ class NewsListView(NewsMixinView, generics.ListAPIView):
class NewsDetailView(NewsMixinView, generics.RetrieveAPIView): class NewsDetailView(NewsMixinView, generics.RetrieveAPIView):
"""News detail view.""" """News detail view."""
lookup_field = 'slug' lookup_field = None
serializer_class = serializers.NewsDetailWebSerializer serializer_class = serializers.NewsDetailWebSerializer
def get_queryset(self): def get_queryset(self):

View File

@ -9,6 +9,7 @@ from rest_framework.response import Response
from gallery.tasks import delete_image from gallery.tasks import delete_image
from search_indexes.documents import es_update from search_indexes.documents import es_update
from news.models import News
# JWT # JWT
@ -124,6 +125,8 @@ class BaseCreateDestroyMixinView(generics.CreateAPIView, generics.DestroyAPIView
lookup_field = 'slug' lookup_field = 'slug'
def get_base_object(self): 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']) return get_object_or_404(self._model, slug=self.kwargs['slug'])
def es_update_base_object(self): def es_update_base_object(self):

View File

@ -48,6 +48,7 @@ CONTRIB_APPS = [
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'django.contrib.gis', 'django.contrib.gis',
'django.contrib.postgres',
] ]