87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
|
|
from flask import Flask, render_template, request, redirect, url_for, send_from_directory, flash, jsonify, json
|
||
|
|
from flask import current_app
|
||
|
|
|
||
|
|
from datetime import datetime
|
||
|
|
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
|
||
|
|
|
||
|
|
import os
|
||
|
|
|
||
|
|
class LogHelper:
|
||
|
|
@staticmethod
|
||
|
|
def log_action(action, details=""):
|
||
|
|
"""Log user actions with timestamp, user, action, and details."""
|
||
|
|
logData = LogData()
|
||
|
|
logData.WriteLog(action, details="")
|
||
|
|
|
||
|
|
class LogData:
|
||
|
|
|
||
|
|
filepath = ""
|
||
|
|
timestamp = None
|
||
|
|
|
||
|
|
def __init__(self):
|
||
|
|
self.filepath = os.path.join(current_app.root_path, 'activity.log')
|
||
|
|
self.timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||
|
|
|
||
|
|
if hasattr(current_user, "cn") and current_user.cn:
|
||
|
|
self.user = current_user.cn
|
||
|
|
elif hasattr(current_user, "username") and current_user.username:
|
||
|
|
self.user = current_user.username
|
||
|
|
elif hasattr(current_user, "sAMAccountName") and current_user.sAMAccountName:
|
||
|
|
self.user = current_user.sAMAccountName
|
||
|
|
else:
|
||
|
|
self.user = "Unknown"
|
||
|
|
|
||
|
|
def WriteLog(self, action, details=""):
|
||
|
|
"""Log user actions with timestamp, user, action, and details."""
|
||
|
|
|
||
|
|
with open(self.filepath, "a", encoding="utf-8") as f:
|
||
|
|
f.write(
|
||
|
|
f"Timestamp: {self.timestamp} | "
|
||
|
|
f"User: {self.user} | "
|
||
|
|
f"Action: {action} | "
|
||
|
|
f"Details: {details}\n"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def GetActivitiesLog(self):
|
||
|
|
logs = []
|
||
|
|
|
||
|
|
if os.path.exists(self.filepath):
|
||
|
|
with open(self.filepath, 'r') as f:
|
||
|
|
for line in f:
|
||
|
|
parts = line.strip().split(" | ")
|
||
|
|
if len(parts) == 4:
|
||
|
|
logs.append({
|
||
|
|
"timestamp": parts[0].replace("Timestamp:", "").strip(),
|
||
|
|
"user": parts[1].replace("User:", "").strip(),
|
||
|
|
"action": parts[2].replace("Action:", "").strip(),
|
||
|
|
"details": parts[3].replace("Details:", "").strip()
|
||
|
|
})
|
||
|
|
return logs
|
||
|
|
|
||
|
|
def GetFilteredActivitiesLog(self, startDate, endDate, userName):
|
||
|
|
|
||
|
|
filtered_logs = self.GetActivitiesLog()
|
||
|
|
|
||
|
|
# Date filter
|
||
|
|
if startDate or endDate:
|
||
|
|
try:
|
||
|
|
start_dt = datetime.strptime(startDate, "%Y-%m-%d") if startDate else datetime.min
|
||
|
|
end_dt = datetime.strptime(endDate, "%Y-%m-%d") if endDate else datetime.max
|
||
|
|
|
||
|
|
|
||
|
|
filtered_logs = [
|
||
|
|
log for log in filtered_logs
|
||
|
|
if start_dt <= datetime.strptime(log["timestamp"], "%Y-%m-%d %H:%M:%S") <= end_dt
|
||
|
|
]
|
||
|
|
|
||
|
|
|
||
|
|
except Exception as e:
|
||
|
|
print("Date filter error:", e)
|
||
|
|
#Why catching all exceptions? Need to handle specific exceptions
|
||
|
|
|
||
|
|
# Username filter
|
||
|
|
if userName:
|
||
|
|
filtered_logs = [log for log in filtered_logs if userName.lower() in log["user"].lower()]
|
||
|
|
|
||
|
|
return filtered_logs
|