News multilang slugs (model && views)
This commit is contained in:
parent
34173afb05
commit
4010c9fede
|
|
@ -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
|
||||||
1
_dockerfiles/db/hstore.sql
Normal file
1
_dockerfiles/db/hstore.sql
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
create extension hstore;
|
||||||
27
apps/news/migrations/0039_news_slugs.py
Normal file
27
apps/news/migrations/0039_news_slugs.py
Normal 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)
|
||||||
|
]
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user