import re from datetime import datetime from flask import Blueprint, render_template, request, redirect, url_for, flash from werkzeug.security import generate_password_hash from models import db, User register_bp = Blueprint('register', __name__, url_prefix='/register') @register_bp.route('/', methods=['GET', 'POST']) def register(): username = '' password = '' confirm_password = '' username_err = '' password_err = '' confirm_password_err = '' if request.method == 'POST': username = request.form.get('username', '').strip() password = request.form.get('password', '').strip() confirm_password = request.form.get('confirm_password', '').strip() # Validate username if not username: username_err = "Please enter a username." elif not re.match(r'^[a-zA-Z0-9_]+$', username): username_err = "Username can only contain letters, numbers, and underscores." else: # Check if username already exists if User.query.filter_by(username=username).first(): username_err = "This username is already taken." # Validate password if not password: password_err = "Please enter a password." elif len(password) < 6: password_err = "Password must have at least 6 characters." # Validate confirm password if not confirm_password: confirm_password_err = "Please confirm password." elif password != confirm_password: confirm_password_err = "Password did not match." # If no errors, insert new user if not username_err and not password_err and not confirm_password_err: hashed_password = generate_password_hash(password) new_user = User( username=username, password=hashed_password, register_time=datetime.utcnow() ) try: db.session.add(new_user) db.session.commit() flash("Registration successful! Please login.", "success") return redirect(url_for('login.login')) except Exception as e: db.session.rollback() flash("Oops! Something went wrong. Please try again.", "danger") return render_template('register.html', username=username, password=password, confirm_password=confirm_password, username_err=username_err, password_err=password_err, confirm_password_err=confirm_password_err)