Module slack_sdk.models.dialogs
Expand source code
from abc import ABCMeta, abstractmethod
from json import dumps
from typing import List, Optional, Union, Set, Sequence
from slack_sdk.models import extract_json
from slack_sdk.models.attachments import AbstractActionSelector
from slack_sdk.models.basic_objects import EnumValidator, JsonObject, JsonValidator
from slack_sdk.models.blocks import Option, OptionGroup, DynamicSelectElementTypes
TextElementSubtypes = {"email", "number", "tel", "url"}
class DialogTextComponent(JsonObject, metaclass=ABCMeta):
attributes = {
"hint",
"label",
"max_length",
"min_length",
"name",
"optional",
"placeholder",
"subtype",
"type",
"value",
}
name_max_length = 300
label_max_length = 48
placeholder_max_length = 150
hint_max_length = 150
@property
@abstractmethod
def type(self):
pass
@property
@abstractmethod
def max_value_length(self):
pass
def __init__(
self,
*,
name: str,
label: str,
optional: bool = False,
placeholder: Optional[str] = None,
hint: Optional[str] = None,
value: Optional[str] = None,
min_length: int = 0,
max_length: Optional[int] = None,
subtype: Optional[str] = None,
):
self.name = name
self.label = label
self.optional = optional
self.placeholder = placeholder
self.hint = hint
self.value = value
self.min_length = min_length
self.max_length = max_length or self.max_value_length
self.subtype = subtype
@JsonValidator(f"name attribute cannot exceed {name_max_length} characters")
def name_length(self) -> bool:
return len(self.name) < self.name_max_length
@JsonValidator(f"label attribute cannot exceed {label_max_length} characters")
def label_length(self) -> bool:
return len(self.label) < self.label_max_length
@JsonValidator(f"placeholder attribute cannot exceed {placeholder_max_length} characters")
def placeholder_length(self) -> bool:
return self.placeholder is None or len(self.placeholder) < self.placeholder_max_length
@JsonValidator(f"hint attribute cannot exceed {hint_max_length} characters")
def hint_length(self) -> bool:
return self.hint is None or len(self.hint) < self.hint_max_length
@JsonValidator("value attribute exceeded bounds")
def value_length(self) -> bool:
return self.value is None or len(self.value) < self.max_value_length
@JsonValidator("min_length attribute must be greater than or equal to 0")
def min_length_above_zero(self) -> bool:
return self.min_length is None or self.min_length >= 0
@JsonValidator("min_length attribute exceed bounds")
def min_length_length(self) -> bool:
return self.min_length is None or self.min_length <= self.max_value_length
@JsonValidator("min_length attribute must be less than max value attribute")
def min_length_below_max_length(self) -> bool:
return self.min_length is None or self.min_length < self.max_length
@JsonValidator("max_length attribute must be greater than or equal to 0")
def max_length_above_zero(self) -> bool:
return self.max_length is None or self.max_length > 0
@JsonValidator("max_length attribute exceeded bounds")
def max_length_length(self) -> bool:
return self.max_length is None or self.max_length <= self.max_value_length
@EnumValidator("subtype", TextElementSubtypes)
def subtype_valid(self) -> bool:
return self.subtype is None or self.subtype in TextElementSubtypes
class DialogTextField(DialogTextComponent):
"""
Text elements are single-line plain text fields.
https://api.slack.com/dialogs#text_elements
"""
type = "text"
max_value_length = 150
class DialogTextArea(DialogTextComponent):
"""
A textarea is a multi-line plain text editing control. You've likely encountered
these on the world wide web. Use this element if you want a relatively long
answer from users. The element UI provides a remaining character count to the
max_length you have set or the default, 3000.
https://api.slack.com/dialogs#textarea_elements
"""
type = "textarea"
max_value_length = 3000
class AbstractDialogSelector(JsonObject, metaclass=ABCMeta):
DataSourceTypes = DynamicSelectElementTypes.union({"external", "static"})
attributes = {"data_source", "label", "name", "optional", "placeholder", "type"}
name_max_length = 300
label_max_length = 48
placeholder_max_length = 150
@property
@abstractmethod
def data_source(self) -> str:
pass
def __init__(
self,
*,
name: str,
label: str,
optional: bool = False,
value: Optional[Union[Option, str]] = None,
placeholder: Optional[str] = None,
):
self.name = name
self.label = label
self.optional = optional
self.value = value
self.placeholder = placeholder
self.type = "select"
@JsonValidator(f"name attribute cannot exceed {name_max_length} characters")
def name_length(self) -> bool:
return len(self.name) < self.name_max_length
@JsonValidator(f"label attribute cannot exceed {label_max_length} characters")
def label_length(self) -> bool:
return len(self.label) < self.label_max_length
@JsonValidator(f"placeholder attribute cannot exceed {placeholder_max_length} characters")
def placeholder_length(self) -> bool:
return self.placeholder is None or len(self.placeholder) < self.placeholder_max_length
@EnumValidator("data_source", DataSourceTypes)
def data_source_valid(self) -> bool:
return self.data_source in self.DataSourceTypes
def to_dict(self) -> dict: # skipcq: PYL-W0221
json = super().to_dict()
if self.data_source == "external":
if isinstance(self.value, Option):
json["selected_options"] = extract_json([self.value], "dialog")
elif self.value is not None:
json["selected_options"] = Option.from_single_value(self.value)
else:
if isinstance(self.value, Option):
json["value"] = self.value.value
elif self.value is not None:
json["value"] = self.value
return json
class DialogStaticSelector(AbstractDialogSelector):
"""
Use the select element for multiple choice selections allowing users to pick a
single item from a list. True to web roots, this selection is displayed as a
dropdown menu.
https://api.slack.com/dialogs#select_elements
"""
data_source = "static"
options_max_length = 100
def __init__(
self,
*,
name: str,
label: str,
options: Union[Sequence[Option], Sequence[OptionGroup]],
optional: bool = False,
value: Optional[Union[Option, str]] = None,
placeholder: Optional[str] = None,
):
"""
Use the select element for multiple choice selections allowing users to pick
a single item from a list. True to web roots, this selection is displayed as
a dropdown menu.
A select element may contain up to 100 selections, provided as a list of
Option or OptionGroup objects
https://api.slack.com/dialogs#attributes_select_elements
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. No more than 48 characters.
options: A list of up to 100 Option or OptionGroup objects. Object
types cannot be mixed.
optional: Provide true when the form element is not required. By
default, form elements are required.
value: Provide a default selected value.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
"""
super().__init__(
name=name,
label=label,
optional=optional,
value=value,
placeholder=placeholder,
)
self.options = options
@JsonValidator(f"options attribute cannot exceed {options_max_length} items")
def options_length(self) -> bool:
return len(self.options) < self.options_max_length
def to_dict(self) -> dict:
json = super().to_dict()
if isinstance(self.options[0], OptionGroup):
json["option_groups"] = extract_json(self.options, "dialog")
else:
json["options"] = extract_json(self.options, "dialog")
return json
class DialogUserSelector(AbstractDialogSelector):
data_source = "users"
def __init__( # skipcq: PYL-W0235
self,
*,
name: str,
label: str,
optional: bool = False,
value: Optional[str] = None,
placeholder: Optional[str] = None,
):
"""
Now you can easily populate a select menu with a list of users. For example,
when you are creating a bug tracking app, you want to include a field for an
assignee. Slack pre-populates the user list in client-side, so your app
doesn't need access to a related OAuth scope.
https://api.slack.com/dialogs#dynamic_select_elements_users
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. No more than 48 characters.
optional: Provide true when the form element is not required. By
default, form elements are required.
value: Provide a default selected value.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
"""
super().__init__(
name=name,
label=label,
optional=optional,
value=value,
placeholder=placeholder,
)
class DialogChannelSelector(AbstractDialogSelector):
data_source = "channels"
def __init__( # skipcq: PYL-W0235
self,
*,
name: str,
label: str,
optional: bool = False,
value: Optional[str] = None,
placeholder: Optional[str] = None,
):
"""
You can also provide a select menu with a list of channels. Specify your
data_source as channels to limit only to public channels
https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. No more than 48 characters.
optional: Provide true when the form element is not required. By
default, form elements are required.
value: Provide a default selected value.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
"""
super().__init__(
name=name,
label=label,
optional=optional,
value=value,
placeholder=placeholder,
)
class DialogConversationSelector(AbstractDialogSelector):
data_source = "conversations"
def __init__( # skipcq: PYL-W0235
self,
*,
name: str,
label: str,
optional: bool = False,
value: Optional[str] = None,
placeholder: Optional[str] = None,
):
"""
You can also provide a select menu with a list of conversations - including
private channels, direct messages, MPIMs, and whatever else we consider a
conversation-like thing.
https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. No more than 48 characters.
optional: Provide true when the form element is not required. By
default, form elements are required.
value: Provide a default selected value.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
"""
super().__init__(
name=name,
label=label,
optional=optional,
value=value,
placeholder=placeholder,
)
class DialogExternalSelector(AbstractDialogSelector):
data_source = "external"
@property
def attributes(self) -> Set[str]:
return super().attributes.union({"min_query_length"})
def __init__(
self,
*,
name: str,
label: str,
value: Optional[Option] = None,
min_query_length: Optional[int] = None,
optional: Optional[bool] = False,
placeholder: Optional[str] = None,
):
"""
Use the select element for multiple choice selections allowing users to pick
a single item from a list. True to web roots, this selection is displayed as
a dropdown menu.
A list of options can be loaded from an external URL and used in your dialog
menus.
https://api.slack.com/dialogs#dynamic_select_elements_external
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. No more than 48 characters.
min_query_length: Specify the number of characters that must be typed
by a user into a dynamic select menu before dispatching to the app.
optional: Provide true when the form element is not required. By
default, form elements are required.
value: Provide a default selected value. This should be a single
Option or OptionGroup that exactly matches one that will be returned
from your external endpoint.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
"""
super().__init__(
name=name,
label=label,
value=value,
optional=optional,
placeholder=placeholder,
)
self.min_query_length = min_query_length
class DialogBuilder(JsonObject):
attributes = {} # no attributes because to_dict has unique implementation
_callback_id: Optional[str]
_elements: List[Union[DialogTextComponent, AbstractDialogSelector]]
_submit_label: Optional[str]
_notify_on_cancel: bool
_state: Optional[str]
title_max_length = 24
submit_label_max_length = 24
elements_max_length = 10
state_max_length = 3000
def __init__(self):
"""
Create a DialogBuilder to more easily construct the JSON required to submit a
dialog to Slack
"""
self._title = None
self._callback_id = None
self._elements = []
self._submit_label = None
self._notify_on_cancel = False
self._state = None
def title(self, title: str) -> "DialogBuilder":
"""
Specify a title for this dialog
Args:
title: must not exceed 24 characters
"""
self._title = title
return self
def state(self, state: Union[dict, str]) -> "DialogBuilder":
"""
Pass state into this dialog - dictionaries will be automatically formatted to
JSON
Args:
state: Extra state information that you need to pass from this dialog
back to your application on submission
"""
if isinstance(state, dict):
self._state = dumps(state)
else:
self._state = state
return self
def callback_id(self, callback_id: str) -> "DialogBuilder":
"""
Specify a callback ID for this dialog, which your application will then
receive upon dialog submission
Args:
callback_id: a string identifying this particular dialog
"""
self._callback_id = callback_id
return self
def submit_label(self, label: str) -> "DialogBuilder":
"""
The label to use on the 'Submit' button on the dialog. Defaults to 'Submit'
if not specified.
Args:
label: must not exceed 24 characters, and must be a single word (no
spaces)
"""
self._submit_label = label
return self
def notify_on_cancel(self, notify: bool) -> "DialogBuilder":
"""
Whether this dialog should send a request to your application even if the
user cancels their interaction. Defaults to False.
Args:
notify: Set to True to indicate that your application should receive a
request even if the user cancels interaction with the dialog.
"""
self._notify_on_cancel = notify
return self
def text_field(
self,
*,
name: str,
label: str,
optional: bool = False,
placeholder: Optional[str] = None,
hint: Optional[str] = None,
value: Optional[str] = None,
min_length: int = 0,
max_length: int = 150,
subtype: Optional[str] = None,
) -> "DialogBuilder":
"""
Text elements are single-line plain text fields.
https://api.slack.com/dialogs#attributes_text_elements
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. 48 character maximum.
optional: Provide true when the form element is not required. By
default, form elements are required.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
hint: Helpful text provided to assist users in answering a question.
Up to 150 characters.
value: A default value for this field. Up to 150 characters.
min_length: Minimum input length allowed for element. Up to 150
characters. Defaults to 0.
max_length: Maximum input length allowed for element. Up to 150
characters. Defaults to 150.
subtype: A subtype for this text input. Accepts email, number, tel,
or url. In some form factors, optimized input is provided for this
subtype.
"""
self._elements.append(
DialogTextField(
name=name,
label=label,
optional=optional,
placeholder=placeholder,
hint=hint,
value=value,
min_length=min_length,
max_length=max_length,
subtype=subtype,
)
)
return self
def text_area(
self,
*,
name: str,
label: str,
optional: bool = False,
placeholder: Optional[str] = None,
hint: Optional[str] = None,
value: Optional[str] = None,
min_length: int = 0,
max_length: int = 3000,
subtype: Optional[str] = None,
) -> "DialogBuilder":
"""
A textarea is a multi-line plain text editing control. You've likely
encountered these on the world wide web. Use this element if you want a
relatively long answer from users. The element UI provides a remaining
character count to the max_length you have set or the default,
3000.
https://api.slack.com/dialogs#attributes_textarea_elements
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. 48 character maximum.
optional: Provide true when the form element is not required. By
default, form elements are required.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
hint: Helpful text provided to assist users in answering a question.
Up to 150 characters.
value: A default value for this field. Up to 3000 characters.
min_length: Minimum input length allowed for element. 1-3000
characters. Defaults to 0.
max_length: Maximum input length allowed for element. 0-3000
characters. Defaults to 3000.
subtype: A subtype for this text input. Accepts email, number, tel,
or url. In some form factors, optimized input is provided for this
subtype.
"""
self._elements.append(
DialogTextArea(
name=name,
label=label,
optional=optional,
placeholder=placeholder,
hint=hint,
value=value,
min_length=min_length,
max_length=max_length,
subtype=subtype,
)
)
return self
def static_selector(
self,
*,
name: str,
label: str,
options: Union[Sequence[Option], Sequence[OptionGroup]],
optional: bool = False,
value: Optional[str] = None,
placeholder: Optional[str] = None,
) -> "DialogBuilder":
"""
Use the select element for multiple choice selections allowing users to pick
a single item from a list. True to web roots, this selection is displayed as
a dropdown menu.
A select element may contain up to 100 selections, provided as a list of
Option or OptionGroup objects
https://api.slack.com/dialogs#attributes_select_elements
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. No more than 48 characters.
options: A list of up to 100 Option or OptionGroup objects. Object
types cannot be mixed.
optional: Provide true when the form element is not required. By
default, form elements are required.
value: Provide a default selected value.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
"""
self._elements.append(
DialogStaticSelector(
name=name,
label=label,
options=options,
optional=optional,
value=value,
placeholder=placeholder,
)
)
return self
def external_selector(
self,
*,
name: str,
label: str,
optional: bool = False,
value: Optional[Option] = None,
placeholder: Optional[str] = None,
min_query_length: Optional[int] = None,
) -> "DialogBuilder":
"""
Use the select element for multiple choice selections allowing users to pick
a single item from a list. True to web roots, this selection is displayed as
a dropdown menu.
A list of options can be loaded from an external URL and used in your dialog
menus.
https://api.slack.com/dialogs#dynamic_select_elements_external
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. No more than 48 characters.
min_query_length: Specify the number of characters that must be
typed by a user into a dynamic select menu before dispatching to your
application.
optional: Provide true when the form element is not required. By
default, form elements are required.
value: Provide a default selected value. This should be a single
Option or OptionGroup that exactly matches one that will be returned
from your external endpoint.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
"""
self._elements.append(
DialogExternalSelector(
name=name,
label=label,
optional=optional,
value=value,
placeholder=placeholder,
min_query_length=min_query_length,
)
)
return self
def user_selector(
self,
*,
name: str,
label: str,
optional: bool = False,
value: Optional[str] = None,
placeholder: Optional[str] = None,
) -> "DialogBuilder":
"""
Now you can easily populate a select menu with a list of users. For example,
when you are creating a bug tracking app, you want to include a field for an
assignee. Slack pre-populates the user list in client-side, so your app
doesn't need access to a related OAuth scope.
https://api.slack.com/dialogs#dynamic_select_elements_users
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. No more than 48 characters.
optional: Provide true when the form element is not required. By
default, form elements are required.
value: Provide a default selected value.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
"""
self._elements.append(
DialogUserSelector(
name=name,
label=label,
optional=optional,
value=value,
placeholder=placeholder,
)
)
return self
def channel_selector(
self,
*,
name: str,
label: str,
optional: bool = False,
value: Optional[str] = None,
placeholder: Optional[str] = None,
) -> "DialogBuilder":
"""
You can also provide a select menu with a list of channels. Specify your
data_source as channels to limit only to public channels
https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. No more than 48 characters.
optional: Provide true when the form element is not required. By
default, form elements are required.
value: Provide a default selected value.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
"""
self._elements.append(
DialogChannelSelector(
name=name,
label=label,
optional=optional,
value=value,
placeholder=placeholder,
)
)
return self
def conversation_selector(
self,
*,
name: str,
label: str,
optional: bool = False,
value: Optional[str] = None,
placeholder: Optional[str] = None,
) -> "DialogBuilder":
"""
You can also provide a select menu with a list of conversations - including
private channels, direct messages, MPIMs, and whatever else we consider a
conversation-like thing.
https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations
Args:
name: Name of form element. Required. No more than 300 characters.
label: Label displayed to user. Required. No more than 48 characters.
optional: Provide true when the form element is not required. By
default, form elements are required.
value: Provide a default selected value.
placeholder: A string displayed as needed to help guide users in
completing the element. 150 character maximum.
"""
self._elements.append(
DialogConversationSelector(
name=name,
label=label,
optional=optional,
value=value,
placeholder=placeholder,
)
)
return self
@JsonValidator("title attribute is required")
def title_present(self) -> bool:
return self._title is not None
@JsonValidator(f"title attribute cannot exceed {title_max_length} characters")
def title_length(self) -> bool:
return self._title is not None and len(self._title) <= self.title_max_length
@JsonValidator("callback_id attribute is required")
def callback_id_present(self) -> bool:
return self._callback_id is not None
@JsonValidator(f"dialogs must contain between 1 and {elements_max_length} elements")
def elements_length(self) -> bool:
return 0 < len(self._elements) <= self.elements_max_length
@JsonValidator(f"submit_label cannot exceed {submit_label_max_length} characters")
def submit_label_length(self) -> bool:
return self._submit_label is None or len(self._submit_label) <= self.submit_label_max_length
@JsonValidator("submit_label can only be one word")
def submit_label_valid(self) -> bool:
return self._submit_label is None or " " not in self._submit_label
@JsonValidator(f"state cannot exceed {state_max_length} characters")
def state_length(self) -> bool:
return not self._state or len(self._state) <= self.state_max_length
def to_dict(self) -> dict: # skipcq: PYL-W0221
self.validate_json()
json = {
"title": self._title,
"callback_id": self._callback_id,
"elements": extract_json(self._elements),
"notify_on_cancel": self._notify_on_cancel,
}
if self._submit_label is not None:
json["submit_label"] = self._submit_label
if self._state is not None:
json["state"] = self._state
return json
class ActionStaticSelector(AbstractActionSelector):
"""
Use the select element for multiple choice selections allowing users to pick a
single item from a list. True to web roots, this selection is displayed as a
dropdown menu.
https://api.slack.com/dialogs#select_elements
"""
data_source = "static"
options_max_length = 100
def __init__(
self,
*,
name: str,
text: str,
options: Sequence[Union[Option, OptionGroup]],
selected_option: Optional[Option] = None,
):
"""
Help users make clear, concise decisions by providing a menu of options
within messages.
https://api.slack.com/docs/message-menus
Args:
name: Name this specific action. The name will be returned to your
Action URL along with the message's callback_id when this action is
invoked. Use it to identify this particular response path.
text: The user-facing label for the message button or menu
representing this action. Cannot contain markup.
options: A list of no mre than 100 Option or OptionGroup objects
selected_option: An Option object to pre-select as the default
value.
"""
super().__init__(name=name, text=text, selected_option=selected_option)
self.options = options
@JsonValidator(f"options attribute cannot exceed {options_max_length} items")
def options_length(self) -> bool:
return len(self.options) < self.options_max_length
def to_dict(self) -> dict:
json = super().to_dict()
if isinstance(self.options[0], OptionGroup):
json["option_groups"] = extract_json(self.options, "action")
else:
json["options"] = extract_json(self.options, "action")
return json
__all__ = [
"TextElementSubtypes",
"AbstractDialogSelector",
"DialogChannelSelector",
"DialogConversationSelector",
"DialogExternalSelector",
"DialogStaticSelector",
"DialogTextArea",
"DialogTextComponent",
"DialogTextField",
"DialogUserSelector",
"TextElementSubtypes",
"DialogBuilder",
]
Classes
class AbstractDialogSelector (*, name: str, label: str, optional: bool = False, value: Union[Option, str, ForwardRef(None)] = None, placeholder: Optional[str] = None)
-
The base class for JSON serializable class objects
Expand source code
class AbstractDialogSelector(JsonObject, metaclass=ABCMeta): DataSourceTypes = DynamicSelectElementTypes.union({"external", "static"}) attributes = {"data_source", "label", "name", "optional", "placeholder", "type"} name_max_length = 300 label_max_length = 48 placeholder_max_length = 150 @property @abstractmethod def data_source(self) -> str: pass def __init__( self, *, name: str, label: str, optional: bool = False, value: Optional[Union[Option, str]] = None, placeholder: Optional[str] = None, ): self.name = name self.label = label self.optional = optional self.value = value self.placeholder = placeholder self.type = "select" @JsonValidator(f"name attribute cannot exceed {name_max_length} characters") def name_length(self) -> bool: return len(self.name) < self.name_max_length @JsonValidator(f"label attribute cannot exceed {label_max_length} characters") def label_length(self) -> bool: return len(self.label) < self.label_max_length @JsonValidator(f"placeholder attribute cannot exceed {placeholder_max_length} characters") def placeholder_length(self) -> bool: return self.placeholder is None or len(self.placeholder) < self.placeholder_max_length @EnumValidator("data_source", DataSourceTypes) def data_source_valid(self) -> bool: return self.data_source in self.DataSourceTypes def to_dict(self) -> dict: # skipcq: PYL-W0221 json = super().to_dict() if self.data_source == "external": if isinstance(self.value, Option): json["selected_options"] = extract_json([self.value], "dialog") elif self.value is not None: json["selected_options"] = Option.from_single_value(self.value) else: if isinstance(self.value, Option): json["value"] = self.value.value elif self.value is not None: json["value"] = self.value return json
Ancestors
Subclasses
- DialogChannelSelector
- DialogConversationSelector
- DialogExternalSelector
- DialogStaticSelector
- DialogUserSelector
Class variables
var DataSourceTypes
var label_max_length
var name_max_length
var placeholder_max_length
Instance variables
var data_source : str
-
Expand source code
@property @abstractmethod def data_source(self) -> str: pass
Methods
def data_source_valid(self) ‑> bool
-
Expand source code
@EnumValidator("data_source", DataSourceTypes) def data_source_valid(self) -> bool: return self.data_source in self.DataSourceTypes
def label_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"label attribute cannot exceed {label_max_length} characters") def label_length(self) -> bool: return len(self.label) < self.label_max_length
def name_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"name attribute cannot exceed {name_max_length} characters") def name_length(self) -> bool: return len(self.name) < self.name_max_length
def placeholder_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"placeholder attribute cannot exceed {placeholder_max_length} characters") def placeholder_length(self) -> bool: return self.placeholder is None or len(self.placeholder) < self.placeholder_max_length
Inherited members
class DialogBuilder
-
The base class for JSON serializable class objects
Create a DialogBuilder to more easily construct the JSON required to submit a dialog to Slack
Expand source code
class DialogBuilder(JsonObject): attributes = {} # no attributes because to_dict has unique implementation _callback_id: Optional[str] _elements: List[Union[DialogTextComponent, AbstractDialogSelector]] _submit_label: Optional[str] _notify_on_cancel: bool _state: Optional[str] title_max_length = 24 submit_label_max_length = 24 elements_max_length = 10 state_max_length = 3000 def __init__(self): """ Create a DialogBuilder to more easily construct the JSON required to submit a dialog to Slack """ self._title = None self._callback_id = None self._elements = [] self._submit_label = None self._notify_on_cancel = False self._state = None def title(self, title: str) -> "DialogBuilder": """ Specify a title for this dialog Args: title: must not exceed 24 characters """ self._title = title return self def state(self, state: Union[dict, str]) -> "DialogBuilder": """ Pass state into this dialog - dictionaries will be automatically formatted to JSON Args: state: Extra state information that you need to pass from this dialog back to your application on submission """ if isinstance(state, dict): self._state = dumps(state) else: self._state = state return self def callback_id(self, callback_id: str) -> "DialogBuilder": """ Specify a callback ID for this dialog, which your application will then receive upon dialog submission Args: callback_id: a string identifying this particular dialog """ self._callback_id = callback_id return self def submit_label(self, label: str) -> "DialogBuilder": """ The label to use on the 'Submit' button on the dialog. Defaults to 'Submit' if not specified. Args: label: must not exceed 24 characters, and must be a single word (no spaces) """ self._submit_label = label return self def notify_on_cancel(self, notify: bool) -> "DialogBuilder": """ Whether this dialog should send a request to your application even if the user cancels their interaction. Defaults to False. Args: notify: Set to True to indicate that your application should receive a request even if the user cancels interaction with the dialog. """ self._notify_on_cancel = notify return self def text_field( self, *, name: str, label: str, optional: bool = False, placeholder: Optional[str] = None, hint: Optional[str] = None, value: Optional[str] = None, min_length: int = 0, max_length: int = 150, subtype: Optional[str] = None, ) -> "DialogBuilder": """ Text elements are single-line plain text fields. https://api.slack.com/dialogs#attributes_text_elements Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. 48 character maximum. optional: Provide true when the form element is not required. By default, form elements are required. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. hint: Helpful text provided to assist users in answering a question. Up to 150 characters. value: A default value for this field. Up to 150 characters. min_length: Minimum input length allowed for element. Up to 150 characters. Defaults to 0. max_length: Maximum input length allowed for element. Up to 150 characters. Defaults to 150. subtype: A subtype for this text input. Accepts email, number, tel, or url. In some form factors, optimized input is provided for this subtype. """ self._elements.append( DialogTextField( name=name, label=label, optional=optional, placeholder=placeholder, hint=hint, value=value, min_length=min_length, max_length=max_length, subtype=subtype, ) ) return self def text_area( self, *, name: str, label: str, optional: bool = False, placeholder: Optional[str] = None, hint: Optional[str] = None, value: Optional[str] = None, min_length: int = 0, max_length: int = 3000, subtype: Optional[str] = None, ) -> "DialogBuilder": """ A textarea is a multi-line plain text editing control. You've likely encountered these on the world wide web. Use this element if you want a relatively long answer from users. The element UI provides a remaining character count to the max_length you have set or the default, 3000. https://api.slack.com/dialogs#attributes_textarea_elements Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. 48 character maximum. optional: Provide true when the form element is not required. By default, form elements are required. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. hint: Helpful text provided to assist users in answering a question. Up to 150 characters. value: A default value for this field. Up to 3000 characters. min_length: Minimum input length allowed for element. 1-3000 characters. Defaults to 0. max_length: Maximum input length allowed for element. 0-3000 characters. Defaults to 3000. subtype: A subtype for this text input. Accepts email, number, tel, or url. In some form factors, optimized input is provided for this subtype. """ self._elements.append( DialogTextArea( name=name, label=label, optional=optional, placeholder=placeholder, hint=hint, value=value, min_length=min_length, max_length=max_length, subtype=subtype, ) ) return self def static_selector( self, *, name: str, label: str, options: Union[Sequence[Option], Sequence[OptionGroup]], optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None, ) -> "DialogBuilder": """ Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu. A select element may contain up to 100 selections, provided as a list of Option or OptionGroup objects https://api.slack.com/dialogs#attributes_select_elements Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. options: A list of up to 100 Option or OptionGroup objects. Object types cannot be mixed. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ self._elements.append( DialogStaticSelector( name=name, label=label, options=options, optional=optional, value=value, placeholder=placeholder, ) ) return self def external_selector( self, *, name: str, label: str, optional: bool = False, value: Optional[Option] = None, placeholder: Optional[str] = None, min_query_length: Optional[int] = None, ) -> "DialogBuilder": """ Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu. A list of options can be loaded from an external URL and used in your dialog menus. https://api.slack.com/dialogs#dynamic_select_elements_external Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. min_query_length: Specify the number of characters that must be typed by a user into a dynamic select menu before dispatching to your application. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. This should be a single Option or OptionGroup that exactly matches one that will be returned from your external endpoint. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ self._elements.append( DialogExternalSelector( name=name, label=label, optional=optional, value=value, placeholder=placeholder, min_query_length=min_query_length, ) ) return self def user_selector( self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None, ) -> "DialogBuilder": """ Now you can easily populate a select menu with a list of users. For example, when you are creating a bug tracking app, you want to include a field for an assignee. Slack pre-populates the user list in client-side, so your app doesn't need access to a related OAuth scope. https://api.slack.com/dialogs#dynamic_select_elements_users Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ self._elements.append( DialogUserSelector( name=name, label=label, optional=optional, value=value, placeholder=placeholder, ) ) return self def channel_selector( self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None, ) -> "DialogBuilder": """ You can also provide a select menu with a list of channels. Specify your data_source as channels to limit only to public channels https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ self._elements.append( DialogChannelSelector( name=name, label=label, optional=optional, value=value, placeholder=placeholder, ) ) return self def conversation_selector( self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None, ) -> "DialogBuilder": """ You can also provide a select menu with a list of conversations - including private channels, direct messages, MPIMs, and whatever else we consider a conversation-like thing. https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ self._elements.append( DialogConversationSelector( name=name, label=label, optional=optional, value=value, placeholder=placeholder, ) ) return self @JsonValidator("title attribute is required") def title_present(self) -> bool: return self._title is not None @JsonValidator(f"title attribute cannot exceed {title_max_length} characters") def title_length(self) -> bool: return self._title is not None and len(self._title) <= self.title_max_length @JsonValidator("callback_id attribute is required") def callback_id_present(self) -> bool: return self._callback_id is not None @JsonValidator(f"dialogs must contain between 1 and {elements_max_length} elements") def elements_length(self) -> bool: return 0 < len(self._elements) <= self.elements_max_length @JsonValidator(f"submit_label cannot exceed {submit_label_max_length} characters") def submit_label_length(self) -> bool: return self._submit_label is None or len(self._submit_label) <= self.submit_label_max_length @JsonValidator("submit_label can only be one word") def submit_label_valid(self) -> bool: return self._submit_label is None or " " not in self._submit_label @JsonValidator(f"state cannot exceed {state_max_length} characters") def state_length(self) -> bool: return not self._state or len(self._state) <= self.state_max_length def to_dict(self) -> dict: # skipcq: PYL-W0221 self.validate_json() json = { "title": self._title, "callback_id": self._callback_id, "elements": extract_json(self._elements), "notify_on_cancel": self._notify_on_cancel, } if self._submit_label is not None: json["submit_label"] = self._submit_label if self._state is not None: json["state"] = self._state return json
Ancestors
Class variables
var elements_max_length
var state_max_length
var submit_label_max_length
var title_max_length
Methods
def callback_id(self, callback_id: str) ‑> DialogBuilder
-
Specify a callback ID for this dialog, which your application will then receive upon dialog submission
Args
callback_id
- a string identifying this particular dialog
Expand source code
def callback_id(self, callback_id: str) -> "DialogBuilder": """ Specify a callback ID for this dialog, which your application will then receive upon dialog submission Args: callback_id: a string identifying this particular dialog """ self._callback_id = callback_id return self
def callback_id_present(self) ‑> bool
-
Expand source code
@JsonValidator("callback_id attribute is required") def callback_id_present(self) -> bool: return self._callback_id is not None
def channel_selector(self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None) ‑> DialogBuilder
-
You can also provide a select menu with a list of channels. Specify your data_source as channels to limit only to public channels
https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. No more than 48 characters.
optional
- Provide true when the form element is not required. By default, form elements are required.
value
- Provide a default selected value.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
Expand source code
def channel_selector( self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None, ) -> "DialogBuilder": """ You can also provide a select menu with a list of channels. Specify your data_source as channels to limit only to public channels https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ self._elements.append( DialogChannelSelector( name=name, label=label, optional=optional, value=value, placeholder=placeholder, ) ) return self
def conversation_selector(self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None) ‑> DialogBuilder
-
You can also provide a select menu with a list of conversations - including private channels, direct messages, MPIMs, and whatever else we consider a conversation-like thing.
https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. No more than 48 characters.
optional
- Provide true when the form element is not required. By default, form elements are required.
value
- Provide a default selected value.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
Expand source code
def conversation_selector( self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None, ) -> "DialogBuilder": """ You can also provide a select menu with a list of conversations - including private channels, direct messages, MPIMs, and whatever else we consider a conversation-like thing. https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ self._elements.append( DialogConversationSelector( name=name, label=label, optional=optional, value=value, placeholder=placeholder, ) ) return self
def elements_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"dialogs must contain between 1 and {elements_max_length} elements") def elements_length(self) -> bool: return 0 < len(self._elements) <= self.elements_max_length
def external_selector(self, *, name: str, label: str, optional: bool = False, value: Optional[Option] = None, placeholder: Optional[str] = None, min_query_length: Optional[int] = None) ‑> DialogBuilder
-
Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu.
A list of options can be loaded from an external URL and used in your dialog menus.
https://api.slack.com/dialogs#dynamic_select_elements_external
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. No more than 48 characters.
min_query_length
- Specify the number of characters that must be typed by a user into a dynamic select menu before dispatching to your application.
optional
- Provide true when the form element is not required. By default, form elements are required.
value
- Provide a default selected value. This should be a single Option or OptionGroup that exactly matches one that will be returned from your external endpoint.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
Expand source code
def external_selector( self, *, name: str, label: str, optional: bool = False, value: Optional[Option] = None, placeholder: Optional[str] = None, min_query_length: Optional[int] = None, ) -> "DialogBuilder": """ Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu. A list of options can be loaded from an external URL and used in your dialog menus. https://api.slack.com/dialogs#dynamic_select_elements_external Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. min_query_length: Specify the number of characters that must be typed by a user into a dynamic select menu before dispatching to your application. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. This should be a single Option or OptionGroup that exactly matches one that will be returned from your external endpoint. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ self._elements.append( DialogExternalSelector( name=name, label=label, optional=optional, value=value, placeholder=placeholder, min_query_length=min_query_length, ) ) return self
def notify_on_cancel(self, notify: bool) ‑> DialogBuilder
-
Whether this dialog should send a request to your application even if the user cancels their interaction. Defaults to False.
Args
notify
- Set to True to indicate that your application should receive a request even if the user cancels interaction with the dialog.
Expand source code
def notify_on_cancel(self, notify: bool) -> "DialogBuilder": """ Whether this dialog should send a request to your application even if the user cancels their interaction. Defaults to False. Args: notify: Set to True to indicate that your application should receive a request even if the user cancels interaction with the dialog. """ self._notify_on_cancel = notify return self
def state(self, state: Union[dict, str]) ‑> DialogBuilder
-
Pass state into this dialog - dictionaries will be automatically formatted to JSON
Args
state
- Extra state information that you need to pass from this dialog back to your application on submission
Expand source code
def state(self, state: Union[dict, str]) -> "DialogBuilder": """ Pass state into this dialog - dictionaries will be automatically formatted to JSON Args: state: Extra state information that you need to pass from this dialog back to your application on submission """ if isinstance(state, dict): self._state = dumps(state) else: self._state = state return self
def state_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"state cannot exceed {state_max_length} characters") def state_length(self) -> bool: return not self._state or len(self._state) <= self.state_max_length
def static_selector(self, *, name: str, label: str, options: Union[Sequence[Option], Sequence[OptionGroup]], optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None) ‑> DialogBuilder
-
Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu.
A select element may contain up to 100 selections, provided as a list of Option or OptionGroup objects
https://api.slack.com/dialogs#attributes_select_elements
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. No more than 48 characters.
options
- A list of up to 100 Option or OptionGroup objects. Object types cannot be mixed.
optional
- Provide true when the form element is not required. By default, form elements are required.
value
- Provide a default selected value.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
Expand source code
def static_selector( self, *, name: str, label: str, options: Union[Sequence[Option], Sequence[OptionGroup]], optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None, ) -> "DialogBuilder": """ Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu. A select element may contain up to 100 selections, provided as a list of Option or OptionGroup objects https://api.slack.com/dialogs#attributes_select_elements Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. options: A list of up to 100 Option or OptionGroup objects. Object types cannot be mixed. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ self._elements.append( DialogStaticSelector( name=name, label=label, options=options, optional=optional, value=value, placeholder=placeholder, ) ) return self
def submit_label(self, label: str) ‑> DialogBuilder
-
The label to use on the 'Submit' button on the dialog. Defaults to 'Submit' if not specified.
Args
label
- must not exceed 24 characters, and must be a single word (no spaces)
Expand source code
def submit_label(self, label: str) -> "DialogBuilder": """ The label to use on the 'Submit' button on the dialog. Defaults to 'Submit' if not specified. Args: label: must not exceed 24 characters, and must be a single word (no spaces) """ self._submit_label = label return self
def submit_label_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"submit_label cannot exceed {submit_label_max_length} characters") def submit_label_length(self) -> bool: return self._submit_label is None or len(self._submit_label) <= self.submit_label_max_length
def submit_label_valid(self) ‑> bool
-
Expand source code
@JsonValidator("submit_label can only be one word") def submit_label_valid(self) -> bool: return self._submit_label is None or " " not in self._submit_label
def text_area(self, *, name: str, label: str, optional: bool = False, placeholder: Optional[str] = None, hint: Optional[str] = None, value: Optional[str] = None, min_length: int = 0, max_length: int = 3000, subtype: Optional[str] = None) ‑> DialogBuilder
-
A textarea is a multi-line plain text editing control. You've likely encountered these on the world wide web. Use this element if you want a relatively long answer from users. The element UI provides a remaining character count to the max_length you have set or the default, 3000.
https://api.slack.com/dialogs#attributes_textarea_elements
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. 48 character maximum.
optional
- Provide true when the form element is not required. By default, form elements are required.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
hint
- Helpful text provided to assist users in answering a question. Up to 150 characters.
value
- A default value for this field. Up to 3000 characters.
min_length
- Minimum input length allowed for element. 1-3000 characters. Defaults to 0.
max_length
- Maximum input length allowed for element. 0-3000 characters. Defaults to 3000.
subtype
- A subtype for this text input. Accepts email, number, tel, or url. In some form factors, optimized input is provided for this subtype.
Expand source code
def text_area( self, *, name: str, label: str, optional: bool = False, placeholder: Optional[str] = None, hint: Optional[str] = None, value: Optional[str] = None, min_length: int = 0, max_length: int = 3000, subtype: Optional[str] = None, ) -> "DialogBuilder": """ A textarea is a multi-line plain text editing control. You've likely encountered these on the world wide web. Use this element if you want a relatively long answer from users. The element UI provides a remaining character count to the max_length you have set or the default, 3000. https://api.slack.com/dialogs#attributes_textarea_elements Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. 48 character maximum. optional: Provide true when the form element is not required. By default, form elements are required. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. hint: Helpful text provided to assist users in answering a question. Up to 150 characters. value: A default value for this field. Up to 3000 characters. min_length: Minimum input length allowed for element. 1-3000 characters. Defaults to 0. max_length: Maximum input length allowed for element. 0-3000 characters. Defaults to 3000. subtype: A subtype for this text input. Accepts email, number, tel, or url. In some form factors, optimized input is provided for this subtype. """ self._elements.append( DialogTextArea( name=name, label=label, optional=optional, placeholder=placeholder, hint=hint, value=value, min_length=min_length, max_length=max_length, subtype=subtype, ) ) return self
def text_field(self, *, name: str, label: str, optional: bool = False, placeholder: Optional[str] = None, hint: Optional[str] = None, value: Optional[str] = None, min_length: int = 0, max_length: int = 150, subtype: Optional[str] = None) ‑> DialogBuilder
-
Text elements are single-line plain text fields.
https://api.slack.com/dialogs#attributes_text_elements
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. 48 character maximum.
optional
- Provide true when the form element is not required. By default, form elements are required.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
hint
- Helpful text provided to assist users in answering a question. Up to 150 characters.
value
- A default value for this field. Up to 150 characters.
min_length
- Minimum input length allowed for element. Up to 150 characters. Defaults to 0.
max_length
- Maximum input length allowed for element. Up to 150 characters. Defaults to 150.
subtype
- A subtype for this text input. Accepts email, number, tel, or url. In some form factors, optimized input is provided for this subtype.
Expand source code
def text_field( self, *, name: str, label: str, optional: bool = False, placeholder: Optional[str] = None, hint: Optional[str] = None, value: Optional[str] = None, min_length: int = 0, max_length: int = 150, subtype: Optional[str] = None, ) -> "DialogBuilder": """ Text elements are single-line plain text fields. https://api.slack.com/dialogs#attributes_text_elements Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. 48 character maximum. optional: Provide true when the form element is not required. By default, form elements are required. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. hint: Helpful text provided to assist users in answering a question. Up to 150 characters. value: A default value for this field. Up to 150 characters. min_length: Minimum input length allowed for element. Up to 150 characters. Defaults to 0. max_length: Maximum input length allowed for element. Up to 150 characters. Defaults to 150. subtype: A subtype for this text input. Accepts email, number, tel, or url. In some form factors, optimized input is provided for this subtype. """ self._elements.append( DialogTextField( name=name, label=label, optional=optional, placeholder=placeholder, hint=hint, value=value, min_length=min_length, max_length=max_length, subtype=subtype, ) ) return self
def title(self, title: str) ‑> DialogBuilder
-
Specify a title for this dialog
Args
title
- must not exceed 24 characters
Expand source code
def title(self, title: str) -> "DialogBuilder": """ Specify a title for this dialog Args: title: must not exceed 24 characters """ self._title = title return self
def title_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"title attribute cannot exceed {title_max_length} characters") def title_length(self) -> bool: return self._title is not None and len(self._title) <= self.title_max_length
def title_present(self) ‑> bool
-
Expand source code
@JsonValidator("title attribute is required") def title_present(self) -> bool: return self._title is not None
def user_selector(self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None) ‑> DialogBuilder
-
Now you can easily populate a select menu with a list of users. For example, when you are creating a bug tracking app, you want to include a field for an assignee. Slack pre-populates the user list in client-side, so your app doesn't need access to a related OAuth scope.
https://api.slack.com/dialogs#dynamic_select_elements_users
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. No more than 48 characters.
optional
- Provide true when the form element is not required. By default, form elements are required.
value
- Provide a default selected value.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
Expand source code
def user_selector( self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None, ) -> "DialogBuilder": """ Now you can easily populate a select menu with a list of users. For example, when you are creating a bug tracking app, you want to include a field for an assignee. Slack pre-populates the user list in client-side, so your app doesn't need access to a related OAuth scope. https://api.slack.com/dialogs#dynamic_select_elements_users Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ self._elements.append( DialogUserSelector( name=name, label=label, optional=optional, value=value, placeholder=placeholder, ) ) return self
Inherited members
class DialogChannelSelector (*, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None)
-
The base class for JSON serializable class objects
You can also provide a select menu with a list of channels. Specify your data_source as channels to limit only to public channels
https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. No more than 48 characters.
optional
- Provide true when the form element is not required. By default, form elements are required.
value
- Provide a default selected value.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
Expand source code
class DialogChannelSelector(AbstractDialogSelector): data_source = "channels" def __init__( # skipcq: PYL-W0235 self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None, ): """ You can also provide a select menu with a list of channels. Specify your data_source as channels to limit only to public channels https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ super().__init__( name=name, label=label, optional=optional, value=value, placeholder=placeholder, )
Ancestors
Class variables
var data_source
Inherited members
class DialogConversationSelector (*, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None)
-
The base class for JSON serializable class objects
You can also provide a select menu with a list of conversations - including private channels, direct messages, MPIMs, and whatever else we consider a conversation-like thing.
https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. No more than 48 characters.
optional
- Provide true when the form element is not required. By default, form elements are required.
value
- Provide a default selected value.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
Expand source code
class DialogConversationSelector(AbstractDialogSelector): data_source = "conversations" def __init__( # skipcq: PYL-W0235 self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None, ): """ You can also provide a select menu with a list of conversations - including private channels, direct messages, MPIMs, and whatever else we consider a conversation-like thing. https://api.slack.com/dialogs#dynamic_select_elements_channels_conversations Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ super().__init__( name=name, label=label, optional=optional, value=value, placeholder=placeholder, )
Ancestors
Class variables
var data_source
Inherited members
class DialogExternalSelector (*, name: str, label: str, value: Optional[Option] = None, min_query_length: Optional[int] = None, optional: Optional[bool] = False, placeholder: Optional[str] = None)
-
The base class for JSON serializable class objects
Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu.
A list of options can be loaded from an external URL and used in your dialog menus.
https://api.slack.com/dialogs#dynamic_select_elements_external
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. No more than 48 characters.
min_query_length
- Specify the number of characters that must be typed by a user into a dynamic select menu before dispatching to the app.
optional
- Provide true when the form element is not required. By default, form elements are required.
value
- Provide a default selected value. This should be a single Option or OptionGroup that exactly matches one that will be returned from your external endpoint.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
Expand source code
class DialogExternalSelector(AbstractDialogSelector): data_source = "external" @property def attributes(self) -> Set[str]: return super().attributes.union({"min_query_length"}) def __init__( self, *, name: str, label: str, value: Optional[Option] = None, min_query_length: Optional[int] = None, optional: Optional[bool] = False, placeholder: Optional[str] = None, ): """ Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu. A list of options can be loaded from an external URL and used in your dialog menus. https://api.slack.com/dialogs#dynamic_select_elements_external Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. min_query_length: Specify the number of characters that must be typed by a user into a dynamic select menu before dispatching to the app. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. This should be a single Option or OptionGroup that exactly matches one that will be returned from your external endpoint. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ super().__init__( name=name, label=label, value=value, optional=optional, placeholder=placeholder, ) self.min_query_length = min_query_length
Ancestors
Class variables
var data_source
Instance variables
var attributes : Set[str]
-
set() -> new empty set object set(iterable) -> new set object
Build an unordered collection of unique elements.
Expand source code
@property def attributes(self) -> Set[str]: return super().attributes.union({"min_query_length"})
Inherited members
class DialogStaticSelector (*, name: str, label: str, options: Union[Sequence[Option], Sequence[OptionGroup]], optional: bool = False, value: Union[Option, str, ForwardRef(None)] = None, placeholder: Optional[str] = None)
-
Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu.
https://api.slack.com/dialogs#select_elements
Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu.
A select element may contain up to 100 selections, provided as a list of Option or OptionGroup objects
https://api.slack.com/dialogs#attributes_select_elements
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. No more than 48 characters.
options
- A list of up to 100 Option or OptionGroup objects. Object types cannot be mixed.
optional
- Provide true when the form element is not required. By default, form elements are required.
value
- Provide a default selected value.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
Expand source code
class DialogStaticSelector(AbstractDialogSelector): """ Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu. https://api.slack.com/dialogs#select_elements """ data_source = "static" options_max_length = 100 def __init__( self, *, name: str, label: str, options: Union[Sequence[Option], Sequence[OptionGroup]], optional: bool = False, value: Optional[Union[Option, str]] = None, placeholder: Optional[str] = None, ): """ Use the select element for multiple choice selections allowing users to pick a single item from a list. True to web roots, this selection is displayed as a dropdown menu. A select element may contain up to 100 selections, provided as a list of Option or OptionGroup objects https://api.slack.com/dialogs#attributes_select_elements Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. options: A list of up to 100 Option or OptionGroup objects. Object types cannot be mixed. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ super().__init__( name=name, label=label, optional=optional, value=value, placeholder=placeholder, ) self.options = options @JsonValidator(f"options attribute cannot exceed {options_max_length} items") def options_length(self) -> bool: return len(self.options) < self.options_max_length def to_dict(self) -> dict: json = super().to_dict() if isinstance(self.options[0], OptionGroup): json["option_groups"] = extract_json(self.options, "dialog") else: json["options"] = extract_json(self.options, "dialog") return json
Ancestors
Class variables
var data_source
var options_max_length
Methods
def options_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"options attribute cannot exceed {options_max_length} items") def options_length(self) -> bool: return len(self.options) < self.options_max_length
Inherited members
class DialogTextArea (*, name: str, label: str, optional: bool = False, placeholder: Optional[str] = None, hint: Optional[str] = None, value: Optional[str] = None, min_length: int = 0, max_length: Optional[int] = None, subtype: Optional[str] = None)
-
A textarea is a multi-line plain text editing control. You've likely encountered these on the world wide web. Use this element if you want a relatively long answer from users. The element UI provides a remaining character count to the max_length you have set or the default, 3000.
Expand source code
class DialogTextArea(DialogTextComponent): """ A textarea is a multi-line plain text editing control. You've likely encountered these on the world wide web. Use this element if you want a relatively long answer from users. The element UI provides a remaining character count to the max_length you have set or the default, 3000. https://api.slack.com/dialogs#textarea_elements """ type = "textarea" max_value_length = 3000
Ancestors
Class variables
var max_value_length
var type
Inherited members
class DialogTextComponent (*, name: str, label: str, optional: bool = False, placeholder: Optional[str] = None, hint: Optional[str] = None, value: Optional[str] = None, min_length: int = 0, max_length: Optional[int] = None, subtype: Optional[str] = None)
-
The base class for JSON serializable class objects
Expand source code
class DialogTextComponent(JsonObject, metaclass=ABCMeta): attributes = { "hint", "label", "max_length", "min_length", "name", "optional", "placeholder", "subtype", "type", "value", } name_max_length = 300 label_max_length = 48 placeholder_max_length = 150 hint_max_length = 150 @property @abstractmethod def type(self): pass @property @abstractmethod def max_value_length(self): pass def __init__( self, *, name: str, label: str, optional: bool = False, placeholder: Optional[str] = None, hint: Optional[str] = None, value: Optional[str] = None, min_length: int = 0, max_length: Optional[int] = None, subtype: Optional[str] = None, ): self.name = name self.label = label self.optional = optional self.placeholder = placeholder self.hint = hint self.value = value self.min_length = min_length self.max_length = max_length or self.max_value_length self.subtype = subtype @JsonValidator(f"name attribute cannot exceed {name_max_length} characters") def name_length(self) -> bool: return len(self.name) < self.name_max_length @JsonValidator(f"label attribute cannot exceed {label_max_length} characters") def label_length(self) -> bool: return len(self.label) < self.label_max_length @JsonValidator(f"placeholder attribute cannot exceed {placeholder_max_length} characters") def placeholder_length(self) -> bool: return self.placeholder is None or len(self.placeholder) < self.placeholder_max_length @JsonValidator(f"hint attribute cannot exceed {hint_max_length} characters") def hint_length(self) -> bool: return self.hint is None or len(self.hint) < self.hint_max_length @JsonValidator("value attribute exceeded bounds") def value_length(self) -> bool: return self.value is None or len(self.value) < self.max_value_length @JsonValidator("min_length attribute must be greater than or equal to 0") def min_length_above_zero(self) -> bool: return self.min_length is None or self.min_length >= 0 @JsonValidator("min_length attribute exceed bounds") def min_length_length(self) -> bool: return self.min_length is None or self.min_length <= self.max_value_length @JsonValidator("min_length attribute must be less than max value attribute") def min_length_below_max_length(self) -> bool: return self.min_length is None or self.min_length < self.max_length @JsonValidator("max_length attribute must be greater than or equal to 0") def max_length_above_zero(self) -> bool: return self.max_length is None or self.max_length > 0 @JsonValidator("max_length attribute exceeded bounds") def max_length_length(self) -> bool: return self.max_length is None or self.max_length <= self.max_value_length @EnumValidator("subtype", TextElementSubtypes) def subtype_valid(self) -> bool: return self.subtype is None or self.subtype in TextElementSubtypes
Ancestors
Subclasses
Class variables
var hint_max_length
var label_max_length
var name_max_length
var placeholder_max_length
Instance variables
var max_value_length
-
Expand source code
@property @abstractmethod def max_value_length(self): pass
var type
-
Expand source code
@property @abstractmethod def type(self): pass
Methods
def hint_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"hint attribute cannot exceed {hint_max_length} characters") def hint_length(self) -> bool: return self.hint is None or len(self.hint) < self.hint_max_length
def label_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"label attribute cannot exceed {label_max_length} characters") def label_length(self) -> bool: return len(self.label) < self.label_max_length
def max_length_above_zero(self) ‑> bool
-
Expand source code
@JsonValidator("max_length attribute must be greater than or equal to 0") def max_length_above_zero(self) -> bool: return self.max_length is None or self.max_length > 0
def max_length_length(self) ‑> bool
-
Expand source code
@JsonValidator("max_length attribute exceeded bounds") def max_length_length(self) -> bool: return self.max_length is None or self.max_length <= self.max_value_length
def min_length_above_zero(self) ‑> bool
-
Expand source code
@JsonValidator("min_length attribute must be greater than or equal to 0") def min_length_above_zero(self) -> bool: return self.min_length is None or self.min_length >= 0
def min_length_below_max_length(self) ‑> bool
-
Expand source code
@JsonValidator("min_length attribute must be less than max value attribute") def min_length_below_max_length(self) -> bool: return self.min_length is None or self.min_length < self.max_length
def min_length_length(self) ‑> bool
-
Expand source code
@JsonValidator("min_length attribute exceed bounds") def min_length_length(self) -> bool: return self.min_length is None or self.min_length <= self.max_value_length
def name_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"name attribute cannot exceed {name_max_length} characters") def name_length(self) -> bool: return len(self.name) < self.name_max_length
def placeholder_length(self) ‑> bool
-
Expand source code
@JsonValidator(f"placeholder attribute cannot exceed {placeholder_max_length} characters") def placeholder_length(self) -> bool: return self.placeholder is None or len(self.placeholder) < self.placeholder_max_length
def subtype_valid(self) ‑> bool
-
Expand source code
@EnumValidator("subtype", TextElementSubtypes) def subtype_valid(self) -> bool: return self.subtype is None or self.subtype in TextElementSubtypes
def value_length(self) ‑> bool
-
Expand source code
@JsonValidator("value attribute exceeded bounds") def value_length(self) -> bool: return self.value is None or len(self.value) < self.max_value_length
Inherited members
class DialogTextField (*, name: str, label: str, optional: bool = False, placeholder: Optional[str] = None, hint: Optional[str] = None, value: Optional[str] = None, min_length: int = 0, max_length: Optional[int] = None, subtype: Optional[str] = None)
-
Text elements are single-line plain text fields.
Expand source code
class DialogTextField(DialogTextComponent): """ Text elements are single-line plain text fields. https://api.slack.com/dialogs#text_elements """ type = "text" max_value_length = 150
Ancestors
Class variables
var max_value_length
var type
Inherited members
class DialogUserSelector (*, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None)
-
The base class for JSON serializable class objects
Now you can easily populate a select menu with a list of users. For example, when you are creating a bug tracking app, you want to include a field for an assignee. Slack pre-populates the user list in client-side, so your app doesn't need access to a related OAuth scope.
https://api.slack.com/dialogs#dynamic_select_elements_users
Args
name
- Name of form element. Required. No more than 300 characters.
label
- Label displayed to user. Required. No more than 48 characters.
optional
- Provide true when the form element is not required. By default, form elements are required.
value
- Provide a default selected value.
placeholder
- A string displayed as needed to help guide users in completing the element. 150 character maximum.
Expand source code
class DialogUserSelector(AbstractDialogSelector): data_source = "users" def __init__( # skipcq: PYL-W0235 self, *, name: str, label: str, optional: bool = False, value: Optional[str] = None, placeholder: Optional[str] = None, ): """ Now you can easily populate a select menu with a list of users. For example, when you are creating a bug tracking app, you want to include a field for an assignee. Slack pre-populates the user list in client-side, so your app doesn't need access to a related OAuth scope. https://api.slack.com/dialogs#dynamic_select_elements_users Args: name: Name of form element. Required. No more than 300 characters. label: Label displayed to user. Required. No more than 48 characters. optional: Provide true when the form element is not required. By default, form elements are required. value: Provide a default selected value. placeholder: A string displayed as needed to help guide users in completing the element. 150 character maximum. """ super().__init__( name=name, label=label, optional=optional, value=value, placeholder=placeholder, )
Ancestors
Class variables
var data_source
Inherited members