From 16f06ce2f1bbc134c1a39d08087bf98a72a2e78e Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 26 Oct 2019 22:02:38 +0300 Subject: [PATCH] fix news slug --- apps/news/models.py | 6 +++--- apps/transfer/serializers/news.py | 3 +++ apps/transfer/serializers/recipe.py | 4 ++-- apps/utils/slug_generator.py | 15 +++++++++++++++ 4 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 apps/utils/slug_generator.py diff --git a/apps/news/models.py b/apps/news/models.py index dbb2f5bf..306e4906 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -1,11 +1,12 @@ """News app models.""" -from django.db import models from django.contrib.contenttypes import fields as generic +from django.db import models from django.utils import timezone from django.utils.translation import gettext_lazy as _ from rest_framework.reverse import reverse -from utils.models import BaseAttributes, TJSONField, TranslatedFieldsMixin, ProjectBaseMixin + from rating.models import Rating +from utils.models import BaseAttributes, TJSONField, TranslatedFieldsMixin, ProjectBaseMixin class NewsType(models.Model): @@ -217,7 +218,6 @@ class NewsGalleryQuerySet(models.QuerySet): class NewsGallery(models.Model): - news = models.ForeignKey(News, null=True, related_name='news_gallery', on_delete=models.CASCADE, diff --git a/apps/transfer/serializers/news.py b/apps/transfer/serializers/news.py index c6a70fa9..e46c5b4a 100644 --- a/apps/transfer/serializers/news.py +++ b/apps/transfer/serializers/news.py @@ -2,10 +2,12 @@ from rest_framework import serializers from news.models import News from utils.legacy_parser import parse_legacy_news_content +from utils.slug_generator import generate_unique_slug class NewsSerializer(serializers.ModelSerializer): locale = serializers.CharField() + slug = serializers.CharField() body = serializers.CharField(allow_null=True) title = serializers.CharField() template = serializers.CharField() @@ -27,6 +29,7 @@ class NewsSerializer(serializers.ModelSerializer): def validate(self, data): data.update({ + 'slug': generate_unique_slug(News, data['slug']), 'state': self.get_state(data), 'template': self.get_template(data), 'title': self.get_title(data), diff --git a/apps/transfer/serializers/recipe.py b/apps/transfer/serializers/recipe.py index 3948bbdd..11698ba1 100644 --- a/apps/transfer/serializers/recipe.py +++ b/apps/transfer/serializers/recipe.py @@ -1,6 +1,6 @@ from rest_framework import serializers from recipe.models import Recipe -from utils.legacy_parser import parse_legacy_content +from utils.legacy_parser import parse_legacy_news_content class RecipeSerializer(serializers.ModelSerializer): @@ -51,5 +51,5 @@ class RecipeSerializer(serializers.ModelSerializer): # return {"en-GB": desc} content = None if obj['body']: - content = parse_legacy_content(obj['body']) + content = parse_legacy_news_content(obj['body']) return {obj['locale']: content} diff --git a/apps/utils/slug_generator.py b/apps/utils/slug_generator.py new file mode 100644 index 00000000..fa1ec772 --- /dev/null +++ b/apps/utils/slug_generator.py @@ -0,0 +1,15 @@ +from django.utils.text import slugify + + +def generate_unique_slug(klass, text): + """ + return unique slug if origin slug is exist. + eg: `foo-bar` => `foo-bar-1` + """ + origin_slug = slugify(text) + unique_slug = origin_slug + numb = 1 + while klass.objects.filter(slug=unique_slug).exists(): + unique_slug = f'{origin_slug}-{numb}' + numb += 1 + return unique_slug