2025-04-28 17:39:24 +05:30
|
|
|
from django.core.exceptions import ValidationError
|
2025-04-30 14:55:35 +05:30
|
|
|
from django.db import models
|
2025-04-28 17:39:24 +05:30
|
|
|
from geopy.geocoders import Nominatim
|
|
|
|
|
|
2025-04-30 14:55:35 +05:30
|
|
|
from base.models import Company
|
2025-04-28 17:39:24 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
class GeoFencing(models.Model):
|
2025-04-30 14:55:35 +05:30
|
|
|
latitude = models.FloatField(max_length=100)
|
2025-04-28 17:39:24 +05:30
|
|
|
longitude = models.FloatField(max_length=100)
|
|
|
|
|
radius_in_meters = models.IntegerField()
|
2025-04-30 14:55:35 +05:30
|
|
|
company_id = models.OneToOneField(
|
|
|
|
|
"base.Company",
|
|
|
|
|
related_name="geo_fencing",
|
|
|
|
|
on_delete=models.CASCADE,
|
|
|
|
|
blank=True,
|
|
|
|
|
null=True,
|
|
|
|
|
)
|
2025-04-28 17:39:24 +05:30
|
|
|
start = models.BooleanField(default=False)
|
|
|
|
|
|
|
|
|
|
def clean(self):
|
|
|
|
|
geolocator = Nominatim(user_agent="geo_checker") # Use a unique user-agent
|
|
|
|
|
try:
|
2025-04-30 14:55:35 +05:30
|
|
|
location = geolocator.reverse(
|
|
|
|
|
(self.latitude, self.longitude), exactly_one=True
|
|
|
|
|
)
|
2025-04-28 17:39:24 +05:30
|
|
|
if location:
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
raise ValidationError("Invalid Location")
|
|
|
|
|
except Exception as e:
|
2025-04-30 14:55:35 +05:30
|
|
|
raise ValidationError(e)
|
|
|
|
|
return super().clean()
|
2025-04-28 17:39:24 +05:30
|
|
|
|
2025-04-30 14:55:35 +05:30
|
|
|
def save_base(
|
|
|
|
|
self, raw=..., force_insert=..., force_update=..., using=..., update_fields=...
|
|
|
|
|
):
|
2025-04-28 17:39:24 +05:30
|
|
|
self.clean()
|
2025-04-30 14:55:35 +05:30
|
|
|
return super().save_base(raw, force_insert, force_update, using, update_fields)
|