@app.route('/access_logs_data')
def access_logs_data():
conn = None
cursor = None
try:
conn = mysql.connector.connect(
host=MYSQL_HOST,
user=MYSQL_USER,
password=MYSQL_PASSWORD,
database=MYSQL_DATABASE
)
cursor = conn.cursor(dictionary=True)
# Create access_logs table if it doesn't exist
cursor.execute('''
CREATE TABLE IF NOT EXISTS access_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
license_plate VARCHAR(255) NOT NULL,
feed_type VARCHAR(50) NOT NULL,
action VARCHAR(50) NOT NULL,
timestamp DATETIME NOT NULL
)
''')
# Fetch all logs
cursor.execute("SELECT * FROM access_logs ORDER BY timestamp DESC")
logs = cursor.fetchall()
# Process logs for all_time_stats
entrances = [log for log in logs if log['feed_type'].lower() == 'entrance']
exits = [log for log in logs if log['feed_type'].lower() == 'exit']
granted = [log for log in logs if log['action'].lower() == 'auto']
denied = [log for log in logs if log['action'].lower() != 'auto']
# Get unique plates
registered_plates = set(log['license_plate'] for log in granted)
unregistered_plates = set(log['license_plate'] for log in denied)
# Find peak hour
hour_counts = Counter()
for log in logs:
timestamp = log['timestamp']
if hasattr(timestamp, 'hour'):
hour = timestamp.hour
else:
# Handle string timestamps if needed
try:
hour = datetime.fromisoformat(str(timestamp)).hour
except:
hour = 0
hour_counts[hour] += 1
peak_hour = max(hour_counts.items(), key=lambda x: x[1])[0] if hour_counts else 0
# Calculate average daily traffic
if logs:
# Get unique dates from logs
dates = set()
for log in logs:
timestamp = log['timestamp']
if hasattr(timestamp, 'date'):
dates.add(timestamp.date())
else:
try:
dates.add(datetime.fromisoformat(str(timestamp)).date())
except:
pass
avg_traffic = round(len(logs) / max(1, len(dates)))
else:
avg_traffic = 0
# Create all_time_stats dictionary
all_time_stats = {
'total_entrances': len(entrances),
'total_exits': len(exits),
'granted_access': len(granted),
'denied_access': len(denied),
'registered_vehicles': len(registered_plates),
'unregistered_vehicles': len(unregistered_plates),
'peak_hour': f"{peak_hour:02d}:00",
'avg_traffic': avg_traffic
}
# Process data for charts (daily, weekly, monthly)
now = datetime.now()
# Create reportData structure
report_data = {
'day': process_period_data(logs, now, 'day'),
'week': process_period_data(logs, now, 'week'),
'month': process_period_data(logs, now, 'month')
}
return jsonify({
'all_time_stats': all_time_stats,
'report_data': report_data
})
except mysql.connector.Error as err:
logging.error(f"MySQL Error fetching reports data: {err}")
return jsonify({'error': 'Error fetching reports data'}), 500
finally:
if cursor:
cursor.close()
if conn and conn.is_connected():
conn.close()
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter