Skip to content

Commit

Permalink
Fix ui formatting, fix tests, and add migrations
Browse files Browse the repository at this point in the history
  • Loading branch information
vanessavmac committed Jan 12, 2025
1 parent 325a7c7 commit 78c9dec
Show file tree
Hide file tree
Showing 10 changed files with 84 additions and 39 deletions.
2 changes: 1 addition & 1 deletion ami/main/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1816,7 +1816,7 @@ class Detection(BaseModel):
null=True,
blank=True,
)
# Time that the detection was created by the algorithm in the ML backend
# Time that the detection was created by the algorithm in the processing service
detection_time = models.DateTimeField(null=True, blank=True)
# @TODO not sure if this detection score is ever used
# I think it was intended to be the score of the detection algorithm (bbox score)
Expand Down
42 changes: 42 additions & 0 deletions ami/ml/migrations/0015_processingservice_delete_backend.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Generated by Django 4.2.10 on 2025-01-11 22:39

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("main", "0038_alter_detection_path_alter_sourceimage_event_and_more"),
("ml", "0014_remove_backend_version_remove_backend_version_name_and_more"),
]

operations = [
migrations.CreateModel(
name="ProcessingService",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("name", models.CharField(max_length=255)),
("slug", models.SlugField(max_length=255, unique=True)),
("description", models.TextField(blank=True)),
("endpoint_url", models.CharField(max_length=1024)),
("last_checked", models.DateTimeField(null=True)),
("last_checked_live", models.BooleanField(null=True)),
(
"pipelines",
models.ManyToManyField(blank=True, related_name="processing_services", to="ml.pipeline"),
),
(
"projects",
models.ManyToManyField(blank=True, related_name="processing_services", to="main.project"),
),
],
options={
"verbose_name": "ProcessingService",
"verbose_name_plural": "ProcessingServices",
},
),
migrations.DeleteModel(
name="Backend",
),
]
4 changes: 2 additions & 2 deletions ami/ml/models/processing_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ def __str__(self):
return self.name

class Meta:
verbose_name = "ProcessingService"
verbose_name_plural = "ProcessingServices"
verbose_name = "Processing Service"
verbose_name_plural = "Processing Services"

def create_pipelines(self):
# Call the status endpoint and get the pipelines/algorithms
Expand Down
10 changes: 5 additions & 5 deletions ami/ml/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
PipelineResponse,
SourceImageResponse,
)
from ami.tests.fixtures.main import create_captures_from_files, create_processing_services, setup_test_project
from ami.tests.fixtures.main import create_captures_from_files, create_processing_service, setup_test_project
from ami.users.models import User


Expand All @@ -34,7 +34,7 @@ def setUp(self):
self.factory = APIRequestFactory()

def _create_processing_service(self, name: str, slug: str, endpoint_url: str):
processing_services_create_url = reverse_with_params("api:processing-service-list")
processing_services_create_url = reverse_with_params("api:processingservice-list")
self.client.force_authenticate(user=self.user)
processing_service_data = {
"project": self.project.pk,
Expand All @@ -48,7 +48,7 @@ def _create_processing_service(self, name: str, slug: str, endpoint_url: str):
return resp.json()

def _get_processing_service_id_by_slug(self, slug: str) -> int:
processing_services_list_url = reverse_with_params("api:processing-service-list")
processing_services_list_url = reverse_with_params("api:processingservice-list")
self.client.force_authenticate(user=self.user)
resp = self.client.get(processing_services_list_url)
self.client.force_authenticate(user=None)
Expand All @@ -73,7 +73,7 @@ def _delete_processing_service(self, processing_service_id: int):

def _register_pipelines(self, processing_service_id):
processing_services_register_pipelines_url = reverse_with_params(
"api:processing-service-register-pipelines", args=[processing_service_id]
"api:processingservice-register-pipelines", args=[processing_service_id]
)
self.client.force_authenticate(user=self.user)
resp = self.client.post(processing_services_register_pipelines_url)
Expand Down Expand Up @@ -120,7 +120,7 @@ def setUp(self):
self.project, self.deployment = setup_test_project()
self.captures = create_captures_from_files(self.deployment, skip_existing=False)
self.test_images = [image for image, frame in self.captures]
self.processing_service_instance = create_processing_services(self.project)
self.processing_service_instance = create_processing_service(self.project)
self.processing_service = self.processing_service_instance
self.pipeline = self.processing_service_instance.pipelines.all().filter(slug="constant").first()

Expand Down
53 changes: 27 additions & 26 deletions ami/tests/fixtures/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,32 +37,33 @@ def update_site_settings(**kwargs):
return site


def create_processing_services(project):
processing_services_to_add = [
{
"projects": [{"name": project.name}],
"endpoint_url": "http://processing_service:2000",
},
]

for processing_service_data in processing_services_to_add:
processing_service, created = ProcessingService.objects.get_or_create(
endpoint_url=processing_service_data["endpoint_url"],
)

if created:
logger.info(f'Successfully created processing service with {processing_service_data["endpoint_url"]}.')
else:
logger.info(f'Using existing processing service with {processing_service_data["endpoint_url"]}.')
def create_processing_service(project):
processing_service_to_add = {
"slug": "test_processing_service",
"name": "Test Processing Service",
"projects": [{"name": project.name}],
"endpoint_url": "http://processing_service:2000",
}

processing_service, created = ProcessingService.objects.get_or_create(
name=processing_service_to_add["name"],
slug=processing_service_to_add["slug"],
endpoint_url=processing_service_to_add["endpoint_url"],
)
processing_service.save()

for project_data in processing_service_data["projects"]:
try:
project = Project.objects.get(name=project_data["name"])
processing_service.projects.add(project)
except Exception:
logger.error(f'Could not find project {project_data["name"]}.')
if created:
logger.info(f'Successfully created processing service with {processing_service_to_add["endpoint_url"]}.')
else:
logger.info(f'Using existing processing service with {processing_service_to_add["endpoint_url"]}.')

processing_service.save()
for project_data in processing_service_to_add["projects"]:
try:
project = Project.objects.get(name=project_data["name"])
processing_service.projects.add(project)
processing_service.save()
except Exception:
logger.error(f'Could not find project {project_data["name"]}.')

processing_service.create_pipelines()

Expand All @@ -77,15 +78,15 @@ def setup_test_project(reuse=True) -> tuple[Project, Deployment]:
deployment, _ = Deployment.objects.get_or_create(
project=project, name="Test Deployment", defaults=dict(data_source=data_source)
)
create_processing_services(project)
create_processing_service(project)
else:
short_id = uuid.uuid4().hex[:8]
project = Project.objects.create(name=f"Test Project {short_id}")
data_source = create_storage_source(project, f"Test Data Source {short_id}")
deployment = Deployment.objects.create(
project=project, name=f"Test Deployment {short_id}", data_source=data_source
)
create_processing_services(project)
create_processing_service(project)
return project, deployment


Expand Down
2 changes: 2 additions & 0 deletions config/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,8 @@
# Your stuff...
# ------------------------------------------------------------------------------

DEFAULT_CONFIDENCE_THRESHOLD = env.float("DEFAULT_CONFIDENCE_THRESHOLD", default=0.6) # type: ignore[no-untyped-call]

S3_TEST_ENDPOINT = env("MINIO_ENDPOINT", default="http://minio:9000") # type: ignore[no-untyped-call]
S3_TEST_KEY = env("MINIO_ROOT_USER", default=None) # type: ignore[no-untyped-call]
S3_TEST_SECRET = env("MINIO_ROOT_PASSWORD", default=None) # type: ignore[no-untyped-call]
Expand Down
2 changes: 1 addition & 1 deletion ui/src/pages/overview/entities/details-form/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ export const customFormMap: {
} = {
storage: StorageDetailsForm,
collection: CollectionDetailsForm,
processingService: ProcessingServiceDetailsForm,
service: ProcessingServiceDetailsForm,
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const config: FormConfig = {
},
endpoint_url: {
label: 'Endpoint URL',
description: 'Processing Service Endpoint',
description: 'Processing service endpoint.',
rules: {
required: true,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,14 +86,14 @@ export const columns: (
<UpdateEntityDialog
collection={API_ROUTES.PROCESSING_SERVICES}
entity={item}
type="processingService"
type="service"
/>
)}
{item.canDelete && (
<DeleteEntityDialog
collection={API_ROUTES.PROCESSING_SERVICES}
id={item.id}
type="processingService"
type="service"
/>
)}
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export const ProcessingServices = () => {
{canCreate && (
<NewEntityDialog
collection={API_ROUTES.PROCESSING_SERVICES}
type="processingService"
type="service"
/>
)}
</PageHeader>
Expand Down

0 comments on commit 78c9dec

Please sign in to comment.