Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
dj-kaos-utils / behaviors.py
Size: Mime:
import re

from django.core.exceptions import ValidationError
from django.db import models
from django.utils.text import slugify

from kaos_utils.fields import MediumCharField


class HasInitials:
    take_initials_from = None

    @property
    def initials(self):
        assert self.take_initials_from is not None, f"Please define take_initials_from on the model {self.__class__}"
        return "".join(
            s[0] if s else '' for s in re.split(r"[\W_]+", getattr(self, self.take_initials_from))).capitalize()


class HasUniqueName(models.Model):
    name = MediumCharField(unique=True)

    def __str__(self):
        # return f"{self._meta.verbose_name.capitalize()}: {self.name}"
        return self.name

    class Meta:
        abstract = True

    def generate_name(self):
        raise Exception(NotImplemented)

    def clean(self):
        if not self.name:
            name = self.generate_name()
            if type(self)._default_manager.filter(name=name).exists():
                raise ValidationError({
                    'name': f"{type(self)._meta.verbose_name.capitalize()} with this name already exists"
                })
            self.name = name
        return super(HasUniqueName, self).clean()

    def save(self, *args, **kwargs):
        if not self.name:
            self.name = self.generate_name()
        super(HasUniqueName, self).save(*args, **kwargs)


class _HasAutoSlug(models.Model):
    slug_source_field = 'name'
    error_on_duplicate_slug = False

    class Meta:
        abstract = True

    @property
    def slug_source(self):
        return getattr(self, self.slug_source_field)

    def generate_slug(self):
        return slugify(self.slug_source)

    def clean(self):
        if not self.slug:
            slug = self.generate_slug()
            if type(self)._default_manager.filter(slug=slug).exists():
                raise ValidationError(f"{type(self)._meta.verbose_name.capitalize()} with this slug already exists")
            self.slug = slug
        super(_HasAutoSlug, self).clean()

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = self.generate_slug()
        super(_HasAutoSlug, self).save(*args, **kwargs)


class HasAutoSlug(_HasAutoSlug):
    slug = models.SlugField(max_length=255, unique=True, editable=False)

    class Meta:
        abstract = True


class HasAutoSlugPK(_HasAutoSlug):
    slug = models.SlugField(max_length=255, unique=True, editable=False)

    class Meta:
        abstract = True