Skip to content

afnio.tellurio.project

afnio.tellurio.project.Project

Represents a Tellurio Studio Project with detailed information.

A Project represents a workspace for organizing and managing related Runs. Each Project belongs to a namespace, which can be either an Organization or a User (personal Organization). The project contains metadata such as its unique identifier, display name, slug, creation date, last run date, visibility level, and the user's role within the project.

Source code in afnio/tellurio/project.py
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class Project:
    """
    Represents a [Tellurio Studio](https://platform.tellurio.ai/) Project
    with detailed information.

    A [`Project`][.] represents a workspace for organizing and managing related
    [`Run`][afnio.tellurio.run.Run]s. Each [`Project`][.] belongs to a namespace,
    which can be either an Organization or a User (personal Organization).
    The project contains metadata such as its unique identifier, display name,
    slug, creation date, last run date, visibility level, and the user's role
    within the project.
    """

    def __init__(
        self,
        uuid: str,
        display_name: str,
        slug: str,
        date_created: datetime,
        last_run_date: Optional[datetime],
        visibility: str,
        role: Optional[str],
        org_uuid: Optional[str],
        org_display_name: Optional[str],
        org_slug: Optional[str],
    ):
        """Initializes a `Project` instance.

        Args:
            uuid: The unique identifier of the project.
            display_name: The display name of the project.
            slug: The slug of the project.
            date_created: The date and time when the project was created.
            last_run_date: The date and time of the last [`Run`][afnio.tellurio.run.Run]
                in the project, or `None` if no runs exist.
            visibility: The visibility level of the project (e.g., `"RESTRICTED"`,
                `"TEAM"`, `"PUBLIC"`, `"OPEN"`).
            role: The user's role in the project (e.g., `"OWNER"`, `"PARTICIPANT"`),
                or `None` if not applicable.
            org_uuid: The unique identifier of the organization that owns the project.
            org_display_name: The display name of the organization that owns
                the project.
            org_slug: The slug of the organization that owns the project.
        """
        self.uuid = uuid
        self.display_name = display_name
        self.slug = slug
        self.date_created = date_created
        self.last_run_date = last_run_date
        self.visibility = visibility
        self.role = role
        self.org_uuid = org_uuid
        self.org_display_name = org_display_name
        self.org_slug = org_slug

    def __repr__(self):
        return (
            f"<Project uuid={self.uuid} display_name={self.display_name} "
            f"visibility={self.visibility} role={self.role}>"
        )

__init__(uuid, display_name, slug, date_created, last_run_date, visibility, role, org_uuid, org_display_name, org_slug)

Initializes a Project instance.

Parameters:

Name Type Description Default
uuid str

The unique identifier of the project.

required
display_name str

The display name of the project.

required
slug str

The slug of the project.

required
date_created datetime

The date and time when the project was created.

required
last_run_date datetime | None

The date and time of the last Run in the project, or None if no runs exist.

required
visibility str

The visibility level of the project (e.g., "RESTRICTED", "TEAM", "PUBLIC", "OPEN").

required
role str | None

The user's role in the project (e.g., "OWNER", "PARTICIPANT"), or None if not applicable.

required
org_uuid str | None

The unique identifier of the organization that owns the project.

required
org_display_name str | None

The display name of the organization that owns the project.

required
org_slug str | None

The slug of the organization that owns the project.

required
Source code in afnio/tellurio/project.py
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
def __init__(
    self,
    uuid: str,
    display_name: str,
    slug: str,
    date_created: datetime,
    last_run_date: Optional[datetime],
    visibility: str,
    role: Optional[str],
    org_uuid: Optional[str],
    org_display_name: Optional[str],
    org_slug: Optional[str],
):
    """Initializes a `Project` instance.

    Args:
        uuid: The unique identifier of the project.
        display_name: The display name of the project.
        slug: The slug of the project.
        date_created: The date and time when the project was created.
        last_run_date: The date and time of the last [`Run`][afnio.tellurio.run.Run]
            in the project, or `None` if no runs exist.
        visibility: The visibility level of the project (e.g., `"RESTRICTED"`,
            `"TEAM"`, `"PUBLIC"`, `"OPEN"`).
        role: The user's role in the project (e.g., `"OWNER"`, `"PARTICIPANT"`),
            or `None` if not applicable.
        org_uuid: The unique identifier of the organization that owns the project.
        org_display_name: The display name of the organization that owns
            the project.
        org_slug: The slug of the organization that owns the project.
    """
    self.uuid = uuid
    self.display_name = display_name
    self.slug = slug
    self.date_created = date_created
    self.last_run_date = last_run_date
    self.visibility = visibility
    self.role = role
    self.org_uuid = org_uuid
    self.org_display_name = org_display_name
    self.org_slug = org_slug

afnio.tellurio.project.get_project(namespace_slug, project_slug, client=None)

Retrieves a project by its slug in the specified namespace.

Parameters:

Name Type Description Default
namespace_slug str

The namespace slug where the project resides. It can be either an organization slug or a user slug.

required
project_slug str

The slug of the project to retrieve.

required
client TellurioClient | None

An instance of TellurioClient. If not provided, the default client will be used.

None

Returns:

Type Description
Project | None

A Project object representing the retrieved project or None if not found.

Raises:

Type Description
Exception

If an unexpected error occurs during the request.

