diff --git a/data/interfaces/default/css/plexpy.css b/data/interfaces/default/css/plexpy.css index e2e11185..af57d0c1 100644 --- a/data/interfaces/default/css/plexpy.css +++ b/data/interfaces/default/css/plexpy.css @@ -2374,7 +2374,8 @@ a .home-platforms-instance-list-oval:hover, top: 5px; left: 12px; } -#users-to-delete > li { +#users-to-delete > li, +#users-to-purge > li { color: #e9a049; } #updatebar { diff --git a/data/interfaces/default/js/tables/users.js b/data/interfaces/default/js/tables/users.js index 78240a3e..ab03435e 100644 --- a/data/interfaces/default/js/tables/users.js +++ b/data/interfaces/default/js/tables/users.js @@ -1,3 +1,4 @@ +var users_to_delete = []; var users_to_purge = []; users_list_table_options = { @@ -22,7 +23,8 @@ users_list_table_options = { "targets": [0], "data": null, "createdCell": function (td, cellData, rowData, row, col) { - $(td).html('
   ' + + $(td).html('
 ' + + '   ' + ' ' + ' '); // Show/hide user currently doesn't work @@ -286,16 +288,44 @@ $('#users_list_table').on('change', 'td.edit-control > .edit-user-toggles > inpu }); }); -$('#users_list_table').on('click', 'td.edit-control > .edit-user-toggles > button', function () { +$('#users_list_table').on('click', 'td.edit-control > .edit-user-toggles > button.delete-user', function () { var tr = $(this).parents('tr'); var row = users_list_table.row(tr); var rowData = row.data(); - var index = $.inArray(rowData['user_id'], users_to_purge); - if (index === -1) { + var index_delete = $.inArray(rowData['user_id'], users_to_delete); + var index_purge = $.inArray(rowData['user_id'], users_to_purge); + + if (index_delete === -1) { + users_to_delete.push(rowData['user_id']); + if (index_purge === -1) { + tr.find('button.purge-user').click(); + } + } else { + users_to_delete.splice(index_delete, 1); + if (index_purge != -1) { + tr.find('button.purge-user').click(); + } + } + $(this).toggleClass('btn-warning').toggleClass('btn-danger'); + +}); + +$('#users_list_table').on('click', 'td.edit-control > .edit-user-toggles > button.purge-user', function () { + var tr = $(this).parents('tr'); + var row = users_list_table.row(tr); + var rowData = row.data(); + + var index_delete = $.inArray(rowData['user_id'], users_to_delete); + var index_purge = $.inArray(rowData['user_id'], users_to_purge); + + if (index_purge === -1) { users_to_purge.push(rowData['user_id']); } else { - users_to_purge.splice(index, 1); + users_to_purge.splice(index_purge, 1); + if (index_delete != -1) { + tr.find('button.delete-user').click(); + } } $(this).toggleClass('btn-warning').toggleClass('btn-danger'); }); \ No newline at end of file diff --git a/data/interfaces/default/users.html b/data/interfaces/default/users.html index f4bc65c2..c97c46e8 100644 --- a/data/interfaces/default/users.html +++ b/data/interfaces/default/users.html @@ -16,7 +16,7 @@   - +
@@ -46,16 +46,16 @@
@@ -74,8 +74,8 @@ diff --git a/plexpy/__init__.py b/plexpy/__init__.py index 9e3e25c6..88fb73f7 100644 --- a/plexpy/__init__.py +++ b/plexpy/__init__.py @@ -406,9 +406,9 @@ def dbcheck(): c_db.execute( 'CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, ' 'user_id INTEGER DEFAULT NULL UNIQUE, username TEXT NOT NULL UNIQUE, ' - 'friendly_name TEXT, thumb TEXT, email TEXT, is_home_user INTEGER DEFAULT NULL, ' + 'friendly_name TEXT, thumb TEXT, email TEXT, custom_avatar_url TEXT, is_home_user INTEGER DEFAULT NULL, ' 'is_allow_sync INTEGER DEFAULT NULL, is_restricted INTEGER DEFAULT NULL, do_notify INTEGER DEFAULT 1, ' - 'keep_history INTEGER DEFAULT 1, custom_avatar_url TEXT)' + 'keep_history INTEGER DEFAULT 1, deleted_user INTEGER DEFAULT 0)' ) # Upgrade sessions table from earlier versions @@ -664,6 +664,15 @@ def dbcheck(): 'WHERE t1.id = session_history.id) ' ) + # Upgrade users table from earlier versions + try: + c_db.execute('SELECT deleted_user from users') + except sqlite3.OperationalError: + logger.debug(u"Altering database. Updating database table users.") + c_db.execute( + 'ALTER TABLE users ADD COLUMN deleted_user INTEGER DEFAULT 0' + ) + conn_db.commit() c_db.close() diff --git a/plexpy/datafactory.py b/plexpy/datafactory.py index 948b8fa4..544df9f7 100644 --- a/plexpy/datafactory.py +++ b/plexpy/datafactory.py @@ -800,6 +800,40 @@ class DataFactory(object): else: return 'Unable to delete items. Input user_id not valid.' + def delete_user(self, user_id=None): + monitor_db = database.MonitorDatabase() + + if user_id.isdigit(): + self.delete_all_user_history(user_id) + logger.info(u"PlexPy DataFactory :: Deleting user with id %s from database." % user_id) + monitor_db.action('UPDATE users SET deleted_user = 1 WHERE user_id = ?', [user_id]) + monitor_db.action('UPDATE users SET keep_history = 0 WHERE user_id = ?', [user_id]) + monitor_db.action('UPDATE users SET do_notify = 0 WHERE user_id = ?', [user_id]) + + return 'Deleted user with id %s.' % user_id + else: + return 'Unable to delete user. Input user_id not valid.' + + def undelete_user(self, user_id=None, username=None): + monitor_db = database.MonitorDatabase() + + if user_id and user_id.isdigit(): + logger.info(u"PlexPy DataFactory :: Re-adding user with id %s to database." % user_id) + monitor_db.action('UPDATE users SET deleted_user = 0 WHERE user_id = ?', [user_id]) + monitor_db.action('UPDATE users SET keep_history = 1 WHERE user_id = ?', [user_id]) + monitor_db.action('UPDATE users SET do_notify = 1 WHERE user_id = ?', [user_id]) + + return 'Re-added user with id %s.' % user_id + elif username: + logger.info(u"PlexPy DataFactory :: Re-adding user with username %s to database." % username) + monitor_db.action('UPDATE users SET deleted_user = 0 WHERE username = ?', [username]) + monitor_db.action('UPDATE users SET keep_history = 1 WHERE username = ?', [username]) + monitor_db.action('UPDATE users SET do_notify = 1 WHERE username = ?', [username]) + + return 'Re-added user with username %s.' % username + else: + return 'Unable to re-add user. Input user_id or username not valid.' + def get_search_query(self, rating_key=''): monitor_db = database.MonitorDatabase() diff --git a/plexpy/users.py b/plexpy/users.py index 1c0c23a7..bccda2f7 100644 --- a/plexpy/users.py +++ b/plexpy/users.py @@ -24,6 +24,8 @@ class Users(object): def get_user_list(self, kwargs=None): data_tables = datatables.DataTables() + custom_where = ['users.deleted_user', 0] + columns = ['session_history.id', 'users.user_id as user_id', 'users.custom_avatar_url as user_thumb', @@ -48,7 +50,7 @@ class Users(object): try: query = data_tables.ssp_query(table_name='users', columns=columns, - custom_where=[], + custom_where=[custom_where], group_by=['users.user_id'], join_types=['LEFT OUTER JOIN', 'LEFT OUTER JOIN', diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 62b16cc5..85be241f 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -1397,6 +1397,40 @@ class WebInterface(object): cherrypy.response.headers['Content-type'] = 'application/json' return json.dumps({'message': 'no data received'}) + @cherrypy.expose + def delete_user(self, user_id, **kwargs): + data_factory = datafactory.DataFactory() + + if user_id: + delete_row = data_factory.delete_user(user_id=user_id) + + if delete_row: + cherrypy.response.headers['Content-type'] = 'application/json' + return json.dumps({'message': delete_row}) + else: + cherrypy.response.headers['Content-type'] = 'application/json' + return json.dumps({'message': 'no data received'}) + + @cherrypy.expose + def undelete_user(self, user_id=None, username=None, **kwargs): + data_factory = datafactory.DataFactory() + + if user_id: + delete_row = data_factory.undelete_user(user_id=user_id) + + if delete_row: + cherrypy.response.headers['Content-type'] = 'application/json' + return json.dumps({'message': delete_row}) + elif username: + delete_row = data_factory.undelete_user(username=username) + + if delete_row: + cherrypy.response.headers['Content-type'] = 'application/json' + return json.dumps({'message': delete_row}) + else: + cherrypy.response.headers['Content-type'] = 'application/json' + return json.dumps({'message': 'no data received'}) + @cherrypy.expose def search(self, query=''):