Fix users.py

This commit is contained in:
JonnyWong16 2023-04-21 16:24:13 -07:00
commit 2d6e9ad08f
No known key found for this signature in database
GPG key ID: B1F1F9807184697A

View file

@ -75,8 +75,8 @@ def refresh_users():
# Check if we've set a custom avatar if so don't overwrite it. # Check if we've set a custom avatar if so don't overwrite it.
if keys_dict['user_id']: if keys_dict['user_id']:
avatar_urls = monitor_db.select('SELECT thumb, custom_avatar_url ' avatar_urls = monitor_db.select("SELECT thumb, custom_avatar_url "
'FROM users WHERE user_id = ?', "FROM users WHERE user_id = ?",
[keys_dict['user_id']]) [keys_dict['user_id']])
if avatar_urls: if avatar_urls:
if not avatar_urls[0]['custom_avatar_url'] or \ if not avatar_urls[0]['custom_avatar_url'] or \
@ -98,7 +98,7 @@ def refresh_users():
if result == 'insert': if result == 'insert':
new_users.append(item['username']) new_users.append(item['username'])
query = 'UPDATE users SET is_active = 0 WHERE user_id NOT IN ({})'.format(', '.join(['?'] * len(user_ids))) query = "UPDATE users SET is_active = 0 WHERE user_id NOT IN ({})".format(", ".join(["?"] * len(user_ids)))
monitor_db.action(query=query, args=user_ids) monitor_db.action(query=query, args=user_ids)
# Add new users to loger username filter # Add new users to loger username filter
@ -137,43 +137,43 @@ class Users(object):
group_by = 'session_history.reference_id' if grouping else 'session_history.id' group_by = 'session_history.reference_id' if grouping else 'session_history.id'
columns = ['users.id AS row_id', columns = ["users.id AS row_id",
'users.user_id', "users.user_id",
'users.username', "users.username",
'(CASE WHEN users.friendly_name IS NULL OR TRIM(users.friendly_name) = "" \ "(CASE WHEN users.friendly_name IS NULL OR TRIM(users.friendly_name) = '' \
THEN users.username ELSE users.friendly_name END) AS friendly_name', THEN users.username ELSE users.friendly_name END) AS friendly_name",
'users.title', "users.title",
'users.email', "users.email",
'users.thumb AS user_thumb', "users.thumb AS user_thumb",
'users.custom_avatar_url AS custom_thumb', "users.custom_avatar_url AS custom_thumb",
'COUNT(DISTINCT %s) AS plays' % group_by, "COUNT(DISTINCT %s) AS plays" % group_by,
'SUM(CASE WHEN session_history.stopped > 0 THEN (session_history.stopped - session_history.started) \ "SUM(CASE WHEN session_history.stopped > 0 THEN (session_history.stopped - session_history.started) \
ELSE 0 END) - SUM(CASE WHEN session_history.paused_counter IS NULL THEN 0 ELSE \ ELSE 0 END) - SUM(CASE WHEN session_history.paused_counter IS NULL THEN 0 ELSE \
session_history.paused_counter END) AS duration', session_history.paused_counter END) AS duration",
'MAX(session_history.started) AS last_seen', "MAX(session_history.started) AS last_seen",
'MAX(session_history.id) AS history_row_id', "MAX(session_history.id) AS history_row_id",
'session_history_metadata.full_title AS last_played', "session_history_metadata.full_title AS last_played",
'session_history.ip_address', "session_history.ip_address",
'session_history.platform', "session_history.platform",
'session_history.player', "session_history.player",
'session_history.rating_key', "session_history.rating_key",
'session_history_metadata.media_type', "session_history_metadata.media_type",
'session_history_metadata.thumb', "session_history_metadata.thumb",
'session_history_metadata.parent_thumb', "session_history_metadata.parent_thumb",
'session_history_metadata.grandparent_thumb', "session_history_metadata.grandparent_thumb",
'session_history_metadata.parent_title', "session_history_metadata.parent_title",
'session_history_metadata.year', "session_history_metadata.year",
'session_history_metadata.media_index', "session_history_metadata.media_index",
'session_history_metadata.parent_media_index', "session_history_metadata.parent_media_index",
'session_history_metadata.live', "session_history_metadata.live",
'session_history_metadata.added_at', "session_history_metadata.added_at",
'session_history_metadata.originally_available_at', "session_history_metadata.originally_available_at",
'session_history_metadata.guid', "session_history_metadata.guid",
'session_history_media_info.transcode_decision', "session_history_media_info.transcode_decision",
'users.do_notify AS do_notify', "users.do_notify AS do_notify",
'users.keep_history AS keep_history', "users.keep_history AS keep_history",
'users.allow_guest AS allow_guest', "users.allow_guest AS allow_guest",
'users.is_active AS is_active' "users.is_active AS is_active"
] ]
try: try:
query = data_tables.ssp_query(table_name='users', query = data_tables.ssp_query(table_name='users',
@ -270,32 +270,32 @@ class Users(object):
custom_where = ['users.user_id', user_id] custom_where = ['users.user_id', user_id]
columns = ['session_history.id AS history_row_id', columns = ["session_history.id AS history_row_id",
'MIN(session_history.started) AS first_seen', "MIN(session_history.started) AS first_seen",
'MAX(session_history.started) AS last_seen', "MAX(session_history.started) AS last_seen",
'session_history.ip_address', "session_history.ip_address",
'COUNT(session_history.id) AS play_count', "COUNT(session_history.id) AS play_count",
'session_history.platform', "session_history.platform",
'session_history.player', "session_history.player",
'session_history.rating_key', "session_history.rating_key",
'session_history_metadata.full_title AS last_played', "session_history_metadata.full_title AS last_played",
'session_history_metadata.thumb', "session_history_metadata.thumb",
'session_history_metadata.parent_thumb', "session_history_metadata.parent_thumb",
'session_history_metadata.grandparent_thumb', "session_history_metadata.grandparent_thumb",
'session_history_metadata.media_type', "session_history_metadata.media_type",
'session_history_metadata.parent_title', "session_history_metadata.parent_title",
'session_history_metadata.year', "session_history_metadata.year",
'session_history_metadata.media_index', "session_history_metadata.media_index",
'session_history_metadata.parent_media_index', "session_history_metadata.parent_media_index",
'session_history_metadata.live', "session_history_metadata.live",
'session_history_metadata.added_at', "session_history_metadata.added_at",
'session_history_metadata.originally_available_at', "session_history_metadata.originally_available_at",
'session_history_metadata.guid', "session_history_metadata.guid",
'session_history_media_info.transcode_decision', "session_history_media_info.transcode_decision",
'session_history.user', "session_history.user",
'session_history.user_id as custom_user_id', "session_history.user_id as custom_user_id",
'(CASE WHEN users.friendly_name IS NULL OR TRIM(users.friendly_name) = "" \ "(CASE WHEN users.friendly_name IS NULL OR TRIM(users.friendly_name) = '' \
THEN users.username ELSE users.friendly_name END) AS friendly_name' THEN users.username ELSE users.friendly_name END) AS friendly_name"
] ]
try: try:
@ -436,31 +436,31 @@ class Users(object):
last_seen = 'NULL' last_seen = 'NULL'
join = '' join = ''
if include_last_seen: if include_last_seen:
last_seen = 'MAX(session_history.started)' last_seen = "MAX(session_history.started)"
join = 'LEFT OUTER JOIN session_history ON users.user_id = session_history.user_id' join = "LEFT OUTER JOIN session_history ON users.user_id = session_history.user_id"
monitor_db = database.MonitorDatabase() monitor_db = database.MonitorDatabase()
try: try:
if str(user_id).isdigit(): if str(user_id).isdigit():
where = 'users.user_id = ?' where = "users.user_id = ?"
args = [user_id] args = [user_id]
elif user: elif user:
where = 'users.username = ?' where = "users.username = ?"
args = [user] args = [user]
elif email: elif email:
where = 'users.email = ?' where = "users.email = ?"
args = [email] args = [email]
else: else:
raise Exception('Missing user_id, username, or email') raise Exception("Missing user_id, username, or email")
query = 'SELECT users.id AS row_id, users.user_id, username, friendly_name, ' \ query = "SELECT users.id AS row_id, users.user_id, username, friendly_name, " \
'thumb AS user_thumb, custom_avatar_url AS custom_thumb, ' \ "thumb AS user_thumb, custom_avatar_url AS custom_thumb, " \
'email, is_active, is_admin, is_home_user, is_allow_sync, is_restricted, ' \ "email, is_active, is_admin, is_home_user, is_allow_sync, is_restricted, " \
'do_notify, keep_history, deleted_user, ' \ "do_notify, keep_history, deleted_user, " \
'allow_guest, shared_libraries, %s AS last_seen ' \ "allow_guest, shared_libraries, %s AS last_seen " \
'FROM users %s ' \ "FROM users %s " \
'WHERE %s COLLATE NOCASE' % (last_seen, join, where) "WHERE %s COLLATE NOCASE" % (last_seen, join, where)
result = monitor_db.select(query, args=args) result = monitor_db.select(query, args=args)
except Exception as e: except Exception as e:
logger.warn("Tautulli Users :: Unable to execute database query for get_user_details: %s." % e) logger.warn("Tautulli Users :: Unable to execute database query for get_user_details: %s." % e)
@ -531,22 +531,22 @@ class Users(object):
try: try:
if days > 0: if days > 0:
if str(user_id).isdigit(): if str(user_id).isdigit():
query = 'SELECT (SUM(stopped - started) - ' \ query = "SELECT (SUM(stopped - started) - " \
' SUM(CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END)) AS total_time, ' \ " SUM(CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END)) AS total_time, " \
'COUNT(DISTINCT %s) AS total_plays ' \ "COUNT(DISTINCT %s) AS total_plays " \
'FROM session_history ' \ "FROM session_history " \
'WHERE stopped >= %s ' \ "WHERE stopped >= %s " \
'AND user_id = ? ' % (group_by, timestamp_query) "AND user_id = ? " % (group_by, timestamp_query)
result = monitor_db.select(query, args=[user_id]) result = monitor_db.select(query, args=[user_id])
else: else:
result = [] result = []
else: else:
if str(user_id).isdigit(): if str(user_id).isdigit():
query = 'SELECT (SUM(stopped - started) - ' \ query = "SELECT (SUM(stopped - started) - " \
' SUM(CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END)) AS total_time, ' \ " SUM(CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END)) AS total_time, " \
'COUNT(DISTINCT %s) AS total_plays ' \ "COUNT(DISTINCT %s) AS total_plays " \
'FROM session_history ' \ "FROM session_history " \
'WHERE user_id = ? ' % group_by "WHERE user_id = ? " % group_by
result = monitor_db.select(query, args=[user_id]) result = monitor_db.select(query, args=[user_id])
else: else:
result = [] result = []
@ -587,13 +587,13 @@ class Users(object):
try: try:
if str(user_id).isdigit(): if str(user_id).isdigit():
query = 'SELECT player, COUNT(DISTINCT %s) as total_plays, (SUM(stopped - started) - ' \ query = "SELECT player, COUNT(DISTINCT %s) as total_plays, (SUM(stopped - started) - " \
'SUM(CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END)) AS total_time, ' \ "SUM(CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END)) AS total_time, " \
'platform ' \ "platform " \
'FROM session_history ' \ "FROM session_history " \
'WHERE user_id = ? ' \ "WHERE user_id = ? " \
'GROUP BY player ' \ "GROUP BY player " \
'ORDER BY total_plays DESC, total_time DESC' % group_by "ORDER BY total_plays DESC, total_time DESC" % group_by
result = monitor_db.select(query, args=[user_id]) result = monitor_db.select(query, args=[user_id])
else: else:
result = [] result = []
@ -630,17 +630,17 @@ class Users(object):
try: try:
if str(user_id).isdigit(): if str(user_id).isdigit():
query = 'SELECT session_history.id, session_history.media_type, guid, ' \ query = "SELECT session_history.id, session_history.media_type, guid, " \
'session_history.rating_key, session_history.parent_rating_key, session_history.grandparent_rating_key, ' \ "session_history.rating_key, session_history.parent_rating_key, session_history.grandparent_rating_key, " \
'title, parent_title, grandparent_title, original_title, ' \ "title, parent_title, grandparent_title, original_title, " \
'thumb, parent_thumb, grandparent_thumb, media_index, parent_media_index, ' \ "thumb, parent_thumb, grandparent_thumb, media_index, parent_media_index, " \
'year, originally_available_at, added_at, live, started, user ' \ "year, originally_available_at, added_at, live, started, user " \
'FROM session_history_metadata ' \ "FROM session_history_metadata " \
'JOIN session_history ON session_history_metadata.id = session_history.id ' \ "JOIN session_history ON session_history_metadata.id = session_history.id " \
'WHERE user_id = ? ' \ "WHERE user_id = ? " \
'GROUP BY (CASE WHEN session_history.media_type = "track" THEN session_history.parent_rating_key ' \ "GROUP BY (CASE WHEN session_history.media_type = 'track' THEN session_history.parent_rating_key " \
' ELSE session_history.rating_key END) ' \ " ELSE session_history.rating_key END) " \
'ORDER BY MAX(started) DESC LIMIT ?' "ORDER BY MAX(started) DESC LIMIT ?"
result = monitor_db.select(query, args=[user_id, limit]) result = monitor_db.select(query, args=[user_id, limit])
else: else:
result = [] result = []
@ -683,11 +683,11 @@ class Users(object):
monitor_db = database.MonitorDatabase() monitor_db = database.MonitorDatabase()
try: try:
query = 'SELECT id AS row_id, user_id, username, friendly_name, thumb, custom_avatar_url, email, ' \ query = "SELECT id AS row_id, user_id, username, friendly_name, thumb, custom_avatar_url, email, " \
'is_active, is_admin, is_home_user, is_allow_sync, is_restricted, ' \ "is_active, is_admin, is_home_user, is_allow_sync, is_restricted, " \
'do_notify, keep_history, allow_guest, shared_libraries, ' \ "do_notify, keep_history, allow_guest, shared_libraries, " \
'filter_all, filter_movies, filter_tv, filter_music, filter_photos ' \ "filter_all, filter_movies, filter_tv, filter_music, filter_photos " \
'FROM users WHERE deleted_user = 0' "FROM users WHERE deleted_user = 0"
result = monitor_db.select(query=query) result = monitor_db.select(query=query)
except Exception as e: except Exception as e:
logger.warn("Tautulli Users :: Unable to execute database query for get_users: %s." % e) logger.warn("Tautulli Users :: Unable to execute database query for get_users: %s." % e)
@ -729,8 +729,8 @@ class Users(object):
row_ids = list(map(helpers.cast_to_int, row_ids.split(','))) row_ids = list(map(helpers.cast_to_int, row_ids.split(',')))
# Get the user_ids corresponding to the row_ids # Get the user_ids corresponding to the row_ids
result = monitor_db.select('SELECT user_id FROM users ' result = monitor_db.select("SELECT user_id FROM users "
'WHERE id IN ({})'.format(','.join(['?'] * len(row_ids))), row_ids) "WHERE id IN ({})".format(",".join(["?"] * len(row_ids))), row_ids)
success = [] success = []
for user in result: for user in result:
@ -747,9 +747,9 @@ class Users(object):
logger.info("Tautulli Users :: Deleting user with user_id %s from database." logger.info("Tautulli Users :: Deleting user with user_id %s from database."
% user_id) % user_id)
try: try:
monitor_db.action('UPDATE users ' monitor_db.action("UPDATE users "
'SET deleted_user = 1, keep_history = 0, do_notify = 0 ' "SET deleted_user = 1, keep_history = 0, do_notify = 0 "
'WHERE user_id = ?', [user_id]) "WHERE user_id = ?", [user_id])
return delete_success return delete_success
except Exception as e: except Exception as e:
logger.warn("Tautulli Users :: Unable to execute database query for delete: %s." % e) logger.warn("Tautulli Users :: Unable to execute database query for delete: %s." % e)
@ -762,25 +762,25 @@ class Users(object):
try: try:
if user_id and str(user_id).isdigit(): if user_id and str(user_id).isdigit():
query = 'SELECT * FROM users WHERE user_id = ?' query = "SELECT * FROM users WHERE user_id = ?"
result = monitor_db.select(query=query, args=[user_id]) result = monitor_db.select(query=query, args=[user_id])
if result: if result:
logger.info("Tautulli Users :: Re-adding user with id %s to database." % user_id) logger.info("Tautulli Users :: Re-adding user with id %s to database." % user_id)
monitor_db.action('UPDATE users ' monitor_db.action("UPDATE users "
'SET deleted_user = 0, keep_history = 1, do_notify = 1 ' "SET deleted_user = 0, keep_history = 1, do_notify = 1 "
'WHERE user_id = ?', [user_id]) "WHERE user_id = ?", [user_id])
return True return True
else: else:
return False return False
elif username: elif username:
query = 'SELECT * FROM users WHERE username = ?' query = "SELECT * FROM users WHERE username = ?"
result = monitor_db.select(query=query, args=[username]) result = monitor_db.select(query=query, args=[username])
if result: if result:
logger.info("Tautulli Users :: Re-adding user with username %s to database." % username) logger.info("Tautulli Users :: Re-adding user with username %s to database." % username)
monitor_db.action('UPDATE users ' monitor_db.action("UPDATE users "
'SET deleted_user = 0, keep_history = 1, do_notify = 1 ' "SET deleted_user = 0, keep_history = 1, do_notify = 1 "
'WHERE username = ?', [username]) "WHERE username = ?", [username])
return True return True
else: else:
return False return False
@ -793,7 +793,7 @@ class Users(object):
if user: if user:
try: try:
monitor_db = database.MonitorDatabase() monitor_db = database.MonitorDatabase()
query = 'SELECT user_id FROM users WHERE username = ?' query = "SELECT user_id FROM users WHERE username = ?"
result = monitor_db.select_single(query, args=[user]) result = monitor_db.select_single(query, args=[user])
if result: if result:
return result['user_id'] return result['user_id']
@ -809,14 +809,14 @@ class Users(object):
user_cond = '' user_cond = ''
if session.get_session_user_id(): if session.get_session_user_id():
user_cond = 'AND user_id = %s ' % session.get_session_user_id() user_cond = "AND user_id = %s " % session.get_session_user_id()
try: try:
query = 'SELECT user_id, ' \ query = "SELECT user_id, " \
'(CASE WHEN users.friendly_name IS NULL OR TRIM(users.friendly_name) = "" \ "(CASE WHEN users.friendly_name IS NULL OR TRIM(users.friendly_name) = '' \
THEN users.username ELSE users.friendly_name END) AS friendly_name ' \ THEN users.username ELSE users.friendly_name END) AS friendly_name " \
'FROM users ' \ "FROM users " \
'WHERE deleted_user = 0 %s' % user_cond "WHERE deleted_user = 0 %s" % user_cond
result = monitor_db.select(query) result = monitor_db.select(query)
except Exception as e: except Exception as e:
@ -835,8 +835,8 @@ class Users(object):
if user_id: if user_id:
try: try:
monitor_db = database.MonitorDatabase() monitor_db = database.MonitorDatabase()
query = 'SELECT allow_guest, user_token, server_token FROM users ' \ query = "SELECT allow_guest, user_token, server_token FROM users " \
'WHERE user_id = ? AND deleted_user = 0' "WHERE user_id = ? AND deleted_user = 0"
result = monitor_db.select_single(query, args=[user_id]) result = monitor_db.select_single(query, args=[user_id])
if result: if result:
tokens = {'allow_guest': result['allow_guest'], tokens = {'allow_guest': result['allow_guest'],
@ -857,8 +857,8 @@ class Users(object):
try: try:
monitor_db = database.MonitorDatabase() monitor_db = database.MonitorDatabase()
query = 'SELECT filter_all, filter_movies, filter_tv, filter_music, filter_photos FROM users ' \ query = "SELECT filter_all, filter_movies, filter_tv, filter_music, filter_photos FROM users " \
'WHERE user_id = ?' "WHERE user_id = ?"
result = monitor_db.select_single(query, args=[user_id]) result = monitor_db.select_single(query, args=[user_id])
except Exception as e: except Exception as e:
logger.warn("Tautulli Users :: Unable to execute database query for get_filters: %s." % e) logger.warn("Tautulli Users :: Unable to execute database query for get_filters: %s." % e)
@ -907,8 +907,8 @@ class Users(object):
def get_user_login(self, jwt_token): def get_user_login(self, jwt_token):
monitor_db = database.MonitorDatabase() monitor_db = database.MonitorDatabase()
result = monitor_db.select_single('SELECT * FROM user_login ' result = monitor_db.select_single("SELECT * FROM user_login "
'WHERE jwt_token = ?', "WHERE jwt_token = ?",
[jwt_token]) [jwt_token])
return result return result
@ -918,8 +918,8 @@ class Users(object):
if jwt_token: if jwt_token:
logger.debug("Tautulli Users :: Clearing user JWT token.") logger.debug("Tautulli Users :: Clearing user JWT token.")
try: try:
monitor_db.action('UPDATE user_login SET jwt_token = NULL ' monitor_db.action("UPDATE user_login SET jwt_token = NULL "
'WHERE jwt_token = ?', "WHERE jwt_token = ?",
[jwt_token]) [jwt_token])
except Exception as e: except Exception as e:
logger.error("Tautulli Users :: Unable to clear user JWT token: %s.", e) logger.error("Tautulli Users :: Unable to clear user JWT token: %s.", e)
@ -929,8 +929,8 @@ class Users(object):
row_ids = list(map(helpers.cast_to_int, row_ids.split(','))) row_ids = list(map(helpers.cast_to_int, row_ids.split(',')))
logger.debug("Tautulli Users :: Clearing JWT tokens for row_ids %s.", row_ids) logger.debug("Tautulli Users :: Clearing JWT tokens for row_ids %s.", row_ids)
try: try:
monitor_db.action('UPDATE user_login SET jwt_token = NULL ' monitor_db.action("UPDATE user_login SET jwt_token = NULL "
'WHERE id in ({})'.format(','.join(['?'] * len(row_ids))), "WHERE id in ({})".format(",".join(["?"] * len(row_ids))),
row_ids) row_ids)
except Exception as e: except Exception as e:
logger.error("Tautulli Users :: Unable to clear JWT tokens: %s.", e) logger.error("Tautulli Users :: Unable to clear JWT tokens: %s.", e)
@ -954,19 +954,19 @@ class Users(object):
else: else:
custom_where = [['user_login.user_id', user_id]] if user_id else [] custom_where = [['user_login.user_id', user_id]] if user_id else []
columns = ['user_login.id AS row_id', columns = ["user_login.id AS row_id",
'user_login.timestamp', "user_login.timestamp",
'user_login.user_id', "user_login.user_id",
'user_login.user', "user_login.user",
'user_login.user_group', "user_login.user_group",
'user_login.ip_address', "user_login.ip_address",
'user_login.host', "user_login.host",
'user_login.user_agent', "user_login.user_agent",
'user_login.success', "user_login.success",
'user_login.expiry', "user_login.expiry",
'user_login.jwt_token', "user_login.jwt_token",
'(CASE WHEN users.friendly_name IS NULL OR TRIM(users.friendly_name) = "" \ "(CASE WHEN users.friendly_name IS NULL OR TRIM(users.friendly_name) = '' \
THEN users.username ELSE users.friendly_name END) AS friendly_name' THEN users.username ELSE users.friendly_name END) AS friendly_name"
] ]
try: try: