diff --git a/.github/workflows/test-only.yml b/.github/workflows/test-only.yml index 3064e97d..7acb7c7a 100644 --- a/.github/workflows/test-only.yml +++ b/.github/workflows/test-only.yml @@ -51,6 +51,7 @@ jobs: run: | # Unit tests docker run test-changedetectionio bash -c 'python3 -m unittest changedetectionio.tests.unit.test_notification_diff' + docker run test-changedetectionio bash -c 'python3 -m unittest changedetectionio.tests.unit.test_watch_model' # All tests docker run --network changedet-network test-changedetectionio bash -c 'cd changedetectionio && ./run_basic_tests.sh' diff --git a/changedetectionio/__init__.py b/changedetectionio/__init__.py index 9edea3cc..6a95b156 100644 --- a/changedetectionio/__init__.py +++ b/changedetectionio/__init__.py @@ -961,7 +961,7 @@ def changedetection_app(config=None, datastore_o=None): # Read as binary and force decode as UTF-8 # Windows may fail decode in python if we just use 'r' mode (chardet decode exception) from_version = request.args.get('from_version') - from_version_index = -2 # second newest + from_version_index = -2 # second newest if from_version and from_version in dates: from_version_index = dates.index(from_version) else: @@ -970,7 +970,7 @@ def changedetection_app(config=None, datastore_o=None): try: from_version_file_contents = watch.get_history_snapshot(dates[from_version_index]) except Exception as e: - from_version_file_contents = "Unable to read to-version at index{}.\n".format(dates[from_version_index]) + from_version_file_contents = f"Unable to read to-version at index {dates[from_version_index]}.\n" to_version = request.args.get('to_version') to_version_index = -1 diff --git a/changedetectionio/model/Watch.py b/changedetectionio/model/Watch.py index 90858e39..50cbb6b3 100644 --- a/changedetectionio/model/Watch.py +++ b/changedetectionio/model/Watch.py @@ -262,6 +262,38 @@ class model(dict): 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 + @property + def get_next_snapshot_key_to_last_viewed(self): + + """Unfortunately for now timestamp is stored as string key""" + keys = list(self.history.keys()) + if not keys: + return None + + 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]): + 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] + def get_history_snapshot(self, timestamp): import brotli filepath = self.history[timestamp] diff --git a/changedetectionio/templates/watch-overview.html b/changedetectionio/templates/watch-overview.html index 4b04ead0..85620356 100644 --- a/changedetectionio/templates/watch-overview.html +++ b/changedetectionio/templates/watch-overview.html @@ -82,12 +82,15 @@ {% endif %} {% for watch in (watches|sort(attribute=sort_attribute, reverse=sort_order == 'asc'))|pagination_slice(skip=pagination.skip) %} + + {% set is_unviewed = watch.newest_history_key| int > watch.last_viewed and watch.history_n>=2 %} +