Files
ProjectIOT/AT_frontend/app.py
2025-04-21 12:32:38 +02:00

152 lines
5.0 KiB
Python

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)