devrev-Python-SDK 2.8.0__py3-none-any.whl → 2.9.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.
devrev/models/articles.py CHANGED
@@ -9,9 +9,11 @@ from typing import Any
9
9
  from pydantic import Field
10
10
 
11
11
  from devrev.models.base import (
12
+ CustomSchemaSpec,
12
13
  DevRevBaseModel,
13
14
  DevRevResponseModel,
14
15
  PaginatedResponse,
16
+ SetTagWithValue,
15
17
  UserSummary,
16
18
  )
17
19
 
@@ -22,6 +24,74 @@ class ArticleStatus(StrEnum):
22
24
  DRAFT = "draft"
23
25
  PUBLISHED = "published"
24
26
  ARCHIVED = "archived"
27
+ REVIEW_NEEDED = "review_needed"
28
+
29
+
30
+ class ArticleAccessLevel(StrEnum):
31
+ """Article access level enumeration."""
32
+
33
+ EXTERNAL = "external"
34
+ INTERNAL = "internal"
35
+ PRIVATE = "private"
36
+ PUBLIC = "public"
37
+ RESTRICTED = "restricted"
38
+
39
+
40
+ class ArticleType(StrEnum):
41
+ """Article type enumeration."""
42
+
43
+ ARTICLE = "article"
44
+ CONTENT_BLOCK = "content_block"
45
+ PAGE = "page"
46
+
47
+
48
+ class ArticleContentFormat(StrEnum):
49
+ """Article content format enumeration."""
50
+
51
+ DRDFV2 = "drdfv2"
52
+ RT = "rt"
53
+
54
+
55
+ class CursorMode(StrEnum):
56
+ """Cursor pagination direction."""
57
+
58
+ AFTER = "after"
59
+ BEFORE = "before"
60
+
61
+
62
+ class ArticleScope(DevRevResponseModel):
63
+ """Scope/visibility level of an article.
64
+
65
+ Values observed from the API:
66
+ - ``{"id": 1, "label": "internal", "ordinal": 1}``
67
+ - ``{"id": 2, "label": "external", "ordinal": 2}``
68
+ """
69
+
70
+ id: int = Field(..., description="Scope numeric ID (1=internal, 2=external)")
71
+ label: str | None = Field(default=None, description="Human-readable label")
72
+ ordinal: int | None = Field(default=None, description="Sort ordinal")
73
+
74
+
75
+ class ArticleTagSummary(DevRevResponseModel):
76
+ """Tag summary as returned within an article's ``tags`` array."""
77
+
78
+ id: str = Field(..., description="Tag DON ID")
79
+ name: str | None = Field(default=None, description="Tag name")
80
+ display_id: str | None = Field(default=None, description="Tag display ID")
81
+
82
+
83
+ class ArticleTagWithValue(DevRevResponseModel):
84
+ """Tag entry on an article, wrapping the tag summary with an optional value."""
85
+
86
+ tag: ArticleTagSummary = Field(..., description="Tag details")
87
+ value: str | None = Field(default=None, description="Optional tag value")
88
+
89
+
90
+ class ArticleParentSummary(DevRevResponseModel):
91
+ """Summary of a parent directory (collection) for an article."""
92
+
93
+ id: str = Field(..., description="Directory DON ID")
94
+ display_id: str | None = Field(default=None, description="Display ID")
25
95
 
26
96
 
27
97
  class Article(DevRevResponseModel):
@@ -36,6 +106,7 @@ class Article(DevRevResponseModel):
36
106
  title: str = Field(..., description="Article title")
37
107
  description: str | None = Field(default=None, description="Article description/body")
38
108
  status: ArticleStatus | None = Field(default=None, description="Article status")
109
+ article_type: str | None = Field(default=None, description="Article type (article, page, etc.)")
39
110
  authored_by: list[UserSummary] | None = Field(
40
111
  default=None, description="Authors of the article (API returns array, not single object)"
41
112
  )
@@ -45,6 +116,19 @@ class Article(DevRevResponseModel):
45
116
  resource: dict[str, Any] | None = Field(
46
117
  default=None, description="Resource configuration including artifact references"
47
118
  )
119
+ applies_to_parts: list[dict[str, Any]] | None = Field(
120
+ default=None, description="Parts this article applies to"
121
+ )
122
+ scope: ArticleScope | None = Field(
123
+ default=None, description="Visibility scope (internal/external)"
124
+ )
125
+ tags: list[ArticleTagWithValue] | None = Field(
126
+ default=None, description="Tags applied to the article"
127
+ )
128
+ parent: ArticleParentSummary | None = Field(
129
+ default=None, description="Parent directory/collection"
130
+ )
131
+ language: str | None = Field(default=None, description="Language code (e.g., 'en')")
48
132
 
49
133
 
50
134
  class ArticleSummary(DevRevResponseModel):
@@ -67,8 +151,19 @@ class ArticleWithContent(DevRevResponseModel):
67
151
  content_version: str | None = Field(default=None, description="Artifact version")
68
152
 
69
153
 
154
+ class SetSharedWithMembership(DevRevBaseModel):
155
+ """Shared-with membership for articles."""
156
+
157
+ member: str = Field(..., description="Member ID")
158
+ role: str | None = Field(default=None, description="Role")
159
+
160
+
70
161
  class ArticlesCreateRequest(DevRevBaseModel):
71
- """Request to create an article."""
162
+ """Request to create an article.
163
+
164
+ Supports associating the article with parts, a parent collection (directory),
165
+ scope (internal/external), and tags at creation time.
166
+ """
72
167
 
73
168
  title: str = Field(..., description="Article title")
74
169
  description: str | None = Field(default=None, description="Article description/body")
@@ -77,6 +172,17 @@ class ArticlesCreateRequest(DevRevBaseModel):
77
172
  resource: dict[str, Any] = Field(
78
173
  default_factory=dict, description="Resource configuration for the article"
79
174
  )
175
+ applies_to_parts: list[str] | None = Field(
176
+ default=None, description="List of part IDs this article applies to"
177
+ )
178
+ scope: int | None = Field(default=None, description="Visibility scope: 1=internal, 2=external")
179
+ tags: list[SetTagWithValue] | None = Field(
180
+ default=None, description="Tags to apply (list of {'id': 'tag_id', 'value': ...})"
181
+ )
182
+ parent: str | None = Field(default=None, description="Parent directory/collection DON ID")
183
+ article_type: str | None = Field(
184
+ default=None, description="Article type: 'article' (default), 'page', 'content_block'"
185
+ )
80
186
 
81
187
 
82
188
  class ArticlesGetRequest(DevRevBaseModel):
@@ -91,11 +197,65 @@ class ArticlesDeleteRequest(DevRevBaseModel):
91
197
  id: str = Field(..., description="Article ID to delete")
92
198
 
93
199
 
200
+ class ArticlesListRequestSharedWith(DevRevBaseModel):
201
+ """Shared-with filter for listing articles."""
202
+
203
+ member: str | None = Field(default=None, description="Member ID filter")
204
+ role: str | None = Field(default=None, description="Role filter")
205
+
206
+
94
207
  class ArticlesListRequest(DevRevBaseModel):
95
208
  """Request to list articles."""
96
209
 
97
210
  cursor: str | None = Field(default=None, description="Pagination cursor")
98
211
  limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
212
+ applies_to_parts: list[str] | None = Field(default=None, description="Filter by part IDs")
213
+ article_type: list[ArticleType] | None = Field(
214
+ default=None, description="Filter by article types"
215
+ )
216
+ authored_by: list[str] | None = Field(default=None, description="Filter by author user IDs")
217
+ brands: list[str] | None = Field(default=None, description="Filter by brand IDs")
218
+ created_by: list[str] | None = Field(default=None, description="Filter by creator user IDs")
219
+ mode: CursorMode | None = Field(default=None, description="Cursor pagination direction")
220
+ modified_by: list[str] | None = Field(default=None, description="Filter by modifier user IDs")
221
+ owned_by: list[str] | None = Field(default=None, description="Filter by owner user IDs")
222
+ parent: list[str] | None = Field(default=None, description="Filter by parent article IDs")
223
+ scope: list[int] | None = Field(default=None, description="Filter by scope values")
224
+ shared_with: ArticlesListRequestSharedWith | None = Field(
225
+ default=None, description="Filter by shared-with membership"
226
+ )
227
+ status: list[ArticleStatus] | None = Field(default=None, description="Filter by article status")
228
+ tags: list[str] | None = Field(default=None, description="Filter by tag IDs")
229
+
230
+
231
+ class ArticlesUpdateRequestOwnedBy(DevRevBaseModel):
232
+ """Owned-by update for articles."""
233
+
234
+ set: list[str] | None = Field(default=None, description="Set owner IDs")
235
+
236
+
237
+ class ArticlesUpdateRequestAuthoredBy(DevRevBaseModel):
238
+ """Authored-by update for articles."""
239
+
240
+ set: list[str] | None = Field(default=None, description="Set author IDs")
241
+
242
+
243
+ class ArticlesUpdateRequestAliases(DevRevBaseModel):
244
+ """Aliases update for articles."""
245
+
246
+ set: list[str] | None = Field(default=None, description="Set aliases")
247
+
248
+
249
+ class ArticlesUpdateRequestAppliesToParts(DevRevBaseModel):
250
+ """Applies-to-parts update for articles."""
251
+
252
+ set: list[str] | None = Field(default=None, description="Set part IDs")
253
+
254
+
255
+ class ArticlesUpdateRequestTags(DevRevBaseModel):
256
+ """Tags update for articles."""
257
+
258
+ set: list[SetTagWithValue] | None = Field(default=None, description="Set tags")
99
259
 
