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 @view_config(route_name='home', renderer='templates/dashboard.jinja2') @view_config(route_name="json_snapshot", renderer="prettyjson") def my_view(request): latest_tag_values = [] latesttag_agg = request.db['measurements'].aggregate([ {'$sort': {'dateStored': 1}}, { '$group': { '_id': '$tagname', 'currentValue': {'$last': '$currentValue'}, 'units': {'$last': '$units'}, 'maxValue': {'$last': '$maxValue'}, 'minValue': {'$last': '$minValue'}, 'totalValue': {'$last': '$totalValue'}, 'averageValue': {'$last': '$averageValue'}, 'useTotal': {'$last': '$useTotal'}, 'useAverage': {'$last': '$useAverage'} } } ]) for t in latesttag_agg: latest_tag_values.append(t) latest_card = [] try: latest_card = list(request.db['cards'].find().sort("timestamp", -1).limit(1))[0] except IndexError: latest_card = [] return {'project': 'POC Web Interface', 'navgroup': 'dashboard', 'tag_values': latest_tag_values, 'card': latest_card} @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): current_configuration = list(request.db['wellConfiguration'].find().sort("timestamp", -1).limit(1))[0] return {'navgroup': 'config', 'config': current_configuration} @view_config(route_name="admin", renderer="templates/admin.jinja2", permission="edit") def admin_view(request): address = get_poc_address(request) or 'localhost' return {'navgroup': 'admin', 'pocIPAddress': address} @view_config(route_name="auth") def sign_in_out(request): username = request.POST.get('username') if username: if check_password(request, username, request.POST.get('password')): headers = remember(request, username) else: headers = forget(request) else: headers = forget(request) return HTTPFound(location=request.route_url('home'), headers=headers) @view_config(route_name='register', renderer='templates/register.jinja2', permission="edit") def register(request): return {"navgroup": "user"} 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"}