Merge pull request #6 from sartography/dashboard

Dashboard
This commit is contained in:
Dan Funk 2021-01-19 16:56:48 -05:00 committed by GitHub
commit b09b353172
6 changed files with 210 additions and 576 deletions

View File

@ -233,8 +233,10 @@ def index():
table = SampleTable(group_columns(filtered_samples[(page - 1) * 10:((page - 1) * 10) + 10]))
return render_template('layouts/default.html',
base_href=BASE_HREF,
content=render_template(
base_href=BASE_HREF,
dates = important_dates,
overall_totals_data = overall_totals_data,
content=render_template(
'pages/index.html',
form = form,
dates = important_dates,
@ -247,7 +249,8 @@ def index():
daily_charts_data = daily_charts_data,
hourly_charts_data = hourly_charts_data,
weekday_charts_data = weekday_charts_data,
overall_totals_data = overall_totals_data,
location_stats_data = location_stats_data,
))

View File

@ -161,7 +161,7 @@ class GraphService(object):
self.filters["station"] = Sample.station.in_(
filters["station"].split())
if "compute_id" in filters:
self.filters["compute_id"] = Sample.computing_id.in_(
self.filters["compute_id"] = func.lower(Sample.computing_id).in_(
filters["compute_id"].split())
if "start_date" in filters:
self.filters["start_date"] = Sample.date >= filters["start_date"]

View File

@ -22,17 +22,17 @@
<!-- Navigation -->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="/">
<a class="nav-link" href="{{base_href | safe}}/">
<em class="ni ni-tv-2 text-primary"></em> Dashboard
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/imported_files">
<a class="nav-link" href="{{base_href| safe}}/imported_files">
<em class="ni ni-tv-2 text-primary"></em> Imported Files
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/inventory">
<a class="nav-link" href="{{base_href| safe}}/inventory">
<em class="ni ni-tv-2 text-primary"></em> Manage Inventory
</a>
</li>

View File

@ -1,143 +1,143 @@
<!-- Header -->
<script src="{{url_for('static', filename='assets/js/graph.js')}}"></script>
<!-- Header -->
<script src="{{url_for('static', filename='assets/js/graph.js')}}"></script>
<!-- Page content -->
<div class="container-fluid mt--7">
<div class="row">
<div class="col-xl-8 mb-4 mb-xl-0">
<div class="card bg-gradient-default shadow">
<div class="card-header bg-transparent">
<div class="row align-items-center">
<div class="col">
<h6 class="text-uppercase text-light ls-1 mb-1">Overview</h6>
<h2 id="chart-title" class="text-white mb-0">Location Activity</h2>
</div>
</div>
</div>
<div class="card-body">
<!-- Chart -->
<div class="chart">
<canvas id="data-chart" class="chart-canvas"></canvas>
<!-- Page content -->
<div class="container-fluid mt--7">
<div class="row">
<div class="col-xl-8 mb-4 mb-xl-0">
<div class="card bg-gradient-default shadow">
<div class="card-header bg-transparent">
<div class="row align-items-center">
<div class="col">
<h6 class="text-uppercase text-light ls-1 mb-1">Overview</h6>
<h2 id="chart-title" class="text-white mb-0">Location Activity</h2>
</div>
</div>
</div>
</div>
<div class="col-xl-4 mb-xl-0">
<div class="card shadow">
<form action="{{ action }}" method="post" id="pageForm">
{{ form.csrf_token() }}
<div class="card-header border-0">
<div class="row align-items-center">
<div class="col text-right mr-2">
<button class="btn btn-sm btn-primary"
onclick="$('input[name=\'dateRange\']').val(getToday()+ ' - ' +getToday());submitform();">Search Today</button>
</div>
<div class="col text-right mr-2">
<button class="btn btn-sm btn-primary"
onclick="$('input[name=\'dateRange\']').val('10/05/2020 - ' + getToday());submitform();">Search All</button>
</div>
<div class="col text-right mr-2">
<button type="submit" class="btn btn-sm btn-primary">Run Search</button>
</div>
</div>
</div>
<div class="table-responsive">
<!-- Projects table -->
<table class="table align-items-center table-flush">
<tbody>
<input type="hidden" name="currently_showing" />
{% for field in form if field.name != "csrf_token" %}
<tr>
<div class="card-body">
<div class="form-field {{ field.widget.input_type }}">
<td>
<div class="form-field-label">{{ field.label() }}:</div>
</td>
<td>
{% if field.name == "dateRange" %}
<input type="text" name="{{field.name}}" />
{%else%}
<div class="form-field-input">{{ field }}</div>
{% for error in field.errors %}
<div class="form-field-error">{{ error }}</div>
{% endfor %}
{% endif %}
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</form>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col mb-5 mb-xl-0">
<div class="card shadow">
<div class="card-header border-0">
<div class="row align-items-center">
<div class="col">
<h3 class="mb-0">Additional Stats:</h3>
</div>
</div>
</div>
<div class="card-body row">
<div class="chart col">
<canvas id="week-chart" class="chart-canvas"></canvas>
</div>
<div class="chart col">
<canvas id="time-chart" class="chart-canvas"></canvas>
</div>
<!-- Chart -->
<div class="chart">
<canvas id="data-chart" class="chart-canvas"></canvas>
</div>
</div>
</div>
</div>
<div class="col-xl-4 mb-xl-0">
<div class="card shadow">
<div class="row mt-4">
<div class="col mb-5 mb-xl-0">
<div class="card shadow">
<form action="{{ action }}" method="post" id="pageForm">
{{ form.csrf_token() }}
<div class="card-header border-0">
<div class="row align-items-center">
<div class="col">
<h3 class="mb-0">Records to be processed</h3>{{pagination.info}}
</div>
<div class="col text-right">
<a href="{{ url_for('index') }}?download=true" class="btn btn-sm btn-primary">Download all</a>
<div class="card-header border-0">
<div class="row align-items-center">
<div class="col">
<h3 class="mb-0">Search</h3>
</div>
</div>
</div>
<button class="btn btn-sm btn-primary"
onclick="$('input[name=\'dateRange\']').val(getToday()+ ' - ' +getToday());submitform();">Today</button>
<button class="btn btn-sm btn-primary"
onclick="$('input[name=\'dateRange\']').val('10/05/2020 - ' + getToday());submitform();">All</button>
<button type="submit" class="btn btn-sm btn-primary">Run</button>
</div>
</div>
<div class="table-responsive">
<!-- Projects table -->
{{ table }}
<table class="table align-items-center table-flush">
<tbody>
<input type="hidden" name="currently_showing" />
{% for field in form if field.name != "csrf_token" %}
<tr>
<div class="form-field {{ field.widget.input_type }}">
<td>
<div class="form-field-label">{{ field.label() }}:</div>
</td>
<td>
{% if field.name == "dateRange" %}
<input type="text" name="{{field.name}}" />
{%else%}
<div class="form-field-input">{{ field }}</div>
{% for error in field.errors %}
<div class="form-field-error">{{ error }}</div>
{% endfor %}
{% endif %}
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="row justify-content-center">
{{ pagination.links }}
</form>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col mb-5 mb-xl-0">
<div class="card shadow">
<div class="card-header border-0">
<div class="row align-items-center">
<div class="col">
<h3 class="mb-0">Additional Stats:</h3>
</div>
</div>
</div>
<div class="card-body row">
<div class="chart col">
<canvas id="week-chart" class="chart-canvas"></canvas>
</div>
<div class="chart col">
<canvas id="time-chart" class="chart-canvas"></canvas>
</div>
</div>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col mb-5 mb-xl-0">
<div class="card shadow">
<div class="card-header border-0">
<div class="row align-items-center">
<div class="col">
<h3 class="mb-0">Records to be processed</h3>{{pagination.info}}
</div>
<div class="col text-right">
<a href="{{ url_for('index') }}?download=true" class="btn btn-sm btn-primary">Download all</a>
</div>
</div>
</div>
<div class="table-responsive">
<!-- Projects table -->
{{ table }}
</div>
<div class="row justify-content-center">
{{ pagination.links }}
</div>
</div>
</div>
</div>
</div>
</form>
<script>
function random_rgba() {
var o = Math.round, r = Math.random, s = 255;
return 'rgba(' + o(r() * s) + ',' + o(r() * s) + ',' + o(r() * s) + ',1)';
}
var color_idx = 1;
var colors = {};
function getColor(key) {
@ -188,6 +188,20 @@
align: 'end'
}
var stacked_bar_scale = {
xAxes: [{
ticks: {
beginAtZero: true
},
stacked: true
}],
yAxes: [{
ticks: {
beginAtZero: true
},
stacked: true
}]
};
function getToday() {
var today = new Date();
var dd = String(today.getDate()).padStart(2, '0');
@ -198,7 +212,7 @@
return today
}
/////////////////////////////
var overall_charts = {};
overall_charts.daily = dict2datasets(JSON.parse('{{overall_chart_data.daily | tojson }}'));
overall_charts.hourly = dict2datasets(JSON.parse('{{overall_chart_data.hourly | tojson }}'));
@ -231,7 +245,7 @@
var per_weekday = new Chart(document.getElementById('week-chart').getContext('2d'), {
type: 'horizontalBar',
data: {
labels: ["Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
labels: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday","Sunday"],
datasets: overall_charts.weekday
},
options: {
@ -240,31 +254,28 @@
legend: {
display: false
},
scales: {
xAxes: [{ stacked: true }],
yAxes: [{
ticks: {
beginAtZero: true
},
stacked: true
}]
},
scales: stacked_bar_scale,
title: {
display: true,
text: 'Average Count By Weekday For {{dates.search}}'
},
plugins: {
datalabels: stacked_sum_labels
},layout: {
padding: {
left: 0,
right: 50,
top: 0,
bottom: 0
}}
}, layout: {
padding: {
left: 0,
right: 50,
top: 0,
bottom: 0
}
}
}
});
per_weekday.options.plugins.datalabels.color = "black";
per_weekday.update();
var per_hour = new Chart(document.getElementById('time-chart').getContext('2d'), {
type: 'horizontalBar',
@ -275,33 +286,27 @@
options: {
responsive: true,
maintainAspectRatio: false,
scales: stacked_bar_scale,
legend: {
display: false
},
scales: {
xAxes: [{ stacked: true }],
yAxes: [{
ticks: {
beginAtZero: true
},
stacked: true
}]
},
title: {
display: true,
text: 'Average Count By Hour For {{dates.search}}'
},
plugins: {
datalabels: stacked_sum_labels
},layout: {
padding: {
left: 0,
right: 50,
top: 0,
bottom: 0
}}
}, layout: {
padding: {
left: 0,
right: 50,
top: 0,
bottom: 0
}
}
}
});
per_hour.options.plugins.datalabels.color = "black";
per_hour.update();
var per_location = new Chart(document.getElementById('data-chart').getContext('2d'), {
// The type of chart we want to create
@ -310,23 +315,14 @@
datasets: overall_charts.daily,
labels: JSON.parse('{{chart_ticks | tojson }}')
},
// Configuration options go here
options: {
responsive: true,
maintainAspectRatio: false,
scales: stacked_bar_scale,
title: {
display: false,
},
scales: {
xAxes: [{ stacked: true }],
yAxes: [{
ticks: {
beginAtZero: true
},
stacked: true
}]
},
legend: {
display: true,
position: "right",
@ -341,16 +337,18 @@
},
plugins: {
datalabels: stacked_sum_labels
},layout: {
padding: {
left: 0,
right: 0,
top: 20,
bottom: 0
}}
}, layout: {
padding: {
left: 0,
right: 0,
top: 20,
bottom: 0
}
}
}
});
per_location.options.plugins.datalabels.color = "white";
per_location.update();
function station_legend(e, legendItem) {
showLocation("");
};
@ -399,6 +397,18 @@
$(function () {
$('input[name="dateRange"]').daterangepicker({
opens: 'left',
locale: {
"daysOfWeek": [
"Mo",
"Tu",
"We",
"Th",
"Fr",
"Sa",
"Su"
],
}
});
});
$('input[name="dateRange"]').val('{{dates.search}}');

