[locations] Dramatically simplify checking for mvement

This commit is contained in:
2024-03-12 17:53:09 -04:00
parent 0cd95036da
commit 874d9dc7d2
3 changed files with 13 additions and 40 deletions

View File

@ -91,31 +91,21 @@ class GeoLocation(ScrobblableMixin):
abs(Decimal(old_lat_lon[1]) - Decimal(self.lon)),
)
def has_moved_for_user(self, user_id: int) -> bool:
def has_moved(self, previous_location: "GeoLocation") -> bool:
has_moved = False
user = User.objects.filter(id=user_id).first()
if not user:
return False
last_point = (
user.scrobble_set.filter(media_type="GeoLocation")
.order_by("-timestamp")
.first()
).media_obj
if not last_point:
return True
loc_diff = self.loc_diff((last_point.lat, last_point.lon))
loc_diff = self.loc_diff(
(previous_location.lat, previous_location.lon)
)
if loc_diff[0] > GEOLOC_PROXIMITY or loc_diff[1] > GEOLOC_PROXIMITY:
has_moved = True
logger.debug(
f"[locations] checked whether location has moved against proximity setting",
extra={
"location": self,
"location_id": self.id,
"loc_diff": loc_diff,
"has_moved": has_moved,
"point": last_point,
"previous_location_id": previous_location.id,
"geoloc_proximity": GEOLOC_PROXIMITY,
},
)

View File

@ -72,17 +72,10 @@ def test_has_moved(caplog):
lon = -69.234
loc = GeoLocation.objects.create(lat=lat, lon=lon, altitude=60)
past1 = GeoLocation.objects.get_or_create(
lat=lat + 0.000, lon=lon - 0.000, altitude=60
past = GeoLocation.objects.get_or_create(
lat=lat + 0.0009, lon=lon - 0.002, altitude=60
)[0]
past2 = GeoLocation.objects.get_or_create(
lat=lat + 0.002, lon=lon - 0.002, altitude=60
)[0]
past3 = GeoLocation.objects.get_or_create(
lat=lat + 0.0001, lon=lon - 0.000, altitude=60
)[0]
last_three = [past1, past2, past3]
assert loc.has_moved(last_three)
assert loc.has_moved(past)
@pytest.mark.django_db
@ -91,17 +84,7 @@ def test_has_not_moved():
lon = -69.234
loc = GeoLocation.objects.create(lat=lat, lon=lon, altitude=60)
past1 = GeoLocation.objects.get_or_create(
lat=lat + 0.00001, lon=lon - 0.0000, altitude=60
past = GeoLocation.objects.get_or_create(
lat=lat + 0.00009, lon=lon - 0.00009, altitude=60
)[0]
past2 = GeoLocation.objects.get_or_create(
lat=lat + 0.000, lon=lon - 0.000, altitude=60
)[0]
past3 = GeoLocation.objects.get_or_create(
lat=lat + 0.0000, lon=lon - 0.00001, altitude=60
)[0]
past4 = GeoLocation.objects.get_or_create(
lat=lat + 0.005, lon=lon - 0.0003, altitude=60
)[0]
last_four = [past1, past2, past3, past4]
assert not loc.has_moved(last_four)
assert not loc.has_moved(past)

View File

@ -932,7 +932,7 @@ class Scrobble(TimeStampedModel):
)
return scrobble
has_moved = location.has_moved_for_user(scrobble.user.id)
has_moved = location.has_moved(scrobble.media_obj)
logger.info(
f"[scrobbling] checking - has last location has moved?",
extra={