mirror of
https://github.com/StefBuwalda/ProjectIOT.git
synced 2025-10-29 18:59:57 +00:00
152 lines
5.0 KiB
Python
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) |