From dbbdd5801136ed25d70ddd35f73c388f5d76288b Mon Sep 17 00:00:00 2001 From: ovchenkov Date: Sun, 11 Feb 2024 23:14:04 +0300 Subject: [PATCH 1/2] 11 Feb | dev_ovctech | checkpoint_2 --- Makefile | 35 +++-------- README.md | 9 +-- docker-compose-template.yml | 40 +++++++++++++ scripts/docker-compose-setup.sh | 45 ++++++++++++++ scripts/run.sh | 3 + videoanalytics/Dockerfile | 1 + videoanalytics/backend/settings.py | 9 ++- videoanalytics/poetry.lock | 83 +++++++++++++++++++++++++- videoanalytics/pyproject.toml | 1 + videoanalytics/videoanalytics/views.py | 29 ++++++++- 10 files changed, 219 insertions(+), 36 deletions(-) create mode 100644 docker-compose-template.yml create mode 100644 scripts/docker-compose-setup.sh diff --git a/Makefile b/Makefile index b0df2e6..3da93fa 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,9 @@ TARGET := videoanalytics PROJECT_ROOT := $(abspath .) +# Docker +DOCKER_COMPOSE_BACKEND := docker-compose.yml + # Scripts settings: SCRIPTS_DIR := scripts @@ -64,8 +67,7 @@ endef .PHONY: all launch frebuild stop silent-stop back-logs back-deep-logs back-sh deploy-backend # General: -all: run-app # Launch videoanalytics (EXAMPLE USAGE>> make ) -# all: check stop run-app # Launch videoanalytics (EXAMPLE USAGE>> make ) +all: check silent-stop run-app # Launch videoanalytics (EXAMPLE USAGE>> make ) launch: silent-stop run-app # Launch videoanalytics without user choice to stop containers (EXAMPLE USAGE>> make launch) @@ -89,40 +91,21 @@ back-sh: get-inside-backend # To get into backend (EXAMPLE USAGE>> make back-sh) # ------------------------------ .PHONY: run-app -# run-app: figlet-launch compose-up-script - -run-app: figlet-launch up-django-dockerfile +run-app: figlet-launch compose-up-script # Sub commands: # ------------------------------ -.PHONY: figlet-launch up-django-dockerfile compose-up-script see-backend-logs stop-containers fclean stop-containers-without-read get-inside-backend ffclean check +.PHONY: figlet-launch compose-up-script see-backend-logs stop-containers fclean stop-containers-without-read get-inside-backend ffclean check figlet-launch: @echo "\n\n\n" @figlet -c -t -f "ANSI Shadow" Launch app... @echo "\n\n\n" -up-django-dockerfile: - @echo "$(COLOR_YELLOW)$(TAB)Stopping and deleting previous djangoo container...$(COLOR_CLEAR)" - @sudo docker stop djangoo_container || true - @sudo docker rm djangoo_container || true - @echo "$(COLOR_YELLOW)$(TAB)Creating backend image...$(COLOR_CLEAR)" - @sudo docker build -t djangoo $(TARGET)/. - @if [ -e /dev/video0 ]; then \ - echo "$(COLOR_YELLOW)$(TAB)Running backend container with webcam...$(COLOR_CLEAR)"; \ - sudo docker run -d -p 8000:8000 --device=/dev/video0 --name djangoo_container djangoo; \ - else \ - echo "$(COLOR_YELLOW)$(TAB)Running backend container without webcam...$(COLOR_CLEAR)"; \ - sudo docker run -d -p 8000:8000 --name djangoo_container djangoo; \ - fi - @echo "$(COLOR_GREEN)$(TAB)Backend container started up successfully!$(COLOR_CLEAR)" - - - get-inside-backend: @echo "$(COLOR_YELLOW)$(TAB)Backend container sh...$(COLOR_CLEAR)" - @export CONTAINER_ID=$$(sudo docker ps -q --filter "name=djangoo_container"); \ + @export CONTAINER_ID=$$(sudo docker ps -q --filter "name=django_videoanalytics"); \ sudo docker exec -it $$CONTAINER_ID sh @echo "$(COLOR_GREEN)$(TAB)Backend container sh successfully!$(COLOR_CLEAR)" @@ -133,13 +116,13 @@ compose-up-script: see-backend-logs: @echo "$(COLOR_YELLOW)$(TAB)Backend logs...$(COLOR_CLEAR)" - @export CONTAINER_ID=$$(sudo docker ps -q --filter "name=djangoo_container"); \ + @export CONTAINER_ID=$$(sudo docker ps -q --filter "name=django_videoanalytics"); \ sudo docker exec -it $$CONTAINER_ID tail -f /var/log/fastapi.log @echo "$(COLOR_GREEN)$(TAB)Backend logs finished successfully!$(COLOR_CLEAR)" see-backend-deep-logs: @echo "$(COLOR_YELLOW)$(TAB)Backend deep logs...$(COLOR_CLEAR)" - @export CONTAINER_ID=$$(sudo docker ps -q --filter "name=djangoo_container"); \ + @export CONTAINER_ID=$$(sudo docker ps -q --filter "name=django_videoanalytics"); \ sudo docker exec -it $$CONTAINER_ID cat /var/log/fastapi.log @echo "$(COLOR_GREEN)$(TAB)Backend deep logs finished successfully!$(COLOR_CLEAR)" diff --git a/README.md b/README.md index a38d618..75f51a9 100644 --- a/README.md +++ b/README.md @@ -77,13 +77,10 @@ bash scripts/run.sh **Выполнить следующую команду:** ```bash sudo apt install -y make figlet -sudo docker build -t djangoo -sudo docker run -d -p 8000:8000 --name djangoo_container djangoo -// ИЛИ при наличии вебкамеры -sudo docker run -d -p 8000:8000 --device=/dev/video0 --name djangoo_container djangoo - +bash scripts/docker-compose-setup.sh +sudo make open http://127.0.1.1:8000/video_feed/?camera_url=do_not_have_webcam__if_have_dont_parametize__just_video_feed_slash -// ИЛИ при наличии вебкамеры +## ИЛИ при наличии вебкамеры open http://127.0.1.1:8000/video_feed/ ``` # Ожидаемый результат diff --git a/docker-compose-template.yml b/docker-compose-template.yml new file mode 100644 index 0000000..79419c8 --- /dev/null +++ b/docker-compose-template.yml @@ -0,0 +1,40 @@ +version: "3.9" + +services: + postgres: + container_name: postgres_videoanalytics + image: postgres:latest + environment: + - POSTGRES_DB=my_database + - POSTGRES_USER=my_username + - POSTGRES_PASSWORD=my_password + networks: + - django_network + volumes: + - ./data:/var/lib/postgresql/data + + django: + container_name: django_videoanalytics + build: + context: ./videoanalytics/ + dockerfile: Dockerfile + ports: + - 8000:8000 + depends_on: + - postgres + environment: + - POSTGRES_HOST=postgres + - POSTGRES_PORT=5432 + - POSTGRES_DB=my_database + - POSTGRES_USER=my_username + - POSTGRES_PASSWORD=my_password + networks: + - django_network + # ${DEVICES}: + # ${DEVICES_DASH} /dev/video0:/dev/video0 + volumes: + - ./data:/var/lib/postgresql/data + +networks: + django_network: + driver: bridge diff --git a/scripts/docker-compose-setup.sh b/scripts/docker-compose-setup.sh new file mode 100644 index 0000000..ca5b8bc --- /dev/null +++ b/scripts/docker-compose-setup.sh @@ -0,0 +1,45 @@ +############################################################################### +# File name: configure.sh +# Description: This script looks for webcam on system and creates docker-compose.yml file depending on it. +# Author: ovctech +# Date: February 2024 +############################################################################### + +#!/bin/bash + +############################################################################### + +# Check if the current directory is named "scripts" +RUNNING_FROM=$(basename "$PWD") +if [ "$RUNNING_FROM" == "scripts" ]; then + RELATIVE_PATH=".." +else + RELATIVE_PATH="." +fi + +############################################################################### + +# █████╗ █████╗ █████╗ █████╗ █████╗ █████╗ █████╗ █████╗ +# ╚════╝ ╚════╝ ╚════╝ ╚════╝ ╚════╝ ╚════╝ ╚════╝ ╚════╝ + +############################################################################### + +# Constants +TEMPLATE_DOCKER_COMPOSE="$RELATIVE_PATH/docker-compose-template.yml" +SOURCE_DOCKER_COMPOSE="$RELATIVE_PATH/docker-compose.yml" + +############################################################################### + +# Creating docker compose file for launch software +cp $TEMPLATE_DOCKER_COMPOSE $SOURCE_DOCKER_COMPOSE + +# If webcam is detected on system +if test -n "$(find /dev -name 'video*' -print -quit)"; then + DEVICES="- /dev/video0:/dev/video0" +fi + +# Then updating docker compose file +if [ -n "$DEVICES" ]; then + sed -i 's/# ${DEVICES}/devices/' $SOURCE_DOCKER_COMPOSE + sed -i 's/# ${DEVICES_DASH}/-/' $SOURCE_DOCKER_COMPOSE +fi diff --git a/scripts/run.sh b/scripts/run.sh index d9b5424..298f462 100644 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -59,6 +59,9 @@ fi ############################################################################### +# Prepate docker compose file depending on system webcam +bash $RELATIVE_PATH/scripts/docker-compose-setup.sh + # Run application if dependicies are already installed sudo make sleep 3 diff --git a/videoanalytics/Dockerfile b/videoanalytics/Dockerfile index fb4e696..ec3386f 100644 --- a/videoanalytics/Dockerfile +++ b/videoanalytics/Dockerfile @@ -8,6 +8,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ libffi-dev \ libssl-dev \ + libpq-dev \ && rm -rf /var/lib/apt/lists/* RUN python -m pip install --no-cache-dir poetry==1.7.1 \ diff --git a/videoanalytics/backend/settings.py b/videoanalytics/backend/settings.py index 6f78def..5904d87 100644 --- a/videoanalytics/backend/settings.py +++ b/videoanalytics/backend/settings.py @@ -11,6 +11,7 @@ """ from pathlib import Path +import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -77,8 +78,12 @@ DATABASES = { "default": { - "ENGINE": "django.db.backends.sqlite3", - "NAME": BASE_DIR / "db.sqlite3", + "ENGINE": "django.db.backends.postgresql", + "HOST": os.environ.get("POSTGRES_HOST", "localhost"), + "PORT": os.environ.get("POSTGRES_PORT", ""), + "NAME": os.environ.get("POSTGRES_DB", ""), + "USER": os.environ.get("POSTGRES_USER", ""), + "PASSWORD": os.environ.get("POSTGRES_PASSWORD", ""), } } diff --git a/videoanalytics/poetry.lock b/videoanalytics/poetry.lock index 93c23ec..1bd7b51 100644 --- a/videoanalytics/poetry.lock +++ b/videoanalytics/poetry.lock @@ -408,6 +408,87 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "psycopg2-binary" +version = "2.9.9" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, +] + [[package]] name = "pytest" version = "7.4.4" @@ -712,4 +793,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10.0" -content-hash = "322b00e1fa8aeeab52e62e8340d9519a0177cf794f8dc664bf61f7879f275c9a" +content-hash = "f136ee2cd8f60935224ef6a489c31d4b5f58d77b4596100ec0a28e31fc803eeb" diff --git a/videoanalytics/pyproject.toml b/videoanalytics/pyproject.toml index 1467769..bd3862e 100644 --- a/videoanalytics/pyproject.toml +++ b/videoanalytics/pyproject.toml @@ -11,6 +11,7 @@ django = "^4.2.10" djangorestframework = "^3.14.0" django-admin = "^2.0.2" opencv-python-headless = "^4.9.0.80" +psycopg2-binary = "^2.9.9" [tool.poetry.group.dev.dependencies] ruff = "^0.2.1" diff --git a/videoanalytics/videoanalytics/views.py b/videoanalytics/videoanalytics/views.py index 3ef303b..16f8bf2 100644 --- a/videoanalytics/videoanalytics/views.py +++ b/videoanalytics/videoanalytics/views.py @@ -1,5 +1,7 @@ import logging import cv2 +import psycopg2 +import os from collections.abc import Iterator from django.http import StreamingHttpResponse @@ -16,10 +18,35 @@ def video_demo(request): return render(request, "video_demo.html") +def get_camera_url(): + host = os.environ.get("POSTGRES_HOST") + port = os.environ.get("POSTGRES_PORT") + database = os.environ.get("POSTGRES_DB") + user = os.environ.get("POSTGRES_USER") + password = os.environ.get("POSTGRES_PASSWORD") + + conn = psycopg2.connect( + host=host, + port=port, + database=database, + user=user, + password=password, + ) + cursor = conn.cursor() + + cursor.execute("SELECT camera_url FROM my_table WHERE id = 1") + result = cursor.fetchone() + + cursor.close() + conn.close() + + return result[0] if result else "/app/videoanalytics/test.mp4" + + def gen_frames(camera_url: str | int) -> Iterator[bytes]: logger.info(f"Attempting to open camera URL:{camera_url}") if camera_url != 0: - camera_url = "/app/videoanalytics/test.mp4" + camera_url = get_camera_url() cap = cv2.VideoCapture(camera_url) if not cap.isOpened(): logger.info("Failed to open camera.") From 91d6def67ea2049988ee59879bcea6df925efe70 Mon Sep 17 00:00:00 2001 From: ovchenkov Date: Sun, 11 Feb 2024 23:18:22 +0300 Subject: [PATCH 2/2] 11 Feb | dev_ovctech | checkpoint_2 .gitgnore add --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 55212b5..bf004d4 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,5 @@ cython_debug/ #.idea/ .python-version +data +docker-compose.yml