diff --git a/bookmarks/models.py b/bookmarks/models.py index 87711ceb2..87142830b 100644 --- a/bookmarks/models.py +++ b/bookmarks/models.py @@ -331,6 +331,7 @@ class UserProfile(models.Model): enable_favicons = models.BooleanField(default=False, null=False) display_url = models.BooleanField(default=False, null=False) permanent_notes = models.BooleanField(default=False, null=False) + custom_css = models.TextField(blank=True, null=False) search_preferences = models.JSONField(default=dict, null=False) @@ -348,6 +349,7 @@ class Meta: "enable_favicons", "display_url", "permanent_notes", + "custom_css", ] diff --git a/bookmarks/styles/settings.scss b/bookmarks/styles/settings.scss index b533abbe0..b62e76f50 100644 --- a/bookmarks/styles/settings.scss +++ b/bookmarks/styles/settings.scss @@ -7,6 +7,10 @@ } } + textarea.custom-css { + font-family: monospace; + } + .input-group > input[type=submit] { height: auto; } diff --git a/bookmarks/templates/bookmarks/layout.html b/bookmarks/templates/bookmarks/layout.html index ff4f336ba..fca6a9a2b 100644 --- a/bookmarks/templates/bookmarks/layout.html +++ b/bookmarks/templates/bookmarks/layout.html @@ -34,6 +34,9 @@ {% endif %} + {% if request.user_profile.custom_css %} + + {% endif %} diff --git a/bookmarks/templates/settings/general.html b/bookmarks/templates/settings/general.html index fa3f1b96f..823f0b1c8 100644 --- a/bookmarks/templates/settings/general.html +++ b/bookmarks/templates/settings/general.html @@ -124,6 +124,18 @@

Profile

href="{% url 'bookmarks:shared' %}">shared bookmarks page. +
+
+ Custom CSS + +
+ {{ form.custom_css|add_class:"form-input custom-css"|attr:"rows:6" }} +
+
+
+ Allows to add custom CSS to the page. +
+
{% if update_profile_success_message %} diff --git a/bookmarks/tests/test_custom_css.py b/bookmarks/tests/test_custom_css.py new file mode 100644 index 000000000..ce0e91ea4 --- /dev/null +++ b/bookmarks/tests/test_custom_css.py @@ -0,0 +1,21 @@ +from django.test import TestCase +from django.urls import reverse + +from bookmarks.tests.helpers import BookmarkFactoryMixin + + +class CustomCssTestCase(TestCase, BookmarkFactoryMixin): + def setUp(self): + self.client.force_login(self.get_or_create_test_user()) + + def test_does_not_render_custom_style_tag_by_default(self): + response = self.client.get(reverse("bookmarks:index")) + self.assertNotContains(response, "") diff --git a/bookmarks/tests/test_settings_general_view.py b/bookmarks/tests/test_settings_general_view.py index 61868302b..f9ed787be 100644 --- a/bookmarks/tests/test_settings_general_view.py +++ b/bookmarks/tests/test_settings_general_view.py @@ -32,6 +32,7 @@ def create_profile_form_data(self, overrides=None): "tag_search": UserProfile.TAG_SEARCH_STRICT, "display_url": False, "permanent_notes": False, + "custom_css": "", } return {**form_data, **overrides} @@ -63,6 +64,7 @@ def test_update_profile(self): "tag_search": UserProfile.TAG_SEARCH_LAX, "display_url": True, "permanent_notes": True, + "custom_css": "body { background-color: #000; }", } response = self.client.post(reverse("bookmarks:settings.general"), form_data) html = response.content.decode() @@ -93,6 +95,7 @@ def test_update_profile(self): self.assertEqual( self.user.profile.permanent_notes, form_data["permanent_notes"] ) + self.assertEqual(self.user.profile.custom_css, form_data["custom_css"]) self.assertInHTML( """

Profile updated

diff --git a/siteroot/settings/base.py b/siteroot/settings/base.py index 373cfa0a5..c0723920e 100644 --- a/siteroot/settings/base.py +++ b/siteroot/settings/base.py @@ -131,8 +131,6 @@ # Turn off SASS compilation by default SASS_PROCESSOR_ENABLED = False -# Location where generated CSS files are saved -SASS_PROCESSOR_ROOT = os.path.join(BASE_DIR, "bookmarks", "static") # Add SASS preprocessor finder to resolve generated CSS STATICFILES_FINDERS = [