Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,5 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v5

2 changes: 1 addition & 1 deletion .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ jobs:

- name: Create issue on failure
if: failure()
uses: actions/github-script@v8
uses: actions/github-script@v9
with:
script: |
github.rest.issues.create({
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ jobs:
EOF

- name: Create Release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v3
with:
name: v${{ steps.version.outputs.version }}
body_path: release_notes.md
Expand Down
13 changes: 13 additions & 0 deletions src/devrev/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
AsyncRecommendationsService,
RecommendationsService,
)
from devrev.services.rev_orgs import AsyncRevOrgsService, RevOrgsService
from devrev.services.rev_users import AsyncRevUsersService, RevUsersService
from devrev.services.search import AsyncSearchService, SearchService
from devrev.services.slas import AsyncSlasService, SlasService
Expand Down Expand Up @@ -160,6 +161,7 @@ def __init__(
self._groups = GroupsService(self._http)
self._links = LinksService(self._http)
self._parts = PartsService(self._http)
self._rev_orgs = RevOrgsService(self._http)
self._rev_users = RevUsersService(self._http)
self._slas = SlasService(self._http)
self._tags = TagsService(self._http)
Expand Down Expand Up @@ -242,6 +244,11 @@ def parts(self) -> PartsService:
"""Access the Parts service."""
return self._parts

@property
def rev_orgs(self) -> RevOrgsService:
"""Access the Rev Orgs service for managing revenue organizations."""
return self._rev_orgs

@property
def rev_users(self) -> RevUsersService:
"""Access the Rev Users service."""
Expand Down Expand Up @@ -482,6 +489,7 @@ def __init__(
self._groups = AsyncGroupsService(self._http)
self._links = AsyncLinksService(self._http)
self._parts = AsyncPartsService(self._http)
self._rev_orgs = AsyncRevOrgsService(self._http)
self._rev_users = AsyncRevUsersService(self._http)
self._slas = AsyncSlasService(self._http)
self._tags = AsyncTagsService(self._http)
Expand Down Expand Up @@ -564,6 +572,11 @@ def parts(self) -> AsyncPartsService:
"""Access the Parts service."""
return self._parts

@property
def rev_orgs(self) -> AsyncRevOrgsService:
"""Access the Rev Orgs service for managing revenue organizations."""
return self._rev_orgs

@property
def rev_users(self) -> AsyncRevUsersService:
"""Access the Rev Users service."""
Expand Down
35 changes: 35 additions & 0 deletions src/devrev/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,20 @@
MessageRole,
TokenUsage,
)
from devrev.models.rev_orgs import (
RevOrg,
RevOrgsCreateRequest,
RevOrgsCreateResponse,
RevOrgsDeleteRequest,
RevOrgsDeleteResponse,
RevOrgsGetRequest,
RevOrgsGetResponse,
RevOrgsListRequest,
RevOrgsListResponse,
RevOrgSummary,
RevOrgsUpdateRequest,
RevOrgsUpdateResponse,
)
from devrev.models.rev_users import (
RevUser,
RevUsersAssociationsAddRequest,
Expand Down Expand Up @@ -694,6 +708,19 @@
"ChatCompletionResponse",
"GetReplyRequest",
"GetReplyResponse",
# Rev Orgs
"RevOrg",
"RevOrgSummary",
"RevOrgsCreateRequest",
"RevOrgsCreateResponse",
"RevOrgsGetRequest",
"RevOrgsGetResponse",
"RevOrgsListRequest",
"RevOrgsListResponse",
"RevOrgsUpdateRequest",
"RevOrgsUpdateResponse",
"RevOrgsDeleteRequest",
"RevOrgsDeleteResponse",
# Rev Users
"RevUser",
"RevUserSummary",
Expand Down Expand Up @@ -889,6 +916,12 @@
AccountsListResponse as _AccountsListResponse,
)
from devrev.models.base import TagWithValue as _TagWithValue # noqa: F811
from devrev.models.rev_orgs import ( # noqa: F811
RevOrg as _RevOrg,
)
from devrev.models.rev_orgs import (
RevOrgsListResponse as _RevOrgsListResponse,
)
from devrev.models.works import ( # noqa: F811
Work as _Work,
)
Expand All @@ -904,6 +937,8 @@
_Account.model_rebuild()
_AccountsListResponse.model_rebuild()
_AccountsExportResponse.model_rebuild()
_RevOrg.model_rebuild()
_RevOrgsListResponse.model_rebuild()
_Work.model_rebuild()
_WorksListResponse.model_rebuild()
_WorksExportResponse.model_rebuild()
159 changes: 159 additions & 0 deletions src/devrev/models/rev_orgs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
"""Rev Org models for DevRev SDK.

This module contains Pydantic models for Rev Org (Revenue Organization)-related
API operations. Rev Orgs represent customer organizations in DevRev.
"""

from __future__ import annotations

from datetime import datetime
from typing import Any

from pydantic import Field

from devrev.models.accounts import AccountSummary
from devrev.models.base import (
CustomSchemaSpec,
DateFilter,
DevRevBaseModel,
DevRevResponseModel,
PaginatedResponse,
TagWithValue,
UserSummary,
)


class RevOrg(DevRevResponseModel):
"""DevRev Rev Org (Revenue Organization) model.

Represents a customer organization in DevRev, typically associated
with an Account.
"""

id: str = Field(..., description="Rev org ID")
display_id: str | None = Field(default=None, description="Human-readable display ID")
display_name: str | None = Field(default=None, description="Rev org display name")
description: str | None = Field(default=None, description="Rev org description")
account: AccountSummary | None = Field(default=None, description="Associated account")
created_date: datetime | None = Field(default=None, description="Creation timestamp")
modified_date: datetime | None = Field(default=None, description="Last modification timestamp")
created_by: UserSummary | None = Field(
default=None, description="User who created this rev org"
)
modified_by: UserSummary | None = Field(
default=None, description="User who last modified this rev org"
)
domain: str | None = Field(default=None, description="Domain")
external_ref: str | None = Field(default=None, description="External reference identifier")
external_refs: list[str] | None = Field(default=None, description="External references")
custom_fields: dict[str, Any] | None = Field(default=None, description="Custom fields")
sub_type: str | None = Field(default=None, description="Rev org subtype")
tags: list[TagWithValue] | None = Field(default=None, description="Tags")
tier: str | None = Field(default=None, description="Rev org tier")
artifacts: list[str] | None = Field(default=None, description="Associated artifact IDs")


class RevOrgSummary(DevRevResponseModel):
"""Summary of a Rev Org for list/reference operations."""

id: str = Field(..., description="Rev org ID")
display_id: str | None = Field(default=None, description="Human-readable display ID")
display_name: str | None = Field(default=None, description="Rev org display name")


# Request Models


class RevOrgsGetRequest(DevRevBaseModel):
"""Request to get a rev org."""

id: str | None = Field(default=None, description="Rev org ID")
account: str | None = Field(
default=None, description="Account ID to get the default rev org for"
)


class RevOrgsListRequest(DevRevBaseModel):
"""Request to list rev orgs."""

account: list[str] | None = Field(default=None, description="Filter by account IDs")
created_by: list[str] | None = Field(default=None, description="Filter by creator user IDs")
created_date: DateFilter | None = Field(default=None, description="Filter by creation date")
cursor: str | None = Field(default=None, description="Pagination cursor")
display_name: list[str] | None = Field(default=None, description="Filter by display names")
domains: list[str] | None = Field(default=None, description="Filter by domains")
external_refs: list[str] | None = Field(default=None, description="Filter by external refs")
limit: int | None = Field(default=None, ge=1, le=100, description="Max results to return")
modified_date: DateFilter | None = Field(
default=None, description="Filter by modification date"
)
owned_by: list[str] | None = Field(default=None, description="Filter by owner user IDs")
tags: list[str] | None = Field(default=None, description="Filter by tag IDs")


class RevOrgsCreateRequest(DevRevBaseModel):
"""Request to create a rev org."""

display_name: str = Field(..., description="Rev org display name", min_length=1, max_length=256)
account: str = Field(..., description="Parent account ID")
description: str | None = Field(default=None, description="Rev org description")
external_ref: str | None = Field(default=None, description="External reference identifier")
tier: str | None = Field(default=None, description="Rev org tier")
custom_fields: dict[str, Any] | None = Field(default=None, description="Custom fields")
custom_schema_spec: CustomSchemaSpec | None = Field(
default=None, description="Custom schema spec"
)


class RevOrgsUpdateRequest(DevRevBaseModel):
"""Request to update a rev org."""

id: str = Field(..., description="Rev org ID")
display_name: str | None = Field(default=None, description="New display name")
description: str | None = Field(default=None, description="New description")
tier: str | None = Field(default=None, description="New tier")
custom_fields: dict[str, Any] | None = Field(
default=None, description="Custom fields to update"
)
artifacts: dict[str, Any] | None = Field(
default=None, description="Artifact set/remove operations"
)


class RevOrgsDeleteRequest(DevRevBaseModel):
"""Request to delete a rev org."""

id: str = Field(..., description="Rev org ID to delete")


# Response Models


class RevOrgsGetResponse(DevRevResponseModel):
"""Response from getting a rev org."""

rev_org: RevOrg = Field(..., description="Retrieved rev org")


class RevOrgsListResponse(PaginatedResponse):
"""Response from listing rev orgs."""

rev_orgs: list[RevOrg] = Field(..., description="List of rev orgs")


class RevOrgsCreateResponse(DevRevResponseModel):
"""Response from creating a rev org."""

rev_org: RevOrg = Field(..., description="Created rev org")


class RevOrgsUpdateResponse(DevRevResponseModel):
"""Response from updating a rev org."""

rev_org: RevOrg = Field(..., description="Updated rev org")


class RevOrgsDeleteResponse(DevRevResponseModel):
"""Response from deleting a rev org."""

pass # Empty response body
4 changes: 4 additions & 0 deletions src/devrev/services/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
AsyncRecommendationsService,
RecommendationsService,
)
from devrev.services.rev_orgs import AsyncRevOrgsService, RevOrgsService
from devrev.services.rev_users import AsyncRevUsersService, RevUsersService
from devrev.services.search import AsyncSearchService, SearchService
from devrev.services.slas import AsyncSlasService, SlasService
Expand Down Expand Up @@ -99,6 +100,9 @@
# Recommendations
"RecommendationsService",
"AsyncRecommendationsService",
# Rev Orgs
"RevOrgsService",
"AsyncRevOrgsService",
# Rev Users
"RevUsersService",
"AsyncRevUsersService",
Expand Down
Loading
Loading