From a4e044a9598c7ca1b0b06fa3f8be93ed26c1631f Mon Sep 17 00:00:00 2001 From: Shane Date: Tue, 24 Jun 2025 11:33:30 +0200 Subject: [PATCH] apps/augmentedreality integrate minio and minio client, remove access keys from frontend --- apps/augmentedreality/serializers.py | 7 ++++ .../templatetags/react_augmentedreality.py | 4 -- changelog/537.md | 8 ++++ requirements/base.txt | 1 + util/minio_client.py | 42 +++++++++++++++++++ 5 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 changelog/537.md create mode 100644 util/minio_client.py diff --git a/apps/augmentedreality/serializers.py b/apps/augmentedreality/serializers.py index c156147a6..5342ab7fb 100644 --- a/apps/augmentedreality/serializers.py +++ b/apps/augmentedreality/serializers.py @@ -1,5 +1,7 @@ from rest_framework import serializers +from util.minio_client import minio_client + from . import models @@ -7,6 +9,7 @@ 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 @@ -15,6 +18,7 @@ class Meta: "name", "description", "mesh_id", + "mesh_url", "offset_position", "offset_scale", "offset_rotation", @@ -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) diff --git a/apps/augmentedreality/templatetags/react_augmentedreality.py b/apps/augmentedreality/templatetags/react_augmentedreality.py index 5ab514e44..91a2326bd 100644 --- a/apps/augmentedreality/templatetags/react_augmentedreality.py +++ b/apps/augmentedreality/templatetags/react_augmentedreality.py @@ -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 @@ -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( '
', attributes=json.dumps(attributes), diff --git a/changelog/537.md b/changelog/537.md new file mode 100644 index 000000000..c8912576f --- /dev/null +++ b/changelog/537.md @@ -0,0 +1,8 @@ +### Added + +- MinIO Client + + +### Changed + +- VariantSerializer adds a mesh_url property which is a generated presigned url diff --git a/requirements/base.txt b/requirements/base.txt index caed25b3e..289fd1ef4 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -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 diff --git a/util/minio_client.py b/util/minio_client.py new file mode 100644 index 000000000..59b309c8e --- /dev/null +++ b/util/minio_client.py @@ -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()