add ability to keep only posts without media

closes #16
This commit is contained in:
codl 2017-12-28 03:02:08 +01:00
parent 40960fc7fd
commit ada719faeb
No known key found for this signature in database
GPG Key ID: 6CD7C8891ED1233A
5 changed files with 93 additions and 24 deletions

View File

@ -267,6 +267,7 @@ section > pre.error-log {
.radiostrip {
display: inline-flex;
flex-direction: row;
flex-wrap: wrap;
}
.radiostrip input[type=radio] {
@ -280,8 +281,6 @@ section > pre.error-log {
cursor: pointer;
user-select: none;
background-color: #ededed;
will-change: transform;
transition: transform 50ms;
}
.radiostrip label:not(:last-of-type) {
@ -293,7 +292,6 @@ section > pre.error-log {
}
.radiostrip input[type=radio]:checked + label {
transform: scale(.95);
background: #37d;
color: white;
}

View File

@ -0,0 +1,59 @@
"""add three-way media policy
Revision ID: 583cdac8eba1
Revises: 7e255d4ea34d
Create Date: 2017-12-28 00:46:56.023649
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '583cdac8eba1'
down_revision = '7e255d4ea34d'
branch_labels = None
depends_on = None
transitional = sa.table('accounts',
sa.column('policy_keep_media'),
sa.column('old_policy_keep_media'))
def upgrade():
ThreeWayPolicyEnum = sa.Enum('keeponly', 'deleteonly', 'none',
name='enum_3way_policy')
op.execute("""
CREATE TYPE enum_3way_policy AS ENUM ('keeponly', 'deleteonly', 'none')
""")
op.alter_column('accounts', 'policy_keep_media',
new_column_name='old_policy_keep_media')
op.add_column(
'accounts',
sa.Column('policy_keep_media', ThreeWayPolicyEnum,
nullable=False, server_default='none'))
op.execute(transitional.update()
.where(transitional.c.old_policy_keep_media)
.values(policy_keep_media=op.inline_literal('keeponly')))
op.drop_column('accounts', 'old_policy_keep_media')
def downgrade():
op.alter_column('accounts', 'policy_keep_media',
new_column_name='old_policy_keep_media')
op.add_column(
'accounts',
sa.Column('policy_keep_media', sa.Boolean(),
nullable=False, server_default='f'))
op.execute(transitional.update()
.where(transitional.c.old_policy_keep_media == op.inline_literal('keeponly'))
.values(policy_keep_media=op.inline_literal('t')))
op.drop_column('accounts', 'old_policy_keep_media')
op.execute("""
DROP TYPE enum_3way_policy
""")

View File

@ -67,6 +67,10 @@ class RemoteIDMixin(object):
self.id = "mastodon:{}@{}".format(id_, self.mastodon_instance)
ThreeWayPolicyEnum = db.Enum('keeponly', 'deleteonly', 'none',
name='enum_3way_policy')
@decompose_interval('policy_delete_every')
@decompose_interval('policy_keep_younger')
class Account(TimestampMixin, RemoteIDMixin):
@ -79,7 +83,7 @@ class Account(TimestampMixin, RemoteIDMixin):
nullable=False)
policy_keep_favourites = db.Column(db.Boolean, server_default='TRUE',
nullable=False)
policy_keep_media = db.Column(db.Boolean, server_default='FALSE',
policy_keep_media = db.Column(ThreeWayPolicyEnum, server_default='none',
nullable=False)
policy_delete_every = db.Column(db.Interval, server_default='30 minutes',
nullable=False)
@ -174,9 +178,11 @@ class Account(TimestampMixin, RemoteIDMixin):
db.func.now() - self.policy_keep_younger)
.except_(latest_n_posts))
if(self.policy_keep_favourites):
query = query.filter(db.or_(Post.favourite == False, Post.is_reblog))
if(self.policy_keep_media):
query = query.filter(db.or_(Post.has_media == False, Post.is_reblog))
query = query.filter(db.or_(~Post.favourite, Post.is_reblog))
if(self.policy_keep_media != 'none'):
query = query.filter(db.or_(
Post.has_media == (self.policy_keep_media == 'deleteonly'),
Post.is_reblog))
if(self.policy_keep_direct):
query = query.filter(~Post.direct)
return query.count()

View File

@ -170,26 +170,30 @@ def delete_from_account(account_id):
to_delete = None
def is_eligible(post):
return (
post.is_reblog or
(
(
not account.policy_keep_favourites or not post.favourite
) and (
account.policy_keep_media == 'none' or
(account.policy_keep_media == 'keeponly' and not post.has_media) or
(account.policy_keep_media == 'deleteonly' and post.has_media)
)
)
)
action = noop
if account.service == 'twitter':
action = libforget.twitter.delete
posts = refresh_posts(posts)
if posts:
eligible = list(( # nosec
post for post in posts if
(not account.policy_keep_favourites or not post.favourite or post.is_reblog)
and (not account.policy_keep_media or not post.has_media or post.is_reblog)
))
if eligible:
to_delete = random.choice(eligible)
to_delete = next(filter(is_eligible, posts), None)
elif account.service == 'mastodon':
action = libforget.mastodon.delete
for post in posts:
refreshed = refresh_posts((post,))
if refreshed and \
(not account.policy_keep_favourites or not post.favourite or post.is_reblog) \
and (not account.policy_keep_media or not post.has_media or post.is_reblog)\
and (not account.policy_keep_direct or not post.direct):
if refreshed and is_eligible(refreshed[0]):
to_delete = refreshed[0]
break

View File

@ -78,12 +78,14 @@
<label for=policy_keep_favourites_false>No</label>
</span>
</p>
<p>Keep posts that have media attached
<p>Keep posts
<span class="radiostrip">
<input type=radio name=policy_keep_media value=true id=policy_keep_media_true {{ "checked" if g.viewer.account.policy_keep_media }}>
<label for=policy_keep_media_true>Yes</label>
<input type=radio name=policy_keep_media value=false id=policy_keep_media_false {{ "checked" if not g.viewer.account.policy_keep_media }}>
<label for=policy_keep_media_false>No</label>
<input type=radio name=policy_keep_media value=keeponly id=policy_keep_media_keeponly {{ "checked" if g.viewer.account.policy_keep_media == 'keeponly' }}>
<label for=policy_keep_media_keeponly>with media attached</label>
<input type=radio name=policy_keep_media value=deleteonly id=policy_keep_media_deleteonly {{ "checked" if g.viewer.account.policy_keep_media == 'deleteonly' }}>
<label for=policy_keep_media_deleteonly>with no media attached</label>
<input type=radio name=policy_keep_media value=none id=policy_keep_media_none {{ "checked" if g.viewer.account.policy_keep_media == 'none' }}>
<label for=policy_keep_media_none>neither</label>
</span>
</p>
{% if g.viewer.account.service == 'mastodon' %}