The new updates of partners and user

Made-with: Cursor
This commit is contained in:
Vivek P Prakash
2026-03-15 00:29:17 +05:30
parent 88b3aafb0b
commit c04395afc9
65 changed files with 5242 additions and 341 deletions

View File

10
eventify_logger/admin.py Normal file
View 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
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class EventifyLoggerConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'eventify_logger'

View 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

View 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)),
],
),
]

View File

27
eventify_logger/models.py Normal file
View 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}"

View 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
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

3
eventify_logger/views.py Normal file
View File

@@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.