diff --git a/inventory/urls.py b/inventory/urls.py index ef377182..e2204c90 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -809,10 +809,8 @@ path( path('management/user_management/', views.user_management, name='user_management'), path('management///activate_account/', views.activate_account, name='activate_account'), path('management///permenant_delete_account/', views.permenant_delete_account, name='permenant_delete_account'), - path('management/audit_log_management/', views.audit_log_management, name='audit_log_management'), - path('management/audit_log_management/modellogs', views.ModelLogListView.as_view(), name='modellogs_list'), - path('management/audit_log_management/authlogs', views.RequestLogListView.as_view(), name='authlogs_list'), - path('management/audit_log_management/requestlogs', views. AuthLogListView.as_view(), name='requestlogs_list'), + path('management/audit_log_dashboard/', views.AuditLogDashboardView.as_view(), name='audit_log_dashboard'), + ] diff --git a/inventory/views.py b/inventory/views.py index 0ffff3d1..b9c066ea 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -150,10 +150,12 @@ from .utils import ( CarTransfer, ) from .tasks import create_accounts_for_make, send_email + #djago easy audit log from easyaudit.models import RequestEvent, CRUDEvent, LoginEvent + logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) @@ -8253,44 +8255,79 @@ def user_management(request): return render(request, "admin_management/user_management.html", context) #audit log Management -def audit_log_management(request): - return render(request, "admin_management/audit_log_lists.html") -#audit logs views +# class AuditLogDashboardView(TemplateView): +# """ +# Displays a dashboard with tabs for different audit log types. +# Fetches all necessary log data to pass to the template. +# """ +# template_name = 'admin_management/audit_log_dashboard.html' # Name of your main template with tabs -class RequestLogListView(ListView): - """Displays a list of RequestEvents.""" - model = RequestEvent - template_name = 'admin_management/request_logs.html' - context_object_name = 'request_events' - paginate_by = 20 +# def get_context_data(self, **kwargs): +# context = super().get_context_data(**kwargs) + +# # Fetch data for each log type +# # Order by 'datetime' field as per easy_audit models +# context['model_events'] = CRUDEvent.objects.all().order_by('-datetime') +# context['auth_events'] = LoginEvent.objects.all().order_by('-datetime') +# context['request_events'] = RequestEvent.objects.all().order_by('-datetime') +# return context + - def get_queryset(self): - # The field name in RequestEvent is 'datetime', not 'created' - return RequestEvent.objects.all().order_by('-datetime') +class AuditLogDashboardView(TemplateView): + template_name = 'admin_management/audit_log_dashboard.html' + -class ModelLogListView(ListView): - """Displays a list of CRUDEvents (model changes).""" - # Corrected: Use CRUDEvent model - model = CRUDEvent - template_name = 'admin_management/model_logs.html' - context_object_name = 'model_events' - paginate_by = 20 + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) - def get_queryset(self): - # The field name in CRUDEvent is 'datetime', not 'created' - return CRUDEvent.objects.all().order_by('-datetime') + # Process CRUD (Model Change) Events + model_events_raw = CRUDEvent.objects.all().order_by('-datetime') + processed_model_events = [] + + for event in model_events_raw: + # Create a base dictionary for each event's data + event_data = { + 'datetime': event.datetime, + 'user': event.user, + 'event_type_display': event.get_event_type_display(), + 'model_name': event.content_type.model, + 'object_id': event.object_id, + 'object_repr': event.object_repr, + 'field_changes': [] # This will be a list of dicts: [{'field': 'name', 'old': 'A', 'new': 'B'}] + } + + if event.changed_fields: + try: + changes = json.loads(event.changed_fields) + for field_name, values in changes.items(): + # Ensure values are lists and have at least two elements + old_value = values[0] if isinstance(values, list) and len(values) > 0 else None + new_value = values[1] if isinstance(values, list) and len(values) > 1 else None + + # Store each field change as a separate entry + event_data['field_changes'].append({ + 'field': field_name, + 'old': old_value, + 'new': new_value + }) + except json.JSONDecodeError: + # Handle invalid JSON; you might log this error + event_data['field_changes'].append({ + 'field': 'Error', + 'old': '', + 'new': 'Invalid JSON in changed_fields' + }) + + processed_model_events.append(event_data) + + context['model_events'] = processed_model_events + context['auth_events'] = LoginEvent.objects.all().order_by('-datetime') + context['request_events'] = RequestEvent.objects.all().order_by('-datetime') + + return context -class AuthLogListView(ListView): - """Displays a list of LoginEvents (authentication events).""" - model = LoginEvent - template_name = 'admin_management/auth_logs.html' - context_object_name = 'auth_events' - paginate_by = 20 - def get_queryset(self): - # The field name in LoginEvent is 'datetime', not 'created' - return LoginEvent.objects.all().order_by('-datetime') diff --git a/templates/admin_management/audit_log_dashboard.html b/templates/admin_management/audit_log_dashboard.html index 3a56fac0..dc60561b 100644 --- a/templates/admin_management/audit_log_dashboard.html +++ b/templates/admin_management/audit_log_dashboard.html @@ -9,6 +9,7 @@ {% endblock %} {% block content %}
+

{% trans "Audit Log Management" %}

@@ -50,12 +51,14 @@
-
+ {% comment %}
{% include "partials/search_box.html" %} {% include "admin_management/request_logs.html" %} -
- +
{% endcomment %} +
+

Hello from Request Logs tab!

