From d2b3dccda9ae5b9920fd9396c6b10d941b47426f Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Sun, 26 Oct 2025 19:59:43 +0300 Subject: [PATCH] Features: 1) Add `system_attributes` JSONField to Stock model; 2) Introduce `StockForm` with `system_attributes` widget; 3) Integrate `StockForm` into StockAdmin in Django admin panel. Fixes: None; Extra: 1) Update migrations to include addition of `system_attributes`; 2) Modify admin interface to display `system_attributes` in additional_fields. --- core/admin.py | 6 +++++- core/forms.py | 9 +++++++++ .../migrations/0051_stock_system_attributes.py | 18 ++++++++++++++++++ core/models.py | 1 + 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 core/migrations/0051_stock_system_attributes.py diff --git a/core/admin.py b/core/admin.py index 4db58fc4..d7ce8e99 100644 --- a/core/admin.py +++ b/core/admin.py @@ -16,7 +16,7 @@ from modeltranslation.translator import NotRegistered, translator from modeltranslation.utils import get_translation_fields from mptt.admin import DraggableMPTTAdmin -from core.forms import CRMForm, OrderForm, OrderProductForm, VendorForm +from core.forms import CRMForm, OrderForm, OrderProductForm, StockForm, VendorForm from core.models import ( Address, Attribute, @@ -743,6 +743,7 @@ class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # typ class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = Stock # type: ignore [misc] + form = StockForm list_display = ( "product", "vendor", @@ -777,6 +778,9 @@ class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: i "purchase_price", "digital_asset", ] + additional_fields = [ + "system_attributes", + ] relation_fields = [ "product", "vendor", diff --git a/core/forms.py b/core/forms.py index fc7a2b18..99e1401f 100644 --- a/core/forms.py +++ b/core/forms.py @@ -42,6 +42,15 @@ class OrderProductForm(forms.ModelForm): } +class StockForm(forms.ModelForm): + class Meta: + model = Product + fields = "__all__" + widgets = { + "system_attributes": JSONTableWidget(), + } + + class OrderForm(forms.ModelForm): class Meta: model = Order diff --git a/core/migrations/0051_stock_system_attributes.py b/core/migrations/0051_stock_system_attributes.py new file mode 100644 index 00000000..ffe61cf4 --- /dev/null +++ b/core/migrations/0051_stock_system_attributes.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2025-10-26 16:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0050_remove_attribute_categories'), + ] + + operations = [ + migrations.AddField( + model_name='stock', + name='system_attributes', + field=models.JSONField(default=dict, verbose_name='system attributes'), + ), + ] diff --git a/core/models.py b/core/models.py index 6d4bcedf..286d0843 100644 --- a/core/models.py +++ b/core/models.py @@ -551,6 +551,7 @@ class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [mi verbose_name=_("digital file"), upload_to="downloadables/", ) + system_attributes = JSONField(default=dict, verbose_name=_("system attributes")) def __str__(self) -> str: return f"{self.vendor.name} - {self.product!s}"