from flask import Flask, render_template, request, redirect, url_for, flash, session from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, SubmitField from wtforms.validators import DataRequired from functools import wraps import os from flask_sqlalchemy import SQLAlchemy from datetime import datetime app = Flask(__name__) app.config['SECRET_KEY'] = 'your-secret-key' # Change this to a random string # Database configuration - update with your friend's database info app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///logs.db' # Change this to match your friend's DB app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) # Simple log model - adjust to match your friend's database structure class Log(db.Model): id = db.Column(db.Integer, primary_key=True) action = db.Column(db.String(100), nullable=False) timestamp = db.Column(db.DateTime, default=datetime.utcnow) def __repr__(self): return f"Log('{self.action}', '{self.timestamp}')" # Keep your existing user dictionary for authentication users = { "admin": {"password": "admin123", "role": "admin"}, "user": {"password": "user123", "role": "user"} } # Add a function to create a new log entry def add_log(action): log = Log(action=action) db.session.add(log) db.session.commit() class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) remember = BooleanField('Remember Me') class GateControlForm(FlaskForm): open_gate = SubmitField('Open Gate') close_gate = SubmitField('Close Gate') check_camera = SubmitField('Check Camera') debug_mode = BooleanField('Debug Mode') def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if 'logged_in' not in session: return redirect(url_for('login')) return f(*args, **kwargs) return decorated_function def admin_required(f): @wraps(f) def decorated_function(*args, **kwargs): if 'role' not in session or session['role'] != 'admin': flash('You need to be an admin to access this page.') return redirect(url_for('login')) return f(*args, **kwargs) return decorated_function @app.route('/') def index(): if 'logged_in' in session: if session['role'] == 'admin': return redirect(url_for('dashboard')) return redirect(url_for('user_page')) return redirect(url_for('login')) @app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() error = None if request.method == 'POST': username = request.form['username'] password = request.form['password'] if username in users and users[username]['password'] == password: session['logged_in'] = True session['username'] = username session['role'] = users[username]['role'] # Log the login action add_log(f"User {username} logged in") if users[username]['role'] == 'admin': return redirect(url_for('dashboard')) else: return redirect(url_for('user_page')) else: # Log the failed login attempt add_log(f"Failed login attempt for user {username}") error = 'Invalid credentials. Please try again.' return render_template('inlog.html', form=form, error=error) @app.route('/dashboard', methods=['GET', 'POST']) @login_required @admin_required def dashboard(): form = GateControlForm() gate_status = "Closed" camera_status = "Inactive" debug_mode = False # Get the most recent logs to display recent_logs = Log.query.order_by(Log.timestamp.desc()).limit(10).all() if form.validate_on_submit(): if form.open_gate.data: gate_status = "Open" add_log("Gate opened by " + session['username']) elif form.close_gate.data: gate_status = "Closed" add_log("Gate closed by " + session['username']) elif form.check_camera.data: camera_status = "Active" add_log("Camera checked by " + session['username']) debug_mode = form.debug_mode.data if debug_mode: add_log("Debug mode enabled by " + session['username']) return render_template('dashboard.html', form=form, gate_status=gate_status, camera_status=camera_status, debug_mode=debug_mode, recent_logs=recent_logs) @app.route('/user') @login_required def user_page(): add_log(f"User {session['username']} accessed user page") return "Regular user page - Access restricted" @app.route('/logout') def logout(): if 'username' in session: add_log(f"User {session['username']} logged out") session.clear() return redirect(url_for('login')) # Initialize database with app.app_context(): db.create_all() if __name__ == '__main__': app.run(debug=True)