from django.db import models from django.contrib.auth import get_user_model from django.core.exceptions import ValidationError from django.contrib.gis.db import models as gis_models User = get_user_model() default_user_id = 1 # Replace with an actual user ID class Country(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=100) country_code = models.CharField(max_length=2, unique=True) #iso2 code subregion = models.CharField(max_length=100, blank=True, null=True) class Meta: verbose_name = "Country" verbose_name_plural = "Countries" def __str__(self): return self.name class Region(models.Model): id = models.CharField(primary_key=True) name = models.CharField(max_length=100) country = models.ForeignKey(Country, on_delete=models.CASCADE) longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) def __str__(self): return self.name class VisitedRegion(models.Model): id = models.AutoField(primary_key=True) user_id = models.ForeignKey( User, on_delete=models.CASCADE, default=default_user_id) region = models.ForeignKey(Region, on_delete=models.CASCADE) def __str__(self): return f'{self.region.name} ({self.region.country.country_code}) visited by: {self.user_id.username}' def save(self, *args, **kwargs): if VisitedRegion.objects.filter(user_id=self.user_id, region=self.region).exists(): raise ValidationError("Region already visited by user.") super().save(*args, **kwargs)