pangea-sdk 6.2.0b1__py3-none-any.whl → 6.3.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 (55) hide show
  1. pangea/__init__.py +9 -1
  2. pangea/asyncio/__init__.py +1 -0
  3. pangea/asyncio/file_uploader.py +4 -2
  4. pangea/asyncio/request.py +70 -169
  5. pangea/asyncio/services/__init__.py +2 -1
  6. pangea/asyncio/services/ai_guard.py +9 -12
  7. pangea/asyncio/services/audit.py +13 -307
  8. pangea/asyncio/services/authn.py +40 -32
  9. pangea/asyncio/services/authz.py +51 -17
  10. pangea/asyncio/services/base.py +4 -0
  11. pangea/asyncio/services/file_scan.py +8 -2
  12. pangea/asyncio/services/intel.py +26 -28
  13. pangea/asyncio/services/redact.py +11 -268
  14. pangea/asyncio/services/sanitize.py +5 -1
  15. pangea/asyncio/services/share.py +5 -1
  16. pangea/asyncio/services/vault.py +71 -55
  17. pangea/audit_logger.py +3 -1
  18. pangea/deep_verify.py +13 -13
  19. pangea/deprecated.py +1 -1
  20. pangea/dump_audit.py +2 -3
  21. pangea/exceptions.py +8 -5
  22. pangea/file_uploader.py +4 -0
  23. pangea/request.py +80 -200
  24. pangea/response.py +21 -18
  25. pangea/services/__init__.py +2 -1
  26. pangea/services/ai_guard.py +35 -24
  27. pangea/services/audit/audit.py +17 -314
  28. pangea/services/audit/models.py +69 -307
  29. pangea/services/audit/signing.py +1 -1
  30. pangea/services/audit/util.py +10 -10
  31. pangea/services/authn/authn.py +39 -31
  32. pangea/services/authn/models.py +183 -148
  33. pangea/services/authz.py +108 -60
  34. pangea/services/base.py +7 -4
  35. pangea/services/embargo.py +6 -0
  36. pangea/services/file_scan.py +8 -2
  37. pangea/services/intel.py +36 -19
  38. pangea/services/redact.py +14 -476
  39. pangea/services/sanitize.py +5 -1
  40. pangea/services/share/share.py +13 -7
  41. pangea/services/vault/models/asymmetric.py +4 -0
  42. pangea/services/vault/models/common.py +15 -12
  43. pangea/services/vault/models/keys.py +4 -9
  44. pangea/services/vault/models/secret.py +3 -8
  45. pangea/services/vault/models/symmetric.py +4 -0
  46. pangea/services/vault/vault.py +69 -59
  47. pangea/tools.py +13 -9
  48. pangea/utils.py +3 -5
  49. pangea/verify_audit.py +23 -27
  50. {pangea_sdk-6.2.0b1.dist-info → pangea_sdk-6.3.0.dist-info}/METADATA +36 -17
  51. pangea_sdk-6.3.0.dist-info/RECORD +60 -0
  52. {pangea_sdk-6.2.0b1.dist-info → pangea_sdk-6.3.0.dist-info}/WHEEL +1 -1
  53. pangea/asyncio/services/management.py +0 -576
  54. pangea/services/management.py +0 -720
  55. pangea_sdk-6.2.0b1.dist-info/RECORD +0 -62
@@ -4,63 +4,25 @@
4
4
  from __future__ import annotations
5
5
 
6
6
  import enum
7
- from typing import Dict, List, NewType, Optional, Union
8
- from warnings import warn
7
+ from collections.abc import Mapping
8
+ from typing import Annotated, Literal, Optional, Union
9
9
 
10
- from typing_extensions import deprecated
10
+ from pydantic import Field
11
11
 
12
12
  import pangea.services.intel as im
13
- from pangea.deprecated import pangea_deprecated
14
- from pangea.response import APIRequestModel, APIResponseModel, PangeaResponseResult
13
+ from pangea.response import APIRequestModel, APIResponseModel, PangeaDateTime, PangeaResponseResult
15
14
  from pangea.services.vault.models.common import JWK, JWKec, JWKrsa
16
15
 
17
- Scopes = NewType("Scopes", List[str])
18
-
19
-
20
- class Profile(Dict[str, str]):
21
- @property
22
- def first_name(self) -> str:
23
- warn(
24
- '`Profile.first_name` is deprecated. Use `Profile["first_name"]` instead.', DeprecationWarning, stacklevel=2
25
- )
26
- return self["first_name"]
27
-
28
- @first_name.setter
29
- def first_name(self, value: str) -> None:
30
- warn(
31
- '`Profile.first_name` is deprecated. Use `Profile["first_name"]` instead.', DeprecationWarning, stacklevel=2
32
- )
33
- self["first_name"] = value
34
-
35
- @property
36
- def last_name(self) -> str:
37
- warn('`Profile.last_name` is deprecated. Use `Profile["last_name"]` instead.', DeprecationWarning, stacklevel=2)
38
- return self["last_name"]
39
-
40
- @last_name.setter
41
- def last_name(self, value: str) -> None:
42
- warn('`Profile.last_name` is deprecated. Use `Profile["last_name"]` instead.', DeprecationWarning, stacklevel=2)
43
- self["last_name"] = value
44
-
45
- @property
46
- def phone(self) -> str:
47
- warn('`Profile.phone` is deprecated. Use `Profile["phone"]` instead.', DeprecationWarning, stacklevel=2)
48
- return self["phone"]
49
-
50
- @phone.setter
51
- def phone(self, value: str) -> None:
52
- warn('`Profile.phone` is deprecated. Use `Profile["phone"]` instead.', DeprecationWarning, stacklevel=2)
53
- self["phone"] = value
54
-
55
- @deprecated("`Profile.model_dump()` is deprecated. `Profile` is already a `dict[str, str]`.")
56
- @pangea_deprecated(reason="`Profile` is already a `dict[str, str]`.")
57
- def model_dump(self, *, exclude_none: bool = False) -> dict[str, str]:
58
- warn(
59
- "`Profile.model_dump()` is deprecated. `Profile` is already a `dict[str, str]`.",
60
- DeprecationWarning,
61
- stacklevel=2,
62
- )
63
- 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
+ ]
64
26
 
65
27
 
66
28
  class ClientPasswordChangeRequest(APIRequestModel):
@@ -73,10 +35,6 @@ class ClientPasswordChangeResult(PangeaResponseResult):
73
35
  pass
74
36
 
75
37
 
76
- class ClientTokenCheckRequest(APIRequestModel):
77
- token: str
78
-
79
-
80
38
  class IPIntelligence(PangeaResponseResult):
81
39
  is_bad: bool
82
40
  is_vpn: bool
@@ -104,8 +62,8 @@ class SessionToken(PangeaResponseResult):
104
62
  expire: str
105
63
  identity: str
106
64
  email: str
107
- scopes: Optional[Scopes] = None
108
- profile: Union[Profile, Dict[str, str]]
65
+ scopes: Optional[list[Scope]] = None
66
+ profile: dict[str, str]
109
67
  created_at: str
110
68
  intelligence: Optional[Intelligence] = None
111
69
 
@@ -114,8 +72,45 @@ class LoginToken(SessionToken):
114
72
  token: str
115
73
 
116
74
 
117
- class ClientTokenCheckResult(SessionToken):
118
- 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
119
114
 
120
115
 
121
116
  class IDProvider(str, enum.Enum):
@@ -245,7 +240,7 @@ class User(PangeaResponseResult):
245
240
  username: str
246
241
  """A username."""
247
242
 
248
- profile: Union[Profile, Dict[str, str]]
243
+ profile: dict[str, str]
249
244
  """A user profile as a collection of string properties."""
250
245
 
251
246
  verified: bool
@@ -270,7 +265,7 @@ class User(PangeaResponseResult):
270
265
  last_login_ip: Optional[str] = None
271
266
  last_login_city: Optional[str] = None
272
267
  last_login_country: Optional[str] = None
273
- authenticators: List[Authenticator] = []
268
+ authenticators: list[Authenticator] = []
274
269
  """A list of authenticators."""
275
270
 
276
271
 
@@ -278,7 +273,7 @@ class UserCreateRequest(APIRequestModel):
278
273
  email: str
279
274
  """An email address."""
280
275
 
281
- profile: Union[Profile, Dict[str, str]]
276
+ profile: Mapping[str, str]
282
277
  """A user profile as a collection of string properties."""
283
278
 
284
279
  username: Optional[str] = None
@@ -306,8 +301,8 @@ class UserDeleteResult(PangeaResponseResult):
306
301
 
307
302
  class UserListFilter(APIRequestModel):
308
303
  accepted_eula_id: Optional[str] = None
309
- accepted_eula_id__contains: Optional[List[str]] = None
310
- 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
311
306
  created_at: Optional[str] = None
312
307
  created_at__gt: Optional[str] = None
313
308
  created_at__gte: Optional[str] = None
@@ -315,32 +310,32 @@ class UserListFilter(APIRequestModel):
315
310
  created_at__lte: Optional[str] = None
316
311
  disabled: Optional[bool] = None
317
312
  email: Optional[str] = None
318
- email__contains: Optional[List[str]] = None
319
- email__in: Optional[List[str]] = None
313
+ email__contains: Optional[list[str]] = None
314
+ email__in: Optional[list[str]] = None
320
315
  id: Optional[str] = None
321
- id__contains: Optional[List[str]] = None
322
- id__in: Optional[List[str]] = None
316
+ id__contains: Optional[list[str]] = None
317
+ id__in: Optional[list[str]] = None
323
318
  last_login_at: Optional[str] = None
324
319
  last_login_at__gt: Optional[str] = None
325
320
  last_login_at__gte: Optional[str] = None
326
321
  last_login_at__lt: Optional[str] = None
327
322
  last_login_at__lte: Optional[str] = None
328
323
  last_login_ip: Optional[str] = None
329
- last_login_ip__contains: Optional[List[str]] = None
330
- 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
331
326
  last_login_city: Optional[str] = None
332
- last_login_city__contains: Optional[List[str]] = None
333
- 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
334
329
  last_login_country: Optional[str] = None
335
- last_login_country__contains: Optional[List[str]] = None
336
- 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
337
332
  login_count: Optional[int] = None
338
333
  login_count__gt: Optional[int] = None
339
334
  login_count__gte: Optional[int] = None
340
335
  login_count__lt: Optional[int] = None
341
336
  login_count__lte: Optional[int] = None
342
337
  require_mfa: Optional[bool] = None
343
- scopes: Optional[List[str]] = None
338
+ scopes: Optional[list[str]] = None
344
339
  verified: Optional[bool] = None
345
340
 
346
341
 
@@ -353,7 +348,7 @@ class UserListRequest(APIRequestModel):
353
348
 
354
349
 
355
350
  class UserListResult(PangeaResponseResult):
356
- users: List[User]
351
+ users: list[User]
357
352
  last: Optional[str] = None
358
353
  count: int
359
354
 
@@ -401,35 +396,35 @@ class UserInviterOrderBy(enum.Enum):
401
396
 
402
397
  class UserInviteListFilter(APIRequestModel):
403
398
  callback: Optional[str] = None
404
- callback__contains: Optional[List[str]] = None
405
- callback__in: Optional[List[str]] = None
399
+ callback__contains: Optional[list[str]] = None
400
+ callback__in: Optional[list[str]] = None
406
401
  created_at: Optional[str] = None
407
402
  created_at__gt: Optional[str] = None
408
403
  created_at__gte: Optional[str] = None
409
404
  created_at__lt: Optional[str] = None
410
405
  created_at__lte: Optional[str] = None
411
406
  email: Optional[str] = None
412
- email__contains: Optional[List[str]] = None
413
- email__in: Optional[List[str]] = None
407
+ email__contains: Optional[list[str]] = None
408
+ email__in: Optional[list[str]] = None
414
409
  expire: Optional[str] = None
415
410
  expire__gt: Optional[str] = None
416
411
  expire__gte: Optional[str] = None
417
412
  expire__lt: Optional[str] = None
418
413
  expire__lte: Optional[str] = None
419
414
  id: Optional[str] = None
420
- id__contains: Optional[List[str]] = None
421
- id__in: Optional[List[str]] = None
415
+ id__contains: Optional[list[str]] = None
416
+ id__in: Optional[list[str]] = None
422
417
  invite_org: Optional[str] = None
423
- invite_org__contains: Optional[List[str]] = None
424
- invite_org__in: Optional[List[str]] = None
418
+ invite_org__contains: Optional[list[str]] = None
419
+ invite_org__in: Optional[list[str]] = None
425
420
  inviter: Optional[str] = None
426
- inviter__contains: Optional[List[str]] = None
427
- inviter__in: Optional[List[str]] = None
421
+ inviter__contains: Optional[list[str]] = None
422
+ inviter__in: Optional[list[str]] = None
428
423
  is_signup: Optional[bool] = None
429
424
  require_mfa: Optional[bool] = None
430
425
  state: Optional[str] = None
431
- state__contains: Optional[List[str]] = None
432
- state__in: Optional[List[str]] = None
426
+ state__contains: Optional[list[str]] = None
427
+ state__in: Optional[list[str]] = None
433
428
 
434
429
 
435
430
  class UserInviteListRequest(APIRequestModel):
@@ -441,7 +436,7 @@ class UserInviteListRequest(APIRequestModel):
441
436
 
442
437
 
443
438
  class UserInviteListResult(PangeaResponseResult):
444
- invites: List[UserInvite]
439
+ invites: list[UserInvite]
445
440
 
446
441
 
447
442
  class UserInviteDeleteRequest(APIRequestModel):
@@ -468,7 +463,7 @@ class UserProfileGetResult(User):
468
463
 
469
464
 
470
465
  class UserProfileUpdateRequest(APIRequestModel):
471
- profile: Union[Profile, Dict[str, str]]
466
+ profile: Mapping[str, str]
472
467
  """Updates to a user profile."""
473
468
 
474
469
  id: Optional[str] = None
@@ -522,7 +517,7 @@ class ClientUserinfoRequest(APIRequestModel):
522
517
 
523
518
 
524
519
  class ClientJWKSResult(PangeaResponseResult):
525
- keys: List[Union[JWKec, JWKrsa, JWK]]
520
+ keys: list[Union[JWKec, JWKrsa, JWK]]
526
521
 
527
522
 
528
523
  class UserAuthenticatorsDeleteRequest(APIRequestModel):
@@ -555,7 +550,7 @@ class UserAuthenticatorsListRequest(APIRequestModel):
555
550
 
556
551
 
557
552
  class UserAuthenticatorsListResult(PangeaResponseResult):
558
- authenticators: List[Authenticator] = []
553
+ authenticators: list[Authenticator] = []
559
554
  """A list of authenticators."""
560
555
 
561
556
 
@@ -570,16 +565,16 @@ class FlowCompleteResult(PangeaResponseResult):
570
565
 
571
566
  class FlowChoiceItem(APIResponseModel):
572
567
  choice: str
573
- data: Dict = {}
568
+ data: dict = {}
574
569
 
575
570
 
576
571
  class CommonFlowResult(PangeaResponseResult):
577
572
  flow_id: str
578
- flow_type: List[str] = []
573
+ flow_type: list[str] = []
579
574
  email: Optional[str] = None
580
575
  disclaimer: Optional[str] = None
581
576
  flow_phase: str
582
- flow_choices: List[FlowChoiceItem] = []
577
+ flow_choices: list[FlowChoiceItem] = []
583
578
 
584
579
 
585
580
  class FlowChoice(enum.Enum):
@@ -609,7 +604,7 @@ class FlowRestartDataSMSOTP(APIRequestModel):
609
604
  phone: str
610
605
 
611
606
 
612
- FlowRestartData = Union[Dict, FlowRestartDataSMSOTP]
607
+ FlowRestartData = Union[dict, FlowRestartDataSMSOTP]
613
608
 
614
609
 
615
610
  class FlowRestartRequest(APIRequestModel):
@@ -625,7 +620,7 @@ class FlowRestartResult(CommonFlowResult):
625
620
  class FlowStartRequest(APIRequestModel):
626
621
  cb_uri: Optional[str] = None
627
622
  email: Optional[str] = None
628
- flow_types: Optional[List[FlowType]] = None
623
+ flow_types: Optional[list[FlowType]] = None
629
624
  invitation: Optional[str] = None
630
625
 
631
626
 
@@ -634,7 +629,7 @@ class FlowStartResult(CommonFlowResult):
634
629
 
635
630
 
636
631
  class FlowUpdateDataAgreements(APIRequestModel):
637
- agreed: List[str]
632
+ agreed: list[str]
638
633
 
639
634
 
640
635
  class FlowUpdateDataCaptcha(APIRequestModel):
@@ -655,7 +650,7 @@ class FlowUpdateDataPassword(APIRequestModel):
655
650
 
656
651
 
657
652
  class FlowUpdateDataProfile(APIRequestModel):
658
- profile: Union[Profile, Dict[str, str]]
653
+ profile: dict[str, str]
659
654
 
660
655
 
661
656
  class FlowUpdateDataProvisionalEnrollment(APIRequestModel):
@@ -695,7 +690,7 @@ class FlowUpdateDataVerifyEmail(APIRequestModel):
695
690
 
696
691
 
697
692
  FlowUpdateData = Union[
698
- Dict,
693
+ dict,
699
694
  FlowUpdateDataAgreements,
700
695
  FlowUpdateDataCaptcha,
701
696
  FlowUpdateDataEmailOTP,
@@ -734,31 +729,31 @@ class ClientSessionInvalidateResult(PangeaResponseResult):
734
729
 
735
730
  class SessionListFilter(APIRequestModel):
736
731
  active_token_id: Optional[str] = None
737
- active_token_id__contains: Optional[List[str]] = None
738
- 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
739
734
  created_at: Optional[str] = None
740
735
  created_at__gt: Optional[str] = None
741
736
  created_at__gte: Optional[str] = None
742
737
  created_at__lt: Optional[str] = None
743
738
  created_at__lte: Optional[str] = None
744
739
  email: Optional[str] = None
745
- email__contains: Optional[List[str]] = None
746
- email__in: Optional[List[str]] = None
740
+ email__contains: Optional[list[str]] = None
741
+ email__in: Optional[list[str]] = None
747
742
  expire: Optional[str] = None
748
743
  expire__gt: Optional[str] = None
749
744
  expire__gte: Optional[str] = None
750
745
  expire__lt: Optional[str] = None
751
746
  expire__lte: Optional[str] = None
752
747
  id: Optional[str] = None
753
- id__contains: Optional[List[str]] = None
754
- id__in: Optional[List[str]] = None
748
+ id__contains: Optional[list[str]] = None
749
+ id__in: Optional[list[str]] = None
755
750
  identity: Optional[str] = None
756
- identity__contains: Optional[List[str]] = None
757
- identity__in: Optional[List[str]] = None
758
- 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
759
754
  type: Optional[str] = None
760
- type__contains: Optional[List[str]] = None
761
- type__in: Optional[List[str]] = None
755
+ type__contains: Optional[list[str]] = None
756
+ type__in: Optional[list[str]] = None
762
757
 
763
758
 
764
759
  class ClientSessionListRequest(APIRequestModel):
@@ -776,19 +771,19 @@ class SessionItem(APIResponseModel):
776
771
  life: int
777
772
  expire: str
778
773
  email: str
779
- scopes: Optional[Scopes] = None
780
- profile: Union[Profile, Dict[str, str]]
774
+ scopes: Optional[list[Scope]] = None
775
+ profile: dict[str, str]
781
776
  created_at: str
782
777
  active_token: Optional[SessionToken] = None
783
778
 
784
779
 
785
780
  class ClientSessionListResults(PangeaResponseResult):
786
- sessions: List[SessionItem]
781
+ sessions: list[SessionItem]
787
782
  last: str
788
783
 
789
784
 
790
785
  class SessionListResults(PangeaResponseResult):
791
- sessions: List[SessionItem]
786
+ sessions: list[SessionItem]
792
787
  last: str
793
788
 
794
789
 
@@ -891,28 +886,61 @@ class AgreementListOrderBy(enum.Enum):
891
886
 
892
887
  class AgreementListFilter(APIRequestModel):
893
888
  active: Optional[bool] = None
894
- created_at: Optional[str] = None
895
- created_at__gt: Optional[str] = None
896
- created_at__gte: Optional[str] = None
897
- created_at__lt: Optional[str] = None
898
- created_at__lte: Optional[str] = None
899
- published_at: Optional[str] = None
900
- published_at__gt: Optional[str] = None
901
- published_at__gte: Optional[str] = None
902
- published_at__lt: Optional[str] = None
903
- published_at__lte: Optional[str] = None
904
- type: Optional[str] = None
905
- type__contains: Optional[List[str]] = None
906
- 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."""
907
900
  id: Optional[str] = None
908
- id__contains: Optional[List[str]] = None
909
- 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."""
910
906
  name: Optional[str] = None
911
- name__contains: Optional[List[str]] = None
912
- 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."""
913
922
  text: Optional[str] = None
914
- text__contains: Optional[List[str]] = None
915
- 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."""
916
944
 
917
945
 
918
946
  class AgreementListRequest(APIRequestModel):
@@ -924,7 +952,7 @@ class AgreementListRequest(APIRequestModel):
924
952
 
925
953
 
926
954
  class AgreementListResult(PangeaResponseResult):
927
- agreements: List[AgreementInfo]
955
+ agreements: list[AgreementInfo]
928
956
  count: int
929
957
  last: Optional[str] = None
930
958
 
@@ -944,14 +972,21 @@ class AgreementUpdateResult(AgreementInfo):
944
972
  class GroupInfo(PangeaResponseResult):
945
973
  """A group and its information"""
946
974
 
947
- id: str
975
+ id: GroupId
976
+ """An ID for a group"""
977
+
948
978
  name: str
949
979
  type: str
950
980
 
951
981
  description: Optional[str] = None
952
- attributes: Optional[Dict[str, str]] = None
953
- created_at: Optional[str] = None
954
- 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"""
955
990
 
956
991
 
957
992
  class GroupsFilter(APIRequestModel):
@@ -978,28 +1013,28 @@ class GroupsFilter(APIRequestModel):
978
1013
  id: Optional[str] = None
979
1014
  """Only records where id equals this value."""
980
1015
 
981
- id__contains: Optional[List[str]] = None
1016
+ id__contains: Optional[list[str]] = None
982
1017
  """Only records where id includes each substring."""
983
1018
 
984
- id__in: Optional[List[str]] = None
1019
+ id__in: Optional[list[str]] = None
985
1020
  """Only records where id equals one of the provided substrings."""
986
1021
 
987
1022
  name: Optional[str] = None
988
1023
  """Only records where name equals this value."""
989
1024
 
990
- name__contains: Optional[List[str]] = None
1025
+ name__contains: Optional[list[str]] = None
991
1026
  """Only records where name includes each substring."""
992
1027
 
993
- name__in: Optional[List[str]] = None
1028
+ name__in: Optional[list[str]] = None
994
1029
  """Only records where name equals one of the provided substrings."""
995
1030
 
996
1031
  type: Optional[str] = None
997
1032
  """Only records where type equals this value."""
998
1033
 
999
- type__contains: Optional[List[str]] = None
1034
+ type__contains: Optional[list[str]] = None
1000
1035
  """Only records where type includes each substring."""
1001
1036
 
1002
- type__in: Optional[List[str]] = None
1037
+ type__in: Optional[list[str]] = None
1003
1038
  """Only records where type equals one of the provided substrings."""
1004
1039
 
1005
1040
  updated_at: Optional[str] = None
@@ -1022,7 +1057,7 @@ class GroupsFilter(APIRequestModel):
1022
1057
 
1023
1058
 
1024
1059
  class GroupList(PangeaResponseResult):
1025
- groups: List[GroupInfo]
1060
+ groups: list[GroupInfo]
1026
1061
  """List of matching groups"""
1027
1062
 
1028
1063
  count: int
@@ -1030,6 +1065,6 @@ class GroupList(PangeaResponseResult):
1030
1065
 
1031
1066
 
1032
1067
  class GroupUserList(PangeaResponseResult):
1033
- users: List[User]
1068
+ users: list[User]
1034
1069
  count: int
1035
1070
  last: Optional[str] = None