feat(demo_data): enhance data with images, new categories, and multilingual updates

Expanded demo content with additional images for products and blog posts, improving user experience. Added new categories such as "Jewelry" and "Services," along with their subcategories. Supported richer multilingual descriptions and included new brands, ensuring broader and detailed offerings.
This commit is contained in:
Egor Pavlovich Gorbunov 2026-02-21 18:07:07 +03:00
parent 83a8ecfcee
commit 1c10d5ca53
45 changed files with 633 additions and 82 deletions

View file

@ -2,7 +2,10 @@
"category_tags": [
{"tag_name": "precious", "name": "Precious Stones", "name_ru": "Драгоценные камни"},
{"tag_name": "semi-precious", "name": "Semi-Precious Stones", "name_ru": "Полудрагоценные камни"},
{"tag_name": "organic", "name": "Organic Gems", "name_ru": "Органические камни"}
{"tag_name": "organic", "name": "Organic Gems", "name_ru": "Органические камни"},
{"tag_name": "jewelry", "name": "Jewelry", "name_ru": "Ювелирные изделия"},
{"tag_name": "services", "name": "Services", "name_ru": "Услуги"},
{"tag_name": "metals", "name": "Precious Metals", "name_ru": "Драгоценные металлы"}
],
"product_tags": [
{"tag_name": "certified", "name": "GIA Certified", "name_ru": "Сертификат GIA"},
@ -73,6 +76,21 @@
"name_ru": "Хрустальное Королевство",
"description": "Quartz varieties and crystal formations of museum quality.",
"description_ru": "Разновидности кварца и кристаллические образования музейного качества."
},
{
"name": "Maison Royale",
"description": "Exquisite handcrafted jewelry blending timeless design with contemporary elegance.",
"description_ru": "Изысканные ювелирные изделия ручной работы, сочетающие вечный дизайн с современной элегантностью."
},
{
"name": "Artisan's Forge",
"description": "Contemporary jewelry atelier specializing in unique, bespoke pieces.",
"description_ru": "Современное ювелирное ателье, специализирующееся на уникальных изделиях по индивидуальному заказу."
},
{
"name": "Noble Metals Trading",
"description": "Premium precious metals for investment, jewelry making, and industrial applications.",
"description_ru": "Премиальные драгоценные металлы для инвестиций, ювелирного дела и промышленного применения."
}
],
"categories": [
@ -163,6 +181,150 @@
"description_ru": "Многоцветные драгоценные камни с электрическими свойствами",
"parent": "Gemstones",
"markup_percent": 7
},
{
"name": "Jewelry",
"name_ru": "Ювелирные изделия",
"description": "Handcrafted fine jewelry featuring precious gemstones and metals",
"description_ru": "Ювелирные изделия ручной работы с драгоценными камнями и металлами",
"parent": null,
"markup_percent": 0
},
{
"name": "Rings",
"name_ru": "Кольца",
"description": "Engagement rings, cocktail rings, and statement pieces",
"description_ru": "Обручальные кольца, коктейльные кольца и эффектные украшения",
"parent": "Jewelry",
"markup_percent": 20
},
{
"name": "Necklaces & Pendants",
"name_ru": "Колье и подвески",
"description": "Elegant necklaces and pendants for every occasion",
"description_ru": "Элегантные колье и подвески для любого случая",
"parent": "Jewelry",
"markup_percent": 18
},
{
"name": "Earrings",
"name_ru": "Серьги",
"description": "Studs, drops, and chandelier earrings",
"description_ru": "Серьги-гвоздики, серьги-капли и каскадные серьги",
"parent": "Jewelry",
"markup_percent": 15
},
{
"name": "Bracelets & Bangles",
"name_ru": "Браслеты и обручи",
"description": "Tennis bracelets, bangles, and chain bracelets",
"description_ru": "Теннисные браслеты, обручи и цепочные браслеты",
"parent": "Jewelry",
"markup_percent": 15
},
{
"name": "Brooches & Pins",
"name_ru": "Броши и булавки",
"description": "Decorative brooches and lapel pins",
"description_ru": "Декоративные броши и булавки для лацканов",
"parent": "Jewelry",
"markup_percent": 12
},
{
"name": "Services",
"name_ru": "Услуги",
"description": "Professional gemological and jewelry services",
"description_ru": "Профессиональные геммологические и ювелирные услуги",
"parent": null,
"markup_percent": 0
},
{
"name": "Gemstone Appraisal",
"name_ru": "Оценка камней",
"description": "Professional gemstone evaluation and certification services",
"description_ru": "Профессиональная оценка и сертификация драгоценных камней",
"parent": "Services",
"markup_percent": 0
},
{
"name": "Custom Jewelry Design",
"name_ru": "Индивидуальный дизайн",
"description": "Bespoke jewelry design and 3D rendering services",
"description_ru": "Дизайн ювелирных изделий по индивидуальному заказу и 3D-моделирование",
"parent": "Services",
"markup_percent": 0
},
{
"name": "Stone Setting",
"name_ru": "Закрепка камней",
"description": "Professional stone setting in various mount styles",
"description_ru": "Профессиональная закрепка камней в различных типах оправ",
"parent": "Services",
"markup_percent": 0
},
{
"name": "Jewelry Repair",
"name_ru": "Ремонт украшений",
"description": "Restoration and repair services for fine jewelry",
"description_ru": "Реставрация и ремонт ювелирных изделий",
"parent": "Services",
"markup_percent": 0
},
{
"name": "Stone Cutting",
"name_ru": "Огранка камней",
"description": "Custom gemstone cutting, re-cutting, and polishing",
"description_ru": "Индивидуальная огранка, переогранка и полировка камней",
"parent": "Services",
"markup_percent": 0
},
{
"name": "Metals",
"name_ru": "Металлы",
"description": "Precious metals for investment and jewelry making",
"description_ru": "Драгоценные металлы для инвестиций и ювелирного дела",
"parent": null,
"markup_percent": 0
},
{
"name": "Gold",
"name_ru": "Золото",
"description": "Fine gold in bars, coins, and raw forms",
"description_ru": "Золото в слитках, монетах и необработанном виде",
"parent": "Metals",
"markup_percent": 3
},
{
"name": "Silver",
"name_ru": "Серебро",
"description": "Sterling and fine silver for crafting and investment",
"description_ru": "Стерлинговое и чистое серебро для мастерства и инвестиций",
"parent": "Metals",
"markup_percent": 5
},
{
"name": "Platinum",
"name_ru": "Платина",
"description": "Premium platinum for jewelry and investment",
"description_ru": "Премиальная платина для ювелирных изделий и инвестиций",
"parent": "Metals",
"markup_percent": 4
},
{
"name": "Palladium",
"name_ru": "Палладий",
"description": "Palladium products for jewelry and industrial use",
"description_ru": "Изделия из палладия для ювелирного дела и промышленности",
"parent": "Metals",
"markup_percent": 4
},
{
"name": "Rhodium",
"name_ru": "Родий",
"description": "Rhodium plating materials and services",
"description_ru": "Материалы и услуги для родирования",
"parent": "Metals",
"markup_percent": 6
}
],
"products": [
@ -801,6 +963,377 @@
"price": 380,
"purchase_price": 300,
"quantity": 5
},
{
"name": "Diamond Solitaire Engagement Ring",
"name_ru": "Помолвочное кольцо с бриллиантом-солитером",
"description": "Classic 18K white gold engagement ring featuring a 1.0ct round brilliant diamond. Six-prong Tiffany-style setting with a comfort-fit band. GIA certified stone included.",
"description_ru": "Классическое помолвочное кольцо из белого золота 18K с бриллиантом круглой огранки 1.0 карата. Закрепка в стиле Тиффани с шестью крапанами и ободком комфортной посадки. В комплекте камень с сертификатом GIA.",
"category": "Rings",
"brand": "Maison Royale",
"partnumber": "JWL-RNG-DIA-SOL",
"price": 8500,
"purchase_price": 6800,
"quantity": 5
},
{
"name": "Ruby & Diamond Halo Ring",
"name_ru": "Кольцо с рубином и бриллиантовым гало",
"description": "Stunning 14K rose gold ring with a 1.2ct oval ruby center stone surrounded by a halo of 0.5ctw round diamonds. Vintage-inspired design with milgrain detailing.",
"description_ru": "Потрясающее кольцо из розового золота 14K с овальным рубином 1.2 карата в центре, обрамлённым ореолом бриллиантов общим весом 0.5 карата. Дизайн в винтажном стиле с миллигрейной отделкой.",
"category": "Rings",
"brand": "Maison Royale",
"partnumber": "JWL-RNG-RBY-HLO",
"price": 4200,
"purchase_price": 3400,
"quantity": 4
},
{
"name": "Emerald Pendant Necklace",
"name_ru": "Колье с изумрудной подвеской",
"description": "Elegant 18K yellow gold pendant featuring a 2.0ct pear-shaped Colombian emerald. Suspended on a delicate 18-inch cable chain. Includes quality assessment certificate.",
"description_ru": "Элегантная подвеска из жёлтого золота 18K с колумбийским изумрудом грушевидной формы 2.0 карата. Подвешена на изящной якорной цепочке длиной 45 см. В комплекте сертификат оценки качества.",
"category": "Necklaces & Pendants",
"brand": "Maison Royale",
"partnumber": "JWL-NCK-EME-PND",
"price": 12000,
"purchase_price": 9600,
"quantity": 3
},
{
"name": "Diamond Tennis Necklace",
"name_ru": "Бриллиантовое теннисное колье",
"description": "Luxurious 14K white gold tennis necklace with 5.0ctw round brilliant diamonds. 16-inch length with secure box clasp and safety catch. Each diamond is VS clarity, G-H color.",
"description_ru": "Роскошное теннисное колье из белого золота 14K с бриллиантами круглой огранки общим весом 5.0 карата. Длина 40 см с надёжным замком-коробочкой и предохранителем. Каждый бриллиант чистоты VS, цвета G-H.",
"category": "Necklaces & Pendants",
"brand": "Maison Royale",
"partnumber": "JWL-NCK-DIA-TNS",
"price": 15500,
"purchase_price": 12400,
"quantity": 2
},
{
"name": "Diamond Stud Earrings",
"name_ru": "Серьги-гвоздики с бриллиантами",
"description": "Classic 14K white gold diamond stud earrings with 1.0ctw total weight. Matched pair of round brilliant diamonds, E-F color, VS1-VS2 clarity. Four-prong basket setting with friction backs.",
"description_ru": "Классические серьги-гвоздики из белого золота 14K с бриллиантами общим весом 1.0 карата. Подобранная пара бриллиантов круглой огранки, цвет E-F, чистота VS1-VS2. Четырёхкрапанная закрепка с фрикционными застёжками.",
"category": "Earrings",
"brand": "Artisan's Forge",
"partnumber": "JWL-EAR-DIA-STD",
"price": 5200,
"purchase_price": 4200,
"quantity": 6
},
{
"name": "Sapphire Drop Earrings",
"name_ru": "Серьги-капли с сапфирами",
"description": "Elegant 18K gold drop earrings featuring 2.0ctw pear-shaped Ceylon sapphires accented by 0.3ctw diamond halos. Lever-back closure for secure, comfortable wear.",
"description_ru": "Элегантные серьги-капли из золота 18K с грушевидными цейлонскими сапфирами общим весом 2.0 карата, обрамлёнными бриллиантовым гало общим весом 0.3 карата. Застёжка с английским замком для надёжного и комфортного ношения.",
"category": "Earrings",
"brand": "Maison Royale",
"partnumber": "JWL-EAR-SAP-DRP",
"price": 3800,
"purchase_price": 3050,
"quantity": 4
},
{
"name": "Diamond Tennis Bracelet",
"name_ru": "Бриллиантовый теннисный браслет",
"description": "Timeless 14K white gold tennis bracelet with 3.0ctw round brilliant diamonds. 7-inch length with secure double-lock clasp. Diamonds are G-H color, VS clarity.",
"description_ru": "Вечный теннисный браслет из белого золота 14K с бриллиантами круглой огранки общим весом 3.0 карата. Длина 18 см с надёжным двойным замком. Бриллианты цвета G-H, чистоты VS.",
"category": "Bracelets & Bangles",
"brand": "Maison Royale",
"partnumber": "JWL-BRC-DIA-TNS",
"price": 8800,
"purchase_price": 7050,
"quantity": 3
},
{
"name": "Emerald & Gold Bangle",
"name_ru": "Обруч с изумрудами и золотом",
"description": "Sophisticated 18K yellow gold bangle set with 1.5ctw emerald-cut emeralds and 0.5ctw accent diamonds. Hinged design with safety chain. Inner circumference 6.5 inches.",
"description_ru": "Утончённый обруч из жёлтого золота 18K с изумрудами изумрудной огранки общим весом 1.5 карата и бриллиантовыми акцентами общим весом 0.5 карата. Шарнирный дизайн с предохранительной цепочкой. Внутренний обхват 16.5 см.",
"category": "Bracelets & Bangles",
"brand": "Artisan's Forge",
"partnumber": "JWL-BRC-EME-BNG",
"price": 6500,
"purchase_price": 5200,
"quantity": 2
},
{
"name": "Diamond Floral Brooch",
"name_ru": "Бриллиантовая цветочная брошь",
"description": "Art Nouveau inspired platinum brooch with 2.0ctw diamonds arranged in a floral motif. Features round brilliant and marquise-cut diamonds with exceptional sparkle.",
"description_ru": "Брошь из платины в стиле ар-нуво с бриллиантами общим весом 2.0 карата, выложенными в цветочный мотив. Включает бриллианты круглой и маркизной огранки с исключительным блеском.",
"category": "Brooches & Pins",
"brand": "Maison Royale",
"partnumber": "JWL-BRH-DIA-FLR",
"price": 4500,
"purchase_price": 3600,
"quantity": 3
},
{
"name": "Multi-Gem Lapel Pin",
"name_ru": "Булавка для лацкана с мульти-камнями",
"description": "Contemporary 18K gold lapel pin featuring a curated mix of sapphire, ruby, and emerald cabochons totaling 1.2ct. Modern geometric design by Artisan's Forge.",
"description_ru": "Современная булавка для лацкана из золота 18K с подобранной комбинацией кабошонов сапфира, рубина и изумруда общим весом 1.2 карата. Современный геометрический дизайн от Кузницы Мастера.",
"category": "Brooches & Pins",
"brand": "Artisan's Forge",
"partnumber": "JWL-BRH-GEM-LPL",
"price": 2800,
"purchase_price": 2250,
"quantity": 5
},
{
"name": "Standard Gemstone Appraisal",
"name_ru": "Стандартная оценка камня",
"description": "Professional appraisal of a single gemstone by our certified gemologist. Includes identification, weight verification, color and clarity grading, treatment detection, and a detailed written report.",
"description_ru": "Профессиональная оценка одного драгоценного камня нашим сертифицированным геммологом. Включает идентификацию, проверку веса, определение цвета и чистоты, обнаружение обработки и подробный письменный отчёт.",
"category": "Gemstone Appraisal",
"brand": null,
"partnumber": "SVC-APR-STD",
"price": 150,
"purchase_price": 80,
"quantity": 999,
"is_digital": true
},
{
"name": "Collection Appraisal Package",
"name_ru": "Оценка коллекции",
"description": "Comprehensive appraisal service for up to 10 gemstones. Ideal for estate evaluation, insurance documentation, or collection inventory. Each stone receives individual assessment and photography.",
"description_ru": "Комплексная услуга оценки до 10 драгоценных камней. Идеальна для оценки наследства, страховой документации или инвентаризации коллекции. Каждый камень получает индивидуальную оценку и фотографирование.",
"category": "Gemstone Appraisal",
"brand": null,
"partnumber": "SVC-APR-COL",
"price": 500,
"purchase_price": 250,
"quantity": 999,
"is_digital": true
},
{
"name": "Design Consultation Session",
"name_ru": "Консультация по дизайну",
"description": "One-on-one consultation with our master jeweler to discuss your custom piece. Includes initial sketches, material recommendations, stone selection guidance, and a detailed project estimate.",
"description_ru": "Индивидуальная консультация с нашим мастером-ювелиром по созданию изделия на заказ. Включает начальные эскизы, рекомендации по материалам, помощь в выборе камней и детальную смету проекта.",
"category": "Custom Jewelry Design",
"brand": null,
"partnumber": "SVC-DSN-CSL",
"price": 250,
"purchase_price": 100,
"quantity": 999,
"is_digital": true
},
{
"name": "Full Custom Design & 3D Rendering",
"name_ru": "Полный дизайн и 3D-моделирование",
"description": "Complete custom jewelry design service including CAD modeling, photorealistic 3D rendering, and wax prototype. Two rounds of revisions included. Final design ready for production.",
"description_ru": "Полная услуга индивидуального дизайна ювелирного изделия, включая CAD-моделирование, фотореалистичный 3D-рендеринг и восковой прототип. Включены два раунда правок. Финальный дизайн готов к производству.",
"category": "Custom Jewelry Design",
"brand": null,
"partnumber": "SVC-DSN-3DR",
"price": 800,
"purchase_price": 350,
"quantity": 999,
"is_digital": true
},
{
"name": "Standard Prong Setting",
"name_ru": "Стандартная крапановая закрепка",
"description": "Professional prong setting service for a single gemstone. Includes four or six-prong setting in your choice of gold, platinum, or silver mount. Stone security guaranteed.",
"description_ru": "Профессиональная услуга крапановой закрепки одного драгоценного камня. Включает четырёх- или шестикрапанную закрепку в выбранной вами оправе из золота, платины или серебра. Гарантия надёжности крепления камня.",
"category": "Stone Setting",
"brand": null,
"partnumber": "SVC-SET-PRG",
"price": 200,
"purchase_price": 100,
"quantity": 999,
"is_digital": true
},
{
"name": "Pavé Setting Service",
"name_ru": "Закрепка паве",
"description": "Expert pavé or channel setting of small accent stones. Price per stone for melee diamonds or colored gemstones. Minimum 10 stones per order. Includes stone alignment and leveling.",
"description_ru": "Экспертная закрепка паве или канальная закрепка мелких акцентных камней. Цена за камень для бриллиантов мелле или цветных камней. Минимум 10 камней в заказе. Включает выравнивание и нивелировку камней.",
"category": "Stone Setting",
"brand": null,
"partnumber": "SVC-SET-PVE",
"price": 45,
"purchase_price": 20,
"quantity": 999,
"is_digital": true
},
{
"name": "Basic Jewelry Repair",
"name_ru": "Базовый ремонт украшений",
"description": "Standard repair services including ring sizing (up or down 2 sizes), prong retipping, clasp replacement, and chain soldering. Turnaround time 3-5 business days.",
"description_ru": "Стандартные ремонтные услуги, включая изменение размера кольца (на 2 размера вверх или вниз), восстановление крапанов, замену застёжек и пайку цепочек. Срок выполнения 3-5 рабочих дней.",
"category": "Jewelry Repair",
"brand": null,
"partnumber": "SVC-RPR-BSC",
"price": 120,
"purchase_price": 60,
"quantity": 999,
"is_digital": true
},
{
"name": "Full Restoration Service",
"name_ru": "Полная реставрация",
"description": "Comprehensive jewelry restoration including cleaning, polishing, rhodium plating, stone tightening, and structural repair. Ideal for heirloom and vintage pieces. Includes before/after documentation.",
"description_ru": "Комплексная реставрация ювелирного изделия, включая чистку, полировку, родирование, подтяжку камней и структурный ремонт. Идеальна для фамильных и винтажных украшений. Включает документацию «до и после».",
"category": "Jewelry Repair",
"brand": null,
"partnumber": "SVC-RPR-FUL",
"price": 650,
"purchase_price": 300,
"quantity": 999,
"is_digital": true
},
{
"name": "Standard Gemstone Re-cutting",
"name_ru": "Стандартная переогранка камня",
"description": "Professional re-cutting of an existing gemstone to improve brilliance, repair damage, or change shape. Includes precision faceting on state-of-the-art equipment. Weight loss assessment provided before work begins.",
"description_ru": "Профессиональная переогранка существующего драгоценного камня для улучшения блеска, устранения повреждений или изменения формы. Включает прецизионную огранку на современном оборудовании. Оценка потери веса предоставляется до начала работ.",
"category": "Stone Cutting",
"brand": null,
"partnumber": "SVC-CUT-STD",
"price": 300,
"purchase_price": 150,
"quantity": 999,
"is_digital": true
},
{
"name": "Custom Fantasy Cut",
"name_ru": "Индивидуальная фантазийная огранка",
"description": "Bespoke fantasy or designer cut for rough or pre-cut gemstones. Our master cutter creates unique facet patterns that maximize color, brilliance, and visual impact. Includes design consultation.",
"description_ru": "Индивидуальная фантазийная или дизайнерская огранка необработанных или предварительно огранённых камней. Наш мастер-огранщик создаёт уникальные рисунки граней, максимизирующие цвет, блеск и визуальный эффект. Включает консультацию по дизайну.",
"category": "Stone Cutting",
"brand": null,
"partnumber": "SVC-CUT-FNT",
"price": 1200,
"purchase_price": 550,
"quantity": 999,
"is_digital": true
},
{
"name": "24K Gold Bar 1oz LBMA",
"name_ru": "Слиток золота 24K 1 унция LBMA",
"description": "Investment-grade 1 troy ounce gold bar, 999.9 fine (24K). LBMA certified with unique serial number and assay certificate. Sealed in tamper-evident packaging.",
"description_ru": "Инвестиционный слиток золота 1 тройская унция, проба 999.9 (24K). Сертификат LBMA с уникальным серийным номером и пробирным сертификатом. В запечатанной защитной упаковке.",
"category": "Gold",
"brand": "Noble Metals Trading",
"partnumber": "MTL-GLD-BAR-1OZ",
"price": 2100,
"purchase_price": 1950,
"quantity": 20
},
{
"name": "18K Gold Wire 1mm (per gram)",
"name_ru": "Золотая проволока 18K 1мм (за грамм)",
"description": "Premium 18K (750) gold wire, 1mm diameter. Ideal for jewelry making, custom settings, and repair work. Sold per gram. Available in yellow, white, and rose gold alloys.",
"description_ru": "Премиальная золотая проволока 18K (750), диаметр 1 мм. Идеальна для ювелирного дела, индивидуальных оправ и ремонтных работ. Продаётся за грамм. Доступна в сплавах жёлтого, белого и розового золота.",
"category": "Gold",
"brand": "Noble Metals Trading",
"partnumber": "MTL-GLD-WIR-18K",
"price": 58,
"purchase_price": 52,
"quantity": 500
},
{
"name": "Sterling Silver Sheet 20ga (per oz)",
"name_ru": "Лист стерлингового серебра 20ga (за унцию)",
"description": "High-quality sterling silver (925) sheet metal, 20 gauge thickness. Dead soft temper for easy forming and fabrication. Sold per troy ounce. Ideal for bezels, backplates, and decorative elements.",
"description_ru": "Высококачественный лист стерлингового серебра (925), толщина 20 ga. Мягкий отжиг для лёгкой формовки и обработки. Продаётся за тройскую унцию. Идеален для оправ, подложек и декоративных элементов.",
"category": "Silver",
"brand": "Noble Metals Trading",
"partnumber": "MTL-SLV-SHT-925",
"price": 32,
"purchase_price": 26,
"quantity": 500
},
{
"name": "Fine Silver Wire 999 1mm (per oz)",
"name_ru": "Проволока чистого серебра 999 1мм (за унцию)",
"description": "Fine silver (999) wire, 1mm diameter. Exceptionally pure and malleable, perfect for wire wrapping, chain making, and granulation. Sold per troy ounce.",
"description_ru": "Проволока чистого серебра (999), диаметр 1 мм. Исключительно чистое и пластичное, идеальное для проволочной обмотки, изготовления цепочек и зерни. Продаётся за тройскую унцию.",
"category": "Silver",
"brand": "Noble Metals Trading",
"partnumber": "MTL-SLV-WIR-999",
"price": 28,
"purchase_price": 22,
"quantity": 500
},
{
"name": "Platinum Bar 1oz",
"name_ru": "Слиток платины 1 унция",
"description": "Investment-grade 1 troy ounce platinum bar, 999.5 fine. LPPM certified with serial number and assay certificate. Ideal for precious metals portfolio diversification.",
"description_ru": "Инвестиционный слиток платины 1 тройская унция, проба 999.5. Сертификат LPPM с серийным номером и пробирным сертификатом. Идеален для диверсификации портфеля драгоценных металлов.",
"category": "Platinum",
"brand": "Noble Metals Trading",
"partnumber": "MTL-PLT-BAR-1OZ",
"price": 1050,
"purchase_price": 950,
"quantity": 15
},
{
"name": "Platinum Wire 0.8mm (per gram)",
"name_ru": "Платиновая проволока 0.8мм (за грамм)",
"description": "950 platinum wire, 0.8mm diameter. Ideal for high-end jewelry fabrication, especially prong and bezel settings. Excellent durability and hypoallergenic properties. Sold per gram.",
"description_ru": "Платиновая проволока 950, диаметр 0.8 мм. Идеальна для изготовления ювелирных изделий премиум-класса, особенно крапановых и ободковых оправ. Отличная долговечность и гипоаллергенные свойства. Продаётся за грамм.",
"category": "Platinum",
"brand": "Noble Metals Trading",
"partnumber": "MTL-PLT-WIR-950",
"price": 35,
"purchase_price": 30,
"quantity": 300
},
{
"name": "Palladium Bar 1oz",
"name_ru": "Слиток палладия 1 унция",
"description": "Investment-grade 1 troy ounce palladium bar, 999.5 fine. Sealed with certificate of authenticity. A lightweight alternative to platinum with excellent investment potential.",
"description_ru": "Инвестиционный слиток палладия 1 тройская унция, проба 999.5. Запечатан с сертификатом подлинности. Лёгкая альтернатива платине с отличным инвестиционным потенциалом.",
"category": "Palladium",
"brand": "Noble Metals Trading",
"partnumber": "MTL-PLD-BAR-1OZ",
"price": 1200,
"purchase_price": 1080,
"quantity": 10
},
{
"name": "Palladium Sheet 24ga (per gram)",
"name_ru": "Лист палладия 24ga (за грамм)",
"description": "950 palladium sheet, 24 gauge. Increasingly popular in modern jewelry design for its light weight and bright white color that won't tarnish. Sold per gram.",
"description_ru": "Лист палладия 950, толщина 24 ga. Всё более популярен в современном ювелирном дизайне благодаря лёгкости и яркому белому цвету, не подверженному потемнению. Продаётся за грамм.",
"category": "Palladium",
"brand": "Noble Metals Trading",
"partnumber": "MTL-PLD-SHT-950",
"price": 42,
"purchase_price": 36,
"quantity": 200
},
{
"name": "Rhodium Plating Solution 100ml",
"name_ru": "Раствор для родирования 100мл",
"description": "Professional-grade rhodium plating solution (2g Rh/100ml). Ready-to-use bath for electroplating white gold, silver, and other jewelry metals. Produces a bright, reflective, tarnish-resistant finish.",
"description_ru": "Профессиональный раствор для родирования (2г Rh/100мл). Готовая к использованию ванна для гальванического покрытия белого золота, серебра и других ювелирных металлов. Создаёт яркое, отражающее, устойчивое к потемнению покрытие.",
"category": "Rhodium",
"brand": "Noble Metals Trading",
"partnumber": "MTL-RHD-SOL-100",
"price": 180,
"purchase_price": 140,
"quantity": 50
},
{
"name": "Rhodium Plating Service",
"name_ru": "Услуга родирования",
"description": "Professional rhodium plating for a single jewelry piece. Restores the bright white finish on white gold jewelry or provides a protective coating on silver. Turnaround 1-2 business days.",
"description_ru": "Профессиональное родирование одного ювелирного изделия. Восстанавливает яркий белый блеск украшений из белого золота или создаёт защитное покрытие на серебре. Срок выполнения 1-2 рабочих дня.",
"category": "Rhodium",
"brand": null,
"partnumber": "MTL-RHD-SVC-PLT",
"price": 85,
"purchase_price": 40,
"quantity": 999,
"is_digital": true
}
],
"post_tags": [

View file

@ -1,9 +1,9 @@
# About Us
**Welcome to the Schon Demo Store**
> **You are viewing a live demonstration** of the [Schon e-commerce platform](https://schon.wiseless.xyz). Everything you see here — the products, the brands, the prices — is fictional, designed to showcase the platform's capabilities. No real transactions take place.
![Our showroom interior](/static/images/placeholder.png)
## What Is This Store?
This demo store is a fully functional showcase of **Schon** — a modern, production-ready e-commerce backend built for businesses of all sizes. We've set it up as a luxury gemstone and jewelry boutique to demonstrate how Schon handles rich product catalogs, multi-language support, advanced inventory management, and more.
@ -36,6 +36,8 @@ Schon is built with a modern technology stack:
- **Celery** — Asynchronous task processing
- **Docker** — Containerized deployment
![Team at work](/static/images/placeholder.png)
## Explore the Demo
Feel free to browse the store, create an account, add items to your cart, and explore the full shopping experience. Remember, this is a demo — no real charges will be made and no real products will be shipped.

View file

@ -1,9 +1,9 @@
# О нас
**Добро пожаловать в Демо-магазин Schon**
> **Вы просматриваете живую демонстрацию** [платформы электронной коммерции Schon](https://schon.wiseless.xyz). Всё, что вы видите здесь — товары, бренды, цены — является вымышленным и предназначено для демонстрации возможностей платформы. Реальные транзакции не осуществляются.
![Интерьер нашего шоурума](/static/images/placeholder.png)
## Что это за магазин?
Этот демонстрационный магазин — полнофункциональная витрина **Schon** — современного, готового к продуктивному использованию бэкенда электронной коммерции, созданного для бизнеса любого масштаба. Мы оформили его как бутик роскошных драгоценных камней и ювелирных изделий, чтобы продемонстрировать, как Schon работает с богатыми каталогами товаров, многоязычной поддержкой, расширенным управлением запасами и многим другим.
@ -36,6 +36,8 @@ Schon построен на современном технологическо
- **Celery** — Асинхронная обработка задач
- **Docker** — Контейнеризированное развёртывание
![Команда за работой](/static/images/placeholder.png)
## Исследуйте демо
Просматривайте магазин, создавайте учётную запись, добавляйте товары в корзину и изучайте полный покупательский опыт. Помните, что это демонстрация — реальные платежи не взимаются, реальные товары не отправляются.

View file

@ -1,9 +1,7 @@
# Behind the Platform: How Schon Powers This Store
*Published: December 20, 2025*
Ever wondered what runs behind the scenes of an online gemstone store? In this post, we pull back the curtain on the technology that powers the Schon Demo Store — and explain why we believe Schon is the right foundation for your next e-commerce project.
![Schon admin dashboard screenshot](/static/images/placeholder.png)
## The Challenge of Gemstone E-Commerce
Selling gemstones online presents unique challenges that generic e-commerce platforms struggle with:
@ -24,6 +22,8 @@ Schon's attribute system lets you define custom attribute groups (Physical Prope
Our demo store uses a single vendor (Schon Demo), but the platform supports unlimited vendors, each with their own pricing, stock levels, and markup percentages. The stock updater service runs as a separate worker, syncing inventory from external supplier feeds in real-time.
![API documentation interface](/static/images/placeholder.png)
### API-First Architecture
The entire storefront is powered by Schon's REST and GraphQL APIs. This means you can build any frontend you want:

View file

@ -1,9 +1,7 @@
# За кулисами платформы: как Schon обеспечивает работу этого магазина
*Опубликовано: 20 декабря 2025 г.*
Задумывались ли вы, что стоит за работой онлайн-магазина драгоценных камней? В этой статье мы приоткрываем завесу над технологией, обеспечивающей работу Демо-магазина Schon, и объясняем, почему Schon — правильная основа для вашего следующего проекта в электронной коммерции.
![Скриншот панели администратора Schon](/static/images/placeholder.png)
## Вызовы электронной коммерции драгоценных камней
Продажа драгоценных камней онлайн ставит уникальные задачи, с которыми универсальные платформы справляются с трудом:
@ -24,6 +22,8 @@
Наш демо-магазин использует одного поставщика (Schon Demo), но платформа поддерживает неограниченное количество поставщиков, каждый со своим ценообразованием, остатками и процентами наценки. Сервис обновления остатков работает как отдельный воркер, синхронизируя запасы из внешних фидов поставщиков в реальном времени.
![Интерфейс документации API](/static/images/placeholder.png)
### API-ориентированная архитектура
Вся витрина работает через REST и GraphQL API Schon. Это значит, что вы можете создать любой фронтенд:

View file

@ -1,9 +1,7 @@
# Now Available in Russian: Full Bilingual Shopping Experience
*Published: January 28, 2026*
We're pleased to announce that the Schon Demo Store now offers a **complete bilingual experience** in English and Russian. Every product description, category name, brand story, and informational page has been professionally translated to provide a seamless shopping experience for Russian-speaking customers.
![Side-by-side language comparison](/static/images/placeholder.png)
## What's Translated
- **Full product catalog** — All 50+ gemstone listings with detailed descriptions, specifications, and grading information
@ -23,6 +21,8 @@ For store operators, this means:
- **SEO-friendly** — Each language version gets proper meta tags and descriptions
- **Easy management** — Translations are managed through the admin panel alongside the original content
![Multilingual product page example](/static/images/placeholder.png)
## Try It Yourself
Switch your browser's language preference to Russian (or use the language selector in your storefront) to see the full translated experience. Every detail has been localized, from the product specifications to the checkout flow.

View file

@ -1,9 +1,7 @@
# Теперь на русском: полноценный двуязычный шоппинг
*Опубликовано: 28 января 2026 г.*
Мы рады сообщить, что Демо-магазин Schon теперь предлагает **полноценный двуязычный опыт** на английском и русском языках. Каждое описание товара, название категории, история бренда и информационная страница профессионально переведены для обеспечения удобного шоппинга для русскоязычных покупателей.
![Сравнение языковых версий](/static/images/placeholder.png)
## Что переведено
- **Весь каталог товаров**Все 50+ листингов драгоценных камней с подробными описаниями, характеристиками и информацией о качестве
@ -23,6 +21,8 @@
- **SEO-оптимизация** — Каждая языковая версия получает корректные мета-теги и описания
- **Удобное управление** — Переводы управляются через панель администратора наряду с оригинальным контентом
![Пример многоязычной страницы товара](/static/images/placeholder.png)
## Попробуйте сами
Переключите языковые настройки браузера на русский (или используйте переключатель языка в витрине) для просмотра полностью переведённого интерфейса. Каждая деталь локализована — от характеристик товаров до процесса оформления заказа.

View file

@ -1,9 +1,9 @@
# Frequently Asked Questions
**Schon Demo Store**
> **Demo Notice:** This FAQ pertains to the Schon Demo Store, a demonstration environment for the [Schon e-commerce platform](https://schon.wiseless.xyz). All products and transactions are fictional.
![Customer browsing our online store](/static/images/placeholder.png)
## General Questions
### What is this website?

View file

@ -1,9 +1,9 @@
# Часто задаваемые вопросы
**Демо-магазин Schon**
> **Уведомление:** Данный раздел FAQ относится к Демо-магазину Schon — демонстрационной среде для [платформы электронной коммерции Schon](https://schon.wiseless.xyz). Все товары и транзакции являются вымышленными.
![Покупатель просматривает наш онлайн-магазин](/static/images/placeholder.png)
## Общие вопросы
### Что представляет собой этот сайт?

View file

@ -1,9 +1,7 @@
# Understanding Gemstone Certification: A Buyer's Guide
*Published: January 15, 2026*
Whether you're purchasing your first gemstone or adding to an established collection, understanding certification is essential. This guide explains the major gemological laboratories, what their reports cover, and why certification matters.
![GIA certificate example](/static/images/placeholder.png)
## Why Certification Matters
A gemstone certificate (also called a grading report) is an independent, expert assessment of a stone's characteristics. It provides:
@ -47,6 +45,8 @@ Part of the Swiss Foundation for the Research of Gemstones, SSEF is recognized f
- Pearl testing (natural vs. cultured)
- High-value gemstone verification
![Gemological testing equipment](/static/images/placeholder.png)
## What a Certificate Includes
A typical gemstone certificate will document:

View file

@ -1,9 +1,7 @@
# Сертификация драгоценных камней: руководство покупателя
*Опубликовано: 15 января 2026 г.*
Приобретаете ли вы свой первый драгоценный камень или пополняете существующую коллекцию — понимание сертификации необходимо. В этом руководстве мы объясним, какие существуют основные геммологические лаборатории, что включают их отчёты и почему сертификация важна.
![Пример сертификата GIA](/static/images/placeholder.png)
## Зачем нужна сертификация
Сертификат драгоценного камня (также называемый экспертным заключением) — это независимая экспертная оценка характеристик камня. Он обеспечивает:
@ -47,6 +45,8 @@
- Экспертизу жемчуга (натуральный или культивированный)
- Верификацию драгоценных камней высокой стоимости
![Геммологическое оборудование для тестирования](/static/images/placeholder.png)
## Что включает сертификат
Типичный сертификат драгоценного камня содержит:

View file

@ -1,9 +1,7 @@
# Holiday Gift Guide: Top Gemstones Under $5,000
*Published: January 5, 2026*
Looking for the perfect gift that combines beauty, rarity, and lasting value? Our curators have selected the most impressive gemstones under $5,000 from this season's collection.
![Curated gift selection display](/static/images/placeholder.png)
## Our Top Picks
### 1. Ethiopian Welo Opal 3.8ct — $3,500
@ -38,6 +36,8 @@ The legendary deep purple of Siberian amethyst, with red flashes that make it on
A brilliant transparent opal with intense orange color from Mexico. Lumina Treasures offers this unique piece that glows with inner fire.
![Gift-wrapped gemstone box](/static/images/placeholder.png)
## Gift-Worthy Presentation
Every gemstone purchase from our store includes:

View file

@ -1,9 +1,7 @@
# Подарочный гид: лучшие драгоценные камни до $5 000
*Опубликовано: 5 января 2026 г.*
Ищете идеальный подарок, сочетающий красоту, редкость и непреходящую ценность? Наши кураторы отобрали самые впечатляющие драгоценные камни стоимостью до $5 000 из коллекции этого сезона.
![Витрина с подарочной подборкой](/static/images/placeholder.png)
## Наш выбор
### 1. Эфиопский опал Вело 3.8 карата — $3 500
@ -38,6 +36,8 @@
Блестящий прозрачный опал интенсивного оранжевого цвета из Мексики. Lumina Treasures предлагает этот уникальный камень, светящийся внутренним огнём.
![Подарочная коробка с драгоценным камнем](/static/images/placeholder.png)
## Подарочное оформление
Каждая покупка драгоценного камня в нашем магазине включает:

View file

@ -1,10 +1,9 @@
# Privacy Policy
**Schon Demo Store**
*Last updated: February 2026*
> **Demo Notice:** This is a demonstration store powered by the [Schon](https://schon.wiseless.xyz) e-commerce platform. No real transactions are processed, and no actual personal data is collected through purchases. This privacy policy is provided as an example of a production-ready document. If you are interested in deploying Schon for your own store, please visit [schon.wiseless.xyz](https://schon.wiseless.xyz).
![Professional gemstone display case](/static/images/placeholder.png)
## 1. Introduction
Welcome to Schon Demo Store ("we," "our," or "us"). We are committed to protecting your privacy and ensuring the security of your personal information. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website and use our services.

View file

@ -1,10 +1,9 @@
# Политика конфиденциальности
**Демо-магазин Schon**
*Дата последнего обновления: февраль 2026 г.*
> **Уведомление:** Это демонстрационный магазин, работающий на платформе электронной коммерции [Schon](https://schon.wiseless.xyz). Реальные транзакции не обрабатываются, персональные данные в рамках покупок не собираются. Настоящая политика конфиденциальности представлена в качестве примера документа, готового к использованию в рабочей среде. Если вы заинтересованы в развёртывании Schon для вашего магазина, посетите [schon.wiseless.xyz](https://schon.wiseless.xyz).
![Профессиональная витрина с драгоценными камнями](/static/images/placeholder.png)
## 1. Введение
Добро пожаловать в Демо-магазин Schon («мы», «наш» или «нас»). Мы стремимся защищать вашу конфиденциальность и обеспечивать безопасность ваших персональных данных. Настоящая Политика конфиденциальности разъясняет, каким образом мы собираем, используем, раскрываем и защищаем вашу информацию при посещении нашего веб-сайта и использовании наших услуг.

View file

@ -1,10 +1,9 @@
# Return Policy
**Schon Demo Store**
*Last updated: February 2026*
> **Demo Notice:** This is a demonstration store powered by the [Schon](https://schon.wiseless.xyz) e-commerce platform. No real products are sold or shipped. This Return Policy is provided as an example of a production-ready document. To deploy Schon for your own store, visit [schon.wiseless.xyz](https://schon.wiseless.xyz).
![Secure packaging for returns](/static/images/placeholder.png)
## 1. Overview
At Schon Demo Store, we want you to be completely satisfied with your purchase. If you are not satisfied for any reason, we offer a straightforward return process as outlined below.

View file

@ -1,10 +1,9 @@
# Политика возврата
**Демо-магазин Schon**
*Дата последнего обновления: февраль 2026 г.*
> **Уведомление:** Это демонстрационный магазин, работающий на платформе электронной коммерции [Schon](https://schon.wiseless.xyz). Реальные товары не продаются и не отправляются. Настоящая Политика возврата представлена в качестве примера документа, готового к использованию в рабочей среде. Для развёртывания Schon для вашего магазина посетите [schon.wiseless.xyz](https://schon.wiseless.xyz).
![Надёжная упаковка для возвратов](/static/images/placeholder.png)
## 1. Обзор
В Демо-магазине Schon мы хотим, чтобы вы были полностью удовлетворены покупкой. Если по какой-либо причине вы не удовлетворены, мы предлагаем простой процесс возврата, описанный ниже.

View file

@ -1,10 +1,9 @@
# Shipping Information
**Schon Demo Store**
*Last updated: February 2026*
> **Demo Notice:** This is a demonstration store powered by the [Schon](https://schon.wiseless.xyz) e-commerce platform. No real products are shipped. This Shipping Information page is provided as an example of a production-ready document. To deploy Schon for your own store, visit [schon.wiseless.xyz](https://schon.wiseless.xyz).
![Premium insured shipping packaging](/static/images/placeholder.png)
## 1. Shipping Methods
We offer the following shipping options for all orders:

View file

@ -1,10 +1,9 @@
# Информация о доставке
**Демо-магазин Schon**
*Дата последнего обновления: февраль 2026 г.*
> **Уведомление:** Это демонстрационный магазин, работающий на платформе электронной коммерции [Schon](https://schon.wiseless.xyz). Реальные товары не отправляются. Настоящая страница с информацией о доставке представлена в качестве примера документа, готового к использованию в рабочей среде. Для развёртывания Schon для вашего магазина посетите [schon.wiseless.xyz](https://schon.wiseless.xyz).
![Премиальная застрахованная упаковка для доставки](/static/images/placeholder.png)
## 1. Способы доставки
Мы предлагаем следующие варианты доставки для всех заказов:

View file

@ -1,9 +1,7 @@
# New Collection: Spring 2026 Gemstone Arrivals
*Published: February 10, 2026*
We are excited to announce the arrival of our **Spring 2026 Collection** — a curated selection of exceptional gemstones sourced from the world's most renowned origins.
![New emerald arrivals](/static/images/placeholder.png)
## What's New
This season's collection brings a fresh wave of color and brilliance to our catalog:
@ -12,6 +10,8 @@ This season's collection brings a fresh wave of color and brilliance to our cata
We've expanded our emerald selection with stunning pieces from **Afghanistan's Panjshir Valley** and **Ethiopia's emerging deposits**. These new arrivals complement our existing Colombian and Zambian offerings, giving collectors and designers more options across different price points and color profiles.
![Asscher cut diamond close-up](/static/images/placeholder.png)
### Expanded Diamond Cuts
Our diamond selection now includes the elegant **Marquise** and sophisticated **Asscher** cuts alongside our existing round brilliant, princess, oval, cushion, and emerald cuts. These additions reflect growing demand for distinctive silhouettes in engagement rings and fine jewelry.

View file

@ -1,9 +1,7 @@
# Новая коллекция: поступление драгоценных камней весна 2026
*Опубликовано: 10 февраля 2026 г.*
Мы рады сообщить о поступлении нашей **Весенней коллекции 2026** — тщательно отобранной подборки исключительных драгоценных камней из самых известных месторождений мира.
![Новые поступления изумрудов](/static/images/placeholder.png)
## Что нового
Коллекция этого сезона привносит новую волну цвета и блеска в наш каталог:
@ -12,6 +10,8 @@
Мы расширили ассортимент изумрудов потрясающими экземплярами из **Панджшерской долины Афганистана** и **новых месторождений Эфиопии**. Эти новинки дополняют наши существующие колумбийские и замбийские предложения, предоставляя коллекционерам и дизайнерам больше вариантов в различных ценовых категориях и цветовых профилях.
![Бриллиант огранки «Ашер» крупным планом](/static/images/placeholder.png)
### Расширенный выбор огранок бриллиантов
Наш ассортимент бриллиантов теперь включает элегантную огранку **«Маркиз»** и утончённую **«Ашер»** наряду с существующими круглой, «Принцессой», овальной, «Кушон» и изумрудной огранками. Эти дополнения отражают растущий спрос на выразительные силуэты в обручальных кольцах и ювелирных изделиях.

View file

@ -1,10 +1,9 @@
# Terms & Conditions
**Schon Demo Store**
*Last updated: February 2026*
> **Demo Notice:** This is a demonstration store powered by the [Schon](https://schon.wiseless.xyz) e-commerce platform. No real transactions are processed, no real products are sold, and no real money is charged. These Terms & Conditions are provided as an example of a production-ready legal document. To deploy Schon for your own store, visit [schon.wiseless.xyz](https://schon.wiseless.xyz).
![Professional gemstone display case](/static/images/placeholder.png)
## 1. Acceptance of Terms
By accessing and using the Schon Demo Store website ("Website"), you accept and agree to be bound by these Terms & Conditions ("Terms"). If you do not agree to these Terms, you must not use the Website.

View file

@ -1,10 +1,9 @@
# Условия использования
**Демо-магазин Schon**
*Дата последнего обновления: февраль 2026 г.*
> **Уведомление:** Это демонстрационный магазин, работающий на платформе электронной коммерции [Schon](https://schon.wiseless.xyz). Реальные транзакции не обрабатываются, реальные товары не продаются, реальные платежи не взимаются. Настоящие Условия использования представлены в качестве примера юридического документа, готового к использованию в рабочей среде. Для развёртывания Schon для вашего магазина посетите [schon.wiseless.xyz](https://schon.wiseless.xyz).
![Профессиональная витрина с драгоценными камнями](/static/images/placeholder.png)
## 1. Принятие условий
Получая доступ к веб-сайту Демо-магазина Schon («Веб-сайт») и используя его, вы принимаете и соглашаетесь соблюдать настоящие Условия использования («Условия»). Если вы не согласны с настоящими Условиями, вы не должны использовать Веб-сайт.

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -380,7 +380,7 @@ class Command(BaseCommand):
"description": prod_data["description"],
"category": category,
"brand": brand,
"is_digital": False,
"is_digital": prod_data.get("is_digital", False),
},
)
@ -403,27 +403,49 @@ class Command(BaseCommand):
# Add product image
self._add_product_image(product, prod_data["partnumber"])
def _add_product_image(self, product: Product, partnumber: str) -> None:
image_path = DEMO_IMAGES_DIR / f"{partnumber}.jpg"
if not image_path.exists():
image_path = DEMO_IMAGES_DIR / "placeholder.png"
def _find_image(self, partnumber: str, suffix: str = "") -> Path | None:
extensions = (".jpg", ".jpeg", ".png", ".webp")
for ext in extensions:
candidate = DEMO_IMAGES_DIR / f"{partnumber}{suffix}{ext}"
if candidate.exists():
return candidate
return None
if not image_path.exists():
def _add_product_image(self, product: Product, partnumber: str) -> None:
primary = self._find_image(partnumber)
if not primary:
primary = DEMO_IMAGES_DIR / "placeholder.png"
if not primary.exists():
self.stdout.write(
self.style.WARNING(f" No image found for {partnumber}, skipping...")
)
return
self._save_product_image(product, primary, priority=1)
n = 2
while True:
variant = self._find_image(partnumber, f" ({n})")
if not variant:
break
self._save_product_image(product, variant, priority=n)
n += 1
def _save_product_image(
self, product: Product, image_path: Path, priority: int
) -> None:
with open(image_path, "rb") as f:
image_content = f.read()
filename = image_path.name
product_image = ProductImage(
product=product,
alt=product.name,
priority=1,
priority=priority,
)
product_image.image.save(
image_path.name, ContentFile(image_content), save=True
)
product_image.image.save(filename, ContentFile(image_content), save=True)
@transaction.atomic
def _create_demo_users(self, count: int) -> list:

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB