Card data working in website, get cards by date & page

This commit is contained in:
Patrick McDonagh
2017-02-13 15:04:07 -06:00
parent fe60ba2292
commit bd291d6e6c
7 changed files with 201 additions and 52 deletions

View File

@@ -18,7 +18,8 @@ pyramid.includes =
# '127.0.0.1' and '::1'.
# debugtoolbar.hosts = 127.0.0.1 ::1
mongo_uri = mongodb://localhost:27017/poc
# mongo_uri = mongodb://localhost:27017/poc
mongo_uri = mongodb://10.20.155.202:27017/poc
###

View File

@@ -31,8 +31,10 @@ def main(global_config, **settings):
config.add_request_method(add_db, 'db', reify=True)
config.add_static_view('static', 'static', cache_max_age=3600)
config.add_route('home', '/')
config.add_route('cards_page', '/cards/{page_num}')
config.add_route('cards_page', '/cards/{cards_date}/{page_num}')
config.add_route('cards_date', '/cards/{cards_date}')
config.add_route('cards', '/cards')
config.add_route('card_single', "/card/view/{stroke_number}")
config.scan()
return config.make_wsgi_app()

View File

@@ -1,10 +1,31 @@
{% from 'pagination.jinja2' import render_pagination %}
{% extends "layout.jinja2" %}
{% block content %}
<div class="content">
<h1>Card Data Page {{page_num}} / {{total_pages}}</h1>
{% for card in cards %}
<p><a href="/card/view/{{card.strokeNumber}}">{{card.timestamp}}</a></p>
{% endfor %}
<h1>Card Data Page {{page_num}} / {{total_pages}}</h1>
<div style="text-center">
{{render_pagination(pagination, "/cards/" + cards_date)}}
</div>
<table class="table table-striped"
<thead>
<tr>
<th>Stroke</th>
<th>Datetime</th>
</tr>
</thead>
<tbody>
{% for card in cards %}
<tr>
<td>{{card.strokeNumber}}</td>
<td><a href="/card/view/{{card.strokeNumber}}">{{card.timestamp}}</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock content %}

View File

@@ -0,0 +1,23 @@
{% extends "layout.jinja2" %}
{% block content %}
<div class="content">
<h1>Card Dates </h1>
<table class="table table-striped"
<thead>
<tr>
<th>Date</th>
<th>Cards</th>
</tr>
</thead>
<tbody>
{% for day in datelist %}
<tr>
<td><a href="/cards/{{day.date}}">{{day.date}}</a></td>
<td>{{day.count}} cards</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock content %}

View File

@@ -1,6 +1,6 @@
<!DOCTYPE html>
<html lang="en">
<head>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
@@ -28,52 +28,52 @@
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
</head>
<body>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Henry POC</a>
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Henry POC</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="/configuration">Configuration</a></li>
</ul>
</div>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="/configuration">Configuration</a></li>
</ul>
</div>
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li class="active"><a href="/">Dashboard</a></li>
<li><a href="/cards">Cards</a></li>
<li><a href="/values">Values</a></li>
<li><a href="/gaugeoff">Gauge-Off</a></li>
</ul>
<ul class="nav nav-sidebar">
<li><a href="/fluidshots">Fluid Shots</a></li>
<li><a href="/welltests">Well Tests</a></li>
</ul>
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li {% if (navgroup == 'dashboard') %}class="active"{% endif %}><a href="/">Dashboard</a></li>
<li {% if (navgroup == 'cards') %}class="active"{% endif %}><a href="/cards">Cards</a></li>
<li {% if (navgroup == 'values') %}class="active"{% endif %}><a href="/values">Values</a></li>
<li {% if (navgroup == 'gaugeoff') %}class="active"{% endif %}><a href="/gaugeoff">Gauge-Off</a></li>
</ul>
<ul class="nav nav-sidebar">
<li><a href="/fluidshots">Fluid Shots</a></li>
<li><a href="/welltests">Well Tests</a></li>
</ul>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
{% block content %}
<p>No content</p>
{% endblock content %}
</div>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
{% block content %}
<p>No content</p>
{% endblock content %}
</div>
</div>
</div>
<!-- Bootstrap core JavaScript
@@ -82,5 +82,5 @@
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</body>
</html>

View File

