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()