feat(blog): enhance slug behavior and expand demo data attributes
update `slug` field for `Post` model using `TweakedAutoSlugField` to improve auto-slug behavior with Unicode and additional options. Add detailed `attribute_values` to demo products for enriched metadata. Update dependencies for stability and features.
This commit is contained in:
parent
a1cc0cfd30
commit
a59c5f59dd
6 changed files with 457 additions and 95 deletions
28
engine/blog/migrations/0009_alter_post_slug.py
Normal file
28
engine/blog/migrations/0009_alter_post_slug.py
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# Generated by Django 5.2.11 on 2026-02-27 15:43
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
import engine.core.utils.db
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("blog", "0008_alter_post_content_alter_post_content_ar_ar_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name="post",
|
||||
name="slug",
|
||||
field=engine.core.utils.db.TweakedAutoSlugField(
|
||||
allow_unicode=True,
|
||||
blank=True,
|
||||
editable=False,
|
||||
max_length=88,
|
||||
null=True,
|
||||
overwrite=True,
|
||||
populate_from="title",
|
||||
unique=True,
|
||||
),
|
||||
),
|
||||
]
|
||||
|
|
@ -9,9 +9,9 @@ from django.db.models import (
|
|||
TextField,
|
||||
)
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django_extensions.db.fields import AutoSlugField
|
||||
|
||||
from engine.core.abstract import NiceModel
|
||||
from engine.core.utils.db import TweakedAutoSlugField, unicode_slugify_function
|
||||
|
||||
|
||||
class Post(NiceModel):
|
||||
|
|
@ -47,8 +47,15 @@ class Post(NiceModel):
|
|||
null=True,
|
||||
)
|
||||
file = FileField(upload_to="posts/", blank=True, null=True)
|
||||
slug = AutoSlugField(
|
||||
populate_from="title", allow_unicode=True, unique=True, editable=False
|
||||
slug = TweakedAutoSlugField(
|
||||
populate_from="title",
|
||||
slugify_function=unicode_slugify_function,
|
||||
allow_unicode=True,
|
||||
unique=True,
|
||||
editable=False,
|
||||
max_length=88,
|
||||
overwrite=True,
|
||||
null=True,
|
||||
)
|
||||
tags = ManyToManyField(to="blog.PostTag", blank=True, related_name="posts")
|
||||
meta_description = CharField(max_length=150, blank=True, null=True)
|
||||
|
|
|
|||
|
|
@ -338,7 +338,13 @@
|
|||
"partnumber": "DIA-RB-150-D-VVS1",
|
||||
"price": 18500,
|
||||
"purchase_price": 15000,
|
||||
"quantity": 3
|
||||
"quantity": 3,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.5,
|
||||
"Cut": {"en": "Round Brilliant", "ru": "Круглая бриллиантовая"},
|
||||
"Color Grade": "D",
|
||||
"Clarity Grade": "VVS1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Princess Cut Diamond 2.0ct E VS2",
|
||||
|
|
@ -350,7 +356,13 @@
|
|||
"partnumber": "DIA-PC-200-E-VS2",
|
||||
"price": 24000,
|
||||
"purchase_price": 19500,
|
||||
"quantity": 2
|
||||
"quantity": 2,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 2.0,
|
||||
"Cut": {"en": "Princess", "ru": "Принцесса"},
|
||||
"Color Grade": "E",
|
||||
"Clarity Grade": "VS2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Oval Diamond 1.2ct F IF",
|
||||
|
|
@ -362,7 +374,13 @@
|
|||
"partnumber": "DIA-OV-120-F-IF",
|
||||
"price": 28500,
|
||||
"purchase_price": 23000,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.2,
|
||||
"Cut": {"en": "Oval", "ru": "Овальная"},
|
||||
"Color Grade": "F",
|
||||
"Clarity Grade": "IF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Cushion Cut Diamond 3.0ct G VS1",
|
||||
|
|
@ -374,7 +392,13 @@
|
|||
"partnumber": "DIA-CU-300-G-VS1",
|
||||
"price": 42000,
|
||||
"purchase_price": 35000,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 3.0,
|
||||
"Cut": {"en": "Cushion", "ru": "Кушон"},
|
||||
"Color Grade": "G",
|
||||
"Clarity Grade": "VS1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Emerald Cut Diamond 1.8ct D VVS2",
|
||||
|
|
@ -386,7 +410,13 @@
|
|||
"partnumber": "DIA-EM-180-D-VVS2",
|
||||
"price": 32000,
|
||||
"purchase_price": 26000,
|
||||
"quantity": 2
|
||||
"quantity": 2,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.8,
|
||||
"Cut": {"en": "Emerald", "ru": "Изумрудная"},
|
||||
"Color Grade": "D",
|
||||
"Clarity Grade": "VVS2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Fancy Yellow Diamond 2.5ct",
|
||||
|
|
@ -398,7 +428,12 @@
|
|||
"partnumber": "DIA-FY-250",
|
||||
"price": 65000,
|
||||
"purchase_price": 52000,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 2.5,
|
||||
"Cut": {"en": "Radiant", "ru": "Радиант"},
|
||||
"Color Grade": {"en": "Fancy Intense Yellow", "ru": "Фантазийный интенсивно-жёлтый"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pink Diamond 0.5ct Fancy Light",
|
||||
|
|
@ -410,7 +445,14 @@
|
|||
"partnumber": "DIA-PNK-050-FL",
|
||||
"price": 125000,
|
||||
"purchase_price": 100000,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 0.5,
|
||||
"Cut": {"en": "Pear", "ru": "Грушевидная"},
|
||||
"Color Grade": {"en": "Fancy Light Pink", "ru": "Фантазийный светло-розовый"},
|
||||
"Country of Origin": {"en": "Australia", "ru": "Австралия"},
|
||||
"Mine": {"en": "Argyle", "ru": "Аргайл"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Burmese Ruby 2.5ct Pigeon Blood",
|
||||
|
|
@ -422,7 +464,13 @@
|
|||
"partnumber": "RUB-BUR-250-PB",
|
||||
"price": 125000,
|
||||
"purchase_price": 100000,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 2.5,
|
||||
"Cut": {"en": "Oval", "ru": "Овальная"},
|
||||
"Color Grade": {"en": "Pigeon Blood", "ru": "Голубиная кровь"},
|
||||
"Country of Origin": {"en": "Myanmar", "ru": "Мьянма"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Mozambique Ruby 1.8ct Vivid Red",
|
||||
|
|
@ -434,7 +482,12 @@
|
|||
"partnumber": "RUB-MOZ-180-VR",
|
||||
"price": 8500,
|
||||
"purchase_price": 6800,
|
||||
"quantity": 4
|
||||
"quantity": 4,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.8,
|
||||
"Color Grade": {"en": "Vivid Red", "ru": "Насыщенно-красный"},
|
||||
"Country of Origin": {"en": "Mozambique", "ru": "Мозамбик"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Star Ruby 3.2ct Six-Ray",
|
||||
|
|
@ -446,7 +499,13 @@
|
|||
"partnumber": "RUB-STAR-320-SR",
|
||||
"price": 15000,
|
||||
"purchase_price": 12000,
|
||||
"quantity": 2
|
||||
"quantity": 2,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 3.2,
|
||||
"Cut": {"en": "Cabochon", "ru": "Кабошон"},
|
||||
"Color Grade": {"en": "Red", "ru": "Красный"},
|
||||
"Country of Origin": {"en": "Sri Lanka", "ru": "Шри-Ланка"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Kashmir Sapphire 3.0ct Cornflower Blue",
|
||||
|
|
@ -458,7 +517,13 @@
|
|||
"partnumber": "SAP-KAS-300-CB",
|
||||
"price": 185000,
|
||||
"purchase_price": 150000,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 3.0,
|
||||
"Color Grade": {"en": "Cornflower Blue", "ru": "Васильково-голубой"},
|
||||
"Country of Origin": {"en": "India", "ru": "Индия"},
|
||||
"Mine": {"en": "Kashmir", "ru": "Кашмир"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Ceylon Sapphire 2.2ct Royal Blue",
|
||||
|
|
@ -470,7 +535,12 @@
|
|||
"partnumber": "SAP-CEY-220-RB",
|
||||
"price": 12500,
|
||||
"purchase_price": 10000,
|
||||
"quantity": 3
|
||||
"quantity": 3,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 2.2,
|
||||
"Color Grade": {"en": "Royal Blue", "ru": "Королевский синий"},
|
||||
"Country of Origin": {"en": "Sri Lanka", "ru": "Шри-Ланка"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Padparadscha Sapphire 1.5ct",
|
||||
|
|
@ -482,7 +552,12 @@
|
|||
"partnumber": "SAP-PAD-150",
|
||||
"price": 45000,
|
||||
"purchase_price": 36000,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.5,
|
||||
"Color Grade": {"en": "Pink-Orange", "ru": "Розово-оранжевый"},
|
||||
"Country of Origin": {"en": "Sri Lanka", "ru": "Шри-Ланка"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Yellow Sapphire 4.0ct Golden",
|
||||
|
|
@ -494,7 +569,12 @@
|
|||
"partnumber": "SAP-YEL-400-GD",
|
||||
"price": 6500,
|
||||
"purchase_price": 5200,
|
||||
"quantity": 5
|
||||
"quantity": 5,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 4.0,
|
||||
"Color Grade": {"en": "Golden Yellow", "ru": "Золотисто-жёлтый"},
|
||||
"Country of Origin": {"en": "Sri Lanka", "ru": "Шри-Ланка"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pink Sapphire 1.8ct Hot Pink",
|
||||
|
|
@ -506,7 +586,12 @@
|
|||
"partnumber": "SAP-PNK-180-HP",
|
||||
"price": 4200,
|
||||
"purchase_price": 3400,
|
||||
"quantity": 6
|
||||
"quantity": 6,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.8,
|
||||
"Color Grade": {"en": "Hot Pink", "ru": "Ярко-розовый"},
|
||||
"Country of Origin": {"en": "Madagascar", "ru": "Мадагаскар"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Colombian Emerald 2.8ct Muzo Green",
|
||||
|
|
@ -518,7 +603,13 @@
|
|||
"partnumber": "EME-COL-280-MZ",
|
||||
"price": 35000,
|
||||
"purchase_price": 28000,
|
||||
"quantity": 2
|
||||
"quantity": 2,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 2.8,
|
||||
"Color Grade": {"en": "Deep Green", "ru": "Глубокий зелёный"},
|
||||
"Country of Origin": {"en": "Colombia", "ru": "Колумбия"},
|
||||
"Mine": {"en": "Muzo", "ru": "Музо"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Zambian Emerald 3.5ct Vivid Green",
|
||||
|
|
@ -530,7 +621,12 @@
|
|||
"partnumber": "EME-ZAM-350-VG",
|
||||
"price": 18500,
|
||||
"purchase_price": 15000,
|
||||
"quantity": 3
|
||||
"quantity": 3,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 3.5,
|
||||
"Color Grade": {"en": "Vivid Bluish-Green", "ru": "Насыщенный сине-зелёный"},
|
||||
"Country of Origin": {"en": "Zambia", "ru": "Замбия"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Brazilian Emerald 1.2ct Medium Green",
|
||||
|
|
@ -542,7 +638,12 @@
|
|||
"partnumber": "EME-BRA-120-MG",
|
||||
"price": 2800,
|
||||
"purchase_price": 2200,
|
||||
"quantity": 8
|
||||
"quantity": 8,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.2,
|
||||
"Color Grade": {"en": "Medium Green", "ru": "Средне-зелёный"},
|
||||
"Country of Origin": {"en": "Brazil", "ru": "Бразилия"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Australian Black Opal 5.2ct",
|
||||
|
|
@ -554,7 +655,13 @@
|
|||
"partnumber": "OPL-BLK-520-LR",
|
||||
"price": 28000,
|
||||
"purchase_price": 22500,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 5.2,
|
||||
"Cut": {"en": "Cabochon", "ru": "Кабошон"},
|
||||
"Country of Origin": {"en": "Australia", "ru": "Австралия"},
|
||||
"Mine": {"en": "Lightning Ridge", "ru": "Лайтнинг Ридж"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Ethiopian Welo Opal 3.8ct",
|
||||
|
|
@ -566,7 +673,12 @@
|
|||
"partnumber": "OPL-ETH-380-WL",
|
||||
"price": 3500,
|
||||
"purchase_price": 2800,
|
||||
"quantity": 5
|
||||
"quantity": 5,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 3.8,
|
||||
"Cut": {"en": "Cabochon", "ru": "Кабошон"},
|
||||
"Country of Origin": {"en": "Ethiopia", "ru": "Эфиопия"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Boulder Opal 8.5ct",
|
||||
|
|
@ -578,7 +690,12 @@
|
|||
"partnumber": "OPL-BLD-850",
|
||||
"price": 4800,
|
||||
"purchase_price": 3800,
|
||||
"quantity": 3
|
||||
"quantity": 3,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 8.5,
|
||||
"Cut": {"en": "Freeform", "ru": "Свободная форма"},
|
||||
"Country of Origin": {"en": "Australia", "ru": "Австралия"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Fire Opal 2.1ct Mexican Orange",
|
||||
|
|
@ -590,7 +707,12 @@
|
|||
"partnumber": "OPL-FIRE-210-MX",
|
||||
"price": 1200,
|
||||
"purchase_price": 950,
|
||||
"quantity": 7
|
||||
"quantity": 7,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 2.1,
|
||||
"Color Grade": {"en": "Intense Orange", "ru": "Интенсивный оранжевый"},
|
||||
"Country of Origin": {"en": "Mexico", "ru": "Мексика"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "South Sea Pearl 14mm Golden",
|
||||
|
|
@ -602,7 +724,12 @@
|
|||
"partnumber": "PRL-SSG-14MM",
|
||||
"price": 8500,
|
||||
"purchase_price": 6800,
|
||||
"quantity": 4
|
||||
"quantity": 4,
|
||||
"attribute_values": {
|
||||
"Dimensions (mm)": "14",
|
||||
"Color Grade": {"en": "Golden", "ru": "Золотистый"},
|
||||
"Clarity Grade": "AAA"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Tahitian Pearl 12mm Peacock",
|
||||
|
|
@ -614,7 +741,12 @@
|
|||
"partnumber": "PRL-TAH-12MM-PC",
|
||||
"price": 3200,
|
||||
"purchase_price": 2500,
|
||||
"quantity": 6
|
||||
"quantity": 6,
|
||||
"attribute_values": {
|
||||
"Dimensions (mm)": "12",
|
||||
"Color Grade": {"en": "Peacock", "ru": "Павлиний"},
|
||||
"Country of Origin": {"en": "Tahiti", "ru": "Таити"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Akoya Pearl Strand 7mm",
|
||||
|
|
@ -626,7 +758,12 @@
|
|||
"partnumber": "PRL-AKO-7MM-STR",
|
||||
"price": 4500,
|
||||
"purchase_price": 3600,
|
||||
"quantity": 3
|
||||
"quantity": 3,
|
||||
"attribute_values": {
|
||||
"Dimensions (mm)": "7",
|
||||
"Color Grade": {"en": "White with Rose Overtone", "ru": "Белый с розовым перламутром"},
|
||||
"Country of Origin": {"en": "Japan", "ru": "Япония"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Freshwater Pearl Set",
|
||||
|
|
@ -638,7 +775,11 @@
|
|||
"partnumber": "PRL-FW-SET-10",
|
||||
"price": 850,
|
||||
"purchase_price": 680,
|
||||
"quantity": 10
|
||||
"quantity": 10,
|
||||
"attribute_values": {
|
||||
"Dimensions (mm)": "9-10",
|
||||
"Color Grade": {"en": "Multi-Pastel", "ru": "Мульти-пастельный"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Siberian Amethyst 8.5ct Deep Purple",
|
||||
|
|
@ -650,7 +791,13 @@
|
|||
"partnumber": "AME-SIB-850-DP",
|
||||
"price": 1200,
|
||||
"purchase_price": 950,
|
||||
"quantity": 5
|
||||
"quantity": 5,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 8.5,
|
||||
"Cut": {"en": "Cushion", "ru": "Кушон"},
|
||||
"Color Grade": {"en": "Deep Purple", "ru": "Тёмно-фиолетовый"},
|
||||
"Country of Origin": {"en": "Russia", "ru": "Россия"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Uruguayan Amethyst 12.3ct",
|
||||
|
|
@ -662,7 +809,12 @@
|
|||
"partnumber": "AME-URU-1230",
|
||||
"price": 650,
|
||||
"purchase_price": 520,
|
||||
"quantity": 8
|
||||
"quantity": 8,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 12.3,
|
||||
"Cut": {"en": "Oval", "ru": "Овальная"},
|
||||
"Country of Origin": {"en": "Uruguay", "ru": "Уругвай"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Ametrine 6.8ct Bi-Color",
|
||||
|
|
@ -674,7 +826,13 @@
|
|||
"partnumber": "AME-TRI-680-BC",
|
||||
"price": 450,
|
||||
"purchase_price": 360,
|
||||
"quantity": 6
|
||||
"quantity": 6,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 6.8,
|
||||
"Cut": {"en": "Emerald", "ru": "Изумрудная"},
|
||||
"Color Grade": {"en": "Bi-Color Purple/Gold", "ru": "Двухцветный фиолетовый/золотистый"},
|
||||
"Country of Origin": {"en": "Bolivia", "ru": "Боливия"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Santa Maria Aquamarine 4.2ct",
|
||||
|
|
@ -686,7 +844,12 @@
|
|||
"partnumber": "AQU-SM-420",
|
||||
"price": 5500,
|
||||
"purchase_price": 4400,
|
||||
"quantity": 2
|
||||
"quantity": 2,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 4.2,
|
||||
"Color Grade": {"en": "Intense Blue", "ru": "Интенсивный голубой"},
|
||||
"Country of Origin": {"en": "Brazil", "ru": "Бразилия"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Madagascar Aquamarine 7.5ct",
|
||||
|
|
@ -698,7 +861,13 @@
|
|||
"partnumber": "AQU-MAD-750",
|
||||
"price": 2200,
|
||||
"purchase_price": 1750,
|
||||
"quantity": 4
|
||||
"quantity": 4,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 7.5,
|
||||
"Cut": {"en": "Octagon", "ru": "Восьмиугольная"},
|
||||
"Color Grade": {"en": "Light Blue", "ru": "Светло-голубой"},
|
||||
"Country of Origin": {"en": "Madagascar", "ru": "Мадагаскар"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pakistani Aquamarine 15.2ct",
|
||||
|
|
@ -710,7 +879,13 @@
|
|||
"partnumber": "AQU-PAK-1520",
|
||||
"price": 4800,
|
||||
"purchase_price": 3850,
|
||||
"quantity": 2
|
||||
"quantity": 2,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 15.2,
|
||||
"Color Grade": {"en": "Medium Blue", "ru": "Средне-голубой"},
|
||||
"Country of Origin": {"en": "Pakistan", "ru": "Пакистан"},
|
||||
"Mine": {"en": "Shigar Valley", "ru": "Долина Шигар"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "AAA Tanzanite 5.8ct Vivid Blue",
|
||||
|
|
@ -722,7 +897,13 @@
|
|||
"partnumber": "TAN-AAA-580-VB",
|
||||
"price": 8500,
|
||||
"purchase_price": 6800,
|
||||
"quantity": 2
|
||||
"quantity": 2,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 5.8,
|
||||
"Cut": {"en": "Trillion", "ru": "Триллион"},
|
||||
"Color Grade": {"en": "Vivid Blue-Violet", "ru": "Насыщенный сине-фиолетовый"},
|
||||
"Country of Origin": {"en": "Tanzania", "ru": "Танзания"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Tanzanite 3.2ct Blue-Violet",
|
||||
|
|
@ -734,7 +915,13 @@
|
|||
"partnumber": "TAN-320-BV",
|
||||
"price": 3200,
|
||||
"purchase_price": 2560,
|
||||
"quantity": 4
|
||||
"quantity": 4,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 3.2,
|
||||
"Cut": {"en": "Oval", "ru": "Овальная"},
|
||||
"Color Grade": {"en": "Blue-Violet", "ru": "Сине-фиолетовый"},
|
||||
"Country of Origin": {"en": "Tanzania", "ru": "Танзания"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Tanzanite Pair 2.0ct Each",
|
||||
|
|
@ -746,7 +933,12 @@
|
|||
"partnumber": "TAN-PAIR-200",
|
||||
"price": 5800,
|
||||
"purchase_price": 4650,
|
||||
"quantity": 3
|
||||
"quantity": 3,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 2.0,
|
||||
"Color Grade": {"en": "Blue-Violet", "ru": "Сине-фиолетовый"},
|
||||
"Country of Origin": {"en": "Tanzania", "ru": "Танзания"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Paraiba Tourmaline 1.2ct Neon Blue",
|
||||
|
|
@ -758,7 +950,12 @@
|
|||
"partnumber": "TOU-PAR-120-NB",
|
||||
"price": 85000,
|
||||
"purchase_price": 68000,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.2,
|
||||
"Color Grade": {"en": "Neon Blue", "ru": "Неоново-голубой"},
|
||||
"Country of Origin": {"en": "Brazil", "ru": "Бразилия"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Watermelon Tourmaline 8.5ct",
|
||||
|
|
@ -770,7 +967,12 @@
|
|||
"partnumber": "TOU-WM-850",
|
||||
"price": 1800,
|
||||
"purchase_price": 1450,
|
||||
"quantity": 4
|
||||
"quantity": 4,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 8.5,
|
||||
"Cut": {"en": "Slice", "ru": "Слайс"},
|
||||
"Color Grade": {"en": "Bi-Color Pink/Green", "ru": "Двухцветный розовый/зелёный"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Rubellite Tourmaline 4.3ct",
|
||||
|
|
@ -782,7 +984,12 @@
|
|||
"partnumber": "TOU-RUB-430",
|
||||
"price": 3500,
|
||||
"purchase_price": 2800,
|
||||
"quantity": 3
|
||||
"quantity": 3,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 4.3,
|
||||
"Cut": {"en": "Cushion", "ru": "Кушон"},
|
||||
"Color Grade": {"en": "Raspberry Red", "ru": "Малиново-красный"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Chrome Tourmaline 2.8ct",
|
||||
|
|
@ -794,7 +1001,12 @@
|
|||
"partnumber": "TOU-CHR-280",
|
||||
"price": 2200,
|
||||
"purchase_price": 1750,
|
||||
"quantity": 5
|
||||
"quantity": 5,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 2.8,
|
||||
"Color Grade": {"en": "Intense Green", "ru": "Интенсивный зелёный"},
|
||||
"Country of Origin": {"en": "East Africa", "ru": "Восточная Африка"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Indicolite Tourmaline 3.6ct",
|
||||
|
|
@ -806,7 +1018,13 @@
|
|||
"partnumber": "TOU-IND-360",
|
||||
"price": 2800,
|
||||
"purchase_price": 2250,
|
||||
"quantity": 4
|
||||
"quantity": 4,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 3.6,
|
||||
"Cut": {"en": "Oval", "ru": "Овальная"},
|
||||
"Color Grade": {"en": "Teal Blue", "ru": "Сине-зелёный"},
|
||||
"Country of Origin": {"en": "Afghanistan", "ru": "Афганистан"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Marquise Diamond 1.0ct D VVS2",
|
||||
|
|
@ -818,7 +1036,13 @@
|
|||
"partnumber": "DIA-MQ-100-D-VVS2",
|
||||
"price": 12500,
|
||||
"purchase_price": 10000,
|
||||
"quantity": 2
|
||||
"quantity": 2,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.0,
|
||||
"Cut": {"en": "Marquise", "ru": "Маркиз"},
|
||||
"Color Grade": "D",
|
||||
"Clarity Grade": "VVS2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Asscher Cut Diamond 2.2ct E VS1",
|
||||
|
|
@ -830,7 +1054,13 @@
|
|||
"partnumber": "DIA-AS-220-E-VS1",
|
||||
"price": 28000,
|
||||
"purchase_price": 22500,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 2.2,
|
||||
"Cut": {"en": "Asscher", "ru": "Ашер"},
|
||||
"Color Grade": "E",
|
||||
"Clarity Grade": "VS1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Thai Ruby 1.5ct Vivid Red",
|
||||
|
|
@ -842,7 +1072,12 @@
|
|||
"partnumber": "RUB-THA-150-VR",
|
||||
"price": 6200,
|
||||
"purchase_price": 5000,
|
||||
"quantity": 3
|
||||
"quantity": 3,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.5,
|
||||
"Color Grade": {"en": "Vivid Red", "ru": "Насыщенно-красный"},
|
||||
"Country of Origin": {"en": "Thailand", "ru": "Таиланд"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Burmese Ruby 1.0ct Unheated",
|
||||
|
|
@ -854,7 +1089,13 @@
|
|||
"partnumber": "RUB-BUR-100-UH",
|
||||
"price": 18000,
|
||||
"purchase_price": 14500,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.0,
|
||||
"Color Grade": {"en": "Vivid Red", "ru": "Насыщенно-красный"},
|
||||
"Country of Origin": {"en": "Myanmar", "ru": "Мьянма"},
|
||||
"Mine": {"en": "Mogok", "ru": "Могок"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pink Sapphire Pair 1.2ct Each",
|
||||
|
|
@ -866,7 +1107,13 @@
|
|||
"partnumber": "SAP-PNK-PAIR-120",
|
||||
"price": 5800,
|
||||
"purchase_price": 4650,
|
||||
"quantity": 2
|
||||
"quantity": 2,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.2,
|
||||
"Cut": {"en": "Oval", "ru": "Овальная"},
|
||||
"Color Grade": {"en": "Pink", "ru": "Розовый"},
|
||||
"Country of Origin": {"en": "Sri Lanka", "ru": "Шри-Ланка"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Afghan Emerald 1.8ct Panjshir",
|
||||
|
|
@ -878,7 +1125,13 @@
|
|||
"partnumber": "EME-AFG-180-PJ",
|
||||
"price": 12000,
|
||||
"purchase_price": 9600,
|
||||
"quantity": 2
|
||||
"quantity": 2,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.8,
|
||||
"Color Grade": {"en": "Vivid Green", "ru": "Яркий зелёный"},
|
||||
"Country of Origin": {"en": "Afghanistan", "ru": "Афганистан"},
|
||||
"Mine": {"en": "Panjshir", "ru": "Панджшер"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Ethiopian Emerald 2.5ct Vivid",
|
||||
|
|
@ -890,7 +1143,12 @@
|
|||
"partnumber": "EME-ETH-250",
|
||||
"price": 9500,
|
||||
"purchase_price": 7600,
|
||||
"quantity": 3
|
||||
"quantity": 3,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 2.5,
|
||||
"Color Grade": {"en": "Vivid Green", "ru": "Яркий зелёный"},
|
||||
"Country of Origin": {"en": "Ethiopia", "ru": "Эфиопия"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Colombian Emerald Pair 1.0ct Each",
|
||||
|
|
@ -902,7 +1160,13 @@
|
|||
"partnumber": "EME-COL-PAIR-100",
|
||||
"price": 14000,
|
||||
"purchase_price": 11200,
|
||||
"quantity": 2
|
||||
"quantity": 2,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 1.0,
|
||||
"Color Grade": {"en": "Deep Green", "ru": "Глубокий зелёный"},
|
||||
"Country of Origin": {"en": "Colombia", "ru": "Колумбия"},
|
||||
"Mine": {"en": "Muzo", "ru": "Музо"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Ceylon Sapphire 5.0ct Unheated",
|
||||
|
|
@ -914,7 +1178,13 @@
|
|||
"partnumber": "SAP-CEY-500-UH",
|
||||
"price": 45000,
|
||||
"purchase_price": 36000,
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 5.0,
|
||||
"Cut": {"en": "Cushion", "ru": "Кушон"},
|
||||
"Color Grade": {"en": "Medium-Deep Blue", "ru": "Средне-глубокий синий"},
|
||||
"Country of Origin": {"en": "Sri Lanka", "ru": "Шри-Ланка"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Baroque South Sea Pearl 16mm White",
|
||||
|
|
@ -926,7 +1196,13 @@
|
|||
"partnumber": "PRL-BAR-16MM-WH",
|
||||
"price": 6500,
|
||||
"purchase_price": 5200,
|
||||
"quantity": 3
|
||||
"quantity": 3,
|
||||
"attribute_values": {
|
||||
"Dimensions (mm)": "16",
|
||||
"Cut": {"en": "Baroque", "ru": "Барочная"},
|
||||
"Color Grade": {"en": "White", "ru": "Белый"},
|
||||
"Clarity Grade": "AAA"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Madeira Citrine 8.5ct",
|
||||
|
|
@ -938,7 +1214,12 @@
|
|||
"partnumber": "AME-CIT-850-MD",
|
||||
"price": 950,
|
||||
"purchase_price": 760,
|
||||
"quantity": 4
|
||||
"quantity": 4,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 8.5,
|
||||
"Cut": {"en": "Emerald", "ru": "Изумрудная"},
|
||||
"Color Grade": {"en": "Reddish-Orange", "ru": "Красновато-оранжевый"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Rose de France Amethyst 14.0ct",
|
||||
|
|
@ -950,7 +1231,12 @@
|
|||
"partnumber": "AME-RDF-1400",
|
||||
"price": 420,
|
||||
"purchase_price": 340,
|
||||
"quantity": 6
|
||||
"quantity": 6,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 14.0,
|
||||
"Cut": {"en": "Oval", "ru": "Овальная"},
|
||||
"Color Grade": {"en": "Lavender-Pink", "ru": "Лавандово-розовый"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Prasiolite 11.2ct Green Amethyst",
|
||||
|
|
@ -962,7 +1248,13 @@
|
|||
"partnumber": "AME-PRS-1120",
|
||||
"price": 380,
|
||||
"purchase_price": 300,
|
||||
"quantity": 5
|
||||
"quantity": 5,
|
||||
"attribute_values": {
|
||||
"Carat Weight": 11.2,
|
||||
"Cut": {"en": "Cushion", "ru": "Кушон"},
|
||||
"Color Grade": {"en": "Mint Green", "ru": "Мятно-зелёный"},
|
||||
"Country of Origin": {"en": "Brazil", "ru": "Бразилия"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Diamond Solitaire Engagement Ring",
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ from engine.core.models import (
|
|||
Address,
|
||||
Attribute,
|
||||
AttributeGroup,
|
||||
AttributeValue,
|
||||
Brand,
|
||||
Category,
|
||||
CategoryTag,
|
||||
|
|
@ -32,7 +33,6 @@ from engine.payments.models import Balance
|
|||
from engine.vibes_auth.models import Group, User
|
||||
|
||||
DEMO_EMAIL_DOMAIN = "wiseless.xyz"
|
||||
DEMO_VENDOR_NAME = "GemDemo Global"
|
||||
DEMO_IMAGES_DIR = Path(settings.BASE_DIR) / "engine/core/fixtures/demo_products_images"
|
||||
DEMO_BLOG_DIR = Path(settings.BASE_DIR) / "engine/core/fixtures/demo_blog_posts"
|
||||
|
||||
|
|
@ -211,11 +211,12 @@ class Command(BaseCommand):
|
|||
|
||||
demo_users.delete()
|
||||
|
||||
demo_vendor_name = self.demo_data["vendor"]["name"]
|
||||
try:
|
||||
vendor = Vendor.objects.get(name=DEMO_VENDOR_NAME)
|
||||
vendor = Vendor.objects.get(name=demo_vendor_name)
|
||||
Stock.objects.filter(vendor=vendor).delete()
|
||||
vendor.delete()
|
||||
self.stdout.write(f" Removed vendor: {DEMO_VENDOR_NAME}")
|
||||
self.stdout.write(f" Removed vendor: {demo_vendor_name}")
|
||||
except Vendor.DoesNotExist:
|
||||
pass
|
||||
|
||||
|
|
@ -232,6 +233,10 @@ class Command(BaseCommand):
|
|||
if product_dir.exists() and not any(product_dir.iterdir()):
|
||||
shutil.rmtree(product_dir, ignore_errors=True)
|
||||
|
||||
# Delete OrderProducts referencing demo products (from non-demo users)
|
||||
# to avoid ProtectedError since OrderProduct.product uses PROTECT
|
||||
OrderProduct.objects.filter(product__in=products).delete()
|
||||
|
||||
products.delete()
|
||||
|
||||
brand_names = [b["name"] for b in self.demo_data["brands"]]
|
||||
|
|
@ -336,6 +341,17 @@ class Command(BaseCommand):
|
|||
attr.name_ru_ru = attr_data["name_ru"]
|
||||
attr.save()
|
||||
|
||||
attr_lookup = {}
|
||||
for attr_data in data["attributes"]:
|
||||
group = attr_groups.get(attr_data["group"])
|
||||
if group:
|
||||
try:
|
||||
attr_lookup[attr_data["name"]] = Attribute.objects.get(
|
||||
group=group, name=attr_data["name"]
|
||||
)
|
||||
except Attribute.DoesNotExist:
|
||||
pass
|
||||
|
||||
brands = {}
|
||||
for brand_data in data["brands"]:
|
||||
brand, created = Brand.objects.get_or_create(
|
||||
|
|
@ -403,6 +419,25 @@ class Command(BaseCommand):
|
|||
# Add product image
|
||||
self._add_product_image(product, prod_data["partnumber"])
|
||||
|
||||
# Add attribute values
|
||||
for attr_name, av_data in prod_data.get("attribute_values", {}).items():
|
||||
attr = attr_lookup.get(attr_name)
|
||||
if attr:
|
||||
if isinstance(av_data, dict):
|
||||
value = str(av_data["en"])
|
||||
value_ru = av_data.get("ru")
|
||||
else:
|
||||
value = str(av_data)
|
||||
value_ru = None
|
||||
av, created = AttributeValue.objects.get_or_create(
|
||||
product=product,
|
||||
attribute=attr,
|
||||
defaults={"value": value},
|
||||
)
|
||||
if created and value_ru:
|
||||
av.value_ru_ru = value_ru # ty:ignore[invalid-assignment]
|
||||
av.save()
|
||||
|
||||
def _find_image(self, partnumber: str, suffix: str = "") -> Path | None:
|
||||
extensions = (".jpg", ".jpeg", ".png", ".webp")
|
||||
for ext in extensions:
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ dependencies = [
|
|||
"django-redis==6.0.0",
|
||||
"django-ratelimit==4.1.0",
|
||||
"django-storages==1.14.6",
|
||||
"django-unfold==0.80.2",
|
||||
"django-unfold==0.81.0",
|
||||
"django-debug-toolbar==6.2.0",
|
||||
"django-widget-tweaks==1.5.1",
|
||||
"djangorestframework==3.16.1",
|
||||
|
|
@ -62,7 +62,7 @@ dependencies = [
|
|||
"python-slugify==8.0.4",
|
||||
"psutil==7.2.2",
|
||||
"psycopg[binary]==3.3.3",
|
||||
"redis==7.2.0",
|
||||
"redis==7.2.1",
|
||||
"requests==2.32.5",
|
||||
"sentry-sdk[django,celery,opentelemetry]==2.53.0",
|
||||
"six==1.17.0",
|
||||
|
|
@ -70,7 +70,7 @@ dependencies = [
|
|||
"uvicorn==0.41.0",
|
||||
"zeep==4.3.2",
|
||||
"websockets==16.0",
|
||||
"whitenoise==6.11.0",
|
||||
"whitenoise==6.12.0",
|
||||
]
|
||||
|
||||
[project.optional-dependencies]
|
||||
|
|
@ -81,7 +81,7 @@ worker = [
|
|||
]
|
||||
linting = [
|
||||
"ty==0.0.16",
|
||||
"ruff==0.15.2",
|
||||
"ruff==0.15.4",
|
||||
"celery-types==0.24.0",
|
||||
"django-stubs==5.2.9",
|
||||
"djangorestframework-stubs==3.16.8",
|
||||
|
|
|
|||
64
uv.lock
64
uv.lock
|
|
@ -1056,14 +1056,14 @@ wheels = [
|
|||
|
||||
[[package]]
|
||||
name = "django-unfold"
|
||||
version = "0.80.2"
|
||||
version = "0.81.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "django" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/18/99/bb6273b4d88afcc37e7f5fa3c8386265eda8c89312f50d751e7450bec7bd/django_unfold-0.80.2.tar.gz", hash = "sha256:6d9baa1694f9c3f8c451ea6e00537375ae1c7832d3ad0110d0f576bd47dae3d1", size = 1111081, upload-time = "2026-02-18T09:25:27.251Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/42/96/54e3852a562fb5da3a626ae7992f2427945cadf7d45325b8dff42c418a3d/django_unfold-0.81.0.tar.gz", hash = "sha256:4746a2e78210d174c556b8dcf6cbc87642b86282a37406d820d6c1b4f6c160be", size = 1111379, upload-time = "2026-02-25T09:48:42.197Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/37/11/792187e14290dc7737a78905f6d7ab664da11bb2f29873b5152bdc14114a/django_unfold-0.80.2-py3-none-any.whl", hash = "sha256:9e9d98eb6bcbc58769a7e17b104fa17be88672fb0379e8ca26a4f978564b1b0b", size = 1226068, upload-time = "2026-02-18T09:25:28.853Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/63/03/f3b11452636bcb8f8fb4b2daa3301781eca7ea1b2ee5781fdc888e315b43/django_unfold-0.81.0-py3-none-any.whl", hash = "sha256:7a800fcf7ac438ae473ffa51cdfbb22ef0e6e8455dad84ce1e1846ddd21deac9", size = 1226399, upload-time = "2026-02-25T09:48:40.646Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -3148,11 +3148,11 @@ wheels = [
|
|||
|
||||
[[package]]
|
||||
name = "redis"
|
||||
version = "7.2.0"
|
||||
version = "7.2.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/9f/32/6fac13a11e73e1bc67a2ae821a72bfe4c2d8c4c48f0267e4a952be0f1bae/redis-7.2.0.tar.gz", hash = "sha256:4dd5bf4bd4ae80510267f14185a15cba2a38666b941aff68cccf0256b51c1f26", size = 4901247, upload-time = "2026-02-16T17:16:22.797Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/e9/31/1476f206482dd9bc53fdbbe9f6fbd5e05d153f18e54667ce839df331f2e6/redis-7.2.1.tar.gz", hash = "sha256:6163c1a47ee2d9d01221d8456bc1c75ab953cbda18cfbc15e7140e9ba16ca3a5", size = 4906735, upload-time = "2026-02-25T20:05:18.171Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/86/cf/f6180b67f99688d83e15c84c5beda831d1d341e95872d224f87ccafafe61/redis-7.2.0-py3-none-any.whl", hash = "sha256:01f591f8598e483f1842d429e8ae3a820804566f1c73dca1b80e23af9fba0497", size = 394898, upload-time = "2026-02-16T17:16:20.693Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ca/98/1dd1a5c060916cf21d15e67b7d6a7078e26e2605d5c37cbc9f4f5454c478/redis-7.2.1-py3-none-any.whl", hash = "sha256:49e231fbc8df2001436ae5252b3f0f3dc930430239bfeb6da4c7ee92b16e5d33", size = 396057, upload-time = "2026-02-25T20:05:16.533Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -3295,27 +3295,27 @@ wheels = [
|
|||
|
||||
[[package]]
|
||||
name = "ruff"
|
||||
version = "0.15.2"
|
||||
version = "0.15.4"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/06/04/eab13a954e763b0606f460443fcbf6bb5a0faf06890ea3754ff16523dce5/ruff-0.15.2.tar.gz", hash = "sha256:14b965afee0969e68bb871eba625343b8673375f457af4abe98553e8bbb98342", size = 4558148, upload-time = "2026-02-19T22:32:20.271Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/da/31/d6e536cdebb6568ae75a7f00e4b4819ae0ad2640c3604c305a0428680b0c/ruff-0.15.4.tar.gz", hash = "sha256:3412195319e42d634470cc97aa9803d07e9d5c9223b99bcb1518f0c725f26ae1", size = 4569550, upload-time = "2026-02-26T20:04:14.959Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/2f/70/3a4dc6d09b13cb3e695f28307e5d889b2e1a66b7af9c5e257e796695b0e6/ruff-0.15.2-py3-none-linux_armv6l.whl", hash = "sha256:120691a6fdae2f16d65435648160f5b81a9625288f75544dc40637436b5d3c0d", size = 10430565, upload-time = "2026-02-19T22:32:41.824Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/71/0b/bb8457b56185ece1305c666dc895832946d24055be90692381c31d57466d/ruff-0.15.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a89056d831256099658b6bba4037ac6dd06f49d194199215befe2bb10457ea5e", size = 10820354, upload-time = "2026-02-19T22:32:07.366Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2d/c1/e0532d7f9c9e0b14c46f61b14afd563298b8b83f337b6789ddd987e46121/ruff-0.15.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e36dee3a64be0ebd23c86ffa3aa3fd3ac9a712ff295e192243f814a830b6bd87", size = 10170767, upload-time = "2026-02-19T22:32:13.188Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/47/e8/da1aa341d3af017a21c7a62fb5ec31d4e7ad0a93ab80e3a508316efbcb23/ruff-0.15.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9fb47b6d9764677f8c0a193c0943ce9a05d6763523f132325af8a858eadc2b9", size = 10529591, upload-time = "2026-02-19T22:32:02.547Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/93/74/184fbf38e9f3510231fbc5e437e808f0b48c42d1df9434b208821efcd8d6/ruff-0.15.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f376990f9d0d6442ea9014b19621d8f2aaf2b8e39fdbfc79220b7f0c596c9b80", size = 10260771, upload-time = "2026-02-19T22:32:36.938Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/05/ac/605c20b8e059a0bc4b42360414baa4892ff278cec1c91fff4be0dceedefd/ruff-0.15.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2dcc987551952d73cbf5c88d9fdee815618d497e4df86cd4c4824cc59d5dd75f", size = 11045791, upload-time = "2026-02-19T22:32:31.642Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fd/52/db6e419908f45a894924d410ac77d64bdd98ff86901d833364251bd08e22/ruff-0.15.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42a47fd785cbe8c01b9ff45031af875d101b040ad8f4de7bbb716487c74c9a77", size = 11879271, upload-time = "2026-02-19T22:32:29.305Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3e/d8/7992b18f2008bdc9231d0f10b16df7dda964dbf639e2b8b4c1b4e91b83af/ruff-0.15.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbe9f49354866e575b4c6943856989f966421870e85cd2ac94dccb0a9dcb2fea", size = 11303707, upload-time = "2026-02-19T22:32:22.492Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d7/02/849b46184bcfdd4b64cde61752cc9a146c54759ed036edd11857e9b8443b/ruff-0.15.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7a672c82b5f9887576087d97be5ce439f04bbaf548ee987b92d3a7dede41d3a", size = 11149151, upload-time = "2026-02-19T22:32:44.234Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/70/04/f5284e388bab60d1d3b99614a5a9aeb03e0f333847e2429bebd2aaa1feec/ruff-0.15.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ecc64f46f7019e2bcc3cdc05d4a7da958b629a5ab7033195e11a438403d956", size = 11091132, upload-time = "2026-02-19T22:32:24.691Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fa/ae/88d844a21110e14d92cf73d57363fab59b727ebeabe78009b9ccb23500af/ruff-0.15.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:8dcf243b15b561c655c1ef2f2b0050e5d50db37fe90115507f6ff37d865dc8b4", size = 10504717, upload-time = "2026-02-19T22:32:26.75Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/64/27/867076a6ada7f2b9c8292884ab44d08fd2ba71bd2b5364d4136f3cd537e1/ruff-0.15.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dab6941c862c05739774677c6273166d2510d254dac0695c0e3f5efa1b5585de", size = 10263122, upload-time = "2026-02-19T22:32:10.036Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e7/ef/faf9321d550f8ebf0c6373696e70d1758e20ccdc3951ad7af00c0956be7c/ruff-0.15.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1b9164f57fc36058e9a6806eb92af185b0697c9fe4c7c52caa431c6554521e5c", size = 10735295, upload-time = "2026-02-19T22:32:39.227Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2f/55/e8089fec62e050ba84d71b70e7834b97709ca9b7aba10c1a0b196e493f97/ruff-0.15.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:80d24fcae24d42659db7e335b9e1531697a7102c19185b8dc4a028b952865fd8", size = 11241641, upload-time = "2026-02-19T22:32:34.617Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/23/01/1c30526460f4d23222d0fabd5888868262fd0e2b71a00570ca26483cd993/ruff-0.15.2-py3-none-win32.whl", hash = "sha256:fd5ff9e5f519a7e1bd99cbe8daa324010a74f5e2ebc97c6242c08f26f3714f6f", size = 10507885, upload-time = "2026-02-19T22:32:15.635Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5c/10/3d18e3bbdf8fc50bbb4ac3cc45970aa5a9753c5cb51bf9ed9a3cd8b79fa3/ruff-0.15.2-py3-none-win_amd64.whl", hash = "sha256:d20014e3dfa400f3ff84830dfb5755ece2de45ab62ecea4af6b7262d0fb4f7c5", size = 11623725, upload-time = "2026-02-19T22:32:04.947Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6d/78/097c0798b1dab9f8affe73da9642bb4500e098cb27fd8dc9724816ac747b/ruff-0.15.2-py3-none-win_arm64.whl", hash = "sha256:cabddc5822acdc8f7b5527b36ceac55cc51eec7b1946e60181de8fe83ca8876e", size = 10941649, upload-time = "2026-02-19T22:32:18.108Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f2/82/c11a03cfec3a4d26a0ea1e571f0f44be5993b923f905eeddfc397c13d360/ruff-0.15.4-py3-none-linux_armv6l.whl", hash = "sha256:a1810931c41606c686bae8b5b9a8072adac2f611bb433c0ba476acba17a332e0", size = 10453333, upload-time = "2026-02-26T20:04:20.093Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ce/5d/6a1f271f6e31dffb31855996493641edc3eef8077b883eaf007a2f1c2976/ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5a1632c66672b8b4d3e1d1782859e98d6e0b4e70829530666644286600a33992", size = 10853356, upload-time = "2026-02-26T20:04:05.808Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b1/d8/0fab9f8842b83b1a9c2bf81b85063f65e93fb512e60effa95b0be49bfc54/ruff-0.15.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a4386ba2cd6c0f4ff75252845906acc7c7c8e1ac567b7bc3d373686ac8c222ba", size = 10187434, upload-time = "2026-02-26T20:03:54.656Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/85/cc/cc220fd9394eff5db8d94dec199eec56dd6c9f3651d8869d024867a91030/ruff-0.15.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2496488bdfd3732747558b6f95ae427ff066d1fcd054daf75f5a50674411e75", size = 10535456, upload-time = "2026-02-26T20:03:52.738Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fa/0f/bced38fa5cf24373ec767713c8e4cadc90247f3863605fb030e597878661/ruff-0.15.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3f1c4893841ff2d54cbda1b2860fa3260173df5ddd7b95d370186f8a5e66a4ac", size = 10287772, upload-time = "2026-02-26T20:04:08.138Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2b/90/58a1802d84fed15f8f281925b21ab3cecd813bde52a8ca033a4de8ab0e7a/ruff-0.15.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:820b8766bd65503b6c30aaa6331e8ef3a6e564f7999c844e9a547c40179e440a", size = 11049051, upload-time = "2026-02-26T20:04:03.53Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d2/ac/b7ad36703c35f3866584564dc15f12f91cb1a26a897dc2fd13d7cb3ae1af/ruff-0.15.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9fb74bab47139c1751f900f857fa503987253c3ef89129b24ed375e72873e85", size = 11890494, upload-time = "2026-02-26T20:04:10.497Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/93/3d/3eb2f47a39a8b0da99faf9c54d3eb24720add1e886a5309d4d1be73a6380/ruff-0.15.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f80c98765949c518142b3a50a5db89343aa90f2c2bf7799de9986498ae6176db", size = 11326221, upload-time = "2026-02-26T20:04:12.84Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ff/90/bf134f4c1e5243e62690e09d63c55df948a74084c8ac3e48a88468314da6/ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451a2e224151729b3b6c9ffb36aed9091b2996fe4bdbd11f47e27d8f2e8888ec", size = 11168459, upload-time = "2026-02-26T20:04:00.969Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b5/e5/a64d27688789b06b5d55162aafc32059bb8c989c61a5139a36e1368285eb/ruff-0.15.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a8f157f2e583c513c4f5f896163a93198297371f34c04220daf40d133fdd4f7f", size = 11104366, upload-time = "2026-02-26T20:03:48.099Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f1/f6/32d1dcb66a2559763fc3027bdd65836cad9eb09d90f2ed6a63d8e9252b02/ruff-0.15.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:917cc68503357021f541e69b35361c99387cdbbf99bd0ea4aa6f28ca99ff5338", size = 10510887, upload-time = "2026-02-26T20:03:45.771Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ff/92/22d1ced50971c5b6433aed166fcef8c9343f567a94cf2b9d9089f6aa80fe/ruff-0.15.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e9737c8161da79fd7cfec19f1e35620375bd8b2a50c3e77fa3d2c16f574105cc", size = 10285939, upload-time = "2026-02-26T20:04:22.42Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e6/f4/7c20aec3143837641a02509a4668fb146a642fd1211846634edc17eb5563/ruff-0.15.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:291258c917539e18f6ba40482fe31d6f5ac023994ee11d7bdafd716f2aab8a68", size = 10765471, upload-time = "2026-02-26T20:03:58.924Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d0/09/6d2f7586f09a16120aebdff8f64d962d7c4348313c77ebb29c566cefc357/ruff-0.15.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3f83c45911da6f2cd5936c436cf86b9f09f09165f033a99dcf7477e34041cbc3", size = 11263382, upload-time = "2026-02-26T20:04:24.424Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/1b/fa/2ef715a1cd329ef47c1a050e10dee91a9054b7ce2fcfdd6a06d139afb7ec/ruff-0.15.4-py3-none-win32.whl", hash = "sha256:65594a2d557d4ee9f02834fcdf0a28daa8b3b9f6cb2cb93846025a36db47ef22", size = 10506664, upload-time = "2026-02-26T20:03:50.56Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl", hash = "sha256:04196ad44f0df220c2ece5b0e959c2f37c777375ec744397d21d15b50a75264f", size = 11651048, upload-time = "2026-02-26T20:04:17.191Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3e/0a/9e1be9035b37448ce2e68c978f0591da94389ade5a5abafa4cf99985d1b2/ruff-0.15.4-py3-none-win_arm64.whl", hash = "sha256:60d5177e8cfc70e51b9c5fad936c634872a74209f934c1e79107d11787ad5453", size = 10966776, upload-time = "2026-02-26T20:03:56.908Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -3451,7 +3451,7 @@ requires-dist = [
|
|||
{ name = "django-redis", specifier = "==6.0.0" },
|
||||
{ name = "django-storages", specifier = "==1.14.6" },
|
||||
{ name = "django-stubs", marker = "extra == 'linting'", specifier = "==5.2.9" },
|
||||
{ name = "django-unfold", specifier = "==0.80.2" },
|
||||
{ name = "django-unfold", specifier = "==0.81.0" },
|
||||
{ name = "django-widget-tweaks", specifier = "==1.5.1" },
|
||||
{ name = "djangoql", specifier = "==0.19.1" },
|
||||
{ name = "djangorestframework", specifier = "==3.16.1" },
|
||||
|
|
@ -3483,9 +3483,9 @@ requires-dist = [
|
|||
{ name = "pytest", specifier = "==9.0.2" },
|
||||
{ name = "pytest-django", specifier = "==4.12.0" },
|
||||
{ name = "python-slugify", specifier = "==8.0.4" },
|
||||
{ name = "redis", specifier = "==7.2.0" },
|
||||
{ name = "redis", specifier = "==7.2.1" },
|
||||
{ name = "requests", specifier = "==2.32.5" },
|
||||
{ name = "ruff", marker = "extra == 'linting'", specifier = "==0.15.2" },
|
||||
{ name = "ruff", marker = "extra == 'linting'", specifier = "==0.15.4" },
|
||||
{ name = "sentry-sdk", extras = ["django", "celery", "opentelemetry"], specifier = "==2.53.0" },
|
||||
{ name = "six", specifier = "==1.17.0" },
|
||||
{ name = "swapper", specifier = "==1.4.0" },
|
||||
|
|
@ -3499,7 +3499,7 @@ requires-dist = [
|
|||
{ name = "types-six", marker = "extra == 'linting'", specifier = "==1.17.0.20251009" },
|
||||
{ name = "uvicorn", specifier = "==0.41.0" },
|
||||
{ name = "websockets", specifier = "==16.0" },
|
||||
{ name = "whitenoise", specifier = "==6.11.0" },
|
||||
{ name = "whitenoise", specifier = "==6.12.0" },
|
||||
{ name = "zeep", specifier = "==4.3.2" },
|
||||
]
|
||||
provides-extras = ["worker", "linting", "openai", "jupyter"]
|
||||
|
|
@ -4005,11 +4005,11 @@ wheels = [
|
|||
|
||||
[[package]]
|
||||
name = "whitenoise"
|
||||
version = "6.11.0"
|
||||
version = "6.12.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/15/95/8c81ec6b6ebcbf8aca2de7603070ccf37dbb873b03f20708e0f7c1664bc6/whitenoise-6.11.0.tar.gz", hash = "sha256:0f5bfce6061ae6611cd9396a8231e088722e4fc67bc13a111be74c738d99375f", size = 26432, upload-time = "2025-09-18T09:16:10.995Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/cb/2a/55b3f3a4ec326cd077c1c3defeee656b9298372a69229134d930151acd01/whitenoise-6.12.0.tar.gz", hash = "sha256:f723ebb76a112e98816ff80fcea0a6c9b8ecde835f8ddda25df7a30a3c2db6ad", size = 26841, upload-time = "2026-02-27T00:05:42.028Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/6c/e9/4366332f9295fe0647d7d3251ce18f5615fbcb12d02c79a26f8dba9221b3/whitenoise-6.11.0-py3-none-any.whl", hash = "sha256:b2aeb45950597236f53b5342b3121c5de69c8da0109362aee506ce88e022d258", size = 20197, upload-time = "2025-09-18T09:16:09.754Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/db/eb/d5583a11486211f3ebd4b385545ae787f32363d453c19fffd81106c9c138/whitenoise-6.12.0-py3-none-any.whl", hash = "sha256:fc5e8c572e33ebf24795b47b6a7da8da3c00cff2349f5b04c02f28d0cc5a3cc2", size = 20302, upload-time = "2026-02-27T00:05:40.086Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
|
|||
Loading…
Reference in a new issue