diff --git a/backend/api/account/serializers/objects_serializers.py b/backend/api/account/serializers/objects_serializers.py new file mode 100644 index 0000000..0fcdb5c --- /dev/null +++ b/backend/api/account/serializers/objects_serializers.py @@ -0,0 +1,27 @@ +from rest_framework import serializers +from django.conf import settings +from sitemanagement.models import Object, Zone, Sensor + +class SensorBasicSerializer(serializers.ModelSerializer): + class Meta: + model = Sensor + fields = ('id', 'name', 'serial_number', 'sensor_type') + +class ZoneSerializer(serializers.ModelSerializer): + sensors = SensorBasicSerializer(many=True, read_only=True) + + class Meta: + model = Zone + fields = ('id', 'name', 'sensors') + +class ObjectSerializer(serializers.ModelSerializer): + zones = ZoneSerializer(many=True, read_only=True) + image = serializers.SerializerMethodField() + + class Meta: + model = Object + fields = ('id', 'title', 'description', 'image', 'address', 'floors', 'area', 'zones') + + def get_image(self, obj): + """Возвращает URL изображения объекта""" + return f"{settings.BASE_URL}{obj.image.url}" if obj.image else None \ No newline at end of file diff --git a/backend/api/account/serializers/SensorSerializers.py b/backend/api/account/serializers/sensor_serializers.py similarity index 100% rename from backend/api/account/serializers/SensorSerializers.py rename to backend/api/account/serializers/sensor_serializers.py diff --git a/backend/api/account/urls.py b/backend/api/account/urls.py index d847593..61fd686 100644 --- a/backend/api/account/urls.py +++ b/backend/api/account/urls.py @@ -1,5 +1,6 @@ from django.urls import path from .views.UserDataView import UserDataView +from .views.objects_views import ObjectView from drf_spectacular.views import ( SpectacularAPIView, SpectacularSwaggerView, @@ -21,4 +22,5 @@ urlpatterns = [ ), path("user/", UserDataView.as_view(), name="user-data"), + path("get-objects/", ObjectView.as_view(), name="objects"), ] diff --git a/backend/api/account/views/objects_views.py b/backend/api/account/views/objects_views.py new file mode 100644 index 0000000..4c903e3 --- /dev/null +++ b/backend/api/account/views/objects_views.py @@ -0,0 +1,36 @@ +from rest_framework import status +from rest_framework.views import APIView +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from drf_spectacular.utils import extend_schema, OpenApiResponse + +from api.account.serializers.objects_serializers import ObjectSerializer +from sitemanagement.models import Object + +from api.utils.decorators import handle_exceptions + +class ObjectView(APIView): + permission_classes = [IsAuthenticated] + serializer_class = ObjectSerializer + + @extend_schema( + summary="Получение всех объектов", + description="Получение всех объектов", + responses={200: OpenApiResponse(response=ObjectSerializer, description="Объекты успешно получены")}) + @handle_exceptions + def get(self, request): + """Получение всех объектов с их зонами и датчиками""" + try: + + objects = Object.objects.prefetch_related( + 'zones', + 'zones__sensors', + 'zones__sensors__sensor_type' + ).all() + + serializer = ObjectSerializer(objects, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + except Object.DoesNotExist: + return Response( + {"error": "Объекты не найдены"}, + status=status.HTTP_404_NOT_FOUND) diff --git a/backend/base/settings.py b/backend/base/settings.py index 846729a..f82873f 100644 --- a/backend/base/settings.py +++ b/backend/base/settings.py @@ -8,7 +8,11 @@ load_dotenv(dotenv_path=BASE_DIR / './.env') SECRET_KEY = os.environ.get("SECRET_KEY") DEBUG = os.environ.get("DEBUG_MODE") + BASE_URL = os.environ.get("BASE_URL", "http://127.0.0.1:8000") +MEDIA_URL = '/media/' +MEDIA_ROOT = os.environ.get("MEDIA_ROOT", os.path.join(BASE_DIR.parent, 'media')) +STATIC_ROOT = os.environ.get("STATIC_ROOT") ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "").split(",") CSRF_TRUSTED_ORIGINS = os.environ.get("CSRF_TRUSTED_ORIGINS", "").split(",") diff --git a/backend/sitemanagement/admin.py b/backend/sitemanagement/admin.py index ecccb67..5f0e348 100644 --- a/backend/sitemanagement/admin.py +++ b/backend/sitemanagement/admin.py @@ -75,19 +75,17 @@ class SensorAdmin(admin.ModelAdmin): @admin.register(Object) class ObjectAdmin(admin.ModelAdmin): list_display = ('title', 'description', 'image', 'address', 'floors', 'area') - list_filter = ('title', 'description', 'image', 'address', 'floors', 'area') + list_filter = ('title', 'description', 'address', 'floors', 'area') search_fields = ('title', 'description', 'image', 'address', 'floors', 'area') list_per_page = 10 list_max_show_all = 100 - list_editable = ('image', 'address', 'floors', 'area') list_display_links = ('title',) @admin.register(Zone) class ZoneAdmin(admin.ModelAdmin): - list_display = ('object', 'name') # Removed sensors from list_display - list_filter = ('object', 'name') # Removed sensors from list_filter - search_fields = ('object', 'name') # Removed sensors from search_fields + list_display = ('object', 'name') + list_filter = ('object', 'name') + search_fields = ('object', 'name') list_per_page = 10 list_max_show_all = 100 - list_editable = ('name',) # Changed to tuple with name only list_display_links = ('object',) \ No newline at end of file