pangea-sdk 6.2.0b2__py3-none-any.whl → 6.4.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.
@@ -1,69 +1,28 @@
1
1
  # Copyright 2022 Pangea Cyber Corporation
2
2
  # Author: Pangea Cyber Corporation
3
3
 
4
- # TODO: Modernize.
5
- # ruff: noqa: UP006, UP035
6
-
7
4
  from __future__ import annotations
8
5
 
9
6
  import enum
10
- from typing import Dict, List, NewType, Optional, Union
11
- from warnings import warn
7
+ from collections.abc import Mapping
8
+ from typing import Annotated, Literal, Optional, Union
12
9
 
13
- from typing_extensions import deprecated
10
+ from pydantic import Field
14
11
 
15
12
  import pangea.services.intel as im
16
- from pangea.deprecated import pangea_deprecated
17
- from pangea.response import APIRequestModel, APIResponseModel, PangeaResponseResult
13
+ from pangea.response import APIRequestModel, APIResponseModel, PangeaDateTime, PangeaResponseResult
18
14
  from pangea.services.vault.models.common import JWK, JWKec, JWKrsa
19
15
 
20
- Scopes = NewType("Scopes", List[str])
21
-
22
-
23
- class Profile(Dict[str, str]):
24
- @property
25
- def first_name(self) -> str:
26
- warn(
27
- '`Profile.first_name` is deprecated. Use `Profile["first_name"]` instead.', DeprecationWarning, stacklevel=2
28
- )
29
- return self["first_name"]
30
-
31
- @first_name.setter
32
- def first_name(self, value: str) -> None:
33
- warn(
34
- '`Profile.first_name` is deprecated. Use `Profile["first_name"]` instead.', DeprecationWarning, stacklevel=2
35
- )
36
- self["first_name"] = value
37
-
38
- @property
39
- def last_name(self) -> str:
40
- warn('`Profile.last_name` is deprecated. Use `Profile["last_name"]` instead.', DeprecationWarning, stacklevel=2)
41
- return self["last_name"]
42
-
43
- @last_name.setter
44
- def last_name(self, value: str) -> None:
45
- warn('`Profile.last_name` is deprecated. Use `Profile["last_name"]` instead.', DeprecationWarning, stacklevel=2)
46
- self["last_name"] = value
47
-
48
- @property
49
- def phone(self) -> str:
50
- warn('`Profile.phone` is deprecated. Use `Profile["phone"]` instead.', DeprecationWarning, stacklevel=2)
51
- return self["phone"]
52
-
53
- @phone.setter
54
- def phone(self, value: str) -> None:
55
- warn('`Profile.phone` is deprecated. Use `Profile["phone"]` instead.', DeprecationWarning, stacklevel=2)
56
- self["phone"] = value
57
-
58
- @deprecated("`Profile.model_dump()` is deprecated. `Profile` is already a `dict[str, str]`.")
59
- @pangea_deprecated(reason="`Profile` is already a `dict[str, str]`.")
60
- def model_dump(self, *, exclude_none: bool = False) -> dict[str, str]:
61
- warn(
62
- "`Profile.model_dump()` is deprecated. `Profile` is already a `dict[str, str]`.",
63
- DeprecationWarning,
64
- stacklevel=2,
65
- )
66
- return self
16
+ GroupId = Annotated[str, Field(pattern="^pgi_[a-z2-7]{32}$")]
17
+ Identity = Annotated[str, Field(pattern="^[a-zA-Z0-9 '.:/_-]+$")]
18
+ Scope = Annotated[str, Field(pattern="^[a-zA-Z0-9:*/_=-]+$")]
19
+ Token = Annotated[
20
+ str, Field(pattern="^(p(ti|tr|ts|tu|cl)_[a-z2-7]{32})|([A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+)$")
21
+ ]
22
+ TokenId = Annotated[str, Field(pattern="^pmt_[a-z2-7]{32}$")]
23
+ TokenType = Literal[
24
+ "client", "service", "service_account", "service_account_client", "service_account_pangea", "session", "user"
25
+ ]
67
26
 
68
27
 
