portal: additional buttons on list pages

link to onion services page from origin page
link to previews of distribution lists from lists
This commit is contained in:
Iain Learmonth 2022-05-12 17:03:26 +01:00
parent 928edc46c2
commit d54fae7423
9 changed files with 151 additions and 74 deletions

View file

@ -1,18 +1,32 @@
import json
from datetime import datetime
from flask import render_template, url_for, flash, redirect, Blueprint
from flask import render_template, url_for, flash, redirect, Blueprint, Response
from flask_wtf import FlaskForm
from sqlalchemy import exc
from wtforms import SelectField, StringField, SubmitField
from wtforms.validators import DataRequired
from app import db
from app.extensions import db
from app.lists.bc2 import mirror_sites
from app.lists.bridgelines import bridgelines
from app.lists.mirror_mapping import mirror_mapping
from app.models.base import MirrorList
from app.portal.util import response_404, view_lifecycle
bp = Blueprint("list", __name__)
@bp.app_template_filter("provider_name")
def list_provider_name(s: str) -> str:
return MirrorList.providers_supported.get(s, "Unknown")
@bp.app_template_filter("format_name")
def list_format_name(s: str) -> str:
return MirrorList.formats_supported.get(s, "Unknown")
@bp.route('/list')
def list_list():
lists = MirrorList.query.filter(MirrorList.destroyed == None).all()
@ -21,7 +35,27 @@ def list_list():
title="Mirror Lists",
item="mirror list",
new_link=url_for("portal.list.list_new"),
items=lists)
items=lists,
extra_buttons=[
{
"link": url_for("portal.list.list_preview", format_=k),
"text": f"Preview {v}",
"style": "secondary"
}
for k, v in MirrorList.formats_supported.items()
]
)
@bp.route('/preview/<format_>')
def list_preview(format_: str):
if format_ == "bca":
return Response(json.dumps(mirror_mapping()), content_type="application/json")
if format_ == "bc2":
return Response(json.dumps(mirror_sites()), content_type="application/json")
if format_ == "bridgelines":
return Response(json.dumps(bridgelines()), content_type="application/json")
return response_404(message="Format not found")
@bp.route("/destroy/<list_id>", methods=['GET', 'POST'])
@ -44,17 +78,8 @@ def list_destroy(list_id: int):
@bp.route("/new/<group_id>", methods=['GET', 'POST'])
def list_new(group_id=None):
form = NewMirrorListForm()
form.provider.choices = [
("github", "GitHub"),
("gitlab", "GitLab"),
("s3", "AWS S3"),
]
form.format.choices = [
("bc2", "Bypass Censorship v2"),
("bc3", "Bypass Censorship v3"),
("bca", "Bypass Censorship Analytics"),
("bridgelines", "Tor Bridge Lines")
]
form.provider.choices = [(k, v) for k, v in MirrorList.providers_supported]
form.format.choices = [(k, v) for k, v in MirrorList.formats_supported]
if form.validate_on_submit():
list_ = MirrorList()
list_.provider = form.provider.data