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
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
|