From 747274056362eb35fbe07482ef6cbadd8673fe9b Mon Sep 17 00:00:00 2001 From: Julian Rother <julianr@fsmpi.rwth-aachen.de> Date: Tue, 2 Jan 2018 02:13:05 +0100 Subject: [PATCH] Moved {job,edit}_handler functions back into the corresponding modules --- edit.py | 12 ++++++++++++ jobs.py | 30 +++++++++++++++++++++--------- livestreams.py | 3 +-- server.py | 34 ++-------------------------------- sorter.py | 21 +++++++++++---------- stats.py | 1 - templates/jobs_overview.html | 5 ++--- 7 files changed, 49 insertions(+), 57 deletions(-) diff --git a/edit.py b/edit.py index a0423b1..7194a2b 100644 --- a/edit.py +++ b/edit.py @@ -210,3 +210,15 @@ def set_responsible(course_id, user_id, value): modify('DELETE FROM responsible WHERE course_id = ? AND user_id = ?', course_id, user_id); return "OK", 200 +edit_handlers = {} +def edit_handler(*tables, field=None): + def wrapper(func): + for table in tables: + if table not in edit_handlers: + edit_handlers[table] = {} + if field not in edit_handlers[table]: + edit_handlers[table][field] = [] + edit_handlers[table][field].append(func) + return func + return wrapper + diff --git a/jobs.py b/jobs.py index c984f7c..86b5519 100644 --- a/jobs.py +++ b/jobs.py @@ -2,7 +2,24 @@ from server import * import traceback import json import random -from sorter import schedule_thumbnail + +job_handlers = {} +def job_handler(*types, state='finished'): + def wrapper(func): + for jobtype in types: + if jobtype not in job_handlers: + job_handlers[jobtype] = {} + if state not in job_handlers[jobtype]: + job_handlers[jobtype][state] = [] + job_handlers[jobtype][state].append(func) + return func + return wrapper + +def schedule_job(jobtype, data=None, priority=0, queue="default"): + if not data: + data = {} + modify('INSERT INTO jobs (type, priority, queue, data, time_created) VALUES (?, ?, ?, ?, ?)', + jobtype, priority, queue, json.dumps(data, default=date_json_handler), datetime.now()) @app.route('/internal/jobs/overview') @register_navbar('Jobs', iconlib='fa', icon='suitcase') @@ -42,19 +59,14 @@ def jobs_overview(): def jobs_action(action, jobid=None): if action == 'clear_failed': query('UPDATE jobs SET state="deleted" WHERE state = "failed" AND (id = ? OR ? IS NULL)', jobid, jobid) - if action == 'retry_failed': + elif action == 'retry_failed': query('UPDATE jobs SET state="ready" WHERE state = "failed" AND (id = ? OR ? IS NULL)', jobid, jobid) - if action == 'copy': + elif action == 'copy': if jobid: query("INSERT INTO jobs SELECT NULL, type, priority, queue, 'ready', '', '' , ?, '', NULL, data, '{}' FROM jobs where ID=?;", datetime.now(), jobid) - if action == 'delete': + elif action == 'delete': if jobid: query('UPDATE jobs SET state="deleted" WHERE id = ?', jobid) - if action == 'add': - jobtype = request.values.get('type', None) - if jobtype == 'thumbnail': - lectureid = int(request.values.get('lecture_id', -1)) - schedule_thumbnail(lectureid) return redirect(request.values.get('ref', url_for('jobs_overview'))) def jobs_api_token_required(func): diff --git a/livestreams.py b/livestreams.py index bd0b97d..3ccbe1d 100644 --- a/livestreams.py +++ b/livestreams.py @@ -3,9 +3,8 @@ from server import * @sched_func(30) def livestream_thumbnail(): livestreams = query('SELECT streams.lecture_id, streams.handle AS livehandle FROM streams WHERE streams.active') - for v in genlive(livestreams): - sorter.schedule_thumbnail(v['lecture_id'], v['path']) + schedule_job('thumbnail', {'lectureid': v['lecture_id'], 'path': v['path']}) @app.route('/internal/streaming/legacy_auth', methods=['GET', 'POST']) def streamauth(): diff --git a/server.py b/server.py index 84f35fc..17db375 100644 --- a/server.py +++ b/server.py @@ -483,47 +483,17 @@ def dbstatus(): clusters[cluster].append(host) return render_template('dbstatus.html', clusters=clusters, statuses=status, vars=variables), 200 -job_handlers = {} -def job_handler(*types, state='finished'): - def wrapper(func): - for jobtype in types: - if jobtype not in job_handlers: - job_handlers[jobtype] = {} - if state not in job_handlers[jobtype]: - job_handlers[jobtype][state] = [] - job_handlers[jobtype][state].append(func) - return func - return wrapper - def date_json_handler(obj): return obj.isoformat() if hasattr(obj, 'isoformat') else obj -def schedule_job(jobtype, data=None, priority=0, queue="default"): - if not data: - data = {} - modify('INSERT INTO jobs (type, priority, queue, data, time_created) VALUES (?, ?, ?, ?, ?)', - jobtype, priority, queue, json.dumps(data, default=date_json_handler), datetime.now()) - -edit_handlers = {} -def edit_handler(*tables, field=None): - def wrapper(func): - for table in tables: - if table not in edit_handlers: - edit_handlers[table] = {} - if field not in edit_handlers[table]: - edit_handlers[table][field] = [] - edit_handlers[table][field].append(func) - return func - return wrapper - -import edit +from jobs import job_handler, schedule_job +from edit import edit_handler import feeds import importer import stats if 'ICAL_URL' in config: import meetings import l2pauth -import jobs import sorter import encoding import timetable diff --git a/sorter.py b/sorter.py index 1f7029b..86b5153 100644 --- a/sorter.py +++ b/sorter.py @@ -49,21 +49,22 @@ def insert_video(lectureid, dbfilepath, fileformatid, hash="", filesize=-1): schedule_thumbnail(lectureid) schedule_job('probe', {'path': dbfilepath, 'lecture_id': lectureid, 'video_id': video_id, 'import-chapters': True}) -def schedule_thumbnail(lectureid, filePath=None): +@app.route('/internal/jobs/add/thumbnail', methods=['GET', 'POST']) +@mod_required +@handle_errors('jobs_overview', 'Zu dieser Veranstaltung existieren keine Videos!', 404, IndexError) +def schedule_thumbnail(lectureid=None): + ret = None + if not lectureid: + lectureid = request.values['lectureid'] + ret = redirect(request.values.get('ref', url_for('jobs_overview'))) videos = query(''' SELECT videos.path FROM videos JOIN formats ON (videos.video_format = formats.id) WHERE videos.lecture_id = ? - ORDER BY formats.prio DESC''', lectureid ) - if videos: - path = videos[0]['path'] - elif filePath: - path = filePath - else: - return - data = '{"lectureid": "'+str(lectureid)+'", "path": "'+path+'"}' - query('INSERT INTO jobs (type, data, time_created) VALUES ("thumbnail", ?, ?)', data, datetime.now()); + ORDER BY formats.prio DESC''', lectureid) + schedule_job('thumbnail', {'lectureid': lectureid, 'path': videos[0]['path']}) + return ret @job_handler('transcode') def insert_transcoded_video(jobid, jobtype, data, state, status): diff --git a/stats.py b/stats.py index de8f019..6e9df8f 100644 --- a/stats.py +++ b/stats.py @@ -1,6 +1,5 @@ from server import * import json -from jobs import date_json_handler from hashlib import md5 from datetime import datetime diff --git a/templates/jobs_overview.html b/templates/jobs_overview.html index ae51248..469cf56 100644 --- a/templates/jobs_overview.html +++ b/templates/jobs_overview.html @@ -17,10 +17,9 @@ <div class="tab-content" style="margin-top: 10px;"> <div role="tabpanel" class="tab-pane active" id="add_thumbnail"> - <form class="form-inline" action="{{url_for('jobs_action', action='add', ref=request.url)}}" method="post"> + <form class="form-inline" action="{{url_for('schedule_thumbnail', ref=request.url)}}" method="post"> <div class="form-group"> - <input type="hidden" name="type" value="thumbnail"> - <input type="text" class="form-control" id="thumbnail_lectureid" placeholder="Lecture ID" name="lecture_id"> + <input type="text" class="form-control" placeholder="Lecture ID" name="lectureid"> <button type="submit" class="btn btn-primary">Hinzufügen</button> </div> </form> -- GitLab