From a287a15beb09f3355c92afce9d03e5cf92322939 Mon Sep 17 00:00:00 2001 From: alisx255 <72024630+alisx255@users.noreply.github.com> Date: Sun, 15 Feb 2026 14:32:11 -0500 Subject: [PATCH 1/8] Add coords to sublet model --- ...let_true_latitude_sublet_true_longitude.py | 27 ++++++++++++ backend/market/models.py | 42 +++++++++++++++++++ backend/market/serializers.py | 33 ++++++++++++++- 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py diff --git a/backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py b/backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py new file mode 100644 index 0000000..553dba4 --- /dev/null +++ b/backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py @@ -0,0 +1,27 @@ +# Generated by Django 5.0.2 on 2026-02-13 23:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("market", "0004_rename_address_sublet_street_address_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="sublet", + name="true_latitude", + field=models.DecimalField( + blank=True, decimal_places=6, max_digits=9, null=True + ), + ), + migrations.AddField( + model_name="sublet", + name="true_longitude", + field=models.DecimalField( + blank=True, decimal_places=6, max_digits=9, null=True + ), + ), + ] diff --git a/backend/market/models.py b/backend/market/models.py index f0ad0c9..16c3345 100644 --- a/backend/market/models.py +++ b/backend/market/models.py @@ -131,10 +131,52 @@ class Sublet(Listing): start_date = models.DateField() end_date = models.DateField() + true_latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) + true_longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) + + def clean(self): super().clean() if self.start_date and self.end_date and self.start_date >= self.end_date: raise ValidationError({"end_date": "End date must be after start date"}) + + def _calculate_fake_location(self, true_latitude, true_longitude): + import math + import hashlib + from decimal import Decimal + + if true_latitude is None or true_longitude is None: + return None, None + + lat_str = f"{float(true_latitude):.6f}" + lon_str = f"{float(true_longitude):.6f}" + seed = hashlib.md5(f"{lat_str}{lon_str}".encode()).hexdigest() + + offset_factor = int(seed[:8], 16) / 0xFFFFFFFF + + offset_distance = 0.0005 + (offset_factor * 0.0013) + angle = offset_factor * 2 * math.pi + + lat_offset = offset_distance * math.sin(angle) + lon_offset = offset_distance * math.cos(angle) + + approx_lat = Decimal(str(float(true_latitude) + lat_offset)) + approx_lon = Decimal(str(float(true_longitude) + lon_offset)) + return approx_lat, approx_lon + + @property + def fake_latitude(self): + if self.true_latitude and self.true_longitude: + fake_lat, _ = self._calculate_fake_location(self.true_latitude, self.true_longitude) + return fake_lat + return None + + @property + def fake_longitude(self): + if self.true_latitude and self.true_longitude: + _, fake_lon = self._calculate_fake_location(self.true_latitude, self.true_longitude) + return fake_lon + return None def save(self, *args, **kwargs): self.full_clean() diff --git a/backend/market/serializers.py b/backend/market/serializers.py index 91604b8..d9fe807 100644 --- a/backend/market/serializers.py +++ b/backend/market/serializers.py @@ -98,9 +98,25 @@ def get_condition(self, obj): class SubletDataSerializer(ModelSerializer): + latitude = SerializerMethodField() + longitude = SerializerMethodField() + class Meta: model = Sublet - fields = ["street_address", "beds", "baths", "start_date", "end_date"] + fields = ["street_address", "beds", "baths", "start_date", "end_date", "latitude", "longitude"] + + def get_latitude(self, obj): + if obj.true_latitude and obj.true_longitude: + fake_lat, _ = obj._calculate_fake_location(obj.true_latitude, obj.true_longitude) + return float(fake_lat) if fake_lat else None + return None + + def get_longitude(self, obj): + if obj.true_latitude and obj.true_longitude: + _, fake_lon = obj._calculate_fake_location(obj.true_latitude, obj.true_longitude) + return float(fake_lon) if fake_lon else None + return None + # Unified serializer for all listing types (Items and Sublets); used for CRUD operations @@ -255,14 +271,25 @@ def _create_item(self, validated_data, additional_data): return item def _create_sublet(self, validated_data, additional_data): + from decimal import Decimal, ROUND_DOWN tags = validated_data.pop("tags", None) + latitude = additional_data.get("latitude") + longitude = additional_data.get("longitude") + + if latitude is not None: + latitude = Decimal(str(latitude)).quantize(Decimal("1.000000"), rounding=ROUND_DOWN) + if longitude is not None: + longitude = Decimal(str(longitude)).quantize(Decimal("1.000000"), rounding=ROUND_DOWN) + sublet = Sublet.objects.create( street_address=additional_data.get("street_address"), beds=additional_data.get("beds"), baths=additional_data.get("baths"), start_date=additional_data.get("start_date"), end_date=additional_data.get("end_date"), + true_latitude=latitude, + true_longitude=longitude, **validated_data, ) @@ -319,6 +346,10 @@ def _update_sublet(self, instance, additional_data): for field in sublet_fields: if field in additional_data: setattr(sublet, field, additional_data[field]) + if "latitude" in additional_data: + sublet.true_latitude = additional_data["latitude"] + if "longitude" in additional_data: + sublet.true_longitude = additional_data["longitude"] sublet.full_clean() sublet.save() From fc15fc1080bf0e700ee62386f334a80b4482c329 Mon Sep 17 00:00:00 2001 From: alisx255 <72024630+alisx255@users.noreply.github.com> Date: Sun, 15 Feb 2026 14:52:18 -0500 Subject: [PATCH 2/8] Add coords to sublet model --- backend/market/models.py | 25 ++++++++++++++----------- backend/market/serializers.py | 19 ++++++++++++------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/backend/market/models.py b/backend/market/models.py index 16c3345..8aa84b0 100644 --- a/backend/market/models.py +++ b/backend/market/models.py @@ -42,7 +42,6 @@ class Meta: def __str__(self): return f"Offer for {self.listing} made by {self.user}" - class Category(models.Model): name = models.CharField(max_length=100, unique=True) @@ -131,23 +130,25 @@ class Sublet(Listing): start_date = models.DateField() end_date = models.DateField() - true_latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) - true_longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) - + true_latitude = models.DecimalField( + max_digits=9, decimal_places=6, null=True, blank=True) + true_longitude = models.DecimalField( + max_digits=9, decimal_places=6, null=True, blank=True) + def clean(self): super().clean() if self.start_date and self.end_date and self.start_date >= self.end_date: raise ValidationError({"end_date": "End date must be after start date"}) - + def _calculate_fake_location(self, true_latitude, true_longitude): - import math import hashlib + import math from decimal import Decimal if true_latitude is None or true_longitude is None: return None, None - + lat_str = f"{float(true_latitude):.6f}" lon_str = f"{float(true_longitude):.6f}" seed = hashlib.md5(f"{lat_str}{lon_str}".encode()).hexdigest() @@ -158,7 +159,7 @@ def _calculate_fake_location(self, true_latitude, true_longitude): angle = offset_factor * 2 * math.pi lat_offset = offset_distance * math.sin(angle) - lon_offset = offset_distance * math.cos(angle) + lon_offset = offset_distance * math.cos(angle) approx_lat = Decimal(str(float(true_latitude) + lat_offset)) approx_lon = Decimal(str(float(true_longitude) + lon_offset)) @@ -167,14 +168,16 @@ def _calculate_fake_location(self, true_latitude, true_longitude): @property def fake_latitude(self): if self.true_latitude and self.true_longitude: - fake_lat, _ = self._calculate_fake_location(self.true_latitude, self.true_longitude) + fake_lat, _ = self._calculate_fake_location( + self.true_latitude, self.true_longitude) return fake_lat return None - + @property def fake_longitude(self): if self.true_latitude and self.true_longitude: - _, fake_lon = self._calculate_fake_location(self.true_latitude, self.true_longitude) + _, fake_lon = self._calculate_fake_location( + self.true_latitude, self.true_longitude) return fake_lon return None diff --git a/backend/market/serializers.py b/backend/market/serializers.py index d9fe807..1ada543 100644 --- a/backend/market/serializers.py +++ b/backend/market/serializers.py @@ -103,17 +103,20 @@ class SubletDataSerializer(ModelSerializer): class Meta: model = Sublet - fields = ["street_address", "beds", "baths", "start_date", "end_date", "latitude", "longitude"] + fields = ["street_address", "beds", "baths", "start_date", "end_date", + "latitude", "longitude"] def get_latitude(self, obj): if obj.true_latitude and obj.true_longitude: - fake_lat, _ = obj._calculate_fake_location(obj.true_latitude, obj.true_longitude) + fake_lat, _ = obj._calculate_fake_location( + obj.true_latitude, obj.true_longitude) return float(fake_lat) if fake_lat else None return None - + def get_longitude(self, obj): if obj.true_latitude and obj.true_longitude: - _, fake_lon = obj._calculate_fake_location(obj.true_latitude, obj.true_longitude) + _, fake_lon = obj._calculate_fake_location( + obj.true_latitude, obj.true_longitude) return float(fake_lon) if fake_lon else None return None @@ -271,16 +274,18 @@ def _create_item(self, validated_data, additional_data): return item def _create_sublet(self, validated_data, additional_data): - from decimal import Decimal, ROUND_DOWN + from decimal import ROUND_DOWN, Decimal tags = validated_data.pop("tags", None) latitude = additional_data.get("latitude") longitude = additional_data.get("longitude") if latitude is not None: - latitude = Decimal(str(latitude)).quantize(Decimal("1.000000"), rounding=ROUND_DOWN) + latitude = Decimal(str(latitude)).quantize( + Decimal("1.000000"), rounding=ROUND_DOWN) if longitude is not None: - longitude = Decimal(str(longitude)).quantize(Decimal("1.000000"), rounding=ROUND_DOWN) + longitude = Decimal(str(longitude)).quantize( + Decimal("1.000000"), rounding=ROUND_DOWN) sublet = Sublet.objects.create( street_address=additional_data.get("street_address"), From 4c6512da2a98e43a9d88736db6374638c23df72f Mon Sep 17 00:00:00 2001 From: alisx255 <72024630+alisx255@users.noreply.github.com> Date: Fri, 20 Feb 2026 04:39:47 -0500 Subject: [PATCH 3/8] Address PR feedback: - Use apporximate latitude/longitude properties instead of calling private methods - Round coordinates to 6 decimal places in serializer - Update field names from true_latitude/longitude to latitude/longitude --- ...let_true_latitude_sublet_true_longitude.py | 4 +- backend/market/models.py | 44 +++++++++---------- backend/market/serializers.py | 37 ++++++++-------- 3 files changed, 43 insertions(+), 42 deletions(-) diff --git a/backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py b/backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py index 553dba4..400457e 100644 --- a/backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py +++ b/backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py @@ -12,14 +12,14 @@ class Migration(migrations.Migration): operations = [ migrations.AddField( model_name="sublet", - name="true_latitude", + name="latitude", field=models.DecimalField( blank=True, decimal_places=6, max_digits=9, null=True ), ), migrations.AddField( model_name="sublet", - name="true_longitude", + name="longitude", field=models.DecimalField( blank=True, decimal_places=6, max_digits=9, null=True ), diff --git a/backend/market/models.py b/backend/market/models.py index 8aa84b0..eca4743 100644 --- a/backend/market/models.py +++ b/backend/market/models.py @@ -3,7 +3,9 @@ from django.core.validators import MinValueValidator from django.db import models from phonenumber_field.modelfields import PhoneNumberField - +import hashlib +import math +from decimal import Decimal class User(AbstractUser): """ @@ -130,9 +132,9 @@ class Sublet(Listing): start_date = models.DateField() end_date = models.DateField() - true_latitude = models.DecimalField( + latitude = models.DecimalField( max_digits=9, decimal_places=6, null=True, blank=True) - true_longitude = models.DecimalField( + longitude = models.DecimalField( max_digits=9, decimal_places=6, null=True, blank=True) @@ -141,16 +143,14 @@ def clean(self): if self.start_date and self.end_date and self.start_date >= self.end_date: raise ValidationError({"end_date": "End date must be after start date"}) - def _calculate_fake_location(self, true_latitude, true_longitude): - import hashlib - import math - from decimal import Decimal + def _calculate_approximate_location(self, latitude, longitude): + - if true_latitude is None or true_longitude is None: + if latitude is None or longitude is None: return None, None - lat_str = f"{float(true_latitude):.6f}" - lon_str = f"{float(true_longitude):.6f}" + lat_str = f"{float(latitude):.6f}" + lon_str = f"{float(longitude):.6f}" seed = hashlib.md5(f"{lat_str}{lon_str}".encode()).hexdigest() offset_factor = int(seed[:8], 16) / 0xFFFFFFFF @@ -161,24 +161,24 @@ def _calculate_fake_location(self, true_latitude, true_longitude): lat_offset = offset_distance * math.sin(angle) lon_offset = offset_distance * math.cos(angle) - approx_lat = Decimal(str(float(true_latitude) + lat_offset)) - approx_lon = Decimal(str(float(true_longitude) + lon_offset)) + approx_lat = Decimal(str(float(latitude) + lat_offset)) + approx_lon = Decimal(str(float(longitude) + lon_offset)) return approx_lat, approx_lon @property - def fake_latitude(self): - if self.true_latitude and self.true_longitude: - fake_lat, _ = self._calculate_fake_location( - self.true_latitude, self.true_longitude) - return fake_lat + def approximate_latitude(self): + if self.latitude and self.longitude: + approximate_latitude, _ = self._calculate_approximate_location( + self.latitude, self.longitude) + return approximate_latitude return None @property - def fake_longitude(self): - if self.true_latitude and self.true_longitude: - _, fake_lon = self._calculate_fake_location( - self.true_latitude, self.true_longitude) - return fake_lon + def approximate_longitude(self): + if self.latitude and self.longitude: + _, approximate_lon = self._calculate_approximate_location( + self.latitude, self.longitude) + return approximate_lon return None def save(self, *args, **kwargs): diff --git a/backend/market/serializers.py b/backend/market/serializers.py index 1ada543..deb7ef1 100644 --- a/backend/market/serializers.py +++ b/backend/market/serializers.py @@ -14,6 +14,7 @@ from market.mixins import ListingTypeMixin from market.models import Category, Item, Listing, ListingImage, Offer, Sublet, Tag +from decimal import ROUND_DOWN, Decimal User = get_user_model() @@ -107,21 +108,15 @@ class Meta: "latitude", "longitude"] def get_latitude(self, obj): - if obj.true_latitude and obj.true_longitude: - fake_lat, _ = obj._calculate_fake_location( - obj.true_latitude, obj.true_longitude) - return float(fake_lat) if fake_lat else None + if obj.approximate_latitude: + return round(float(obj.approximate_latitude), 6) return None def get_longitude(self, obj): - if obj.true_latitude and obj.true_longitude: - _, fake_lon = obj._calculate_fake_location( - obj.true_latitude, obj.true_longitude) - return float(fake_lon) if fake_lon else None + if obj.approximate_longitude: + return round(float(obj.approximate_longitude), 6) return None - - # Unified serializer for all listing types (Items and Sublets); used for CRUD operations class ListingSerializer(ListingTypeMixin, ModelSerializer): LISTING_TYPE_CONFIG = { @@ -274,27 +269,27 @@ def _create_item(self, validated_data, additional_data): return item def _create_sublet(self, validated_data, additional_data): - from decimal import ROUND_DOWN, Decimal tags = validated_data.pop("tags", None) latitude = additional_data.get("latitude") longitude = additional_data.get("longitude") + if latitude is not None: latitude = Decimal(str(latitude)).quantize( - Decimal("1.000000"), rounding=ROUND_DOWN) + Decimal("0.000001"), rounding=ROUND_DOWN) if longitude is not None: longitude = Decimal(str(longitude)).quantize( - Decimal("1.000000"), rounding=ROUND_DOWN) - + Decimal("0.000001"), rounding=ROUND_DOWN) + sublet = Sublet.objects.create( street_address=additional_data.get("street_address"), beds=additional_data.get("beds"), baths=additional_data.get("baths"), start_date=additional_data.get("start_date"), end_date=additional_data.get("end_date"), - true_latitude=latitude, - true_longitude=longitude, + latitude=latitude, + longitude=longitude, **validated_data, ) @@ -352,9 +347,15 @@ def _update_sublet(self, instance, additional_data): if field in additional_data: setattr(sublet, field, additional_data[field]) if "latitude" in additional_data: - sublet.true_latitude = additional_data["latitude"] + latitude = Decimal(str(additional_data["latitude"])).quantize( + Decimal("0.000001"), rounding=ROUND_DOWN + ) + sublet.latitude = latitude if "longitude" in additional_data: - sublet.true_longitude = additional_data["longitude"] + longitude = Decimal(str(additional_data["longitude"])).quantize( + Decimal("0.000001"), rounding=ROUND_DOWN + ) + sublet.longitude = longitude sublet.full_clean() sublet.save() From d1ec973a20cdeff2bb9a532c2eaf5033459eb88f Mon Sep 17 00:00:00 2001 From: alisx255 <72024630+alisx255@users.noreply.github.com> Date: Fri, 20 Feb 2026 15:37:36 -0500 Subject: [PATCH 4/8] Fix style check --- backend/market/models.py | 10 ++++++---- backend/market/serializers.py | 7 ++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/backend/market/models.py b/backend/market/models.py index eca4743..68df339 100644 --- a/backend/market/models.py +++ b/backend/market/models.py @@ -1,11 +1,13 @@ +import hashlib +import math +from decimal import Decimal + from django.contrib.auth.models import AbstractUser from django.core.exceptions import ValidationError from django.core.validators import MinValueValidator from django.db import models from phonenumber_field.modelfields import PhoneNumberField -import hashlib -import math -from decimal import Decimal + class User(AbstractUser): """ @@ -144,7 +146,7 @@ def clean(self): raise ValidationError({"end_date": "End date must be after start date"}) def _calculate_approximate_location(self, latitude, longitude): - + if latitude is None or longitude is None: return None, None diff --git a/backend/market/serializers.py b/backend/market/serializers.py index deb7ef1..b32d4a2 100644 --- a/backend/market/serializers.py +++ b/backend/market/serializers.py @@ -1,3 +1,5 @@ +from decimal import ROUND_DOWN, Decimal + from django.contrib.auth import get_user_model from django.core.exceptions import ValidationError as ModelValidationError from profanity_check import predict @@ -14,7 +16,6 @@ from market.mixins import ListingTypeMixin from market.models import Category, Item, Listing, ListingImage, Offer, Sublet, Tag -from decimal import ROUND_DOWN, Decimal User = get_user_model() @@ -274,14 +275,14 @@ def _create_sublet(self, validated_data, additional_data): latitude = additional_data.get("latitude") longitude = additional_data.get("longitude") - + if latitude is not None: latitude = Decimal(str(latitude)).quantize( Decimal("0.000001"), rounding=ROUND_DOWN) if longitude is not None: longitude = Decimal(str(longitude)).quantize( Decimal("0.000001"), rounding=ROUND_DOWN) - + sublet = Sublet.objects.create( street_address=additional_data.get("street_address"), beds=additional_data.get("beds"), From 9c994e19774740877854a0030fd2440934dce09a Mon Sep 17 00:00:00 2001 From: alisx255 <72024630+alisx255@users.noreply.github.com> Date: Sun, 22 Feb 2026 13:24:35 -0500 Subject: [PATCH 5/8] Change latitude/longitude to float and remove rounding --- ...let_true_latitude_sublet_true_longitude.py | 8 ++----- backend/market/models.py | 14 ++++++------- backend/market/serializers.py | 21 ++++++------------- 3 files changed, 14 insertions(+), 29 deletions(-) diff --git a/backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py b/backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py index 400457e..c9f6a12 100644 --- a/backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py +++ b/backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py @@ -13,15 +13,11 @@ class Migration(migrations.Migration): migrations.AddField( model_name="sublet", name="latitude", - field=models.DecimalField( - blank=True, decimal_places=6, max_digits=9, null=True - ), + field=models.FloatField(blank=True, null=True), ), migrations.AddField( model_name="sublet", name="longitude", - field=models.DecimalField( - blank=True, decimal_places=6, max_digits=9, null=True - ), + field=models.FloatField(blank=True, null=True), ), ] diff --git a/backend/market/models.py b/backend/market/models.py index 68df339..df0007c 100644 --- a/backend/market/models.py +++ b/backend/market/models.py @@ -134,10 +134,8 @@ class Sublet(Listing): start_date = models.DateField() end_date = models.DateField() - latitude = models.DecimalField( - max_digits=9, decimal_places=6, null=True, blank=True) - longitude = models.DecimalField( - max_digits=9, decimal_places=6, null=True, blank=True) + latitude = models.FloatField(null=True, blank=True) + longitude = models.FloatField(null=True, blank=True) def clean(self): @@ -151,8 +149,8 @@ def _calculate_approximate_location(self, latitude, longitude): if latitude is None or longitude is None: return None, None - lat_str = f"{float(latitude):.6f}" - lon_str = f"{float(longitude):.6f}" + lat_str = f"{float(latitude):.9f}" + lon_str = f"{float(longitude):.9f}" seed = hashlib.md5(f"{lat_str}{lon_str}".encode()).hexdigest() offset_factor = int(seed[:8], 16) / 0xFFFFFFFF @@ -163,8 +161,8 @@ def _calculate_approximate_location(self, latitude, longitude): lat_offset = offset_distance * math.sin(angle) lon_offset = offset_distance * math.cos(angle) - approx_lat = Decimal(str(float(latitude) + lat_offset)) - approx_lon = Decimal(str(float(longitude) + lon_offset)) + approx_lat = float(latitude) + lat_offset + approx_lon = float(longitude) + lon_offset return approx_lat, approx_lon @property diff --git a/backend/market/serializers.py b/backend/market/serializers.py index b32d4a2..6ac520a 100644 --- a/backend/market/serializers.py +++ b/backend/market/serializers.py @@ -1,4 +1,3 @@ -from decimal import ROUND_DOWN, Decimal from django.contrib.auth import get_user_model from django.core.exceptions import ValidationError as ModelValidationError @@ -110,12 +109,12 @@ class Meta: def get_latitude(self, obj): if obj.approximate_latitude: - return round(float(obj.approximate_latitude), 6) + return float(obj.approximate_latitude) return None def get_longitude(self, obj): if obj.approximate_longitude: - return round(float(obj.approximate_longitude), 6) + return float(obj.approximate_longitude) return None # Unified serializer for all listing types (Items and Sublets); used for CRUD operations @@ -277,11 +276,9 @@ def _create_sublet(self, validated_data, additional_data): if latitude is not None: - latitude = Decimal(str(latitude)).quantize( - Decimal("0.000001"), rounding=ROUND_DOWN) + latitude = float(latitude) if longitude is not None: - longitude = Decimal(str(longitude)).quantize( - Decimal("0.000001"), rounding=ROUND_DOWN) + longitude = float(longitude) sublet = Sublet.objects.create( street_address=additional_data.get("street_address"), @@ -348,15 +345,9 @@ def _update_sublet(self, instance, additional_data): if field in additional_data: setattr(sublet, field, additional_data[field]) if "latitude" in additional_data: - latitude = Decimal(str(additional_data["latitude"])).quantize( - Decimal("0.000001"), rounding=ROUND_DOWN - ) - sublet.latitude = latitude + sublet.latitude = float(additional_data["latitude"]) if "longitude" in additional_data: - longitude = Decimal(str(additional_data["longitude"])).quantize( - Decimal("0.000001"), rounding=ROUND_DOWN - ) - sublet.longitude = longitude + sublet.longitude = float(additional_data["longitude"]) sublet.full_clean() sublet.save() From 80a346c212842082197c66052e0670bf05c49ed2 Mon Sep 17 00:00:00 2001 From: alisx255 <72024630+alisx255@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:16:04 -0500 Subject: [PATCH 6/8] remove unnecessary import --- backend/market/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/market/models.py b/backend/market/models.py index df0007c..156c450 100644 --- a/backend/market/models.py +++ b/backend/market/models.py @@ -1,6 +1,5 @@ import hashlib import math -from decimal import Decimal from django.contrib.auth.models import AbstractUser from django.core.exceptions import ValidationError From 98080166e01fc03a5f4df6f8ed64e86b8cc037de Mon Sep 17 00:00:00 2001 From: Anthony Li Date: Wed, 18 Mar 2026 22:41:57 -0400 Subject: [PATCH 7/8] fix approx geocoords for 0.0 values --- backend/market/models.py | 22 +++++----------------- backend/market/serializers.py | 22 ++++++++++++---------- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/backend/market/models.py b/backend/market/models.py index 156c450..5c50ca3 100644 --- a/backend/market/models.py +++ b/backend/market/models.py @@ -132,19 +132,15 @@ class Sublet(Listing): baths = models.PositiveIntegerField() start_date = models.DateField() end_date = models.DateField() - latitude = models.FloatField(null=True, blank=True) longitude = models.FloatField(null=True, blank=True) - def clean(self): super().clean() if self.start_date and self.end_date and self.start_date >= self.end_date: raise ValidationError({"end_date": "End date must be after start date"}) def _calculate_approximate_location(self, latitude, longitude): - - if latitude is None or longitude is None: return None, None @@ -165,20 +161,12 @@ def _calculate_approximate_location(self, latitude, longitude): return approx_lat, approx_lon @property - def approximate_latitude(self): - if self.latitude and self.longitude: - approximate_latitude, _ = self._calculate_approximate_location( - self.latitude, self.longitude) - return approximate_latitude - return None - - @property - def approximate_longitude(self): - if self.latitude and self.longitude: - _, approximate_lon = self._calculate_approximate_location( + def approximate_location(self): + if self.latitude is not None and self.longitude is not None: + approximate_location = self._calculate_approximate_location( self.latitude, self.longitude) - return approximate_lon - return None + return approximate_location + return None, None def save(self, *args, **kwargs): self.full_clean() diff --git a/backend/market/serializers.py b/backend/market/serializers.py index 6ac520a..df7c101 100644 --- a/backend/market/serializers.py +++ b/backend/market/serializers.py @@ -108,13 +108,13 @@ class Meta: "latitude", "longitude"] def get_latitude(self, obj): - if obj.approximate_latitude: - return float(obj.approximate_latitude) + if obj.approximate_location is not None: + return float(obj.approximate_location[0]) return None def get_longitude(self, obj): - if obj.approximate_longitude: - return float(obj.approximate_longitude) + if obj.approximate_location is not None: + return float(obj.approximate_location[1]) return None # Unified serializer for all listing types (Items and Sublets); used for CRUD operations @@ -340,14 +340,16 @@ def _update_item(self, instance, additional_data): def _update_sublet(self, instance, additional_data): sublet = instance.sublet - sublet_fields = ["street_address", "beds", "baths", "start_date", "end_date"] - for field in sublet_fields: + str_fields = ["street_address", "beds", "baths", "start_date", "end_date"] + float_fields = ["latitude", "longitude"] + for field in str_fields: if field in additional_data: setattr(sublet, field, additional_data[field]) - if "latitude" in additional_data: - sublet.latitude = float(additional_data["latitude"]) - if "longitude" in additional_data: - sublet.longitude = float(additional_data["longitude"]) + + for field in float_fields: + if field in additional_data: + value = additional_data[field] + setattr(sublet, field, float(value) if value is not None else None) sublet.full_clean() sublet.save() From 244d1aa58257d661d1a7ad0a16fc24075510f1f4 Mon Sep 17 00:00:00 2001 From: Anthony Li Date: Wed, 18 Mar 2026 23:41:09 -0400 Subject: [PATCH 8/8] fix style check --- backend/market/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/market/serializers.py b/backend/market/serializers.py index df7c101..5f12618 100644 --- a/backend/market/serializers.py +++ b/backend/market/serializers.py @@ -345,7 +345,7 @@ def _update_sublet(self, instance, additional_data): for field in str_fields: if field in additional_data: setattr(sublet, field, additional_data[field]) - + for field in float_fields: if field in additional_data: value = additional_data[field]