[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)), 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 has_moved = False
user = User.objects.filter(id=user_id).first()
if not user:
return False
last_point = ( loc_diff = self.loc_diff(
user.scrobble_set.filter(media_type="GeoLocation") (previous_location.lat, previous_location.lon)
.order_by("-timestamp") )
.first()
).media_obj
if not last_point:
return True
loc_diff = self.loc_diff((last_point.lat, last_point.lon))
if loc_diff[0] > GEOLOC_PROXIMITY or loc_diff[1] > GEOLOC_PROXIMITY: if loc_diff[0] > GEOLOC_PROXIMITY or loc_diff[1] > GEOLOC_PROXIMITY:
has_moved = True has_moved = True
logger.debug( logger.debug(
f"[locations] checked whether location has moved against proximity setting", f"[locations] checked whether location has moved against proximity setting",
extra={ extra={
"location": self, "location_id": self.id,
"loc_diff": loc_diff, "loc_diff": loc_diff,
"has_moved": has_moved, "has_moved": has_moved,
"point": last_point, "previous_location_id": previous_location.id,
"geoloc_proximity": GEOLOC_PROXIMITY, "geoloc_proximity": GEOLOC_PROXIMITY,
}, },
) )

View File

@ -72,17 +72,10 @@ def test_has_moved(caplog):
lon = -69.234 lon = -69.234
loc = GeoLocation.objects.create(lat=lat, lon=lon, altitude=60) loc = GeoLocation.objects.create(lat=lat, lon=lon, altitude=60)
past1 = GeoLocation.objects.get_or_create( past = GeoLocation.objects.get_or_create(
lat=lat + 0.000, lon=lon - 0.000, altitude=60 lat=lat + 0.0009, lon=lon - 0.002, altitude=60
)[0] )[0]
past2 = GeoLocation.objects.get_or_create( assert loc.has_moved(past)
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)
@pytest.mark.django_db @pytest.mark.django_db
@ -91,17 +84,7 @@ def test_has_not_moved():
lon = -69.234 lon = -69.234
loc = GeoLocation.objects.create(lat=lat, lon=lon, altitude=60) loc = GeoLocation.objects.create(lat=lat, lon=lon, altitude=60)
past1 = GeoLocation.objects.get_or_create( past = GeoLocation.objects.get_or_create(
lat=lat + 0.00001, lon=lon - 0.0000, altitude=60 lat=lat + 0.00009, lon=lon - 0.00009, altitude=60
)[0] )[0]
past2 = GeoLocation.objects.get_or_create( assert not loc.has_moved(past)
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)

View File

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