From 04730fc0f2f791a4474598be4bfcd79c9ee72877 Mon Sep 17 00:00:00 2001 From: Moritz Vetter Date: Mon, 25 Jul 2022 10:31:09 +0200 Subject: [PATCH] chore: update docs --- docs/api/common.html | 20 ++++ docs/api/user_panel.html | 217 +++++++++++++++++++++++++++------------ docs/index.html | 4 +- docs/types.html | 33 ++++-- 4 files changed, 199 insertions(+), 75 deletions(-) diff --git a/docs/api/common.html b/docs/api/common.html index 3ffca36..2175de2 100644 --- a/docs/api/common.html +++ b/docs/api/common.html @@ -70,6 +70,9 @@

Module push_to_3yourmind.api.common

def get_materials(self) -> t.List[types.ResponseDict]: return self._request("GET", "materials/") + def get_forms(self): + return self._request("GET", "forms/") + def get_tax_types(self) -> t.List[str]: return self._request("GET", "tax-types/") @@ -134,6 +137,9 @@

Args

def get_materials(self) -> t.List[types.ResponseDict]: return self._request("GET", "materials/") + def get_forms(self): + return self._request("GET", "forms/") + def get_tax_types(self) -> t.List[str]: return self._request("GET", "tax-types/") @@ -219,6 +225,19 @@

Methods

return self._request("GET", "materials/") +
+def get_forms(self) +
+
+
+
+ +Expand source code + +
def get_forms(self):
+    return self._request("GET", "forms/")
+
+
def get_tax_types(self) ‑> List[str]
@@ -258,6 +277,7 @@

get_countries
  • get_currencies
  • get_materials
  • +
  • get_forms
  • get_tax_types
  • diff --git a/docs/api/user_panel.html b/docs/api/user_panel.html index 43b41c6..963d593 100644 --- a/docs/api/user_panel.html +++ b/docs/api/user_panel.html @@ -33,6 +33,7 @@

    Module push_to_3yourmind.api.user_panel

    Groups API functionality from the User Panel, such as creating/updating baskets, placing orders, making requests for quotes, ordering quotes etc. """ + import datetime import decimal import typing as t @@ -63,8 +64,8 @@

    Module push_to_3yourmind.api.user_panel

    def get_baskets( self, *, - page: types.OptionalNumber = NoValue, - page_size: types.OptionalNumber = NoValue, + page: types.OptionalInteger = NoValue, + page_size: types.OptionalInteger = NoValue, ) -> t.List[types.ResponseDict]: """ Get all baskets of the current user. Returns paginated list. @@ -100,9 +101,9 @@

    Module push_to_3yourmind.api.user_panel

    *, basket_id: int, currency: str, - shipping_address_id: types.OptionalNumber = types.NoValue, - billing_address_id: types.OptionalNumber = types.NoValue, - shipping_method_id: types.OptionalNumber = types.NoValue, + shipping_address_id: types.OptionalInteger = types.NoValue, + billing_address_id: types.OptionalInteger = types.NoValue, + shipping_method_id: types.OptionalInteger = types.NoValue, voucher_code: types.OptionalString = types.NoValue, ) -> types.ResponseDict: """ @@ -137,7 +138,7 @@

    Module push_to_3yourmind.api.user_panel

    return self._request("DELETE", f"user-panel/baskets/{basket_id}/") def update_basket( - self, *, basket_id: int, title: types.OptionalNumber = NoValue + self, *, basket_id: int, title: t.Union[str, types.NoValueType] = NoValue ) -> types.ResponseDict: json = self._get_parameters(title=title) return self._request("PATCH", f"user-panel/baskets/{basket_id}/", json=json) @@ -156,16 +157,17 @@

    Module push_to_3yourmind.api.user_panel

    *, basket_id: int, line_id: int, - quantity: types.OptionalNumber = types.NoValue, - product_id: types.OptionalNumber = types.NoValue, - post_processing_ids: types.OptionalNumberSequence = (), + quantity: types.OptionalInteger = types.NoValue, + product_id: types.OptionalInteger = types.NoValue, + post_processings: t.Sequence[types.PostProcessingConfig] = (), preferred_due_date: types.OptionalDate = types.NoValue, ) -> types.ResponseDict: - post_processings = [ - {"postProcessingId": post_processing_id} - for post_processing_id in post_processing_ids - ] + if post_processings: + post_processings = [ + {"postProcessingId": pp.post_processing_id, "colorId": pp.color_id} + for pp in post_processings + ] if isinstance(preferred_due_date, datetime.date): preferred_due_date = preferred_due_date.strftime("%Y-%m-%d") json = self._get_parameters( @@ -178,6 +180,24 @@

    Module push_to_3yourmind.api.user_panel

    "PATCH", f"user-panel/baskets/{basket_id}/lines/{line_id}/", json=json ) + def add_part_requirements_to_basket_line( + self, + *, + line_id: int, + form_data: types.FormData, + ): + json = { + "formId": form_data.form_id, + "fields": [ + {"formFieldId": field.form_field_id, "value": field.value} + for field in form_data.fields + ] + } + return self._request( + "POST", f"user-panel/forms/basket-line/{line_id}/", + json=json, + ) + def get_materials( self, *, basket_id: int, line_id: int ) -> t.List[types.ResponseDict]: @@ -228,7 +248,7 @@

    Module push_to_3yourmind.api.user_panel

    cad_file: types.CadFileSpecifier, product_id: int, quantity: int, - post_processing_ids: t.Sequence[int] = (), + post_processings: t.Sequence[types.PostProcessingConfig] = (), preferred_due_date: types.OptionalDate = types.NoValue, ) -> types.ResponseDict: preferences = self._request("GET", "my-profile/preferences/") @@ -246,7 +266,7 @@

    Module push_to_3yourmind.api.user_panel

    line_id=line_id, quantity=quantity, product_id=product_id, - post_processing_ids=post_processing_ids, + post_processings=post_processings, preferred_due_date=preferred_due_date, ) @@ -401,8 +421,8 @@

    Module push_to_3yourmind.api.user_panel

    self, *, supplier_id: int, - quote_id: types.OptionalNumber = types.NoValue, - shipping_address_id: types.OptionalNumber = types.NoValue, + quote_id: types.OptionalInteger = types.NoValue, + shipping_address_id: types.OptionalInteger = types.NoValue, ) -> t.Sequence[types.ResponseDict]: query = self._get_parameters( quoteId=quote_id, shippingAddressId=shipping_address_id @@ -413,18 +433,22 @@

    Module push_to_3yourmind.api.user_panel

    params=query, ) - def create_catalog_item(self, basket_line_id: int): + def create_catalog_item(self, basket_line_id: int) -> types.ResponseDict: return self._request( "POST", "user-panel/catalog/", json={"lineId": basket_line_id}, ) - def upload_catalog_item_attachment(self, catalog_item_id: int, attachment_file: types.AttachmentFileSpecifier): + def upload_catalog_item_attachment( + self, + catalog_item_id: int, + attachment_file: types.AttachmentFileSpecifier, + ) -> types.ResponseDict: attachment_file_contents = utils.extract_file_content(attachment_file) return self._request( "POST", - f"user-panel/catalogue/{catalog_item_id}/attachments/", + f"user-panel/catalog/{catalog_item_id}/attachments/", files={"file": attachment_file_contents}, ) @@ -481,8 +505,8 @@

    Args

    def get_baskets( self, *, - page: types.OptionalNumber = NoValue, - page_size: types.OptionalNumber = NoValue, + page: types.OptionalInteger = NoValue, + page_size: types.OptionalInteger = NoValue, ) -> t.List[types.ResponseDict]: """ Get all baskets of the current user. Returns paginated list. @@ -518,9 +542,9 @@

    Args

    *, basket_id: int, currency: str, - shipping_address_id: types.OptionalNumber = types.NoValue, - billing_address_id: types.OptionalNumber = types.NoValue, - shipping_method_id: types.OptionalNumber = types.NoValue, + shipping_address_id: types.OptionalInteger = types.NoValue, + billing_address_id: types.OptionalInteger = types.NoValue, + shipping_method_id: types.OptionalInteger = types.NoValue, voucher_code: types.OptionalString = types.NoValue, ) -> types.ResponseDict: """ @@ -555,7 +579,7 @@

    Args

    return self._request("DELETE", f"user-panel/baskets/{basket_id}/") def update_basket( - self, *, basket_id: int, title: types.OptionalNumber = NoValue + self, *, basket_id: int, title: t.Union[str, types.NoValueType] = NoValue ) -> types.ResponseDict: json = self._get_parameters(title=title) return self._request("PATCH", f"user-panel/baskets/{basket_id}/", json=json) @@ -574,16 +598,17 @@

    Args

    *, basket_id: int, line_id: int, - quantity: types.OptionalNumber = types.NoValue, - product_id: types.OptionalNumber = types.NoValue, - post_processing_ids: types.OptionalNumberSequence = (), + quantity: types.OptionalInteger = types.NoValue, + product_id: types.OptionalInteger = types.NoValue, + post_processings: t.Sequence[types.PostProcessingConfig] = (), preferred_due_date: types.OptionalDate = types.NoValue, ) -> types.ResponseDict: - post_processings = [ - {"postProcessingId": post_processing_id} - for post_processing_id in post_processing_ids - ] + if post_processings: + post_processings = [ + {"postProcessingId": pp.post_processing_id, "colorId": pp.color_id} + for pp in post_processings + ] if isinstance(preferred_due_date, datetime.date): preferred_due_date = preferred_due_date.strftime("%Y-%m-%d") json = self._get_parameters( @@ -596,6 +621,24 @@

    Args

    "PATCH", f"user-panel/baskets/{basket_id}/lines/{line_id}/", json=json ) + def add_part_requirements_to_basket_line( + self, + *, + line_id: int, + form_data: types.FormData, + ): + json = { + "formId": form_data.form_id, + "fields": [ + {"formFieldId": field.form_field_id, "value": field.value} + for field in form_data.fields + ] + } + return self._request( + "POST", f"user-panel/forms/basket-line/{line_id}/", + json=json, + ) + def get_materials( self, *, basket_id: int, line_id: int ) -> t.List[types.ResponseDict]: @@ -646,7 +689,7 @@

    Args

    cad_file: types.CadFileSpecifier, product_id: int, quantity: int, - post_processing_ids: t.Sequence[int] = (), + post_processings: t.Sequence[types.PostProcessingConfig] = (), preferred_due_date: types.OptionalDate = types.NoValue, ) -> types.ResponseDict: preferences = self._request("GET", "my-profile/preferences/") @@ -664,7 +707,7 @@

    Args

    line_id=line_id, quantity=quantity, product_id=product_id, - post_processing_ids=post_processing_ids, + post_processings=post_processings, preferred_due_date=preferred_due_date, ) @@ -819,8 +862,8 @@

    Args

    self, *, supplier_id: int, - quote_id: types.OptionalNumber = types.NoValue, - shipping_address_id: types.OptionalNumber = types.NoValue, + quote_id: types.OptionalInteger = types.NoValue, + shipping_address_id: types.OptionalInteger = types.NoValue, ) -> t.Sequence[types.ResponseDict]: query = self._get_parameters( quoteId=quote_id, shippingAddressId=shipping_address_id @@ -831,18 +874,22 @@

    Args

    params=query, ) - def create_catalog_item(self, basket_line_id: int): + def create_catalog_item(self, basket_line_id: int) -> types.ResponseDict: return self._request( "POST", "user-panel/catalog/", json={"lineId": basket_line_id}, ) - def upload_catalog_item_attachment(self, catalog_item_id: int, attachment_file: types.AttachmentFileSpecifier): + def upload_catalog_item_attachment( + self, + catalog_item_id: int, + attachment_file: types.AttachmentFileSpecifier, + ) -> types.ResponseDict: attachment_file_contents = utils.extract_file_content(attachment_file) return self._request( "POST", - f"user-panel/catalogue/{catalog_item_id}/attachments/", + f"user-panel/catalog/{catalog_item_id}/attachments/", files={"file": attachment_file_contents}, ) @@ -864,7 +911,7 @@

    Class variables

    Methods

    -def get_baskets(self, *, page: Union[int, float, decimal.Decimal, Type[NoValue]] = push_to_3yourmind.types.NoValue, page_size: Union[int, float, decimal.Decimal, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> List[Dict[str, Any]] +def get_baskets(self, *, page: Union[int, Type[NoValue]] = push_to_3yourmind.types.NoValue, page_size: Union[int, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> List[Dict[str, Any]]

    Get all baskets of the current user. Returns paginated list.

    @@ -891,8 +938,8 @@

    Returns

    def get_baskets(
         self,
         *,
    -    page: types.OptionalNumber = NoValue,
    -    page_size: types.OptionalNumber = NoValue,
    +    page: types.OptionalInteger = NoValue,
    +    page_size: types.OptionalInteger = NoValue,
     ) -> t.List[types.ResponseDict]:
         """
         Get all baskets of the current user. Returns paginated list.
    @@ -941,7 +988,7 @@ 

    Returns

    -def get_basket_price(self, *, basket_id: int, currency: str, shipping_address_id: Union[int, float, decimal.Decimal, Type[NoValue]] = push_to_3yourmind.types.NoValue, billing_address_id: Union[int, float, decimal.Decimal, Type[NoValue]] = push_to_3yourmind.types.NoValue, shipping_method_id: Union[int, float, decimal.Decimal, Type[NoValue]] = push_to_3yourmind.types.NoValue, voucher_code: Union[str, bytes, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> Dict[str, Any] +def get_basket_price(self, *, basket_id: int, currency: str, shipping_address_id: Union[int, Type[NoValue]] = push_to_3yourmind.types.NoValue, billing_address_id: Union[int, Type[NoValue]] = push_to_3yourmind.types.NoValue, shipping_method_id: Union[int, Type[NoValue]] = push_to_3yourmind.types.NoValue, voucher_code: Union[str, bytes, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> Dict[str, Any]

    Calculate basket's price, given additional optional shipping, billing information

    @@ -971,9 +1018,9 @@

    Returns

    *, basket_id: int, currency: str, - shipping_address_id: types.OptionalNumber = types.NoValue, - billing_address_id: types.OptionalNumber = types.NoValue, - shipping_method_id: types.OptionalNumber = types.NoValue, + shipping_address_id: types.OptionalInteger = types.NoValue, + billing_address_id: types.OptionalInteger = types.NoValue, + shipping_method_id: types.OptionalInteger = types.NoValue, voucher_code: types.OptionalString = types.NoValue, ) -> types.ResponseDict: """ @@ -1029,7 +1076,7 @@

    Returns

    -def update_basket(self, *, basket_id: int, title: Union[int, float, decimal.Decimal, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> Dict[str, Any] +def update_basket(self, *, basket_id: int, title: Union[str, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> Dict[str, Any]
    @@ -1038,7 +1085,7 @@

    Returns

    Expand source code
    def update_basket(
    -    self, *, basket_id: int, title: types.OptionalNumber = NoValue
    +    self, *, basket_id: int, title: t.Union[str, types.NoValueType] = NoValue
     ) -> types.ResponseDict:
         json = self._get_parameters(title=title)
         return self._request("PATCH", f"user-panel/baskets/{basket_id}/", json=json)
    @@ -1084,7 +1131,7 @@

    Returns

    -def update_basket_line(self, *, basket_id: int, line_id: int, quantity: Union[int, float, decimal.Decimal, Type[NoValue]] = push_to_3yourmind.types.NoValue, product_id: Union[int, float, decimal.Decimal, Type[NoValue]] = push_to_3yourmind.types.NoValue, post_processing_ids: Sequence[Union[int, float, decimal.Decimal, Type[NoValue]]] = (), preferred_due_date: Union[datetime.date, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> Dict[str, Any] +def update_basket_line(self, *, basket_id: int, line_id: int, quantity: Union[int, Type[NoValue]] = push_to_3yourmind.types.NoValue, product_id: Union[int, Type[NoValue]] = push_to_3yourmind.types.NoValue, post_processings: Sequence[push_to_3yourmind.types.PostProcessingConfig] = (), preferred_due_date: Union[datetime.date, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> Dict[str, Any]
    @@ -1097,16 +1144,17 @@

    Returns

    *, basket_id: int, line_id: int, - quantity: types.OptionalNumber = types.NoValue, - product_id: types.OptionalNumber = types.NoValue, - post_processing_ids: types.OptionalNumberSequence = (), + quantity: types.OptionalInteger = types.NoValue, + product_id: types.OptionalInteger = types.NoValue, + post_processings: t.Sequence[types.PostProcessingConfig] = (), preferred_due_date: types.OptionalDate = types.NoValue, ) -> types.ResponseDict: - post_processings = [ - {"postProcessingId": post_processing_id} - for post_processing_id in post_processing_ids - ] + if post_processings: + post_processings = [ + {"postProcessingId": pp.post_processing_id, "colorId": pp.color_id} + for pp in post_processings + ] if isinstance(preferred_due_date, datetime.date): preferred_due_date = preferred_due_date.strftime("%Y-%m-%d") json = self._get_parameters( @@ -1120,6 +1168,34 @@

    Returns

    )
    +
    +def add_part_requirements_to_basket_line(self, *, line_id: int, form_data: push_to_3yourmind.types.FormData) +
    +
    +
    +
    + +Expand source code + +
    def add_part_requirements_to_basket_line(
    +        self,
    +        *,
    +        line_id: int,
    +        form_data: types.FormData,
    +):
    +    json = {
    +        "formId": form_data.form_id,
    +        "fields": [
    +            {"formFieldId": field.form_field_id, "value": field.value} 
    +            for field in form_data.fields
    +        ]
    +    }
    +    return self._request(
    +        "POST", f"user-panel/forms/basket-line/{line_id}/",
    +        json=json,
    +    )
    +
    +
    def get_materials(self, *, basket_id: int, line_id: int) ‑> List[Dict[str, Any]]
    @@ -1194,7 +1270,7 @@

    Returns

    -def create_line_with_cad_file_and_product(self, *, basket_id: int, cad_file: Union[str, IO], product_id: int, quantity: int, post_processing_ids: Sequence[int] = (), preferred_due_date: Union[datetime.date, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> Dict[str, Any] +def create_line_with_cad_file_and_product(self, *, basket_id: int, cad_file: Union[str, IO], product_id: int, quantity: int, post_processings: Sequence[push_to_3yourmind.types.PostProcessingConfig] = (), preferred_due_date: Union[datetime.date, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> Dict[str, Any]
    @@ -1209,7 +1285,7 @@

    Returns

    cad_file: types.CadFileSpecifier, product_id: int, quantity: int, - post_processing_ids: t.Sequence[int] = (), + post_processings: t.Sequence[types.PostProcessingConfig] = (), preferred_due_date: types.OptionalDate = types.NoValue, ) -> types.ResponseDict: preferences = self._request("GET", "my-profile/preferences/") @@ -1227,7 +1303,7 @@

    Returns

    line_id=line_id, quantity=quantity, product_id=product_id, - post_processing_ids=post_processing_ids, + post_processings=post_processings, preferred_due_date=preferred_due_date, ) @@ -1498,7 +1574,7 @@

    Returns

    -def get_shipping_methods(self, *, supplier_id: int, quote_id: Union[int, float, decimal.Decimal, Type[NoValue]] = push_to_3yourmind.types.NoValue, shipping_address_id: Union[int, float, decimal.Decimal, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> Sequence[Dict[str, Any]] +def get_shipping_methods(self, *, supplier_id: int, quote_id: Union[int, Type[NoValue]] = push_to_3yourmind.types.NoValue, shipping_address_id: Union[int, Type[NoValue]] = push_to_3yourmind.types.NoValue) ‑> Sequence[Dict[str, Any]]
    @@ -1510,8 +1586,8 @@

    Returns

    self, *, supplier_id: int, - quote_id: types.OptionalNumber = types.NoValue, - shipping_address_id: types.OptionalNumber = types.NoValue, + quote_id: types.OptionalInteger = types.NoValue, + shipping_address_id: types.OptionalInteger = types.NoValue, ) -> t.Sequence[types.ResponseDict]: query = self._get_parameters( quoteId=quote_id, shippingAddressId=shipping_address_id @@ -1524,7 +1600,7 @@

    Returns

    -def create_catalog_item(self, basket_line_id: int) +def create_catalog_item(self, basket_line_id: int) ‑> Dict[str, Any]
    @@ -1532,7 +1608,7 @@

    Returns

    Expand source code -
    def create_catalog_item(self, basket_line_id: int):
    +
    def create_catalog_item(self, basket_line_id: int) -> types.ResponseDict:
         return self._request(
             "POST",
             "user-panel/catalog/",
    @@ -1541,7 +1617,7 @@ 

    Returns

    -def upload_catalog_item_attachment(self, catalog_item_id: int, attachment_file: Union[str, IO]) +def upload_catalog_item_attachment(self, catalog_item_id: int, attachment_file: Union[str, IO]) ‑> Dict[str, Any]
    @@ -1549,11 +1625,15 @@

    Returns

    Expand source code -
    def upload_catalog_item_attachment(self, catalog_item_id: int, attachment_file: types.AttachmentFileSpecifier):
    +
    def upload_catalog_item_attachment(
    +        self,
    +        catalog_item_id: int,
    +        attachment_file: types.AttachmentFileSpecifier,
    +) -> types.ResponseDict:
         attachment_file_contents = utils.extract_file_content(attachment_file)
         return self._request(
             "POST",
    -        f"user-panel/catalogue/{catalog_item_id}/attachments/",
    +        f"user-panel/catalog/{catalog_item_id}/attachments/",
             files={"file": attachment_file_contents},
         )
    @@ -1589,6 +1669,7 @@

    get_basket_line
  • create_basket_line
  • update_basket_line
  • +
  • add_part_requirements_to_basket_line
  • get_materials
  • get_products
  • upload_cad_file
  • diff --git a/docs/index.html b/docs/index.html index 231120c..519bde5 100644 --- a/docs/index.html +++ b/docs/index.html @@ -26,7 +26,9 @@

    Package push_to_3yourmind

    Expand source code -
    from .main import PushTo3YourmindAPI
    +
    from push_to_3yourmind import types as td
    +from .exceptions import *
    +from .main import PushTo3YourmindAPI
    diff --git a/docs/types.html b/docs/types.html index 764fdb8..029206e 100644 --- a/docs/types.html +++ b/docs/types.html @@ -31,6 +31,7 @@

    Module push_to_3yourmind.types

    This module contains NoValue class and type aliases for type annotations """ +from dataclasses import dataclass import datetime import decimal import typing as t @@ -60,18 +61,38 @@

    Module push_to_3yourmind.types

    ... it will mean that you want to set user's country, currency and language setting to NULL. """ - +NoValueType = t.Type[NoValue] ResponseDict = t.Dict[str, t.Any] AnyResponse = t.Union[str, ResponseDict, t.List[ResponseDict], t.List[str]] RequestMethod = t.Literal["GET", "PUT", "POST", "DELETE", "PATCH", "HEAD"] Unit = t.Literal["mm", "inch"] AttachmentFileSpecifier = CadFileSpecifier = t.Union[str, t.IO] -OptionalNumber = t.Union[int, float, decimal.Decimal, t.Type[NoValue]] -OptionalNumberSequence = t.Sequence[OptionalNumber] -OptionalString = t.Union[str, bytes, t.Type[NoValue]] -OptionalDate = t.Union[datetime.date, t.Type[NoValue]] -OptionalDateTime = t.Union[datetime.datetime, t.Type[NoValue]]
    +OptionalInteger = t.Union[int, NoValueType] +OptionalIntegerSequence = t.Union[t.Sequence[int], NoValueType] +OptionalNumber = t.Union[int, float, decimal.Decimal, NoValueType] +OptionalNumberSequence = t.Union[t.Sequence[t.Union[int, float, decimal.Decimal]], NoValueType] +OptionalString = t.Union[str, bytes, NoValueType] +OptionalDate = t.Union[datetime.date, NoValueType] +OptionalDateTime = t.Union[datetime.datetime, NoValueType] + + +@dataclass +class FormField: + form_field_id: int + value: t.Union[str, bool, int, float, t.List[int], t.List[str], None] + + +@dataclass +class FormData: + form_id: int + fields: t.Sequence[FormField] + + +@dataclass +class PostProcessingConfig: + post_processing_id: int + color_id: t.Union[int, NoValueType]