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
7 changes: 7 additions & 0 deletions apps/augmentedreality/serializers.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
from rest_framework import serializers

from util.minio_client import minio_client

from . import models


class VariantSerializer(serializers.ModelSerializer):
offset_position = serializers.SerializerMethodField()
offset_scale = serializers.SerializerMethodField()
offset_rotation = serializers.SerializerMethodField()
mesh_url = serializers.SerializerMethodField()

class Meta:
model = models.Variant
Expand All @@ -15,6 +18,7 @@ class Meta:
"name",
"description",
"mesh_id",
"mesh_url",
"offset_position",
"offset_scale",
"offset_rotation",
Expand All @@ -30,6 +34,9 @@ def get_offset_scale(self, obj):
def get_offset_rotation(self, obj):
return list(obj.offset_rotation.tuple)

def get_mesh_url(self, obj):
return minio_client.get_presigned_url(obj.mesh_id)


class ObjectSerializer(serializers.ModelSerializer):
variants = VariantSerializer(many=True)
Expand Down
4 changes: 0 additions & 4 deletions apps/augmentedreality/templatetags/react_augmentedreality.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import json

from django import template
from django.conf import settings
from django.utils.html import format_html

from apps.augmentedreality.serializers import SceneSerializer
Expand All @@ -20,9 +19,6 @@ def react_augmentedreality_arc(topic):
if topic.scene:
attributes["scene"] = SceneSerializer(topic.scene).data

if hasattr(settings, "MINIO_DATA"):
attributes["minioData"] = settings.MINIO_DATA

return format_html(
'<div data-arpas-widget="arc" ' 'data-attributes="{attributes}"></div>',
attributes=json.dumps(attributes),
Expand Down
8 changes: 8 additions & 0 deletions changelog/537.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
### Added

- MinIO Client


### Changed

- VariantSerializer adds a mesh_url property which is a generated presigned url
1 change: 1 addition & 0 deletions requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ xmltodict==0.14.2
zeep==4.3.1
urllib3==2.3.0
redis==5.2.1
minio==7.2.15

# Inherited a4-core requirements
Django==4.2.18
Expand Down
42 changes: 42 additions & 0 deletions util/minio_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import logging
from datetime import timedelta

from django.conf import settings
from django.utils.functional import cached_property
from minio import Minio

logger = logging.getLogger(__name__)


class MinIOClient:
@cached_property
def client(self):
if all(
hasattr(settings.MINIO_DATA, attr)
for attr in ["endpoint", "accessKey", "secretKey"]
):
return Minio(
settings.MINIO_DATA.get("endpoint"),
access_key=settings.MINIO_DATA.get("accessKey"),
secret_key=settings.MINIO_DATA.get("secretKey"),
secure=True,
)
else:
logger.error(
"Failed to generate MinIO client, check environment variables."
)
return None

def get_presigned_url(self, mesh_id, expires=timedelta(hours=1)):
try:
parts = mesh_id.split("/", 1)
object_name = parts[1]
return self.client.presigned_get_object(
settings.MINIO_DATA.get("bucket"), object_name, expires=expires
)
except Exception as e:
logger.error(f"Failed to generate presigned URL for {mesh_id}: {str(e)}")
return None


minio_client = MinIOClient()