/
kreyndelHam
/
Konstructorium
Обзор
Документация
Войти
/
kreyndelHam
/
Konstructorium
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
Безопасность
dev
admin_service/admin_app/models.py
127 строк
5 KB
MihahamYT
New models added
25 май 2026, 17:43
25 май 2026, 17:43
1d72a4d
Код
Авторство
О чём код?
"""Admin-only domain models for notifications and seller requests.""" from django.db import models from django.contrib.auth import get_user_model User = get_user_model() class SellerStatusRequest(models.Model): """Notification model for seller status requests.""" STATUS_CHOICES = [ ('pending', 'Pending'), ('approved', 'Approved'), ('rejected', 'Rejected'), ] user = models.ForeignKey( User, on_delete=models.CASCADE, related_name='admin_seller_status_requests', related_query_name='admin_seller_status_request', ) status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending') requested_at = models.DateTimeField(auto_now_add=True) reviewed_at = models.DateTimeField(null=True, blank=True) reviewed_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='reviewed_seller_requests') notes = models.TextField(blank=True, null=True) class Meta: """Model metadata for seller request ordering and verbose names.""" ordering = ['-requested_at'] verbose_name = 'Seller Status Request' verbose_name_plural = 'Seller Status Requests' def __str__(self): return f"{self.user.username} - {self.status} - {self.requested_at}" class Notification(models.Model): """Comprehensive notification model for admin panel.""" NOTIFICATION_TYPES = [ ('seller_request', 'Seller Status Request'), ('seller_request_submitted', 'Seller Request Submitted'), ('personal_data_request', 'Personal Data Request'), ('user_created', 'New User Registration'), ('product_created', 'New Product Created'), ('order_created', 'New Order Placed'), ('product_updated', 'Product Updated'), ('order_updated', 'Order Updated'), ('user_updated', 'User Updated'), ('review_created', 'New Review'), ('ai_escalation', 'AI Chat Escalated'), ('listing_type_updated', 'Listing Type Updated'), ] notification_type = models.CharField(max_length=50, choices=NOTIFICATION_TYPES) title = models.CharField(max_length=255) message = models.TextField() user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='user_notifications') related_object_id = models.IntegerField(null=True, blank=True, help_text='ID of related object (product, order, etc.)') related_object_type = models.CharField(max_length=50, null=True, blank=True, help_text='Type of related object') is_read = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) metadata = models.JSONField(default=dict, blank=True, help_text='Additional data about the notification') class Meta: """Model metadata and indexes for notification queries.""" ordering = ['-created_at'] verbose_name = 'Notification' verbose_name_plural = 'Notifications' indexes = [ models.Index(fields=['-created_at']), models.Index(fields=['is_read']), models.Index(fields=['notification_type']), ] def __str__(self): return f"{self.notification_type} - {self.title} - {self.created_at}" class ServiceInternalError(models.Model): """ Persisted internal error from a microservice, Celery worker, or Telegram bot. Used by the admin ops panel for debugging service failures without container logs. """ SEVERITY_WARNING = 'warning' SEVERITY_ERROR = 'error' SEVERITY_CRITICAL = 'critical' SEVERITY_INFO = 'info' SEVERITY_CHOICES = [ (SEVERITY_WARNING, 'Warning'), (SEVERITY_ERROR, 'Error'), (SEVERITY_CRITICAL, 'Critical'), (SEVERITY_INFO, 'Info'), ] service_name = models.CharField(max_length=64, db_index=True) severity = models.CharField(max_length=16, choices=SEVERITY_CHOICES, default=SEVERITY_ERROR, db_index=True) error_type = models.CharField(max_length=128, blank=True) message = models.TextField() traceback = models.TextField(blank=True) context = models.JSONField(default=dict, blank=True) fingerprint = models.CharField(max_length=64, db_index=True) occurred_at = models.DateTimeField(db_index=True) resolved_at = models.DateTimeField(null=True, blank=True, db_index=True) class Meta: ordering = ['-occurred_at'] verbose_name = 'Service internal error' verbose_name_plural = 'Service internal errors' indexes = [ models.Index(fields=['occurred_at'], name='admin_app_s_occurre_8a0f0d_idx'), models.Index( fields=['service_name', 'occurred_at'], name='admin_app_s_service_2c8f1a_idx', ), models.Index( fields=['fingerprint', 'occurred_at'], name='admin_app_s_fingerp_9b2e4c_idx', ), ] def __str__(self): return f'{self.service_name} [{self.severity}] {self.occurred_at}'