Add comments on create_duplicate and NewsSlug parser

This commit is contained in:
Dmitry Borzenin 2020-02-07 16:53:25 +03:00
parent 06137fcccf
commit afc39a6257
2 changed files with 13 additions and 0 deletions

View File

@ -361,6 +361,8 @@ class News(GalleryMixin, BaseAttributes, TranslatedFieldsMixin, HasTagsMixin,
def create_duplicate(self, new_country, view_count_model): def create_duplicate(self, new_country, view_count_model):
country_codes = list(Country.objects.all().values_list('code', flat=True)) country_codes = list(Country.objects.all().values_list('code', flat=True))
# Get all existed slugs
all_slugs = {slug_value all_slugs = {slug_value
for slug_dict in News.objects.all().values_list('slugs', flat=True) for slug_dict in News.objects.all().values_list('slugs', flat=True)
for slug_value in slug_dict.values()} for slug_value in slug_dict.values()}
@ -368,12 +370,17 @@ class News(GalleryMixin, BaseAttributes, TranslatedFieldsMixin, HasTagsMixin,
new_slugs = {} new_slugs = {}
for locale, raw_slug in self.slugs.items(): for locale, raw_slug in self.slugs.items():
slug = NewsSlug.parse(raw_slug, country_codes) 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) similar_slugs = sorted(x for x in all_slugs if NewsSlug.parse(x, country_codes).value == slug.value)
if len(similar_slugs) == 0: if len(similar_slugs) == 0:
# It is impossible because at least current instance has slug # It is impossible because at least current instance has slug
raise ValueError('Duplicating unsaved object') raise ValueError('Duplicating unsaved object')
else: else:
# The last slug in similar_slugs is slug with largest count
last_slug = NewsSlug.parse(similar_slugs[-1], country_codes) last_slug = NewsSlug.parse(similar_slugs[-1], country_codes)
new_slug = NewsSlug(slug.value, new_country.code, last_slug.count) new_slug = NewsSlug(slug.value, new_country.code, last_slug.count)
if last_slug.country_code is not None: if last_slug.country_code is not None:
new_slug.count += 1 new_slug.count += 1

View File

@ -12,13 +12,19 @@ class NewsSlug:
instance = NewsSlug() instance = NewsSlug()
if len(rest) >= 1 and rest[-1] in country_codes: if len(rest) >= 1 and rest[-1] in country_codes:
# It is like 'slug-en'
instance.value = '-'.join([slug, *rest[:-1]]) instance.value = '-'.join([slug, *rest[:-1]])
instance.country_code = rest[-1] instance.country_code = rest[-1]
elif len(rest) >= 2 and rest[-1].isdigit() and rest[-2] in country_codes: 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.value = '-'.join([slug, *rest[:-2]])
instance.country_code = rest[-2] instance.country_code = rest[-2]
instance.count = int(rest[-1]) instance.count = int(rest[-1])
else: else:
# It is like 'slug'
instance.value = '-'.join([slug, *rest]) instance.value = '-'.join([slug, *rest])
return instance return instance