Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
 def slugify(self, source_text, i=None):
     slug = default_slugify(source_text)
     if i is not None:
         slug += "_%d" % i
     return slug
Esempio n. 4
0
# -*- 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)
Esempio n. 5
0
 def slugify(self, tag, i=None):
     return default_slugify(tag, allow_unicode=True)
Esempio n. 6
0
 def slugify(self, source_text, i=None):
     slug = default_slugify(source_text)
     if i is not None:
         slug += "_%d" % i
     return slug