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 + + +% if devices_list: + + + +% else: + +% 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. +
+ +

List of devices currently registered with the PlexPy server.

+
+
+
Loading registered devices...
+
+
+
+
@@ -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()