Repository URL to install this package:
|
Version:
0.0.1 ▾
|
dj-kaos-utils
/
behaviors.py
|
|---|
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