diff --git a/hotels/models.py b/hotels/models.py index ac8453df..4ec5260e 100644 --- a/hotels/models.py +++ b/hotels/models.py @@ -2,22 +2,33 @@ from django.db import models from users.models import User class Hotel(models.Model): - name = models.CharField(max_length=255, verbose_name="Hotel Name") + name = models.CharField(max_length=255, verbose_name="Название отеля") pms_type = models.CharField( max_length=50, choices=[('bnovo', 'Bnovo'), ('travelline', 'Travel Line')], - verbose_name="PMS Type" + verbose_name="PMS система" ) - api_key = models.CharField(max_length=255, blank=True, null=True, verbose_name="API Key") - public_key = models.CharField(max_length=255, blank=True, null=True, verbose_name="Public Key") - created_at = models.DateTimeField(auto_now_add=True, verbose_name="Created At") + api_key = models.CharField(max_length=255, blank=True, null=True, verbose_name="API ключ") + public_key = models.CharField(max_length=255, blank=True, null=True, verbose_name="Публичный ключ") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="Создан") def __str__(self): return self.name - + + class Meta: + verbose_name = "Отель" + verbose_name_plural = "Отели" + + + class UserHotel(models.Model): - user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="User") - hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, verbose_name="Hotel") + user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Пользователь") + hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE, verbose_name="Отель") def __str__(self): - return f"{self.user.username} - {self.hotel.name}" \ No newline at end of file + return f"{self.user.username} - {self.hotel.name}" + + class Meta: + verbose_name = "Пользователь отеля" + verbose_name_plural = "Пользователи отелей" + \ No newline at end of file diff --git a/touchh/settings.py b/touchh/settings.py index b0da927e..2fe74df6 100644 --- a/touchh/settings.py +++ b/touchh/settings.py @@ -87,10 +87,17 @@ DATABASES = { 'wordpress': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'u1510415_wp832', +<<<<<<< HEAD 'USER': 'root', 'PASSWORD': 'R0sebud', 'HOST': '0.0.0.0', 'PORT': '3308', +======= + 'USER': 'u1510415_wp832', + 'PASSWORD': 'yZ1gV6kH6lzD2cQ3', + 'HOST': 'server231.hosting.reg.ru', + 'PORT': '3306', +>>>>>>> cea14d40d73e3a67c30dda8765458d91652e6bf4 }, } # Password validation diff --git a/users/admin.py b/users/admin.py index 3d03faec..ba22a3e0 100644 --- a/users/admin.py +++ b/users/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import User, UserConfirmation +from .models import User, UserConfirmation, UserActivityLog @admin.register(User) class UserAdmin(admin.ModelAdmin): @@ -13,3 +13,11 @@ class UserConfirmationAdmin(admin.ModelAdmin): list_display = ('user', 'confirmation_code', 'created_at') search_fields = ('user__username', 'confirmation_code') list_filter = ('created_at',) + +@admin.register(UserActivityLog) +class UserActivityLogAdmin(admin.ModelAdmin): + list_display = ( 'id', 'user_id', 'ip', 'timestamp', 'date_time', 'agent', 'platform', 'version', 'model', 'device', 'UAString', 'location', 'page_id', 'url_parameters', 'page_title', 'type', 'last_counter', 'hits', 'honeypot', 'reply', 'page_url') + search_fields = ('user_id', 'ip', 'datetime', 'agent', 'platform', 'version', 'model', 'device', 'UAString', 'location', 'page_id', 'url_parameters', 'page_title', 'type', 'last_counter', 'hits', 'honeypot', 'reply', 'page_url') + list_filter = ('page_title', 'user_id', 'ip') + ordering = ('-id',) + \ No newline at end of file diff --git a/users/management/commands/sync_activity_log.py b/users/management/commands/sync_activity_log.py deleted file mode 100644 index 97cc8235..00000000 --- a/users/management/commands/sync_activity_log.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.core.management.base import BaseCommand -from users.models import WordPressUserActivityLog -from users.models import LocalUserActivityLog -from asgiref.sync import sync_to_async - -class Command(BaseCommand): - help = "Синхронизация данных из WordPress в локальную базу данных" - - def handle(self, *args, **kwargs): - self.stdout.write("Начало синхронизации данных...") - try: - # Получаем данные из WordPress - wordpress_logs = WordPressUserActivityLog.objects.using('wordpress').all() - - for log in wordpress_logs: - # Сохраняем данные в локальную базу - LocalUserActivityLog.objects.update_or_create( - id=log.id, # Используем уникальный идентификатор - defaults={ - 'user_id': log.user_id, - 'activity_type': log.activity_type, - 'timestamp': log.timestamp, - 'additional_data': log.additional_data, - }, - ) - - self.stdout.write(self.style.SUCCESS("Синхронизация завершена успешно!")) - except Exception as e: - self.stderr.write(self.style.ERROR(f"Ошибка синхронизации: {str(e)}")) diff --git a/users/models.py b/users/models.py index dd32d1fd..10f06e79 100644 --- a/users/models.py +++ b/users/models.py @@ -4,29 +4,29 @@ import uuid class User(AbstractUser): TELEGRAM_ROLES = [ - ('admin', 'Administrator'), - ('hotel_user', 'Hotel User'), + ('admin', 'Администратор системы'), + ('hotel_user', 'Сотрудник отеля'), ] telegram_id = models.BigIntegerField( unique=True, null=True, blank=True, - verbose_name="Telegram ID" + verbose_name="ID Телеграм" ) chat_id = models.BigIntegerField( unique=True, null=True, blank=True, - verbose_name="Chat ID" + verbose_name="ID чата в телеграм" ) role = models.CharField( max_length=20, choices=TELEGRAM_ROLES, default='hotel_user', - verbose_name="Role" + verbose_name="Роль" ) - confirmed = models.BooleanField(default=False, verbose_name="Confirmed") + confirmed = models.BooleanField(default=False, verbose_name="Подтвержден") groups = models.ManyToManyField( 'auth.Group', @@ -41,15 +41,24 @@ class User(AbstractUser): def __str__(self): return self.username or f"Telegram User {self.telegram_id}" - + + class Meta: + verbose_name = "Пользователь" + verbose_name_plural = "Пользователи" + + class UserConfirmation(models.Model): - user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="User") - confirmation_code = models.UUIDField(default=uuid.uuid4, verbose_name="Confirmation Code") - created_at = models.DateTimeField(auto_now_add=True, verbose_name="Created At") + user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Пользователь") + confirmation_code = models.UUIDField(default=uuid.uuid4, verbose_name="Код подтверждения") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="Создан: ") def __str__(self): return f"Confirmation for {self.user.username} - {self.confirmation_code}" + class Meta: + verbose_name = "Подтверждение пользователя" + verbose_name_plural = "Подтверждения пользователей" + class WordPressUserActivityLog(models.Model): id = models.AutoField(primary_key=True) user_id = models.IntegerField() @@ -70,4 +79,37 @@ class LocalUserActivityLog(models.Model): additional_data = models.JSONField(null=True, blank=True) def __str__(self): - return f"User {self.user_id} - {self.activity_type}" \ No newline at end of file + return f"User {self.user_id} - {self.activity_type}" + +class UserActivityLog(models.Model): + id = models.BigAutoField(primary_key=True, verbose_name="ID") + user_id = models.BigIntegerField( verbose_name="ID пользователя") + ip = models.CharField(max_length=100, null=True, blank=True, verbose_name="IP адрес") + created = models.DateTimeField(auto_now_add=True, verbose_name="Создан") + timestamp = models.IntegerField(verbose_name="Время") + date_time = models.DateTimeField(verbose_name="Дата") + referred = models.CharField(max_length=255, null=True, blank=True) + agent = models.CharField(max_length=255, null=True, blank=True, verbose_name="Браузер") + platform = models.CharField(max_length=255, null=True, blank=True) + version = models.CharField(max_length=50, null=True, blank=True) + model = models.CharField(max_length=255, null=True, blank=True) + device = models.CharField(max_length=50, null=True, blank=True) + UAString = models.TextField(null=True, blank=True) + location = models.CharField(max_length=255, null=True, blank=True) + page_id = models.BigIntegerField(null=True, blank=True) + url_parameters = models.TextField(null=True, blank=True) + page_title = models.CharField(max_length=255, null=True, blank=True) + type = models.CharField(max_length=50, null=True, blank=True) + last_counter = models.IntegerField(null=True, blank=True) + hits = models.IntegerField(null=True, blank=True) + honeypot = models.BooleanField(null=True, blank=True) + reply = models.BooleanField(null=True, blank=True) + page_url = models.CharField(max_length=255, null=True, blank=True) + + class Meta: + db_table = 'user_activity_log' # Название таблицы в локальной базе + verbose_name = 'Журнал активности' + verbose_name_plural = 'Журналы активности' + + def __str__(self): + return f"User {self.user_id} - {self.type} - {self.date_time}" \ No newline at end of file