100
260
 
101
261
  class ArticlesUpdateRequest(DevRevBaseModel):
@@ -105,6 +265,38 @@ class ArticlesUpdateRequest(DevRevBaseModel):
105
265
  title: str | None = Field(default=None, description="New title")
106
266
  description: str | None = Field(default=None, description="New description/body")
107
267
  status: ArticleStatus | None = Field(default=None, description="New status")
268
+ access_level: ArticleAccessLevel | None = Field(default=None, description="New access level")
269
+ aliases: ArticlesUpdateRequestAliases | None = Field(default=None, description="New aliases")
270
+ applies_to_parts: ArticlesUpdateRequestAppliesToParts | None = Field(
271
+ default=None, description="New applies-to-parts"
272
+ )
273
+ authored_by: ArticlesUpdateRequestAuthoredBy | None = Field(
274
+ default=None, description="New authored-by"
275
+ )
276
+ brand: str | None = Field(default=None, description="New brand ID")
277
+ content_format: ArticleContentFormat | None = Field(
278
+ default=None, description="New content format"
279
+ )
280
+ custom_fields: dict[str, Any] | None = Field(default=None, description="Custom fields")
281
+ custom_schema_spec: CustomSchemaSpec | None = Field(
282
+ default=None, description="Custom schema spec"
283
+ )
284
+ language: str | None = Field(default=None, description="New language code")
285
+ notify: bool | None = Field(default=None, description="Send notifications")
286
+ owned_by: ArticlesUpdateRequestOwnedBy | None = Field(default=None, description="New owned-by")
287
+ parent: str | None = Field(default=None, description="New parent article ID")
288
+ published_version: str | None = Field(default=None, description="Published version")
289
+ release_notes: str | None = Field(default=None, description="New release notes")
290
+ artifacts: dict[str, Any] | None = Field(
291
+ default=None,
292
+ description="Artifacts update using set wrapper, e.g. {'set': ['artifact_id']}",
293
+ )
294
+ resource: dict[str, Any] | None = Field(
295
+ default=None,
296
+ description="Resource configuration (read-only on updates, use artifacts instead)",
297
+ )
298
+ tags: ArticlesUpdateRequestTags | None = Field(default=None, description="New tags")
299
+ url: str | None = Field(default=None, description="Article URL")
108
300
 
109
301
 
110
302
  class ArticlesCreateResponse(DevRevResponseModel):
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from datetime import datetime
6
+ from typing import Any
6
7
 
7
8
  from pydantic import Field
8
9
 
@@ -13,7 +14,10 @@ class Artifact(DevRevResponseModel):
13
14
  """DevRev Artifact model."""
14
15
 
15
16
  id: str = Field(..., description="Artifact ID")
16
- created_by: str | None = Field(default=None, description="Creator user ID")
17
+ created_by: dict[str, Any] | str | None = Field(
18
+ default=None,
19
+ description="Creator - may be a user ID string or a user object dict",
20
+ )
17
21
  created_date: datetime | None = Field(default=None, description="Creation timestamp")
18
22
  file_name: str | None = Field(default=None, description="Original file name")
19
23
  file_type: str | None = Field(default=None, description="MIME type of the file")
@@ -72,9 +76,7 @@ class ArtifactGetResponse(DevRevResponseModel):
72
76
  class ArtifactListRequest(DevRevBaseModel):
73
77
  """Request to list artifacts."""
74
78
 
75
- parent_id: str | None = Field(
76
- default=None, description="Filter artifacts by parent object ID"
77
- )
79
+ parent_id: str | None = Field(default=None, description="Filter artifacts by parent object ID")
78
80
 
79
81
 
80
82
  class ArtifactListResponse(PaginatedResponse):