105 lines
3.6 KiB
Python
105 lines
3.6 KiB
Python
import os
|
|
from datetime import datetime
|
|
from flask import current_app
|
|
from flask_login import current_user
|
|
|
|
|
|
class LogHelper:
|
|
@staticmethod
|
|
def log_action(action, details=""):
|
|
"""Add a log entry."""
|
|
log_data = LogData()
|
|
log_data.add_log(action, details)
|
|
|
|
|
|
class LogData:
|
|
|
|
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")
|
|
self.user = getattr(current_user, "cn", None) \
|
|
or getattr(current_user, "username", None) \
|
|
or getattr(current_user, "sAMAccountName", "Unknown")
|
|
|
|
|
|
def add_log(self, action, details=""):
|
|
"""Create/Add a log entry."""
|
|
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 get_all_logs(self):
|
|
"""Read all logs."""
|
|
logs = []
|
|
if os.path.exists(self.filepath):
|
|
with open(self.filepath, 'r', encoding="utf-8") as f:
|
|
for line in f:
|
|
parts = line.strip().split(" | ")
|
|
if len(parts) == 4:
|
|
logs.append({
|
|
"timestamp": parts[0].split(":", 1)[1].strip(),
|
|
"user": parts[1].split(":", 1)[1].strip(),
|
|
"action": parts[2].split(":", 1)[1].strip(),
|
|
"details": parts[3].split(":", 1)[1].strip()
|
|
})
|
|
return logs
|
|
|
|
def get_filtered_logs(self, start_date=None, end_date=None, user_name=None):
|
|
"""Filter logs by date and/or user."""
|
|
logs = self.get_all_logs()
|
|
|
|
# Filter by date
|
|
if start_date or end_date:
|
|
start_dt = datetime.strptime(start_date, "%Y-%m-%d") if start_date else datetime.min
|
|
end_dt = datetime.strptime(end_date, "%Y-%m-%d") if end_date else datetime.max
|
|
logs = [
|
|
log for log in logs
|
|
if start_dt <= datetime.strptime(log["timestamp"], "%Y-%m-%d %H:%M:%S") <= end_dt
|
|
]
|
|
|
|
# Filter by username
|
|
if user_name:
|
|
logs = [log for log in logs if user_name.lower() in log.get("user", "").lower()]
|
|
|
|
return logs
|
|
|
|
def update_log(self, index, action=None, details=None):
|
|
"""Update a specific log entry by index (0-based)."""
|
|
logs = self.get_all_logs()
|
|
if 0 <= index < len(logs):
|
|
if action:
|
|
logs[index]["action"] = action
|
|
if details:
|
|
logs[index]["details"] = details
|
|
self._rewrite_logs_file(logs)
|
|
return True
|
|
return False
|
|
|
|
def delete_log(self, index):
|
|
"""Delete a specific log entry by index (0-based)."""
|
|
logs = self.get_all_logs()
|
|
if 0 <= index < len(logs):
|
|
logs.pop(index)
|
|
self._rewrite_logs_file(logs)
|
|
return True
|
|
return False
|
|
|
|
# ------------------- INTERNAL HELPER -------------------
|
|
|
|
def _rewrite_logs_file(self, logs):
|
|
"""Overwrite the log file with current logs."""
|
|
with open(self.filepath, "w", encoding="utf-8") as f:
|
|
for log in logs:
|
|
f.write(
|
|
f"Timestamp: {log['timestamp']} | "
|
|
f"User: {log['user']} | "
|
|
f"Action: {log['action']} | "
|
|
f"Details: {log['details']}\n"
|
|
)
|
|
|
|
|