Skip to content

Commit 4c6512d

Browse files
committed
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
1 parent fc15fc1 commit 4c6512d

3 files changed

Lines changed: 43 additions & 42 deletions

File tree

backend/market/migrations/0005_sublet_true_latitude_sublet_true_longitude.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ class Migration(migrations.Migration):
1212
operations = [
1313
migrations.AddField(
1414
model_name="sublet",
15-
name="true_latitude",
15+
name="latitude",
1616
field=models.DecimalField(
1717
blank=True, decimal_places=6, max_digits=9, null=True
1818
),
1919
),
2020
migrations.AddField(
2121
model_name="sublet",
22-
name="true_longitude",
22+
name="longitude",
2323
field=models.DecimalField(
2424
blank=True, decimal_places=6, max_digits=9, null=True
2525
),

backend/market/models.py

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
from django.core.validators import MinValueValidator
44
from django.db import models
55
from phonenumber_field.modelfields import PhoneNumberField
6-
6+
import hashlib
7+
import math
8+
from decimal import Decimal
79

810
class User(AbstractUser):
911
"""
@@ -130,9 +132,9 @@ class Sublet(Listing):
130132
start_date = models.DateField()
131133
end_date = models.DateField()
132134

133-
true_latitude = models.DecimalField(
135+
latitude = models.DecimalField(
134136
max_digits=9, decimal_places=6, null=True, blank=True)
135-
true_longitude = models.DecimalField(
137+
longitude = models.DecimalField(
136138
max_digits=9, decimal_places=6, null=True, blank=True)
137139

138140

@@ -141,16 +143,14 @@ def clean(self):
141143
if self.start_date and self.end_date and self.start_date >= self.end_date:
142144
raise ValidationError({"end_date": "End date must be after start date"})
143145

144-
def _calculate_fake_location(self, true_latitude, true_longitude):
145-
import hashlib
146-
import math
147-
from decimal import Decimal
146+
def _calculate_approximate_location(self, latitude, longitude):
147+
148148

149-
if true_latitude is None or true_longitude is None:
149+
if latitude is None or longitude is None:
150150
return None, None
151151

152-
lat_str = f"{float(true_latitude):.6f}"
153-
lon_str = f"{float(true_longitude):.6f}"
152+
lat_str = f"{float(latitude):.6f}"
153+
lon_str = f"{float(longitude):.6f}"
154154
seed = hashlib.md5(f"{lat_str}{lon_str}".encode()).hexdigest()
155155

156156
offset_factor = int(seed[:8], 16) / 0xFFFFFFFF
@@ -161,24 +161,24 @@ def _calculate_fake_location(self, true_latitude, true_longitude):
161161
lat_offset = offset_distance * math.sin(angle)
162162
lon_offset = offset_distance * math.cos(angle)
163163

164-
approx_lat = Decimal(str(float(true_latitude) + lat_offset))
165-
approx_lon = Decimal(str(float(true_longitude) + lon_offset))
164+
approx_lat = Decimal(str(float(latitude) + lat_offset))
165+
approx_lon = Decimal(str(float(longitude) + lon_offset))
166166
return approx_lat, approx_lon
167167

168168
@property
169-
def fake_latitude(self):
170-
if self.true_latitude and self.true_longitude:
171-
fake_lat, _ = self._calculate_fake_location(
172-
self.true_latitude, self.true_longitude)
173-
return fake_lat
169+
def approximate_latitude(self):
170+
if self.latitude and self.longitude:
171+
approximate_latitude, _ = self._calculate_approximate_location(
172+
self.latitude, self.longitude)
173+
return approximate_latitude
174174
return None
175175

176176
@property
177-
def fake_longitude(self):
178-
if self.true_latitude and self.true_longitude:
179-
_, fake_lon = self._calculate_fake_location(
180-
self.true_latitude, self.true_longitude)
181-
return fake_lon
177+
def approximate_longitude(self):
178+
if self.latitude and self.longitude:
179+
_, approximate_lon = self._calculate_approximate_location(
180+
self.latitude, self.longitude)
181+
return approximate_lon
182182
return None
183183

184184
def save(self, *args, **kwargs):

backend/market/serializers.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
from market.mixins import ListingTypeMixin
1616
from market.models import Category, Item, Listing, ListingImage, Offer, Sublet, Tag
17+
from decimal import ROUND_DOWN, Decimal
1718

1819

1920
User = get_user_model()
@@ -107,21 +108,15 @@ class Meta:
107108
"latitude", "longitude"]
108109

109110
def get_latitude(self, obj):
110-
if obj.true_latitude and obj.true_longitude:
111-
fake_lat, _ = obj._calculate_fake_location(
112-
obj.true_latitude, obj.true_longitude)
113-
return float(fake_lat) if fake_lat else None
111+
if obj.approximate_latitude:
112+
return round(float(obj.approximate_latitude), 6)
114113
return None
115114

116115
def get_longitude(self, obj):
117-
if obj.true_latitude and obj.true_longitude:
118-
_, fake_lon = obj._calculate_fake_location(
119-
obj.true_latitude, obj.true_longitude)
120-
return float(fake_lon) if fake_lon else None
116+
if obj.approximate_longitude:
117+
return round(float(obj.approximate_longitude), 6)
121118
return None
122119

123-
124-
125120
# Unified serializer for all listing types (Items and Sublets); used for CRUD operations
126121
class ListingSerializer(ListingTypeMixin, ModelSerializer):
127122
LISTING_TYPE_CONFIG = {
@@ -274,27 +269,27 @@ def _create_item(self, validated_data, additional_data):
274269
return item
275270

276271
def _create_sublet(self, validated_data, additional_data):
277-
from decimal import ROUND_DOWN, Decimal
278272
tags = validated_data.pop("tags", None)
279273

280274
latitude = additional_data.get("latitude")
281275
longitude = additional_data.get("longitude")
282276

277+
283278
if latitude is not None:
284279
latitude = Decimal(str(latitude)).quantize(
285-
Decimal("1.000000"), rounding=ROUND_DOWN)
280+
Decimal("0.000001"), rounding=ROUND_DOWN)
286281
if longitude is not None:
287282
longitude = Decimal(str(longitude)).quantize(
288-
Decimal("1.000000"), rounding=ROUND_DOWN)
289-
283+
Decimal("0.000001"), rounding=ROUND_DOWN)
284+
290285
sublet = Sublet.objects.create(
291286
street_address=additional_data.get("street_address"),
292287
beds=additional_data.get("beds"),
293288
baths=additional_data.get("baths"),
294289
start_date=additional_data.get("start_date"),
295290
end_date=additional_data.get("end_date"),
296-
true_latitude=latitude,
297-
true_longitude=longitude,
291+
latitude=latitude,
292+
longitude=longitude,
298293
**validated_data,
299294
)
300295

@@ -352,9 +347,15 @@ def _update_sublet(self, instance, additional_data):
352347
if field in additional_data:
353348
setattr(sublet, field, additional_data[field])
354349
if "latitude" in additional_data:
355-
sublet.true_latitude = additional_data["latitude"]
350+
latitude = Decimal(str(additional_data["latitude"])).quantize(
351+
Decimal("0.000001"), rounding=ROUND_DOWN
352+
)
353+
sublet.latitude = latitude
356354
if "longitude" in additional_data:
357-
sublet.true_longitude = additional_data["longitude"]
355+
longitude = Decimal(str(additional_data["longitude"])).quantize(
356+
Decimal("0.000001"), rounding=ROUND_DOWN
357+
)
358+
sublet.longitude = longitude
358359
sublet.full_clean()
359360
sublet.save()
360361

0 commit comments

Comments
 (0)