diff --git a/pocwww/__init__.py b/pocwww/__init__.py index 4afa9f8..30eb4bb 100644 --- a/pocwww/__init__.py +++ b/pocwww/__init__.py @@ -184,9 +184,9 @@ def main(global_config, **settings): # POC Interface config.add_route("json_updateconfig", "/json/updateconfig", factory='pocwww.security.UserLoginFactory') + config.add_route("json_shake", '/json/cmd/shake', factory='pocwww.security.UserLoginFactory') # Shake command is separate for allowing all access config.add_route("json_cmd", '/json/cmd/{action}', factory='pocwww.security.UserLoginFactory') config.add_route("json_update_poc_address", "/json/updatepocaddress", factory='pocwww.security.UserLoginFactory') - config.add_route("json_shake", '/json/cmd/shake', factory='pocwww.security.UserLoginFactory') diff --git a/pocwww/cards.py b/pocwww/cards.py index c6ff0e1..183c202 100644 --- a/pocwww/cards.py +++ b/pocwww/cards.py @@ -1,6 +1,24 @@ from pyramid.view import view_config -from .view_helpers import * +from .pagination import Pagination +def get_all_dates_with_cards(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}} + ]) + for d in dateagg: + datelist.append({'count': d['count'], 'date': datetime.strptime(d['_id'], "%Y-%m-%d").date()}) + return list(datelist) @view_config(route_name="json_lastcard", renderer="prettyjson") def json_lastcard(request): @@ -18,9 +36,32 @@ def cards(request): @view_config(route_name='json_cards_date', renderer='prettyjson') @view_config(route_name='json_cards_page', renderer='prettyjson') def cards_page(request): - cp = card_page(request) - cp['datelist'] = get_all_dates_with_cards(request) - return cp + page_num = 1 + try: + page_num = int(request.matchdict['page_num']) + except KeyError: + pass + + cards_date_start = datetime.now().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'].find({'timestamp': {'$lt': cards_date_end, '$gte': cards_date_start}}).count() + pages = ceil(num_cards / num_per_page) + + 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', + 'datelist': get_all_dates_with_cards(request) + } @view_config(route_name='card_single', renderer='templates/cardsingle.jinja2') diff --git a/pocwww/fluid_shots.py b/pocwww/fluid_shots.py index 203be11..3698990 100644 --- a/pocwww/fluid_shots.py +++ b/pocwww/fluid_shots.py @@ -1,5 +1,4 @@ from pyramid.view import view_config -from .view_helpers import * @view_config(route_name="fluidshots_all", renderer="templates/fluidshots.jinja2") diff --git a/pocwww/gauge_off.py b/pocwww/gauge_off.py new file mode 100644 index 0000000..a5a19b1 --- /dev/null +++ b/pocwww/gauge_off.py @@ -0,0 +1,44 @@ +from pyramid.view import view_config + +@view_config(route_name="gaugeoff_all", renderer="templates/gaugeoff_all.jinja2") +@view_config(route_name="json_gaugeoff_all", renderer="prettyjson") +def gaugeoff_all(request): + gaugeoff_list = [] + dateagg = list(request.db['gaugeOff'].aggregate( + [ + { + '$project': { + 'yearMonthDay': {'$dateToString': {'format': "%Y-%m-%d", 'date': "$timestamp"}}, + 'tagname': 1, + 'dailyTotal': 1, + 'dailyAverage': 1, + 'maxDailyValue': 1, + 'minDailyValue': 1, + 'currentValue': 1 + } + }, + { + '$group': { + '_id': "$yearMonthDay", + 'tags': {'$push': {'name': "$tagname"}}, + 'totals': {'$push': {'total': "$dailyTotal"}}, + 'averages': {'$push': {'average': "$dailyAverage"}}, + 'max': {'$push': {'max': "$maxDailyValue"}}, + 'min': {'$push': {'min': "$minDailyValue"}}, + 'last': {'$push': {'last': "$currentValue"}} + } + } + ])) + for d in dateagg: + newGO = {'date': datetime.strptime(d["_id"], '%Y-%m-%d'), 'tags': {}} + for i in range(0, len(d['tags'])): + newTagObj = { + "max": d['max'][i]['max'], + "min": d['min'][i]['min'], + "last": d['last'][i]['last'], + "total": d['totals'][i]['total'], + "average": d['averages'][i]['average'], + } + newGO['tags'][d['tags'][i]['name']] = newTagObj + gaugeoff_list.append(newGO) + return {'navgroup': 'gaugeoff', 'data': gaugeoff_list} diff --git a/pocwww/json.py b/pocwww/poc_interface.py similarity index 66% rename from pocwww/json.py rename to pocwww/poc_interface.py index 4f63a3c..2f3da7c 100644 --- a/pocwww/json.py +++ b/pocwww/poc_interface.py @@ -1,18 +1,13 @@ from pyramid.view import view_config -from .view_helpers import * -from bson import json_util import requests -import pytz +from datetime import datetime -@view_config(route_name="json_runstatusnow", renderer="prettyjson") -def json_runstatusnow(request): - status = False - try: - status = list(request.db['runStatus'].find().sort("timestamp", -1).limit(1))[0] - except IndexError: - pass - - return {'runstatus': status} +def get_poc_address(request): + addr_obj = list(request.db['pocConfiguration'].find({"_id": "pocIPAddress"})) + address = False + if len(addr_obj) > 0: + address = addr_obj[0]['pocIPAddress'] + return address @view_config(route_name="json_updateconfig", renderer="prettyjson", request_method='POST', permission="edit") @@ -61,13 +56,14 @@ def json_updateconfig(request): @view_config(route_name="json_cmd", renderer="prettyjson", permission="edit") def json_cmd(request): + print("got here") action = request.matchdict['action'] address = get_poc_address(request) or 'localhost' java_url = {} java_url['start'] = "http://{}:8000/command?cmd=start&user={}".format(address, request.authenticated_userid) java_url['stop'] = "http://{}:8000/command?cmd=stop&user={}".format(address, request.authenticated_userid) - java_url['shake'] = "http://{}:8000/shake".format(address) + # java_url['shake'] = "http://{}:8000/shake".format(address) r = requests.get(java_url[action]) return r.text if r.status_code == 200 else {"status": "failure sending command"} @@ -92,59 +88,9 @@ def json_update_poc_address(request): return {"status": "failure"} -@view_config(route_name="json_users", renderer="prettyjson", request_method='POST', permission="edit") -def json_newuser(request): - jsb = request.json_body - if request.db['users'].count({"username": jsb['username']}) > 0: - fail_reason = "There is already a user with this username" - return {"status": 'fail', "info": fail_reason} - - elif len(jsb['username']) < 5: - fail_reason = "The username must be at least 5 characters" - return {"status": 'fail', "info": fail_reason} - - elif len(jsb['password']) < 5: - fail_reason = "The password must be at least 5 characters" - return {"status": 'fail', "info": fail_reason} - - else: - set_return = set_password(request, jsb['username'], jsb['password']) - return {'status': "OK"} - - -@view_config(route_name="json_users", renderer="prettyjson", permission="edit", request_method='GET') -def json_getuser(request): - user_list = [] - users = list(request.db['users'].find()) - for user in users: - user_list.append(user['username']) - return {'users': user_list} - - -@view_config(route_name="json_users", renderer="prettyjson", permission="edit", request_method='DELETE') -def json_deleteuser(request): - request.db['users'].remove({'username': request.json_body['username']}) - user_list = [] - users = list(request.db['users'].find()) - for user in users: - user_list.append(user['username']) - return {'users': user_list} - - -@view_config(route_name="json_users", renderer="prettyjson", request_method='PUT', permission="edit") -def json_updateuser(request): - jsb = request.json_body - if len(jsb['username']) < 5: - fail_reason = "The username must be at least 5 characters" - return {"status": 'fail', "info": fail_reason} - - elif len(jsb['password']) < 5: - fail_reason = "The password must be at least 5 characters" - return {"status": 'fail', "info": fail_reason} - - else: - set_return = set_password(request, jsb['username'], jsb['password']) - return {'status': "OK"} +@view_config(route_name='setpoints', renderer='templates/setpoints.jinja2', permission='edit') +def setpoints(request): + return {"navgroup": "setpoints"} @view_config(route_name="json_setpoints", renderer="prettyjson", request_method='GET', permission='edit') diff --git a/pocwww/run_status.py b/pocwww/run_status.py new file mode 100644 index 0000000..cd35e6e --- /dev/null +++ b/pocwww/run_status.py @@ -0,0 +1,30 @@ +from pyramid.view import view_config +from math import ceil +from .pagination import Pagination + +@view_config(route_name="runstatus", renderer="templates/runstatus.jinja2") +@view_config(route_name="json_runstatus", renderer="prettyjson") +@view_config(route_name="json_runstatus_page", renderer="prettyjson") +def run_status(request): + page_num = 1 + try: + page_num = int(request.matchdict['page_num']) + except KeyError: + pass + + num_per_page = 100 + num_cards = request.db['runStatus'].count() + pages = ceil(num_cards / num_per_page) + runStatuses = list(request.db['runStatus'].find().sort("timestamp", -1).skip(num_per_page * (page_num - 1)).limit(num_per_page)) + return {'navgroup': 'runstatus', 'data': runStatuses, 'pagination': Pagination(page_num, num_per_page, num_cards)} + + +@view_config(route_name="json_runstatusnow", renderer="prettyjson") +def json_runstatusnow(request): + status = False + try: + status = list(request.db['runStatus'].find().sort("timestamp", -1).limit(1))[0] + except IndexError: + pass + + return {'runstatus': status} diff --git a/pocwww/view_helpers.py b/pocwww/view_helpers.py deleted file mode 100644 index e04f860..0000000 --- a/pocwww/view_helpers.py +++ /dev/null @@ -1,77 +0,0 @@ -from datetime import datetime, timedelta -from math import ceil -from passlib.apps import custom_app_context as poc_pwd_context -from dateutil import tz -from .pagination import Pagination - -from_zone = tz.tzutc() -to_zone = tz.tzlocal() - - -def card_page(request): - page_num = 1 - try: - page_num = int(request.matchdict['page_num']) - except KeyError: - pass - - cards_date_start = datetime.now().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'].find({'timestamp': {'$lt': cards_date_end, '$gte': cards_date_start}}).count() - pages = ceil(num_cards / num_per_page) - - 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'} - - -def get_all_dates_with_cards(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}} - ]) - for d in dateagg: - datelist.append({'count': d['count'], 'date': datetime.strptime(d['_id'], "%Y-%m-%d").date()}) - return list(datelist) - - -def get_poc_address(request): - addr_obj = list(request.db['pocConfiguration'].find({"_id": "pocIPAddress"})) - address = False - if len(addr_obj) > 0: - address = addr_obj[0]['pocIPAddress'] - return address - - -def set_password(request, username, password): - password_hash = poc_pwd_context.encrypt(password) - request.db['users'].update_one({'username': username}, {"$set":{"username": username, "password": password_hash}}, upsert=True) - - -def check_password(request, username, password): - users = list(request.db['users'].find({'username': username})) - if len(users) > 0: - this_user = users[0] - - # is it cleartext? - if password == this_user['password']: - set_password(request, username, password) - return check_password(request, username, password) - - return poc_pwd_context.verify(password, this_user['password']) diff --git a/pocwww/views.py b/pocwww/views.py index 906fc9d..2f402ca 100644 --- a/pocwww/views.py +++ b/pocwww/views.py @@ -1,9 +1,9 @@ from pyramid.view import view_config from pyramid.httpexceptions import HTTPFound from pyramid.security import remember, forget +from passlib.apps import custom_app_context as poc_pwd_context from datetime import datetime, timedelta from math import ceil -from .view_helpers import * @view_config(route_name='home', renderer='templates/dashboard.jinja2') @@ -38,67 +38,6 @@ def my_view(request): return {'project': 'POC Web Interface', 'navgroup': 'dashboard', 'tag_values': latest_tag_values, 'card': latest_card} -@view_config(route_name="gaugeoff_all", renderer="templates/gaugeoff_all.jinja2") -@view_config(route_name="json_gaugeoff_all", renderer="prettyjson") -def gaugeoff_all(request): - gaugeoff_list = [] - dateagg = list(request.db['gaugeOff'].aggregate( - [ - { - '$project': { - 'yearMonthDay': {'$dateToString': {'format': "%Y-%m-%d", 'date': "$timestamp"}}, - 'tagname': 1, - 'dailyTotal': 1, - 'dailyAverage': 1, - 'maxDailyValue': 1, - 'minDailyValue': 1, - 'currentValue': 1 - } - }, - { - '$group': { - '_id': "$yearMonthDay", - 'tags': {'$push': {'name': "$tagname"}}, - 'totals': {'$push': {'total': "$dailyTotal"}}, - 'averages': {'$push': {'average': "$dailyAverage"}}, - 'max': {'$push': {'max': "$maxDailyValue"}}, - 'min': {'$push': {'min': "$minDailyValue"}}, - 'last': {'$push': {'last': "$currentValue"}} - } - } - ])) - for d in dateagg: - newGO = {'date': datetime.strptime(d["_id"], '%Y-%m-%d'), 'tags': {}} - for i in range(0, len(d['tags'])): - newTagObj = { - "max": d['max'][i]['max'], - "min": d['min'][i]['min'], - "last": d['last'][i]['last'], - "total": d['totals'][i]['total'], - "average": d['averages'][i]['average'], - } - newGO['tags'][d['tags'][i]['name']] = newTagObj - gaugeoff_list.append(newGO) - return {'navgroup': 'gaugeoff', 'data': gaugeoff_list} - - -@view_config(route_name="runstatus", renderer="templates/runstatus.jinja2") -@view_config(route_name="json_runstatus", renderer="prettyjson") -@view_config(route_name="json_runstatus_page", renderer="prettyjson") -def run_status(request): - page_num = 1 - try: - page_num = int(request.matchdict['page_num']) - except KeyError: - pass - - num_per_page = 100 - num_cards = request.db['runStatus'].count() - pages = ceil(num_cards / num_per_page) - runStatuses = list(request.db['runStatus'].find().sort("timestamp", -1).skip(num_per_page * (page_num - 1)).limit(num_per_page)) - return {'navgroup': 'runstatus', 'data': runStatuses, 'pagination': Pagination(page_num, num_per_page, num_cards)} - - @view_config(route_name="config", renderer="templates/config.jinja2", permission="edit") @view_config(route_name="json_config", renderer="prettyjson", permission="edit") def well_config(request): @@ -131,6 +70,73 @@ def register(request): return {"navgroup": "user"} -@view_config(route_name='setpoints', renderer='templates/setpoints.jinja2', permission='edit') -def setpoints(request): - return {"navgroup": "setpoints"} +def set_password(request, username, password): + password_hash = poc_pwd_context.encrypt(password) + request.db['users'].update_one({'username': username}, {"$set":{"username": username, "password": password_hash}}, upsert=True) + + +def check_password(request, username, password): + users = list(request.db['users'].find({'username': username})) + if len(users) > 0: + this_user = users[0] + + # is it cleartext? + if password == this_user['password']: + set_password(request, username, password) + return check_password(request, username, password) + + return poc_pwd_context.verify(password, this_user['password']) + +@view_config(route_name="json_users", renderer="prettyjson", request_method='POST', permission="edit") +def json_newuser(request): + jsb = request.json_body + if request.db['users'].count({"username": jsb['username']}) > 0: + fail_reason = "There is already a user with this username" + return {"status": 'fail', "info": fail_reason} + + elif len(jsb['username']) < 5: + fail_reason = "The username must be at least 5 characters" + return {"status": 'fail', "info": fail_reason} + + elif len(jsb['password']) < 5: + fail_reason = "The password must be at least 5 characters" + return {"status": 'fail', "info": fail_reason} + + else: + set_return = set_password(request, jsb['username'], jsb['password']) + return {'status': "OK"} + + +@view_config(route_name="json_users", renderer="prettyjson", permission="edit", request_method='GET') +def json_getuser(request): + user_list = [] + users = list(request.db['users'].find()) + for user in users: + user_list.append(user['username']) + return {'users': user_list} + + +@view_config(route_name="json_users", renderer="prettyjson", permission="edit", request_method='DELETE') +def json_deleteuser(request): + request.db['users'].remove({'username': request.json_body['username']}) + user_list = [] + users = list(request.db['users'].find()) + for user in users: + user_list.append(user['username']) + return {'users': user_list} + + +@view_config(route_name="json_users", renderer="prettyjson", request_method='PUT', permission="edit") +def json_updateuser(request): + jsb = request.json_body + if len(jsb['username']) < 5: + fail_reason = "The username must be at least 5 characters" + return {"status": 'fail', "info": fail_reason} + + elif len(jsb['password']) < 5: + fail_reason = "The password must be at least 5 characters" + return {"status": 'fail', "info": fail_reason} + + else: + set_return = set_password(request, jsb['username'], jsb['password']) + return {'status': "OK"} diff --git a/pocwww/well_tests.py b/pocwww/well_tests.py index e9e47c8..ab1f328 100644 --- a/pocwww/well_tests.py +++ b/pocwww/well_tests.py @@ -1,5 +1,4 @@ from pyramid.view import view_config -from .view_helpers import * @view_config(route_name="welltests_all", renderer="templates/welltests.jinja2")