69
28
  class ClientPasswordChangeRequest(APIRequestModel):
@@ -76,10 +35,6 @@ class ClientPasswordChangeResult(PangeaResponseResult):
76
35
  pass
77
36
 
78
37
 
79
- class ClientTokenCheckRequest(APIRequestModel):
80
- token: str
81
-
82
-
83
38
  class IPIntelligence(PangeaResponseResult):
84
39
  is_bad: bool
85
40
  is_vpn: bool
@@ -107,8 +62,8 @@ class SessionToken(PangeaResponseResult):
107
62
  expire: str
108
63
  identity: str
109
64
  email: str
110
- scopes: Optional[Scopes] = None
111
- profile: Union[Profile, Dict[str, str]]
65
+ scopes: Optional[list[Scope]] = None
66
+ profile: dict[str, str]
112
67
  created_at: str
113
68
  intelligence: Optional[Intelligence] = None
114
69
 
@@ -117,8 +72,45 @@ class LoginToken(SessionToken):
117
72
  token: str
118
73
 
119
74
 
120
- class ClientTokenCheckResult(SessionToken):
121
- token: Optional[str] = None
75
+ class ClientTokenCheckResult(PangeaResponseResult):
76
+ id: TokenId
77
+ """An ID for a token"""
78
+
79
+ type: TokenType
80
+ """A token type"""
81
+
82
+ life: Annotated[int, Field(gt=0)]
83
+ """A positive time duration in seconds"""
84
+
85
+ expire: PangeaDateTime
86
+ """A time in ISO-8601 format"""
87
+
88
+ enabled: Optional[bool] = None
89
+ identity: Identity
90
+ """The identity of a user or a service"""
91
+
92
+ email: str
93
+ scopes: Annotated[Optional[list[Scope]], Field(examples=[["scope1", "scope2"]])] = None
94
+ """A list of scopes"""
95
+
96
+ profile: Annotated[dict[str, str], Field(examples=[{"first_name": "Joe", "last_name": "User"}])]
97
+ """A user profile as a collection of string properties"""
98
+
99
+ created_at: PangeaDateTime
100
+ """A time in ISO-8601 format"""
101
+
102
+ intelligence: Optional[Intelligence] = None
103
+ audience: Optional[list[str]] = None
104
+ client_id: Annotated[
105
+ Optional[str],
106
+ Field(
107
+ examples=["psa_wuk7tvtpswyjtlsx52b7yyi2l7zotv4a"],
108
+ pattern="^psa_[a-z2-7]{32}$",
109
+ ),
110
+ ] = None
111
+ """An ID for a service account"""
112
+
113
+ claims: Optional[object] = None
122
114
 
123
115
 
124
116
  class IDProvider(str, enum.Enum):
@@ -248,7 +240,7 @@ class User(PangeaResponseResult):
248
240
  username: str
249
241
  """A username."""
250
242
 
251
- profile: Union[Profile, Dict[str, str]]
243
+ profile: dict[str, str]
252
244
  """A user profile as a collection of string properties."""
253
245
 
254
246
  verified: bool
@@ -273,7 +265,7 @@ class User(PangeaResponseResult):
273
265
  last_login_ip: Optional[str] = None
274
266
  last_login_city: Optional[str] = None
275
267
  last_login_country: Optional[str] = None
276
- authenticators: List[Authenticator] = []
268
+ authenticators: list[Authenticator] = []
277
269
  """A list of authenticators."""
278
270
 
279
271
 
@@ -281,7 +273,7 @@ class UserCreateRequest(APIRequestModel):
281
273
  email: str
282
274
  """An email address."""
283
275
 
284
- profile: Union[Profile, Dict[str, str]]
276
+ profile: Mapping[str, str]
285
277
  """A user profile as a collection of string properties."""
286
278
 
287
279
  username: Optional[str] = None
@@ -309,8 +301,8 @@ class UserDeleteResult(PangeaResponseResult):
309
301
 
310
302
  class UserListFilter(APIRequestModel):
311
303
  accepted_eula_id: Optional[str] = None
