Lots of changes which will break things!

You can no longer use your PlexWatch db with PlexPy, import tool is included though.
Removed the need for separate PlexWatch database.
Created PlexWatch import tool (settings -> Monitoring)
Lots of re-writes to most pages.
This commit is contained in:
Tim 2015-07-15 00:40:31 +02:00
parent 2eb7aff20a
commit 4cde833f9d
17 changed files with 1257 additions and 645 deletions

View file

@ -39,7 +39,7 @@
<!-- Nav tabs -->
<ul class="nav nav-pills" role="tablist">
<li role="presentation" class="active"><a href="#tabs-1" aria-controls="tabs-1" role="tab" data-toggle="tab">Web Interface</a></li>
<li role="presentation"><a href="#tabs-2" aria-controls="tabs-2" role="tab" data-toggle="tab">Plex & PlexWatch</a></li>
<li role="presentation"><a href="#tabs-2" aria-controls="tabs-2" role="tab" data-toggle="tab">Plex Settings</a></li>
<li role="presentation"><a href="#tabs-3" aria-controls="tabs-3" role="tab" data-toggle="tab">Monitoring</a></li>
<li role="presentation"><a href="#tabs-5" aria-controls="tabs-5" role="tab" data-toggle="tab">Notification Agents</a></li>
</ul>
@ -183,21 +183,9 @@
</div>
<div class="span4">
<div class="wellheader">
<h3>PlexWatch</h3>
<h3>Extra Settings</h3>
</div>
<fieldset>
<div class="form-group">
<label for="plexwatch_database">PlexWatch Database</label>
<input type="text" id="plexwatch_database" name="plexwatch_database" value="${config['plexwatch_database']}" size="30" data-parsley-trigger="change" required>
<p class="help-block">Full path and file name of your PlexWatch database.</p>
</div>
<div class="checkbox">
<input type="checkbox" id="grouping_global_history" name="grouping_global_history" value="1" ${config['grouping_global_history']}> Enable Grouping
<p class="help-block">Show grouped history data. <a target="_blank" href="https://github.com/ljunkie/plexWatch#list-watched-shows-option---nogrouping-vs-default">More info.</a></p>
</div>
<div class="wellheader">
<h3>Extra Settings</h3>
</div>
<div class="checkbox">
<input type="checkbox" id="pms_use_bif" name="pms_use_bif" value="1" ${config['pms_use_bif']}> Use BIF thumbs
<p class="help-block">If you have media indexing enabled on your server, use these on the activity pane.</p>
@ -221,7 +209,7 @@
</div>
<div role="tabpanel" class="tab-pane" id="tabs-3">
<div class="alert">History and IP logging are experimental features which shouldn't be enabled unless you are doing development on the project.</div>
<div class="alert">These features are currently experimental, please report any bugs on the Github project page <a href="https://www.github.com/drzoidberg33/plexpy/issues" target="_blank">Here</a></div>
<div class="wellbg" style="padding: 0px 0px 0px 20px;">
<div class="container-fluid">
<div class="row-fluid">
@ -251,6 +239,12 @@
<p class="help-block">Refresh the user list when PlexPy starts.</p>
</div>
</fieldset>
<div class="wellheader">
<h3>PlexWatch Import Tool</h3>
</div>
<fieldset>
<p class="help-block"><a href="#plexwatch-import-modal" id="toggle-plexwatch-import-modal" data-toggle="modal">Click here to Import an existing Plexwatch database.</a></p>
</fieldset>
</div>
<div class="span4">
<div class="wellheader">
@ -811,6 +805,9 @@
</div>
</div>
</div>
<div id="plexwatch-import-modal" class="modal hide fade" tabindex="-1" role="dialog"
aria-labelledby="plexwatch-import-modal" aria-hidden="true">
</div>
</div>
</div>
</%def>
@ -862,6 +859,18 @@
}
});
// Load PlexWatch import modal
$("#toggle-plexwatch-import-modal").click(function() {
$.ajax({
url: 'plexwatch_import',
cache: false,
async: true,
complete: function(xhr, status) {
$("#plexwatch-import-modal").html(xhr.responseText);
}
});
});
function openExtrasDialog() {
$("#dialog").dialog({ close: function(){
var elem = '<input type="button" data-success="Changes saved successfully">';

View file

@ -38,10 +38,12 @@ from plexpy import helpers
<th class="desktop" align='left' id="paused_counter">Paused</th>
<th class="desktop" align='left' id="stopped">Stopped</th>
<th class="desktop" align='left' id="duration">Duration</th>
<th class="desktop" align='left' id="percent_complete">Completed</th>
<th class="desktop" align='left' id="percent_complete"></th>
<th class="never" align='left' id="grandparent_rating_key">grandparentRatingKey</th>
<th class="never" align='left' id="rating_key">RatingKey</th>
<th class="never" align='left' id="xml"></th>
<th class="never" align='left' id="user"></th>
<th class="never" align='left' id="media_type"></th>
<th class="never" align='left' id="video_decision"></th>
</tr>
</thead>
<tbody>

View file

@ -1,81 +0,0 @@
<%inherit file="base.html"/>
<%!
from plexpy import helpers
%>
<%def name="headIncludes()">
<link rel="stylesheet" href="interfaces/default/css/plexwatch-tables.css">
<link rel="stylesheet" href="interfaces/default/css/dataTables.responsive.css">
</%def>
<%def name="body()">
<div class="container-fluid">
<div class="row-fluid">
<div class="span12">
<div class="wellheader-bg">
<div class="dashboard-wellheader-no-chevron">
<h2><i class="fa fa-history"></i> History</h2>
</div>
</div>
</div>
</div>
</div>
<div class='container-fluid'>
<div class='row-fluid'>
<div class='span12'>
<div class='table-card-back'>
<table class="display" id="history_table" width="100%">
<thead>
<tr>
<th class="never" align='left' id="id">ID</th>
<th class="all" align='left' id="time">Time</th>
<th class="all" align='left' id="friendly_name">User</th>
<th class="desktop" align='left' id="platform">Platform</th>
<th class="desktop" align='left' id="ip_address">IP Address</th>
<th class="min-tablet" align='left' id="title">Title</th>
<th class="min-tablet" align='left' id="started">Started</th>
<th class="desktop" align='left' id="paused_counter">Paused</th>
<th class="desktop" align='left' id="stopped">Stopped</th>
<th class="desktop" align='left' id="duration">Duration</th>
<th class="desktop" align='left' id="percent_complete"></th>
<th class="never" align='left' id="grandparent_rating_key">grandparentRatingKey</th>
<th class="never" align='left' id="rating_key">RatingKey</th>
<th class="never" align='left' id="user"></th>
<th class="never" align='left' id="media_type"></th>
<th class="never" align='left' id="video_decision"></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<div id="info-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="info-modal"
aria-hidden="true">
</div>
</div>
</div>
</div>
</div>
</div>
</%def>
<%def name="javascriptIncludes()">
<script src="interfaces/default/js/jquery.dataTables.min.js"></script>
<script src="interfaces/default/js/dataTables.responsive.js"></script>
<script src="interfaces/default/js/jquery.dataTables.bootstrap.pagination.integration.js"></script>
<script src="interfaces/default/js/moment-with-locale.js"></script>
<script src="interfaces/default/js/tables/history_table_new.js"></script>
<script>
$(document).ready(function() {
history_table_options.ajax = {
"url": "get_history_new"
}
history_table = $('#history_table').DataTable(history_table_options);
});
</script>
</%def>

View file

@ -183,10 +183,12 @@ from plexpy import helpers
<th class="desktop" align='left' id="paused_counter">Paused</th>
<th class="desktop" align='left' id="stopped">Stopped</th>
<th class="desktop" align='left' id="duration">Duration</th>
<th class="desktop" align='left' id="percent_complete">Completed</th>
<th class="never" align='left' id="rating_key">rating_key</th>
<th class="never" align='left' id="xml"></th>
<th class="desktop" align='left' id="percent_complete"></th>
<th class="never" align='left' id="grandparent_rating_key">grandparentRatingKey</th>
<th class="never" align='left' id="rating_key">RatingKey</th>
<th class="never" align='left' id="user"></th>
<th class="never" align='left' id="media_type"></th>
<th class="never" align='left' id="video_decision"></th>
</tr>
</thead>
<tbody>

View file

@ -68,7 +68,7 @@ history_table_options = {
"data":"platform",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== '') {
$(td).html('<a href="#info-modal" data-toggle="modal"><span data-toggle="tooltip" data-placement="left" title="Stream Info" id="stream-info" class="badge badge-inverse"><i class="fa fa-info"></i></span></a>&nbsp'+cellData);
$(td).html('<a href="#info-modal" data-toggle="modal"><span data-toggle="tooltip" data-placement="left" title="Stream Info" id="stream-info"><i class="fa fa-lg fa-info-circle"></i></span></a>&nbsp'+cellData);
}
},
"className": "modal-control no-wrap"
@ -89,7 +89,17 @@ history_table_options = {
"name":"title",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== '') {
$(td).html('<a href="info?rating_key=' + rowData['rating_key'] + '">' + cellData + '</a>');
if (rowData['media_type'] === 'movie' || rowData['media_type'] === 'episode') {
var transcode_dec = '';
if (rowData['video_decision'] === 'transcode') {
transcode_dec = '<i class="fa fa-server"></i>&nbsp';
}
$(td).html('<div><div style="float: left;"><a href="info?rating_key=' + rowData['rating_key'] + '">' + cellData + '</a></div><div style="float: right; text-align: right; padding-right: 5px;">' + transcode_dec + '<i class="fa fa-video-camera"></i></div></div>');
} else if (rowData['media_type'] === 'track') {
$(td).html('<div><div style="float: left;">' + cellData + '</div><div style="float: right; text-align: right; padding-right: 5px;"><i class="fa fa-music"></i></div></div>');
} else {
$(td).html('<a href="info?rating_key=' + rowData['rating_key'] + '">' + cellData + '</a>');
}
}
}
},
@ -140,36 +150,53 @@ history_table_options = {
{
"targets": [10],
"data":"percent_complete",
"orderable": false,
"render": function ( data, type, full ) {
if (data < 95) {
return '<span class="badge">'+Math.round(data)+'%</span>';
if (data > 80) {
return '<i class="fa fa-lg fa-circle"></i>'
//return '<span class="badge">'+Math.round(data)+'%</span>';
} else if (data > 40) {
return '<i class="fa fa-lg fa-adjust"></i>'
//return '<span class="badge">100%</span>';
} else {
return '<span class="badge">100%</span>';
return '<i class="fa fa-lg fa-circle-o"></i>'
}
},
"searchable": false,
"orderable": true,
"className": "no-wrap"
},
{
"targets": [11],
"data":"rating_key",
"data":"grandparent_rating_key",
"visible": false,
"searchable": false
},
{
"targets": [12],
"data":"xml",
"data":"rating_key",
"visible": false,
"searchable": false
},
{
"targets": [13],
"data":"media_type",
"searchable":false,
"visible":false
},
{
"targets": [13],
"targets": [14],
"data":"user",
"searchable":false,
"visible":false
},
{
"targets": [15],
"data":"video_decision",
"searchable":false,
"visible":false
}
],
"drawCallback": function (settings) {
// Jump to top of page

View file

@ -1,233 +0,0 @@
var date_format = 'YYYY-MM-DD hh:mm';
var time_format = 'hh:mm a';
$.ajax({
url: 'get_date_formats',
type: 'GET',
success: function(data) {
date_format = data.date_format;
time_format = data.time_format;
}
});
history_table_options = {
"destroy": true,
"responsive": {
details: false
},
"language": {
"search": "Search: ",
"lengthMenu":"Show _MENU_ entries per page",
"info":"Showing _START_ to _END_ of _TOTAL_ history items",
"infoEmpty":"Showing 0 to 0 of 0 entries",
"infoFiltered":"(filtered from _MAX_ total entries)",
"emptyTable": "No data in table",
},
"stateSave": false,
"sPaginationType": "bootstrap",
"processing": false,
"serverSide": true,
"pageLength": 25,
"order": [ 1, 'desc'],
"columnDefs": [
{
"targets": [0],
"data":"id",
"visible": false,
"searchable": false,
"className": "no-wrap"
},
{
"targets": [1],
"data":"date",
"createdCell": function (td, cellData, rowData, row, col) {
if (rowData['stopped'] === null) {
$(td).addClass('currentlyWatching');
$(td).html('Currently watching...');
} else {
$(td).html(moment(cellData,"X").format(date_format));
}
},
"searchable": false,
"className": "no-wrap"
},
{
"targets": [2],
"data":"friendly_name",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== '') {
$(td).html('<a href="user?user=' + rowData['user'] + '">' + cellData + '</a>');
} else {
$(td).html(cellData);
}
},
"className": "no-wrap"
},
{
"targets": [3],
"data":"platform",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== '') {
$(td).html('<a href="#info-modal" data-toggle="modal"><span data-toggle="tooltip" data-placement="left" title="Stream Info" id="stream-info"><i class="fa fa-lg fa-info-circle"></i></span></a>&nbsp'+cellData);
}
},
"className": "modal-control no-wrap"
},
{
"targets": [4],
"data":"ip_address",
"createdCell": function (td, cellData, rowData, row, col) {
if ((cellData == '') || (cellData == '0')) {
$(td).html('n/a');
}
},
"className": "no-wrap"
},
{
"targets": [5],
"data":"title",
"name":"title",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== '') {
if (rowData['media_type'] === 'movie' || rowData['media_type'] === 'episode') {
var transcode_dec = '';
if (rowData['video_decision'] === 'transcode') {
transcode_dec = '<i class="fa fa-server"></i>&nbsp';
}
$(td).html('<div><div style="float: left;"><a href="info?rating_key=' + rowData['rating_key'] + '">' + cellData + '</a></div><div style="float: right; text-align: right; padding-right: 5px;">' + transcode_dec + '<i class="fa fa-video-camera"></i></div></div>');
} else if (rowData['media_type'] === 'track') {
$(td).html('<div><div style="float: left;">' + cellData + '</div><div style="float: right; text-align: right; padding-right: 5px;"><i class="fa fa-music"></i></div></div>');
} else {
$(td).html('<a href="info?rating_key=' + rowData['rating_key'] + '">' + cellData + '</a>');
}
}
}
},
{
"targets": [6],
"data":"started",
"render": function ( data, type, full ) {
return moment(data, "X").format(time_format);
},
"searchable": false,
"className": "no-wrap"
},
{
"targets": [7],
"data":"paused_counter",
"render": function ( data, type, full ) {
return Math.round(moment.duration(data, 'seconds').as('minutes')) + ' mins';
},
"searchable": false,
"className": "no-wrap"
},
{
"targets": [8],
"data":"stopped",
"render": function ( data, type, full ) {
if (data !== null) {
return moment(data, "X").format(time_format);
} else {
return data;
}
},
"searchable": false,
"className": "no-wrap"
},
{
"targets": [9],
"data":"duration",
"render": function ( data, type, full ) {
if (data !== null) {
return Math.round(moment.duration(data, 'seconds').as('minutes')) + ' mins';
} else {
return data;
}
},
"searchable": false,
"className": "no-wrap"
},
{
"targets": [10],
"data":"percent_complete",
"render": function ( data, type, full ) {
if (data > 80) {
return '<i class="fa fa-lg fa-circle"></i>'
//return '<span class="badge">'+Math.round(data)+'%</span>';
} else if (data > 40) {
return '<i class="fa fa-lg fa-adjust"></i>'
//return '<span class="badge">100%</span>';
} else {
return '<i class="fa fa-lg fa-circle-o"></i>'
}
},
"searchable": false,
"orderable": true,
"className": "no-wrap"
},
{
"targets": [11],
"data":"grandparent_rating_key",
"visible": false,
"searchable": false
},
{
"targets": [12],
"data":"rating_key",
"visible": false,
"searchable": false
},
{
"targets": [13],
"data":"media_type",
"searchable":false,
"visible":false
},
{
"targets": [14],
"data":"user",
"searchable":false,
"visible":false
},
{
"targets": [15],
"data":"video_decision",
"searchable":false,
"visible":false
}
],
"drawCallback": function (settings) {
// Jump to top of page
// $('html,body').scrollTop(0);
$('#ajaxMsg').addClass('success').fadeOut();
},
"preDrawCallback": function(settings) {
$('#ajaxMsg').html("<div class='msg'><i class='fa fa-refresh fa-spin'></i>&nbspFetching rows...</div>");
$('#ajaxMsg').addClass('success').fadeIn();
}
}
$('#history_table').on('mouseenter', 'td.modal-control span', function () {
$(this).tooltip();
});
$('#history_table').on('click', 'td.modal-control', function () {
var tr = $(this).parents('tr');
var row = history_table.row( tr );
var rowData = row.data();
function showStreamDetails() {
$.ajax({
url: 'get_stream_data',
data: {row_id: rowData['id'], user: rowData['friendly_name']},
cache: false,
async: true,
complete: function(xhr, status) {
$("#info-modal").html(xhr.responseText);
}
});
}
showStreamDetails();
});

