dhruv575
greedy
bacb197
from bson import ObjectId
from datetime import datetime
from db import get_logs_collection
from models.user import User
from models.department import Department
class Log:
def __init__(self, user_id, department_id, log_date, log_text=None, log_file=None, incidents=None,
_id=None, created_at=None, updated_at=None):
self.user_id = user_id
self.department_id = department_id
self.log_date = log_date
self.log_text = log_text # Extracted text content from the log
self.log_file = log_file # For backward compatibility
self.incidents = incidents or [] # Array of incident IDs
self._id = _id
self.created_at = created_at or datetime.now()
self.updated_at = updated_at or datetime.now()
def to_dict(self):
"""Convert instance to dictionary"""
log_dict = {
"user_id": str(self.user_id) if self.user_id else None,
"department_id": str(self.department_id) if self.department_id else None,
"log_date": self.log_date,
"log_text": self.log_text,
"log_file": self.log_file, # Keep for backward compatibility
"incidents": [str(incident_id) for incident_id in self.incidents],
"created_at": self.created_at,
"updated_at": self.updated_at
}
if self._id:
log_dict["_id"] = str(self._id)
return log_dict
@classmethod
def from_dict(cls, log_dict):
"""Create instance from dictionary"""
if "_id" in log_dict and log_dict["_id"]:
log_dict["_id"] = ObjectId(log_dict["_id"]) if isinstance(log_dict["_id"], str) else log_dict["_id"]
if "user_id" in log_dict and log_dict["user_id"]:
log_dict["user_id"] = ObjectId(log_dict["user_id"]) if isinstance(log_dict["user_id"], str) else log_dict["user_id"]
if "department_id" in log_dict and log_dict["department_id"]:
log_dict["department_id"] = ObjectId(log_dict["department_id"]) if isinstance(log_dict["department_id"], str) else log_dict["department_id"]
# Convert string IDs to ObjectIds for incidents
if "incidents" in log_dict and log_dict["incidents"]:
log_dict["incidents"] = [ObjectId(incident_id) if isinstance(incident_id, str) else incident_id for incident_id in log_dict["incidents"]]
return cls(**log_dict)
def save(self):
"""Save log to database"""
logs_collection = get_logs_collection()
log_dict = self.to_dict()
if self._id:
# Update existing log
log_dict["updated_at"] = datetime.now()
if "_id" in log_dict:
del log_dict["_id"]
result = logs_collection.update_one(
{"_id": ObjectId(self._id)},
{"$set": log_dict}
)
success = result.modified_count > 0
else:
# Insert new log
log_dict["created_at"] = datetime.now()
log_dict["updated_at"] = datetime.now()
result = logs_collection.insert_one(log_dict)
self._id = result.inserted_id
success = result.acknowledged
# Update user's logs if successful
if success and self.user_id:
user = User.find_by_id(self.user_id)
if user:
user.add_log(self._id)
return success
@classmethod
def find_by_id(cls, log_id):
"""Find log by ID"""
logs_collection = get_logs_collection()
log_data = logs_collection.find_one({"_id": ObjectId(log_id)})
if log_data:
return cls.from_dict(log_data)
return None
@classmethod
def find_by_user(cls, user_id):
"""Find all logs for a user"""
logs_collection = get_logs_collection()
logs_data = logs_collection.find({"user_id": ObjectId(user_id)})
return [cls.from_dict(log_data) for log_data in logs_data]
@classmethod
def find_by_department(cls, department_id):
"""Find all logs for a department"""
logs_collection = get_logs_collection()
logs_data = logs_collection.find({"department_id": ObjectId(department_id)})
return [cls.from_dict(log_data) for log_data in logs_data]
@classmethod
def find_by_date_range(cls, department_id, start_date, end_date):
"""Find logs by date range for a department"""
logs_collection = get_logs_collection()
query = {
"department_id": ObjectId(department_id),
"log_date": {"$gte": start_date, "$lte": end_date}
}
logs_data = logs_collection.find(query).sort("log_date", -1)
return [cls.from_dict(log_data) for log_data in logs_data]
def delete(self):
"""Delete log from database"""
if not self._id:
return False
# Remove log reference from user if it exists
if self.user_id:
user = User.find_by_id(self.user_id)
if user and self._id in user.logs:
user.logs.remove(self._id)
user.save()
logs_collection = get_logs_collection()
result = logs_collection.delete_one({"_id": ObjectId(self._id)})
return result.deleted_count > 0
def add_incident(self, incident_id):
"""Add an incident to this log"""
if incident_id not in self.incidents:
self.incidents.append(ObjectId(incident_id))
return self.save()
return True