from flask import Blueprint, render_template, redirect, url_for, request, current_app from flask_login import login_required, current_user, login_user from models import db from models import User, Item import json from sqlalchemy import desc, text api_bp = Blueprint("api", __name__, url_prefix="/api") @api_bp.route("/validate_key", methods=["POST"]) def validate_key(): result={} result['status']=0 result['data'] = '' if "key" in request.form: key = request.form["key"] if key == current_app.config["APPLICATION_KEY"]: result['status'] = 1 else: result['message'] = 'Unknown Application-Key' return json.dumps(result), 200 @api_bp.route("/login", methods=["POST"]) def login(): result={} result['status']=0 result['data'] = '' if "user" in request.form and "password" in request.form: user = request.form["user"] password = request.form["password"] user = User.query.filter_by(name=user).first() if user and user.check_password(password): if not user.is_approved: result['message'] = 'User is pending approval.' elif user.group_id == 0: result['message'] = 'User is not connected to a group.' else: login_user(user) result['status'] = 1 result['data'] = user.as_dict() else: result['message'] = 'User or password unknown' return json.dumps(result), 200 @api_bp.route("/register", methods=["POST"]) def register(): result={} result['status']=0 result['data'] = '' if "user" in request.form and "password" in request.form: username = request.form["user"].strip() password = request.form["password"] user = User.query.filter_by(name=username).first() if user: result['message'] = 'Username is not unique. Pick something else please.' else: user = User(name=username) group_id = user.set_group_id(password) if group_id == 0: result['message'] = 'Unknown registration key.' return json.dumps(result), 200 result['status'] = 2 result['message'] = 'Registration Ok. Awaiting approval.' user.set_password(password) user.group_id = group_id db.session.add(user) db.session.commit() return json.dumps(result), 200 @api_bp.route("/load_lists", methods=["POST"]) @login_required def load_lists(): result={} result['status']=1 # from this call the result is always 1, empty or not result['data'] = current_user.all_my_lists_as_dict() return json.dumps(result), 200 @api_bp.route("/load_items", methods=["POST"]) @login_required def load_items(): result={} result['status']=1 # from this call the result is always 1, empty or not result['data'] = '' if "listid" in request.form: listid = int(request.form["listid"]) if current_user.can_access_list(listid): items=Item.query.filter_by(listofitems_id=listid, is_suggestion=False).order_by(text("is_checked, category, label")).all() if items: result['data'] = [ i.as_dict() for i in items] else: result['status'] = 0 result['message'] = 'Forbidden' return json.dumps(result), 403 return json.dumps(result), 200