manually setting a video link now also its own endpoint

pull/55/head
Christopher Usher 6 years ago
parent b7a57d4766
commit c3c75b1e4f

@ -2,7 +2,6 @@ import datetime
import json import json
import logging import logging
import signal import signal
import uuid
import argh import argh
import flask import flask
@ -40,13 +39,10 @@ def metrics():
return prometheus_client.generate_latest() return prometheus_client.generate_latest()
@app.route('/thrimshim/<ident>', methods=['GET', 'POST']) @app.route('/thrimshim/<uuid:ident>', methods=['GET', 'POST'])
def thrimshim(ident): def thrimshim(ident):
"""Comunicate between Thrimbletrimmer and the Wubloader database.""" """Comunicate between Thrimbletrimmer and the Wubloader database."""
try: ident = str(ident)
uuid.UUID(ident)
except ValueError:
return 'Invalid format for id', 400
if flask.request.method == 'POST': if flask.request.method == 'POST':
row = flask.request.json row = flask.request.json
return update_row(ident, row) return update_row(ident, row)
@ -78,11 +74,7 @@ def get_row(ident):
def update_row(ident, new_row): def update_row(ident, new_row):
"""Updates row of database with id = ident with the edit columns in """Updates row of database with id = ident with the edit columns in
new_row. new_row."""
If a 'video_link' is provided in update, interpret this as a manual video
upload and set state to 'DONE'. If state currently is 'DONE', and a empty
'video_link' is present, reset state to 'UNEDITED'."""
state_columns = ['state', 'uploader', 'error', 'video_link'] state_columns = ['state', 'uploader', 'error', 'video_link']
#these have to be set before a video can be set as 'EDITED' #these have to be set before a video can be set as 'EDITED'
@ -112,42 +104,33 @@ def update_row(ident, new_row):
assert old_row.id == ident assert old_row.id == ident
if old_row.state not in ['UNEDITED', 'EDITED', 'CLAIMED'] and not ('video_link' in new_row and new_row['video_link']): if old_row.state not in ['UNEDITED', 'EDITED', 'CLAIMED']:
return 'Video already published', 403 return 'Video already published', 403
# handle state columns # handle state columns
# interpret non-empty video_link as manual uploads if new_row['state'] == 'EDITED':
# interpret state == 'DONE' and an empty video link as instructions to reset missing = []
# state to 'UNEDITED' and clear video link for column in non_null_columns:
# otherwise clear other state columns if not new_row[column]:
if 'video_link' in new_row and new_row['video_link']: missing.append(column)
new_row['state'] = 'DONE' if missing:
new_row['upload_location'] = 'manual' return 'Fields {} must be non-null for video to be cut'.format(', '.join(missing)), 400
else: elif new_row['state'] != 'UNEDITED':
if new_row['state'] == 'EDITED': return 'Invalid state {}'.format(new_row['state']), 400
missing = []
for column in non_null_columns:
if not new_row[column]:
missing.append(column)
if missing:
return 'Fields {} must be non-null for video to be cut'.format(', '.join(missing)), 400
elif new_row['state'] != 'UNEDITED':
return 'Invalid state {}'.format(new_row['state']), 400
new_row['uploader'] = None new_row['uploader'] = None
new_row['error'] = None new_row['error'] = None
# actually update database # actually update database
query_str = """ build_query = sql.SQL("""
UPDATE events UPDATE events
SET {{}} SET {}
WHERE id = %(id)s WHERE id = %(id)s
{}""".format("AND state IN ('UNEDITED', 'EDITED', 'CLAIMED')" if not ('video_link' in new_row and new_row['video_link']) else "") AND state IN ('UNEDITED', 'EDITED', 'CLAIMED')"""
build_query = sql.SQL(query_str).format(sql.SQL(", ").join( ).format(sql.SQL(", ").join(
sql.SQL("{} = {}").format( sql.SQL("{} = {}").format(
sql.Identifier(column), sql.Placeholder(column), sql.Identifier(column), sql.Placeholder(column),
) for column in new_row.keys() ) for column in new_row.keys()
)) ))
result = database.query(conn, build_query, id=ident, **new_row) result = database.query(conn, build_query, id=ident, **new_row)
if result.rowcount != 1: if result.rowcount != 1:
return 'Video likely already published', 403 return 'Video likely already published', 403
@ -155,19 +138,32 @@ def update_row(ident, new_row):
logging.info('Row {} updated to state {}'.format(ident, new_row['state'])) logging.info('Row {} updated to state {}'.format(ident, new_row['state']))
return '' return ''
@app.route('/thrimshim/reset/<ident>')
@app.route('/thrimshim/manual-link/<uuid:ident>', methods=['POST'])
def manual_link(ident):
"""Manually set a video_link"""
link = flask.request.json
conn = app.db_manager.get_conn()
results = database.query(conn, """
UPDATE events
SET state='DONE', upload_location = 'Manual', video_link = %s
WHERE id = %s""", link, str(ident))
if results.rowcount != 1:
return 'Row id = {} not found'.format(ident), 404
logging.info("Row {} video_link set to {}".format(ident, link))
return ''
@app.route('/thrimshim/reset/<uuid:ident>')
def reset_row(ident): def reset_row(ident):
"""Clear state and video_link columns and reset state to 'UNEDITED'.""" """Clear state and video_link columns and reset state to 'UNEDITED'."""
try:
uuid.UUID(ident)
except ValueError:
return 'Invalid format for id', 400
conn = app.db_manager.get_conn() conn = app.db_manager.get_conn()
results = database.query(conn, """ results = database.query(conn, """
UPDATE events UPDATE events
SET STATE='UNEDITED', error = NULL, video_id = NULL, video_link = NULL, SET state='UNEDITED', error = NULL, video_id = NULL, video_link = NULL,
uploader = NULL uploader = NULL
WHERE id = %s""", ident) WHERE id = %s""", str(ident))
if results.rowcount != 1: if results.rowcount != 1:
return 'Row id = {} not found'.format(ident), 404 return 'Row id = {} not found'.format(ident), 404
logging.info("Row {} reset to 'UNEDITED'".format(ident)) logging.info("Row {} reset to 'UNEDITED'".format(ident))

Loading…
Cancel
Save