View file

@ -0,0 +1,50 @@
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
<h3>Import PlexWatch Database</h3>
</div>
<div class="modal-body" id="modal-text">
<div class="card-back">
<div class="form-group">
<label for="db_location">Database Location</label>
<input type="text" id="db_location" name="db_location" value="" size="30" required>
<p class="help-block">Enter the path and file name for the PlexWatch database you wish to import.</p>
</div>
<div class="form-group">
<label for="table_name">Table Name</label>
<select id="table_name" name="table_name">
<option value="processed">processed</option>
<option value="processed">grouped</option>
</select>
<p class="help-block">The table name from which you wish to import.</p>
</div>
<div class="form-group">
<label for="import_ignore_interval">Ignore Interval</label>
<input type="text" id="import_ignore_interval" name="import_ignore_interval" value="120" size="30" required>
<p class="help-block">Enter the minimum duration (in seconds) an item must have been active for. Set to 0 to import all.</p>
</div>
</div>
</div>
<div class="modal-footer">
<div>
<input type="button" id="import_db" class="btn btn-primary" value="Save">
<span id="status-message"></span>
</div>
</div>
<script>
// Send database path to import script
$("#import_db").click(function() {
var database_path = $("#db_location").val();
var table_name = $("#table_name").val();
var import_ignore_interval = $("#import_ignore_interval").val();
$.ajax({
url: 'get_plexwatch_export_data',
data: {database_path: database_path, table_name:table_name, import_ignore_interval:import_ignore_interval},
cache: false,
async: true,
success: function(data) {
$("#status-message").html(data);
$("#db_location").val('')
}
});
});
</script>

