diff --git a/apps/news/models.py b/apps/news/models.py index 7c585148..24c5df11 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -361,6 +361,8 @@ class News(GalleryMixin, BaseAttributes, TranslatedFieldsMixin, HasTagsMixin, def create_duplicate(self, new_country, view_count_model): country_codes = list(Country.objects.all().values_list('code', flat=True)) + + # Get all existed slugs all_slugs = {slug_value for slug_dict in News.objects.all().values_list('slugs', flat=True) for slug_value in slug_dict.values()} @@ -368,12 +370,17 @@ class News(GalleryMixin, BaseAttributes, TranslatedFieldsMixin, HasTagsMixin, new_slugs = {} for locale, raw_slug in self.slugs.items(): slug = NewsSlug.parse(raw_slug, country_codes) + + # all slugs LIKE% slug similar_slugs = sorted(x for x in all_slugs if NewsSlug.parse(x, country_codes).value == slug.value) + if len(similar_slugs) == 0: # It is impossible because at least current instance has slug raise ValueError('Duplicating unsaved object') else: + # The last slug in similar_slugs is slug with largest count last_slug = NewsSlug.parse(similar_slugs[-1], country_codes) + new_slug = NewsSlug(slug.value, new_country.code, last_slug.count) if last_slug.country_code is not None: new_slug.count += 1 diff --git a/apps/utils/parsers.py b/apps/utils/parsers.py index 073aa1e4..dc84a60e 100644 --- a/apps/utils/parsers.py +++ b/apps/utils/parsers.py @@ -12,13 +12,19 @@ class NewsSlug: instance = NewsSlug() if len(rest) >= 1 and rest[-1] in country_codes: + # It is like 'slug-en' + instance.value = '-'.join([slug, *rest[:-1]]) instance.country_code = rest[-1] elif len(rest) >= 2 and rest[-1].isdigit() and rest[-2] in country_codes: + # It is like 'slug-en-1' + instance.value = '-'.join([slug, *rest[:-2]]) instance.country_code = rest[-2] instance.count = int(rest[-1]) else: + # It is like 'slug' + instance.value = '-'.join([slug, *rest]) return instance