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 / models / mixins.py
Size: Mime:
import re
import uuid

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

from kaos_utils.behaviors import HasAutoSlug, HasUniqueName
from .utils import get_verbose_name


class UUIDMixin(models.Model):
    uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)

    @property
    def uuid_str(self):
        return str(self.uuid)
    
    @property
    def short_uuid(self):
        return str(self.uuid).split('-')[-1]

    class Meta:
        abstract = True


class NameSlugModelMixin(HasUniqueName, HasAutoSlug, models.Model):
    class Meta:
        abstract = True


class HasCodename(HasUniqueName, models.Model):
    @property
    def typename(self):
        return get_verbose_name(self)

    @property
    def codename(self):
        return f"[{self.typename}] {self.name}"

    def __str__(self):
        return self.codename

    class Meta:
        abstract = True


class HasCodenameSlug(HasCodename, HasAutoSlug):
    class Meta:
        abstract = True

    def generate_slug(self):
        match = re.compile(r'\[.*\] (?P<name>.*)').match(self.codename)
        if not match:
            raise ValidationError("Unsupported codename")
        return slugify(match.groupdict()['name'])


class KaosModel(UUIDMixin, HasCodenameSlug, TimeStampedModel, models.Model):
    class Meta:
        abstract = True