diff --git a/headphones/admin.py b/headphones/admin.py index e892bd0..77711ce 100644 --- a/headphones/admin.py +++ b/headphones/admin.py @@ -209,7 +209,7 @@ class HeadphonesAdmin(admin.ModelAdmin): 'fields': [ ('impedance', 'sensitivity'), 'frequency_range', - 'frequency_response_chart', + ('frequency_response_chart', 'frequency_response_chart_author', 'frequency_response_chart_link'), ('microphone', 'noise_cancellation'), 'ip_rating', ] @@ -378,8 +378,8 @@ class TagsAdmin(admin.ModelAdmin): @admin.register(DriverType) class DriverTypeAdmin(admin.ModelAdmin): - list_display = ('name', 'slug') - search_fields = ('name',) + list_display = ('name', 'slug', 'encoding') + search_fields = ('name', 'encoding') prepopulated_fields = {'slug': ('name',)} diff --git a/headphones/models.py b/headphones/models.py index d567eca..a1a38f7 100644 --- a/headphones/models.py +++ b/headphones/models.py @@ -23,6 +23,9 @@ def upload_to_case_image(instance, filename): ext = filename.split('.')[-1] return f"headphones/{instance.headphones.id}/case_images/{instance.slug}.{ext}" +def upload_to_frequency_response(instance, filename): + return f"headphones/{instance.headphones.id}/frequency_response/{filename}" + # ====================== # Базовые справочники # ====================== @@ -203,6 +206,7 @@ class DriverModel(models.Model): class DriverType(models.Model): name = models.CharField(max_length=50, verbose_name="Тип драйвера") + encoding = models.CharField(blank=True, max_length=10, verbose_name="Буквенное обозначение>") slug = models.SlugField(unique=True, verbose_name="URL-идентификатор") class Meta: @@ -612,6 +616,14 @@ def delete_image_file(sender, instance, **kwargs): except Exception as e: print(f"Ошибка при удалении файла (сигнал): {e}") + +class HeadphonesMicrophoneType(models.Model): + type = models.CharField(max_length=50, verbose_name="Тип микрофона") + description = models.CharField(blank=True, verbose_name="Описание") + + class Meta: + verbose_name = "Тип микрофона" + # ====================== # Основная модель наушников # ====================== @@ -684,12 +696,26 @@ class Headphones(models.Model): ) # Технические характеристики - frequency_response_chart = models.JSONField( - verbose_name="АЧХ (JSON)", + frequency_response_chart = models.FileField( + verbose_name="АЧХ (CSV)", + upload_to = upload_to_frequency_response, null=True, blank=True, help_text="Данные в формате [{'frequency': 20, 'amplitude': -2.5}, ...]" ) + + frequency_response_chart_author = models.CharField( + verbose_name="Автор АЧХ", + null=True, + blank=True, + ) + + frequency_response_chart_link = models.CharField( + verbose_name="Ссылка на АЧХ", + null=True, + blank=True, + ) + impedance = models.DecimalField( verbose_name="Импеданс (Ом)", max_digits=5,