diff --git a/changedetectionio/model/Watch.py b/changedetectionio/model/Watch.py
index c0a0527c15f..2fc82616b04 100644
--- a/changedetectionio/model/Watch.py
+++ b/changedetectionio/model/Watch.py
@@ -247,37 +247,32 @@ def newest_history_key(self):
bump = self.history
return self.__newest_history_key
- # Given an arbitrary timestamp, find the closest next key
- # For example, last_viewed = 1000 so it should return the next 1001 timestamp
- #
- # used for the [diff] button so it can preset a smarter from_version
+ # Given an arbitrary timestamp, find the best history key for the [diff] button so it can preset a smarter from_version
@property
- def get_next_snapshot_key_to_last_viewed(self):
+ def get_from_version_based_on_last_viewed(self):
"""Unfortunately for now timestamp is stored as string key"""
keys = list(self.history.keys())
if not keys:
return None
+ if len(keys) == 1:
+ return keys[0]
last_viewed = int(self.get('last_viewed'))
- prev_k = keys[0]
sorted_keys = sorted(keys, key=lambda x: int(x))
sorted_keys.reverse()
- # When the 'last viewed' timestamp is greater than the newest snapshot, return second last
- if last_viewed > int(sorted_keys[0]):
+ # When the 'last viewed' timestamp is greater than or equal the newest snapshot, return second newest
+ if last_viewed >= int(sorted_keys[0]):
return sorted_keys[1]
-
- for k in sorted_keys:
- if int(k) < last_viewed:
- if prev_k == sorted_keys[0]:
- # Return the second last one so we dont recommend the same version compares itself
- return sorted_keys[1]
-
- return prev_k
- prev_k = k
-
- return keys[0]
+
+ # When the 'last viewed' timestamp is between snapshots, return the older snapshot
+ for newer, older in list(zip(sorted_keys[0:], sorted_keys[1:])):
+ if last_viewed < int(newer) and last_viewed >= int(older):
+ return older
+
+ # When the 'last viewed' timestamp is less than the oldest snapshot, return oldest
+ return sorted_keys[-1]
def get_history_snapshot(self, timestamp):
import brotli
diff --git a/changedetectionio/templates/watch-overview.html b/changedetectionio/templates/watch-overview.html
index 6a0a50677b2..d6632cbed5c 100644
--- a/changedetectionio/templates/watch-overview.html
+++ b/changedetectionio/templates/watch-overview.html
@@ -191,7 +191,7 @@
{% if watch.history_n >= 2 %}
{% if is_unviewed %}
- History
+ History
{% else %}
History
{% endif %}
diff --git a/changedetectionio/tests/unit/test_watch_model.py b/changedetectionio/tests/unit/test_watch_model.py
index a550cd0a946..1856b0ddb58 100644
--- a/changedetectionio/tests/unit/test_watch_model.py
+++ b/changedetectionio/tests/unit/test_watch_model.py
@@ -16,7 +16,6 @@ def test_watch_get_suggested_from_diff_timestamp(self):
watch = Watch.model(datastore_path='/tmp', default={})
watch.ensure_data_dir_exists()
- watch['last_viewed'] = 110
# Contents from the browser are always returned from the browser/requests/etc as str, str is basically UTF-16 in python
watch.save_history_text(contents="hello world", timestamp=100, snapshot_id=str(uuid_builder.uuid4()))
@@ -25,31 +24,42 @@ def test_watch_get_suggested_from_diff_timestamp(self):
watch.save_history_text(contents="hello world", timestamp=112, snapshot_id=str(uuid_builder.uuid4()))
watch.save_history_text(contents="hello world", timestamp=115, snapshot_id=str(uuid_builder.uuid4()))
watch.save_history_text(contents="hello world", timestamp=117, snapshot_id=str(uuid_builder.uuid4()))
+
+ p = watch.get_from_version_based_on_last_viewed
+ assert p == "100", "Correct 'last viewed' timestamp was detected"
- p = watch.get_next_snapshot_key_to_last_viewed
- assert p == "112", "Correct last-viewed timestamp was detected"
+ watch['last_viewed'] = 110
+ p = watch.get_from_version_based_on_last_viewed
+ assert p == "109", "Correct 'last viewed' timestamp was detected"
- # When there is only one step of difference from the end of the list, it should return second-last change
watch['last_viewed'] = 116
- p = watch.get_next_snapshot_key_to_last_viewed
- assert p == "115", "Correct 'second last' last-viewed timestamp was detected when using the last timestamp"
+ p = watch.get_from_version_based_on_last_viewed
+ assert p == "115", "Correct 'last viewed' timestamp was detected"
watch['last_viewed'] = 99
- p = watch.get_next_snapshot_key_to_last_viewed
- assert p == "100"
+ p = watch.get_from_version_based_on_last_viewed
+ assert p == "100", "When the 'last viewed' timestamp is less than the oldest snapshot, return oldest"
watch['last_viewed'] = 200
- p = watch.get_next_snapshot_key_to_last_viewed
- assert p == "115", "When the 'last viewed' timestamp is greater than the newest snapshot, return second last "
+ p = watch.get_from_version_based_on_last_viewed
+ assert p == "115", "When the 'last viewed' timestamp is greater than the newest snapshot, return second newest"
watch['last_viewed'] = 109
- p = watch.get_next_snapshot_key_to_last_viewed
+ p = watch.get_from_version_based_on_last_viewed
assert p == "109", "Correct when its the same time"
# new empty one
watch = Watch.model(datastore_path='/tmp', default={})
- p = watch.get_next_snapshot_key_to_last_viewed
+ p = watch.get_from_version_based_on_last_viewed
assert p == None, "None when no history available"
+ watch.save_history_text(contents="hello world", timestamp=100, snapshot_id=str(uuid_builder.uuid4()))
+ p = watch.get_from_version_based_on_last_viewed
+ assert p == "100", "Correct with only one history snapshot"
+
+ watch['last_viewed'] = 200
+ p = watch.get_from_version_based_on_last_viewed
+ assert p == "100", "Correct with only one history snapshot"
+
if __name__ == '__main__':
unittest.main()