From 0b93eb78f411f9fe8d4b5d1aff0977476b3069bb Mon Sep 17 00:00:00 2001 From: Cy Date: Sat, 30 May 2020 06:40:53 +0000 Subject: [PATCH 1/2] 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/2] 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