Add 'filter notifications" option

This reduces the number of notifications in both your tab bar and your
notifications page, by showing only mentions and new subscribers (i.e.,
things that are actionable by you).
This commit is contained in:
Jason McBrayer 2019-01-14 09:08:36 -05:00
parent 21af4a0ef8
commit c7fb38b57c
5 changed files with 38 additions and 3 deletions

View File

@ -26,7 +26,8 @@ class PreferencesForm(forms.ModelForm):
class Meta: class Meta:
model = Preference model = Preference
fields = ['theme', 'filter_replies', 'filter_boosts', 'timezone', fields = ['theme', 'filter_replies', 'filter_boosts', 'timezone',
'no_javascript', 'notifications', 'click_to_load', 'lightbox', 'poll_frequency'] 'no_javascript', 'notifications', 'click_to_load', 'lightbox',
'filter_notifications', 'poll_frequency']
class PostForm(forms.Form): class PostForm(forms.Form):
"""def status_post(self, status, in_reply_to_id=None, media_ids=None, """def status_post(self, status, in_reply_to_id=None, media_ids=None,

View File

@ -0,0 +1,18 @@
# Generated by Django 2.1.5 on 2019-01-14 13:51
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0017_preference_poll_frequency'),
]
operations = [
migrations.AddField(
model_name='preference',
name='filter_notifications',
field=models.BooleanField(default=False, help_text='Exclude boosts and favs from your notifications.'),
),
]

View File

@ -41,6 +41,8 @@ class Preference(models.Model):
help_text=_("""Use a JavaScript lightbox to display media.""")) help_text=_("""Use a JavaScript lightbox to display media."""))
poll_frequency = models.IntegerField(default=300, poll_frequency = models.IntegerField(default=300,
help_text=_("""Number of seconds to wait between checking notifications. Default: 300""")) help_text=_("""Number of seconds to wait between checking notifications. Default: 300"""))
filter_notifications = models.BooleanField(default=False,
help_text=_("""Exclude boosts and favs from your notifications."""))
class Account(models.Model): class Account(models.Model):
username = models.EmailField(unique=True) username = models.EmailField(unique=True)

View File

@ -85,6 +85,16 @@
</p> </p>
</div> </div>
<div class="field">
<label class="label checkbox" for="click_to_load">
{% render_field form.filter_notifications class+="checkbox" %}
{{ form.filter_notifications.label }}
</label>
<p class="notification is-info preferences-help">
{{ form.filter_notifications.help_text }}
</p>
</div>
<div class="field"> <div class="field">
<label class="label" for="poll_frequency">{{ form.poll_frequency.label }}</label> <label class="label" for="poll_frequency">{{ form.poll_frequency.label }}</label>
<div class="control"> <div class="control">

View File

@ -43,8 +43,10 @@ def _notes_count(account, mastodon):
if not mastodon: if not mastodon:
return "" return ""
notes = mastodon.notifications(limit=40) notes = mastodon.notifications(limit=40)
if account.preferences.filter_notifications:
notes = [ note for note in notes if note.type == 'mention' or note.type == 'follow']
for index, item in enumerate(notes): for index, item in enumerate(notes):
if item.id == account.note_seen: if item.id <= account.note_seen:
break break
else: else:
index = "40+" index = "40+"
@ -325,6 +327,8 @@ def note(request, next=None, prev=None):
account.save() account.save()
notes = mastodon.notifications(limit=100, max_id=next, since_id=prev) notes = mastodon.notifications(limit=100, max_id=next, since_id=prev)
if account.preferences.filter_notifications:
notes = [ note for note in notes if note.type == 'mention' or note.type == 'follow']
try: try:
prev = notes[0]._pagination_prev prev = notes[0]._pagination_prev
if len(mastodon.notifications(since_id=prev['since_id'])) == 0: if len(mastodon.notifications(since_id=prev['since_id'])) == 0:
@ -402,6 +406,7 @@ def settings(request):
account.preferences.notifications = form.cleaned_data['notifications'] account.preferences.notifications = form.cleaned_data['notifications']
account.preferences.click_to_load = form.cleaned_data['click_to_load'] account.preferences.click_to_load = form.cleaned_data['click_to_load']
account.preferences.lightbox = form.cleaned_data['lightbox'] account.preferences.lightbox = form.cleaned_data['lightbox']
account.preferences.filter_notifications = form.cleaned_data['filter_notifications']
request.session['timezone'] = account.preferences.timezone request.session['timezone'] = account.preferences.timezone
account.preferences.save() account.preferences.save()
account.save() account.save()
@ -838,4 +843,3 @@ def emoji_reference(request):
"emojos": sorted(emojos, key=lambda x: x['shortcode']), "emojos": sorted(emojos, key=lambda x: x['shortcode']),
"notifications": notifications, "notifications": notifications,
'own_acct' : request.session['user']}) 'own_acct' : request.session['user']})