Source code in afnio/tellurio/project.py
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def get_project(
    namespace_slug: str,
    project_slug: str,
    client: Optional[TellurioClient] = None,
) -> Optional[Project]:
    """Retrieves a project by its slug in the specified namespace.

    Args:
        namespace_slug: The namespace slug where the project resides. It can be
          either an organization slug or a user slug.
        project_slug: The slug of the project to retrieve.
        client: An instance of [`TellurioClient`][afnio.tellurio.client.TellurioClient].
            If not provided, the default client will be used.

    Returns:
        A Project object representing the retrieved project or `None` if not found.

    Raises:
        Exception: If an unexpected error occurs during the request.
    """
    client = client or get_default_clients()[0]

    # Define the endpoint
    endpoint = f"/api/v0/{namespace_slug}/projects/{project_slug}/"

    try:
        response = client.get(endpoint)

        if response.status_code == 200:
            data = response.json()
            logger.debug(f"Project retrieved successfully: {data}")

            # Parse date fields
            date_created = datetime.fromisoformat(
                data["date_created"].replace("Z", "+00:00")
            )
            last_run_date = (
                datetime.fromisoformat(data["last_run_date"].replace("Z", "+00:00"))
                if data.get("last_run_date")
                else None
            )

            # Create and return the Project object
            return Project(
                uuid=data["uuid"],
                display_name=data["display_name"],
                slug=data["slug"],
                date_created=date_created,
                last_run_date=last_run_date,
                visibility=data["visibility"],
                role=data.get("role"),
                org_uuid=data.get("org_uuid"),
                org_display_name=data.get("org_display_name"),
                org_slug=data.get("org_slug"),
            )
        elif response.status_code == 404:
            logger.debug(
                f"Project with slug '{project_slug}' "
                f"not found in namespace '{namespace_slug}'."
            )
            return None
        else:
            logger.error(
                f"Failed to retrieve project: {response.status_code} - {response.text}"
            )
            response.raise_for_status()
    except Exception as e:
        logger.error(f"An error occurred while retrieving the project: {e}")
        raise

afnio.tellurio.project.create_project(namespace_slug, display_name, visibility='TEAM', client=None)

Creates a new project in the specified namespace.

Parameters:

Name Type Description Default
namespace_slug str

The namespace slug where the project resides. It can be either an organization slug or a user slug.

required
display_name str

The display name of the project.

required
visibility str

The visibility of the project.

'TEAM'
client TellurioClient | None

An instance of TellurioClient. If not provided, the default client will be used.

None

Returns:

Type Description
Project

A Project object representing the created project.

Raises:

Type Description
Exception

If an unexpected error occurs during the request.

Source code in afnio/tellurio/project.py
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
def create_project(
    namespace_slug: str,
    display_name: str,
    visibility: str = "TEAM",
    client: Optional[TellurioClient] = None,
) -> Project:
    """Creates a new project in the specified namespace.

    Args:
        namespace_slug: The namespace slug where the project resides. It can be
          either an organization slug or a user slug.
        display_name: The display name of the project.
        visibility: The visibility of the project.
        client: An instance of [`TellurioClient`][afnio.tellurio.client.TellurioClient].
            If not provided, the default client will be used.

    Returns:
        A Project object representing the created project.

    Raises:
        Exception: If an unexpected error occurs during the request.
    """
    client = client or get_default_clients()[0]

    # Define the endpoint and payload
    endpoint = f"/api/v0/{namespace_slug}/projects/"
    payload = {
        "display_name": display_name,
        "visibility": visibility,
    }

    try:
        response = client.post(endpoint, json=payload)

        if response.status_code == 201:
            data = response.json()
            logger.debug(f"Project created successfully: {data}")

            # Parse date fields
            date_created = datetime.fromisoformat(
                data["date_created"].replace("Z", "+00:00")
            )
            last_run_date = (
                datetime.fromisoformat(data["last_run_date"].replace("Z", "+00:00"))
                if data.get("last_run_date")
                else None
            )

            # Create and return the Project object
            return Project(
                uuid=data["uuid"],
                display_name=data["display_name"],
                slug=data["slug"],
                date_created=date_created,
                last_run_date=last_run_date,
                visibility=data["visibility"],
                role=data["role"],
                org_uuid=data["org_uuid"],
                org_display_name=data["org_display_name"],
                org_slug=data["org_slug"],
            )
        else:
            logger.error(
                f"Failed to create project: {response.status_code} - {response.text}"
            )
            response.raise_for_status()
    except Exception as e:
        logger.error(f"An error occurred while creating the project: {e}")
        raise

afnio.tellurio.project.delete_project(namespace_slug, project_slug, client=None)

Deletes a project by the specified namespace.

Parameters:

Name Type Description Default
namespace_slug str

The namespace slug where the project resides. It can be either an organization slug or a user slug.

required
project_slug str

The slug of the project to delete.

required
client TellurioClient | None

An instance of TellurioClient. If not provided, the default client will be used.

None

Raises:

Type Description
Exception

If an unexpected error occurs during the request.

Source code in afnio/tellurio/project.py
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
def delete_project(
    namespace_slug: str,
    project_slug: str,
    client: Optional[TellurioClient] = None,
) -> None:
    """Deletes a project by the specified namespace.

    Args:
        namespace_slug: The namespace slug where the project resides. It can be
          either an organization slug or a user slug.
        project_slug: The slug of the project to delete.
        client: An instance of [`TellurioClient`][afnio.tellurio.client.TellurioClient].
            If not provided, the default client will be used.

    Raises:
        Exception: If an unexpected error occurs during the request.
    """
    client = client or get_default_clients()[0]

    # Define the endpoint
    endpoint = f"/api/v0/{namespace_slug}/projects/{project_slug}/"

    try:
        response = client.delete(endpoint)

        if response.status_code == 204:
            logger.debug(f"Project '{project_slug}' deleted successfully.")
        else:
            logger.error(
                f"Failed to delete project: {response.status_code} - {response.text}"
            )
            response.raise_for_status()
    except Exception as e:
        logger.error(f"An error occurred while deleting the project: {e}")
        raise