+
diff --git a/templates/admin_management/auth_logs.html b/templates/admin_management/auth_logs.html index cc999364..051c48ab 100644 --- a/templates/admin_management/auth_logs.html +++ b/templates/admin_management/auth_logs.html @@ -1,29 +1,33 @@ - - {% if auth_events %} - - - - - - - {# Added username field #} - - - - - {% for event in auth_events %} - - {# Corrected field name #} - - {# Corrected: get_login_type_display #} - {# Added username field #} - {# Corrected field name #} - - {% endfor %} - -
TimestampUserEvent TypeUsernameIP Address
{{ event.datetime }}{{ event.user.username|default:"N/A" }}{{ event.get_login_type_display }}{{ event.username }}{{ event.remote_ip }}
+{% load i18n custom_filters %} + {% if auth_events %} +
+ + + + + + + + + + + + {% for event in auth_events %} + + + + + + + + + + {% endfor %} + +
{{ _("Timestamp") |capfirst }}{{ _("User") |capfirst }}{{ _("Event Type") }}{{ _("username") |capfirst }}{{ _("IP Address") |capfirst }}
{{event.datetime}}{{ event.user.username|default:"N/A" }}{{ event.get_login_type_display}}{{ event.username}}{{ event.remote_ip}}
+ {% else %}

No authentication audit events found.

{% endif %} - - \ No newline at end of file + + \ No newline at end of file diff --git a/templates/admin_management/management.html b/templates/admin_management/management.html index dfb3a7df..688d9473 100644 --- a/templates/admin_management/management.html +++ b/templates/admin_management/management.html @@ -14,10 +14,10 @@
- +
-
{{ _("Audit Log Management")}}
+
{{ _("Audit Log Dashboard")}}
diff --git a/templates/admin_management/model_logs.html b/templates/admin_management/model_logs.html index 3e754c2d..0efbd60d 100644 --- a/templates/admin_management/model_logs.html +++ b/templates/admin_management/model_logs.html @@ -1,37 +1,94 @@ +{% load i18n custom_filters %} - {% if model_events %} - - - - - - - - - - {# Added for object representation #} - - - - {% for event in model_events %} +{% if model_events %} +
+
TimestampUserActionModelObject IDChangesObject Repr
+ + + + + + + + + {# Dedicated column for field name #} + {# Dedicated column for old value #} + {# Dedicated column for new value #} + + + + {% for event in model_events %} + {% if event.field_changes %} + {# Loop through each individual field change for this event #} + {% for change in event.field_changes %} + + {# Display common event details using rowspan for the first change #} + {% if forloop.first %} + + + + + + + {% endif %} + + {# Display the specific field change details in their own columns #} + + + + + {% endfor %} + {% else %} + {# Fallback for events with no specific field changes (e.g., CREATE, DELETE) #} - {# Corrected field name #} + - - {# Model name #} - {# Object ID #} - + + + + {# Span the 'Field', 'Old Value', 'New Value' columns #} + - {# Object representation #} - {% endfor %} - -
{% trans "Timestamp" %}{% trans "User" %}{% trans "Action" %}{% trans "Model" %}{% trans "Object ID" %}{% trans "Object Representation" %}{% trans "Field" %}{% trans "Old Value" %}{% trans "New Value" %}
+ {{ event.datetime|date:"Y-m-d H:i:s" }} + + {{ event.user.username|default:"Anonymous" }} + + {{ event.event_type_display }} + + {{ event.model_name|title }} + + {{ event.object_id }} + + {{ event.object_repr }} + {{ change.field }} + {% if change.old is not None %} +
{{ change.old }}
+ {% else %} + (None) + {% endif %} +
+ {% if change.new is not None %} +
{{ change.new }}
+ {% else %} + (None) + {% endif %} +
{{ event.datetime }}{{ event.datetime|date:"Y-m-d H:i:s" }} {{ event.user.username|default:"Anonymous" }}{{ event.get_event_type_display }}{{ event.content_type.model|title }}{{ event.object_id }} - {% if event.changed_fields %} {# Corrected field name #} -
{{ event.changed_fields|safe }}
+
{{ event.event_type_display }}{{ event.model_name|title }}{{ event.object_id }}{{ event.object_repr }} + {% if event.event_type_display == "Create" %} + {% trans "Object created." %} + {% elif event.event_type_display == "Delete" %} + {% trans "Object deleted." %} {% else %} - N/A + {% trans "No specific field changes recorded." %} {% endif %} {{ event.object_repr }}
- {% else %} -

No model change audit events found.

- {% endif %} + {% endif %} + {% endfor %} + + + +
+{% else %} +

{% trans "No model change audit events found." %}

+{% endif %} + diff --git a/templates/admin_management/request_logs.html b/templates/admin_management/request_logs.html index c9d6ba25..f37462d9 100644 --- a/templates/admin_management/request_logs.html +++ b/templates/admin_management/request_logs.html @@ -1,29 +1,34 @@ - - {% if request_events %} - - - - - - {# Changed from Path to URL based on model #} - - - {# No status_code in RequestEvent model #} - - - - {% for event in request_events %} - - {# Corrected field name #} - - {# Corrected field name #} - - {# Corrected field name #} - {# Removed status_code as it's not in the model #} - - {% endfor %} - -
TimestampUserURLMethodIP Address
{{ event.datetime }}{{ event.user.username|default:"Anonymous" }}{{ event.url }}{{ event.method }}{{ event.remote_ip }}
+{% load i18n custom_filters %} + {% if request_events %} +
+ + + + + + + + + + + + {% for event in request_events %} + + + + + + + + + + {% endfor %} + +
{{ _("Timestamp") |capfirst }}{{ _("User") |capfirst }}{{ _("URL") }}{{ _("Method") |capfirst }}{{ _("IP Address") |capfirst }}
{{event.datetime}}{{ event.user.username|default:"Anonymous" }}{{ event.url }}{{ event.method}}{{ event.remote_ip}}
+
+ {% else %} -

No request audit events found.

+

No request audit events found.

{% endif %} + +