Watch History for
- ${user}
+ ${friendly_name}
@@ -272,6 +276,19 @@ from plexpy import helpers
}
}
});
+
+ // Load edit user modal
+ $("#toggle-edit-user-modal").click(function() {
+ $.ajax({
+ url: 'edit_user',
+ data: {user: '${user}'},
+ cache: false,
+ async: true,
+ complete: function(xhr, status) {
+ $("#edit-user-modal").html(xhr.responseText);
+ }
+ });
+ });
});
diff --git a/plexpy/__init__.py b/plexpy/__init__.py
index f456bb8c..07141e9b 100644
--- a/plexpy/__init__.py
+++ b/plexpy/__init__.py
@@ -307,6 +307,8 @@ def sig_handler(signum=None, frame=None):
def dbcheck():
conn = sqlite3.connect(plexpy.CONFIG.PLEXWATCH_DATABASE)
c = conn.cursor()
+ c.execute('CREATE TABLE IF NOT EXISTS plexpy_users (id INTEGER PRIMARY KEY AUTOINCREMENT, '
+ 'username TEXT NOT NULL UNIQUE, friendly_name TEXT)')
conn.commit()
c.close()
diff --git a/plexpy/plexwatch.py b/plexpy/plexwatch.py
index 5e19939f..7f639c0e 100644
--- a/plexpy/plexwatch.py
+++ b/plexpy/plexwatch.py
@@ -660,11 +660,14 @@ class PlexWatch(object):
elif 'top_users' in stat:
top_users = []
try:
- query = 'SELECT user, COUNT(id) as total_plays, MAX(time) as last_watch ' \
- 'FROM %s ' \
- 'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-%s days", "localtime") ' \
- 'GROUP BY user ' \
- 'ORDER BY total_plays DESC LIMIT 10' % (self.get_history_table_name(), time_range)
+ s = self.get_history_table_name()
+ query = 'SELECT user, (case when friendly_name is null then user else friendly_name end) as friendly_name,' \
+ 'COUNT(' + s + '.id) as total_plays, MAX(time) as last_watch ' \
+ 'FROM ' + s + ' ' \
+ 'LEFT OUTER JOIN plexpy_users ON ' + s + '.user = plexpy_users.username ' \
+ 'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-' + time_range + ' days", "localtime") '\
+ 'GROUP BY ' + s + '.user ' \
+ 'ORDER BY total_plays DESC LIMIT 10'
result = myDB.select(query)
except:
logger.warn("Unable to open PlexWatch database.")
@@ -673,8 +676,9 @@ class PlexWatch(object):
for item in result:
thumb = self.get_user_gravatar_image(item[0])
row = {'user': item[0],
- 'total_plays': item[1],
- 'last_play': item[2],
+ 'friendly_name': item[1],
+ 'total_plays': item[2],
+ 'last_play': item[3],
'thumb': thumb['user_thumb']
}
top_users.append(row)
@@ -875,6 +879,24 @@ class PlexWatch(object):
'series': [series_1_output]}
return output
+ def set_user_friendly_name(self, user=None, friendly_name=None):
+ if user and friendly_name:
+ myDB = db.DBConnection()
+
+ control_value_dict = {"username": user}
+ new_value_dict = {"friendly_name": friendly_name}
+
+ myDB.upsert('plexpy_users', new_value_dict, control_value_dict)
+
+ def get_user_friendly_name(self, user=None):
+ if user:
+ myDB = db.DBConnection()
+
+ query = 'select friendly_name FROM plexpy_users WHERE username = "%s"' % user
+ result = myDB.select_single(query)
+
+ return result
+
# Taken from:
# https://stackoverflow.com/questions/18066269/group-by-and-aggregate-the-values-of-a-list-of-dictionaries-in-python
@staticmethod
diff --git a/plexpy/webserve.py b/plexpy/webserve.py
index d756dbeb..aee82594 100644
--- a/plexpy/webserve.py
+++ b/plexpy/webserve.py
@@ -99,7 +99,42 @@ class WebInterface(object):
@cherrypy.expose
def user(self, user=None):
- return serve_template(templatename="user.html", title="User", user=user)
+ try:
+ plex_watch = plexwatch.PlexWatch()
+ friendly_name = plex_watch.get_user_friendly_name(user)
+ except:
+ logger.warn("Unable to retrieve friendly name for user %s " % user)
+ friendly_name = user
+
+ return serve_template(templatename="user.html", title="User", user=user, friendly_name=friendly_name)
+
+ @cherrypy.expose
+ def edit_user(self, user=None, friendly_name=None, **kwargs):
+ if user and friendly_name:
+ try:
+ plex_watch = plexwatch.PlexWatch()
+ plex_watch.set_user_friendly_name(user, friendly_name)
+ status_message = "Successfully updated user."
+ return status_message
+ except:
+ status_message = "Failed to updated user."
+ return status_message
+ elif user and not friendly_name:
+ try:
+ plex_watch = plexwatch.PlexWatch()
+ result = {'user': user,
+ 'friendly_name': plex_watch.get_user_friendly_name(user)
+ }
+ status_message = ""
+ except:
+ result = {'user': user,
+ 'friendly_name': ''
+ }
+ status_message = "There was an error."
+
+ return serve_template(templatename="edit_user.html", title="Edit User", data=result, status_message=status_message)
+ else:
+ return serve_template(templatename="edit_user.html", title="Edit User", data=user, status_message='Unknown error.')
@cherrypy.expose
def get_stream_data(self, row_id=None, user=None, **kwargs):