View file

@ -14,12 +14,12 @@ media_type Returns the type of session. Either 'episode' or 'mo
title Returns the name of the episode or movie.
user Returns the name of the user.
transcode_video_dec Returns the video transcode decision. Either 'transcode', 'copy' or 'direct play'.
transcode_video_codec Returns the name of the video codec for the stream.
transcode_height Returns the value of the video height for the stream.
transcode_width Returns the value of the video width for the stream.
transcode_video_codec Returns the name of the video codec for any transcode session.
transcode_height Returns the value of the video height for any transcode session.
transcode_width Returns the value of the video width for any transcode session.
transcode_audio_dec Returns the audio transcode decision. Either 'transcode', 'copy' or 'direct play'.
transcode_audio_codec Returns the name of the audio codec for the stream.
transcode_audio_channels Returns the number of audio channels for the stream.
transcode_audio_codec Returns the name of the audio codec for any transcode session.
transcode_audio_channels Returns the number of audio channels for any transcode session.
container Returns the type of container for the original media.
height Returns the value of the video height for the original media.
bitrate Returns the value of the video bitrate for the original media.
@ -50,17 +50,35 @@ DOCUMENTATION :: END
<h4>Stream Details</h4>
<ul>
<h5>Video</h5>
% if data['transcode_video_dec'] != 'direct play':
<li>Stream Type: <strong>${data['transcode_video_dec']}</strong></li>
<li>Video Resolution: <strong>${data['transcode_height']}p</strong></li>
<li>Video Codec: <strong>${data['transcode_video_codec']}</strong></li>
<li>Video Width: <strong>${data['transcode_width']}</strong></li>
<li>Video Height: <strong>${data['transcode_height']}</span></strong></li>
% else:
<li>Stream Type: <strong>${data['transcode_video_dec']}</strong></li>
% if data['video_resolution'] != 'sd':
<li>Video Resolution: <strong>${data['video_resolution']}p</strong></li>
% else:
<li>Video Resolution: <strong>${data['video_resolution']}</strong></li>
% endif
<li>Video Codec: <strong>${data['video_codec']}</strong></li>
<li>Video Width: <strong>${data['width']}</strong></li>
<li>Video Height: <strong>${data['height']}</span></strong></li>
% endif
</ul>
<ul>
<h5>Audio</h5>
% if data['transcode_audio_dec'] != 'direct play':
<li>Stream Type: <strong>${data['transcode_audio_dec']}</strong></li>
<li>Audio Codec: <strong>${data['transcode_audio_codec']}</strong></li>
<li>Audio Channels: <strong>${data['transcode_audio_channels']}</strong></li>
% else:
<li>Stream Type: <strong>${data['transcode_audio_dec']}</strong></li>
<li>Audio Codec: <strong>${data['audio_codec']}</strong></li>
<li>Audio Channels: <strong>${data['audio_channels']}</strong></li>
% endif
</ul>
</div>
<div class="span4">

