mirror of
https://github.com/sartography/uva-covid19-testing-communicator.git
synced 2025-02-24 04:48:05 +00:00
commit
b09b353172
@ -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,
|
||||
))
|
||||
|
@ -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"]
|
||||
|
@ -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>
|
||||
|
@ -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}}');
|
||||
|
@ -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>
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user