312
- accepted_eula_id__contains: Optional[List[str]] = None
313
- accepted_eula_id__in: Optional[List[str]] = None
304
+ accepted_eula_id__contains: Optional[list[str]] = None
305
+ accepted_eula_id__in: Optional[list[str]] = None
314
306
  created_at: Optional[str] = None
315
307
  created_at__gt: Optional[str] = None
316
308
  created_at__gte: Optional[str] = None
@@ -318,32 +310,32 @@ class UserListFilter(APIRequestModel):
318
310
  created_at__lte: Optional[str] = None
319
311
  disabled: Optional[bool] = None
320
312
  email: Optional[str] = None
321
- email__contains: Optional[List[str]] = None
322
- email__in: Optional[List[str]] = None
313
+ email__contains: Optional[list[str]] = None
314
+ email__in: Optional[list[str]] = None
323
315
  id: Optional[str] = None
324
- id__contains: Optional[List[str]] = None
325
- id__in: Optional[List[str]] = None
316
+ id__contains: Optional[list[str]] = None
317
+ id__in: Optional[list[str]] = None
326
318
  last_login_at: Optional[str] = None
327
319
  last_login_at__gt: Optional[str] = None
328
320
  last_login_at__gte: Optional[str] = None
329
321
  last_login_at__lt: Optional[str] = None
330
322
  last_login_at__lte: Optional[str] = None
331
323
  last_login_ip: Optional[str] = None
332
- last_login_ip__contains: Optional[List[str]] = None
333
- last_login_ip__in: Optional[List[str]] = None
324
+ last_login_ip__contains: Optional[list[str]] = None
325
+ last_login_ip__in: Optional[list[str]] = None
334
326
  last_login_city: Optional[str] = None
335
- last_login_city__contains: Optional[List[str]] = None
336
- last_login_city__in: Optional[List[str]] = None
327
+ last_login_city__contains: Optional[list[str]] = None
328
+ last_login_city__in: Optional[list[str]] = None
337
329
  last_login_country: Optional[str] = None
338
- last_login_country__contains: Optional[List[str]] = None
339
- last_login_country__in: Optional[List[str]] = None
330
+ last_login_country__contains: Optional[list[str]] = None
331
+ last_login_country__in: Optional[list[str]] = None
340
332
  login_count: Optional[int] = None
341
333
  login_count__gt: Optional[int] = None
342
334
  login_count__gte: Optional[int] = None
343
335
  login_count__lt: Optional[int] = None
344
336
  login_count__lte: Optional[int] = None
345
337
  require_mfa: Optional[bool] = None
346
- scopes: Optional[List[str]] = None
338
+ scopes: Optional[list[str]] = None
347
339
  verified: Optional[bool] = None
348
340
 
349
341
 
@@ -356,7 +348,7 @@ class UserListRequest(APIRequestModel):
356
348
 
357
349
 
358
350
  class UserListResult(PangeaResponseResult):
359
- users: List[User]
351
+ users: list[User]
360
352
  last: Optional[str] = None
361
353
  count: int
362
354
 
@@ -404,35 +396,35 @@ class UserInviterOrderBy(enum.Enum):
404
396
 
405
397
  class UserInviteListFilter(APIRequestModel):
406
398
  callback: Optional[str] = None
407
- callback__contains: Optional[List[str]] = None
408
- callback__in: Optional[List[str]] = None
399
+ callback__contains: Optional[list[str]] = None
400
+ callback__in: Optional[list[str]] = None
409
401
  created_at: Optional[str] = None
410
402
  created_at__gt: Optional[str] = None
411
403
  created_at__gte: Optional[str] = None
412
404
  created_at__lt: Optional[str] = None
413
405
  created_at__lte: Optional[str] = None
414
406
  email: Optional[str] = None
415
- email__contains: Optional[List[str]] = None
416
- email__in: Optional[List[str]] = None
407
+ email__contains: Optional[list[str]] = None
408
+ email__in: Optional[list[str]] = None
417
409
  expire: Optional[str] = None
418
410
  expire__gt: Optional[str] = None
419
411
  expire__gte: Optional[str] = None
420
412
  expire__lt: Optional[str] = None
421
413
  expire__lte: Optional[str] = None
422
414
  id: Optional[str] = None
423
- id__contains: Optional[List[str]] = None
424
- id__in: Optional[List[str]] = None
415
+ id__contains: Optional[list[str]] = None
416
+ id__in: Optional[list[str]] = None
425
417
  invite_org: Optional[str] = None
426
- invite_org__contains: Optional[List[str]] = None
427
- invite_org__in: Optional[List[str]] = None
418
+ invite_org__contains: Optional[list[str]] = None
419
+ invite_org__in: Optional[list[str]] = None
428
420
  inviter: Optional[str] = None
429
- inviter__contains: Optional[List[str]] = None
430
- inviter__in: Optional[List[str]] = None
421
+ inviter__contains: Optional[list[str]] = None
422
+ inviter__in: Optional[list[str]] = None
431
423
  is_signup: Optional[bool] = None
432
424
  require_mfa: Optional[bool] = None
433
425
  state: Optional[str] = None
434
- state__contains: Optional[List[str]] = None
435
- state__in: Optional[List[str]] = None
426
+ state__contains: Optional[list[str]] = None
427
+ state__in: Optional[list[str]] = None
436
428
 
437
429
 
438
430
  class UserInviteListRequest(APIRequestModel):
@@ -444,7 +436,7 @@ class UserInviteListRequest(APIRequestModel):
444
436
 
445
437
 
446
438
  class UserInviteListResult(PangeaResponseResult):
447
- invites: List[UserInvite]
439
+ invites: list[UserInvite]
448
440
 
449
441
 
450
442
  class UserInviteDeleteRequest(APIRequestModel):
@@ -471,7 +463,7 @@ class UserProfileGetResult(User):
471
463
 
472
464
 
473
465
  class UserProfileUpdateRequest(APIRequestModel):
474
- profile: Union[Profile, Dict[str, str]]
466
+ profile: Mapping[str, str]
475
467
  """Updates to a user profile."""
476
468
 
477
469
  id: Optional[str] = None
@@ -525,7 +517,7 @@ class ClientUserinfoRequest(APIRequestModel):
525
517
 
526
518
 
527
519
  class ClientJWKSResult(PangeaResponseResult):
528
- keys: List[Union[JWKec, JWKrsa, JWK]]
520
+ keys: list[Union[JWKec, JWKrsa, JWK]]
529
521
 
530
522
 
531
523
  class UserAuthenticatorsDeleteRequest(APIRequestModel):
@@ -558,7 +550,7 @@ class UserAuthenticatorsListRequest(APIRequestModel):
558
550
 
559
551
 
560
552
  class UserAuthenticatorsListResult(PangeaResponseResult):
561
- authenticators: List[Authenticator] = []
553
+ authenticators: list[Authenticator] = []
562
554
  """A list of authenticators."""
563
555
 
564
556
 
@@ -573,16 +565,16 @@ class FlowCompleteResult(PangeaResponseResult):
573
565
 
574
566
  class FlowChoiceItem(APIResponseModel):
575
567
  choice: str
576
- data: Dict = {}
568
+ data: dict = {}
577
569
 
578
570
 
579
571
  class CommonFlowResult(PangeaResponseResult):
580
572
  flow_id: str
581
- flow_type: List[str] = []
573
+ flow_type: list[str] = []
582
574
  email: Optional[str] = None
583
575
  disclaimer: Optional[str] = None
584
576
  flow_phase: str
585
- flow_choices: List[FlowChoiceItem] = []
577
+ flow_choices: list[FlowChoiceItem] = []
586
578
 
587
579
 
588
580
  class FlowChoice(enum.Enum):
@@ -612,7 +604,7 @@ class FlowRestartDataSMSOTP(APIRequestModel):
612
604
  phone: str
613
605
 
614
606
 
615
- FlowRestartData = Union[Dict, FlowRestartDataSMSOTP]
607
+ FlowRestartData = Union[dict, FlowRestartDataSMSOTP]
616
608
 
617
609
 
618
610
  class FlowRestartRequest(APIRequestModel):