View file

@ -185,17 +185,19 @@ from plexpy import helpers
<th class="never" align='left' id="id">ID</th>
<th class="all" align='left' id="time">Time</th>
<th class="never" align='left' id="friendly_name">User</th>
<th class="min-tablet" align='left' id="platform">Platform</th>
<th class="desktop" align='left' id="platform">Platform</th>
<th class="desktop" align='left' id="ip_address">IP Address</th>
<th class="min-tablet" align='left' id="title">Title</th>
<th class="desktop" align='left' id="started">Started</th>
<th class="min-tablet" align='left' id="started">Started</th>
<th class="desktop" align='left' id="paused_counter">Paused</th>
<th class="desktop" align='left' id="stopped">Stopped</th>
<th class="desktop" align='left' id="duration">Duration</th>
<th class="desktop" align='left' id="percent_complete">Completed</th>
<th class="desktop" align='left' id="percent_complete"></th>
<th class="never" align='left' id="grandparent_rating_key">grandparentRatingKey</th>
<th class="never" align='left' id="rating_key">RatingKey</th>
<th class="never" align='left' id="xml"></th>
<th class="never" align='left' id="user"></th>
<th class="never" align='left' id="media_type"></th>
<th class="never" align='left' id="video_decision"></th>
</tr>
</thead>
<tbody>

