DecisionTree/user.py

88 lines
3.2 KiB
Python

from flask import Blueprint, render_template, request, redirect, url_for, flash
from models import Product, Node
user_bp = Blueprint('user', __name__)
@user_bp.route('/')
def home():
products = Product.query.all()
return render_template('home.html', products=products)
@user_bp.route('/product/<int:product_id>')
def product_detail(product_id):
product = Product.query.get_or_404(product_id)
# If the product has a root node, redirect directly to the decision tree
if product.root_node:
return redirect(url_for('user.decision_node', product_id=product.id, node_id=product.root_node_id))
# Otherwise, show the product detail page with a message
flash("This product doesn't have a decision tree yet.", "warning")
return render_template('product_detail.html', product=product)
# New route for starting the decision tree
@user_bp.route('/product/<int:product_id>/start')
def start_decision_tree(product_id):
product = Product.query.get_or_404(product_id)
if not product.root_node:
flash("This product doesn't have a decision tree yet.", "warning")
return redirect(url_for('user.product_detail', product_id=product_id))
return redirect(url_for('user.decision_node', product_id=product_id, node_id=product.root_node_id))
@user_bp.route('/product/<int:product_id>/node/<int:node_id>')
def decision_node(product_id, node_id):
product = Product.query.get_or_404(product_id)
node = Node.query.get_or_404(node_id)
# Verify that this node belongs to the product's decision tree
if not is_node_in_product_tree(product, node):
flash("This node does not belong to the selected product.", "danger")
return redirect(url_for('user.product_detail', product_id=product_id))
return render_template('decision_tree.html', product=product, current_node=node)
# Backward compatibility route - redirects old URLs to new format
@user_bp.route('/node/<int:node_id>')
def legacy_node_redirect(node_id):
node = Node.query.get_or_404(node_id)
# Find which product this node belongs to
for product in Product.query.all():
if is_node_in_product_tree(product, node):
return redirect(url_for('user.decision_node', product_id=product.id, node_id=node.id))
# If we can't find the product, redirect to home
flash("Could not determine which product this node belongs to.", "warning")
return redirect(url_for('user.home'))
# Helper function to check if a node belongs to a product's decision tree
def is_node_in_product_tree(product, node):
if not product.root_node:
return False
# Check if this is the root node
if product.root_node_id == node.id:
return True
# Otherwise, traverse the tree
return is_node_in_tree(product.root_node, node.id)
# Helper function to check if a node is in a tree
def is_node_in_tree(root, node_id):
if not root:
return False
if root.id == node_id:
return True
# Check yes branch
if root.yes_node_id and is_node_in_tree(root.yes_node, node_id):
return True
# Check no branch
if root.no_node_id and is_node_in_tree(root.no_node, node_id):
return True
return False