add ability to keep posts with media (close #1)
This commit is contained in:
parent
4be6edb15f
commit
ac6f7203d8
|
@ -91,6 +91,8 @@ def post_from_api_tweet_object(tweet, post=None):
|
|||
post.author_id = 'twitter:{}'.format(tweet['user']['id_str'])
|
||||
if 'favorited' in tweet:
|
||||
post.favourite = tweet['favorited']
|
||||
if 'entities' in tweet:
|
||||
post.has_media = bool('media' in tweet['entities'] and tweet['entities']['media'])
|
||||
return post
|
||||
|
||||
def fetch_acc(account, cursor, consumer_key=None, consumer_secret=None):
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
"""add post media
|
||||
|
||||
Revision ID: 04da9abf37e2
|
||||
Revises: 2e3a2882e5a4
|
||||
Create Date: 2017-08-08 15:15:50.911420
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '04da9abf37e2'
|
||||
down_revision = '2e3a2882e5a4'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade():
|
||||
op.add_column('accounts', sa.Column('policy_keep_media', sa.Boolean(), server_default='FALSE', nullable=False))
|
||||
op.add_column('posts', sa.Column('has_media', sa.Boolean(), server_default='FALSE', nullable=False))
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_column('posts', 'has_media')
|
||||
op.drop_column('accounts', 'policy_keep_media')
|
17
model.py
17
model.py
|
@ -43,6 +43,7 @@ class Account(TimestampMixin, RemoteIDMixin):
|
|||
policy_enabled = db.Column(db.Boolean, server_default='FALSE', nullable=False)
|
||||
policy_keep_latest = db.Column(db.Integer, server_default='100', nullable=False)
|
||||
policy_keep_favourites = db.Column(db.Boolean, server_default='TRUE', nullable=False)
|
||||
policy_keep_media = db.Column(db.Boolean, server_default='FALSE', nullable=False)
|
||||
policy_delete_every = db.Column(db.Interval, server_default='30 minutes', nullable=False)
|
||||
policy_keep_younger = db.Column(db.Interval, server_default='365 days', nullable=False)
|
||||
|
||||
|
@ -95,6 +96,8 @@ class Account(TimestampMixin, RemoteIDMixin):
|
|||
filter(~Post.id.in_(latest_n_posts))
|
||||
if(self.policy_keep_favourites):
|
||||
query = query.filter_by(favourite = False)
|
||||
if(self.policy_keep_media):
|
||||
query = query.filter_by(has_media = False)
|
||||
return query.count()
|
||||
|
||||
|
||||
|
@ -118,6 +121,8 @@ class OAuthToken(db.Model, TimestampMixin):
|
|||
|
||||
# note: account_id is nullable here because we don't know what account a token is for
|
||||
# until we call /account/verify_credentials with it
|
||||
|
||||
|
||||
class Session(db.Model, TimestampMixin):
|
||||
__tablename__ = 'sessions'
|
||||
|
||||
|
@ -126,6 +131,7 @@ class Session(db.Model, TimestampMixin):
|
|||
account_id = db.Column(db.String, db.ForeignKey('accounts.id', ondelete='CASCADE', onupdate='CASCADE'), nullable=False)
|
||||
account = db.relationship(Account, lazy='joined', backref='sessions')
|
||||
|
||||
|
||||
class Post(db.Model, TimestampMixin, RemoteIDMixin):
|
||||
__tablename__ = 'posts'
|
||||
|
||||
|
@ -137,12 +143,15 @@ class Post(db.Model, TimestampMixin, RemoteIDMixin):
|
|||
backref=db.backref('posts', order_by=lambda: db.desc(Post.created_at)))
|
||||
|
||||
favourite = db.Column(db.Boolean, server_default='FALSE', nullable=False)
|
||||
has_media = db.Column(db.Boolean, server_default='FALSE', nullable=False)
|
||||
|
||||
def snippet(self):
|
||||
if len(self.body) > 20:
|
||||
return self.body[:19] + "✂"
|
||||
return self.body
|
||||
|
||||
def __repr__(self):
|
||||
snippet = self.body
|
||||
if len(snippet) > 20:
|
||||
snippet = snippet[:19] + "✂"
|
||||
return '<Post ({}, "{}", Author: {})>'.format(self.id, snippet, self.author_id)
|
||||
return '<Post ({}, "{}", Author: {})>'.format(self.id, self.snippet(), self.author_id)
|
||||
|
||||
class TwitterArchive(db.Model, TimestampMixin):
|
||||
__tablename__ = 'twitter_archives'
|
||||
|
|
|
@ -91,6 +91,7 @@ def settings():
|
|||
'policy_delete_every_scale',
|
||||
'policy_keep_younger_significand',
|
||||
'policy_keep_younger_scale',
|
||||
'policy_keep_media',
|
||||
):
|
||||
try:
|
||||
if attr in request.form:
|
||||
|
|
5
tasks.py
5
tasks.py
|
@ -140,7 +140,10 @@ def delete_from_account(account_id):
|
|||
|
||||
posts = refresh_posts(posts)
|
||||
if account.service == 'twitter':
|
||||
eligible = list((post for post in posts if not account.policy_keep_favourites or not post.favourite))
|
||||
eligible = list((post for post in posts if
|
||||
(not account.policy_keep_favourites or not post.favourite)
|
||||
and (not account.policy_keep_media or not post.has_media)
|
||||
))
|
||||
if eligible:
|
||||
if account.policy_delete_every == timedelta(0):
|
||||
print("deleting all {} eligible posts for {}".format(len(eligible), account))
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
<li>Pick between deleting every old post or randomly deleting one old post periodically</li>
|
||||
<li>Pick between deleting posts older than a date, posts past a post count, or both</li>
|
||||
<li>Optionally mark posts that you want to preserve forever, by giving them a like</li>
|
||||
<li>Optionally keep posts with media forever</li>
|
||||
<li>Upload a tweet archive if your twitter account has more tweets than the twitter api will return</li>
|
||||
<li><a href="https://github.com/codl/forget">Free and Open Source software</a></li>
|
||||
</ul>
|
||||
|
|
|
@ -56,6 +56,12 @@
|
|||
<label><input type=radio name=policy_keep_favourites value=false {{ "checked" if not g.viewer.account.policy_keep_favourites }}> No</label>
|
||||
</span>
|
||||
</p>
|
||||
<p>Posts that have media attached will stay fresh forever
|
||||
<span style='display:inline-block'>
|
||||
<label><input type=radio name=policy_keep_media value=true {{ "checked" if g.viewer.account.policy_keep_media }}> Yes</label>
|
||||
<label><input type=radio name=policy_keep_media value=false {{ "checked" if not g.viewer.account.policy_keep_media }}> No</label>
|
||||
</span>
|
||||
</p>
|
||||
<p>Any post that is not kept fresh by any of these rules is considered expired. One random expired post will be deleted every
|
||||
{{interval_input(g.viewer.account, 'policy_delete_every', scales)}}
|
||||
</p>
|
||||
|
|
Loading…
Reference in New Issue