@@ -628,7 +620,7 @@ class FlowRestartResult(CommonFlowResult):
628
620
  class FlowStartRequest(APIRequestModel):
629
621
  cb_uri: Optional[str] = None
630
622
  email: Optional[str] = None
631
- flow_types: Optional[List[FlowType]] = None
623
+ flow_types: Optional[list[FlowType]] = None
632
624
  invitation: Optional[str] = None
633
625
 
634
626
 
@@ -637,7 +629,7 @@ class FlowStartResult(CommonFlowResult):
637
629
 
638
630
 
639
631
  class FlowUpdateDataAgreements(APIRequestModel):
640
- agreed: List[str]
632
+ agreed: list[str]
641
633
 
642
634
 
643
635
  class FlowUpdateDataCaptcha(APIRequestModel):
@@ -658,7 +650,7 @@ class FlowUpdateDataPassword(APIRequestModel):
658
650
 
659
651
 
660
652
  class FlowUpdateDataProfile(APIRequestModel):
661
- profile: Union[Profile, Dict[str, str]]
653
+ profile: dict[str, str]
662
654
 
663
655
 
664
656
  class FlowUpdateDataProvisionalEnrollment(APIRequestModel):
@@ -698,7 +690,7 @@ class FlowUpdateDataVerifyEmail(APIRequestModel):
698
690
 
699
691
 
