Skip to content

Commit a30e2a7

Browse files
committed
Created crud sdk for vision event use-case
1 parent 0080381 commit a30e2a7

4 files changed

Lines changed: 437 additions & 0 deletions

File tree

roboflow/adapters/vision_events_api.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,97 @@ def get_custom_metadata_schema(api_key: str, use_case_id: str) -> dict:
130130
return response.json()
131131

132132

133+
def create_use_case(api_key: str, name: str) -> dict:
134+
"""Create a new vision event use case.
135+
136+
Args:
137+
api_key: Roboflow API key.
138+
name: Human-readable name for the use case.
139+
140+
Returns:
141+
Parsed JSON response with ``id`` and ``name``.
142+
143+
Raises:
144+
RoboflowError: On non-201 response status codes.
145+
"""
146+
response = requests.post(
147+
f"{_BASE}/use-cases",
148+
json={"name": name},
149+
headers=_auth_headers(api_key),
150+
)
151+
if response.status_code != 201:
152+
raise RoboflowError(response.text)
153+
return response.json()
154+
155+
156+
def rename_use_case(api_key: str, use_case_id: str, name: str) -> dict:
157+
"""Rename an existing vision event use case.
158+
159+
Args:
160+
api_key: Roboflow API key.
161+
use_case_id: Use case identifier.
162+
name: New name for the use case.
163+
164+
Returns:
165+
Parsed JSON response with ``id`` and ``name``.
166+
167+
Raises:
168+
RoboflowError: On non-200 response status codes.
169+
"""
170+
response = requests.put(
171+
f"{_BASE}/use-cases/{use_case_id}",
172+
json={"name": name},
173+
headers=_auth_headers(api_key),
174+
)
175+
if response.status_code != 200:
176+
raise RoboflowError(response.text)
177+
return response.json()
178+
179+
180+
def archive_use_case(api_key: str, use_case_id: str) -> dict:
181+
"""Archive a vision event use case.
182+
183+
Args:
184+
api_key: Roboflow API key.
185+
use_case_id: Use case identifier.
186+
187+
Returns:
188+
Parsed JSON response with ``success``.
189+
190+
Raises:
191+
RoboflowError: On non-200 response status codes.
192+
"""
193+
response = requests.post(
194+
f"{_BASE}/use-cases/{use_case_id}/archive",
195+
headers=_auth_headers(api_key),
196+
)
197+
if response.status_code != 200:
198+
raise RoboflowError(response.text)
199+
return response.json()
200+
201+
202+
def unarchive_use_case(api_key: str, use_case_id: str) -> dict:
203+
"""Unarchive a vision event use case.
204+
205+
Args:
206+
api_key: Roboflow API key.
207+
use_case_id: Use case identifier.
208+
209+
Returns:
210+
Parsed JSON response with ``success``.
211+
212+
Raises:
213+
RoboflowError: On non-200 response status codes.
214+
"""
215+
response = requests.post(
216+
f"{_BASE}/use-cases/{use_case_id}/unarchive",
217+
headers=_auth_headers(api_key),
218+
)
219+
if response.status_code != 200:
220+
raise RoboflowError(response.text)
221+
return response.json()
222+
223+
133224
def upload_image(
134225
api_key: str,
135226
image_path: str,

roboflow/cli/handlers/vision_events.py

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,139 @@ def _use_cases(args) -> None: # noqa: ANN001
218218
output(args, result, text="\n".join(lines))
219219

220220

221+
# ---------------------------------------------------------------------------
222+
# create-use-case
223+
# ---------------------------------------------------------------------------
224+
225+
226+
@vision_events_app.command("create-use-case")
227+
def create_use_case(
228+
ctx: typer.Context,
229+
name: Annotated[str, typer.Argument(help="Name for the new use case")],
230+
) -> None:
231+
"""Create a new vision event use case."""
232+
args = ctx_to_args(ctx, name=name)
233+
_create_use_case(args)
234+
235+
236+
def _create_use_case(args) -> None: # noqa: ANN001
237+
from roboflow.adapters import vision_events_api
238+
from roboflow.adapters.rfapi import RoboflowError
239+
from roboflow.cli._output import output, output_error
240+
241+
api_key = _resolve(args)
242+
if api_key is None:
243+
return
244+
245+
try:
246+
result = vision_events_api.create_use_case(api_key, args.name)
247+
except RoboflowError as exc:
248+
output_error(args, str(exc))
249+
return
250+
251+
output(args, result, text=f"Created use case {result.get('id', '')} ({result.get('name', '')})")
252+
253+
254+
# ---------------------------------------------------------------------------
255+
# rename-use-case
256+
# ---------------------------------------------------------------------------
257+
258+
259+
@vision_events_app.command("rename-use-case")
260+
def rename_use_case(
261+
ctx: typer.Context,
262+
use_case: Annotated[str, typer.Argument(help="Use case identifier")],
263+
name: Annotated[str, typer.Option("-n", "--name", help="New name for the use case")],
264+
) -> None:
265+
"""Rename an existing vision event use case."""
266+
args = ctx_to_args(ctx, use_case=use_case, name=name)
267+
_rename_use_case(args)
268+
269+
270+
def _rename_use_case(args) -> None: # noqa: ANN001
271+
from roboflow.adapters import vision_events_api
272+
from roboflow.adapters.rfapi import RoboflowError
273+
from roboflow.cli._output import output, output_error
274+
275+
api_key = _resolve(args)
276+
if api_key is None:
277+
return
278+
279+
try:
280+
result = vision_events_api.rename_use_case(api_key, args.use_case, args.name)
281+
except RoboflowError as exc:
282+
output_error(args, str(exc))
283+
return
284+
285+
output(args, result, text=f"Renamed use case {result.get('id', '')} to {result.get('name', '')}")
286+
287+
288+
# ---------------------------------------------------------------------------
289+
# archive-use-case
290+
# ---------------------------------------------------------------------------
291+
292+
293+
@vision_events_app.command("archive-use-case")
294+
def archive_use_case(
295+
ctx: typer.Context,
296+
use_case: Annotated[str, typer.Argument(help="Use case identifier")],
297+
) -> None:
298+
"""Archive a vision event use case."""
299+
args = ctx_to_args(ctx, use_case=use_case)
300+
_archive_use_case(args)
301+
302+
303+
def _archive_use_case(args) -> None: # noqa: ANN001
304+
from roboflow.adapters import vision_events_api
305+
from roboflow.adapters.rfapi import RoboflowError
306+
from roboflow.cli._output import output, output_error
307+
308+
api_key = _resolve(args)
309+
if api_key is None:
310+
return
311+
312+
try:
313+
result = vision_events_api.archive_use_case(api_key, args.use_case)
314+
except RoboflowError as exc:
315+
output_error(args, str(exc))
316+
return
317+
318+
output(args, result, text=f"Archived use case {args.use_case}")
319+
320+
321+
# ---------------------------------------------------------------------------
322+
# unarchive-use-case
323+
# ---------------------------------------------------------------------------
324+
325+
326+
@vision_events_app.command("unarchive-use-case")
327+
def unarchive_use_case(
328+
ctx: typer.Context,
329+
use_case: Annotated[str, typer.Argument(help="Use case identifier")],
330+
) -> None:
331+
"""Unarchive a vision event use case."""
332+
args = ctx_to_args(ctx, use_case=use_case)
333+
_unarchive_use_case(args)
334+
335+
336+
def _unarchive_use_case(args) -> None: # noqa: ANN001
337+
from roboflow.adapters import vision_events_api
338+
from roboflow.adapters.rfapi import RoboflowError
339+
from roboflow.cli._output import output, output_error
340+
341+
api_key = _resolve(args)
342+
if api_key is None:
343+
return
344+
345+
try:
346+
result = vision_events_api.unarchive_use_case(api_key, args.use_case)
347+
except RoboflowError as exc:
348+
output_error(args, str(exc))
349+
return
350+
351+
output(args, result, text=f"Unarchived use case {args.use_case}")
352+
353+
221354
# ---------------------------------------------------------------------------
222355
# metadata-schema
223356
# ---------------------------------------------------------------------------

roboflow/core/workspace.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,81 @@ def list_vision_event_use_cases(self, status: Optional[str] = None) -> dict:
11401140
result["useCases"] = result["solutions"]
11411141
return result
11421142

1143+
def create_vision_event_use_case(self, name: str) -> dict:
1144+
"""Create a new vision event use case.
1145+
1146+
Args:
1147+
name: Human-readable name for the use case.
1148+
1149+
Returns:
1150+
Dict with ``id`` and ``name``.
1151+
1152+
Example:
1153+
>>> ws = rf.workspace()
1154+
>>> result = ws.create_vision_event_use_case("manufacturing-qa")
1155+
>>> use_case_id = result["id"]
1156+
"""
1157+
return vision_events_api.create_use_case(
1158+
api_key=self.__api_key,
1159+
name=name,
1160+
)
1161+
1162+
def rename_vision_event_use_case(self, use_case: str, name: str) -> dict:
1163+
"""Rename an existing vision event use case.
1164+
1165+
Args:
1166+
use_case: Use case identifier.
1167+
name: New name for the use case.
1168+
1169+
Returns:
1170+
Dict with ``id`` and ``name``.
1171+
1172+
Example:
1173+
>>> ws = rf.workspace()
1174+
>>> ws.rename_vision_event_use_case("abc123", "new-name")
1175+
"""
1176+
return vision_events_api.rename_use_case(
1177+
api_key=self.__api_key,
1178+
use_case_id=use_case,
1179+
name=name,
1180+
)
1181+
1182+
def archive_vision_event_use_case(self, use_case: str) -> dict:
1183+
"""Archive a vision event use case.
1184+
1185+
Args:
1186+
use_case: Use case identifier.
1187+
1188+
Returns:
1189+
Dict with ``success``.
1190+
1191+
Example:
1192+
>>> ws = rf.workspace()
1193+
>>> ws.archive_vision_event_use_case("abc123")
1194+
"""
1195+
return vision_events_api.archive_use_case(
1196+
api_key=self.__api_key,
1197+
use_case_id=use_case,
1198+
)
1199+
1200+
def unarchive_vision_event_use_case(self, use_case: str) -> dict:
1201+
"""Unarchive a vision event use case.
1202+
1203+
Args:
1204+
use_case: Use case identifier.
1205+
1206+
Returns:
1207+
Dict with ``success``.
1208+
1209+
Example:
1210+
>>> ws = rf.workspace()
1211+
>>> ws.unarchive_vision_event_use_case("abc123")
1212+
"""
1213+
return vision_events_api.unarchive_use_case(
1214+
api_key=self.__api_key,
1215+
use_case_id=use_case,
1216+
)
1217+
11431218
def get_vision_event_metadata_schema(self, use_case: str) -> dict:
11441219
"""Get the custom metadata schema for a vision event use case.
11451220

0 commit comments

Comments
 (0)