View File

@ -1,400 +0,0 @@
<!-- Main content -->
<div class="main-content">
<!-- Header -->
<!-- Top navbar -->
<nav class="navbar navbar-top navbar-expand-md navbar-dark" id="navbar-main">
<div class="container-fluid">
<!-- Brand -->
<a class="h4 mb-0 text-white text-uppercase d-none d-lg-inline-block" href="./index.html">UVA Communicator
Dashboard</a>
</div>
</nav>
<div class="container-fluid mt--6">
<div class="row">
<div class="col">
<div class="card">
<!-- Card header -->
<div class="card-header border-0">
<h3 class="mb-0">Light table</h3>
</div>
<!-- Light table -->
<div class="table-responsive">
<table class="table align-items-center table-flush">
<thead class="thead-light">
<tr>
<th scope="col" class="sort" data-sort="name">Project</th>
<th scope="col" class="sort" data-sort="budget">Budget</th>
<th scope="col" class="sort" data-sort="status">Status</th>
<th scope="col">Users</th>
<th scope="col" class="sort" data-sort="completion">Completion</th>
<th scope="col"></th>
</tr>
</thead>
<tbody class="list">
<tr>
<th scope="row">
<div class="media align-items-center">
<a href="#" class="avatar rounded-circle mr-3">
<img alt="Image placeholder"
src="/static/assets/img/theme/bootstrap.jpg">
</a>
<div class="media-body">
<span class="name mb-0 text-sm">Argon Design System</span>
</div>
</div>
</th>
<td class="budget">
$2500 USD
</td>
<td>
<span class="badge badge-dot mr-4">
<i class="bg-warning"></i>
<span class="status">pending</span>
</span>
</td>
<td>
<div class="avatar-group">
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Ryan Tompson">
<img alt="Image placeholder" src="/static/assets/img/theme/team-1.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Romina Hadid">
<img alt="Image placeholder" src="/static/assets/img/theme/team-2.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Alexander Smith">
<img alt="Image placeholder" src="/static/assets/img/theme/team-3.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Jessica Doe">
<img alt="Image placeholder" src="/static/assets/img/theme/team-4.jpg">
</a>
</div>
</td>
<td>
<div class="d-flex align-items-center">
<span class="completion mr-2">60%</span>
<div>
<div class="progress">
<div class="progress-bar bg-warning" role="progressbar"
aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"
style="width: 60%;"></div>
</div>
</div>
</div>
</td>
<td class="text-right">
<div class="dropdown">
<a class="btn btn-sm btn-icon-only text-light" href="#" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v"></i>
</a>
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</div>
</td>
</tr>
<tr>
<th scope="row">
<div class="media align-items-center">
<a href="#" class="avatar rounded-circle mr-3">
<img alt="Image placeholder" src="/static/assets/img/theme/angular.jpg">
</a>
<div class="media-body">
<span class="name mb-0 text-sm">Angular Now UI Kit PRO</span>
</div>
</div>
</th>
<td class="budget">
$1800 USD
</td>
<td>
<span class="badge badge-dot mr-4">
<i class="bg-success"></i>
<span class="status">completed</span>
</span>
</td>
<td>
<div class="avatar-group">
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Ryan Tompson">
<img alt="Image placeholder" src="/static/assets/img/theme/team-1.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Romina Hadid">
<img alt="Image placeholder" src="/static/assets/img/theme/team-2.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Alexander Smith">
<img alt="Image placeholder" src="/static/assets/img/theme/team-3.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Jessica Doe">
<img alt="Image placeholder" src="/static/assets/img/theme/team-4.jpg">
</a>
</div>
</td>
<td>
<div class="d-flex align-items-center">
<span class="completion mr-2">100%</span>
<div>
<div class="progress">
<div class="progress-bar bg-success" role="progressbar"
aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"
style="width: 100%;"></div>
</div>
</div>
</div>
</td>
<td class="text-right">
<div class="dropdown">
<a class="btn btn-sm btn-icon-only text-light" href="#" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v"></i>
</a>
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</div>
</td>
</tr>
<tr>
<th scope="row">
<div class="media align-items-center">
<a href="#" class="avatar rounded-circle mr-3">
<img alt="Image placeholder" src="/static/assets/img/theme/sketch.jpg">
</a>
<div class="media-body">
<span class="name mb-0 text-sm">Black Dashboard</span>
</div>
</div>
</th>
<td class="budget">
$3150 USD
</td>
<td>
<span class="badge badge-dot mr-4">
<i class="bg-danger"></i>
<span class="status">delayed</span>
</span>
</td>
<td>
<div class="avatar-group">
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Ryan Tompson">
<img alt="Image placeholder" src="/static/assets/img/theme/team-1.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Romina Hadid">
<img alt="Image placeholder" src="/static/assets/img/theme/team-2.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Alexander Smith">
<img alt="Image placeholder" src="/static/assets/img/theme/team-3.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Jessica Doe">
<img alt="Image placeholder" src="/static/assets/img/theme/team-4.jpg">
</a>
</div>
</td>
<td>
<div class="d-flex align-items-center">
<span class="completion mr-2">72%</span>
<div>
<div class="progress">
<div class="progress-bar bg-danger" role="progressbar"
aria-valuenow="72" aria-valuemin="0" aria-valuemax="100"
style="width: 72%;"></div>
</div>
</div>
</div>
</td>
<td class="text-right">
<div class="dropdown">
<a class="btn btn-sm btn-icon-only text-light" href="#" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v"></i>
</a>
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</div>
</td>
</tr>
<tr>
<th scope="row">
<div class="media align-items-center">
<a href="#" class="avatar rounded-circle mr-3">
<img alt="Image placeholder" src="/static/assets/img/theme/react.jpg">
</a>
<div class="media-body">
<span class="name mb-0 text-sm">React Material Dashboard</span>
</div>
</div>
</th>
<td class="budget">
$4400 USD
</td>
<td>
<span class="badge badge-dot mr-4">
<i class="bg-info"></i>
<span class="status">on schedule</span>
</span>
</td>
<td>
<div class="avatar-group">
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Ryan Tompson">
<img alt="Image placeholder" src="/static/assets/img/theme/team-1.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Romina Hadid">
<img alt="Image placeholder" src="/static/assets/img/theme/team-2.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Alexander Smith">
<img alt="Image placeholder" src="/static/assets/img/theme/team-3.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Jessica Doe">
<img alt="Image placeholder" src="/static/assets/img/theme/team-4.jpg">
</a>
</div>
</td>
<td>
<div class="d-flex align-items-center">
<span class="completion mr-2">90%</span>
<div>
<div class="progress">
<div class="progress-bar bg-info" role="progressbar"
aria-valuenow="90" aria-valuemin="0" aria-valuemax="100"
style="width: 90%;"></div>
</div>
</div>
</div>
</td>
<td class="text-right">
<div class="dropdown">
<a class="btn btn-sm btn-icon-only text-light" href="#" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v"></i>
</a>
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</div>
</td>
</tr>
<tr>
<th scope="row">
<div class="media align-items-center">
<a href="#" class="avatar rounded-circle mr-3">
<img alt="Image placeholder" src="/static/assets/img/theme/vue.jpg">
</a>
<div class="media-body">
<span class="name mb-0 text-sm">Vue Paper UI Kit PRO</span>
</div>
</div>
</th>
<td class="budget">
$2200 USD
</td>
<td>
<span class="badge badge-dot mr-4">
<i class="bg-success"></i>
<span class="status">completed</span>
</span>
</td>
<td>
<div class="avatar-group">
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Ryan Tompson">
<img alt="Image placeholder" src="/static/assets/img/theme/team-1.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Romina Hadid">
<img alt="Image placeholder" src="/static/assets/img/theme/team-2.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Alexander Smith">
<img alt="Image placeholder" src="/static/assets/img/theme/team-3.jpg">
</a>
<a href="#" class="avatar avatar-sm rounded-circle" data-toggle="tooltip"
data-original-title="Jessica Doe">
<img alt="Image placeholder" src="/static/assets/img/theme/team-4.jpg">
</a>
</div>
</td>
<td>
<div class="d-flex align-items-center">
<span class="completion mr-2">100%</span>
<div>
<div class="progress">
<div class="progress-bar bg-success" role="progressbar"
aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"
style="width: 100%;"></div>
</div>
</div>
</div>
</td>
<td class="text-right">
<div class="dropdown">
<a class="btn btn-sm btn-icon-only text-light" href="#" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v"></i>
</a>
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Card footer -->
<div class="card-footer py-4">
<nav aria-label="...">
<ul class="pagination justify-content-end mb-0">
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1">
<i class="fas fa-angle-left"></i>
<span class="sr-only">Previous</span>
</a>
</li>
<li class="page-item active">
<a class="page-link" href="#">1</a>
</li>
<li class="page-item">
<a class="page-link" href="#">2 <span class="sr-only">(current)</span></a>
</li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item">
<a class="page-link" href="#">
<i class="fas fa-angle-right"></i>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,19 +1,37 @@
import datetime
import logging
import unittest
import pytz
from tests.base_test import BaseTest
from communicator import app
from communicator import db, app
from communicator.models import Sample
from communicator.services.graph_service import GraphService
from communicator.services.graph_service import GraphService, daterange
from datetime import date, timedelta
import json
class TestGraphService(BaseTest):
def populate_test_db(self):
days = 50
for day in daterange(date.today() - timedelta(days), date.today()):
day_string = day.strftime('%Y%m%d%H%M')
bar_code = '000000111-' + day_string + '-5030'
_sample = Sample(barcode=bar_code, location = 50, station = 30, student_id = "000000111",
computing_id = "abc12d")
_sample.date = day
db.session.add(_sample)
db.session.commit()
samples = db.session.query(Sample).all()
self.assertNotEqual(0, len(samples))
@unittest.skip("Nile, not sure what should be happening here.")
def test_get_totals_last_week(self):
graph = GraphService()
self.populate_test_db()
graph.update_search_filters({
"start_date": datetime.date(2020,11,1),
"end_date": datetime.date(2020,11,1),
@ -25,6 +43,7 @@ class TestGraphService(BaseTest):
def test_get_totals_by_hour(self):
graph = GraphService()
self.populate_test_db()
graph.update_search_filters({
"start_date": datetime.date(2020,11,1),
"end_date": datetime.date(2020,11,1),
@ -36,6 +55,7 @@ class TestGraphService(BaseTest):
def test_get_totals_by_day(self):
graph = GraphService()
self.populate_test_db()
graph.update_search_filters({
"start_date": datetime.date(2020,11,1),
"end_date": datetime.date(2020,11,1),
@ -47,13 +67,14 @@ class TestGraphService(BaseTest):
def test_get_totals_by_weekday(self):
graph = GraphService()
self.populate_test_db()
graph.update_search_filters({
"start_date": date.today() - timedelta(100),
"end_date": date.today(),
"location": "50"
})
result = graph.get_totals_by_weekday()
print(result)
self.assertTrue(20 not in result)
# fixme: Add some valid test data manually so you can something you can test against.
#self.assertEqual(result[50][0][1],17)