diff --git a/.vscode/PythonImportHelper-v2-Completion.json b/.vscode/PythonImportHelper-v2-Completion.json index 7f97efa..1213d0b 100644 --- a/.vscode/PythonImportHelper-v2-Completion.json +++ b/.vscode/PythonImportHelper-v2-Completion.json @@ -176,6 +176,22 @@ "detail": "django.db", "documentation": {} }, + { + "label": "migrations", + "importPath": "django.db", + "description": "django.db", + "isExtraImport": true, + "detail": "django.db", + "documentation": {} + }, + { + "label": "models", + "importPath": "django.db", + "description": "django.db", + "isExtraImport": true, + "detail": "django.db", + "documentation": {} + }, { "label": "models", "importPath": "django.db", @@ -1012,7 +1028,7 @@ "kind": 5, "importPath": "back.back.urls", "description": "back.back.urls", - "peekOfCode": "router = routers.DefaultRouter()\nrouter.register(r'api/front_img', frontimg_views.ImageViewSet)\nrouter.register(r'api/obj/element', object_views.Element3DViewSet)\nrouter.register(r'api/obj/clickable', object_views.ClickableAreaViewSet)\nurlpatterns = [\n path('', include(router.urls)),\n path(\"admin/\", admin.site.urls),\n path(\"api/products\", csrf_exempt(views.Products.as_view())),\n path(\"api/floorplan/\", csrf_exempt(views.FloorplanView.as_view())),\n path(\"api/floorplan/\", csrf_exempt(views.FloorplanView.as_view())),", + "peekOfCode": "router = routers.DefaultRouter()\nrouter.register(r'api/front_img', frontimg_views.ImageViewSet)\nrouter.register(r'api/obj/scene', object_views.Scene3DViewSet)\nrouter.register(r'api/obj/element', object_views.Element3DViewSet)\nrouter.register(r'api/obj/clickable', object_views.ClickableAreaViewSet)\nurlpatterns = [\n path('', include(router.urls)),\n path(\"admin/\", admin.site.urls),\n path(\"api/products\", csrf_exempt(views.Products.as_view())),\n path(\"api/floorplan/\", csrf_exempt(views.FloorplanView.as_view())),", "detail": "back.back.urls", "documentation": {} }, @@ -1169,6 +1185,15 @@ "detail": "back.object.migrations.0008_alter_clickablearea_target", "documentation": {} }, + { + "label": "Migration", + "kind": 6, + "importPath": "back.object.migrations.0009_alter_clickablearea_description_and_more", + "description": "back.object.migrations.0009_alter_clickablearea_description_and_more", + "peekOfCode": "class Migration(migrations.Migration):\n dependencies = [\n ('object', '0008_alter_clickablearea_target'),\n ]\n operations = [\n migrations.AlterField(\n model_name='clickablearea',\n name='description',\n field=models.TextField(verbose_name='описание'),\n ),", + "detail": "back.object.migrations.0009_alter_clickablearea_description_and_more", + "documentation": {} + }, { "label": "ObjectConfig", "kind": 6, @@ -1187,12 +1212,21 @@ "detail": "back.object.models", "documentation": {} }, + { + "label": "Scene3D", + "kind": 6, + "importPath": "back.object.models", + "description": "back.object.models", + "peekOfCode": "class Scene3D(models.Model):\n name = models.CharField(\n max_length=120,\n )\n elements = models.ManyToManyField(Element3D)\nclass ClickableArea(models.Model):\n name = models.CharField(\"название\", max_length=255)\n description = models.TextField(\"описание\")\n object_name = models.CharField(\"название объекта\", max_length=255)\n target = models.ForeignKey(", + "detail": "back.object.models", + "documentation": {} + }, { "label": "ClickableArea", "kind": 6, "importPath": "back.object.models", "description": "back.object.models", - "peekOfCode": "class ClickableArea(models.Model):\n name = models.CharField(max_length=255)\n description = models.TextField()\n object_name = models.CharField(max_length=255)\n target = models.ForeignKey(\n Element3D,\n on_delete=models.PROTECT,\n related_name=\"clickable_areas\",\n blank=True,\n null=True,", + "peekOfCode": "class ClickableArea(models.Model):\n name = models.CharField(\"название\", max_length=255)\n description = models.TextField(\"описание\")\n object_name = models.CharField(\"название объекта\", max_length=255)\n target = models.ForeignKey(\n Element3D,\n on_delete=models.PROTECT,\n related_name=\"clickable_areas\",\n blank=True,\n null=True,", "detail": "back.object.models", "documentation": {} }, @@ -1219,7 +1253,16 @@ "kind": 6, "importPath": "back.object.serializers", "description": "back.object.serializers", - "peekOfCode": "class Element3DSerializer(serializers.ModelSerializer):\n model_file = serializers.ImageField(use_url=False)\n class Meta:\n model = Element3D\n fields = \"__all__\"\nclass ClickableAreaSerializer(serializers.ModelSerializer):\n class Meta:\n model = ClickableArea\n fields = \"__all__\"", + "peekOfCode": "class Element3DSerializer(serializers.ModelSerializer):\n model_file = serializers.ImageField(use_url=False)\n class Meta:\n model = Element3D\n fields = \"__all__\"\nclass Scene3DSerializer(serializers.ModelSerializer):\n class Meta:\n model = Scene3D\n fields = \"__all__\"\n depth = 2", + "detail": "back.object.serializers", + "documentation": {} + }, + { + "label": "Scene3DSerializer", + "kind": 6, + "importPath": "back.object.serializers", + "description": "back.object.serializers", + "peekOfCode": "class Scene3DSerializer(serializers.ModelSerializer):\n class Meta:\n model = Scene3D\n fields = \"__all__\"\n depth = 2\nclass ClickableAreaSerializer(serializers.ModelSerializer):\n class Meta:\n model = ClickableArea\n fields = \"__all__\"", "detail": "back.object.serializers", "documentation": {} }, @@ -1237,7 +1280,7 @@ "kind": 6, "importPath": "back.object.views", "description": "back.object.views", - "peekOfCode": "class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):\n pass\nclass ClickableAreaViewSet(viewsets.ModelViewSet):\n queryset = ClickableArea.objects.all()\n serializer_class = ClickableAreaSerializer\n filterset_fields = (\n \"source\",\n \"object_name\",\n )\nclass Element3DFilter(django_filters.rest_framework.FilterSet):", + "peekOfCode": "class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):\n pass\nclass ClickableAreaViewSet(viewsets.ModelViewSet):\n queryset = ClickableArea.objects.all()\n serializer_class = ClickableAreaSerializer\n filterset_fields = (\n \"source\",\n \"object_name\",\n )\nclass Scene3DViewSet(viewsets.ModelViewSet):", "detail": "back.object.views", "documentation": {} }, @@ -1246,7 +1289,16 @@ "kind": 6, "importPath": "back.object.views", "description": "back.object.views", - "peekOfCode": "class ClickableAreaViewSet(viewsets.ModelViewSet):\n queryset = ClickableArea.objects.all()\n serializer_class = ClickableAreaSerializer\n filterset_fields = (\n \"source\",\n \"object_name\",\n )\nclass Element3DFilter(django_filters.rest_framework.FilterSet):\n parent = NumberInFilter(\n field_name=\"parent\",", + "peekOfCode": "class ClickableAreaViewSet(viewsets.ModelViewSet):\n queryset = ClickableArea.objects.all()\n serializer_class = ClickableAreaSerializer\n filterset_fields = (\n \"source\",\n \"object_name\",\n )\nclass Scene3DViewSet(viewsets.ModelViewSet):\n queryset = Scene3D.objects.all()\n serializer_class = Scene3DSerializer", + "detail": "back.object.views", + "documentation": {} + }, + { + "label": "Scene3DViewSet", + "kind": 6, + "importPath": "back.object.views", + "description": "back.object.views", + "peekOfCode": "class Scene3DViewSet(viewsets.ModelViewSet):\n queryset = Scene3D.objects.all()\n serializer_class = Scene3DSerializer\n filterset_fields = (\n \"name\",\n )\nclass Element3DFilter(django_filters.rest_framework.FilterSet):\n parent = NumberInFilter(\n field_name=\"parent\",\n lookup_expr=\"in\",", "detail": "back.object.views", "documentation": {} }, diff --git a/back/back/urls.py b/back/back/urls.py index 6988362..34ab727 100644 --- a/back/back/urls.py +++ b/back/back/urls.py @@ -26,6 +26,7 @@ from object import views as object_views router = routers.DefaultRouter() router.register(r'api/front_img', frontimg_views.ImageViewSet) +router.register(r'api/obj/scene', object_views.Scene3DViewSet) router.register(r'api/obj/element', object_views.Element3DViewSet) router.register(r'api/obj/clickable', object_views.ClickableAreaViewSet) diff --git a/back/object/admin.py b/back/object/admin.py index 0b4e6dd..bd620f2 100644 --- a/back/object/admin.py +++ b/back/object/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin -from .models import Element3D, ClickableArea +from .models import ClickableArea, Element3D, Scene3D +admin.site.register(Scene3D) admin.site.register(Element3D) admin.site.register(ClickableArea) \ No newline at end of file diff --git a/back/object/models.py b/back/object/models.py index 070e488..658e296 100644 --- a/back/object/models.py +++ b/back/object/models.py @@ -28,6 +28,13 @@ class Element3D(models.Model): return self.name +class Scene3D(models.Model): + name = models.CharField( + max_length=120, + ) + elements = models.ManyToManyField(Element3D) + + class ClickableArea(models.Model): name = models.CharField("название", max_length=255) description = models.TextField("описание") diff --git a/back/object/serializers.py b/back/object/serializers.py index 2577516..d8aa682 100644 --- a/back/object/serializers.py +++ b/back/object/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from .models import Element3D, ClickableArea +from .models import Scene3D, Element3D, ClickableArea class Element3DSerializer(serializers.ModelSerializer): @@ -8,6 +8,12 @@ class Element3DSerializer(serializers.ModelSerializer): model = Element3D fields = "__all__" +class Scene3DSerializer(serializers.ModelSerializer): + class Meta: + model = Scene3D + fields = "__all__" + depth = 2 + class ClickableAreaSerializer(serializers.ModelSerializer): class Meta: model = ClickableArea diff --git a/back/object/views.py b/back/object/views.py index afb652e..4b5d03f 100644 --- a/back/object/views.py +++ b/back/object/views.py @@ -1,8 +1,8 @@ from rest_framework import viewsets import django_filters -from .models import ClickableArea, Element3D -from .serializers import ClickableAreaSerializer, Element3DSerializer +from .models import ClickableArea, Element3D, Scene3D +from .serializers import ClickableAreaSerializer, Element3DSerializer, Scene3DSerializer class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter): @@ -17,7 +17,13 @@ class ClickableAreaViewSet(viewsets.ModelViewSet): "object_name", ) - +class Scene3DViewSet(viewsets.ModelViewSet): + queryset = Scene3D.objects.all() + serializer_class = Scene3DSerializer + filterset_fields = ( + "name", + ) + class Element3DFilter(django_filters.rest_framework.FilterSet): parent = NumberInFilter( field_name="parent", diff --git a/front/src/components/Promo/load_models.vue b/front/src/components/Promo/load_models.vue index 5e6eff1..7d99646 100644 --- a/front/src/components/Promo/load_models.vue +++ b/front/src/components/Promo/load_models.vue @@ -24,17 +24,14 @@ function shadows_and_pos(scene: any) { const models = ref([]) const clickable = ref([]) const clickable_objects = ref([]) -const { controls, raycaster, camera, scene, renderer } = useTresContext() +const { controls, raycaster, camera, scene } = useTresContext() const { seekByName } = useSeek() const sidebar = usePromoSidebar() const loadModels = async () => { - const res = await fetch(`${SERVER_URL}/api/obj/element/${props.source}`) - const raw_data = await res.json() as element3DType[] | element3DType - let data = raw_data as element3DType[] - if (props.source.endsWith('/')) { - data = [raw_data] as element3DType[] - } + const res = await fetch(`${SERVER_URL}/api/obj/scene/${props.source}`) + const raw_data = await res.json() as scene3D + const data = raw_data.elements if (!controls.value) return const c = (controls.value as any) const distance = { diff --git a/front/src/components/Promo/main.vue b/front/src/components/Promo/main.vue index 5fe7d2c..179031a 100644 --- a/front/src/components/Promo/main.vue +++ b/front/src/components/Promo/main.vue @@ -36,9 +36,9 @@ const point_light = reactive({ }) const route = useRoute() -const source = ref(route.params.target ? (route.params.target.toString() + '/') : '?parent__isnull=True') +const source = ref(route.params.target ? (route.params.target.toString() + '/') : '1/') watch(() => route.params.target, () => { - let t = '?parent__isnull=True' + let t = '1' if (route.params.target) t = route.params.target.toString() + '/' if (source.value !== t) { source.value = t diff --git a/front/src/index.d.ts b/front/src/index.d.ts index 2cfe122..eeb775d 100644 --- a/front/src/index.d.ts +++ b/front/src/index.d.ts @@ -9,7 +9,11 @@ interface ProductInfo { image3?: string } - +interface scene3D { + id: number, + name: string, + elements: element3DType[] +} interface element3DType { id: number model_file: string