Module antifroud added. Custom Admin template is working

This commit is contained in:
2024-12-12 22:46:19 +09:00
parent 85b4c809dd
commit 93964af71a
12 changed files with 635 additions and 6 deletions

137
antifroud/admin.py Normal file
View File

@@ -0,0 +1,137 @@
from django.contrib import admin
from .models import UserActivityLog, ExternalDBSettings, RoomDiscrepancy
from django.urls import path
from django.http import JsonResponse
from django.shortcuts import render
from .models import ExternalDBSettings
import pymysql
from django.shortcuts import redirect
from django.urls import reverse
@admin.register(ExternalDBSettings)
class ExternalDBSettingsAdmin(admin.ModelAdmin):
change_form_template = "antifroud/admin/external_db_settings_change_form.html"
def add_view(self, request, form_url='', extra_context=None):
# Создаем новую запись
new_instance = ExternalDBSettings.objects.create(
name="Новая настройка", # Задайте значение по умолчанию
host="",
port=3306,
user="",
password="",
is_active=False
)
# Перенаправляем пользователя на страницу редактирования новой записи
return redirect(reverse('admin:antifroud_externaldbsettings_change', args=(new_instance.id,)))
def get_urls(self):
urls = super().get_urls()
custom_urls = [
path(
'test-connection/',
self.admin_site.admin_view(self.test_connection),
name='test_connection',
),
path(
'fetch-tables/',
self.admin_site.admin_view(self.fetch_tables),
name='fetch_tables',
),
path(
'fetch-table-data/',
self.admin_site.admin_view(self.fetch_table_data),
name='fetch_table_data',
),
]
return custom_urls + urls
def test_connection(self, request):
db_id = request.GET.get('db_id')
if not db_id:
return JsonResponse({"status": "error", "message": "ID подключения отсутствует."}, status=400)
try:
# Получаем объект настроек подключения
db_settings = ExternalDBSettings.objects.get(id=db_id)
# Проверяем, что все необходимые поля заполнены
if not db_settings.user or not db_settings.password:
return JsonResponse({"status": "error", "message": "Имя пользователя или пароль не указаны."}, status=400)
# Проверяем подключение к базе данных
import pymysql
connection = pymysql.connect(
host=db_settings.host,
port=db_settings.port,
user=db_settings.user,
password=db_settings.password,
database=db_settings.database
)
connection.close()
return JsonResponse({"status": "success", "message": "Подключение успешно установлено."})
except ExternalDBSettings.DoesNotExist:
return JsonResponse({"status": "error", "message": "Настройки подключения не найдены."}, status=404)
except pymysql.MySQLError as e:
return JsonResponse({"status": "error", "message": f"Ошибка MySQL: {str(e)}"}, status=500)
except Exception as e:
return JsonResponse({"status": "error", "message": f"Неизвестная ошибка: {str(e)}"}, status=500)
def fetch_tables(self, request):
"""Возвращает список таблиц в базе данных."""
try:
db_id = request.GET.get('db_id')
db_settings = ExternalDBSettings.objects.get(id=db_id)
connection = pymysql.connect(
host=db_settings.host,
port=db_settings.port,
user=db_settings.user,
password=db_settings.password,
database=db_settings.database
)
cursor = connection.cursor()
cursor.execute("SHOW TABLES;")
tables = [row[0] for row in cursor.fetchall()]
connection.close()
return JsonResponse({"status": "success", "tables": tables})
except Exception as e:
return JsonResponse({"status": "error", "message": str(e)})
def fetch_table_data(self, request):
"""Возвращает первые 10 записей из выбранной таблицы."""
try:
db_id = request.GET.get('db_id')
table_name = request.GET.get('table_name')
db_settings = ExternalDBSettings.objects.get(id=db_id)
connection = pymysql.connect(
host=db_settings.host,
port=db_settings.port,
user=db_settings.user,
password=db_settings.password,
database=db_settings.database
)
cursor = connection.cursor()
cursor.execute(f"SELECT * FROM `{table_name}` LIMIT 10;")
columns = [desc[0] for desc in cursor.description]
rows = cursor.fetchall()
connection.close()
return JsonResponse({"status": "success", "columns": columns, "rows": rows})
except Exception as e:
return JsonResponse({"status": "error", "message": str(e)})
@admin.register(UserActivityLog)
class UserActivityLogAdmin(admin.ModelAdmin):
list_display = ("id", "user_id", "ip", "created", "page_title", "type", "hits")
search_fields = ("user_id", "ip", "page_title")
list_filter = ("type", "created")
readonly_fields = ("created", "timestamp")
@admin.register(RoomDiscrepancy)
class RoomDiscrepancyAdmin(admin.ModelAdmin):
list_display = ("hotel", "room_number", "booking_id", "check_in_date_expected", "check_in_date_actual", "discrepancy_type", "created_at")
search_fields = ("hotel__name", "room_number", "booking_id")
list_filter = ("discrepancy_type", "created_at")
readonly_fields = ("created_at",)