The new updates of partners and user
Made-with: Cursor
This commit is contained in:
0
eventify_logger/__init__.py
Normal file
0
eventify_logger/__init__.py
Normal file
10
eventify_logger/admin.py
Normal file
10
eventify_logger/admin.py
Normal file
@@ -0,0 +1,10 @@
|
||||
from django.contrib import admin
|
||||
from .models import EventifyLogger
|
||||
|
||||
|
||||
@admin.register(EventifyLogger)
|
||||
class EventifyLoggerAdmin(admin.ModelAdmin):
|
||||
list_display = ("logger_type", "logger_message", "logged_user", "logger_created_at")
|
||||
list_filter = ("logger_type", "logger_created_at")
|
||||
search_fields = ("logger_message",)
|
||||
readonly_fields = ("logger_created_at",)
|
||||
6
eventify_logger/apps.py
Normal file
6
eventify_logger/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class EventifyLoggerConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'eventify_logger'
|
||||
28
eventify_logger/middleware.py
Normal file
28
eventify_logger/middleware.py
Normal file
@@ -0,0 +1,28 @@
|
||||
"""
|
||||
Request logging middleware - logs every HTTP request to EventifyLogger.
|
||||
"""
|
||||
from eventify_logger.services import log
|
||||
|
||||
|
||||
class EventifyLoggingMiddleware:
|
||||
"""Log each request (method, path, status) after response."""
|
||||
|
||||
def __init__(self, get_response):
|
||||
self.get_response = get_response
|
||||
|
||||
def __call__(self, request):
|
||||
response = self.get_response(request)
|
||||
try:
|
||||
status = getattr(response, "status_code", 0)
|
||||
if 500 <= status < 600:
|
||||
logger_type = "error"
|
||||
elif 400 <= status < 500:
|
||||
logger_type = "warning"
|
||||
else:
|
||||
logger_type = "info"
|
||||
message = f"{request.method} {request.path} -> {status}"
|
||||
logger_data = {"path": request.path, "method": request.method, "status_code": status}
|
||||
log(logger_type=logger_type, logger_message=message, request=request, logger_data=logger_data)
|
||||
except Exception:
|
||||
pass
|
||||
return response
|
||||
31
eventify_logger/migrations/0001_initial.py
Normal file
31
eventify_logger/migrations/0001_initial.py
Normal file
@@ -0,0 +1,31 @@
|
||||
# Generated by Django 4.2.27 on 2026-03-09 04:26
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='EventifyLogger',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('logger_type', models.CharField(choices=[('info', 'Info'), ('warning', 'Warning'), ('error', 'Error'), ('critical', 'Critical')], max_length=250)),
|
||||
('logger_message', models.TextField()),
|
||||
('logger_data', models.TextField(blank=True, null=True)),
|
||||
('logger_created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('logged_ip_address', models.GenericIPAddressField(blank=True, null=True)),
|
||||
('logged_user_device', models.CharField(blank=True, max_length=250, null=True)),
|
||||
('logged_user_browser', models.CharField(blank=True, max_length=250, null=True)),
|
||||
('logged_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
]
|
||||
0
eventify_logger/migrations/__init__.py
Normal file
0
eventify_logger/migrations/__init__.py
Normal file
27
eventify_logger/models.py
Normal file
27
eventify_logger/models.py
Normal file
@@ -0,0 +1,27 @@
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
|
||||
|
||||
class EventifyLogger(models.Model):
|
||||
logger_type = models.CharField(max_length=250, choices=[
|
||||
('info', 'Info'),
|
||||
('warning', 'Warning'),
|
||||
('error', 'Error'),
|
||||
('critical', 'Critical'),
|
||||
])
|
||||
logger_message = models.TextField()
|
||||
logger_data = models.TextField(blank=True, null=True)
|
||||
logger_created_at = models.DateTimeField(auto_now_add=True)
|
||||
logged_user = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
on_delete=models.SET_NULL,
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
logged_ip_address = models.GenericIPAddressField(blank=True, null=True)
|
||||
logged_user_device = models.CharField(max_length=250, blank=True, null=True)
|
||||
logged_user_browser = models.CharField(max_length=250, blank=True, null=True)
|
||||
|
||||
def __str__(self):
|
||||
user_str = str(self.logged_user) if self.logged_user else "anonymous"
|
||||
return f"{user_str}-{self.logger_type} - {self.logger_message}"
|
||||
58
eventify_logger/services.py
Normal file
58
eventify_logger/services.py
Normal file
@@ -0,0 +1,58 @@
|
||||
"""
|
||||
Central logging service for EventifyLogger.
|
||||
"""
|
||||
import json
|
||||
|
||||
from eventify_logger.models import EventifyLogger
|
||||
|
||||
|
||||
def _get_client_ip(request):
|
||||
"""Extract client IP from request."""
|
||||
if not request:
|
||||
return None
|
||||
x_forwarded = request.META.get("HTTP_X_FORWARDED_FOR")
|
||||
if x_forwarded:
|
||||
return x_forwarded.split(",")[0].strip() or None
|
||||
return request.META.get("REMOTE_ADDR")
|
||||
|
||||
|
||||
def _get_user_agent(request):
|
||||
"""Extract User-Agent from request."""
|
||||
if not request:
|
||||
return None
|
||||
return request.META.get("HTTP_USER_AGENT", "")
|
||||
|
||||
|
||||
def log(logger_type, logger_message, request=None, user=None, logger_data=None):
|
||||
"""
|
||||
Create an EventifyLogger record.
|
||||
|
||||
Args:
|
||||
logger_type: 'info' | 'warning' | 'error' | 'critical'
|
||||
logger_message: str
|
||||
request: optional HttpRequest (used for IP, user-agent, user if not provided)
|
||||
user: optional User (overrides request.user)
|
||||
logger_data: optional str or dict (dict will be JSON-serialized)
|
||||
"""
|
||||
try:
|
||||
resolved_user = user
|
||||
if resolved_user is None and request and hasattr(request, "user"):
|
||||
resolved_user = getattr(request.user, "is_authenticated", False) and request.user or None
|
||||
|
||||
ip_address = _get_client_ip(request) if request else None
|
||||
user_agent = _get_user_agent(request) if request else None
|
||||
|
||||
if isinstance(logger_data, dict):
|
||||
logger_data = json.dumps(logger_data)
|
||||
|
||||
EventifyLogger.objects.create(
|
||||
logger_type=logger_type,
|
||||
logger_message=str(logger_message)[:10000], # cap message length
|
||||
logger_data=logger_data[:10000] if logger_data else None, # cap data length
|
||||
logged_user=resolved_user,
|
||||
logged_ip_address=ip_address,
|
||||
logged_user_device=None, # defer UA parsing
|
||||
logged_user_browser=user_agent[:250] if user_agent else None,
|
||||
)
|
||||
except Exception:
|
||||
pass # Never let logging break the app
|
||||
3
eventify_logger/tests.py
Normal file
3
eventify_logger/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
3
eventify_logger/views.py
Normal file
3
eventify_logger/views.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
Reference in New Issue
Block a user