// AUTO-GENERATED by scripts/gen-api.mjs — do not edit by hand. // Source: the backend module's own docs/schema.json (§17-native per-module contract). // Regenerate: pnpm gen:api · Drift gate: pnpm gen:api:check export interface paths { "/categories/api/v1/categories/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description List categories with revision-based pagination. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_categories_list"]; put?: never; /** * @description ViewSet for Category with revision-based synchronization. * * **Sync flow:** * 1. Initial sync: ``GET /categories/`` — returns all categories with revision info * 2. Store ``revisions.global_max`` from the response * 3. Subsequent sync: ``GET /categories/?min_revision={stored_max}`` — only changes * 4. Handle items with ``deleted=true`` by removing them locally * * **Permissions:** `ReadOnlyOrStaff` */ post: operations["categories_api_v1_categories_create"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/{id}/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description ViewSet for Category with revision-based synchronization. * * **Sync flow:** * 1. Initial sync: ``GET /categories/`` — returns all categories with revision info * 2. Store ``revisions.global_max`` from the response * 3. Subsequent sync: ``GET /categories/?min_revision={stored_max}`` — only changes * 4. Handle items with ``deleted=true`` by removing them locally * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_categories_retrieve"]; /** * @description ViewSet for Category with revision-based synchronization. * * **Sync flow:** * 1. Initial sync: ``GET /categories/`` — returns all categories with revision info * 2. Store ``revisions.global_max`` from the response * 3. Subsequent sync: ``GET /categories/?min_revision={stored_max}`` — only changes * 4. Handle items with ``deleted=true`` by removing them locally * * **Permissions:** `ReadOnlyOrStaff` */ put: operations["categories_api_v1_categories_update"]; post?: never; /** * @description ViewSet for Category with revision-based synchronization. * * **Sync flow:** * 1. Initial sync: ``GET /categories/`` — returns all categories with revision info * 2. Store ``revisions.global_max`` from the response * 3. Subsequent sync: ``GET /categories/?min_revision={stored_max}`` — only changes * 4. Handle items with ``deleted=true`` by removing them locally * * **Permissions:** `ReadOnlyOrStaff` */ delete: operations["categories_api_v1_categories_destroy"]; options?: never; head?: never; /** * @description ViewSet for Category with revision-based synchronization. * * **Sync flow:** * 1. Initial sync: ``GET /categories/`` — returns all categories with revision info * 2. Store ``revisions.global_max`` from the response * 3. Subsequent sync: ``GET /categories/?min_revision={stored_max}`` — only changes * 4. Handle items with ``deleted=true`` by removing them locally * * **Permissions:** `ReadOnlyOrStaff` */ patch: operations["categories_api_v1_categories_partial_update"]; trace?: never; }; "/categories/api/v1/categories/{id}/children/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description The level below this category, in the order a storefront draws it. Three kinds of entry, and a client that renders the first renders the others with no new code: a real child; a POINTER into another branch (`linked: true`, every other key the target's); and, on a category with `children_expand_by`, a VIRTUAL value (`virtual: true`, no id and no slug — a `filter` pair the client turns into its own filter URL on THIS category). * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_categories_children_list"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/{id}/deleted-children/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Get all deleted children of this category. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_categories_deleted_children_list"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/{id}/feature-editor/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Get feature editor state for admin UI. * * **Permissions:** `IsStaffUser` */ get: operations["categories_api_v1_categories_feature_editor_retrieve"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/{id}/feature-editor/apply/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * @description Apply feature editor actions to category and descendants. * * **Permissions:** `IsStaffUser` */ post: operations["categories_api_v1_categories_feature_editor_apply_create"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/{id}/feature-editor/draft/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * @description Save feature editor draft without applying changes. * * **Permissions:** `IsStaffUser` */ post: operations["categories_api_v1_categories_feature_editor_draft_create"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/{id}/features/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Get all features for this category, sorted by order. Includes inherited features. For a `chips` parent that declares no features of its own the answer is the EFFECTIVE schema — the UNION of its children's, since the parent renders the feed and the chip row for all of them. A feature only some children carry is in it too, marked `partial: true` with `carried_by` naming them and a config merged from them alone; one whose carrying children disagree carries `divergent: true` beside the widest config of theirs. The `X-Effective-From: children` response header says the list was merged from the children rather than read off this node (`own` otherwise). * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_categories_features_list"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/{id}/links/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description The pointers drawn among this category's children. Staff only: the public reads serve the ASSEMBLED child list, and the table behind it is operator bookkeeping. * * **Permissions:** `IsStaffUser` */ get: operations["categories_api_v1_categories_links_list"]; put?: never; /** * @description Create a pointer from this category to another. `order` is its position among the children; `external_source` says who authored it — an operator's own links use `storefront` and survive every catalogue reload. * * **Permissions:** `IsStaffUser` */ post: operations["categories_api_v1_categories_links_create"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/{id}/links/{target_pk}/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; post?: never; /** * @description Delete the pointer from this category to `target_pk`. Deleting a pointer deletes nothing else: the target keeps its own place in the tree. * * **Permissions:** `IsStaffUser` */ delete: operations["categories_api_v1_categories_links_destroy"]; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/{id}/undelete/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * @description Restore deleted category and all its descendants. * * **Permissions:** `IsStaffUser` */ post: operations["categories_api_v1_categories_undelete_create"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/{id}/validate-configs/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Validate all feature configs in this category. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_categories_validate_configs_retrieve"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/{id}/validate-dto/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * @description Validate a features DTO against this category's schema. * * **Permissions:** `ReadOnlyOrStaff` */ post: operations["categories_api_v1_categories_validate_dto_create"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/bulk-commands/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * @description Execute bulk commands on categories (add/edit/delete/reorder). * * **Permissions:** `IsStaffUser` */ post: operations["categories_api_v1_categories_bulk_commands_create"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/bulk_add/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * @description Bulk create or update categories. Provide an array of category objects with IDs. * * **Permissions:** `IsStaffUser` */ post: operations["categories_api_v1_categories_bulk_add_create"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/by-slug/{slug}/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Retrieve one category by its slug. `slug` is unique, so this is an alternate primary key, not a search. A slug the category USED to carry (renamed since) answers 301 to the current one. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_categories_by_slug_retrieve"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/carousel/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Get categories for carousel display (active and carousel_enabled). * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_categories_carousel_list"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/data.json/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Return all items as a JSON array with long cache headers. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_categories_data.json_list"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/revision/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Get the current maximum revision number for this resource. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_categories_revision_retrieve"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/roots/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Top-level categories (no parent), sorted by tn_priority descending. The entry point of the tree, without the whole table. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_categories_roots_list"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/categories/translation-keys/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Collect all translation keys * @description Collect translation keys from categories, features and feature config options. * * **Permissions:** `IsServiceRequest` */ get: operations["collect_translation_keys"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/features/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description List features with revision-based pagination. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_features_list"]; put?: never; /** * @description Create a new feature with polymorphic config. * * **Permissions:** `ReadOnlyOrStaff` */ post: operations["categories_api_v1_features_create"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/features/{id}/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Get feature details with tree structure info. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_features_retrieve"]; /** * @description Update an existing feature with polymorphic config. * * **Permissions:** `ReadOnlyOrStaff` */ put: operations["categories_api_v1_features_update"]; post?: never; /** * @description Mixin for ViewSets working with RevisionMixin models. * * Provides: * - Automatic revision-based filtering * - OpenAPI documentation for revision query parameters * - Optional filtering of soft-deleted items * - /revision endpoint to get current max revision * * Usage: * class MyModelViewSet(RevisionViewSetMixin, viewsets.ModelViewSet): * queryset = MyModel.objects.all() * serializer_class = MyModelSerializer * pagination_class = RevisionPagination * * Query parameters: * - min_revision: Return objects with revision > min_revision (default: 0) * - max_revision: Return objects with revision <= max_revision (default: None) * - include_deleted: Include soft-deleted items (default: true) * * **Permissions:** `ReadOnlyOrStaff` */ delete: operations["categories_api_v1_features_destroy"]; options?: never; head?: never; /** * @description Partially update a feature. * * **Permissions:** `ReadOnlyOrStaff` */ patch: operations["categories_api_v1_features_partial_update"]; trace?: never; }; "/categories/api/v1/features/{id}/convert-type/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * @description Convert feature type between select and string, optionally propagating to descendants. * * **Permissions:** `IsStaffUser` */ post: operations["categories_api_v1_features_convert_type_create"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/features/bulk_add/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * @description Bulk create or update features. Provide an array of feature objects with IDs. * * **Permissions:** `IsStaffUser` */ post: operations["categories_api_v1_features_bulk_add_create"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/features/data.json/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Return all items as a JSON array with long cache headers. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_features_data.json_list"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/features/revision/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description Get the current maximum revision number for this resource. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_features_revision_retrieve"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/categories/api/v1/tree/": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * @description The active category tree, nested, ordered by `tn_priority` descending at every level. One call, one query, cached. * * **Permissions:** `ReadOnlyOrStaff` */ get: operations["categories_api_v1_tree_list"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; } export type webhooks = Record; export interface components { schemas: { /** * @description * `keep` - keep * * `add` - add * * `edit` - edit * * `inherit` - inherit * * `remove` - remove * * `create` - create * * `replace` - replace * @enum {string} */ ActionEnum: "keep" | "add" | "edit" | "inherit" | "remove" | "create" | "replace"; /** * @description * `keep` - keep * * `add` - add * * `edit` - edit * * `inherit` - inherit * * `remove` - remove * * `create` - create * * `replace` - replace * @enum {string} */ AvailableActionsEnum: "keep" | "add" | "edit" | "inherit" | "remove" | "create" | "replace"; /** @enum {unknown} */ BlankEnum: ""; /** @description Serializer for boolean feature configuration. */ BoolConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "bool"; trueLabel?: string | null; falseLabel?: string | null; }; /** @description Serializer for boolean feature DTO. */ BoolDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "bool"; value?: boolean; }; /** * @description * `bool` - bool * @enum {string} */ BoolTypeEnum: "bool"; /** @description Response for bulk create/update operations. */ BulkUpdateResponse: { /** @description List of created/updated object IDs (each a pk: integer or uuid) */ updated_ids: (number | string)[]; }; /** * @description The PUBLIC category projection — every anonymous read serves this. * * List, detail, ``children``, ``roots``, ``carousel`` and ``by-slug`` all * answer to strangers (the whole surface is ``ReadOnlyOrStaff``), so which * keys ride here is a disclosure decision. ``external_id`` / * ``external_source`` do NOT: they are the source catalogue's own node ids, * stamped by ``load_catalog`` so a re-import can find its rows again — an * operator fact. A stand that imported a competitor's catalogue was serving * that catalogue's internal numbering to anyone with curl, one key per row. * Provenance lives on the staff surfaces only: the Django admin, the * staff-gated bulk serializer, and :class:`CategoryStaffSerializer` on the * write actions. * * The exact key set is frozen by ``test_public_read. * PUBLIC_CATEGORY_KEYS`` — adding a field here is a conscious act that * extends that contract in the same commit. */ Category: { readonly id: number; name: string; slug: string; /** @description CDN catalog icon reference (opaque string, e.g. catalog/asset-name) */ catalog_icon?: string; /** @description CDN carousel icon reference (opaque string, e.g. carousel/asset-name) */ carousel_icon?: string; /** @description Whether this category appears in the carousel */ carousel_enabled?: boolean; /** @description Whether this category is active */ active?: boolean; /** @description How this category's children are presented: `tiles` (real subcategories), `chips` (a partition of one attribute template) or `transparent` (browsing skips this node — its children appear where it would, and its own page is its parent's). `null` when the category has no children. The authoring value `auto` is resolved server-side and never appears here. */ readonly children_as: (components["schemas"]["ChildrenAsEnum"] | components["schemas"]["NullEnum"]) | null; /** @description Name of the axis the children split on, for a `chips` row (e.g. a key rendering as 'Condition' over New | Used). A translation key, like `name` — empty when nobody named it. */ readonly children_axis_label: string; /** @description External tag of the field the children enumerate (e.g. `operation_type`) — the source catalogue's own identifier, NOT a translation key. It is how a client recognises that this level and an ordinary feature elsewhere in the tree are the same question. Empty when nobody named it. */ readonly children_axis_tag: string; /** @description Slug of the feature whose values ARE this category's children. When set, `GET /children/` answers with virtual children (each a `{feature: value}` filter on this category) and `children_pks` is empty — there are no rows. Empty for every ordinary node. */ readonly children_expand_by: string; /** @description Ids of the children a reader can see — exactly what `GET /categories/{id}/children/` returns, in the same order. Read this, not `tn_children_pks`: that is django-treenode's raw structure column and it counts soft-deleted and retired rows too, so a rule built on it (leaf-ness, child counts, a one-child wrapper check) sees children no reader can fetch. */ readonly children_pks: number[]; /** @description How many children a reader can see — `len(children_pks)`. */ readonly children_count: number; readonly features: number[]; /** @description If True, category name is a translation key */ translatable?: boolean; /** Parent */ tn_parent?: number | null; /** * Priority * Format: int64 */ tn_priority?: number; /** Ancestors pks */ readonly tn_ancestors_pks: string; /** @description django-treenode's raw structure column, `,`-joined. Counts soft-deleted and retired rows, so it is NOT the child set a reader can fetch — use `children_pks`. Kept because the revision-sync feed's consumers mirror the tree columns. */ readonly tn_children_pks: string; readonly revision: number; deleted?: boolean; }; /** @description Serializer for bulk add/update operations — id is required. */ CategoryBulk: { id: number; name: string; slug: string; /** @description Identifier in the source catalogue this category was imported from. */ external_id?: string; /** @description Source catalogue `external_id` belongs to (blank = the single/default source). */ external_source?: string; /** @description CDN catalog icon reference (opaque string, e.g. catalog/asset-name) */ catalog_icon?: string; /** @description CDN carousel icon reference (opaque string, e.g. carousel/asset-name) */ carousel_icon?: string; readonly features: number[]; /** Parent */ tn_parent?: number | null; /** * Priority * Format: int64 */ tn_priority?: number; }; /** @description Serializer for bulk category commands. */ CategoryBulkCommand: { categories: components["schemas"]["CategoryCommand"][]; }; CategoryChild: components["schemas"]["Category"] | components["schemas"]["CategoryLinkedChild"] | components["schemas"]["CategoryVirtualChild"]; /** @description Serializer for category command pattern. */ CategoryCommand: { /** @description Category ID (null for add command) */ id?: number | null; /** * @description Command to execute * * * `keep` - keep * * `add` - add * * `edit` - edit * * `delete` - delete * * `reorder` - reorder */ command: components["schemas"]["CommandEnum"]; /** @description Category name (for add/edit) */ name?: string; /** @description Category slug (for add/edit) */ slug?: string; /** * @description If True, name is translation key * @default true */ translatable: boolean; /** @description Parent category ID (for add) */ parent_id?: number | null; /** @description Tree node priority (for add/reorder) */ priority?: number; }; /** * @description Staff read/write of one pointer between two categories. * * ``source`` is the URL's category, so it is never in the body. ``target`` * is a category id; ``external_source`` says who authored the link and is * what a catalogue reload keys its rewrite on — an operator's own links * carry ``storefront`` and survive every import. */ CategoryLink: { readonly id: number; /** @description The category the pointer leads to. */ target: number; readonly target_slug: string; readonly target_name: string; /** * Format: int64 * @description Position among the source's children — the pointer is inserted at this index into the child list, not appended after it. */ order?: number; /** @description Text drawn on the pointer — a translation key, like `name`. Empty means the target's own name. */ label?: string; /** @description Who created this link: an importer's name, or `storefront` for an operator's own. A catalogue reload rewrites only the links carrying the source it loads. */ external_source?: string; }; /** * @description A POINTER among a category's children — the target, marked as one. * * Every key is the target's, so a client that already renders a child * renders this one with no new code: the address it navigates to, the * breadcrumbs it draws and the listings it counts all belong to the node * the pointer leads to. Two keys are the pointer's own: ``linked``, which * says not to treat this as a child of the category being listed, and * ``name``, which is the link's label when it carries one. */ CategoryLinkedChild: { readonly id: number; name: string; slug: string; /** @description CDN catalog icon reference (opaque string, e.g. catalog/asset-name) */ catalog_icon?: string; /** @description CDN carousel icon reference (opaque string, e.g. carousel/asset-name) */ carousel_icon?: string; /** @description Whether this category appears in the carousel */ carousel_enabled?: boolean; /** @description Whether this category is active */ active?: boolean; /** @description How this category's children are presented: `tiles` (real subcategories), `chips` (a partition of one attribute template) or `transparent` (browsing skips this node — its children appear where it would, and its own page is its parent's). `null` when the category has no children. The authoring value `auto` is resolved server-side and never appears here. */ readonly children_as: (components["schemas"]["ChildrenAsEnum"] | components["schemas"]["NullEnum"]) | null; /** @description Name of the axis the children split on, for a `chips` row (e.g. a key rendering as 'Condition' over New | Used). A translation key, like `name` — empty when nobody named it. */ readonly children_axis_label: string; /** @description External tag of the field the children enumerate (e.g. `operation_type`) — the source catalogue's own identifier, NOT a translation key. It is how a client recognises that this level and an ordinary feature elsewhere in the tree are the same question. Empty when nobody named it. */ readonly children_axis_tag: string; /** @description Slug of the feature whose values ARE this category's children. When set, `GET /children/` answers with virtual children (each a `{feature: value}` filter on this category) and `children_pks` is empty — there are no rows. Empty for every ordinary node. */ readonly children_expand_by: string; /** @description Ids of the children a reader can see — exactly what `GET /categories/{id}/children/` returns, in the same order. Read this, not `tn_children_pks`: that is django-treenode's raw structure column and it counts soft-deleted and retired rows too, so a rule built on it (leaf-ness, child counts, a one-child wrapper check) sees children no reader can fetch. */ readonly children_pks: number[]; /** @description How many children a reader can see — `len(children_pks)`. */ readonly children_count: number; readonly features: number[]; /** @description If True, category name is a translation key */ translatable?: boolean; /** Parent */ tn_parent?: number | null; /** * Priority * Format: int64 */ tn_priority?: number; /** Ancestors pks */ readonly tn_ancestors_pks: string; /** @description django-treenode's raw structure column, `,`-joined. Counts soft-deleted and retired rows, so it is NOT the child set a reader can fetch — use `children_pks`. Kept because the revision-sync feed's consumers mirror the tree columns. */ readonly tn_children_pks: string; readonly revision: number; deleted?: boolean; /** @description Always `true`. This node is drawn here but lives elsewhere in the tree — `id`, `slug` and `tn_parent` are the target's. */ readonly linked: boolean; }; /** * @description The public projection plus provenance — staff writes only. * * ``create``/``update``/``partial_update`` are gated by ``ReadOnlyOrStaff``, * and an operator hand-fixing an imported row legitimately needs to see and * set ``external_id``/``external_source`` (re-pointing a row at its source * node is how a botched match is repaired). Extending the public class keeps * the two projections structurally one serializer: a field added to the * public set is automatically part of this one, and this one can never lose * a public field silently. * * ``children_as_authored`` is the same split, one field further: the * inherited ``children_as`` stays the RESOLVED read (an operator wants to * see what a visitor sees), and the raw authoring column — ``auto`` * included — gets its own key, writable. Without it "an authored value wins * over derivation" would be reachable only from the admin or a DB console. * ``children_as_derived`` rides along read-only so an operator can tell an * inherited decision from their own. */ CategoryStaff: { readonly id: number; name: string; slug: string; /** @description CDN catalog icon reference (opaque string, e.g. catalog/asset-name) */ catalog_icon?: string; /** @description CDN carousel icon reference (opaque string, e.g. carousel/asset-name) */ carousel_icon?: string; /** @description Whether this category appears in the carousel */ carousel_enabled?: boolean; /** @description Whether this category is active */ active?: boolean; /** @description How this category's children are presented: `tiles` (real subcategories), `chips` (a partition of one attribute template) or `transparent` (browsing skips this node — its children appear where it would, and its own page is its parent's). `null` when the category has no children. The authoring value `auto` is resolved server-side and never appears here. */ readonly children_as: (components["schemas"]["ChildrenAsEnum"] | components["schemas"]["NullEnum"]) | null; children_axis_label?: string; children_axis_tag?: string; children_expand_by?: string; /** @description Ids of the children a reader can see — exactly what `GET /categories/{id}/children/` returns, in the same order. Read this, not `tn_children_pks`: that is django-treenode's raw structure column and it counts soft-deleted and retired rows too, so a rule built on it (leaf-ness, child counts, a one-child wrapper check) sees children no reader can fetch. */ readonly children_pks: number[]; /** @description How many children a reader can see — `len(children_pks)`. */ readonly children_count: number; readonly features: number[]; /** @description If True, category name is a translation key */ translatable?: boolean; /** Parent */ tn_parent?: number | null; /** * Priority * Format: int64 */ tn_priority?: number; /** Ancestors pks */ readonly tn_ancestors_pks: string; /** @description django-treenode's raw structure column, `,`-joined. Counts soft-deleted and retired rows, so it is NOT the child set a reader can fetch — use `children_pks`. Kept because the revision-sync feed's consumers mirror the tree columns. */ readonly tn_children_pks: string; readonly revision: number; deleted?: boolean; /** @description Identifier in the source catalogue this category was imported from. */ external_id?: string; /** @description Source catalogue `external_id` belongs to (blank = the single/default source). */ external_source?: string; /** * @description Authoring value: `auto` leaves it to `derive_children_as`, `tiles`/`chips`/`transparent` pin it. `transparent` is authored only — derivation never produces it. * * * `auto` - Auto (derive) * * `tiles` - Tiles * * `chips` - Chips * * `transparent` - Transparent (browsing skips this level) */ children_as_authored?: components["schemas"]["ChildrenAsAuthoredEnum"]; readonly children_as_derived: string; }; /** * @description One node of ``GET /categories/api/v1/tree/`` — schema, not machinery. * * The endpoint assembles plain dicts from a single flat ``values()`` read * (a nested serializer over model instances would be one query per level), * so this class exists to give the emitted contract a named shape rather * than to run. * * ``children`` is declared as a list of objects instead of recursing into * this same serializer: the nesting is depth-capped at request time, and a * self-referential component makes a generator that inlines definitions * recur until it gives up. The element shape is this one. * * Provenance (``external_id``/``external_source``) is absent here for the * reason :class:`CategorySerializer` states — this is an anonymous read. */ CategoryTreeNode: { id: number; slug: string; name: string; /** @description Ancestor ids root->self, `/`-joined (e.g. `141/151/166`) — the form the search query's `category` parameter takes. */ path: string; catalog_icon: string; /** * @description `null` when the node has no children. `transparent` means a menu draws this node's children in its place. * * * `tiles` - tiles * * `chips` - chips * * `transparent` - transparent */ children_as: (components["schemas"]["ChildrenAsEnum"] | components["schemas"]["NullEnum"]) | null; /** @description Name of the axis the children split on, for a `chips` row. A translation key, like `name`; empty when nobody named it. */ children_axis_label: string; /** @description External tag of the field the children enumerate — the source catalogue's own identifier, not a translation key. Empty when nobody named it. */ children_axis_tag: string; /** @description Present and `true` on a POINTER: this node is drawn among its parent's children but lives elsewhere in the tree. Its `id`, `slug` and `path` are the target's, so following it lands on the target's own page; only `name` may be the pointer's. */ linked?: boolean; /** @description Present and `true` on a value of an expanded branch (the parent's `children_expand_by`). Such a node has no `id`, no `slug` and no `path` — it carries `name`, `value` and a `filter` object the client turns into its own filter URL on the PARENT category. */ virtual?: boolean; /** @description Virtual nodes only: the option code this node stands for. */ value?: string; /** @description Virtual nodes only: the `{feature_slug: value}` pair that selects this node's listings on the parent category. */ filter?: { [key: string]: string; }; /** @description How many children this node HAS — live rows only, so it counts no soft-deleted or retired row. Not `len(children)`: at the requested depth `children` is empty and this still says whether there is another level to ask for. */ children_count: number; /** @description Nodes of this same shape; empty at the requested depth. */ children: { [key: string]: unknown; }[]; }; /** * @description One value of an expanded branch — a child with no row behind it. * * Emitted where the parent carries ``children_expand_by``. There is no * ``id`` and no ``slug`` because there is nothing to address; the address * is the client's own filter URL on the PARENT category, built from * ``filter``. */ CategoryVirtualChild: { /** @description Display label of the value — a translation key, like `name`. */ name: string; /** @description The option code this node stands for. */ value: string; /** @description Always `true`. */ virtual: boolean; /** @description The `{feature_slug: value}` pair that selects this node's listings on the parent category. */ filter: { [key: string]: string; }; }; /** * @description * `auto` - Auto (derive) * * `tiles` - Tiles * * `chips` - Chips * * `transparent` - Transparent (browsing skips this level) * @enum {string} */ ChildrenAsAuthoredEnum: "auto" | "tiles" | "chips" | "transparent"; /** @enum {string} */ ChildrenAsEnum: "tiles" | "chips" | "transparent"; /** * @description * `keep` - keep * * `add` - add * * `edit` - edit * * `delete` - delete * * `reorder` - reorder * @enum {string} */ CommandEnum: "keep" | "add" | "edit" | "delete" | "reorder"; /** @description Serializer for convertible-unit feature configuration. */ ConvertibleUnitConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "convertible_unit"; unitType?: string | null; unit_m?: string | null; unit_i?: string | null; precision?: number; prefix?: string | null; /** Format: double */ min?: number | null; /** Format: double */ max?: number | null; }; /** @description Serializer for convertible-unit feature DTO. */ ConvertibleUnitDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "convertible_unit"; /** Format: double */ value?: number | null; unit?: string | null; }; /** * @description * `convertible_unit` - convertible_unit * @enum {string} */ ConvertibleUnitTypeEnum: "convertible_unit"; /** @description Serializer for date feature configuration. */ DateConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "date"; precision?: components["schemas"]["PrecisionEnum"]; minDate?: number | null; maxDate?: number | null; allowFuture?: boolean; allowPast?: boolean; default?: number | null; options?: number[]; lockInput?: boolean; placeholder?: string | null; }; /** @description Serializer for date feature DTO. */ DateDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "date"; value?: number | null; }; /** * @description * `date` - date * @enum {string} */ DateTypeEnum: "date"; /** * @description * `below_minimum` - below_minimum * * `above_maximum` - above_maximum * * `not_in_options` - not_in_options * * `invalid_type` - invalid_type * * `invalid_format` - invalid_format * * `mandatory_missing` - mandatory_missing * * `duplicate_slug` - duplicate_slug * * `unknown_feature_type` - unknown_feature_type * * `not_allowed` - not_allowed * * `unknown_feature` - unknown_feature * * `description_too_short` - description_too_short * * `description_too_long` - description_too_long * * `invalid_config` - invalid_config * * `min_greater_than_max` - min_greater_than_max * * `empty_options` - empty_options * * `invalid_rules` - invalid_rules * @enum {string} */ ErrorEnum: "below_minimum" | "above_maximum" | "not_in_options" | "invalid_type" | "invalid_format" | "mandatory_missing" | "duplicate_slug" | "unknown_feature_type" | "not_allowed" | "unknown_feature" | "description_too_short" | "description_too_long" | "invalid_config" | "min_greater_than_max" | "empty_options" | "invalid_rules"; /** @description Feature serializer with polymorphic config support. */ Feature: { readonly id: number; name: string; slug?: string; icon?: string; comment?: string; readonly config: Omit; mandatory?: boolean; show_as_badge?: boolean; show_at_title?: boolean; /** * @description Who may READ a stored value: 'public' = anyone (the default), 'owner' = the object's owner and staff, 'staff' = staff only. The value is still required, validated and stored either way. A non-public feature is never a title and never a badge. * * * `public` - Public — anyone may read the value * * `owner` - Owner (and staff) * * `staff` - Staff only */ visibility?: components["schemas"]["FeatureVisibilityEnum"]; /** * @description What to translate: 'all' = title + options, 'title' = title only, 'none' = nothing * * * `all` - All (title + options) * * `title` - Title only * * `none` - None */ translate?: components["schemas"]["FeatureTranslateModeEnum"]; /** * @description Which classified axis this feature IS — `make`, `model`, `generation`, `year`, `mileage` — or null. Authored value first, then the loader's derivation. * * * `make` - Make (brand / vendor / manufacturer) * * `model` - Model * * `generation` - Generation * * `year` - Year of manufacture * * `mileage` - Mileage */ readonly axis_role: (components["schemas"]["FeatureAxisRoleEnum"] | components["schemas"]["NullEnum"]) | null; /** * @description The authoring column: blank leaves the role to `load_catalog`'s slug-table derivation, a value pins it. `axis_role` above is the RESOLVED read. * * * `make` - Make (brand / vendor / manufacturer) * * `model` - Model * * `generation` - Generation * * `year` - Year of manufacture * * `mileage` - Mileage */ axis_role_authored?: components["schemas"]["FeatureAxisRoleEnum"] | components["schemas"]["BlankEnum"]; readonly axis_role_derived: string; /** @description Conditional rules (closed grammar). Validated by stapel-attributes. */ rules?: unknown; /** @description Help text under the field; translation key or literal. */ description?: string; /** @description Placeholder text; translation key or literal. */ example?: string; /** @description Initial form value in DTO 'value' shape (for a select, a list of option codes). */ default?: unknown; /** @description Notices rendered with the field: [{"title": ..., "content": ...}]. */ hints?: unknown; /** @description Form section; sections order by first appearance. */ group?: string; /** Parent */ tn_parent?: number | null; /** * Priority * Format: int64 */ tn_priority?: number; /** Ancestors pks */ readonly tn_ancestors_pks: string; /** Children pks */ readonly tn_children_pks: string; /** Descendants pks */ readonly tn_descendants_pks: string; /** Siblings pks */ readonly tn_siblings_pks: string; }; /** * @description * `make` - Make (brand / vendor / manufacturer) * * `model` - Model * * `generation` - Generation * * `year` - Year of manufacture * * `mileage` - Mileage * @enum {string} */ FeatureAxisRoleEnum: "make" | "model" | "generation" | "year" | "mileage"; /** @description Serializer for bulk add/update operations — id is required. */ FeatureBulk: { id: number; config?: components["schemas"]["FeatureConfig"]; readonly revision: number; deleted?: boolean; /** Ancestors pks */ readonly tn_ancestors_pks: string; /** Ancestors count */ readonly tn_ancestors_count: number; /** Children pks */ readonly tn_children_pks: string; /** Children count */ readonly tn_children_count: number; /** Depth */ readonly tn_depth: number; /** Descendants pks */ readonly tn_descendants_pks: string; /** Descendants count */ readonly tn_descendants_count: number; /** Index */ readonly tn_index: number; /** Level */ readonly tn_level: number; /** * Priority * Format: int64 */ tn_priority?: number; /** Order */ readonly tn_order: number; /** Siblings pks */ readonly tn_siblings_pks: string; /** Siblings count */ readonly tn_siblings_count: number; name: string; slug?: string; icon?: string; comment?: string; mandatory?: boolean; show_as_badge?: boolean; show_at_title?: boolean; /** * @description Who may READ a stored value: 'public' = anyone (the default), 'owner' = the object's owner and staff, 'staff' = staff only. The value is still required, validated and stored either way. A non-public feature is never a title and never a badge. * * * `public` - Public — anyone may read the value * * `owner` - Owner (and staff) * * `staff` - Staff only */ visibility?: components["schemas"]["FeatureVisibilityEnum"]; /** @description Conditional rules (closed grammar). Validated by stapel-attributes. */ rules?: unknown; /** @description Help text under the field; translation key or literal. */ description?: string; /** @description Placeholder text; translation key or literal. */ example?: string; /** @description Initial form value in DTO 'value' shape (for a select, a list of option codes). */ default?: unknown; /** @description Notices rendered with the field: [{"title": ..., "content": ...}]. */ hints?: unknown; /** @description Form section; sections order by first appearance. */ group?: string; /** * @description Which classified axis this feature IS, when it is one: `make`, `model`, `generation`, `year`, `mileage`. Blank (the default) for the overwhelming majority of features, which describe an object rather than organise it. An authored value wins over the loader's derivation. * * * `make` - Make (brand / vendor / manufacturer) * * `model` - Model * * `generation` - Generation * * `year` - Year of manufacture * * `mileage` - Mileage */ axis_role?: components["schemas"]["FeatureAxisRoleEnum"] | components["schemas"]["BlankEnum"]; /** * @description Cache of `load_catalog`'s slug-table derivation. Read only when `axis_role` is blank; never overwrites an authored value. * * * `make` - Make (brand / vendor / manufacturer) * * `model` - Model * * `generation` - Generation * * `year` - Year of manufacture * * `mileage` - Mileage */ readonly axis_role_derived: components["schemas"]["FeatureAxisRoleEnum"]; /** * @description What to translate: 'all' = title + options, 'title' = title only, 'none' = nothing * * * `all` - All (title + options) * * `title` - Title only * * `none` - None */ translate?: components["schemas"]["FeatureTranslateModeEnum"]; /** @description Test/scratch data — excluded from export_catalog fixtures. */ is_test?: boolean; /** Parent */ tn_parent?: number | null; }; /** @description Compact feature serializer for list endpoints and embedded feature data. */ FeatureCompact: { readonly id: number; /** Parent */ tn_parent?: number | null; name: string; slug?: string; icon?: string; comment?: string; readonly config: Omit; mandatory?: boolean; show_as_badge?: boolean; show_at_title?: boolean; /** * @description Who may READ a stored value: 'public' = anyone (the default), 'owner' = the object's owner and staff, 'staff' = staff only. The value is still required, validated and stored either way. A non-public feature is never a title and never a badge. * * * `public` - Public — anyone may read the value * * `owner` - Owner (and staff) * * `staff` - Staff only */ visibility?: components["schemas"]["FeatureVisibilityEnum"]; /** * @description What to translate: 'all' = title + options, 'title' = title only, 'none' = nothing * * * `all` - All (title + options) * * `title` - Title only * * `none` - None */ translate?: components["schemas"]["FeatureTranslateModeEnum"]; /** * @description Which classified axis this feature IS — `make`, `model`, `generation`, `year`, `mileage` — or null. It is what a storefront reads to build a «more of this make» link, or an AI descent to fill make before model, instead of matching slugs against a table of its own. * * * `make` - Make (brand / vendor / manufacturer) * * `model` - Model * * `generation` - Generation * * `year` - Year of manufacture * * `mileage` - Mileage */ readonly axis_role: (components["schemas"]["FeatureAxisRoleEnum"] | components["schemas"]["NullEnum"]) | null; /** @description Conditional rules (closed grammar). Validated by stapel-attributes. */ rules?: unknown; /** @description Help text under the field; translation key or literal. */ description?: string; /** @description Placeholder text; translation key or literal. */ example?: string; /** @description Initial form value in DTO 'value' shape (for a select, a list of option codes). */ default?: unknown; /** @description Notices rendered with the field: [{"title": ..., "content": ...}]. */ hints?: unknown; /** @description Form section; sections order by first appearance. */ group?: string; }; FeatureConfig: components["schemas"]["RefSelectConfig"] | components["schemas"]["IntConfig"] | components["schemas"]["FloatConfig"] | components["schemas"]["StringConfig"] | components["schemas"]["BoolConfig"] | components["schemas"]["HexColorConfig"] | components["schemas"]["SelectConfig"] | components["schemas"]["DateConfig"] | components["schemas"]["HeaderConfig"] | components["schemas"]["HierarchicalSelectConfig"] | components["schemas"]["ConvertibleUnitConfig"] | components["schemas"]["RefHierarchicalSelectConfig"] | components["schemas"]["GroupConfig"]; FeatureConvertType: { /** @description New config after conversion */ config: Omit; /** * @description Whether to propagate to all descendants * @default false */ propagate: boolean; }; /** @description Serializer for creating/updating features with polymorphic config. */ FeatureCreateUpdate: { readonly id: number; config?: components["schemas"]["FeatureConfig"]; readonly axis_role_derived: string; readonly revision: number; deleted?: boolean; /** Ancestors pks */ readonly tn_ancestors_pks: string; /** Ancestors count */ readonly tn_ancestors_count: number; /** Children pks */ readonly tn_children_pks: string; /** Children count */ readonly tn_children_count: number; /** Depth */ readonly tn_depth: number; /** Descendants pks */ readonly tn_descendants_pks: string; /** Descendants count */ readonly tn_descendants_count: number; /** Index */ readonly tn_index: number; /** Level */ readonly tn_level: number; /** * Priority * Format: int64 */ tn_priority?: number; /** Order */ readonly tn_order: number; /** Siblings pks */ readonly tn_siblings_pks: string; /** Siblings count */ readonly tn_siblings_count: number; name: string; slug?: string; icon?: string; comment?: string; mandatory?: boolean; show_as_badge?: boolean; show_at_title?: boolean; /** * @description Who may READ a stored value: 'public' = anyone (the default), 'owner' = the object's owner and staff, 'staff' = staff only. The value is still required, validated and stored either way. A non-public feature is never a title and never a badge. * * * `public` - Public — anyone may read the value * * `owner` - Owner (and staff) * * `staff` - Staff only */ visibility?: components["schemas"]["FeatureVisibilityEnum"]; /** @description Conditional rules (closed grammar). Validated by stapel-attributes. */ rules?: unknown; /** @description Help text under the field; translation key or literal. */ description?: string; /** @description Placeholder text; translation key or literal. */ example?: string; /** @description Initial form value in DTO 'value' shape (for a select, a list of option codes). */ default?: unknown; /** @description Notices rendered with the field: [{"title": ..., "content": ...}]. */ hints?: unknown; /** @description Form section; sections order by first appearance. */ group?: string; /** * @description Which classified axis this feature IS, when it is one: `make`, `model`, `generation`, `year`, `mileage`. Blank (the default) for the overwhelming majority of features, which describe an object rather than organise it. An authored value wins over the loader's derivation. * * * `make` - Make (brand / vendor / manufacturer) * * `model` - Model * * `generation` - Generation * * `year` - Year of manufacture * * `mileage` - Mileage */ axis_role?: components["schemas"]["FeatureAxisRoleEnum"] | components["schemas"]["BlankEnum"]; /** * @description What to translate: 'all' = title + options, 'title' = title only, 'none' = nothing * * * `all` - All (title + options) * * `title` - Title only * * `none` - None */ translate?: components["schemas"]["FeatureTranslateModeEnum"]; /** @description Test/scratch data — excluded from export_catalog fixtures. */ is_test?: boolean; /** Parent */ tn_parent?: number | null; }; FeatureDto: components["schemas"]["RefSelectDto"] | components["schemas"]["IntDto"] | components["schemas"]["FloatDto"] | components["schemas"]["StringDto"] | components["schemas"]["BoolDto"] | components["schemas"]["HexColorDto"] | components["schemas"]["SelectDto"] | components["schemas"]["DateDto"] | components["schemas"]["HeaderDto"] | components["schemas"]["HierarchicalSelectDto"] | components["schemas"]["ConvertibleUnitDto"] | components["schemas"]["RefHierarchicalSelectDto"] | components["schemas"]["GroupDto"]; /** @description Request payload for applying feature editor changes. */ FeatureEditorApply: { features: components["schemas"]["FeatureEditorItem"][]; draft?: string | null; base_revision: number; }; /** @description Draft serializer for feature editor. */ FeatureEditorDraft: { /** @default */ draft: string; }; /** @description Feature editor draft state. */ FeatureEditorDraftResponse: { /** * @description JSON-encoded draft string, null if no draft saved * @example { * "features": [] * } */ draft: string | null; }; /** * @description Writable feature payload for the category feature editor. * * Uses Serializer instead of ModelSerializer to avoid model-level * validation (like the unique slug constraint) since this is just a data * container for the editor. */ FeatureEditorFeature: { id?: number | null; /** @default */ name: string; /** @default */ slug: string; icon?: string | null; /** @default */ comment: string; config?: components["schemas"]["FeatureConfig"]; /** @default false */ mandatory: boolean; /** @default false */ show_as_badge: boolean; /** @default false */ show_at_title: boolean; /** * @description Who may READ a stored value: 'public' = anyone (the default), 'owner' = the object's owner and staff, 'staff' = staff only. The value is still required, validated and stored either way; a non-public feature is simply never a title and never a badge. * * * `public` - Public — anyone may read the value * * `owner` - Owner (and staff) * * `staff` - Staff only * @default public */ visibility: components["schemas"]["FeatureVisibilityEnum"]; /** * @description Which classified axis this feature IS, when it is one. Blank (the default) leaves it to `load_catalog`'s slug-table derivation; a value pins it and wins over derivation. Named for the AUTHORING column on purpose: it lines up with the key `FeatureSerializer` reads it back under, so an editor round-trip cannot pin a role the derivation merely guessed. * * * `make` - Make (brand / vendor / manufacturer) * * `model` - Model * * `generation` - Generation * * `year` - Year of manufacture * * `mileage` - Mileage * @default */ axis_role_authored: components["schemas"]["FeatureAxisRoleEnum"] | components["schemas"]["BlankEnum"]; /** * @description What to translate: 'all' = title + options, 'title' = title only, 'none' = nothing * * * `all` - All (title + options) * * `title` - Title only * * `none` - None * @default all */ translate: components["schemas"]["FeatureTranslateModeEnum"]; /** @description Conditional rules over sibling values (stapel-attributes' closed grammar). */ rules?: { [key: string]: unknown; }[]; /** @default */ description: string; /** @default */ example: string; default?: unknown; /** @description Notices rendered with the field: [{title, content}]. */ hints?: { [key: string]: string; }[]; /** @default */ group: string; tn_parent?: number | null; /** @default 0 */ tn_priority: number; }; /** @description Item from the feature editor list. */ FeatureEditorItem: { order: number; action: components["schemas"]["ActionEnum"]; feature: components["schemas"]["FeatureEditorFeature"]; replace_with?: number | null; }; /** @description Response serializer for feature editor state. */ FeatureEditorState: { features: components["schemas"]["FeatureEditorStateItem"][]; available_root_features: components["schemas"]["Feature"][]; /** @default */ draft: string; revision?: number; }; /** @description Single item in feature editor state. */ FeatureEditorStateItem: { order: number; available_actions: components["schemas"]["AvailableActionsEnum"][]; action: components["schemas"]["ActionEnum"]; feature: components["schemas"]["Feature"]; parent_feature?: components["schemas"]["Feature"] | null; }; /** * @description A compact feature as it reads in an EFFECTIVE (merged) schema. * * Three keys more than the compact form, and only where they apply. A * `chips` parent's schema is the UNION of its children's: * * * a feature whose carrying children disagree about its config, its * requiredness or its rules carries ``divergent: true`` so a client can * hide the control until a chip is picked instead of showing one that * means something different per chip. The config beside it is already the * widest those children accept, so a client that shows it anyway refuses * nothing a child would take; * * a feature only SOME children carry carries ``partial: true`` and * ``carried_by`` naming their slugs. Its config is merged from those * children alone. A client may filter the whole partition by it, or offer * it only under the chips that have it — but it no longer disappears from * the parent while the leaf beside it keeps it. * * Absent means false — the keys are dropped rather than sent as ``false`` * and an empty list, so a leaf and a `tiles` parent answer byte-for-byte * what they answered before these existed. */ FeatureEffective: { readonly id: number; /** Parent */ tn_parent?: number | null; name: string; slug?: string; icon?: string; comment?: string; readonly config: Omit; mandatory?: boolean; show_as_badge?: boolean; show_at_title?: boolean; /** * @description Who may READ a stored value: 'public' = anyone (the default), 'owner' = the object's owner and staff, 'staff' = staff only. The value is still required, validated and stored either way. A non-public feature is never a title and never a badge. * * * `public` - Public — anyone may read the value * * `owner` - Owner (and staff) * * `staff` - Staff only */ visibility?: components["schemas"]["FeatureVisibilityEnum"]; /** * @description What to translate: 'all' = title + options, 'title' = title only, 'none' = nothing * * * `all` - All (title + options) * * `title` - Title only * * `none` - None */ translate?: components["schemas"]["FeatureTranslateModeEnum"]; /** * @description Which classified axis this feature IS — `make`, `model`, `generation`, `year`, `mileage` — or null. It is what a storefront reads to build a «more of this make» link, or an AI descent to fill make before model, instead of matching slugs against a table of its own. * * * `make` - Make (brand / vendor / manufacturer) * * `model` - Model * * `generation` - Generation * * `year` - Year of manufacture * * `mileage` - Mileage */ readonly axis_role: (components["schemas"]["FeatureAxisRoleEnum"] | components["schemas"]["NullEnum"]) | null; /** @description Conditional rules (closed grammar). Validated by stapel-attributes. */ rules?: unknown; /** @description Help text under the field; translation key or literal. */ description?: string; /** @description Placeholder text; translation key or literal. */ example?: string; /** @description Initial form value in DTO 'value' shape (for a select, a list of option codes). */ default?: unknown; /** @description Notices rendered with the field: [{"title": ..., "content": ...}]. */ hints?: unknown; /** @description Form section; sections order by first appearance. */ group?: string; /** @description Present and true when the children of this `chips` parent that carry the feature do not agree on it; the config shown is the widest of theirs. Absent means the carrying children agree. */ divergent?: boolean; /** @description Present and true when only SOME children of this `chips` parent carry the feature; `carried_by` names them and the config shown is merged from them alone. Absent means every child carries it. */ partial?: boolean; /** @description Slugs of the children that carry this feature, in the order `GET /children/` returns them. Present only beside `partial: true`. */ carried_by?: string[]; }; /** * @description * `all` - All (title + options) * * `title` - Title only * * `none` - None * @enum {string} */ FeatureTranslateModeEnum: "all" | "title" | "none"; /** @description Serializer for FeatureValidationResult. */ FeatureValidationResult: { id?: unknown; slug: string; status: components["schemas"]["StatusEnum"]; error?: (components["schemas"]["ErrorEnum"] | components["schemas"]["NullEnum"]) | null; ref_value?: unknown; message?: string | null; localizable_error?: string | null; params?: { [key: string]: unknown; } | null; warnings?: string[] | null; }; /** * @description * `public` - Public — anyone may read the value * * `owner` - Owner (and staff) * * `staff` - Staff only * @enum {string} */ FeatureVisibilityEnum: "public" | "owner" | "staff"; /** @description Serializer for float feature configuration. */ FloatConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "float"; /** Format: double */ min?: number | null; /** Format: double */ max?: number | null; precision?: number; options?: number[] | null; allowCustom?: boolean; prefix?: string | null; postfix?: string | null; postfix1000?: string | null; placeholder?: string | null; }; /** @description Serializer for float feature DTO. */ FloatDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "float"; /** Format: double */ value?: number; }; /** * @description * `float` - float * @enum {string} */ FloatTypeEnum: "float"; /** * @description Serializer for group feature configuration. * * ``fields`` passes through as raw dicts on purpose: each child carries its * own ``config`` discriminated by ``type``, parsed by that type's own strict * serializer when the group validates its children. */ GroupConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "group"; fields?: { [key: string]: unknown; }[]; repeat?: components["schemas"]["GroupRepeat"] | null; }; /** @description Serializer for group feature DTO. */ GroupDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "group"; value?: { [key: string]: unknown; }[]; }; GroupRepeat: { min?: number; max?: number | null; }; /** * @description * `group` - group * @enum {string} */ GroupTypeEnum: "group"; /** @description Serializer for header feature configuration. */ HeaderConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "header"; style?: components["schemas"]["StyleEnum"]; }; /** @description Serializer for header feature DTO. */ HeaderDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "header"; value?: string | null; }; /** * @description * `header` - header * @enum {string} */ HeaderTypeEnum: "header"; /** @description Serializer for hex color feature configuration. */ HexColorConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "hex_color"; options?: components["schemas"]["HexColorOption"][]; allowCustom?: boolean; }; /** @description Serializer for hex color feature DTO. */ HexColorDto: { value?: components["schemas"]["HexColorValue"] | null; /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "hex_color"; }; HexColorOption: { simple: string; hex?: string | null; label?: string | null; }; /** * @description * `hex_color` - hex_color * @enum {string} */ HexColorTypeEnum: "hex_color"; /** @description Serializer for hex color value. */ HexColorValue: { simple: string; hex?: string | null; label?: string | null; }; HierarchicalOption: { value: string; label?: string | null; icon?: string | null; childrenTitle?: string | null; children?: components["schemas"]["HierarchicalOption"][]; }; /** @description Serializer for hierarchical select feature configuration. */ HierarchicalSelectConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "hierarchical_select"; options?: components["schemas"]["HierarchicalOption"][]; required?: boolean; minDepth?: number; maxDepth?: number | null; translatable_options?: boolean; }; /** @description Serializer for hierarchical select feature DTO. */ HierarchicalSelectDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "hierarchical_select"; value?: string[]; }; /** * @description * `hierarchical_select` - hierarchical_select * @enum {string} */ HierarchicalSelectTypeEnum: "hierarchical_select"; /** @description Serializer for integer feature configuration. */ IntConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "int"; min?: number | null; max?: number | null; options?: number[] | null; allowCustom?: boolean; prefix?: string | null; postfix?: string | null; postfix1000?: string | null; placeholder?: string | null; precision?: number; optionsRef?: components["schemas"]["OptionsRef"] | null; }; /** @description Serializer for integer feature DTO. */ IntDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "int"; value?: number; }; /** * @description * `int` - int * @enum {string} */ IntTypeEnum: "int"; /** @description Serializer for /revision endpoint response. */ MaxRevision: { /** @description Current maximum revision number */ revision: number; }; /** @enum {unknown} */ NullEnum: null; OptionsRef: { vocabulary?: string; level?: string; parentFeature?: string | null; }; PaginatedCategoryList: { pagination: { /** @description Current page number */ page: number; /** @description Number of items per page */ page_size: number; /** @description Total number of pages */ total_pages: number; /** @description Total number of items */ total_count: number; /** @description Whether there is a next page */ has_next: boolean; /** @description Whether there is a previous page */ has_previous: boolean; }; revisions: { /** @description Minimum revision in current response */ min: number | null; /** @description Maximum revision in current response */ max: number | null; /** @description Global maximum revision in the table */ global_max: number; /** @description IDs of soft-deleted items since min_revision */ deleted_ids: number[]; }; results: components["schemas"]["Category"][]; }; PaginatedFeatureCompactList: { pagination: { /** @description Current page number */ page: number; /** @description Number of items per page */ page_size: number; /** @description Total number of pages */ total_pages: number; /** @description Total number of items */ total_count: number; /** @description Whether there is a next page */ has_next: boolean; /** @description Whether there is a previous page */ has_previous: boolean; }; revisions: { /** @description Minimum revision in current response */ min: number | null; /** @description Maximum revision in current response */ max: number | null; /** @description Global maximum revision in the table */ global_max: number; /** @description IDs of soft-deleted items since min_revision */ deleted_ids: number[]; }; results: components["schemas"]["FeatureCompact"][]; }; /** * @description The public projection plus provenance — staff writes only. * * ``create``/``update``/``partial_update`` are gated by ``ReadOnlyOrStaff``, * and an operator hand-fixing an imported row legitimately needs to see and * set ``external_id``/``external_source`` (re-pointing a row at its source * node is how a botched match is repaired). Extending the public class keeps * the two projections structurally one serializer: a field added to the * public set is automatically part of this one, and this one can never lose * a public field silently. * * ``children_as_authored`` is the same split, one field further: the * inherited ``children_as`` stays the RESOLVED read (an operator wants to * see what a visitor sees), and the raw authoring column — ``auto`` * included — gets its own key, writable. Without it "an authored value wins * over derivation" would be reachable only from the admin or a DB console. * ``children_as_derived`` rides along read-only so an operator can tell an * inherited decision from their own. */ PatchedCategoryStaff: { readonly id?: number; name?: string; slug?: string; /** @description CDN catalog icon reference (opaque string, e.g. catalog/asset-name) */ catalog_icon?: string; /** @description CDN carousel icon reference (opaque string, e.g. carousel/asset-name) */ carousel_icon?: string; /** @description Whether this category appears in the carousel */ carousel_enabled?: boolean; /** @description Whether this category is active */ active?: boolean; /** @description How this category's children are presented: `tiles` (real subcategories), `chips` (a partition of one attribute template) or `transparent` (browsing skips this node — its children appear where it would, and its own page is its parent's). `null` when the category has no children. The authoring value `auto` is resolved server-side and never appears here. */ readonly children_as?: (components["schemas"]["ChildrenAsEnum"] | components["schemas"]["NullEnum"]) | null; children_axis_label?: string; children_axis_tag?: string; children_expand_by?: string; /** @description Ids of the children a reader can see — exactly what `GET /categories/{id}/children/` returns, in the same order. Read this, not `tn_children_pks`: that is django-treenode's raw structure column and it counts soft-deleted and retired rows too, so a rule built on it (leaf-ness, child counts, a one-child wrapper check) sees children no reader can fetch. */ readonly children_pks?: number[]; /** @description How many children a reader can see — `len(children_pks)`. */ readonly children_count?: number; readonly features?: number[]; /** @description If True, category name is a translation key */ translatable?: boolean; /** Parent */ tn_parent?: number | null; /** * Priority * Format: int64 */ tn_priority?: number; /** Ancestors pks */ readonly tn_ancestors_pks?: string; /** @description django-treenode's raw structure column, `,`-joined. Counts soft-deleted and retired rows, so it is NOT the child set a reader can fetch — use `children_pks`. Kept because the revision-sync feed's consumers mirror the tree columns. */ readonly tn_children_pks?: string; readonly revision?: number; deleted?: boolean; /** @description Identifier in the source catalogue this category was imported from. */ external_id?: string; /** @description Source catalogue `external_id` belongs to (blank = the single/default source). */ external_source?: string; /** * @description Authoring value: `auto` leaves it to `derive_children_as`, `tiles`/`chips`/`transparent` pin it. `transparent` is authored only — derivation never produces it. * * * `auto` - Auto (derive) * * `tiles` - Tiles * * `chips` - Chips * * `transparent` - Transparent (browsing skips this level) */ children_as_authored?: components["schemas"]["ChildrenAsAuthoredEnum"]; readonly children_as_derived?: string; }; /** @description Serializer for creating/updating features with polymorphic config. */ PatchedFeatureCreateUpdate: { readonly id?: number; config?: components["schemas"]["FeatureConfig"]; readonly axis_role_derived?: string; readonly revision?: number; deleted?: boolean; /** Ancestors pks */ readonly tn_ancestors_pks?: string; /** Ancestors count */ readonly tn_ancestors_count?: number; /** Children pks */ readonly tn_children_pks?: string; /** Children count */ readonly tn_children_count?: number; /** Depth */ readonly tn_depth?: number; /** Descendants pks */ readonly tn_descendants_pks?: string; /** Descendants count */ readonly tn_descendants_count?: number; /** Index */ readonly tn_index?: number; /** Level */ readonly tn_level?: number; /** * Priority * Format: int64 */ tn_priority?: number; /** Order */ readonly tn_order?: number; /** Siblings pks */ readonly tn_siblings_pks?: string; /** Siblings count */ readonly tn_siblings_count?: number; name?: string; slug?: string; icon?: string; comment?: string; mandatory?: boolean; show_as_badge?: boolean; show_at_title?: boolean; /** * @description Who may READ a stored value: 'public' = anyone (the default), 'owner' = the object's owner and staff, 'staff' = staff only. The value is still required, validated and stored either way. A non-public feature is never a title and never a badge. * * * `public` - Public — anyone may read the value * * `owner` - Owner (and staff) * * `staff` - Staff only */ visibility?: components["schemas"]["FeatureVisibilityEnum"]; /** @description Conditional rules (closed grammar). Validated by stapel-attributes. */ rules?: unknown; /** @description Help text under the field; translation key or literal. */ description?: string; /** @description Placeholder text; translation key or literal. */ example?: string; /** @description Initial form value in DTO 'value' shape (for a select, a list of option codes). */ default?: unknown; /** @description Notices rendered with the field: [{"title": ..., "content": ...}]. */ hints?: unknown; /** @description Form section; sections order by first appearance. */ group?: string; /** * @description Which classified axis this feature IS, when it is one: `make`, `model`, `generation`, `year`, `mileage`. Blank (the default) for the overwhelming majority of features, which describe an object rather than organise it. An authored value wins over the loader's derivation. * * * `make` - Make (brand / vendor / manufacturer) * * `model` - Model * * `generation` - Generation * * `year` - Year of manufacture * * `mileage` - Mileage */ axis_role?: components["schemas"]["FeatureAxisRoleEnum"] | components["schemas"]["BlankEnum"]; /** * @description What to translate: 'all' = title + options, 'title' = title only, 'none' = nothing * * * `all` - All (title + options) * * `title` - Title only * * `none` - None */ translate?: components["schemas"]["FeatureTranslateModeEnum"]; /** @description Test/scratch data — excluded from export_catalog fixtures. */ is_test?: boolean; /** Parent */ tn_parent?: number | null; }; /** * @description * `year` - year * * `month` - month * * `date` - date * * `datetime` - datetime * @enum {string} */ PrecisionEnum: "year" | "month" | "date" | "datetime"; /** @description Serializer for the ref_hierarchical_select feature configuration. */ RefHierarchicalSelectConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "ref_hierarchical_select"; vocabulary?: string | null; levels?: string[]; minDepth?: number; maxDepth?: number | null; }; /** @description Serializer for the ref_hierarchical_select feature DTO. */ RefHierarchicalSelectDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "ref_hierarchical_select"; value?: string[]; }; /** * @description * `ref_hierarchical_select` - ref_hierarchical_select * @enum {string} */ RefHierarchicalSelectTypeEnum: "ref_hierarchical_select"; /** @description Serializer for the ref_select feature configuration. */ RefSelectConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "ref_select"; optionsRef?: components["schemas"]["OptionsRef"] | null; minSelected?: number; maxSelected?: number | null; uiStyle?: components["schemas"]["RefSelectConfigUiStyleEnum"]; prefix?: string | null; postfix?: string | null; }; /** * @description * `dropdown` - dropdown * * `chips` - chips * @enum {string} */ RefSelectConfigUiStyleEnum: "dropdown" | "chips"; /** @description Serializer for the ref_select feature DTO. */ RefSelectDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "ref_select"; value?: string[]; }; /** * @description * `ref_select` - ref_select * @enum {string} */ RefSelectTypeEnum: "ref_select"; /** @description Serializer for select feature configuration. */ SelectConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "select"; options?: components["schemas"]["SelectOption"][]; uiStyle?: components["schemas"]["SelectConfigUiStyleEnum"]; minSelected?: number; maxSelected?: number | null; lockUserInput?: boolean; translatable_options?: boolean; }; /** * @description * `dropdown` - dropdown * * `checkboxes` - checkboxes * * `chips` - chips * @enum {string} */ SelectConfigUiStyleEnum: "dropdown" | "checkboxes" | "chips"; /** @description Serializer for select feature DTO. */ SelectDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "select"; value?: string[]; }; SelectOption: { value: string; label: string; icon?: string | null; default?: boolean; }; /** * @description * `select` - select * @enum {string} */ SelectTypeEnum: "select"; /** * @description * `ok` - ok * * `validation_failed` - validation_failed * @enum {string} */ StatusEnum: "ok" | "validation_failed"; /** @description Serializer for string feature configuration. */ StringConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "string"; minLength?: number | null; maxLength?: number | null; pattern?: string | null; options?: string[] | null; allowCustom?: boolean; prefix?: string | null; postfix?: string | null; placeholder?: string | null; translatable_options?: boolean; multiline?: boolean; }; /** @description Serializer for string feature DTO. */ StringDto: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "string"; value?: string; }; /** * @description * `string` - string * @enum {string} */ StringTypeEnum: "string"; /** * @description * `l` - l * * `m` - m * @enum {string} */ StyleEnum: "l" | "m"; /** @description Restored soft-deleted categories. */ UndeleteResponse: { /** * @description List of restored category IDs * @example [ * 1, * 2, * 3 * ] */ restored: number[]; }; /** @description Request serializer for validate_dto endpoint. */ ValidateDtoRequest: { /** @description Features DTO object keyed by feature slug: {slug: {type, value, ...}} */ features: { [key: string]: components["schemas"]["FeatureDto"]; }; }; /** @description Serializer for ValidationBatchResult. */ ValidationBatchResult: { valid: boolean; results: components["schemas"]["FeatureValidationResult"][]; }; }; responses: never; parameters: never; requestBodies: never; headers: never; pathItems: never; } export type $defs = Record; export interface operations { categories_api_v1_categories_list: { parameters: { query?: { /** @description Include soft-deleted items in response. Default: true */ include_deleted?: boolean; /** @description Return objects with revision less than or equal to this value (inclusive). Default: no limit */ max_revision?: number; /** @description Return objects with revision greater than this value (exclusive). Omit for initial sync to get all items. */ min_revision?: number; /** @description Page number. Default: 1 */ page?: number; /** @description Number of items per page. Default: 100, Max: 1000 */ page_size?: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PaginatedCategoryList"]; }; }; }; }; categories_api_v1_categories_create: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CategoryStaff"]; "application/x-www-form-urlencoded": components["schemas"]["CategoryStaff"]; "multipart/form-data": components["schemas"]["CategoryStaff"]; }; }; responses: { 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CategoryStaff"]; }; }; }; }; categories_api_v1_categories_retrieve: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Category"]; }; }; }; }; categories_api_v1_categories_update: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CategoryStaff"]; "application/x-www-form-urlencoded": components["schemas"]["CategoryStaff"]; "multipart/form-data": components["schemas"]["CategoryStaff"]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CategoryStaff"]; }; }; }; }; categories_api_v1_categories_destroy: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description No response body */ 204: { headers: { [name: string]: unknown; }; content?: never; }; }; }; categories_api_v1_categories_partial_update: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody?: { content: { "application/json": components["schemas"]["PatchedCategoryStaff"]; "application/x-www-form-urlencoded": components["schemas"]["PatchedCategoryStaff"]; "multipart/form-data": components["schemas"]["PatchedCategoryStaff"]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CategoryStaff"]; }; }; }; }; categories_api_v1_categories_children_list: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CategoryChild"][]; }; }; }; }; categories_api_v1_categories_deleted_children_list: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Category"][]; }; }; }; }; categories_api_v1_categories_feature_editor_retrieve: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeatureEditorState"]; }; }; }; }; categories_api_v1_categories_feature_editor_apply_create: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["FeatureEditorApply"]; "application/x-www-form-urlencoded": components["schemas"]["FeatureEditorApply"]; "multipart/form-data": components["schemas"]["FeatureEditorApply"]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeatureEditorState"]; }; }; }; }; categories_api_v1_categories_feature_editor_draft_create: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody?: { content: { "application/json": components["schemas"]["FeatureEditorDraft"]; "application/x-www-form-urlencoded": components["schemas"]["FeatureEditorDraft"]; "multipart/form-data": components["schemas"]["FeatureEditorDraft"]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeatureEditorDraftResponse"]; }; }; }; }; categories_api_v1_categories_features_list: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { /** @description `own` — the schema is this node's own (own + inherited). `children` — this node is a `chips` parent declaring nothing itself, so the list is the union of its children's schemas. */ "X-Effective-From"?: "children" | "own"; [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeatureEffective"][]; }; }; }; }; categories_api_v1_categories_links_list: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CategoryLink"][]; }; }; }; }; categories_api_v1_categories_links_create: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CategoryLink"]; "application/x-www-form-urlencoded": components["schemas"]["CategoryLink"]; "multipart/form-data": components["schemas"]["CategoryLink"]; }; }; responses: { 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CategoryLink"]; }; }; }; }; categories_api_v1_categories_links_destroy: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; target_pk: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description No response body */ 204: { headers: { [name: string]: unknown; }; content?: never; }; 404: { headers: { [name: string]: unknown; }; content: { "application/json": { [key: string]: unknown; }; }; }; }; }; categories_api_v1_categories_undelete_create: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["Category"]; "application/x-www-form-urlencoded": components["schemas"]["Category"]; "multipart/form-data": components["schemas"]["Category"]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["UndeleteResponse"]; }; }; }; }; categories_api_v1_categories_validate_configs_retrieve: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ValidationBatchResult"]; }; }; }; }; categories_api_v1_categories_validate_dto_create: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this category. */ id: number; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["ValidateDtoRequest"]; "application/x-www-form-urlencoded": components["schemas"]["ValidateDtoRequest"]; "multipart/form-data": components["schemas"]["ValidateDtoRequest"]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ValidationBatchResult"]; }; }; }; }; categories_api_v1_categories_bulk_commands_create: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CategoryBulkCommand"]; "application/x-www-form-urlencoded": components["schemas"]["CategoryBulkCommand"]; "multipart/form-data": components["schemas"]["CategoryBulkCommand"]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": { [key: string]: unknown; }; }; }; 400: { headers: { [name: string]: unknown; }; content: { "application/json": { [key: string]: unknown; }; }; }; }; }; categories_api_v1_categories_bulk_add_create: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["CategoryBulk"][]; "application/x-www-form-urlencoded": components["schemas"]["CategoryBulk"][]; "multipart/form-data": components["schemas"]["CategoryBulk"][]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["BulkUpdateResponse"]; }; }; 400: { headers: { [name: string]: unknown; }; content: { "application/json": { [key: string]: unknown; }; }; }; }; }; categories_api_v1_categories_by_slug_retrieve: { parameters: { query?: never; header?: never; path: { slug: string; }; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Category"]; }; }; /** @description No response body */ 301: { headers: { [name: string]: unknown; }; content?: never; }; 404: { headers: { [name: string]: unknown; }; content: { "application/json": { [key: string]: unknown; }; }; }; }; }; categories_api_v1_categories_carousel_list: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Category"][]; }; }; }; }; "categories_api_v1_categories_data.json_list": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Category"][]; }; }; }; }; categories_api_v1_categories_revision_retrieve: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["MaxRevision"]; }; }; }; }; categories_api_v1_categories_roots_list: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Category"][]; }; }; }; }; collect_translation_keys: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": { [key: string]: unknown; }; }; }; }; }; categories_api_v1_features_list: { parameters: { query?: { /** @description Include soft-deleted items in response. Default: true */ include_deleted?: boolean; /** @description Return objects with revision less than or equal to this value (inclusive). Default: no limit */ max_revision?: number; /** @description Return objects with revision greater than this value (exclusive). Omit for initial sync to get all items. */ min_revision?: number; /** @description Page number. Default: 1 */ page?: number; /** @description Number of items per page. Default: 100, Max: 1000 */ page_size?: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PaginatedFeatureCompactList"]; }; }; }; }; categories_api_v1_features_create: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["FeatureCreateUpdate"]; "application/x-www-form-urlencoded": components["schemas"]["FeatureCreateUpdate"]; "multipart/form-data": components["schemas"]["FeatureCreateUpdate"]; }; }; responses: { 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeatureCreateUpdate"]; }; }; }; }; categories_api_v1_features_retrieve: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this feature. */ id: number; }; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Feature"]; }; }; }; }; categories_api_v1_features_update: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this feature. */ id: number; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["FeatureCreateUpdate"]; "application/x-www-form-urlencoded": components["schemas"]["FeatureCreateUpdate"]; "multipart/form-data": components["schemas"]["FeatureCreateUpdate"]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeatureCreateUpdate"]; }; }; }; }; categories_api_v1_features_destroy: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this feature. */ id: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description No response body */ 204: { headers: { [name: string]: unknown; }; content?: never; }; }; }; categories_api_v1_features_partial_update: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this feature. */ id: number; }; cookie?: never; }; requestBody?: { content: { "application/json": components["schemas"]["PatchedFeatureCreateUpdate"]; "application/x-www-form-urlencoded": components["schemas"]["PatchedFeatureCreateUpdate"]; "multipart/form-data": components["schemas"]["PatchedFeatureCreateUpdate"]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["FeatureCreateUpdate"]; }; }; }; }; categories_api_v1_features_convert_type_create: { parameters: { query?: never; header?: never; path: { /** @description A unique integer value identifying this feature. */ id: number; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["FeatureConvertType"]; "application/x-www-form-urlencoded": components["schemas"]["FeatureConvertType"]; "multipart/form-data": components["schemas"]["FeatureConvertType"]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Feature"]; }; }; }; }; categories_api_v1_features_bulk_add_create: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["FeatureBulk"][]; "application/x-www-form-urlencoded": components["schemas"]["FeatureBulk"][]; "multipart/form-data": components["schemas"]["FeatureBulk"][]; }; }; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["BulkUpdateResponse"]; }; }; 400: { headers: { [name: string]: unknown; }; content: { "application/json": { [key: string]: unknown; }; }; }; }; }; "categories_api_v1_features_data.json_list": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["Feature"][]; }; }; }; }; categories_api_v1_features_revision_retrieve: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["MaxRevision"]; }; }; }; }; categories_api_v1_tree_list: { parameters: { query?: { /** @description Levels to return, 1..4 (default 3). Out-of-range values are clamped, not refused. */ depth?: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["CategoryTreeNode"][]; }; }; }; }; }