diff --git a/data/interfaces/default/css/plexpy.css b/data/interfaces/default/css/plexpy.css
index c151142f..53ab5170 100644
--- a/data/interfaces/default/css/plexpy.css
+++ b/data/interfaces/default/css/plexpy.css
@@ -2405,6 +2405,22 @@ a .home-platforms-list-cover-face:hover
.stacked-configs > li.add-notification-agent {
cursor: pointer;
}
+.stacked-configs > li.registered-device > span,
+.stacked-configs > li.registered-device > span:hover,
+.stacked-configs > li.registered-device > span:focus {
+ background-color: #282828;
+}
+.stacked-configs > li.registered-device > span > a.toggle-left,
+.stacked-configs > li.registered-device > span > span.toggle-left {
+ color: #999;
+ padding-right: 8px;
+}
+.stacked-configs > li.registered-device > span > span.delete-mobile-device {
+ cursor: pointer;
+}
+.stacked-configs > li.registered-device > span > span.delete-mobile-device:hover {
+ color: #c9302c;
+}
.accordion {
width: 100%;
max-width: 900px;
diff --git a/data/interfaces/default/mobile_devices_table.html b/data/interfaces/default/mobile_devices_table.html
new file mode 100644
index 00000000..920816ec
--- /dev/null
+++ b/data/interfaces/default/mobile_devices_table.html
@@ -0,0 +1,46 @@
+<%doc>
+USAGE DOCUMENTATION :: PLEASE LEAVE THIS AT THE TOP OF THIS FILE
+
+For Mako templating syntax documentation please visit: http://docs.makotemplates.org/en/latest/
+
+Filename: mobile_devices_table.html
+Version: 0.1
+
+DOCUMENTATION :: END
+%doc>
+
+% if devices_list:
+
+
+
+% else:
+
+ -
+
+
+ No devices registered
+
+
+
+% endif
diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html
index 6b17494e..65f57955 100644
--- a/data/interfaces/default/settings.html
+++ b/data/interfaces/default/settings.html
@@ -1112,6 +1112,16 @@
The API must be enabled under Access Control to use the app.
+
@@ -2451,6 +2461,17 @@
});
}
+ function getMobileDevicesTable() {
+ $.ajax({
+ url: 'get_mobile_devices_table',
+ cache: false,
+ async: true,
+ complete: function(xhr, status) {
+ $("#plexpy-mobile-devices-table").html(xhr.responseText);
+ }
+ });
+ }
+
$(document).ready(function() {
// Javascript to enable link to tab
@@ -2489,6 +2510,7 @@ $(document).ready(function() {
getConfigurationTable();
getSchedulerTable();
getNotifiersTable();
+ getMobileDevicesTable();
loadUpdateDistros();
settingsChanged = false;
}
@@ -2553,6 +2575,7 @@ $(document).ready(function() {
getConfigurationTable();
getSchedulerTable();
getNotifiersTable();
+ getMobileDevicesTable();
$('#changelog-modal-link').on('click', function (e) {
e.preventDefault();
diff --git a/plexpy/api2.py b/plexpy/api2.py
index b7e04a2c..185b57a4 100644
--- a/plexpy/api2.py
+++ b/plexpy/api2.py
@@ -372,14 +372,18 @@ class API2:
values = {'device_name': device_name}
try:
- db.upsert(table_name='mobile_devices', key_dict=keys, value_dict=values)
+ result = db.upsert(table_name='mobile_devices', key_dict=keys, value_dict=values)
except Exception as e:
logger.warn(u"PlexPy APIv2 :: Failed to register mobile device in the database: %s." % e)
self._api_msg = 'Device registartion failed: database error.'
self._api_result_type = 'error'
return
- logger.info(u"PlexPy APIv2 :: Registered mobile device in the database: %s." % device_name)
+ if result == 'insert':
+ logger.info(u"PlexPy APIv2 :: Registered mobile device in the database: %s." % device_name)
+ else:
+ logger.debug(u"PlexPy APIv2 :: Re-registered mobile device in the database: %s." % device_name)
+
self._api_msg = 'Device registration successful.'
self._api_result_type = 'success'
return
diff --git a/plexpy/notifiers.py b/plexpy/notifiers.py
index 4cbfb928..1ff03d2f 100644
--- a/plexpy/notifiers.py
+++ b/plexpy/notifiers.py
@@ -548,6 +548,17 @@ def blacklist_logger():
logger._BLACKLIST_WORDS.extend(blacklist)
+def delete_mobile_device(device_id=None):
+ monitor_db = database.MonitorDatabase()
+
+ if device_id:
+ logger.debug(u"PlexPy Notifiers :: Deleting device_id %s from the database." % device_id)
+ result = monitor_db.action('DELETE FROM mobile_devices WHERE device_id = ?', [device_id])
+ return True
+ else:
+ return False
+
+
class PrettyMetadata(object):
def __init__(self, parameters):
self.parameters = parameters
diff --git a/plexpy/webserve.py b/plexpy/webserve.py
index 34f565c8..978ae4f2 100644
--- a/plexpy/webserve.py
+++ b/plexpy/webserve.py
@@ -3194,6 +3194,37 @@ class WebInterface(object):
cherrypy.response.status = 200
+ @cherrypy.expose
+ @requireAuth(member_of("admin"))
+ def get_mobile_devices_table(self, **kwargs):
+ result = notifiers.ANDROIDAPP().get_devices()
+ devices_list = [{'device_id': id, 'device_name': name} for id, name in result.iteritems()]
+ return serve_template(templatename="mobile_devices_table.html", devices_list=devices_list)
+
+ @cherrypy.expose
+ @cherrypy.tools.json_out()
+ @requireAuth(member_of("admin"))
+ @addtoapi()
+ def delete_mobile_device(self, device_id=None, **kwargs):
+ """ Remove a mobile device from the database.
+
+ ```
+ Required parameters:
+ device_id (int): The device to delete
+
+ Optional parameters:
+ None
+
+ Returns:
+ None
+ ```
+ """
+ result = notifiers.delete_mobile_device(device_id=device_id)
+ if result:
+ return {'result': 'success', 'message': 'Device deleted successfully.'}
+ else:
+ return {'result': 'error', 'message': 'Failed to delete device.'}
+
@cherrypy.expose
@requireAuth(member_of("admin"))
@addtoapi()