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" )