mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-07 05:31:15 -07:00
Fix header on user IP modal
Return more user data to the info screen. Some other backend changes
This commit is contained in:
parent
2d822c8468
commit
4830cc7d68
6 changed files with 63 additions and 32 deletions
|
@ -94,7 +94,7 @@ $('#user_ip_table').on('click', 'td.modal-control', function () {
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
$('#ip_address').html(ip_address);
|
$('#modal_header_ip_address').html(ip_address);
|
||||||
$('#country').html(data.country);
|
$('#country').html(data.country);
|
||||||
$('#city').html(data.city);
|
$('#city').html(data.city);
|
||||||
$('#region').html(data.regionName);
|
$('#region').html(data.regionName);
|
||||||
|
|
|
@ -5,12 +5,18 @@ For Mako templating syntax documentation please visit: http://docs.makotemplates
|
||||||
|
|
||||||
Filename: user.html
|
Filename: user.html
|
||||||
Version: 0.1
|
Version: 0.1
|
||||||
Variable names: user [string]
|
Variable names: data [list]
|
||||||
|
|
||||||
user :: Usable parameters
|
data :: Usable parameters
|
||||||
|
|
||||||
user Returns the name of the user.
|
user_id Returns the user id of the user.
|
||||||
|
username Returns the user's username.
|
||||||
friendly_name Returns the friendly name of the user.
|
friendly_name Returns the friendly name of the user.
|
||||||
|
email Returns the user's email address.
|
||||||
|
thumb Returns the thumbnail for the user.
|
||||||
|
is_home_user Returns bool value for whether the user is part of a Plex Home.
|
||||||
|
is_allow_sync Returns bool value for whether the user has sync rights.
|
||||||
|
is_restricted Returns bool value for whether the user account is restricted.
|
||||||
|
|
||||||
DOCUMENTATION :: END
|
DOCUMENTATION :: END
|
||||||
|
|
||||||
|
@ -33,10 +39,10 @@ from plexpy import helpers
|
||||||
<div class="span12">
|
<div class="span12">
|
||||||
<div class="user-info-wrapper">
|
<div class="user-info-wrapper">
|
||||||
<div class="user-info-poster-face" id="user-gravatar">
|
<div class="user-info-poster-face" id="user-gravatar">
|
||||||
<img src="interfaces/default/images/gravatar-default-80x80.png">
|
<img src="${data['thumb']}" height="80px" width="80px">
|
||||||
</div>
|
</div>
|
||||||
<div class="user-info-username">
|
<div class="user-info-username">
|
||||||
<span class="set-username">${friendly_name}</span> <a href="#edit-user-modal" data-toggle="modal" id="toggle-edit-user-modal"><i class="fa fa-pencil"></i></a>
|
<span class="set-username">${data['friendly_name']}</span> <a href="#edit-user-modal" data-toggle="modal" id="toggle-edit-user-modal"><i class="fa fa-pencil"></i></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="user-info-nav">
|
<div class="user-info-nav">
|
||||||
<ul class="user-info-nav">
|
<ul class="user-info-nav">
|
||||||
|
@ -112,7 +118,7 @@ from plexpy import helpers
|
||||||
<div class="span12">
|
<div class="span12">
|
||||||
<div class="table-card-back">
|
<div class="table-card-back">
|
||||||
<h3>IP Addresses for <strong>
|
<h3>IP Addresses for <strong>
|
||||||
<span class="set-username">${friendly_name}</span>
|
<span class="set-username">${data['friendly_name']}</span>
|
||||||
</strong></h3>
|
</strong></h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="table-card-back">
|
<div class="table-card-back">
|
||||||
|
@ -168,7 +174,7 @@ from plexpy import helpers
|
||||||
<div class="span12">
|
<div class="span12">
|
||||||
<div class="table-card-back">
|
<div class="table-card-back">
|
||||||
<h3>Watch History for <strong>
|
<h3>Watch History for <strong>
|
||||||
<span class="set-username">${friendly_name}</span>
|
<span class="set-username">${data['friendly_name']}</span>
|
||||||
</strong></h3>
|
</strong></h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="table-card-back">
|
<div class="table-card-back">
|
||||||
|
@ -220,7 +226,7 @@ from plexpy import helpers
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: 'get_user_watch_time_stats',
|
url: 'get_user_watch_time_stats',
|
||||||
async: true,
|
async: true,
|
||||||
data: { user: '${user}' },
|
data: { user: '${data['username']}' },
|
||||||
complete: function(xhr, status) {
|
complete: function(xhr, status) {
|
||||||
$("#user-time-stats").html(xhr.responseText);
|
$("#user-time-stats").html(xhr.responseText);
|
||||||
}
|
}
|
||||||
|
@ -230,7 +236,7 @@ from plexpy import helpers
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: 'get_user_platform_stats',
|
url: 'get_user_platform_stats',
|
||||||
async: true,
|
async: true,
|
||||||
data: { user: '${user}' },
|
data: { user: '${data['username']}' },
|
||||||
complete: function(xhr, status) {
|
complete: function(xhr, status) {
|
||||||
$("#user-platform-stats").html(xhr.responseText);
|
$("#user-platform-stats").html(xhr.responseText);
|
||||||
}
|
}
|
||||||
|
@ -240,7 +246,7 @@ from plexpy import helpers
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: 'get_user_recently_watched',
|
url: 'get_user_recently_watched',
|
||||||
async: true,
|
async: true,
|
||||||
data: { user: '${user}' },
|
data: { user: '${data['username']}' },
|
||||||
complete: function(xhr, status) {
|
complete: function(xhr, status) {
|
||||||
$("#user-recently-watched").html(xhr.responseText);
|
$("#user-recently-watched").html(xhr.responseText);
|
||||||
}
|
}
|
||||||
|
@ -251,7 +257,7 @@ from plexpy import helpers
|
||||||
history_table_options.ajax = {
|
history_table_options.ajax = {
|
||||||
"url": "get_history",
|
"url": "get_history",
|
||||||
"data": function(d) {
|
"data": function(d) {
|
||||||
d.user = "${user}";
|
d.user = "${data['username']}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
history_table = $('#history_table').DataTable(history_table_options);
|
history_table = $('#history_table').DataTable(history_table_options);
|
||||||
|
@ -263,30 +269,17 @@ from plexpy import helpers
|
||||||
user_ip_table_options.ajax = {
|
user_ip_table_options.ajax = {
|
||||||
"url": "get_user_ips",
|
"url": "get_user_ips",
|
||||||
"data": function(d) {
|
"data": function(d) {
|
||||||
d.user = "${user}";
|
d.user = "${data['username']}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
user_ip_table = $('#user_ip_table').DataTable(user_ip_table_options);
|
user_ip_table = $('#user_ip_table').DataTable(user_ip_table_options);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Load user gravatar image
|
|
||||||
$.ajax({
|
|
||||||
url: 'get_user_gravatar_image',
|
|
||||||
async: true,
|
|
||||||
data: { user: '${user}' },
|
|
||||||
success: function(data) {
|
|
||||||
if (data.user_thumb !== '') {
|
|
||||||
thumb = data.user_thumb;
|
|
||||||
$('#user-gravatar').html('<img src="' + thumb + '">');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Load edit user modal
|
// Load edit user modal
|
||||||
$("#toggle-edit-user-modal").click(function() {
|
$("#toggle-edit-user-modal").click(function() {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: 'edit_user',
|
url: 'edit_user',
|
||||||
data: {user: '${user}'},
|
data: {user: '${data['username']}'},
|
||||||
cache: false,
|
cache: false,
|
||||||
async: true,
|
async: true,
|
||||||
complete: function(xhr, status) {
|
complete: function(xhr, status) {
|
||||||
|
|
|
@ -14,7 +14,7 @@ from plexpy import helpers
|
||||||
<div class="span12">
|
<div class="span12">
|
||||||
<div class="wellheader-bg">
|
<div class="wellheader-bg">
|
||||||
<div class="dashboard-wellheader-no-chevron">
|
<div class="dashboard-wellheader-no-chevron">
|
||||||
<div class="span9"><h2><i class="fa fa-group"></i> Users</h2></div>
|
<div class="span9"><h2><i class="fa fa-group"></i> Active Users</h2></div>
|
||||||
<div class="span3">
|
<div class="span3">
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
<h5><a href="refresh_users_list"><i class="fa fa-refresh"></i> Refresh users</a></h5>
|
<h5><a href="refresh_users_list"><i class="fa fa-refresh"></i> Refresh users</a></h5>
|
||||||
|
|
|
@ -59,6 +59,8 @@ class DataTables(object):
|
||||||
if join_type:
|
if join_type:
|
||||||
if join_type.upper() == 'LEFT OUTER JOIN':
|
if join_type.upper() == 'LEFT OUTER JOIN':
|
||||||
join = 'LEFT OUTER JOIN %s ON %s = %s' % (join_table, join_evals[0], join_evals[1])
|
join = 'LEFT OUTER JOIN %s ON %s = %s' % (join_table, join_evals[0], join_evals[1])
|
||||||
|
elif join_type.upper() == 'JOIN' or join_type.upper() == 'INNER JOIN':
|
||||||
|
join = 'INNER JOIN %s ON %s = %s' % (join_table, join_evals[0], join_evals[1])
|
||||||
else:
|
else:
|
||||||
join = ''
|
join = ''
|
||||||
|
|
||||||
|
|
|
@ -697,7 +697,7 @@ class PlexWatch(object):
|
||||||
s = self.get_history_table_name()
|
s = self.get_history_table_name()
|
||||||
query = 'SELECT user, ' \
|
query = 'SELECT user, ' \
|
||||||
'(case when friendly_name is null then user else friendly_name end) as friendly_name,' \
|
'(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 ' \
|
'COUNT(' + s + '.id) as total_plays, MAX(time) as last_watch, thumb ' \
|
||||||
'FROM ' + s + ' ' \
|
'FROM ' + s + ' ' \
|
||||||
'LEFT OUTER JOIN plexpy_users ON ' + s + '.user = plexpy_users.username ' \
|
'LEFT OUTER JOIN plexpy_users ON ' + s + '.user = plexpy_users.username ' \
|
||||||
'WHERE datetime(stopped, "unixepoch", "localtime") >= ' \
|
'WHERE datetime(stopped, "unixepoch", "localtime") >= ' \
|
||||||
|
@ -710,12 +710,17 @@ class PlexWatch(object):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
for item in result:
|
for item in result:
|
||||||
|
if not item['thumb']:
|
||||||
|
user_thumb = 'interfaces/default/images/gravatar-default-80x80.png'
|
||||||
|
else:
|
||||||
|
user_thumb = item[4]
|
||||||
|
|
||||||
thumb = self.get_user_gravatar_image(item[0])
|
thumb = self.get_user_gravatar_image(item[0])
|
||||||
row = {'user': item[0],
|
row = {'user': item[0],
|
||||||
'friendly_name': item[1],
|
'friendly_name': item[1],
|
||||||
'total_plays': item[2],
|
'total_plays': item[2],
|
||||||
'last_play': item[3],
|
'last_play': item[3],
|
||||||
'thumb': thumb['user_thumb']
|
'thumb': user_thumb
|
||||||
}
|
}
|
||||||
top_users.append(row)
|
top_users.append(row)
|
||||||
|
|
||||||
|
@ -940,6 +945,37 @@ class PlexWatch(object):
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def get_user_details(self, user=None, user_id=None):
|
||||||
|
if user:
|
||||||
|
try:
|
||||||
|
myDB = db.DBConnection()
|
||||||
|
query = 'select user_id, username, friendly_name, email, thumb, ' \
|
||||||
|
'is_home_user, is_allow_sync, is_restricted FROM plexpy_users WHERE username = ? LIMIT 1'
|
||||||
|
result = myDB.select(query, args=[user])
|
||||||
|
if result:
|
||||||
|
for item in result:
|
||||||
|
if not item['friendly_name']:
|
||||||
|
friendly_name = item['username']
|
||||||
|
else:
|
||||||
|
friendly_name = item['friendly_name']
|
||||||
|
|
||||||
|
user_details = {"user_id": item['user_id'],
|
||||||
|
"username": item['username'],
|
||||||
|
"friendly_name": friendly_name,
|
||||||
|
"email": item['email'],
|
||||||
|
"thumb": item['thumb'],
|
||||||
|
"is_home_user": item['is_home_user'],
|
||||||
|
"is_allow_sync": item['is_allow_sync'],
|
||||||
|
"is_restricted": item['is_restricted']
|
||||||
|
}
|
||||||
|
return user_details
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
except:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
# Taken from:
|
# Taken from:
|
||||||
# https://stackoverflow.com/questions/18066269/group-by-and-aggregate-the-values-of-a-list-of-dictionaries-in-python
|
# https://stackoverflow.com/questions/18066269/group-by-and-aggregate-the-values-of-a-list-of-dictionaries-in-python
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
|
@ -101,12 +101,12 @@ class WebInterface(object):
|
||||||
def user(self, user=None):
|
def user(self, user=None):
|
||||||
try:
|
try:
|
||||||
plex_watch = plexwatch.PlexWatch()
|
plex_watch = plexwatch.PlexWatch()
|
||||||
friendly_name = plex_watch.get_user_friendly_name(user)
|
user_details = plex_watch.get_user_details(user)
|
||||||
except:
|
except:
|
||||||
logger.warn("Unable to retrieve friendly name for user %s " % user)
|
logger.warn("Unable to retrieve friendly name for user %s " % user)
|
||||||
friendly_name = user
|
friendly_name = user
|
||||||
|
|
||||||
return serve_template(templatename="user.html", title="User", user=user, friendly_name=friendly_name)
|
return serve_template(templatename="user.html", title="User", data=user_details)
|
||||||
|
|
||||||
@cherrypy.expose
|
@cherrypy.expose
|
||||||
def edit_user(self, user=None, friendly_name=None, **kwargs):
|
def edit_user(self, user=None, friendly_name=None, **kwargs):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue