kalir-python 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. kalir/__init__.py +11 -0
  2. kalir/api/__init__.py +1 -0
  3. kalir/api/assets/__init__.py +1 -0
  4. kalir/api/assets/create_asset.py +193 -0
  5. kalir/api/assets/delete_asset.py +182 -0
  6. kalir/api/assets/get_asset.py +186 -0
  7. kalir/api/assets/list_assets.py +165 -0
  8. kalir/api/assets/update_asset.py +206 -0
  9. kalir/api/events/__init__.py +1 -0
  10. kalir/api/events/get_event.py +194 -0
  11. kalir/api/events/ingest_event.py +215 -0
  12. kalir/api/events/list_events.py +259 -0
  13. kalir/api/exposures/__init__.py +1 -0
  14. kalir/api/exposures/count_exposures.py +165 -0
  15. kalir/api/exposures/get_infostealer_summary.py +181 -0
  16. kalir/api/exposures/list_exposures.py +225 -0
  17. kalir/api/incidents/__init__.py +1 -0
  18. kalir/api/incidents/get_incident.py +194 -0
  19. kalir/api/incidents/list_incidents.py +265 -0
  20. kalir/api/incidents/update_incident_status.py +207 -0
  21. kalir/api/intel/__init__.py +1 -0
  22. kalir/api/intel/get_ransomware_stats.py +165 -0
  23. kalir/api/intel/list_ransomware_victims.py +165 -0
  24. kalir/api/mentions/__init__.py +1 -0
  25. kalir/api/mentions/list_mentions.py +283 -0
  26. kalir/api/overview/__init__.py +1 -0
  27. kalir/api/overview/get_overview.py +184 -0
  28. kalir/api/phishing/__init__.py +1 -0
  29. kalir/api/phishing/list_phishing.py +245 -0
  30. kalir/api/reports/__init__.py +1 -0
  31. kalir/api/reports/create_report.py +193 -0
  32. kalir/api/reports/download_report.py +186 -0
  33. kalir/api/reports/list_reports.py +165 -0
  34. kalir/api/rules/__init__.py +1 -0
  35. kalir/api/rules/create_rule.py +193 -0
  36. kalir/api/rules/delete_rule.py +183 -0
  37. kalir/api/rules/get_rule.py +187 -0
  38. kalir/api/rules/list_rules.py +165 -0
  39. kalir/api/rules/replace_rule.py +207 -0
  40. kalir/api/takedowns/__init__.py +1 -0
  41. kalir/api/takedowns/count_takedowns.py +165 -0
  42. kalir/api/takedowns/create_takedown.py +193 -0
  43. kalir/api/takedowns/delete_takedown.py +183 -0
  44. kalir/api/takedowns/get_takedown.py +187 -0
  45. kalir/api/takedowns/list_takedowns.py +165 -0
  46. kalir/api/takedowns/replace_takedown.py +210 -0
  47. kalir/api/takedowns/update_takedown.py +210 -0
  48. kalir/api/webhooks/__init__.py +1 -0
  49. kalir/api/webhooks/create_webhook.py +222 -0
  50. kalir/api/webhooks/delete_webhook.py +190 -0
  51. kalir/api/webhooks/get_webhook.py +194 -0
  52. kalir/api/webhooks/get_webhook_delivery.py +194 -0
  53. kalir/api/webhooks/list_webhook_deliveries.py +239 -0
  54. kalir/api/webhooks/list_webhook_event_types.py +165 -0
  55. kalir/api/webhooks/list_webhooks.py +172 -0
  56. kalir/api/webhooks/retry_webhook_delivery.py +190 -0
  57. kalir/api/webhooks/rotate_webhook_secret.py +202 -0
  58. kalir/api/webhooks/send_webhook_test.py +202 -0
  59. kalir/api/webhooks/update_webhook.py +229 -0
  60. kalir/client.py +271 -0
  61. kalir/errors.py +14 -0
  62. kalir/models/__init__.py +195 -0
  63. kalir/models/asset.py +162 -0
  64. kalir/models/asset_create.py +122 -0
  65. kalir/models/asset_create_asset_type.py +14 -0
  66. kalir/models/asset_create_metadata.py +64 -0
  67. kalir/models/count_exposures_response_200.py +78 -0
  68. kalir/models/count_takedowns_response_200.py +96 -0
  69. kalir/models/create_report_body.py +96 -0
  70. kalir/models/create_report_body_type.py +10 -0
  71. kalir/models/create_webhook_response_201.py +111 -0
  72. kalir/models/error.py +84 -0
  73. kalir/models/error_error.py +106 -0
  74. kalir/models/error_error_type.py +15 -0
  75. kalir/models/event.py +151 -0
  76. kalir/models/event_asset.py +87 -0
  77. kalir/models/event_ingest.py +146 -0
  78. kalir/models/event_ingest_asset.py +87 -0
  79. kalir/models/event_ingest_evidence.py +64 -0
  80. kalir/models/event_ingest_source.py +87 -0
  81. kalir/models/exposure.py +137 -0
  82. kalir/models/exposure_webhook_event.py +152 -0
  83. kalir/models/exposure_webhook_event_data.py +115 -0
  84. kalir/models/exposure_webhook_event_data_exposure.py +149 -0
  85. kalir/models/exposure_webhook_event_data_infection.py +136 -0
  86. kalir/models/exposure_webhook_event_type.py +8 -0
  87. kalir/models/get_incident_response_200.py +174 -0
  88. kalir/models/get_infostealer_summary_response_200.py +100 -0
  89. kalir/models/get_ransomware_stats_response_200.py +156 -0
  90. kalir/models/get_ransomware_stats_response_200_top_countries_7d_item.py +64 -0
  91. kalir/models/get_ransomware_stats_response_200_top_groups_7d_item.py +64 -0
  92. kalir/models/incident.py +170 -0
  93. kalir/models/incident_severity.py +10 -0
  94. kalir/models/incident_status.py +10 -0
  95. kalir/models/incident_webhook_event.py +152 -0
  96. kalir/models/incident_webhook_event_data.py +115 -0
  97. kalir/models/incident_webhook_event_data_previous.py +88 -0
  98. kalir/models/incident_webhook_event_type.py +9 -0
  99. kalir/models/infostealer_domain_summary.py +122 -0
  100. kalir/models/infostealer_domain_summary_snapshot.py +201 -0
  101. kalir/models/infostealer_domain_summary_snapshot_top_employee_urls_item.py +87 -0
  102. kalir/models/infostealer_domain_summary_snapshot_top_families_item.py +87 -0
  103. kalir/models/list_assets_response_200.py +100 -0
  104. kalir/models/list_events_response_200.py +109 -0
  105. kalir/models/list_exposures_response_200.py +127 -0
  106. kalir/models/list_incidents_bucket.py +10 -0
  107. kalir/models/list_incidents_response_200.py +149 -0
  108. kalir/models/list_incidents_response_200_counts.py +106 -0
  109. kalir/models/list_incidents_status.py +12 -0
  110. kalir/models/list_mentions_response_200.py +122 -0
  111. kalir/models/list_mentions_source.py +8 -0
  112. kalir/models/list_phishing_response_200.py +122 -0
  113. kalir/models/list_phishing_verdict.py +11 -0
  114. kalir/models/list_ransomware_victims_response_200.py +109 -0
  115. kalir/models/list_ransomware_victims_response_200_victims_item.py +64 -0
  116. kalir/models/list_reports_response_200.py +109 -0
  117. kalir/models/list_rules_response_200.py +100 -0
  118. kalir/models/list_takedowns_response_200.py +109 -0
  119. kalir/models/list_webhook_deliveries_response_200.py +122 -0
  120. kalir/models/list_webhook_event_types_response_200.py +100 -0
  121. kalir/models/list_webhook_event_types_response_200_data_item.py +87 -0
  122. kalir/models/list_webhooks_response_200.py +100 -0
  123. kalir/models/mention.py +194 -0
  124. kalir/models/mention_source.py +8 -0
  125. kalir/models/overview.py +231 -0
  126. kalir/models/overview_assets.py +96 -0
  127. kalir/models/overview_exposures.py +105 -0
  128. kalir/models/overview_incidents.py +114 -0
  129. kalir/models/overview_phishing.py +87 -0
  130. kalir/models/overview_risk_level.py +10 -0
  131. kalir/models/overview_takedowns.py +87 -0
  132. kalir/models/pagination.py +105 -0
  133. kalir/models/phishing_domain.py +186 -0
  134. kalir/models/phishing_domain_verdict.py +11 -0
  135. kalir/models/report.py +182 -0
  136. kalir/models/report_parameters.py +181 -0
  137. kalir/models/report_parameters_date_range.py +11 -0
  138. kalir/models/report_parameters_language.py +8 -0
  139. kalir/models/report_parameters_sections_item.py +15 -0
  140. kalir/models/report_status.py +10 -0
  141. kalir/models/rotate_webhook_secret_response_200.py +87 -0
  142. kalir/models/rule.py +174 -0
  143. kalir/models/rule_input.py +134 -0
  144. kalir/models/rule_input_actions_item.py +64 -0
  145. kalir/models/takedown.py +163 -0
  146. kalir/models/takedown_create.py +113 -0
  147. kalir/models/takedown_update.py +96 -0
  148. kalir/models/update_incident_status_body.py +90 -0
  149. kalir/models/update_incident_status_body_status.py +10 -0
  150. kalir/models/webhook_delivery.py +274 -0
  151. kalir/models/webhook_delivery_payload.py +64 -0
  152. kalir/models/webhook_delivery_status.py +9 -0
  153. kalir/models/webhook_endpoint.py +216 -0
  154. kalir/models/webhook_endpoint_input.py +124 -0
  155. kalir/models/webhook_endpoint_input_event_types_item.py +11 -0
  156. kalir/models/webhook_incident.py +232 -0
  157. kalir/models/webhook_incident_severity.py +10 -0
  158. kalir/py.typed +1 -0
  159. kalir/types.py +53 -0
  160. kalir/webhooks.py +63 -0
  161. kalir_python-0.1.0.dist-info/METADATA +76 -0
  162. kalir_python-0.1.0.dist-info/RECORD +163 -0
  163. kalir_python-0.1.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,274 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ from ..types import UNSET, Unset
