mirror of
https://github.com/PhoenixTwoFive/karaoqueue.git
synced 2025-05-19 11:01:47 +02:00
Merge branch 'legacy_feature_client_identification_queue_limit' into stable
This commit is contained in:
commit
4b70b70a1d
@ -9,11 +9,13 @@ entry_table = "entries"
|
|||||||
index_label = "Id"
|
index_label = "Id"
|
||||||
done_table = "done_songs"
|
done_table = "done_songs"
|
||||||
|
|
||||||
|
|
||||||
def open_db():
|
def open_db():
|
||||||
conn = sqlite3.connect("/tmp/karaoqueue.db")
|
conn = sqlite3.connect("/tmp/karaoqueue.db")
|
||||||
conn.execute('PRAGMA encoding = "UTF-8";')
|
conn.execute('PRAGMA encoding = "UTF-8";')
|
||||||
return conn
|
return conn
|
||||||
|
|
||||||
|
|
||||||
def import_songs(song_csv):
|
def import_songs(song_csv):
|
||||||
print("Start importing Songs...")
|
print("Start importing Songs...")
|
||||||
df = pandas.read_csv(StringIO(song_csv), sep=';')
|
df = pandas.read_csv(StringIO(song_csv), sep=';')
|
||||||
@ -27,10 +29,11 @@ def import_songs(song_csv):
|
|||||||
print("Imported songs ({} in Database)".format(num_songs))
|
print("Imported songs ({} in Database)".format(num_songs))
|
||||||
return("Imported songs ({} in Database)".format(num_songs))
|
return("Imported songs ({} in Database)".format(num_songs))
|
||||||
|
|
||||||
|
|
||||||
def create_entry_table():
|
def create_entry_table():
|
||||||
conn = open_db()
|
conn = open_db()
|
||||||
conn.execute('CREATE TABLE IF NOT EXISTS '+entry_table +
|
conn.execute('CREATE TABLE IF NOT EXISTS '+entry_table +
|
||||||
' (ID INTEGER PRIMARY KEY NOT NULL, Song_Id INTEGER NOT NULL, Name VARCHAR(255))')
|
' (ID INTEGER PRIMARY KEY NOT NULL, Song_Id INTEGER NOT NULL, Name VARCHAR(255), Client_Id VARCHAR(36))')
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
@ -40,6 +43,7 @@ def create_done_song_table():
|
|||||||
' (Song_Id INTEGER PRIMARY KEY NOT NULL, Plays INTEGER)')
|
' (Song_Id INTEGER PRIMARY KEY NOT NULL, Plays INTEGER)')
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
def create_song_table():
|
def create_song_table():
|
||||||
conn = open_db()
|
conn = open_db()
|
||||||
conn.execute("CREATE TABLE IF NOT EXISTS \""+song_table+"""\" (
|
conn.execute("CREATE TABLE IF NOT EXISTS \""+song_table+"""\" (
|
||||||
@ -55,6 +59,7 @@ def create_song_table():
|
|||||||
)""")
|
)""")
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
def create_list_view():
|
def create_list_view():
|
||||||
conn = open_db()
|
conn = open_db()
|
||||||
conn.execute("""CREATE VIEW IF NOT EXISTS [Liste] AS
|
conn.execute("""CREATE VIEW IF NOT EXISTS [Liste] AS
|
||||||
@ -72,6 +77,7 @@ def create_done_song_view():
|
|||||||
WHERE done_songs.Song_Id=songs.Id""")
|
WHERE done_songs.Song_Id=songs.Id""")
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
def get_list():
|
def get_list():
|
||||||
conn = open_db()
|
conn = open_db()
|
||||||
conn.row_factory = sqlite3.Row
|
conn.row_factory = sqlite3.Row
|
||||||
@ -86,31 +92,36 @@ def get_played_list():
|
|||||||
cur.execute("SELECT * FROM Abspielliste")
|
cur.execute("SELECT * FROM Abspielliste")
|
||||||
return cur.fetchall()
|
return cur.fetchall()
|
||||||
|
|
||||||
|
|
||||||
def get_song_list():
|
def get_song_list():
|
||||||
conn = open_db()
|
conn = open_db()
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
cur.execute("SELECT Artist || \" - \" || Title AS Song, Id FROM songs;")
|
cur.execute("SELECT Artist || \" - \" || Title AS Song, Id FROM songs;")
|
||||||
return cur.fetchall()
|
return cur.fetchall()
|
||||||
|
|
||||||
|
|
||||||
def get_song_completions(input_string):
|
def get_song_completions(input_string):
|
||||||
conn = open_db()
|
conn = open_db()
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
# Don't look, it burns...
|
# Don't look, it burns...
|
||||||
prepared_string = "%{0}%".format(input_string).upper() # "Test" -> "%TEST%"
|
prepared_string = "%{0}%".format(
|
||||||
|
input_string).upper() # "Test" -> "%TEST%"
|
||||||
print(prepared_string)
|
print(prepared_string)
|
||||||
cur.execute(
|
cur.execute(
|
||||||
"SELECT Title || \" - \" || Artist AS Song, Id FROM songs WHERE REPLACE(REPLACE(REPLACE(REPLACE(UPPER( SONG ),'ö','Ö'),'ü','Ü'),'ä','Ä'),'ß','ẞ') LIKE (?) LIMIT 20;", (prepared_string,))
|
"SELECT Title || \" - \" || Artist AS Song, Id FROM songs WHERE REPLACE(REPLACE(REPLACE(REPLACE(UPPER( SONG ),'ö','Ö'),'ü','Ü'),'ä','Ä'),'ß','ẞ') LIKE (?) LIMIT 20;", (prepared_string,))
|
||||||
return cur.fetchall()
|
return cur.fetchall()
|
||||||
|
|
||||||
def add_entry(name,song_id):
|
|
||||||
|
def add_entry(name, song_id, client_id):
|
||||||
conn = open_db()
|
conn = open_db()
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
cur.execute(
|
cur.execute(
|
||||||
"INSERT INTO entries (Song_Id,Name) VALUES(?,?);", (song_id,name))
|
"INSERT INTO entries (Song_Id,Name,Client_Id) VALUES(?,?,?);", (song_id, name, client_id))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def add_sung_song(entry_id):
|
def add_sung_song(entry_id):
|
||||||
conn = open_db()
|
conn = open_db()
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
@ -127,6 +138,19 @@ def add_sung_song(entry_id):
|
|||||||
conn.close()
|
conn.close()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def check_entry_quota(client_id):
|
||||||
|
conn = open_db()
|
||||||
|
cur = conn.cursor()
|
||||||
|
cur.execute("SELECT Count(*) FROM entries WHERE entries.Client_Id = ?", (client_id,))
|
||||||
|
return cur.fetchall()[0][0]
|
||||||
|
|
||||||
|
def check_queue_length():
|
||||||
|
conn = open_db()
|
||||||
|
cur = conn.cursor()
|
||||||
|
cur.execute("SELECT Count(*) FROM entries")
|
||||||
|
return cur.fetchall()[0][0]
|
||||||
|
|
||||||
def clear_played_songs():
|
def clear_played_songs():
|
||||||
conn = open_db()
|
conn = open_db()
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
@ -135,6 +159,7 @@ def clear_played_songs():
|
|||||||
conn.close()
|
conn.close()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def delete_entry(id):
|
def delete_entry(id):
|
||||||
conn = open_db()
|
conn = open_db()
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
@ -158,6 +183,7 @@ def delete_entries(ids):
|
|||||||
except sqlite3.Error as error:
|
except sqlite3.Error as error:
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
|
|
||||||
def delete_all_entries():
|
def delete_all_entries():
|
||||||
conn = open_db()
|
conn = open_db()
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
|
@ -2,6 +2,7 @@ import requests
|
|||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import uuid
|
||||||
|
|
||||||
data_directory = "data"
|
data_directory = "data"
|
||||||
config_file = data_directory+"/config.json"
|
config_file = data_directory+"/config.json"
|
||||||
@ -21,6 +22,13 @@ def get_songs(url):
|
|||||||
r = requests.get(url)
|
r = requests.get(url)
|
||||||
return r.text
|
return r.text
|
||||||
|
|
||||||
|
def is_valid_uuid(val):
|
||||||
|
try:
|
||||||
|
uuid.UUID(str(val))
|
||||||
|
return True
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
|
|
||||||
def check_config_exists():
|
def check_config_exists():
|
||||||
return os.path.isfile(config_file)
|
return os.path.isfile(config_file)
|
||||||
|
|
||||||
@ -31,9 +39,11 @@ def setup_config(app):
|
|||||||
config = json.load(handle)
|
config = json.load(handle)
|
||||||
print("Loaded existing config")
|
print("Loaded existing config")
|
||||||
else:
|
else:
|
||||||
config = {'username': 'admin', 'password': 'changeme'}
|
config = {'username': 'admin', 'password': 'changeme', 'entryquota': 3, 'maxqueue': 20}
|
||||||
with open(config_file, 'w') as handle:
|
with open(config_file, 'w') as handle:
|
||||||
json.dump(config, handle, indent=4, sort_keys=True)
|
json.dump(config, handle, indent=4, sort_keys=True)
|
||||||
print("Wrote new config")
|
print("Wrote new config")
|
||||||
app.config['BASIC_AUTH_USERNAME'] = config['username']
|
app.config['BASIC_AUTH_USERNAME'] = config['username']
|
||||||
app.config['BASIC_AUTH_PASSWORD'] = config['password']
|
app.config['BASIC_AUTH_PASSWORD'] = config['password']
|
||||||
|
app.config['ENTRY_QUOTA'] = config['entryquota']
|
||||||
|
app.config['MAX_QUEUE'] = config['maxqueue']
|
@ -2,7 +2,8 @@ from flask import Flask, render_template, Response, abort, request, redirect
|
|||||||
import helpers
|
import helpers
|
||||||
import database
|
import database
|
||||||
import data_adapters
|
import data_adapters
|
||||||
import os, errno
|
import os
|
||||||
|
import errno
|
||||||
import json
|
import json
|
||||||
from flask_basicauth import BasicAuth
|
from flask_basicauth import BasicAuth
|
||||||
app = Flask(__name__, static_url_path='/static')
|
app = Flask(__name__, static_url_path='/static')
|
||||||
@ -10,6 +11,7 @@ app = Flask(__name__, static_url_path='/static')
|
|||||||
basic_auth = BasicAuth(app)
|
basic_auth = BasicAuth(app)
|
||||||
accept_entries = False
|
accept_entries = False
|
||||||
|
|
||||||
|
|
||||||
@app.route("/")
|
@app.route("/")
|
||||||
def home():
|
def home():
|
||||||
if basic_auth.authenticate():
|
if basic_auth.authenticate():
|
||||||
@ -17,16 +19,40 @@ def home():
|
|||||||
else:
|
else:
|
||||||
return render_template('main.html', list=database.get_list(), auth=basic_auth.authenticate())
|
return render_template('main.html', list=database.get_list(), auth=basic_auth.authenticate())
|
||||||
|
|
||||||
|
|
||||||
@app.route('/api/enqueue', methods=['POST'])
|
@app.route('/api/enqueue', methods=['POST'])
|
||||||
def enqueue():
|
def enqueue():
|
||||||
if accept_entries:
|
|
||||||
if not request.json:
|
if not request.json:
|
||||||
print(request.data)
|
print(request.data)
|
||||||
abort(400)
|
abort(400)
|
||||||
|
client_id = request.json['client_id']
|
||||||
|
if not helpers.is_valid_uuid(client_id):
|
||||||
|
print(request.data)
|
||||||
|
abort(400)
|
||||||
name = request.json['name']
|
name = request.json['name']
|
||||||
song_id = request.json['id']
|
song_id = request.json['id']
|
||||||
database.add_entry(name, song_id)
|
if request.authorization:
|
||||||
|
database.add_entry(name, song_id, client_id)
|
||||||
return Response('{"status":"OK"}', mimetype='text/json')
|
return Response('{"status":"OK"}', mimetype='text/json')
|
||||||
|
else:
|
||||||
|
if accept_entries:
|
||||||
|
if not request.json:
|
||||||
|
print(request.data)
|
||||||
|
abort(400)
|
||||||
|
client_id = request.json['client_id']
|
||||||
|
if not helpers.is_valid_uuid(client_id):
|
||||||
|
print(request.data)
|
||||||
|
abort(400)
|
||||||
|
name = request.json['name']
|
||||||
|
song_id = request.json['id']
|
||||||
|
if database.check_queue_length() < app.config['MAX_QUEUE']:
|
||||||
|
if database.check_entry_quota(client_id) < app.config['ENTRY_QUOTA']:
|
||||||
|
database.add_entry(name, song_id, client_id)
|
||||||
|
return Response('{"status":"OK"}', mimetype='text/json')
|
||||||
|
else:
|
||||||
|
return Response('{"status":"Du hast bereits ' + str(database.check_entry_quota(client_id)) + ' Songs eingetragen, dies ist das Maximum an Einträgen die du in der Warteliste haben kannst."}', mimetype='text/json', status=423)
|
||||||
|
else:
|
||||||
|
return Response('{"status":"Die Warteschlange enthält momentan ' + str(database.check_queue_length()) + ' Einträge und ist lang genug, bitte versuche es noch einmal wenn ein paar Songs gesungen wurden."}', mimetype='text/json', status=423)
|
||||||
else:
|
else:
|
||||||
return Response('{"status":"Currently not accepting entries"}', mimetype='text/json', status=423)
|
return Response('{"status":"Currently not accepting entries"}', mimetype='text/json', status=423)
|
||||||
|
|
||||||
@ -35,26 +61,54 @@ def enqueue():
|
|||||||
def songlist():
|
def songlist():
|
||||||
return render_template('songlist.html', list=database.get_song_list(), auth=basic_auth.authenticate())
|
return render_template('songlist.html', list=database.get_song_list(), auth=basic_auth.authenticate())
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/settings")
|
||||||
|
@basic_auth.required
|
||||||
|
def settings():
|
||||||
|
return render_template('settings.html', app=app, auth=basic_auth.authenticate())
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/settings", methods=['POST'])
|
||||||
|
@basic_auth.required
|
||||||
|
def settings_post():
|
||||||
|
entryquota = request.form.get("entryquota")
|
||||||
|
maxqueue = request.form.get("maxqueue")
|
||||||
|
if entryquota.isnumeric() and int(entryquota) > 0:
|
||||||
|
app.config['ENTRY_QUOTA'] = int(entryquota)
|
||||||
|
else:
|
||||||
|
abort(400)
|
||||||
|
if maxqueue.isnumeric and int(maxqueue) > 0:
|
||||||
|
app.config['MAX_QUEUE'] = int(maxqueue)
|
||||||
|
else:
|
||||||
|
abort(400)
|
||||||
|
|
||||||
|
return render_template('settings.html', app=app, auth=basic_auth.authenticate())
|
||||||
|
|
||||||
|
|
||||||
@app.route("/api/queue")
|
@app.route("/api/queue")
|
||||||
def queue_json():
|
def queue_json():
|
||||||
list = data_adapters.dict_from_rows(database.get_list())
|
list = data_adapters.dict_from_rows(database.get_list())
|
||||||
return Response(json.dumps(list, ensure_ascii=False).encode('utf-8'), mimetype='text/json')
|
return Response(json.dumps(list, ensure_ascii=False).encode('utf-8'), mimetype='text/json')
|
||||||
|
|
||||||
|
|
||||||
@app.route("/plays")
|
@app.route("/plays")
|
||||||
@basic_auth.required
|
@basic_auth.required
|
||||||
def played_list():
|
def played_list():
|
||||||
return render_template('played_list.html', list=database.get_played_list(), auth=basic_auth.authenticate())
|
return render_template('played_list.html', list=database.get_played_list(), auth=basic_auth.authenticate())
|
||||||
|
|
||||||
|
|
||||||
@app.route("/api/songs")
|
@app.route("/api/songs")
|
||||||
def songs():
|
def songs():
|
||||||
list = database.get_song_list()
|
list = database.get_song_list()
|
||||||
return Response(json.dumps(list, ensure_ascii=False).encode('utf-8'), mimetype='text/json')
|
return Response(json.dumps(list, ensure_ascii=False).encode('utf-8'), mimetype='text/json')
|
||||||
|
|
||||||
|
|
||||||
@app.route("/api/songs/update")
|
@app.route("/api/songs/update")
|
||||||
@basic_auth.required
|
@basic_auth.required
|
||||||
def update_songs():
|
def update_songs():
|
||||||
database.delete_all_entries()
|
database.delete_all_entries()
|
||||||
status = database.import_songs(helpers.get_songs(helpers.get_catalog_url()))
|
status = database.import_songs(
|
||||||
|
helpers.get_songs(helpers.get_catalog_url()))
|
||||||
print(status)
|
print(status)
|
||||||
return Response('{"status": "%s" }' % status, mimetype='text/json')
|
return Response('{"status": "%s" }' % status, mimetype='text/json')
|
||||||
|
|
||||||
@ -102,6 +156,7 @@ def mark_sung(entry_id):
|
|||||||
else:
|
else:
|
||||||
return Response('{"status": "FAIL"}', mimetype='text/json')
|
return Response('{"status": "FAIL"}', mimetype='text/json')
|
||||||
|
|
||||||
|
|
||||||
@app.route("/api/entries/accept/<value>")
|
@app.route("/api/entries/accept/<value>")
|
||||||
@basic_auth.required
|
@basic_auth.required
|
||||||
def set_accept_entries(value):
|
def set_accept_entries(value):
|
||||||
@ -127,6 +182,7 @@ def clear_played_songs():
|
|||||||
else:
|
else:
|
||||||
return Response('{"status": "FAIL"}', mimetype='text/json')
|
return Response('{"status": "FAIL"}', mimetype='text/json')
|
||||||
|
|
||||||
|
|
||||||
@app.route("/api/entries/delete_all")
|
@app.route("/api/entries/delete_all")
|
||||||
@basic_auth.required
|
@basic_auth.required
|
||||||
def delete_all_entries():
|
def delete_all_entries():
|
||||||
@ -135,11 +191,13 @@ def delete_all_entries():
|
|||||||
else:
|
else:
|
||||||
return Response('{"status": "FAIL"}', mimetype='text/json')
|
return Response('{"status": "FAIL"}', mimetype='text/json')
|
||||||
|
|
||||||
|
|
||||||
@app.route("/login")
|
@app.route("/login")
|
||||||
@basic_auth.required
|
@basic_auth.required
|
||||||
def admin():
|
def admin():
|
||||||
return redirect("/", code=303)
|
return redirect("/", code=303)
|
||||||
|
|
||||||
|
|
||||||
@app.before_first_request
|
@app.before_first_request
|
||||||
def activate_job():
|
def activate_job():
|
||||||
helpers.create_data_directory()
|
helpers.create_data_directory()
|
||||||
|
@ -51,6 +51,9 @@
|
|||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/plays">Abspielliste</a>
|
<a class="nav-link" href="/plays">Abspielliste</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/settings">Einstellungen</a>
|
||||||
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
<!--<form class="form-inline my-2 my-lg-0">
|
<!--<form class="form-inline my-2 my-lg-0">
|
||||||
@ -68,8 +71,7 @@
|
|||||||
<footer class="footer">
|
<footer class="footer">
|
||||||
<div class="container text-center py-3">
|
<div class="container text-center py-3">
|
||||||
{% if not auth %}
|
{% if not auth %}
|
||||||
<a href="/login" class="ml-1 mr-1"><i
|
<a href="/login" class="ml-1 mr-1"><i class="fas fa-sign-in-alt mr-1"></i><span>Login</span></a>
|
||||||
class="fas fa-sign-in-alt mr-1"></i><span>Login</span></a>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<!--<a href="https://github.com/PhoenixTwoFive/karaoqueue"
|
<!--<a href="https://github.com/PhoenixTwoFive/karaoqueue"
|
||||||
class="ml-1 mr-1"><i class="fab fa-github mr-1"></i><span>Github</span></a>-->
|
class="ml-1 mr-1"><i class="fab fa-github mr-1"></i><span>Github</span></a>-->
|
||||||
@ -95,16 +97,34 @@
|
|||||||
integrity="sha256-4F7e4JsAJyLUdpP7Q8Sah866jCOhv72zU5E8lIRER4w=" crossorigin="anonymous">
|
integrity="sha256-4F7e4JsAJyLUdpP7Q8Sah866jCOhv72zU5E8lIRER4w=" crossorigin="anonymous">
|
||||||
</script>
|
</script>
|
||||||
<script src="https://unpkg.com/bootstrap-table@1.15.3/dist/bootstrap-table.min.js"></script>
|
<script src="https://unpkg.com/bootstrap-table@1.15.3/dist/bootstrap-table.min.js"></script>
|
||||||
<script src="https://unpkg.com/bootstrap-table@1.15.3/dist/extensions/auto-refresh/bootstrap-table-auto-refresh.min.js"></script>
|
<script
|
||||||
|
src="https://unpkg.com/bootstrap-table@1.15.3/dist/extensions/auto-refresh/bootstrap-table-auto-refresh.min.js"></script>
|
||||||
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script>
|
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script>
|
||||||
{% block extrajs %}{% endblock %}
|
{% block extrajs %}{% endblock %}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
|
loadOrGenerateClientId()
|
||||||
// get current URL path and assign 'active' class
|
// get current URL path and assign 'active' class
|
||||||
var pathname = window.location.pathname;
|
var pathname = window.location.pathname;
|
||||||
$('.navbar-nav > li > a[href="' + pathname + '"]').parent().addClass('active');
|
$('.navbar-nav > li > a[href="' + pathname + '"]').parent().addClass('active');
|
||||||
$('[data-toggle="tooltip"]').tooltip()
|
$('[data-toggle="tooltip"]').tooltip()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
function create_UUID() {
|
||||||
|
var dt = new Date().getTime();
|
||||||
|
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
||||||
|
var r = (dt + Math.random() * 16) % 16 | 0;
|
||||||
|
dt = Math.floor(dt / 16);
|
||||||
|
return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
|
||||||
|
});
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadOrGenerateClientId() {
|
||||||
|
if (!localStorage.getItem("clientId")) {
|
||||||
|
localStorage.setItem("clientId",create_UUID())
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
@ -116,10 +116,10 @@ table td:nth-child(2) {
|
|||||||
$.getJSON("/api/entries/accept", (data) => {
|
$.getJSON("/api/entries/accept", (data) => {
|
||||||
if (data["value"]!=$('#entryToggle').is(":checked")) {
|
if (data["value"]!=$('#entryToggle').is(":checked")) {
|
||||||
if(data["value"]==1) {
|
if(data["value"]==1) {
|
||||||
$('#entryToggle').bootstrapToggle('on')
|
$('#entryToggle').data('bs.toggle').on('true')
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$('#entryToggle').bootstrapToggle('off')
|
$('#entryToggle').data('bs.toggle').off('true')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
18
backend/app/templates/settings.html
Normal file
18
backend/app/templates/settings.html
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block title %}Einstellungen{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<form method="post">
|
||||||
|
<p>
|
||||||
|
<label for="entryquota">Maximale Anzahl an Einträgen pro Nutzer</label>
|
||||||
|
<input type="number" class="form-control" id="entryquota" name="entryquota" min=1 value={{app.config['ENTRY_QUOTA']}}>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for="maxqueue">Maximale Anzahl an Einträgen Insgesamt</label>
|
||||||
|
<input type="number" class="form-control" id="maxqueue" name="maxqueue" min=1 value={{app.config['MAX_QUEUE']}}>
|
||||||
|
</p>
|
||||||
|
<input type="submit" class="btn btn-primary mr-1 mb-2" value="Einstellungen anwenden">
|
||||||
|
<input type="button" class="btn btn-default mr-1 mb-2" onclick="$.get('/writeSettings').done(()=>{alert('Einstellungen gespeichert')}).fail(()=>{alert('Fehler beim Speichern der Einstellungen')})" value="Einstellungen speichern"/>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
|
{% block extrajs %}
|
||||||
|
{% endblock %}
|
@ -70,10 +70,11 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
function enqueue(id,name,success_callback, blocked_callback) {
|
function enqueue(client_id, id, name, success_callback, blocked_callback) {
|
||||||
var data = {
|
var data = {
|
||||||
"name": name,
|
"name": name,
|
||||||
"id": id
|
"id": id,
|
||||||
|
"client_id": client_id
|
||||||
}
|
}
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
@ -95,14 +96,14 @@
|
|||||||
function submitModal() {
|
function submitModal() {
|
||||||
var name = $("#singerNameInput").val();
|
var name = $("#singerNameInput").val();
|
||||||
var id = $("#selectedId").attr("value");
|
var id = $("#selectedId").attr("value");
|
||||||
enqueue(id,name,function () {
|
enqueue(localStorage.getItem("clientId"),id, name, function () {
|
||||||
$("#enqueueModal").modal('hide');
|
$("#enqueueModal").modal('hide');
|
||||||
window.location.href = '/#end';
|
window.location.href = '/#end';
|
||||||
}, function () {
|
}, function (response) {
|
||||||
bootbox.alert({
|
bootbox.alert({
|
||||||
message: "Es werden leider keine neuen Anmeldungen mehr angenommen. Tut mir leid :(",
|
message: "Deine Eintragung konnte leider nicht vorgenommen werden.\nGrund: "+response.responseJSON.status,
|
||||||
});
|
});
|
||||||
$(".enqueueButton").prop("disabled",true);
|
entriesAccepted();
|
||||||
$("#enqueueModal").modal('hide');
|
$("#enqueueModal").modal('hide');
|
||||||
|
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user