diff --git a/apps/news/models.py b/apps/news/models.py index e840f9c5..da860c50 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -24,6 +24,8 @@ from utils.models import ( TJSONField, TranslatedFieldsMixin, TypeDefaultImageMixin, ) from utils.querysets import TranslationQuerysetMixin +from location.models import Country +from utils.parsers import NewsSlug class Agenda(ProjectBaseMixin, TranslatedFieldsMixin): @@ -358,9 +360,28 @@ class News(GalleryMixin, BaseAttributes, TranslatedFieldsMixin, HasTagsMixin, return f'news: {next(iter(self.slugs.values()))}' def create_duplicate(self, new_country, view_count_model): + country_codes = list(Country.objects.all().values_list('code', flat=True)) + all_slugs = {slug_value + for slug_dict in News.objects.all().values_list('slugs', flat=True) + for slug_value in slug_dict.values()} + + new_slugs = {} + for locale, raw_slug in self.slugs.items(): + slug = NewsSlug.parse(raw_slug, country_codes) + similar_slugs = sorted(x for x in all_slugs if NewsSlug.parse(x, country_codes).value == slug.value) + if len(similar_slugs) == 0: + new_slugs[locale] = NewsSlug(slug.value, new_country.code) + else: + last_slug = NewsSlug.parse(similar_slugs[-1], country_codes) + new_slug = NewsSlug(slug.value, new_country.code, last_slug.count) + if last_slug.locale is not None: + new_slug.count += 1 + + new_slugs[locale] = str(new_slug) + self.pk = None self.state = self.UNPUBLISHED - self.slugs = {locale: f'{slug}-{new_country.code}' for locale, slug in self.slugs.items()} + self.slugs = new_slugs self.country = new_country self.views_count = view_count_model self.duplication_date = timezone.now()