From 5b5ee70d8c23aca8686f908b447c9fdb6f390854 Mon Sep 17 00:00:00 2001 From: Matthew Macdonald-Wallace Date: Wed, 12 Mar 2025 07:37:32 +0000 Subject: [PATCH 1/8] Add initial README --- README.md | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e772a82..7c0f312 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,39 @@ -# Wye Make Template +# Inventory -This repository is used as the base for all our other code. +An inventory platform for Wye Make. + +SnipeIT is overly complicated, Homebox doesn't have the features we need, so we're writing our own. + +## Goals + +This system has been written to adhere to the following goals: + +### 1. API-Driven + +If you're not a developer, this probably means nothing to you, but it enables us to talk to the system from just about anything else including our website, our membership system, Discord, and even Smart Assistants such as Amazon Alexa and Google Home. + +It means the system remains flexible and can be updated without worrying about how people access it. + +### 2. Tailored to our needs + +As a makerspace, we have a number of requirements that other systems either don't have or make overly complex. + +Whilst we will release the code "early and often", we will not release a version 1.0 until the following features are in place: + + - [ ] The ability to add and remove items + - [ ] The ability to add items to a specific location + - [ ] The ability to "nest" locations (i.e. "The hammer is in toolbox 01 which is stored in cupboard 9 in room 5 of the space") + - [ ] The ability to "loan" equipment to members + - [ ] The ability to track stock of consumables and who is using them + +### 3. Open Source + +The platform will use Open Source software. + +The backend will be written using the [Django](https://www.djangoproject.com/) framework and [Treebeard](https://django-treebeard.readthedocs.io/en/latest/tutorial.html) to deal with nested locations, the API is provided by the [Django Rest Framework (DRF)](https://www.django-rest-framework.org/). + +The platform is backed by the PostgreSQL database, and application performance is measured using the [Open Telemetry](https://opentelemetry.io) framework. + +The project itself is released under the [MIT Licence](https://choosealicense.com/licenses/mit/) and we hope that this will encourage anyone who uses the platform to donate their improvements back to the original code base. -## How do I use it? -Raise a PR against [the infrastructure repo](https://github.com/MakeMonmouth/wye-make-IaC) requesting a new git repository, and you'll get everything that's in here automatically! From 2ae6c88f2713e24c499e9485f821afdc2348a144 Mon Sep 17 00:00:00 2001 From: Matthew Macdonald-Wallace Date: Wed, 12 Mar 2025 19:45:10 +0000 Subject: [PATCH 2/8] Create the python pipeline --- .github/workflows/python.yml | 42 ++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/python.yml diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml new file mode 100644 index 0000000..8971730 --- /dev/null +++ b/.github/workflows/python.yml @@ -0,0 +1,42 @@ +name: Python Tests + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["pypy3.10", "3.10", "3.11", "3.12", "3.13"] + + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + # You can test your matrix by printing the current Python version + - name: Install dependencies + run: | + python -m pip install --upgrade pip setuptools wheel + pip install -r requirements.txt + - name: Install the code linting and formatting tool Ruff + run: pipx install ruff + - name: Lint code with Ruff + run: ruff check --output-format=github --target-version=${{ matrix.python-version }} + - name: Check code formatting with Ruff + run: ruff format --diff --target-version=${{ matrix.python-version }} + continue-on-error: true + - name: Install tox and any other packages + run: pip install tox + - name: Run tox + run: tox -e py + - name: Upload tox test results + uses: actions/upload-artifact@v4 + with: + name: pytest-results-${{ matrix.python-version }} + path: junit/test-results-${{ matrix.python-version }}.xml + # Use always() to always run this step to publish test results when there are test failures + if: ${{ always() }} From 177fcdd2f5cb391dcde64906a11b49702a488d13 Mon Sep 17 00:00:00 2001 From: Matthew Macdonald-Wallace Date: Wed, 12 Mar 2025 19:54:57 +0000 Subject: [PATCH 3/8] Add gitignore --- .gitignore | 174 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0a19790 --- /dev/null +++ b/.gitignore @@ -0,0 +1,174 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc From 27c0fa742f507e3affa6f3b1ae3d1b3910cce6e9 Mon Sep 17 00:00:00 2001 From: Matthew Macdonald-Wallace Date: Wed, 12 Mar 2025 19:55:16 +0000 Subject: [PATCH 4/8] tox config and dummy test to check that github actions are working --- server/README.md | 3 +++ server/tests/test_create_inventory_location.py | 9 +++++++++ server/tox.ini | 10 ++++++++++ 3 files changed, 22 insertions(+) create mode 100644 server/README.md create mode 100644 server/tests/test_create_inventory_location.py create mode 100644 server/tox.ini diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000..fb27289 --- /dev/null +++ b/server/README.md @@ -0,0 +1,3 @@ +# Inventory Server + +This folder contains all of the source code for the server diff --git a/server/tests/test_create_inventory_location.py b/server/tests/test_create_inventory_location.py new file mode 100644 index 0000000..36e9497 --- /dev/null +++ b/server/tests/test_create_inventory_location.py @@ -0,0 +1,9 @@ +# A dummy function to ensure github actions is working +def inc(x): + return x + 1 + +def test_positive(): + assert inc(3) == 4 + +def test_negative(): + assert inc(3) == 5 diff --git a/server/tox.ini b/server/tox.ini new file mode 100644 index 0000000..a75ec90 --- /dev/null +++ b/server/tox.ini @@ -0,0 +1,10 @@ +[tox] +requires = tox>=4 + +[testenv] +description = Run the unit tests +deps = + pytest>=8 + pytest-sugar +commands = + pytest {posargs:tests} From 1ed31a63c9da5898e5c1cf4ea1bba8df3c027241 Mon Sep 17 00:00:00 2001 From: Matthew Macdonald-Wallace Date: Wed, 12 Mar 2025 20:00:08 +0000 Subject: [PATCH 5/8] Set the working directory --- .github/workflows/python.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 8971730..046798e 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -4,6 +4,9 @@ on: [push] jobs: build: + defaults: + run: + working-directory: ./server runs-on: ubuntu-latest strategy: From 07bb1ac06b84cf6faeff3391173e5bc899f144d0 Mon Sep 17 00:00:00 2001 From: Matthew Macdonald-Wallace Date: Wed, 12 Mar 2025 20:00:22 +0000 Subject: [PATCH 6/8] Add initial requirements.txt --- server/requirements.txt | 182 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 server/requirements.txt diff --git a/server/requirements.txt b/server/requirements.txt new file mode 100644 index 0000000..3486bd8 --- /dev/null +++ b/server/requirements.txt @@ -0,0 +1,182 @@ +ackermann-msgs==2.0.2 +action-msgs==2.0.2 +action-tutorials-interfaces==0.33.5 +action-tutorials-py==0.33.5 +actionlib-msgs==5.3.5 +actuator-msgs==0.0.1 +ament-cmake-test==2.5.3 +ament-copyright==0.17.1 +ament-cppcheck==0.17.1 +ament-cpplint==0.17.1 +ament-flake8==0.17.1 +ament-index-python==1.8.1 +ament-lint==0.17.1 +ament-lint-cmake==0.17.1 +ament-package==0.16.3 +ament-pep257==0.17.1 +ament-uncrustify==0.17.1 +ament-xmllint==0.17.1 +angles==1.16.0 +builtin-interfaces==2.0.2 +cachetools==5.5.2 +chardet==5.2.0 +colorama==0.4.6 +composition-interfaces==2.0.2 +control-msgs==5.3.0 +controller-manager==4.25.0 +controller-manager-msgs==4.25.0 +cv-bridge==4.1.0 +demo-nodes-py==0.33.5 +diagnostic-msgs==5.3.5 +diagnostic-updater==4.2.1 +distlib==0.3.9 +domain-coordinator==0.12.0 +example-interfaces==0.12.0 +examples-rclpy-executors==0.19.4 +examples-rclpy-minimal-action-client==0.19.4 +examples-rclpy-minimal-action-server==0.19.4 +examples-rclpy-minimal-client==0.19.4 +examples-rclpy-minimal-publisher==0.19.4 +examples-rclpy-minimal-service==0.19.4 +examples-rclpy-minimal-subscriber==0.19.4 +filelock==3.17.0 +generate-parameter-library-py==0.4.0 +geometry-msgs==5.3.5 +gps-msgs==2.0.4 +graph-msgs==0.2.0 +grbl-msgs==0.0.2 +grbl-ros==0.0.16 +image-geometry==4.1.0 +interactive-markers==2.5.4 +joint-state-publisher==2.4.0 +joint-state-publisher-gui==2.4.0 +laser-geometry==2.7.0 +launch==3.4.3 +launch-param-builder==0.1.1 +launch-ros==0.26.6 +launch-testing==3.4.3 +launch-testing-ros==0.26.6 +launch-xml==3.4.3 +launch-yaml==3.4.3 +lifecycle-msgs==2.0.2 +logging-demo==0.33.5 +map-msgs==2.4.1 +message-filters==4.11.3 +moveit==2.12.1 +moveit-configs-utils==2.12.1 +moveit-msgs==2.6.0 +nav-msgs==5.3.5 +object-recognition-msgs==2.0.0 +octomap-msgs==2.0.1 +osrf-pycommon==2.1.5 +packaging==24.2 +pcl-msgs==1.0.0 +pendulum-msgs==0.33.5 +platformdirs==4.3.6 +pluggy==1.5.0 +pyproject-api==1.9.0 +python-qt-binding==2.2.1 +qt-dotgraph==2.7.5 +qt-gui==2.7.5 +qt-gui-cpp==2.7.5 +qt-gui-py-common==2.7.5 +quality-of-service-demo-py==0.33.5 +rcl-interfaces==2.0.2 +rclpy==7.1.3 +rcutils==6.7.2 +resource-retriever==3.4.3 +rmw-dds-common==3.1.0 +ros-gz-bridge==1.0.7 +ros-gz-interfaces==1.0.7 +ros-gz-sim==1.0.7 +ros2-controllers-test-nodes==4.20.0 +ros2action==0.32.2 +ros2bag==0.26.6 +ros2bag-mcap-cli==0.26.6 +ros2bag-sqlite3-cli==0.26.6 +ros2cli==0.32.2 +ros2component==0.32.2 +ros2controlcli==4.25.0 +ros2doctor==0.32.2 +ros2interface==0.32.2 +ros2launch==0.26.6 +ros2lifecycle==0.32.2 +ros2multicast==0.32.2 +ros2node==0.32.2 +ros2param==0.32.2 +ros2pkg==0.32.2 +ros2run==0.32.2 +ros2service==0.32.2 +ros2topic==0.32.2 +rosbag2-interfaces==0.26.6 +rosbag2-py==0.26.6 +rosgraph-msgs==2.0.2 +rosidl-adapter==4.6.5 +rosidl-cli==4.6.5 +rosidl-cmake==4.6.5 +rosidl-generator-c==4.6.5 +rosidl-generator-cpp==4.6.5 +rosidl-generator-py==0.22.0 +rosidl-generator-type-description==4.6.5 +rosidl-parser==4.6.5 +rosidl-pycommon==4.6.5 +rosidl-runtime-py==0.13.1 +rosidl-typesupport-c==3.2.2 +rosidl-typesupport-cpp==3.2.2 +rosidl-typesupport-fastrtps-c==3.6.1 +rosidl-typesupport-fastrtps-cpp==3.6.1 +rosidl-typesupport-introspection-c==4.6.5 +rosidl-typesupport-introspection-cpp==4.6.5 +rpyutils==0.4.1 +rqt-action==2.2.0 +rqt-bag==1.5.4 +rqt-bag-plugins==1.5.4 +rqt-console==2.2.1 +rqt-controller-manager==4.25.0 +rqt-graph==1.5.4 +rqt-gui==1.6.0 +rqt-gui-py==1.6.0 +rqt-msg==1.5.1 +rqt-plot==1.4.0 +rqt-publisher==1.7.2 +rqt-py-common==1.6.0 +rqt-py-console==1.2.2 +rqt-reconfigure==1.6.2 +rqt-service-caller==1.2.1 +rqt-shell==1.2.2 +rqt-srv==1.2.2 +rqt-topic==1.7.3 +ruff==0.9.10 +sensor-msgs==5.3.5 +sensor-msgs-py==5.3.5 +service-msgs==2.0.2 +shape-msgs==5.3.5 +srdfdom==2.0.7 +sros2==0.13.2 +statistics-msgs==2.0.2 +std-msgs==5.3.5 +std-srvs==5.3.5 +stereo-msgs==5.3.5 +teleop-twist-keyboard==2.4.0 +tf-transformations==1.1.0 +tf2-geometry-msgs==0.36.8 +tf2-kdl==0.36.8 +tf2-msgs==0.36.8 +tf2-py==0.36.8 +tf2-ros-py==0.36.8 +tf2-sensor-msgs==0.36.8 +tf2-tools==0.36.8 +theora-image-transport==4.0.3 +topic-monitor==0.33.5 +topic-tools==1.3.2 +topic-tools-interfaces==1.3.2 +tox==4.24.2 +trajectory-msgs==5.3.5 +turtlesim==1.8.3 +type-description-interfaces==2.0.2 +unique-identifier-msgs==2.5.0 +urdfdom-py==1.2.1 +virtualenv==20.29.3 +vision-msgs==4.1.1 +visualization-msgs==5.3.5 +xacro==2.0.11 From 28c23f55c3fba126dd9c42207018d160887c9dc8 Mon Sep 17 00:00:00 2001 From: Matthew Macdonald-Wallace Date: Wed, 12 Mar 2025 20:03:24 +0000 Subject: [PATCH 7/8] Only test against python 3.13 and 3.12 --- .github/workflows/python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 046798e..4c6bc56 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["pypy3.10", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.12", "3.13"] steps: - uses: actions/checkout@v4 From 6895c3bfa0ac074335337521b4a1adad90c3780f Mon Sep 17 00:00:00 2001 From: Matthew Macdonald-Wallace Date: Wed, 12 Mar 2025 20:06:50 +0000 Subject: [PATCH 8/8] Just install DRF from requirements.txt --- server/requirements.txt | 183 +--------------------------------------- 1 file changed, 1 insertion(+), 182 deletions(-) diff --git a/server/requirements.txt b/server/requirements.txt index 3486bd8..db2ed80 100644 --- a/server/requirements.txt +++ b/server/requirements.txt @@ -1,182 +1 @@ -ackermann-msgs==2.0.2 -action-msgs==2.0.2 -action-tutorials-interfaces==0.33.5 -action-tutorials-py==0.33.5 -actionlib-msgs==5.3.5 -actuator-msgs==0.0.1 -ament-cmake-test==2.5.3 -ament-copyright==0.17.1 -ament-cppcheck==0.17.1 -ament-cpplint==0.17.1 -ament-flake8==0.17.1 -ament-index-python==1.8.1 -ament-lint==0.17.1 -ament-lint-cmake==0.17.1 -ament-package==0.16.3 -ament-pep257==0.17.1 -ament-uncrustify==0.17.1 -ament-xmllint==0.17.1 -angles==1.16.0 -builtin-interfaces==2.0.2 -cachetools==5.5.2 -chardet==5.2.0 -colorama==0.4.6 -composition-interfaces==2.0.2 -control-msgs==5.3.0 -controller-manager==4.25.0 -controller-manager-msgs==4.25.0 -cv-bridge==4.1.0 -demo-nodes-py==0.33.5 -diagnostic-msgs==5.3.5 -diagnostic-updater==4.2.1 -distlib==0.3.9 -domain-coordinator==0.12.0 -example-interfaces==0.12.0 -examples-rclpy-executors==0.19.4 -examples-rclpy-minimal-action-client==0.19.4 -examples-rclpy-minimal-action-server==0.19.4 -examples-rclpy-minimal-client==0.19.4 -examples-rclpy-minimal-publisher==0.19.4 -examples-rclpy-minimal-service==0.19.4 -examples-rclpy-minimal-subscriber==0.19.4 -filelock==3.17.0 -generate-parameter-library-py==0.4.0 -geometry-msgs==5.3.5 -gps-msgs==2.0.4 -graph-msgs==0.2.0 -grbl-msgs==0.0.2 -grbl-ros==0.0.16 -image-geometry==4.1.0 -interactive-markers==2.5.4 -joint-state-publisher==2.4.0 -joint-state-publisher-gui==2.4.0 -laser-geometry==2.7.0 -launch==3.4.3 -launch-param-builder==0.1.1 -launch-ros==0.26.6 -launch-testing==3.4.3 -launch-testing-ros==0.26.6 -launch-xml==3.4.3 -launch-yaml==3.4.3 -lifecycle-msgs==2.0.2 -logging-demo==0.33.5 -map-msgs==2.4.1 -message-filters==4.11.3 -moveit==2.12.1 -moveit-configs-utils==2.12.1 -moveit-msgs==2.6.0 -nav-msgs==5.3.5 -object-recognition-msgs==2.0.0 -octomap-msgs==2.0.1 -osrf-pycommon==2.1.5 -packaging==24.2 -pcl-msgs==1.0.0 -pendulum-msgs==0.33.5 -platformdirs==4.3.6 -pluggy==1.5.0 -pyproject-api==1.9.0 -python-qt-binding==2.2.1 -qt-dotgraph==2.7.5 -qt-gui==2.7.5 -qt-gui-cpp==2.7.5 -qt-gui-py-common==2.7.5 -quality-of-service-demo-py==0.33.5 -rcl-interfaces==2.0.2 -rclpy==7.1.3 -rcutils==6.7.2 -resource-retriever==3.4.3 -rmw-dds-common==3.1.0 -ros-gz-bridge==1.0.7 -ros-gz-interfaces==1.0.7 -ros-gz-sim==1.0.7 -ros2-controllers-test-nodes==4.20.0 -ros2action==0.32.2 -ros2bag==0.26.6 -ros2bag-mcap-cli==0.26.6 -ros2bag-sqlite3-cli==0.26.6 -ros2cli==0.32.2 -ros2component==0.32.2 -ros2controlcli==4.25.0 -ros2doctor==0.32.2 -ros2interface==0.32.2 -ros2launch==0.26.6 -ros2lifecycle==0.32.2 -ros2multicast==0.32.2 -ros2node==0.32.2 -ros2param==0.32.2 -ros2pkg==0.32.2 -ros2run==0.32.2 -ros2service==0.32.2 -ros2topic==0.32.2 -rosbag2-interfaces==0.26.6 -rosbag2-py==0.26.6 -rosgraph-msgs==2.0.2 -rosidl-adapter==4.6.5 -rosidl-cli==4.6.5 -rosidl-cmake==4.6.5 -rosidl-generator-c==4.6.5 -rosidl-generator-cpp==4.6.5 -rosidl-generator-py==0.22.0 -rosidl-generator-type-description==4.6.5 -rosidl-parser==4.6.5 -rosidl-pycommon==4.6.5 -rosidl-runtime-py==0.13.1 -rosidl-typesupport-c==3.2.2 -rosidl-typesupport-cpp==3.2.2 -rosidl-typesupport-fastrtps-c==3.6.1 -rosidl-typesupport-fastrtps-cpp==3.6.1 -rosidl-typesupport-introspection-c==4.6.5 -rosidl-typesupport-introspection-cpp==4.6.5 -rpyutils==0.4.1 -rqt-action==2.2.0 -rqt-bag==1.5.4 -rqt-bag-plugins==1.5.4 -rqt-console==2.2.1 -rqt-controller-manager==4.25.0 -rqt-graph==1.5.4 -rqt-gui==1.6.0 -rqt-gui-py==1.6.0 -rqt-msg==1.5.1 -rqt-plot==1.4.0 -rqt-publisher==1.7.2 -rqt-py-common==1.6.0 -rqt-py-console==1.2.2 -rqt-reconfigure==1.6.2 -rqt-service-caller==1.2.1 -rqt-shell==1.2.2 -rqt-srv==1.2.2 -rqt-topic==1.7.3 -ruff==0.9.10 -sensor-msgs==5.3.5 -sensor-msgs-py==5.3.5 -service-msgs==2.0.2 -shape-msgs==5.3.5 -srdfdom==2.0.7 -sros2==0.13.2 -statistics-msgs==2.0.2 -std-msgs==5.3.5 -std-srvs==5.3.5 -stereo-msgs==5.3.5 -teleop-twist-keyboard==2.4.0 -tf-transformations==1.1.0 -tf2-geometry-msgs==0.36.8 -tf2-kdl==0.36.8 -tf2-msgs==0.36.8 -tf2-py==0.36.8 -tf2-ros-py==0.36.8 -tf2-sensor-msgs==0.36.8 -tf2-tools==0.36.8 -theora-image-transport==4.0.3 -topic-monitor==0.33.5 -topic-tools==1.3.2 -topic-tools-interfaces==1.3.2 -tox==4.24.2 -trajectory-msgs==5.3.5 -turtlesim==1.8.3 -type-description-interfaces==2.0.2 -unique-identifier-msgs==2.5.0 -urdfdom-py==1.2.1 -virtualenv==20.29.3 -vision-msgs==4.1.1 -visualization-msgs==5.3.5 -xacro==2.0.11 +django-rest-framework