2024-07-08 11:44:39 -04:00
|
|
|
from django.db import models
|
|
|
|
from django.contrib.auth import get_user_model
|
2024-08-17 08:07:50 -04:00
|
|
|
from django.core.exceptions import ValidationError
|
2024-08-23 13:56:27 -04:00
|
|
|
from django.contrib.gis.db import models as gis_models
|
2024-07-08 11:44:39 -04:00
|
|
|
|
|
|
|
|
|
|
|
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)
|
2024-09-10 23:00:13 -04:00
|
|
|
country_code = models.CharField(max_length=2, unique=True) #iso2 code
|
|
|
|
subregion = models.CharField(max_length=100, blank=True, null=True)
|
2024-09-11 16:08:10 -04:00
|
|
|
capital = models.CharField(max_length=100, blank=True, null=True)
|
2025-01-01 19:27:33 -05:00
|
|
|
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)
|
2024-07-08 11:44:39 -04:00
|
|
|
|
|
|
|
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)
|
2024-09-10 23:00:13 -04:00
|
|
|
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)
|
2024-07-08 11:44:39 -04:00
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
2025-01-09 11:11:02 -05:00
|
|
|
|
|
|
|
class City(models.Model):
|
|
|
|
id = models.CharField(primary_key=True)
|
|
|
|
name = models.CharField(max_length=100)
|
|
|
|
region = models.ForeignKey(Region, 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)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
verbose_name_plural = "Cities"
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
2024-07-08 11:44:39 -04:00
|
|
|
|
|
|
|
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}'
|
2024-08-17 08:07:50 -04:00
|
|
|
|
|
|
|
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.")
|
2025-01-09 12:38:29 -05:00
|
|
|
super().save(*args, **kwargs)
|
|
|
|
|
|
|
|
class VisitedCity(models.Model):
|
|
|
|
id = models.AutoField(primary_key=True)
|
|
|
|
user_id = models.ForeignKey(
|
|
|
|
User, on_delete=models.CASCADE, default=default_user_id)
|
|
|
|
city = models.ForeignKey(City, on_delete=models.CASCADE)
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return f'{self.city.name} ({self.city.region.name}) visited by: {self.user_id.username}'
|
|
|
|
|
|
|
|
def save(self, *args, **kwargs):
|
|
|
|
if VisitedCity.objects.filter(user_id=self.user_id, city=self.city).exists():
|
|
|
|
raise ValidationError("City already visited by user.")
|
|
|
|
super().save(*args, **kwargs)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
verbose_name_plural = "Visited Cities"
|