From 1dfb7288057680e814253ecf702277a243e06cf4 Mon Sep 17 00:00:00 2001 From: codl Date: Wed, 23 Aug 2017 11:42:32 +0200 Subject: [PATCH] add autocomplete for mastodon instances --- .../f8a153bc809b_add_mastodon_instances.py | 40 +++++++++++++++++++ model.py | 15 +++++++ routes.py | 14 +++++-- tasks.py | 7 +++- templates/mastodon_login.html | 13 +++--- 5 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 migrations/versions/f8a153bc809b_add_mastodon_instances.py diff --git a/migrations/versions/f8a153bc809b_add_mastodon_instances.py b/migrations/versions/f8a153bc809b_add_mastodon_instances.py new file mode 100644 index 0000000..92b406e --- /dev/null +++ b/migrations/versions/f8a153bc809b_add_mastodon_instances.py @@ -0,0 +1,40 @@ +"""add mastodon_instances + +Revision ID: f8a153bc809b +Revises: 5fec5f5e8a5e +Create Date: 2017-08-23 11:27:19.223721 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'f8a153bc809b' +down_revision = '5fec5f5e8a5e' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table('mastodon_instances', + sa.Column('instance', sa.String(), nullable=False), + sa.Column('popularity', sa.Float(), server_default='10', nullable=False), + sa.PrimaryKeyConstraint('instance', name=op.f('pk_mastodon_instances')) + ) + op.execute(""" + INSERT INTO mastodon_instances (instance, popularity) VALUES + ('mastodon.social', 1000), + ('mastodon.cloud', 900), + ('social.tchncs.de', 800), + ('mastodon.xyz', 700), + ('mstdn.io', 600), + ('awoo.space', 500), + ('cybre.space', 400), + ('mastodon.art', 300) + ; + """) + + +def downgrade(): + op.drop_table('mastodon_instances') diff --git a/model.py b/model.py index 0007b26..78b7340 100644 --- a/model.py +++ b/model.py @@ -211,3 +211,18 @@ class MastodonApp(db.Model, TimestampMixin): client_id = db.Column(db.String, nullable=False) client_secret = db.Column(db.String, nullable=False) protocol = db.Column(ProtoEnum, nullable=False) + +class MastodonInstance(db.Model): + """ + this is for the autocomplete in the mastodon login form + + it isn't coupled with anything else so that we can seed it with + some popular instances ahead of time + """ + __tablename__ = 'mastodon_instances' + + instance = db.Column(db.String, primary_key=True) + popularity = db.Column(db.Float, server_default='10', nullable=False) + + def bump(self): + self.popularity = self.popularity + 1 diff --git a/routes.py b/routes.py index d8a29db..d7722d4 100644 --- a/routes.py +++ b/routes.py @@ -6,7 +6,7 @@ import lib from lib.auth import require_auth, require_auth_api from lib import set_session_cookie from lib import get_viewer_session, get_viewer -from model import Account, Session, Post, TwitterArchive, MastodonApp +from model import Account, Session, Post, TwitterArchive, MastodonApp, MastodonInstance from app import app, db, sentry, limiter import tasks from zipfile import BadZipFile @@ -217,11 +217,14 @@ def api_viewer_timers(): @app.route('/login/mastodon', methods=('GET', 'POST')) def mastodon_login_step1(): + + instances = MastodonInstance.query.filter(MastodonInstance.popularity > 1).order_by(db.desc(MastodonInstance.popularity)).limit(16) + if request.method == 'GET': - return render_template('mastodon_login.html', generic_error = 'error' in request.args) + return render_template('mastodon_login.html', instances=instances, generic_error = 'error' in request.args) if not 'instance_url' in request.form or not request.form['instance_url']: - return render_template('mastodon_login.html', address_error=True) + return render_template('mastodon_login.html', instances=instances, address_error=True) instance_url = request.form['instance_url'].split("@")[-1].lower() @@ -250,6 +253,11 @@ def mastodon_login_step2(instance): sess = Session(account = account) db.session.add(sess) + + i=MastodonInstance(instance=instance) + i=db.session.merge(i) + i.bump() + db.session.commit() g.viewer = sess diff --git a/tasks.py b/tasks.py index 0641477..4448be6 100644 --- a/tasks.py +++ b/tasks.py @@ -2,7 +2,7 @@ from celery import Celery, Task from app import app as flaskapp from app import db -from model import Session, Account, TwitterArchive, Post, OAuthToken +from model import Session, Account, TwitterArchive, Post, OAuthToken, MastodonInstance import lib.twitter import lib.mastodon from mastodon.Mastodon import MastodonRatelimitError @@ -128,6 +128,11 @@ def periodic_cleanup(): for account in unreachable: account.policy_enabled = False + # normalise mastodon instance popularity scores + biggest_instance = MastodonInstance.query.order_by(db.desc(MastodonInstance.popularity)).first() + if biggest_instance.popularity > 100: + MastodonInstance.query.update({MastodonInstance.popularity: MastodonInstance.popularity * 100 / biggest_instance.popularity}, syn) + db.session.commit() @app.task diff --git a/templates/mastodon_login.html b/templates/mastodon_login.html index 14bce51..05bc3ef 100644 --- a/templates/mastodon_login.html +++ b/templates/mastodon_login.html @@ -12,13 +12,16 @@ {% endif %}
-