Added ChannelPlugin menu for debugging
This commit is contained in:
parent
be4cac6b24
commit
1e4ac60365
4 changed files with 87 additions and 33 deletions
|
@ -1,24 +1,21 @@
|
||||||
import json
|
|
||||||
import os.path
|
import os.path
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
|
|
||||||
import structlog
|
import structlog
|
||||||
from flask import (
|
from flask import (
|
||||||
Blueprint,
|
Blueprint,
|
||||||
render_template,
|
g,
|
||||||
|
flash,
|
||||||
request,
|
request,
|
||||||
session,
|
session,
|
||||||
redirect,
|
|
||||||
url_for,
|
url_for,
|
||||||
flash,
|
redirect,
|
||||||
g,
|
render_template,
|
||||||
)
|
)
|
||||||
|
|
||||||
from butterrobot.config import HOSTNAME
|
|
||||||
from butterrobot.db import UserQuery, ChannelQuery, ChannelPluginQuery
|
from butterrobot.db import UserQuery, ChannelQuery, ChannelPluginQuery
|
||||||
from butterrobot.plugins import get_available_plugins
|
from butterrobot.plugins import get_available_plugins
|
||||||
|
|
||||||
|
|
||||||
admin = Blueprint("admin", __name__, url_prefix="/admin")
|
admin = Blueprint("admin", __name__, url_prefix="/admin")
|
||||||
admin.template_folder = os.path.join(os.path.dirname(__name__), "templates")
|
admin.template_folder = os.path.join(os.path.dirname(__name__), "templates")
|
||||||
logger = structlog.get_logger(__name__)
|
logger = structlog.get_logger(__name__)
|
||||||
|
@ -99,7 +96,8 @@ def channel_list_view():
|
||||||
def channel_detail_view(channel_id):
|
def channel_detail_view(channel_id):
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
ChannelQuery.update(
|
ChannelQuery.update(
|
||||||
channel_id, enabled=request.form["enabled"] == "true",
|
channel_id,
|
||||||
|
enabled=request.form["enabled"] == "true",
|
||||||
)
|
)
|
||||||
flash("Channel updated", "success")
|
flash("Channel updated", "success")
|
||||||
|
|
||||||
|
@ -117,18 +115,24 @@ def channel_delete_view(channel_id):
|
||||||
return redirect(url_for("admin.channel_list_view"))
|
return redirect(url_for("admin.channel_list_view"))
|
||||||
|
|
||||||
|
|
||||||
@admin.route("/channelplugins", methods=["POST"])
|
@admin.route("/channelplugins", methods=["GET", "POST"])
|
||||||
@login_required
|
@login_required
|
||||||
def channel_plugin_list_view():
|
def channel_plugin_list_view():
|
||||||
data = request.form
|
if request.method == "POST":
|
||||||
try:
|
data = request.form
|
||||||
ChannelPluginQuery.create(
|
try:
|
||||||
data["channel_id"], data["plugin_id"], enabled=data["enabled"] == "y"
|
ChannelPluginQuery.create(
|
||||||
)
|
data["channel_id"], data["plugin_id"], enabled=data["enabled"] == "y"
|
||||||
flash(f"Plugin {data['plugin_id']} added to the channel", "success")
|
)
|
||||||
except ChannelPluginQuery.Duplicated:
|
flash(f"Plugin {data['plugin_id']} added to the channel", "success")
|
||||||
flash(f"Plugin {data['plugin_id']} is already present on the channel", "error")
|
except ChannelPluginQuery.Duplicated:
|
||||||
return redirect(request.headers.get("Referer"))
|
flash(
|
||||||
|
f"Plugin {data['plugin_id']} is already present on the channel", "error"
|
||||||
|
)
|
||||||
|
return redirect(request.headers.get("Referer"))
|
||||||
|
|
||||||
|
channel_plugins = ChannelPluginQuery.all()
|
||||||
|
return render_template("channel_plugins_list.j2", channel_plugins=channel_plugins)
|
||||||
|
|
||||||
|
|
||||||
@admin.route("/channelplugins/<channel_plugin_id>", methods=["GET", "POST"])
|
@admin.route("/channelplugins/<channel_plugin_id>", methods=["GET", "POST"])
|
||||||
|
@ -136,7 +140,8 @@ def channel_plugin_list_view():
|
||||||
def channel_plugin_detail_view(channel_plugin_id):
|
def channel_plugin_detail_view(channel_plugin_id):
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
ChannelPluginQuery.update(
|
ChannelPluginQuery.update(
|
||||||
channel_plugin_id, enabled=request.form["enabled"] == "true",
|
channel_plugin_id,
|
||||||
|
enabled=request.form["enabled"] == "true",
|
||||||
)
|
)
|
||||||
flash("Plugin updated", category="success")
|
flash("Plugin updated", category="success")
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
<div class="navbar navbar-light">
|
<div class="navbar navbar-light">
|
||||||
<div class="container-xl">
|
<div class="container-xl">
|
||||||
<ul class="navbar-nav">
|
<ul class="navbar-nav">
|
||||||
<li class="nav-item {% if 'channels' in request.url %}active{% endif %}">
|
<li class="nav-item {% if '/channels' in request.url %}active{% endif %}">
|
||||||
<a class="nav-link" href="{{ url_for('admin.channel_list_view') }}">
|
<a class="nav-link" href="{{ url_for('admin.channel_list_view') }}">
|
||||||
<span class="nav-link-icon d-md-none d-lg-inline-block">
|
<span class="nav-link-icon d-md-none d-lg-inline-block">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24"
|
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24"
|
||||||
|
@ -60,7 +60,7 @@
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item {% if 'plugins' in request.url %}active{% endif %}">
|
<li class="nav-item {% if '/plugins' in request.url %}active{% endif %}">
|
||||||
<a class="nav-link" href="{{ url_for('admin.plugin_list_view') }}">
|
<a class="nav-link" href="{{ url_for('admin.plugin_list_view') }}">
|
||||||
<span class="nav-link-icon d-md-none d-lg-inline-block">
|
<span class="nav-link-icon d-md-none d-lg-inline-block">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24"
|
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24"
|
||||||
|
@ -76,6 +76,22 @@
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="nav-item {% if '/channelplugins' in request.url %}active{% endif %}">
|
||||||
|
<a class="nav-link" href="{{ url_for('admin.channel_plugin_list_view') }}">
|
||||||
|
<span class="nav-link-icon d-md-none d-lg-inline-block">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24"
|
||||||
|
viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
|
||||||
|
stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path
|
||||||
|
d="M4 7h3a1 1 0 0 0 1 -1v-1a2 2 0 0 1 4 0v1a1 1 0 0 0 1 1h3a1 1 0 0 1 1 1v3a1 1 0 0 0 1 1h1a2 2 0 0 1 0 4h-1a1 1 0 0 0 -1 1v3a1 1 0 0 1 -1 1h-3a1 1 0 0 1 -1 -1v-1a2 2 0 0 0 -4 0v1a1 1 0 0 1 -1 1h-3a1 1 0 0 1 -1 -1v-3a1 1 0 0 1 1 -1h1a2 2 0 0 0 0 -4h-1a1 1 0 0 1 -1 -1v-3a1 1 0 0 1 1 -1" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
<span class="nav-link-title">
|
||||||
|
Channel Plugins
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
41
butterrobot/admin/templates/channel_plugins_list.j2
Normal file
41
butterrobot/admin/templates/channel_plugins_list.j2
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
{% extends "_base.j2" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="page-header d-print-none">
|
||||||
|
<div class="row align-items-center">
|
||||||
|
<div class="col">
|
||||||
|
<h2 class="page-title">
|
||||||
|
Channel list
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-vcenter card-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Channel ID</th>
|
||||||
|
<th>Plugin ID</th>
|
||||||
|
<th>Enabled</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
{% for channel_plugin in channel_plugins %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ channel_plugin.id }}</td>
|
||||||
|
<td>{{ channel_plugin.channel_id }}</td>
|
||||||
|
<td class="text-muted">
|
||||||
|
{{ channel_plugin.plugin_id }}
|
||||||
|
</td>
|
||||||
|
<td class="text-muted">{{ channel_plugin.enabled }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -1,23 +1,15 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
import traceback
|
|
||||||
from dataclasses import asdict
|
|
||||||
from functools import lru_cache
|
|
||||||
|
|
||||||
from flask import Flask, request, jsonify
|
|
||||||
import structlog
|
import structlog
|
||||||
|
from flask import Flask, request
|
||||||
|
|
||||||
import butterrobot.logging # noqa
|
import butterrobot.logging # noqa
|
||||||
from butterrobot.queue import q
|
|
||||||
from butterrobot.db import ChannelQuery
|
|
||||||
from butterrobot.config import SECRET_KEY, HOSTNAME
|
|
||||||
from butterrobot.objects import Message, Channel
|
|
||||||
from butterrobot.http import ExternalProxyFix
|
from butterrobot.http import ExternalProxyFix
|
||||||
from butterrobot.plugins import get_available_plugins
|
from butterrobot.queue import q
|
||||||
from butterrobot.platforms import PLATFORMS, get_available_platforms
|
from butterrobot.config import SECRET_KEY
|
||||||
from butterrobot.platforms.base import Platform
|
from butterrobot.platforms import get_available_platforms
|
||||||
from butterrobot.admin.blueprint import admin as admin_bp
|
from butterrobot.admin.blueprint import admin as admin_bp
|
||||||
|
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
logger = structlog.get_logger(__name__)
|
logger = structlog.get_logger(__name__)
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue