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,174 @@
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
+
14
+ if TYPE_CHECKING:
15
+ from ..models.event import Event
16
+ from ..models.incident import Incident
17
+
18
+
19
+
20
+
21
+
22
+ T = TypeVar("T", bound="GetIncidentResponse200")
23
+
24
+
25
+
26
+ @_attrs_define
27
+ class GetIncidentResponse200:
28
+ """
29
+ Attributes:
30
+ incident (Incident | Unset):
31
+ events (list[Event] | Unset): The newest 200 events, newest first. Page through all of them with `GET
32
+ /v1/events/list?incident_id=`.
33
+ events_total (int | Unset): Total events in the incident.
34
+ ttfr_minutes (int | None | Unset): Minutes to first response (acknowledge).
35
+ mttr_minutes (int | None | Unset): Minutes to resolution.
36
+ """
37
+
38
+ incident: Incident | Unset = UNSET
39
+ events: list[Event] | Unset = UNSET
40
+ events_total: int | Unset = UNSET
41
+ ttfr_minutes: int | None | Unset = UNSET
42
+ mttr_minutes: int | None | Unset = UNSET
43
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
44
+
45
+
46
+
47
+
48
+
49
+ def to_dict(self) -> dict[str, Any]:
50
+ from ..models.event import Event # noqa: PLC0415
51
+ from ..models.incident import Incident # noqa: PLC0415
52
+ incident: dict[str, Any] | Unset = UNSET
53
+ if not isinstance(self.incident, Unset):
54
+ incident = self.incident.to_dict()
55
+
56
+ events: list[dict[str, Any]] | Unset = UNSET
57
+ if not isinstance(self.events, Unset):
58
+ events = []
59
+ for events_item_data in self.events:
60
+ events_item = events_item_data.to_dict()
61
+ events.append(events_item)
62
+
63
+
64
+
65
+ events_total = self.events_total
66
+
67
+ ttfr_minutes: int | None | Unset
68
+ if isinstance(self.ttfr_minutes, Unset):
69
+ ttfr_minutes = UNSET
70
+ else:
71
+ ttfr_minutes = self.ttfr_minutes
72
+
73
+ mttr_minutes: int | None | Unset
74
+ if isinstance(self.mttr_minutes, Unset):
75
+ mttr_minutes = UNSET
76
+ else:
77
+ mttr_minutes = self.mttr_minutes
78
+
79
+
80
+ field_dict: dict[str, Any] = {}
81
+ field_dict.update(self.additional_properties)
82
+ field_dict.update({
83
+ })
84
+ if incident is not UNSET:
85
+ field_dict["incident"] = incident
86
+ if events is not UNSET:
87
+ field_dict["events"] = events
88
+ if events_total is not UNSET:
89
+ field_dict["events_total"] = events_total
90
+ if ttfr_minutes is not UNSET:
91
+ field_dict["ttfr_minutes"] = ttfr_minutes
92
+ if mttr_minutes is not UNSET:
93
+ field_dict["mttr_minutes"] = mttr_minutes
94
+
95
+ return field_dict
96
+
97
+
98
+
99
+ @classmethod
100
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
101
+ from ..models.event import Event # noqa: PLC0415
102
+ from ..models.incident import Incident # noqa: PLC0415
103
+ d = dict(src_dict)
104
+ _incident = d.pop("incident", UNSET)
105
+ incident: Incident | Unset
106
+ if isinstance(_incident, Unset):
107
+ incident = UNSET
108
+ else:
109
+ incident = Incident.from_dict(_incident)
110
+
111
+
112
+
113
+
114
+ _events = d.pop("events", UNSET)
115
+ events: list[Event] | Unset = UNSET
116
+ if _events is not UNSET:
117
+ events = []
118
+ for events_item_data in _events:
119
+ events_item = Event.from_dict(events_item_data)
120
+
121
+
122
+
123
+ events.append(events_item)
124
+
125
+
126
+ events_total = d.pop("events_total", UNSET)
127
+
128
+ def _parse_ttfr_minutes(data: object) -> int | None | Unset:
129
+ if data is None:
130
+ return data
131
+ if isinstance(data, Unset):
132
+ return data
133
+ return cast(int | None | Unset, data)
134
+
135
+ ttfr_minutes = _parse_ttfr_minutes(d.pop("ttfr_minutes", UNSET))
136
+
137
+
138
+ def _parse_mttr_minutes(data: object) -> int | None | Unset:
139
+ if data is None:
140
+ return data
141
+ if isinstance(data, Unset):
142
+ return data
143
+ return cast(int | None | Unset, data)
144
+
145
+ mttr_minutes = _parse_mttr_minutes(d.pop("mttr_minutes", UNSET))
146
+
147
+
148
+ get_incident_response_200 = cls(
149
+ incident=incident,
150
+ events=events,
151
+ events_total=events_total,
152
+ ttfr_minutes=ttfr_minutes,
153
+ mttr_minutes=mttr_minutes,
154
+ )
155
+
156
+
157
+ get_incident_response_200.additional_properties = d
158
+ return get_incident_response_200
159
+
160
+ @property
161
+ def additional_keys(self) -> list[str]:
162
+ return list(self.additional_properties.keys())
163
+
164
+ def __getitem__(self, key: str) -> Any:
165
+ return self.additional_properties[key]
166
+
167
+ def __setitem__(self, key: str, value: Any) -> None:
168
+ self.additional_properties[key] = value
169
+
170
+ def __delitem__(self, key: str) -> None:
171
+ del self.additional_properties[key]
172
+
173
+ def __contains__(self, key: str) -> bool:
174
+ return key in self.additional_properties
@@ -0,0 +1,100 @@
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
+
14
+ if TYPE_CHECKING:
15
+ from ..models.infostealer_domain_summary import InfostealerDomainSummary
16
+
17
+
18
+
19
+
20
+
21
+ T = TypeVar("T", bound="GetInfostealerSummaryResponse200")
22
+
23
+
24
+
25
+ @_attrs_define
26
+ class GetInfostealerSummaryResponse200:
27
+ """
28
+ Attributes:
29
+ domains (list[InfostealerDomainSummary] | Unset):
30
+ """
31
+
32
+ domains: list[InfostealerDomainSummary] | Unset = UNSET
33
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
34
+
35
+
36
+
37
+
38
+
39
+ def to_dict(self) -> dict[str, Any]:
40
+ from ..models.infostealer_domain_summary import InfostealerDomainSummary # noqa: PLC0415
41
+ domains: list[dict[str, Any]] | Unset = UNSET
42
+ if not isinstance(self.domains, Unset):
43
+ domains = []
44
+ for domains_item_data in self.domains:
45
+ domains_item = domains_item_data.to_dict()
46
+ domains.append(domains_item)
47
+
48
+
49
+
50
+
51
+ field_dict: dict[str, Any] = {}
52
+ field_dict.update(self.additional_properties)
53
+ field_dict.update({
54
+ })
55
+ if domains is not UNSET:
56
+ field_dict["domains"] = domains
57
+
58
+ return field_dict
59
+
60
+
61
+
62
+ @classmethod
63
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
64
+ from ..models.infostealer_domain_summary import InfostealerDomainSummary # noqa: PLC0415
65
+ d = dict(src_dict)
66
+ _domains = d.pop("domains", UNSET)
67
+ domains: list[InfostealerDomainSummary] | Unset = UNSET
68
+ if _domains is not UNSET:
69
+ domains = []
70
+ for domains_item_data in _domains:
71
+ domains_item = InfostealerDomainSummary.from_dict(domains_item_data)
72
+
73
+
74
+
75
+ domains.append(domains_item)
76
+
77
+
78
+ get_infostealer_summary_response_200 = cls(
79
+ domains=domains,
80
+ )
81
+
82
+
83
+ get_infostealer_summary_response_200.additional_properties = d
84
+ return get_infostealer_summary_response_200
85
+
86
+ @property
87
+ def additional_keys(self) -> list[str]:
88
+ return list(self.additional_properties.keys())
89
+
90
+ def __getitem__(self, key: str) -> Any:
91
+ return self.additional_properties[key]
92
+
93
+ def __setitem__(self, key: str, value: Any) -> None:
94
+ self.additional_properties[key] = value
95
+
96
+ def __delitem__(self, key: str) -> None:
97
+ del self.additional_properties[key]
98
+
99
+ def __contains__(self, key: str) -> bool:
100
+ return key in self.additional_properties
@@ -0,0 +1,156 @@
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
+
14
+ if TYPE_CHECKING:
15
+ from ..models.get_ransomware_stats_response_200_top_countries_7d_item import GetRansomwareStatsResponse200TopCountries7DItem
16
+ from ..models.get_ransomware_stats_response_200_top_groups_7d_item import GetRansomwareStatsResponse200TopGroups7DItem
17
+
18
+
19
+
20
+
21
+
22
+ T = TypeVar("T", bound="GetRansomwareStatsResponse200")
23
+
24
+
25
+
26
+ @_attrs_define
27
+ class GetRansomwareStatsResponse200:
28
+ """
29
+ Attributes:
30
+ total (int | Unset):
31
+ last_24h (int | Unset):
32
+ last_7d (int | Unset):
33
+ top_groups_7d (list[GetRansomwareStatsResponse200TopGroups7DItem] | Unset):
34
+ top_countries_7d (list[GetRansomwareStatsResponse200TopCountries7DItem] | Unset):
35
+ """
36
+
37
+ total: int | Unset = UNSET
38
+ last_24h: int | Unset = UNSET
39
+ last_7d: int | Unset = UNSET
40
+ top_groups_7d: list[GetRansomwareStatsResponse200TopGroups7DItem] | Unset = UNSET
41
+ top_countries_7d: list[GetRansomwareStatsResponse200TopCountries7DItem] | Unset = UNSET
42
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
43
+
44
+
45
+
46
+
47
+
48
+ def to_dict(self) -> dict[str, Any]:
49
+ from ..models.get_ransomware_stats_response_200_top_countries_7d_item import GetRansomwareStatsResponse200TopCountries7DItem # noqa: PLC0415
50
+ from ..models.get_ransomware_stats_response_200_top_groups_7d_item import GetRansomwareStatsResponse200TopGroups7DItem # noqa: PLC0415
51
+ total = self.total
52
+
53
+ last_24h = self.last_24h
54
+
55
+ last_7d = self.last_7d
56
+
57
+ top_groups_7d: list[dict[str, Any]] | Unset = UNSET
58
+ if not isinstance(self.top_groups_7d, Unset):
59
+ top_groups_7d = []
60
+ for top_groups_7d_item_data in self.top_groups_7d:
61
+ top_groups_7d_item = top_groups_7d_item_data.to_dict()
62
+ top_groups_7d.append(top_groups_7d_item)
63
+
64
+
65
+
66
+ top_countries_7d: list[dict[str, Any]] | Unset = UNSET
67
+ if not isinstance(self.top_countries_7d, Unset):
68
+ top_countries_7d = []
69
+ for top_countries_7d_item_data in self.top_countries_7d:
70
+ top_countries_7d_item = top_countries_7d_item_data.to_dict()
71
+ top_countries_7d.append(top_countries_7d_item)
72
+
73
+
74
+
75
+
76
+ field_dict: dict[str, Any] = {}
77
+ field_dict.update(self.additional_properties)
78
+ field_dict.update({
79
+ })
80
+ if total is not UNSET:
81
+ field_dict["total"] = total
82
+ if last_24h is not UNSET:
83
+ field_dict["last_24h"] = last_24h
84
+ if last_7d is not UNSET:
85
+ field_dict["last_7d"] = last_7d
86
+ if top_groups_7d is not UNSET:
87
+ field_dict["top_groups_7d"] = top_groups_7d
88
+ if top_countries_7d is not UNSET:
89
+ field_dict["top_countries_7d"] = top_countries_7d
90
+
91
+ return field_dict
92
+
93
+
94
+
95
+ @classmethod
96
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
97
+ from ..models.get_ransomware_stats_response_200_top_countries_7d_item import GetRansomwareStatsResponse200TopCountries7DItem # noqa: PLC0415
98
+ from ..models.get_ransomware_stats_response_200_top_groups_7d_item import GetRansomwareStatsResponse200TopGroups7DItem # noqa: PLC0415
99
+ d = dict(src_dict)
100
+ total = d.pop("total", UNSET)
101
+
102
+ last_24h = d.pop("last_24h", UNSET)
103
+
104
+ last_7d = d.pop("last_7d", UNSET)
105
+
106
+ _top_groups_7d = d.pop("top_groups_7d", UNSET)
107
+ top_groups_7d: list[GetRansomwareStatsResponse200TopGroups7DItem] | Unset = UNSET
108
+ if _top_groups_7d is not UNSET:
109
+ top_groups_7d = []
110
+ for top_groups_7d_item_data in _top_groups_7d:
111
+ top_groups_7d_item = GetRansomwareStatsResponse200TopGroups7DItem.from_dict(top_groups_7d_item_data)
112
+
113
+
114
+
115
+ top_groups_7d.append(top_groups_7d_item)
116
+
117
+
118
+ _top_countries_7d = d.pop("top_countries_7d", UNSET)
119
+ top_countries_7d: list[GetRansomwareStatsResponse200TopCountries7DItem] | Unset = UNSET
120
+ if _top_countries_7d is not UNSET:
121
+ top_countries_7d = []
122
+ for top_countries_7d_item_data in _top_countries_7d:
123
+ top_countries_7d_item = GetRansomwareStatsResponse200TopCountries7DItem.from_dict(top_countries_7d_item_data)
124
+
125
+
126
+
127
+ top_countries_7d.append(top_countries_7d_item)
128
+
129
+
130
+ get_ransomware_stats_response_200 = cls(
131
+ total=total,
132
+ last_24h=last_24h,
133
+ last_7d=last_7d,
134
+ top_groups_7d=top_groups_7d,
135
+ top_countries_7d=top_countries_7d,
136
+ )
137
+
138
+
139
+ get_ransomware_stats_response_200.additional_properties = d
140
+ return get_ransomware_stats_response_200
141
+
142
+ @property
143
+ def additional_keys(self) -> list[str]:
144
+ return list(self.additional_properties.keys())
145
+
146
+ def __getitem__(self, key: str) -> Any:
147
+ return self.additional_properties[key]
148
+
149
+ def __setitem__(self, key: str, value: Any) -> None:
150
+ self.additional_properties[key] = value
151
+
152
+ def __delitem__(self, key: str) -> None:
153
+ del self.additional_properties[key]
154
+
155
+ def __contains__(self, key: str) -> bool:
156
+ 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="GetRansomwareStatsResponse200TopCountries7DItem")
18
+
19
+
20
+
21
+ @_attrs_define
22
+ class GetRansomwareStatsResponse200TopCountries7DItem:
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
+ get_ransomware_stats_response_200_top_countries_7d_item = cls(
44
+ )
45
+
46
+
47
+ get_ransomware_stats_response_200_top_countries_7d_item.additional_properties = d
48
+ return get_ransomware_stats_response_200_top_countries_7d_item
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,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="GetRansomwareStatsResponse200TopGroups7DItem")
18
+
19
+
20
+
21
+ @_attrs_define
22
+ class GetRansomwareStatsResponse200TopGroups7DItem:
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
+ get_ransomware_stats_response_200_top_groups_7d_item = cls(
44
+ )
45
+
46
+
47
+ get_ransomware_stats_response_200_top_groups_7d_item.additional_properties = d
48
+ return get_ransomware_stats_response_200_top_groups_7d_item
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