View file

@ -1,69 +0,0 @@
<%inherit file="base.html"/>
<%!
from plexpy import helpers
%>
<%def name="headIncludes()">
<link rel="stylesheet" href="interfaces/default/css/plexwatch-tables.css">
<link rel="stylesheet" href="interfaces/default/css/dataTables.responsive.css">
</%def>
<%def name="body()">
<div class="container-fluid">
<div class="row-fluid">
<div class="span12">
<div class="wellheader-bg">
<div class="dashboard-wellheader-no-chevron">
<div class="span9"><h2><i class="fa fa-group"></i> Active Users</h2></div>
<div class="span3">
<div class="pull-right">
<h5><a href="refresh_users_list"><i class="fa fa-refresh"></i> Refresh users</a></h5>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class='container-fluid'>
<div class='row-fluid'>
<div class='span12'>
<div class='table-card-back'>
<table id="users_list_table" class="display" width="100%">
<thead>
<tr>
<th class="all" align="right" id="avatar"></th>
<th class="all" align="left" id="friendly_name">User</th>
<th class="min-tablet" align="left" id="last_seen">Last Seen</th>
<th class="min-tablet" align="left" id="last_known_ip">Last Known IP</th>
<th class="min-tablet" align="left" id="total_plays">Total Plays</th>
<th class="never" align="left" id="user"></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<footer></footer>
</div>
</%def>
<%def name="javascriptIncludes()">
<script src="interfaces/default/js/jquery.dataTables.min.js"></script>
<script src="interfaces/default/js/dataTables.responsive.js"></script>
<script src="interfaces/default/js/jquery.dataTables.bootstrap.pagination.integration.js"></script>
<script src="interfaces/default/js/moment-with-locale.js"></script>
<script src="interfaces/default/js/tables/users.js"></script>
<script>
users_list_table_options.ajax = {
"url": "get_user_list_new"
}
var users_list_table = $('#users_list_table').DataTable(users_list_table_options);
</script>
</%def>