10
+
11
+ from ..models.webhook_delivery_status import WebhookDeliveryStatus
12
+ from ..types import UNSET, Unset
13
+ from typing import cast
14
+ from uuid import UUID
15
+ import datetime
16
+
17
+ if TYPE_CHECKING:
18
+ from ..models.webhook_delivery_payload import WebhookDeliveryPayload
19
+
20
+
21
+
22
+
23
+
24
+ T = TypeVar("T", bound="WebhookDelivery")
25
+
26
+
27
+
28
+ @_attrs_define
29
+ class WebhookDelivery:
30
+ """
31
+ Attributes:
32
+ id (UUID | Unset):
33
+ endpoint_id (UUID | Unset):
34
+ event_id (str | Unset):
35
+ event_type (str | Unset):
36
+ payload (WebhookDeliveryPayload | Unset):
37
+ status (WebhookDeliveryStatus | Unset):
38
+ attempts (int | Unset):
39
+ next_attempt_at (datetime.datetime | Unset):
40
+ response_status (int | Unset):
41
+ response_body (str | Unset):
42
+ error (str | Unset):
43
+ duration_ms (int | Unset):
44
+ created_at (datetime.datetime | Unset):
45
+ delivered_at (datetime.datetime | Unset):
46
+ """
47
+
48
+ id: UUID | Unset = UNSET
49
+ endpoint_id: UUID | Unset = UNSET
50
+ event_id: str | Unset = UNSET
51
+ event_type: str | Unset = UNSET
52
+ payload: WebhookDeliveryPayload | Unset = UNSET
53
+ status: WebhookDeliveryStatus | Unset = UNSET
54
+ attempts: int | Unset = UNSET
55
+ next_attempt_at: datetime.datetime | Unset = UNSET
56
+ response_status: int | Unset = UNSET
57
+ response_body: str | Unset = UNSET
58
+ error: str | Unset = UNSET
59
+ duration_ms: int | Unset = UNSET
60
+ created_at: datetime.datetime | Unset = UNSET
61
+ delivered_at: datetime.datetime | Unset = UNSET
62
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
63
+
64
+
65
+
66
+
67
+
68
+ def to_dict(self) -> dict[str, Any]:
69
+ from ..models.webhook_delivery_payload import WebhookDeliveryPayload # noqa: PLC0415
70
+ id: str | Unset = UNSET
71
+ if not isinstance(self.id, Unset):
72
+ id = str(self.id)
73
+
74
+ endpoint_id: str | Unset = UNSET
75
+ if not isinstance(self.endpoint_id, Unset):
76
+ endpoint_id = str(self.endpoint_id)
77
+
78
+ event_id = self.event_id
79
+
80
+ event_type = self.event_type
81
+
82
+ payload: dict[str, Any] | Unset = UNSET
83
+ if not isinstance(self.payload, Unset):
84
+ payload = self.payload.to_dict()
85
+
86
+ status: str | Unset = UNSET
87
+ if not isinstance(self.status, Unset):
88
+ status = self.status.value
89
+
90
+
91
+ attempts = self.attempts
92
+
93
+ next_attempt_at: str | Unset = UNSET
94
+ if not isinstance(self.next_attempt_at, Unset):
95
+ next_attempt_at = self.next_attempt_at.isoformat()
96
+
97
+ response_status = self.response_status
98
+
99
+ response_body = self.response_body
100
+
101
+ error = self.error
102
+
103
+ duration_ms = self.duration_ms
104
+
105
+ created_at: str | Unset = UNSET
106
+ if not isinstance(self.created_at, Unset):
107
+ created_at = self.created_at.isoformat()
108
+
109
+ delivered_at: str | Unset = UNSET
110
+ if not isinstance(self.delivered_at, Unset):
111
+ delivered_at = self.delivered_at.isoformat()
112
+
113
+
114
+ field_dict: dict[str, Any] = {}
115
+ field_dict.update(self.additional_properties)
116
+ field_dict.update({
117
+ })
118
+ if id is not UNSET:
119
+ field_dict["id"] = id
120
+ if endpoint_id is not UNSET:
121
+ field_dict["endpoint_id"] = endpoint_id
122
+ if event_id is not UNSET:
123
+ field_dict["event_id"] = event_id
124
+ if event_type is not UNSET:
125
+ field_dict["event_type"] = event_type
126
+ if payload is not UNSET:
127
+ field_dict["payload"] = payload
128
+ if status is not UNSET:
129
+ field_dict["status"] = status
130
+ if attempts is not UNSET:
131
+ field_dict["attempts"] = attempts
132
+ if next_attempt_at is not UNSET:
133
+ field_dict["next_attempt_at"] = next_attempt_at
134
+ if response_status is not UNSET:
135
+ field_dict["response_status"] = response_status
136
+ if response_body is not UNSET:
137
+ field_dict["response_body"] = response_body
138
+ if error is not UNSET:
139
+ field_dict["error"] = error
140
+ if duration_ms is not UNSET:
141
+ field_dict["duration_ms"] = duration_ms
142
+ if created_at is not UNSET:
143
+ field_dict["created_at"] = created_at
144
+ if delivered_at is not UNSET:
145
+ field_dict["delivered_at"] = delivered_at
146
+
147
+ return field_dict
148
+
149
+
150
+
151
+ @classmethod
152
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
153
+ from ..models.webhook_delivery_payload import WebhookDeliveryPayload # noqa: PLC0415
154
+ d = dict(src_dict)
155
+ _id = d.pop("id", UNSET)
156
+ id: UUID | Unset
157
+ if isinstance(_id, Unset):
158
+ id = UNSET
159
+ else:
160
+ id = UUID(_id)
161
+
162
+
163
+
164
+
165
+ _endpoint_id = d.pop("endpoint_id", UNSET)
166
+ endpoint_id: UUID | Unset
167
+ if isinstance(_endpoint_id, Unset):
168
+ endpoint_id = UNSET
169
+ else:
170
+ endpoint_id = UUID(_endpoint_id)
171
+
172
+
173
+
174
+
175
+ event_id = d.pop("event_id", UNSET)
176
+
177
+ event_type = d.pop("event_type", UNSET)
178
+
179
+ _payload = d.pop("payload", UNSET)
180
+ payload: WebhookDeliveryPayload | Unset
181
+ if isinstance(_payload, Unset):
182
+ payload = UNSET
183
+ else:
184
+ payload = WebhookDeliveryPayload.from_dict(_payload)
185
+
186
+
187
+
188
+
189
+ _status = d.pop("status", UNSET)
190
+ status: WebhookDeliveryStatus | Unset
191
+ if isinstance(_status, Unset):
192
+ status = UNSET
193
+ else:
194
+ status = WebhookDeliveryStatus(_status)
195
+
196
+
197
+
198
+
199
+ attempts = d.pop("attempts", UNSET)
200
+
201
+ _next_attempt_at = d.pop("next_attempt_at", UNSET)
202
+ next_attempt_at: datetime.datetime | Unset
203
+ if isinstance(_next_attempt_at, Unset):
204
+ next_attempt_at = UNSET
205
+ else:
206
+ next_attempt_at = datetime.datetime.fromisoformat(_next_attempt_at)
207
+
208
+
209
+
210
+
211
+ response_status = d.pop("response_status", UNSET)
212
+
213
+ response_body = d.pop("response_body", UNSET)
214
+
215
+ error = d.pop("error", UNSET)
216
+
217
+ duration_ms = d.pop("duration_ms", UNSET)
218
+
219
+ _created_at = d.pop("created_at", UNSET)
220
+ created_at: datetime.datetime | Unset
221
+ if isinstance(_created_at, Unset):
222
+ created_at = UNSET
223
+ else:
224
+ created_at = datetime.datetime.fromisoformat(_created_at)
225
+
226
+
227
+
228
+
229
+ _delivered_at = d.pop("delivered_at", UNSET)
230
+ delivered_at: datetime.datetime | Unset
231
+ if isinstance(_delivered_at, Unset):
232
+ delivered_at = UNSET
233
+ else:
234
+ delivered_at = datetime.datetime.fromisoformat(_delivered_at)
235
+
236
+
237
+
238
+
239
+ webhook_delivery = cls(
240
+ id=id,
241
+ endpoint_id=endpoint_id,
242
+ event_id=event_id,
243
+ event_type=event_type,
244
+ payload=payload,
245
+ status=status,
246
+ attempts=attempts,
247
+ next_attempt_at=next_attempt_at,
248
+ response_status=response_status,
249
+ response_body=response_body,
250
+ error=error,
251
+ duration_ms=duration_ms,
252
+ created_at=created_at,
253
+ delivered_at=delivered_at,
254
+ )
255
+
256
+
257
+ webhook_delivery.additional_properties = d
258
+ return webhook_delivery
259
+
260
+ @property
261
+ def additional_keys(self) -> list[str]:
262
+ return list(self.additional_properties.keys())
263
+
264
+ def __getitem__(self, key: str) -> Any:
265
+ return self.additional_properties[key]
266
+
267
+ def __setitem__(self, key: str, value: Any) -> None:
268
+ self.additional_properties[key] = value
269
+
270
+ def __delitem__(self, key: str) -> None:
271
+ del self.additional_properties[key]
272
+
273
+ def __contains__(self, key: str) -> bool:
274
+ return key in self.additional_properties
@@ -0,0 +1,64 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ from ..types import UNSET, Unset
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+ T = TypeVar("T", bound="WebhookDeliveryPayload")
18
+
19
+
20
+
21
+ @_attrs_define
22
+ class WebhookDeliveryPayload:
23
+
24
+
25
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
26
+
27
+
28
+
29
+
30
+
31
+ def to_dict(self) -> dict[str, Any]:
32
+
33
+ field_dict: dict[str, Any] = {}
34
+ field_dict.update(self.additional_properties)
35
+
36
+ return field_dict
37
+
38
+
39
+
40
+ @classmethod
41
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
42
+ d = dict(src_dict)
43
+ webhook_delivery_payload = cls(
44
+ )
45
+
46
+
47
+ webhook_delivery_payload.additional_properties = d
48
+ return webhook_delivery_payload
49
+
50
+ @property
51
+ def additional_keys(self) -> list[str]:
52
+ return list(self.additional_properties.keys())
53
+
54
+ def __getitem__(self, key: str) -> Any:
55
+ return self.additional_properties[key]
56
+
57
+ def __setitem__(self, key: str, value: Any) -> None:
58
+ self.additional_properties[key] = value
59
+
60
+ def __delitem__(self, key: str) -> None:
61
+ del self.additional_properties[key]
62
+
63
+ def __contains__(self, key: str) -> bool:
64
+ return key in self.additional_properties
@@ -0,0 +1,9 @@
1
+ from enum import StrEnum
2
+
3
+ class WebhookDeliveryStatus(StrEnum):
4
+ FAILED = "failed"
5
+ PENDING = "pending"
6
+ SUCCEEDED = "succeeded"
7
+
8
+ def __str__(self) -> str:
9
+ return str(self.value)
@@ -0,0 +1,216 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ from ..types import UNSET, Unset
10
+
11
+ from ..types import UNSET, Unset
12
+ from typing import cast
13
+ from uuid import UUID
14
+ import datetime
15
+
16
+
17
+
18
+
19
+
20
+
21
+ T = TypeVar("T", bound="WebhookEndpoint")
22
+
23
+
24
+
25
+ @_attrs_define
26
+ class WebhookEndpoint:
27
+ """
28
+ Attributes:
29
+ id (UUID | Unset):
30
+ url (str | Unset):
31
+ description (str | Unset):
32
+ event_types (list[str] | Unset):
33
+ enabled (bool | Unset):
34
+ disabled_reason (str | Unset):
35
+ consecutive_failures (int | Unset):
36
+ last_delivery_at (datetime.datetime | Unset):
37
+ last_status (int | Unset):
38
+ created_at (datetime.datetime | Unset):
39
+ updated_at (datetime.datetime | Unset):
40
+ """
41
+
42
+ id: UUID | Unset = UNSET
43
+ url: str | Unset = UNSET
44
+ description: str | Unset = UNSET
45
+ event_types: list[str] | Unset = UNSET
46
+ enabled: bool | Unset = UNSET
47
+ disabled_reason: str | Unset = UNSET
48
+ consecutive_failures: int | Unset = UNSET
49
+ last_delivery_at: datetime.datetime | Unset = UNSET
50
+ last_status: int | Unset = UNSET
51
+ created_at: datetime.datetime | Unset = UNSET
52
+ updated_at: datetime.datetime | Unset = UNSET
53
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
54
+
55
+
56
+
57
+
58
+
59
+ def to_dict(self) -> dict[str, Any]:
60
+ id: str | Unset = UNSET
61
+ if not isinstance(self.id, Unset):
62
+ id = str(self.id)
63
+
64
+ url = self.url
65
+
66
+ description = self.description
67
+
68
+ event_types: list[str] | Unset = UNSET
69
+ if not isinstance(self.event_types, Unset):
70
+ event_types = self.event_types
71
+
72
+
73
+
74
+ enabled = self.enabled
75
+
76
+ disabled_reason = self.disabled_reason
77
+
78
+ consecutive_failures = self.consecutive_failures
79
+
80
+ last_delivery_at: str | Unset = UNSET
81
+ if not isinstance(self.last_delivery_at, Unset):
82
+ last_delivery_at = self.last_delivery_at.isoformat()
83
+
84
+ last_status = self.last_status
85
+
86
+ created_at: str | Unset = UNSET
87
+ if not isinstance(self.created_at, Unset):
88
+ created_at = self.created_at.isoformat()
89
+
90
+ updated_at: str | Unset = UNSET
91
+ if not isinstance(self.updated_at, Unset):
92
+ updated_at = self.updated_at.isoformat()
93
+
94
+
95
+ field_dict: dict[str, Any] = {}
96
+ field_dict.update(self.additional_properties)
97
+ field_dict.update({
98
+ })
99
+ if id is not UNSET:
100
+ field_dict["id"] = id
101
+ if url is not UNSET:
102
+ field_dict["url"] = url
103
+ if description is not UNSET:
104
+ field_dict["description"] = description
105
+ if event_types is not UNSET:
106
+ field_dict["event_types"] = event_types
107
+ if enabled is not UNSET:
108
+ field_dict["enabled"] = enabled
109
+ if disabled_reason is not UNSET:
110
+ field_dict["disabled_reason"] = disabled_reason
111
+ if consecutive_failures is not UNSET:
112
+ field_dict["consecutive_failures"] = consecutive_failures
113
+ if last_delivery_at is not UNSET:
114
+ field_dict["last_delivery_at"] = last_delivery_at
115
+ if last_status is not UNSET:
116
+ field_dict["last_status"] = last_status
117
+ if created_at is not UNSET:
118
+ field_dict["created_at"] = created_at
119
+ if updated_at is not UNSET:
120
+ field_dict["updated_at"] = updated_at
121
+
122
+ return field_dict
123
+
124
+
125
+
126
+ @classmethod
127
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
128
+ d = dict(src_dict)
129
+ _id = d.pop("id", UNSET)
130
+ id: UUID | Unset
131
+ if isinstance(_id, Unset):
132
+ id = UNSET
133
+ else:
134
+ id = UUID(_id)
135
+
136
+
137
+
138
+
139
+ url = d.pop("url", UNSET)
140
+
141
+ description = d.pop("description", UNSET)
142
+
143
+ event_types = cast(list[str], d.pop("event_types", UNSET))
144
+
145
+
146
+ enabled = d.pop("enabled", UNSET)
147
+
148
+ disabled_reason = d.pop("disabled_reason", UNSET)
149
+
150
+ consecutive_failures = d.pop("consecutive_failures", UNSET)
151
+
152
+ _last_delivery_at = d.pop("last_delivery_at", UNSET)
153
+ last_delivery_at: datetime.datetime | Unset
154
+ if isinstance(_last_delivery_at, Unset):
155
+ last_delivery_at = UNSET
156
+ else:
157
+ last_delivery_at = datetime.datetime.fromisoformat(_last_delivery_at)
158
+
159
+
160
+
161
+
162
+ last_status = d.pop("last_status", UNSET)
163
+
164
+ _created_at = d.pop("created_at", UNSET)
165
+ created_at: datetime.datetime | Unset
166
+ if isinstance(_created_at, Unset):
167
+ created_at = UNSET
168
+ else:
169
+ created_at = datetime.datetime.fromisoformat(_created_at)
170
+
171
+
172
+
173
+
174
+ _updated_at = d.pop("updated_at", UNSET)
175
+ updated_at: datetime.datetime | Unset
176
+ if isinstance(_updated_at, Unset):
177
+ updated_at = UNSET
178
+ else:
179
+ updated_at = datetime.datetime.fromisoformat(_updated_at)
180
+
181
+
182
+
183
+
184
+ webhook_endpoint = cls(
185
+ id=id,
186
+ url=url,
187
+ description=description,
188
+ event_types=event_types,
189
+ enabled=enabled,
190
+ disabled_reason=disabled_reason,
191
+ consecutive_failures=consecutive_failures,
192
+ last_delivery_at=last_delivery_at,
193
+ last_status=last_status,
194
+ created_at=created_at,
195
+ updated_at=updated_at,
196
+ )
197
+
198
+
199
+ webhook_endpoint.additional_properties = d
200
+ return webhook_endpoint
201
+
202
+ @property
203
+ def additional_keys(self) -> list[str]:
204
+ return list(self.additional_properties.keys())
205
+
206
+ def __getitem__(self, key: str) -> Any:
207
+ return self.additional_properties[key]
208
+
209
+ def __setitem__(self, key: str, value: Any) -> None:
210
+ self.additional_properties[key] = value
211
+
212
+ def __delitem__(self, key: str) -> None:
213
+ del self.additional_properties[key]
214
+
215
+ def __contains__(self, key: str) -> bool:
216
+ return key in self.additional_properties
@@ -0,0 +1,124 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ from ..types import UNSET, Unset
10
+
11
+ from ..models.webhook_endpoint_input_event_types_item import WebhookEndpointInputEventTypesItem
12
+ from ..types import UNSET, Unset
13
+ from typing import cast
14
+
15
+
16
+
17
+
18
+
19
+
20
+ T = TypeVar("T", bound="WebhookEndpointInput")
21
+
22
+
23
+
24
+ @_attrs_define
25
+ class WebhookEndpointInput:
26
+ """
27
+ Attributes:
28
+ url (str | Unset): Example: https://hooks.example.com/kalir.
29
+ description (str | Unset):
30
+ event_types (list[WebhookEndpointInputEventTypesItem] | Unset): Empty or omitted = every event type.
31
+ enabled (bool | Unset):
32
+ """
33
+
34
+ url: str | Unset = UNSET
35
+ description: str | Unset = UNSET
36
+ event_types: list[WebhookEndpointInputEventTypesItem] | Unset = UNSET
37
+ enabled: bool | Unset = UNSET
38
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
39
+
40
+
41
+
42
+
43
+
44
+ def to_dict(self) -> dict[str, Any]:
45
+ url = self.url
46
+
47
+ description = self.description
48
+
49
+ event_types: list[str] | Unset = UNSET
50
+ if not isinstance(self.event_types, Unset):
51
+ event_types = []
52
+ for event_types_item_data in self.event_types:
53
+ event_types_item = event_types_item_data.value
54
+ event_types.append(event_types_item)
55
+
56
+
57
+
58
+ enabled = self.enabled
59
+
60
+
61
+ field_dict: dict[str, Any] = {}
62
+ field_dict.update(self.additional_properties)
63
+ field_dict.update({
64
+ })
65
+ if url is not UNSET:
66
+ field_dict["url"] = url
67
+ if description is not UNSET:
68
+ field_dict["description"] = description
69
+ if event_types is not UNSET:
70
+ field_dict["event_types"] = event_types
71
+ if enabled is not UNSET:
72
+ field_dict["enabled"] = enabled
73
+
74
+ return field_dict
75
+
76
+
77
+
78
+ @classmethod
79
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
80
+ d = dict(src_dict)
81
+ url = d.pop("url", UNSET)
82
+
83
+ description = d.pop("description", UNSET)
84
+
85
+ _event_types = d.pop("event_types", UNSET)
86
+ event_types: list[WebhookEndpointInputEventTypesItem] | Unset = UNSET
87
+ if _event_types is not UNSET:
88
+ event_types = []
89
+ for event_types_item_data in _event_types:
90
+ event_types_item = WebhookEndpointInputEventTypesItem(event_types_item_data)
91
+
92
+
93
+
94
+ event_types.append(event_types_item)
95
+
96
+
97
+ enabled = d.pop("enabled", UNSET)
98
+
99
+ webhook_endpoint_input = cls(
100
+ url=url,
101
+ description=description,
102
+ event_types=event_types,
103
+ enabled=enabled,
104
+ )
105
+
106
+
107
+ webhook_endpoint_input.additional_properties = d
108
+ return webhook_endpoint_input
109
+
110
+ @property
111
+ def additional_keys(self) -> list[str]:
112
+ return list(self.additional_properties.keys())
113
+
114
+ def __getitem__(self, key: str) -> Any:
115
+ return self.additional_properties[key]
116
+
117
+ def __setitem__(self, key: str, value: Any) -> None:
118
+ self.additional_properties[key] = value
119
+
120
+ def __delitem__(self, key: str) -> None:
121
+ del self.additional_properties[key]
122
+
123
+ def __contains__(self, key: str) -> bool:
124
+ return key in self.additional_properties
@@ -0,0 +1,11 @@
1
+ from enum import StrEnum
2
+
3
+ class WebhookEndpointInputEventTypesItem(StrEnum):
4
+ EXPOSURE_DETECTED = "exposure.detected"
5
+ INCIDENT_CREATED = "incident.created"
6
+ INCIDENT_UPDATED = "incident.updated"
7
+ INFOSTEALER_DETECTED = "infostealer.detected"
8
+ PHISHING_DETECTED = "phishing.detected"
9
+
10
+ def __str__(self) -> str:
11
+ return str(self.value)