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