700
692
  FlowUpdateData = Union[
701
- Dict,
693
+ dict,
702
694
  FlowUpdateDataAgreements,
703
695
  FlowUpdateDataCaptcha,
704
696
  FlowUpdateDataEmailOTP,
@@ -737,31 +729,31 @@ class ClientSessionInvalidateResult(PangeaResponseResult):
737
729
 
738
730
  class SessionListFilter(APIRequestModel):
739
731
  active_token_id: Optional[str] = None
740
- active_token_id__contains: Optional[List[str]] = None
741
- active_token_id__in: Optional[List[str]] = None
732
+ active_token_id__contains: Optional[list[str]] = None
733
+ active_token_id__in: Optional[list[str]] = None
742
734
  created_at: Optional[str] = None
743
735
  created_at__gt: Optional[str] = None
744
736
  created_at__gte: Optional[str] = None
745
737
  created_at__lt: Optional[str] = None
746
738
  created_at__lte: Optional[str] = None
747
739
  email: Optional[str] = None
748
- email__contains: Optional[List[str]] = None
749
- email__in: Optional[List[str]] = None
740
+ email__contains: Optional[list[str]] = None
741
+ email__in: Optional[list[str]] = None
750
742
  expire: Optional[str] = None
751
743
  expire__gt: Optional[str] = None
752
744
  expire__gte: Optional[str] = None
753
745
  expire__lt: Optional[str] = None
754
746
  expire__lte: Optional[str] = None
755
747
  id: Optional[str] = None
756
- id__contains: Optional[List[str]] = None
757
- id__in: Optional[List[str]] = None
748
+ id__contains: Optional[list[str]] = None
749
+ id__in: Optional[list[str]] = None
758
750
  identity: Optional[str] = None
759
- identity__contains: Optional[List[str]] = None
760
- identity__in: Optional[List[str]] = None
761
- scopes: Optional[List[str]] = None
751
+ identity__contains: Optional[list[str]] = None
752
+ identity__in: Optional[list[str]] = None
753
+ scopes: Optional[list[str]] = None
762
754
  type: Optional[str] = None
763
- type__contains: Optional[List[str]] = None
764
- type__in: Optional[List[str]] = None
755
+ type__contains: Optional[list[str]] = None
756
+ type__in: Optional[list[str]] = None
765
757
 
766
758
 
767
759
  class ClientSessionListRequest(APIRequestModel):
@@ -779,19 +771,19 @@ class SessionItem(APIResponseModel):
779
771
  life: int
780
772
  expire: str
781
773
  email: str
782
- scopes: Optional[Scopes] = None
783
- profile: Union[Profile, Dict[str, str]]
774
+ scopes: Optional[list[Scope]] = None
775
+ profile: dict[str, str]
784
776
  created_at: str
785
777
  active_token: Optional[SessionToken] = None
786
778
 
787
779
 
788
780
  class ClientSessionListResults(PangeaResponseResult):
789
- sessions: List[SessionItem]
781
+ sessions: list[SessionItem]
790
782
  last: str
791
783
 
792
784
 
793
785
  class SessionListResults(PangeaResponseResult):
794
- sessions: List[SessionItem]
786
+ sessions: list[SessionItem]
795
787
  last: str
796
788
 
797
789
 
@@ -894,28 +886,61 @@ class AgreementListOrderBy(enum.Enum):
894
886
 
895
887
  class AgreementListFilter(APIRequestModel):
896
888
  active: Optional[bool] = None
897
- created_at: Optional[str] = None
898
- created_at__gt: Optional[str] = None
899
- created_at__gte: Optional[str] = None
900
- created_at__lt: Optional[str] = None
901
- created_at__lte: Optional[str] = None
902
- published_at: Optional[str] = None
903
- published_at__gt: Optional[str] = None
904
- published_at__gte: Optional[str] = None
905
- published_at__lt: Optional[str] = None
906
- published_at__lte: Optional[str] = None
907
- type: Optional[str] = None
908
- type__contains: Optional[List[str]] = None
909
- type__in: Optional[List[str]] = None
889
+ """Only records where active equals this value."""
890
+ created_at: Optional[PangeaDateTime] = None
891
+ """Only records where created_at equals this value."""
892
+ created_at__gt: Optional[PangeaDateTime] = None
893
+ """Only records where created_at is greater than this value."""
894
+ created_at__gte: Optional[PangeaDateTime] = None
895
+ """Only records where created_at is greater than or equal to this value."""
896
+ created_at__lt: Optional[PangeaDateTime] = None
897
+ """Only records where created_at is less than this value."""
898
+ created_at__lte: Optional[PangeaDateTime] = None
899
+ """Only records where created_at is less than or equal to this value."""
910
900
  id: Optional[str] = None
911
- id__contains: Optional[List[str]] = None
912
- id__in: Optional[List[str]] = None
901
+ """Only records where id equals this value."""
902
+ id__contains: Optional[list[str]] = None
903
+ """Only records where id includes each substring."""
904
+ id__in: Optional[list[str]] = None
905
+ """Only records where id equals one of the provided substrings."""
913
906
  name: Optional[str] = None
914
- name__contains: Optional[List[str]] = None
915
- name__in: Optional[List[str]] = None
907
+ """Only records where name equals this value."""
908
+ name__contains: Optional[list[str]] = None
909
+ """Only records where name includes each substring."""
910
+ name__in: Optional[list[str]] = None
911
+ """Only records where name equals one of the provided substrings."""
912
+ published_at: Optional[PangeaDateTime] = None
913
+ """Only records where published_at equals this value."""
914
+ published_at__gt: Optional[PangeaDateTime] = None
915
+ """Only records where published_at is greater than this value."""
916
+ published_at__gte: Optional[PangeaDateTime] = None
917
+ """Only records where published_at is greater than or equal to this value."""
918
+ published_at__lt: Optional[PangeaDateTime] = None
919
+ """Only records where published_at is less than this value."""
920
+ published_at__lte: Optional[PangeaDateTime] = None
921
+ """Only records where published_at is less than or equal to this value."""
916
922
  text: Optional[str] = None
917
- text__contains: Optional[List[str]] = None
918
- text__in: Optional[List[str]] = None
923
+ """Only records where text equals this value."""
924
+ text__contains: Optional[list[str]] = None
925
+ """Only records where text includes each substring."""
926
+ text__in: Optional[list[str]] = None
927
+ """Only records where text equals one of the provided substrings."""
928
+ type: Optional[str] = None
929
+ """Only records where type equals this value."""
930
+ type__contains: Optional[list[str]] = None
931
+ """Only records where type includes each substring."""
932
+ type__in: Optional[list[str]] = None
933
+ """Only records where type equals one of the provided substrings."""
934
+ updated_at: Optional[PangeaDateTime] = None
935
+ """Only records where updated_at equals this value."""
936
+ updated_at__gt: Optional[PangeaDateTime] = None
937
+ """Only records where updated_at is greater than this value."""
938
+ updated_at__gte: Optional[PangeaDateTime] = None
939
+ """Only records where updated_at is greater than or equal to this value."""
940
+ updated_at__lt: Optional[PangeaDateTime] = None
941
+ """Only records where updated_at is less than this value."""
942
+ updated_at__lte: Optional[PangeaDateTime] = None
943
+ """Only records where updated_at is less than or equal to this value."""
919
944
 
920
945
 
921
946
  class AgreementListRequest(APIRequestModel):
@@ -927,7 +952,7 @@ class AgreementListRequest(APIRequestModel):
927
952
 
928
953
 
929
954
  class AgreementListResult(PangeaResponseResult):
930
- agreements: List[AgreementInfo]
955
+ agreements: list[AgreementInfo]
931
956
  count: int
932
957
  last: Optional[str] = None
933
958
 
@@ -947,14 +972,21 @@ class AgreementUpdateResult(AgreementInfo):
947
972
  class GroupInfo(PangeaResponseResult):
948
973
  """A group and its information"""
949
974
 
950
- id: str
975
+ id: GroupId
976
+ """An ID for a group"""
977
+
951
978
  name: str
952
979
  type: str
953
980
 
954
981
  description: Optional[str] = None
955
- attributes: Optional[Dict[str, str]] = None
956
- created_at: Optional[str] = None
957
- updated_at: Optional[str] = None
982
+ attributes: Optional[dict[str, str]] = None
983
+ """A collection of key/value pairs"""
984
+
985
+ created_at: Optional[PangeaDateTime] = None
986
+ """A time in ISO-8601 format"""
987
+
988
+ updated_at: Optional[PangeaDateTime] = None
989
+ """A time in ISO-8601 format"""
958
990
 
959
991
 
960
992
  class GroupsFilter(APIRequestModel):
@@ -981,28 +1013,28 @@ class GroupsFilter(APIRequestModel):
981
1013
  id: Optional[str] = None
982
1014
  """Only records where id equals this value."""
983
1015
 
984
- id__contains: Optional[List[str]] = None
1016
+ id__contains: Optional[list[str]] = None
985
1017
  """Only records where id includes each substring."""
986
1018
 
987
- id__in: Optional[List[str]] = None
1019
+ id__in: Optional[list[str]] = None
988
1020
  """Only records where id equals one of the provided substrings."""
989
1021
 
990
1022
  name: Optional[str] = None
991
1023
  """Only records where name equals this value."""
992
1024
 
993
- name__contains: Optional[List[str]] = None
1025
+ name__contains: Optional[list[str]] = None
994
1026
  """Only records where name includes each substring."""
995
1027
 
996
- name__in: Optional[List[str]] = None
1028
+ name__in: Optional[list[str]] = None
997
1029
  """Only records where name equals one of the provided substrings."""
998
1030
 
999
1031
  type: Optional[str] = None
1000
1032
  """Only records where type equals this value."""
1001
1033
 
1002
- type__contains: Optional[List[str]] = None
1034
+ type__contains: Optional[list[str]] = None
1003
1035
  """Only records where type includes each substring."""
1004
1036
 
1005
- type__in: Optional[List[str]] = None
1037
+ type__in: Optional[list[str]] = None
1006
1038
  """Only records where type equals one of the provided substrings."""
1007
1039
 
1008
1040
  updated_at: Optional[str] = None
@@ -1025,7 +1057,7 @@ class GroupsFilter(APIRequestModel):
1025
1057
 
1026
1058
 
1027
1059
  class GroupList(PangeaResponseResult):
1028
- groups: List[GroupInfo]
1060
+ groups: list[GroupInfo]
1029
1061
  """List of matching groups"""
1030
1062
 
1031
1063
  count: int
@@ -1033,6 +1065,6 @@ class GroupList(PangeaResponseResult):
1033
1065
 
1034
1066
 
1035
1067
  class GroupUserList(PangeaResponseResult):
1036
- users: List[User]
1068
+ users: list[User]
1037
1069
  count: int
1038
1070
  last: Optional[str] = None