import logging
|
|
import pytest
|
|
from label_studio.tests.sdk.common import LABEL_CONFIG_AND_TASKS
|
|
pytestmark = pytest.mark.django_db
|
from label_studio_sdk.client import LabelStudio
|
|
from label_studio.tests.sdk.utils import sdk_logs
|
|
|
def test_task_CRUD(django_live_url, business_client):
|
ls = LabelStudio(base_url=django_live_url, api_key=business_client.api_key)
|
p = ls.projects.create(title='New Project', label_config=LABEL_CONFIG_AND_TASKS['label_config'])
|
|
task_data = [{'data': {'my_text': 'Test task'}}]
|
for task in task_data:
|
ls.tasks.create(project=p.id, data=task['data'])
|
|
tasks = [task for task in ls.tasks.list(project=p.id)]
|
|
assert len(tasks) == 1
|
assert (task_id := tasks[0].id)
|
assert tasks[0].data == task_data[0]['data']
|
|
ls.tasks.update(id=task_id, data={'my_text': 'Updated task'})
|
tasks = [task for task in ls.tasks.list(project=p.id)]
|
assert len(tasks) == 1
|
assert tasks[0].data == {'my_text': 'Updated task'}
|
|
ls.tasks.delete(id=task_id)
|
tasks = []
|
for task in ls.tasks.list(project=p.id):
|
tasks.append(task)
|
assert len(tasks) == 0
|
|
|
def test_delete_multi_tasks(django_live_url, business_client):
|
ls = LabelStudio(base_url=django_live_url, api_key=business_client.api_key)
|
p = ls.projects.create(title='New Project', label_config=LABEL_CONFIG_AND_TASKS['label_config'])
|
|
task_data = [{'data': {'my_text': 'Test task ' + str(i)}} for i in range(10)]
|
for task in task_data:
|
ls.tasks.create(project=p.id, data=task['data'])
|
|
tasks = [task for task in ls.tasks.list(project=p.id)]
|
assert len(tasks) == 10
|
|
tasks_ids_to_delete = [t.id for t in tasks[:5]]
|
|
# delete specific tasks
|
ls.actions.create(project=p.id, id='delete_tasks', selected_items={'all': False, 'included': tasks_ids_to_delete})
|
assert len([task for task in ls.tasks.list(project=p.id)]) == 5
|
|
# another way of calling delete action instead of
|
# ls.actions.create(project=p.id, id='delete_tasks', selected_items={'all': True, 'excluded': [tasks[5].id]})
|
import json
|
|
ls.actions.create(
|
project=p.id,
|
id='delete_tasks',
|
request_options={
|
'additional_body_parameters': {
|
'selectedItems': json.dumps({'all': True, 'excluded': [tasks[5].id]}),
|
},
|
},
|
)
|
|
remaining_tasks = [task for task in ls.tasks.list(project=p.id)]
|
assert len(remaining_tasks) == 1
|
assert remaining_tasks[0].data['my_text'] == 'Test task 5'
|
|
# remove all tasks
|
ls.tasks.delete_all_tasks(id=p.id)
|
any_task_found = False
|
for task in ls.tasks.list(project=p.id):
|
any_task_found = True
|
assert not any_task_found
|
|
|
def test_export_tasks(django_live_url, business_client):
|
ls = LabelStudio(base_url=django_live_url, api_key=business_client.api_key)
|
p = ls.projects.create(title='New Project', label_config=LABEL_CONFIG_AND_TASKS['label_config'])
|
|
task_data = [{'data': {'my_text': 'Test task ' + str(i)}} for i in range(10)]
|
ls.projects.import_tasks(id=p.id, request=task_data)
|
|
task_id = None
|
for i, task in enumerate(ls.tasks.list(project=p.id)):
|
if i == 7:
|
task_id = task.id
|
break
|
|
annotation_data = {
|
'result': [{'from_name': 'label', 'to_name': 'my_text', 'type': 'choices', 'value': {'choices': ['Positive']}}]
|
}
|
ls.annotations.create(id=task_id, **annotation_data)
|
|
# export a singleton task
|
single_task = ls.tasks.get(id=task_id)
|
assert single_task.data['my_text'] == 'Test task 7'
|
assert single_task.total_annotations == 1
|
assert single_task.updated_by[0]['user_id'] == business_client.user.id
|
|
exported_tasks = [task for task in ls.tasks.list(project=p.id, fields='all') if task.annotations]
|
assert len(exported_tasks) == 1
|
assert exported_tasks[0].data['my_text'] == 'Test task 7'
|
|
exported_tasks = [task for task in ls.tasks.list(project=p.id, fields='all')]
|
assert len(exported_tasks) == 10
|
|
|
def test_upload_and_list_tasks_does_not_log_to_stderr(django_live_url, business_client, caplog):
|
caplog.set_level(logging.ERROR)
|
|
ls = LabelStudio(base_url=django_live_url, api_key=business_client.api_key)
|
p = ls.projects.create(title='New Project', label_config=LABEL_CONFIG_AND_TASKS['label_config'])
|
ls.projects.import_tasks(id=p.id, request=LABEL_CONFIG_AND_TASKS['tasks_for_import'])
|
|
tasks = [task for task in ls.tasks.list(project=p.id, fields='all')]
|
|
assert len(tasks) == 1
|
assert len(tasks[0].annotations) == 1
|
assert len(tasks[0].predictions) == 1
|
assert not sdk_logs(caplog)
|
|
|
def test_get_empty_tasks_does_not_log_to_stderr(django_live_url, business_client, caplog):
|
caplog.set_level(logging.ERROR)
|
|
ls = LabelStudio(base_url=django_live_url, api_key=business_client.api_key)
|
p = ls.projects.create(title='New Project', label_config=LABEL_CONFIG_AND_TASKS['label_config'])
|
|
tasks = [task for task in ls.tasks.list(project=p.id)]
|
|
assert not tasks
|
assert not sdk_logs(caplog)
|