From be037e7fa6f1fa05f26a0f00ee10f1f01a42a745 Mon Sep 17 00:00:00 2001 From: Faheedkhan Date: Tue, 3 Jun 2025 21:03:32 +0300 Subject: [PATCH] audit logs --- inventory/urls.py | 5 ++ inventory/views.py | 44 +++++++++++++ requirements_dev.txt | 1 + .../admin_management/audit_log_dashboard.html | 65 +++++++++++++++++++ templates/admin_management/auth_logs.html | 29 +++++++++ templates/admin_management/management.html | 33 ++++++---- templates/admin_management/model_logs.html | 37 +++++++++++ templates/admin_management/request_logs.html | 29 +++++++++ 8 files changed, 232 insertions(+), 11 deletions(-) create mode 100644 templates/admin_management/audit_log_dashboard.html create mode 100644 templates/admin_management/auth_logs.html create mode 100644 templates/admin_management/model_logs.html create mode 100644 templates/admin_management/request_logs.html diff --git a/inventory/urls.py b/inventory/urls.py index 8bfb3027..ef377182 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -809,6 +809,11 @@ 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'), + ] diff --git a/inventory/views.py b/inventory/views.py index d684aeee..0ffff3d1 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -60,6 +60,7 @@ from django.views.generic import ( ArchiveIndexView, ) + # Django Ledger from django_ledger.io import roles from django_ledger.utils import accruable_net_summary @@ -149,6 +150,8 @@ 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__) @@ -8249,6 +8252,47 @@ 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 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_queryset(self): + # The field name in RequestEvent is 'datetime', not 'created' + return RequestEvent.objects.all().order_by('-datetime') + +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_queryset(self): + # The field name in CRUDEvent is 'datetime', not 'created' + return CRUDEvent.objects.all().order_by('-datetime') + +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') + + def activate_account(request, content_type, slug): try: diff --git a/requirements_dev.txt b/requirements_dev.txt index fd0f3c41..841e904f 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -94,3 +94,4 @@ urllib3==2.3.0 wcwidth==0.2.13 langchain langchain_ollama +django-easy-audit==1.3.7 \ No newline at end of file diff --git a/templates/admin_management/audit_log_dashboard.html b/templates/admin_management/audit_log_dashboard.html new file mode 100644 index 00000000..3a56fac0 --- /dev/null +++ b/templates/admin_management/audit_log_dashboard.html @@ -0,0 +1,65 @@ +{% extends "base.html" %} +{% load i18n custom_filters %} +{% block title %}{% trans "Accounts" %}{% endblock title %} +{% block accounts %} + + {% trans "Accounts"|capfirst %} + (current) + +{% endblock %} +{% block content %} +
+
+

{% trans "Audit Log Management" %}

+
+ + +
+ + +
+ +
+ {% include "partials/search_box.html" %} + {% include "admin_management/model_logs.html" %} + +
+ + +
+ {% include "partials/search_box.html" %} + {% include "admin_management/auth_logs.html" %} + +
+ + +
+ {% include "partials/search_box.html" %} + {% include "admin_management/request_logs.html" %} +
+ + +
+
+
+ + +{% endblock %} + diff --git a/templates/admin_management/auth_logs.html b/templates/admin_management/auth_logs.html new file mode 100644 index 00000000..cc999364 --- /dev/null +++ b/templates/admin_management/auth_logs.html @@ -0,0 +1,29 @@ + + {% 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 }}
+ {% else %} +

No authentication audit events found.

+ {% endif %} + + \ No newline at end of file diff --git a/templates/admin_management/management.html b/templates/admin_management/management.html index 8ce5ecff..dfb3a7df 100644 --- a/templates/admin_management/management.html +++ b/templates/admin_management/management.html @@ -2,17 +2,28 @@ {% load i18n %} {%block title%} {%trans 'Admin Management' %} {%endblock%} {% block content %} -

{{ _("Admin Management")}}

- + + {% endblock content %} \ No newline at end of file diff --git a/templates/admin_management/model_logs.html b/templates/admin_management/model_logs.html new file mode 100644 index 00000000..3e754c2d --- /dev/null +++ b/templates/admin_management/model_logs.html @@ -0,0 +1,37 @@ + + {% if model_events %} + + + + + + + + + + {# Added for object representation #} + + + + {% for event in model_events %} + + {# Corrected field name #} + + + {# Model name #} + {# Object ID #} + + {# Object representation #} + + {% endfor %} + +
TimestampUserActionModelObject IDChangesObject Repr
{{ event.datetime }}{{ 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 }}
+ {% else %} + N/A + {% endif %} +
{{ event.object_repr }}
+ {% else %} +

No model change audit events found.

+ {% endif %} diff --git a/templates/admin_management/request_logs.html b/templates/admin_management/request_logs.html new file mode 100644 index 00000000..c9d6ba25 --- /dev/null +++ b/templates/admin_management/request_logs.html @@ -0,0 +1,29 @@ + + {% 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 }}
+ {% else %} +

No request audit events found.

+ {% endif %}