From d1f078cf0c42afcde569e1f58d05389c32aa65b6 Mon Sep 17 00:00:00 2001 From: tcely Date: Mon, 3 Feb 2025 08:12:09 -0500 Subject: [PATCH 1/5] Do not store duplicate categories --- tubesync/sync/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tubesync/sync/fields.py b/tubesync/sync/fields.py index a18518a1..71128628 100644 --- a/tubesync/sync/fields.py +++ b/tubesync/sync/fields.py @@ -180,7 +180,7 @@ class CommaSepChoiceField(models.CharField): return '' if data.all_choice in value: return data.all_choice - return data.separator.join(value) + return data.separator.join(set(reversed(value))) # extra functions not used by any parent classes def get_all_choices(self): From 79783b11dbb979003e0aea2a55dfbd9793b4daba Mon Sep 17 00:00:00 2001 From: tcely Date: Mon, 3 Feb 2025 08:53:34 -0500 Subject: [PATCH 2/5] Test duplicated category is not saved --- tubesync/sync/tests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tubesync/sync/tests.py b/tubesync/sync/tests.py index b26ff889..7b5365b8 100644 --- a/tubesync/sync/tests.py +++ b/tubesync/sync/tests.py @@ -223,6 +223,7 @@ class FrontEndTestCase(TestCase): self.assertEqual(response.status_code, 200) # save and refresh the Source source.refresh_from_db() + source.sponsorblock_categories.selected_choices.append('sponsor') source.save() source.refresh_from_db() # Check that the SponsorBlock categories remain saved From bdfd645097af610de5c700a65b6506a06933a4e5 Mon Sep 17 00:00:00 2001 From: tcely Date: Mon, 3 Feb 2025 09:11:35 -0500 Subject: [PATCH 3/5] Add duplicated categories to the test data --- tubesync/sync/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tubesync/sync/tests.py b/tubesync/sync/tests.py index 7b5365b8..a123a585 100644 --- a/tubesync/sync/tests.py +++ b/tubesync/sync/tests.py @@ -172,7 +172,7 @@ class FrontEndTestCase(TestCase): response = c.get('/source-add') self.assertEqual(response.status_code, 200) # Create a new source - data_categories = ('sponsor', 'preview',) + data_categories = ('sponsor', 'preview', 'preview', 'sponsor',) expected_categories = ['sponsor', 'preview'] data = { 'source_type': 'c', From 4a5660be8d19d889009355ee05c982a8b9bf61e7 Mon Sep 17 00:00:00 2001 From: tcely Date: Mon, 3 Feb 2025 09:16:26 -0500 Subject: [PATCH 4/5] Preserve the ordering set made no guarantees about ordering --- tubesync/sync/fields.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tubesync/sync/fields.py b/tubesync/sync/fields.py index 71128628..8a1dcf16 100644 --- a/tubesync/sync/fields.py +++ b/tubesync/sync/fields.py @@ -180,7 +180,8 @@ class CommaSepChoiceField(models.CharField): return '' if data.all_choice in value: return data.all_choice - return data.separator.join(set(reversed(value))) + ordered_unique = list(dict.fromkeys(value)) + return data.separator.join(ordered_unique) # extra functions not used by any parent classes def get_all_choices(self): From 724e6328140f8d90bc65502faa870d7313e11e2e Mon Sep 17 00:00:00 2001 From: tcely Date: Mon, 3 Feb 2025 09:22:29 -0500 Subject: [PATCH 5/5] Remove debug logging and cache --- tubesync/sync/fields.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tubesync/sync/fields.py b/tubesync/sync/fields.py index 8a1dcf16..5dfde5b4 100644 --- a/tubesync/sync/fields.py +++ b/tubesync/sync/fields.py @@ -1,5 +1,4 @@ from collections import namedtuple -from functools import lru_cache from typing import Any, Dict from django import forms from django.db import connection, models @@ -143,16 +142,10 @@ class CommaSepChoiceField(models.CharField): # **kwargs, # }) - @lru_cache(maxsize=10) def from_db_value(self, value, expression, connection): ''' Create a data structure to be used in Python code. - - This is called quite often with the same input, - because the database value doesn't change often. - So, it's being cached to prevent excessive logging. ''' - self.log.debug(f'fdbv:1: {type(value)} {repr(value)}') if isinstance(value, str) and len(value) > 0: value = value.split(self.separator) if not isinstance(value, list):