You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

84 lines
2.4 KiB

import random
from django.db import models
from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _
def get_default_region_pk():
region = Region.get_default_region()
return region.pk if region else None
class Region(models.Model):
name = models.CharField(
max_length=255,
unique=True,
verbose_name=_('Region Name'),
help_text=_('Name of the geographical or administrative region (e.g. Middle East, Europe).')
)
slug = models.SlugField(
max_length=255,
unique=True,
blank=True,
null=True,
allow_unicode=True,
verbose_name=_('Slug / URL Identifier')
)
code = models.CharField(
max_length=50,
blank=True,
null=True,
verbose_name=_('Region Code'),
help_text=_('Short code such as MENA, EU, NA, etc.')
)
description = models.TextField(
blank=True,
null=True,
verbose_name=_('Description')
)
is_active = models.BooleanField(
default=True,
verbose_name=_('Is Active')
)
created_at = models.DateTimeField(
auto_now_add=True,
verbose_name=_('Created At')
)
updated_at = models.DateTimeField(
auto_now=True,
verbose_name=_('Updated At')
)
class Meta:
ordering = ('name',)
verbose_name = _('Region')
verbose_name_plural = _('Regions')
def __str__(self):
return self.name
def save(self, *args, **kwargs):
if not self.slug:
base_slug = slugify(self.name, allow_unicode=True) or f"region-{random.randint(1000, 9999)}"
slug = base_slug
counter = 1
while Region.objects.filter(slug=slug).exclude(pk=self.pk).exists():
slug = f"{base_slug}-{counter}"
counter += 1
self.slug = slug
super().save(*args, **kwargs)
@classmethod
def get_default_region(cls):
region = cls.objects.filter(name="Global / Other").first()
if not region:
region, _ = cls.objects.get_or_create(
slug="global-other",
defaults={
"name": "Global / Other",
"code": "GLB",
"description": "Default international / global region",
"is_active": True,
}
)
return region