def save(self, *args, **kwargs): # Update the search index if self.update_search_on_save: self.search_data = self.get_search_data() # Ensure there is an owner. if self.app_config.create_authors and self.author is None: self.author = Person.objects.get_or_create( user=self.owner, defaults={ 'name': u' '.join((self.owner.first_name, self.owner.last_name)) })[0] # Start with a naïve approach, if none provided. if not self.slug: self.slug = force_unicode(default_slugify(self.title)) # NOTE: It is very important that we never allow a blank slug to be # saved to the database. If we do, then subsequent attempts to create an # article will fail Django validation on the form, since we are asking # it to enforce uniqueness for (language, slug) pairs, and the slug in # the form starts out empty. When Django tries to validate, it finds # that the (language, slug) pair already exists, and we never even get # here. # # Since the slug is derived from the title of the article, if the slug # is still empty, then the title must be /effectively/ untitled. if not self.slug: self.slug = ugettext('untitled-article') # Ensure we aren't colliding with an existing slug *for this language*. if not Article.objects.language(self.get_current_language()).filter( translations__slug=self.slug).exclude(pk=self.pk).exists(): return super(Article, self).save(*args, **kwargs) for lang in LANGUAGE_CODES: # # We'd much rather just do something like: # Article.objects.translated(lang, # slug__startswith=self.slug) # But sadly, this isn't supported by Parler/Django, see: # http://django-parler.readthedocs.org/en/latest/api/\ # parler.managers.html#the-translatablequeryset-class # slugs = [] all_slugs = Article.objects.language(lang).exclude( pk=self.pk).values_list('translations__slug', flat=True) for slug in all_slugs: if slug and slug.startswith((self.title, self.slug)): slugs.append(slug) i = 1 while True: slug = self.slugify(self.title or self.slug, i) if slug not in slugs: self.slug = slug return super(Article, self).save(*args, **kwargs) i += 1
def save(self, *args, **kwargs): # Ensure there is an owner. if self.app_config.create_authors and self.author is None: self.author = Person.objects.get_or_create( user=self.owner, defaults={ 'name': u' '.join((self.owner.first_name, self.owner.last_name)) })[0] # Start with a naïve approach, if none provided. if not self.slug: self.slug = default_slugify(self.title) # Ensure we aren't colliding with an existing slug *for this language*. if Article.objects.translated(slug=self.slug).exclude( id=self.id).count() == 0: return super(Article, self).save(*args, **kwargs) for lang in LANGUAGE_CODES: # # We'd much rather just do something like: # Article.objects.translated(lang, # slug__startswith=self.slug) # But sadly, this isn't supported by Parler/Django, see: # http://django-parler.readthedocs.org/en/latest/api/\ # parler.managers.html#the-translatablequeryset-class # slugs = [] all_slugs = Article.objects.language(lang).exclude( id=self.id).values_list('translations__slug', flat=True) for slug in all_slugs: if slug and slug.startswith(self.slug): slugs.append(slug) i = 1 while True: slug = self.slugify(self.title, i) if slug not in slugs: self.slug = slug return super(Article, self).save(*args, **kwargs) i += 1
def slugify(self, source_text, i=None): slug = default_slugify(source_text) if i is not None: slug += "_%d" % i return slug
# -*- coding: utf-8 -*- import uuid import pathlib from django.utils.text import slugify as default_slugify from .conf import settings slugify = lambda x: default_slugify(x).lower().strip() def parse_filename(filename): path = pathlib.Path(filename) return path.stem, path.suffix.lower() def get_valid_filename(filename): stem, suffix = parse_filename(filename) return "{uuid}{suffix}".format(uuid=uuid.uuid4(), suffix=suffix)
def slugify(self, tag, i=None): return default_slugify(tag, allow_unicode=True)