From a55c679bb77fcc3d3d325b5772e3dc94a1242df5 Mon Sep 17 00:00:00 2001 From: ali_mohaghegh Date: Wed, 2 Sep 2026 18:28:54 +0330 Subject: [PATCH] fix(seed): enforce only the 8 canonical topic categories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The topic grids (PM system + wizard) showed extra categories like «سیم», «کابل», «ثبثب», «dsfg». Those rows were leftover junk in material_categories from earlier testing — previously invisible because the frontend hardcoded the 8-topic list; the API-driven topic grid surfaced them. The rows are deleted (they had no references) and the seeder now deletes any category outside the 8 canonical slugs, so a re-seed always yields exactly the same 8 categories as before. Dump refreshed from the clean state. --- backend/tools/seed.py | 12 ++++++++++++ backups/procurement.dump | Bin 94340 -> 94182 bytes 2 files changed, 12 insertions(+) diff --git a/backend/tools/seed.py b/backend/tools/seed.py index 5f8912a..08ba223 100644 --- a/backend/tools/seed.py +++ b/backend/tools/seed.py @@ -212,6 +212,18 @@ async def run() -> None: "category_reference_units, unit_conversions, standard_conversions " "RESTART IDENTITY CASCADE" )) + # Only the 8 canonical topic categories may exist — any leftover slug + # (e.g. «سیم», «کابل» from earlier testing) is removed so the topic + # grids keep showing exactly the same 8 categories as always. + await db.execute( + text( + "DELETE FROM material_categories WHERE slug NOT IN (" + "'mechanical-installations-pipes','electrical-equipment-supplies'," + "'doors-windows-glass','metals-steel-sections','construction-materials'," + "'construction-chemicals','finishing-interior-decoration'," + "'construction-tools-equipment')" + ) + ) # ---- users (roles bound to Casdoor identities by username) ---- users: dict[str, User] = {} diff --git a/backups/procurement.dump b/backups/procurement.dump index f5368d8e1840e5cdfc652f6d8b2cf195d31bd34d..bb91e73b13de6963554fb0c0cffb535a7eaf9223 100644 GIT binary patch delta 10684 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 AC;$Ke delta 10884 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