@@ -0,0 +1,41 @@
{% macro render_pagination(pagination, endpoint) %}
<ul class="pagination">
{% if pagination.has_prev %}
<li>
<a href="{{endpoint}}/{{pagination.prev_num}}" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
{% endif %}
{% for p in pagination.iter_pages(left_edge=1, left_current=2, right_current=3, right_edge=1) %}
{% if p %}
{% if p != pagination.page %}
<li>
<a href="{{endpoint}}/{{p}}">{{ p }}</a>
</li>
{% else %}
<li class="active">
<a href="{{endpoint}}/{{p}}">{{ p }}</a>
</li>
{% endif %}
{% else %}
<li class="disabled">
<span class="ellipsis">&hellip;</span>
</li>
{% endif %}
{% endfor %}
{% if pagination.has_next %}
<li>
<a href="{{endpoint}}/{{pagination.next_num}}" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
{% endif %}
</ul>
{% endmacro %}

View File

@@ -1,11 +1,47 @@
from pyramid.view import view_config
from datetime import datetime, timedelta
from math import ceil
class Pagination(object):
def __init__(self, page, per_page, total_count):
self.page = page
self.per_page = per_page
self.total_count = total_count
self.prev_num = page - 1
self.next_num = page + 1
@property
def pages(self):
return int(ceil(self.total_count / float(self.per_page)))
@property
def has_prev(self):
return self.page > 1
@property
def has_next(self):
return self.page < self.pages
def iter_pages(self, left_edge=2, left_current=2,
right_current=5, right_edge=2):
last = 0
for num in range(1, self.pages + 1):
if num <= left_edge or \
(num > self.page - left_current - 1 and
num < self.page + right_current) or \
num > self.pages - right_edge:
if last + 1 != num:
yield None
yield num
last = num
@view_config(route_name='home', renderer='templates/mytemplate.jinja2')
def my_view(request):
return {'project': 'POC Web Interface'}
return {'project': 'POC Web Interface', 'navgroup':'dashboard'}
def card_page(request):
@@ -15,19 +51,44 @@ def card_page(request):
except KeyError:
pass
cards_date_start = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0)
try:
cards_date_start = datetime.strptime(request.matchdict['cards_date'], "%Y-%m-%d")
except KeyError:
pass
cards_date_end = cards_date_start + timedelta(days=1)
num_per_page = 100
num_cards = request.db['cards'].count()
num_cards = request.db['cards'].find({'timestamp': {'$lt': cards_date_end, '$gte': cards_date_start}}).count()
pages = ceil(num_cards / num_per_page)
cards = request.db['cards'].find().sort("timestamp", -1).skip(num_per_page * (page_num - 1)).limit(num_per_page)
return {'cards': list(cards), 'page_num': page_num, 'total_pages': pages}
cards = request.db['cards'].find({'timestamp': {'$lt': cards_date_end, '$gte': cards_date_start}}).sort("timestamp", -1).skip(num_per_page * (page_num - 1)).limit(num_per_page)
return {'cards': list(cards), 'pagination': Pagination(page_num, num_per_page, num_cards), 'cards_date': cards_date_start.strftime("%Y-%m-%d"), 'navgroup': 'cards'}
@view_config(route_name='cards', renderer='templates/cardlist.jinja2')
@view_config(route_name='cards', renderer='templates/datelist.jinja2')
def cards(request):
return card_page(request)
datelist = []
dateagg = request.db['cards'].aggregate([
{"$group": {
"_id": {"$concat": [
{"$substr": [{"$year": "$timestamp"}, 0, 4]},
"-",
{"$substr": [{"$month": "$timestamp"}, 0, 2]},
"-",
{"$substr": [{"$dayOfMonth": "$timestamp"}, 0, 2]},
]},
"count": {"$sum": 1}
}},
{"$sort": {"_id": 1}}
], useCursor=False)
for d in dateagg:
datelist.append({'count': d['count'], 'date': datetime.strptime(d['_id'], "%Y-%m-%d").date()})
return {'datelist': list(datelist), 'navgroup': 'cards'}
@view_config(route_name='cards_date', renderer='templates/cardlist.jinja2')
@view_config(route_name='cards_page', renderer='templates/cardlist.jinja2')
def cards_page(request):
return card_page(request)
@@ -36,4 +97,4 @@ def cards_page(request):
@view_config(route_name='card_single', renderer='templates/cardsingle.jinja2')
def card_single(request):
card = list(request.db['cards'].find({"strokeNumber": int(request.matchdict['stroke_number'])}))
return {"card": card[0]}
return {"card": card[0], 'navgroup': 'cards'}