Skip to content

Commit fe3d9a0

Browse files
feat: DIA-1980: Option to run only on tasks w/o predictions (#9286)
Co-authored-by: robot-ci-heartex <robot-ci-heartex@users.noreply.github.com> Co-authored-by: matt-bernstein <matt-bernstein@users.noreply.github.com> Co-authored-by: Matt Bernstein <matt@humansignal.com>
1 parent ad44d4f commit fe3d9a0

File tree

5 files changed

+64
-5
lines changed

5 files changed

+64
-5
lines changed

label_studio/ml_models/tests/__init__.py

Whitespace-only changes.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import factory
2+
from core.utils.common import load_func
3+
from django.conf import settings
4+
from django.utils import timezone
5+
from ml_models.models import ModelRun
6+
7+
8+
class ModelRunFactory(factory.django.DjangoModelFactory):
9+
"""
10+
Factory for `ml_models.models.ModelRun`.
11+
12+
Defaults are intentionally minimal; override fields in tests as needed.
13+
"""
14+
15+
project = factory.SubFactory(load_func(settings.PROJECT_FACTORY))
16+
organization = factory.SelfAttribute('project.organization')
17+
created_by = factory.SelfAttribute('project.created_by')
18+
model_version = None
19+
20+
project_subset = ModelRun.ProjectSubset.HASGT
21+
status = ModelRun.ModelRunStatus.PENDING
22+
23+
triggered_at = None
24+
completed_at = None
25+
predictions_updated_at = None
26+
27+
total_predictions = 0
28+
total_correct_predictions = 0
29+
total_tasks = 0
30+
31+
class Meta:
32+
model = ModelRun
33+
34+
@factory.post_generation
35+
def _default_timestamps(self, create, extracted, **kwargs):
36+
"""
37+
Ensure timestamps are set when status implies they should exist.
38+
"""
39+
if not create:
40+
return
41+
42+
if self.status == ModelRun.ModelRunStatus.COMPLETED:
43+
now = timezone.now()
44+
if self.triggered_at is None:
45+
self.triggered_at = now
46+
if self.completed_at is None:
47+
self.completed_at = now
48+
self.save(update_fields=['triggered_at', 'completed_at'])

label_studio/tasks/tests/factories.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from django.conf import settings
66
from django.utils import timezone
77
from faker import Faker
8-
from tasks.models import Annotation, AnnotationDraft, Prediction, Task, TaskLock
8+
from tasks.models import Annotation, AnnotationDraft, FailedPrediction, Prediction, Task, TaskLock
99

1010

1111
class TaskFactory(factory.django.DjangoModelFactory):
@@ -78,6 +78,17 @@ class Meta:
7878
model = Prediction
7979

8080

81+
class FailedPredictionFactory(factory.django.DjangoModelFactory):
82+
task = factory.SubFactory(TaskFactory)
83+
project = factory.SelfAttribute('task.project')
84+
message = factory.Faker('sentence')
85+
error_type = factory.Faker('word')
86+
model_version = factory.Faker('word')
87+
88+
class Meta:
89+
model = FailedPrediction
90+
91+
8192
class TaskLockFactory(factory.django.DjangoModelFactory):
8293
task = factory.SubFactory(TaskFactory)
8394
user = factory.SubFactory(load_func(settings.USER_FACTORY))

poetry.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ dependencies = [
7474
"tldextract (>=5.1.3)",
7575
"uuid-utils (>=0.11.0,<1.0.0)",
7676
## HumanSignal repo dependencies :start
77-
"label-studio-sdk @ https://github.com/HumanSignal/label-studio-sdk/archive/5a899681eaab91cb2a276ad7a6b2e05fee83478f.zip",
77+
"label-studio-sdk @ https://github.com/HumanSignal/label-studio-sdk/archive/e06e45d34b628fb3846eab8d27b618b81bfb68b6.zip",
7878
## HumanSignal repo dependencies :end
7979
]
8080

0 commit comments

Comments
 (0)