Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/instructions/python.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,16 +74,18 @@ def process_detection(self, detection_data):
### Models

- Import from `scene_common` for shared geometry/camera classes
- Use `ArrayField` for PostgreSQL array storage
- Use `ListField` (from `manager.fields`) for list/array storage - provides database portability (PostgreSQL and non-PostgreSQL) and robust handling of edge cases
- Implement `__str__` for admin interface readability

```python
from django.db import models
from scene_common.geometry import Region as ScenescapeRegion
from manager.fields import ListField

class Scene(models.Model):
name = models.CharField(max_length=255)
map = models.FileField(upload_to='maps/')
coordinates = ListField(default=list) # Works with PostgreSQL and SQLite

def __str__(self):
return self.name
Expand Down
49 changes: 47 additions & 2 deletions manager/src/django/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@
import paho.mqtt.client as mqtt
from PIL import Image

from django.contrib.postgres.fields import ArrayField
from django.core.files.base import ContentFile
from django.core.validators import FileExtensionValidator, MinValueValidator
from django.core.validators import FileExtensionValidator, MinValueValidator, MaxValueValidator
from django.db import models, transaction
from django.conf import settings
from django.contrib.sessions.models import Session
Expand Down Expand Up @@ -958,6 +957,16 @@ class Event(models.Model):
region = models.ForeignKey(Region, on_delete=models.CASCADE, related_name="events")
timestamp = models.FloatField(db_index=True)

# Default functions for Asset3D array fields
def default_geometric_center():
return [0.0, 0.0, 0.0]

def default_center_of_mass():
return [0.0, 0.0, 0.0]

def default_friction_coefficients():
return [0.5, 0.4]

class Asset3D(models.Model):
name = models.CharField("Class Name", max_length=200, unique=True)
x_size = models.FloatField("Object size in x-axis", default=1.0, validators=[MinValueValidator(0.0)])
Expand All @@ -984,6 +993,42 @@ class Asset3D(models.Model):
shift_type = models.IntegerField(choices=SHIFT_TYPE, default=1, null=True)
project_to_map = models.BooleanField(choices=BOOLEAN_CHOICES, default=False, null=True)

# Physics properties
geometric_center = ListField(
default=default_geometric_center,
null=True,
blank=True,
help_text="Geometric center offset [x, y, z] in meters from bottom center"
)
mass = models.FloatField("Mass (kg)", default=1.0, null=True, blank=True,
validators=[MinValueValidator(0.0)])
center_of_mass = ListField(
default=default_center_of_mass,
null=True,
blank=True,
help_text="Center of mass offset [x, y, z] in meters from geometric center"
)
is_static = models.BooleanField("Is Static", choices=BOOLEAN_CHOICES, default=False, null=True, blank=True,
help_text="Whether object can move on its own")
ttl = models.FloatField("Time to Live (seconds)", default=0.0, null=True, blank=True,
validators=[MinValueValidator(0.0)],
help_text="Time to live for track expiration (0 = infinite)")
linear_damping = models.FloatField("Linear Damping", default=0.05, null=True, blank=True,
validators=[MinValueValidator(0.0), MaxValueValidator(1.0)],
help_text="Resistance to linear motion (0.0 - 1.0)")
angular_damping = models.FloatField("Angular Damping", default=0.05, null=True, blank=True,
validators=[MinValueValidator(0.0), MaxValueValidator(1.0)],
help_text="Resistance to angular motion (0.0 - 1.0)")
Comment thread
saratpoluri marked this conversation as resolved.
coefficient_of_restitution = models.FloatField("Coefficient of Restitution", default=0.5, null=True, blank=True,
validators=[MinValueValidator(0.0), MaxValueValidator(1.0)],
help_text="Bounciness for collisions (0.0 - 1.0)")
Comment thread
saratpoluri marked this conversation as resolved.
friction_coefficients = ListField(
default=default_friction_coefficients,
null=True,
blank=True,
help_text="Friction coefficients [static, dynamic]"
)

def __str__(self):
return self.name

Expand Down
6 changes: 4 additions & 2 deletions manager/src/django/serializers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: (C) 2023 - 2025 Intel Corporation
# SPDX-FileCopyrightText: (C) 2023 - 2026 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

from collections import OrderedDict
Expand Down Expand Up @@ -872,7 +872,9 @@ class Meta:
fields = ['uid', 'name', 'x_size', 'y_size', 'z_size', 'tracking_radius', 'shift_type', 'mark_color',
'model_3d', 'scale', 'project_to_map', 'rotation_from_velocity',
'rotation_x', 'rotation_y', 'rotation_z', 'translation_x', 'translation_y', 'translation_z',
'x_buffer_size', 'y_buffer_size', 'z_buffer_size']
'x_buffer_size', 'y_buffer_size', 'z_buffer_size',
'geometric_center', 'mass', 'center_of_mass', 'is_static', 'ttl',
'linear_damping', 'angular_damping', 'coefficient_of_restitution', 'friction_coefficients']

class ChildSceneSerializer(NonNullSerializer):
name = serializers.SerializerMethodField('getChildName')
Expand Down
10 changes: 7 additions & 3 deletions manager/src/django/views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: (C) 2023 - 2025 Intel Corporation
# SPDX-FileCopyrightText: (C) 2023 - 2026 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

import json
Expand Down Expand Up @@ -433,7 +433,9 @@ def get_success_url(self):
# 3D Asset CRUD
class AssetCreateView(SuperUserCheck, CreateView):
model = Asset3D
fields = ['name', 'x_size', 'y_size', 'z_size', 'mark_color', 'model_3d', 'scale', 'tracking_radius', 'shift_type']
fields = ['name', 'x_size', 'y_size', 'z_size', 'mark_color', 'model_3d', 'scale', 'tracking_radius', 'shift_type',
'geometric_center', 'mass', 'center_of_mass', 'is_static', 'ttl',
'linear_damping', 'angular_damping', 'coefficient_of_restitution', 'friction_coefficients']
template_name = "asset/asset_create.html"
success_url = reverse_lazy('asset_list')

Expand All @@ -457,7 +459,9 @@ class AssetUpdateView(SuperUserCheck, UpdateView):
'x_buffer_size', 'y_buffer_size', 'z_buffer_size', \
'rotation_x', 'rotation_y', 'rotation_z', \
'translation_x', 'translation_y', 'translation_z', \
'tracking_radius', 'shift_type', 'project_to_map', 'rotation_from_velocity']
'tracking_radius', 'shift_type', 'project_to_map', 'rotation_from_velocity', \
'geometric_center', 'mass', 'center_of_mass', 'is_static', 'ttl', \
'linear_damping', 'angular_damping', 'coefficient_of_restitution', 'friction_coefficients']
template_name = "asset/asset_update.html"
success_url = reverse_lazy('asset_list')

Expand Down
Loading