From 0b93eb78f411f9fe8d4b5d1aff0977476b3069bb Mon Sep 17 00:00:00 2001 From: Cy Date: Sat, 30 May 2020 06:40:53 +0000 Subject: [PATCH 1/3] Refactoring preferences to be more cohesive No need to list the preference fields three times in three places in the code. A class decorator ought to be able to sleuth them out from the model itself. Should make it easier to add new preferences. --- brutaldon/forms.py | 14 +------------- brutaldon/models.py | 11 +++++++++++ brutaldon/views.py | 19 ++++--------------- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/brutaldon/forms.py b/brutaldon/forms.py index 84db4cd..d348d5f 100644 --- a/brutaldon/forms.py +++ b/brutaldon/forms.py @@ -28,19 +28,7 @@ class OAuthLoginForm(forms.Form): class PreferencesForm(forms.ModelForm): class Meta: model = Preference - fields = [ - "theme", - "filter_replies", - "filter_boosts", - "timezone", - "no_javascript", - "notifications", - "click_to_load", - "lightbox", - "filter_notifications", - "bundle_notifications", - "poll_frequency", - ] + fields = Preference._fields class PostForm(forms.Form): diff --git a/brutaldon/models.py b/brutaldon/models.py index 4a64cf7..a0c3d7a 100644 --- a/brutaldon/models.py +++ b/brutaldon/models.py @@ -30,6 +30,17 @@ class Theme(models.Model): return self.name +def set_fields(klass): + fields = {} + for n in dir(klass): + assert n != "_fields" + v = getattr(klass, n) + if isinstance(v, models.Field): + fields.add(n) + setattr(klass, '_fields', fields) + return klass + +@set_fields class Preference(models.Model): theme = models.ForeignKey(Theme, models.CASCADE, null=False, default=1) filter_replies = models.BooleanField(default=False) diff --git a/brutaldon/views.py b/brutaldon/views.py index 5249078..01855c0 100644 --- a/brutaldon/views.py +++ b/brutaldon/views.py @@ -767,21 +767,10 @@ def settings(request): if request.method == "POST": form = PreferencesForm(request.POST) if form.is_valid(): - account.preferences.theme = form.cleaned_data["theme"] - account.preferences.filter_replies = form.cleaned_data["filter_replies"] - account.preferences.filter_boosts = form.cleaned_data["filter_boosts"] - account.preferences.timezone = form.cleaned_data["timezone"] - account.preferences.no_javascript = form.cleaned_data["no_javascript"] - account.preferences.notifications = form.cleaned_data["notifications"] - account.preferences.click_to_load = form.cleaned_data["click_to_load"] - account.preferences.lightbox = form.cleaned_data["lightbox"] - account.preferences.filter_notifications = form.cleaned_data[ - "filter_notifications" - ] - account.preferences.bundle_notifications = form.cleaned_data[ - "bundle_notifications" - ] - account.preferences.poll_frequency = form.cleaned_data["poll_frequency"] + for field in account.preferences._fields: + if field in form.cleaned_data: + setattr(account.preferences, field, + form.cleaned_data[field]) request.session["timezone"] = account.preferences.timezone account.preferences.save() account.save() From 0439440f4040f099781a359c9ac49314ff2e3cb2 Mon Sep 17 00:00:00 2001 From: Cy Date: Sat, 30 May 2020 06:55:04 +0000 Subject: [PATCH 2/3] Foreign keys add magic members Because when you add one field to a class, you clearly want to add two fields to a class, and there's no need to consider the field you never asked to add to be something other than a field. --- brutaldon/models.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/brutaldon/models.py b/brutaldon/models.py index a0c3d7a..33847a1 100644 --- a/brutaldon/models.py +++ b/brutaldon/models.py @@ -29,14 +29,16 @@ class Theme(models.Model): def __str__(self): return self.name - +from django.db.models.fields.related_descriptors import ForeignKeyDeferredAttribute def set_fields(klass): - fields = {} + fields = [] for n in dir(klass): assert n != "_fields" v = getattr(klass, n) - if isinstance(v, models.Field): - fields.add(n) + if not hasattr(v, 'field'): continue + if not isinstance(v.field, models.Field): continue + if isinstance(v, ForeignKeyDeferredAttribute): continue + fields.append(n) setattr(klass, '_fields', fields) return klass From 39f13d64fdb6e5f9fa729526bff7ab8a87d3153f Mon Sep 17 00:00:00 2001 From: Cy Date: Sat, 30 May 2020 21:21:31 +0000 Subject: [PATCH 3/3] Allow previewing sensitive images A setting to not censor sensitive images if you think you're not in danger for looking at them. --- brutaldon/models.py | 5 +++++ brutaldon/templates/main/toot_partial.html | 4 ++-- brutaldon/templates/setup/settings.html | 9 +++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/brutaldon/models.py b/brutaldon/models.py index 33847a1..b8cb58f 100644 --- a/brutaldon/models.py +++ b/brutaldon/models.py @@ -50,6 +50,11 @@ class Preference(models.Model): timezone = models.CharField( max_length=80, blank=True, null=True, choices=timezones, default="UTC" ) + preview_sensitive = models.BooleanField( + default=False, + help_text=_( + 'Show preview for media marked as "sensitive"')) + no_javascript = models.BooleanField( default=False, help_text=_( diff --git a/brutaldon/templates/main/toot_partial.html b/brutaldon/templates/main/toot_partial.html index abad8c7..2dfca7c 100644 --- a/brutaldon/templates/main/toot_partial.html +++ b/brutaldon/templates/main/toot_partial.html @@ -101,7 +101,7 @@