diff --git a/.run/Skeleton (27).run.xml b/.run/Skeleton (27).run.xml
index 123a3689..702963d5 100644
--- a/.run/Skeleton (27).run.xml
+++ b/.run/Skeleton (27).run.xml
@@ -4,20 +4,21 @@
-
+
+
-
+
-
+
diff --git a/.run/Skeleton (28).run.xml b/.run/Skeleton (28).run.xml
new file mode 100644
index 00000000..4cb46d79
--- /dev/null
+++ b/.run/Skeleton (28).run.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.run/Skeleton (last).run.xml b/.run/Skeleton (last).run.xml
index 8cc05bbc..384d52fc 100644
--- a/.run/Skeleton (last).run.xml
+++ b/.run/Skeleton (last).run.xml
@@ -4,20 +4,21 @@
-
+
+
-
+
-
+
diff --git a/.run/TalkBot (27).run.xml b/.run/TalkBot (27).run.xml
index 0d85e724..3e451b32 100644
--- a/.run/TalkBot (27).run.xml
+++ b/.run/TalkBot (27).run.xml
@@ -4,20 +4,21 @@
-
+
+
-
+
-
+
diff --git a/.run/TalkBot (last).run.xml b/.run/TalkBot (last).run.xml
index 940765a6..d11ebe06 100644
--- a/.run/TalkBot (last).run.xml
+++ b/.run/TalkBot (last).run.xml
@@ -4,20 +4,21 @@
-
+
+
-
+
-
+
diff --git a/.run/TalkBotAI (27).run.xml b/.run/TalkBotAI (27).run.xml
index ae38223c..3826c11f 100644
--- a/.run/TalkBotAI (27).run.xml
+++ b/.run/TalkBotAI (27).run.xml
@@ -10,14 +10,15 @@
+
-
+
-
+
diff --git a/.run/TalkBotAI (last).run.xml b/.run/TalkBotAI (last).run.xml
index 5ad55206..2d1bc34d 100644
--- a/.run/TalkBotAI (last).run.xml
+++ b/.run/TalkBotAI (last).run.xml
@@ -4,20 +4,21 @@
-
+
+
-
+
-
+
diff --git a/.run/ToGif (27).run.xml b/.run/ToGif (27).run.xml
index 88f1130a..b20f551a 100644
--- a/.run/ToGif (27).run.xml
+++ b/.run/ToGif (27).run.xml
@@ -10,14 +10,15 @@
+
-
+
-
+
diff --git a/.run/ToGif (28).run.xml b/.run/ToGif (28).run.xml
new file mode 100644
index 00000000..2573263e
--- /dev/null
+++ b/.run/ToGif (28).run.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.run/ToGif (last).run.xml b/.run/ToGif (last).run.xml
index 0787963d..d69db0d5 100644
--- a/.run/ToGif (last).run.xml
+++ b/.run/ToGif (last).run.xml
@@ -4,20 +4,21 @@
-
+
+
-
+
-
+
diff --git a/.run/UiExample (27).run.xml b/.run/UiExample (27).run.xml
index 49319804..2190ae16 100644
--- a/.run/UiExample (27).run.xml
+++ b/.run/UiExample (27).run.xml
@@ -4,15 +4,16 @@
-
+
+
-
+
diff --git a/.run/UiExample (28).run.xml b/.run/UiExample (28).run.xml
new file mode 100644
index 00000000..2bfedef7
--- /dev/null
+++ b/.run/UiExample (28).run.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.run/UiExample (last).run.xml b/.run/UiExample (last).run.xml
index 8169b5bb..3ed0e66e 100644
--- a/.run/UiExample (last).run.xml
+++ b/.run/UiExample (last).run.xml
@@ -4,15 +4,16 @@
-
+
+
-
+
diff --git a/.run/register_nc_py_api (27).run.xml b/.run/register_nc_py_api (27).run.xml
index f52595f3..d36d7258 100644
--- a/.run/register_nc_py_api (27).run.xml
+++ b/.run/register_nc_py_api (27).run.xml
@@ -4,12 +4,13 @@
-
+
+
diff --git a/.run/register_nc_py_api (28).run.xml b/.run/register_nc_py_api (28).run.xml
new file mode 100644
index 00000000..92f06f0d
--- /dev/null
+++ b/.run/register_nc_py_api (28).run.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.run/register_nc_py_api (last).run.xml b/.run/register_nc_py_api (last).run.xml
index a03bd643..f59b73a9 100644
--- a/.run/register_nc_py_api (last).run.xml
+++ b/.run/register_nc_py_api (last).run.xml
@@ -4,12 +4,13 @@
-
+
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b0725340..52a35425 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@
All notable changes to this project will be documented in this file.
-## [0.6.0 - 2023-12-0x]
+## [0.6.0 - 2023-12-06]
### Added
@@ -10,7 +10,7 @@ All notable changes to this project will be documented in this file.
### Fixed
-- AppAPI: added authentication to `/init` endpoint. #162
+- AppAPI: added authentication to the `/init` endpoint. #162
## [0.5.1 - 2023-11-12]
diff --git a/Makefile b/Makefile
index acbfac2f..8239c3fd 100644
--- a/Makefile
+++ b/Makefile
@@ -15,24 +15,34 @@ help:
@echo " Next commands are only for dev environment with nextcloud-docker-dev!"
@echo " They should run from the host you are developing on(with activated venv) and not in the container with Nextcloud!"
@echo " "
- @echo " register register nc_py_api for Nextcloud Last"
@echo " register27 register nc_py_api for Nextcloud 27"
+ @echo " register28 register nc_py_api for Nextcloud 28"
+ @echo " register register nc_py_api for Nextcloud Last"
@echo " "
- @echo " tests run nc_py_api tests for Nextcloud Last"
@echo " tests27 run nc_py_api tests for Nextcloud 27"
-
-.PHONY: register
-register:
- /bin/sh scripts/dev_register.sh master-nextcloud-1 nextcloud.local
+ @echo " tests28 run nc_py_api tests for Nextcloud 28"
+ @echo " tests run nc_py_api tests for Nextcloud Last"
.PHONY: register27
register27:
/bin/sh scripts/dev_register.sh master-stable27-1 stable27.local
-.PHONY: tests
-tests:
- NEXTCLOUD_URL=http://nextcloud.local python3 -m pytest
+.PHONY: register28
+register28:
+ /bin/sh scripts/dev_register.sh master-stable28-1 stable28.local
+
+.PHONY: register
+register:
+ /bin/sh scripts/dev_register.sh master-nextcloud-1 nextcloud.local
.PHONY: tests27
tests27:
NEXTCLOUD_URL=http://stable27.local python3 -m pytest
+
+.PHONY: tests28
+tests28:
+ NEXTCLOUD_URL=http://stable28.local python3 -m pytest
+
+.PHONY: tests
+tests:
+ NEXTCLOUD_URL=http://nextcloud.local python3 -m pytest
diff --git a/docs/NextcloudApp.rst b/docs/NextcloudApp.rst
index 2e162ce4..2fade456 100644
--- a/docs/NextcloudApp.rst
+++ b/docs/NextcloudApp.rst
@@ -8,7 +8,7 @@ As a first step, let's take a look at the structure of a basic Python applicatio
Skeleton
--------
-.. literalinclude:: ../examples/as_app/skeleton/src/main.py
+.. literalinclude:: ../examples/as_app/skeleton/lib/main.py
What's going on in the skeleton?
diff --git a/examples/as_app/skeleton/Dockerfile b/examples/as_app/skeleton/Dockerfile
index 53f2f95e..04f1e496 100644
--- a/examples/as_app/skeleton/Dockerfile
+++ b/examples/as_app/skeleton/Dockerfile
@@ -1,10 +1,15 @@
FROM python:3.11-slim-bookworm
COPY requirements.txt /
-ADD /src/ /app/
+
+ADD cs[s] /app/css
+ADD im[g] /app/img
+ADD j[s] /app/js
+ADD l10[n] /app/l10n
+ADD li[b] /app/lib
RUN \
python3 -m pip install -r requirements.txt && rm -rf ~/.cache && rm requirements.txt
-WORKDIR /app
+WORKDIR /app/lib
ENTRYPOINT ["python3", "main.py"]
diff --git a/examples/as_app/skeleton/Makefile b/examples/as_app/skeleton/Makefile
index d58f7eda..65605845 100644
--- a/examples/as_app/skeleton/Makefile
+++ b/examples/as_app/skeleton/Makefile
@@ -9,39 +9,42 @@ help:
@echo " "
@echo " build-push build image and upload to ghcr.io"
@echo " "
- @echo " deploy deploy Skeleton to registered 'docker_dev' for Nextcloud Last"
@echo " deploy27 deploy Skeleton to registered 'docker_dev' for Nextcloud 27"
+ @echo " deploy28 deploy Skeleton to registered 'docker_dev' for Nextcloud 28"
+ @echo " deploy deploy Skeleton to registered 'docker_dev' for Nextcloud Last"
@echo " "
- @echo " run install Skeleton for Nextcloud Last"
@echo " run27 install Skeleton for Nextcloud 27"
+ @echo " run28 install Skeleton for Nextcloud 28"
+ @echo " run install Skeleton for Nextcloud Last"
@echo " "
@echo " For development of this example use PyCharm run configurations. Development is always set for last Nextcloud."
@echo " First run 'Skeleton' and then 'make registerXX', after that you can use/debug/develop it and easy test."
@echo " "
- @echo " register perform registration of running Skeleton into the 'manual_install' deploy daemon."
@echo " register27 perform registration of running Skeleton into the 'manual_install' deploy daemon."
+ @echo " register28 perform registration of running Skeleton into the 'manual_install' deploy daemon."
+ @echo " register perform registration of running Skeleton into the 'manual_install' deploy daemon."
.PHONY: build-push
build-push:
docker login ghcr.io
docker buildx build --push --platform linux/arm64/v8,linux/amd64 --tag ghcr.io/cloud-py-api/skeleton:latest .
-.PHONY: deploy
-deploy:
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister skeleton --silent || true
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:deploy skeleton docker_dev \
- --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/skeleton/appinfo/info.xml
-
.PHONY: deploy27
deploy27:
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:unregister skeleton --silent || true
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:deploy skeleton docker_dev \
--info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/skeleton/appinfo/info.xml
-.PHONY: run
-run:
+.PHONY: deploy28
+deploy28:
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:unregister skeleton --silent || true
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:deploy skeleton docker_dev \
+ --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/skeleton/appinfo/info.xml
+
+.PHONY: deploy
+deploy:
docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister skeleton --silent || true
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register skeleton docker_dev --force-scopes \
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:deploy skeleton docker_dev \
--info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/skeleton/appinfo/info.xml
.PHONY: run27
@@ -50,12 +53,17 @@ run27:
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:register skeleton docker_dev --force-scopes \
--info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/skeleton/appinfo/info.xml
-.PHONY: register
-register:
+.PHONY: run28
+run28:
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:unregister skeleton --silent || true
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:register skeleton docker_dev --force-scopes \
+ --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/skeleton/appinfo/info.xml
+
+.PHONY: run
+run:
docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister skeleton --silent || true
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register skeleton manual_install --json-info \
- "{\"appid\":\"skeleton\",\"name\":\"App Skeleton\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9030,\"scopes\":{\"required\":[],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
- --force-scopes --wait-finish
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register skeleton docker_dev --force-scopes \
+ --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/skeleton/appinfo/info.xml
.PHONY: register27
register27:
@@ -63,3 +71,17 @@ register27:
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:register skeleton manual_install --json-info \
"{\"appid\":\"skeleton\",\"name\":\"App Skeleton\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9030,\"scopes\":{\"required\":[],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
--force-scopes --wait-finish
+
+.PHONY: register28
+register28:
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:unregister skeleton --silent || true
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:register skeleton manual_install --json-info \
+ "{\"appid\":\"skeleton\",\"name\":\"App Skeleton\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9030,\"scopes\":{\"required\":[],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
+ --force-scopes --wait-finish
+
+.PHONY: register
+register:
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister skeleton --silent || true
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register skeleton manual_install --json-info \
+ "{\"appid\":\"skeleton\",\"name\":\"App Skeleton\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9030,\"scopes\":{\"required\":[],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
+ --force-scopes --wait-finish
diff --git a/examples/as_app/skeleton/src/main.py b/examples/as_app/skeleton/lib/main.py
similarity index 100%
rename from examples/as_app/skeleton/src/main.py
rename to examples/as_app/skeleton/lib/main.py
diff --git a/examples/as_app/talk_bot/Dockerfile b/examples/as_app/talk_bot/Dockerfile
index e400717e..7145e564 100644
--- a/examples/as_app/talk_bot/Dockerfile
+++ b/examples/as_app/talk_bot/Dockerfile
@@ -1,10 +1,15 @@
FROM python:3.11-alpine
COPY requirements.txt /
-ADD /src/ /app/
+
+ADD cs[s] /app/css
+ADD im[g] /app/img
+ADD j[s] /app/js
+ADD l10[n] /app/l10n
+ADD li[b] /app/lib
RUN \
python3 -m pip install -r requirements.txt && rm -rf ~/.cache && rm requirements.txt
-WORKDIR /app
+WORKDIR /app/lib
ENTRYPOINT ["python3", "main.py"]
diff --git a/examples/as_app/talk_bot/src/main.py b/examples/as_app/talk_bot/lib/main.py
similarity index 100%
rename from examples/as_app/talk_bot/src/main.py
rename to examples/as_app/talk_bot/lib/main.py
diff --git a/examples/as_app/talk_bot_ai/Dockerfile b/examples/as_app/talk_bot_ai/Dockerfile
index b2d030f6..ee072469 100644
--- a/examples/as_app/talk_bot_ai/Dockerfile
+++ b/examples/as_app/talk_bot_ai/Dockerfile
@@ -1,10 +1,15 @@
FROM python:3.11-bookworm
COPY requirements.txt /
-ADD /src/ /app/
+
+ADD cs[s] /app/css
+ADD im[g] /app/img
+ADD j[s] /app/js
+ADD l10[n] /app/l10n
+ADD li[b] /app/lib
RUN \
python3 -m pip install -r requirements.txt && rm -rf ~/.cache && rm requirements.txt
-WORKDIR /app
+WORKDIR /app/lib
ENTRYPOINT ["python3", "main.py"]
diff --git a/examples/as_app/talk_bot_ai/src/main.py b/examples/as_app/talk_bot_ai/lib/main.py
similarity index 100%
rename from examples/as_app/talk_bot_ai/src/main.py
rename to examples/as_app/talk_bot_ai/lib/main.py
diff --git a/examples/as_app/to_gif/Dockerfile b/examples/as_app/to_gif/Dockerfile
index d45d39b5..8d3764fe 100644
--- a/examples/as_app/to_gif/Dockerfile
+++ b/examples/as_app/to_gif/Dockerfile
@@ -1,7 +1,12 @@
FROM python:3.11-bookworm
COPY requirements.txt /
-ADD /src/ /app/
+
+ADD cs[s] /app/css
+ADD im[g] /app/img
+ADD j[s] /app/js
+ADD l10[n] /app/l10n
+ADD li[b] /app/lib
RUN \
apt-get update && \
@@ -11,5 +16,5 @@ RUN \
RUN \
python3 -m pip install -r requirements.txt && rm -rf ~/.cache && rm requirements.txt
-WORKDIR /app
+WORKDIR /app/lib
ENTRYPOINT ["python3", "main.py"]
diff --git a/examples/as_app/to_gif/Makefile b/examples/as_app/to_gif/Makefile
index 522598f2..333a34af 100644
--- a/examples/as_app/to_gif/Makefile
+++ b/examples/as_app/to_gif/Makefile
@@ -9,39 +9,42 @@ help:
@echo " "
@echo " build-push build image and upload to ghcr.io"
@echo " "
- @echo " deploy deploy example to registered 'docker_dev' for Nextcloud Last"
@echo " deploy27 deploy example to registered 'docker_dev' for Nextcloud 27"
+ @echo " deploy28 deploy example to registered 'docker_dev' for Nextcloud 28"
+ @echo " deploy deploy example to registered 'docker_dev' for Nextcloud Last"
@echo " "
- @echo " run install ToGif for Nextcloud Last"
@echo " run27 install ToGif for Nextcloud 27"
+ @echo " run28 install ToGif for Nextcloud 28"
+ @echo " run install ToGif for Nextcloud Last"
@echo " "
@echo " For development of this example use PyCharm run configurations. Development is always set for last Nextcloud."
@echo " First run 'ToGif' and then 'make registerXX', after that you can use/debug/develop it and easy test."
@echo " "
- @echo " register perform registration of running 'to_gif' into the 'manual_install' deploy daemon."
@echo " register27 perform registration of running 'to_gif' into the 'manual_install' deploy daemon."
+ @echo " register28 perform registration of running 'to_gif' into the 'manual_install' deploy daemon."
+ @echo " register perform registration of running 'to_gif' into the 'manual_install' deploy daemon."
.PHONY: build-push
build-push:
docker login ghcr.io
docker buildx build --push --platform linux/arm64/v8,linux/amd64 --tag ghcr.io/cloud-py-api/to_gif:latest .
-.PHONY: deploy
-deploy:
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister to_gif --silent || true
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:deploy to_gif docker_dev \
- --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/to_gif/appinfo/info.xml
-
.PHONY: deploy27
deploy27:
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:unregister to_gif --silent || true
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:deploy to_gif docker_dev \
--info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/to_gif/appinfo/info.xml
-.PHONY: run
-run:
+.PHONY: deploy28
+deploy28:
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:unregister to_gif --silent || true
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:deploy to_gif docker_dev \
+ --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/to_gif/appinfo/info.xml
+
+.PHONY: deploy
+deploy:
docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister to_gif --silent || true
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register to_gif docker_dev --force-scopes \
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:deploy to_gif docker_dev \
--info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/to_gif/appinfo/info.xml
.PHONY: run27
@@ -50,12 +53,17 @@ run27:
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:register to_gif docker_dev --force-scopes \
--info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/to_gif/appinfo/info.xml
-.PHONY: register
-register:
+.PHONY: run28
+run28:
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:unregister to_gif --silent || true
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:register to_gif docker_dev --force-scopes \
+ --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/to_gif/appinfo/info.xml
+
+.PHONY: run
+run:
docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister to_gif --silent || true
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register to_gif manual_install --json-info \
- "{\"appid\":\"to_gif\",\"name\":\"to_gif\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9031,\"scopes\":{\"required\":[\"FILES\", \"NOTIFICATIONS\"],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
- --force-scopes --wait-finish
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register to_gif docker_dev --force-scopes \
+ --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/to_gif/appinfo/info.xml
.PHONY: register27
register27:
@@ -63,3 +71,17 @@ register27:
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:register to_gif manual_install --json-info \
"{\"appid\":\"to_gif\",\"name\":\"to_gif\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9031,\"scopes\":{\"required\":[\"FILES\", \"NOTIFICATIONS\"],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
--force-scopes --wait-finish
+
+.PHONY: register28
+register28:
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:unregister to_gif --silent || true
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:register to_gif manual_install --json-info \
+ "{\"appid\":\"to_gif\",\"name\":\"to_gif\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9031,\"scopes\":{\"required\":[\"FILES\", \"NOTIFICATIONS\"],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
+ --force-scopes --wait-finish
+
+.PHONY: register
+register:
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister to_gif --silent || true
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register to_gif manual_install --json-info \
+ "{\"appid\":\"to_gif\",\"name\":\"to_gif\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9031,\"scopes\":{\"required\":[\"FILES\", \"NOTIFICATIONS\"],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
+ --force-scopes --wait-finish
diff --git a/examples/as_app/to_gif/img/icon.svg b/examples/as_app/to_gif/img/icon.svg
new file mode 100644
index 00000000..7c40cddd
--- /dev/null
+++ b/examples/as_app/to_gif/img/icon.svg
@@ -0,0 +1 @@
+
diff --git a/examples/as_app/to_gif/src/main.py b/examples/as_app/to_gif/lib/main.py
similarity index 87%
rename from examples/as_app/to_gif/src/main.py
rename to examples/as_app/to_gif/lib/main.py
index 0d02d664..0315ed33 100644
--- a/examples/as_app/to_gif/src/main.py
+++ b/examples/as_app/to_gif/lib/main.py
@@ -13,13 +13,7 @@
from requests import Response
from nc_py_api import FsNode, NextcloudApp
-from nc_py_api.ex_app import (
- LogLvl,
- UiFileActionHandlerInfo,
- nc_app,
- run_app,
- set_handlers,
-)
+from nc_py_api.ex_app import LogLvl, UiActionFileInfo, nc_app, run_app, set_handlers
@asynccontextmanager
@@ -75,11 +69,11 @@ def convert_video_to_gif(input_file: FsNode, nc: NextcloudApp):
@APP.post("/video_to_gif")
async def video_to_gif(
- file: UiFileActionHandlerInfo,
+ file: UiActionFileInfo,
nc: Annotated[NextcloudApp, Depends(nc_app)],
background_tasks: BackgroundTasks,
):
- background_tasks.add_task(convert_video_to_gif, file.actionFile.to_fs_node(), nc)
+ background_tasks.add_task(convert_video_to_gif, file.to_fs_node(), nc)
return Response()
@@ -87,9 +81,13 @@ def enabled_handler(enabled: bool, nc: NextcloudApp) -> str:
print(f"enabled={enabled}")
try:
if enabled:
- nc.ui.files_dropdown_menu.register("to_gif", "TO GIF", "/video_to_gif", mime="video")
- else:
- nc.ui.files_dropdown_menu.unregister("to_gif")
+ nc.ui.files_dropdown_menu.register(
+ "to_gif",
+ "TO GIF",
+ "/video_to_gif",
+ mime="video",
+ icon="img/icon.svg",
+ )
except Exception as e:
return str(e)
return ""
diff --git a/examples/as_app/ui_example/Dockerfile b/examples/as_app/ui_example/Dockerfile
index 53f2f95e..04f1e496 100644
--- a/examples/as_app/ui_example/Dockerfile
+++ b/examples/as_app/ui_example/Dockerfile
@@ -1,10 +1,15 @@
FROM python:3.11-slim-bookworm
COPY requirements.txt /
-ADD /src/ /app/
+
+ADD cs[s] /app/css
+ADD im[g] /app/img
+ADD j[s] /app/js
+ADD l10[n] /app/l10n
+ADD li[b] /app/lib
RUN \
python3 -m pip install -r requirements.txt && rm -rf ~/.cache && rm requirements.txt
-WORKDIR /app
+WORKDIR /app/lib
ENTRYPOINT ["python3", "main.py"]
diff --git a/examples/as_app/ui_example/Makefile b/examples/as_app/ui_example/Makefile
index 60e24d3b..72a90c4f 100644
--- a/examples/as_app/ui_example/Makefile
+++ b/examples/as_app/ui_example/Makefile
@@ -9,39 +9,42 @@ help:
@echo " "
@echo " build-push build image and upload to ghcr.io"
@echo " "
- @echo " deploy deploy UiExample to registered 'docker_dev' for Nextcloud Last"
@echo " deploy27 deploy UiExample to registered 'docker_dev' for Nextcloud 27"
+ @echo " deploy28 deploy UiExample to registered 'docker_dev' for Nextcloud 28"
+ @echo " deploy deploy UiExample to registered 'docker_dev' for Nextcloud Last"
@echo " "
- @echo " run install UiExample for Nextcloud Last"
@echo " run27 install UiExample for Nextcloud 27"
+ @echo " run28 install UiExample for Nextcloud 28"
+ @echo " run install UiExample for Nextcloud Last"
@echo " "
@echo " For development of this example use PyCharm run configurations. Development is always set for last Nextcloud."
@echo " First run 'UiExample' and then 'make registerXX', after that you can use/debug/develop it and easy test."
@echo " "
- @echo " register perform registration of running UiExample into the 'manual_install' deploy daemon."
@echo " register27 perform registration of running UiExample into the 'manual_install' deploy daemon."
+ @echo " register28 perform registration of running UiExample into the 'manual_install' deploy daemon."
+ @echo " register perform registration of running UiExample into the 'manual_install' deploy daemon."
.PHONY: build-push
build-push:
docker login ghcr.io
docker buildx build --push --platform linux/arm64/v8,linux/amd64 --tag ghcr.io/cloud-py-api/ui_example:latest .
-.PHONY: deploy
-deploy:
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister ui_example --silent || true
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:deploy ui_example docker_dev \
- --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/ui_example/appinfo/info.xml
-
.PHONY: deploy27
deploy27:
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:unregister ui_example --silent || true
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:deploy ui_example docker_dev \
--info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/ui_example/appinfo/info.xml
-.PHONY: run
-run:
+.PHONY: deploy28
+deploy28:
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:unregister ui_example --silent || true
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:deploy ui_example docker_dev \
+ --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/ui_example/appinfo/info.xml
+
+.PHONY: deploy
+deploy:
docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister ui_example --silent || true
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register ui_example docker_dev --force-scopes \
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:deploy ui_example docker_dev \
--info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/ui_example/appinfo/info.xml
.PHONY: run27
@@ -50,12 +53,17 @@ run27:
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:register ui_example docker_dev --force-scopes \
--info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/ui_example/appinfo/info.xml
-.PHONY: register
-register:
+.PHONY: run28
+run28:
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:unregister ui_example --silent || true
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:register ui_example docker_dev --force-scopes \
+ --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/ui_example/appinfo/info.xml
+
+.PHONY: run
+run:
docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister ui_example --silent || true
- docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register ui_example manual_install --json-info \
- "{\"appid\":\"ui_example\",\"name\":\"UI Example\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9035,\"scopes\":{\"required\":[],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
- --force-scopes --wait-finish
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register ui_example docker_dev --force-scopes \
+ --info-xml https://raw.githubusercontent.com/cloud-py-api/nc_py_api/main/examples/as_app/ui_example/appinfo/info.xml
.PHONY: register27
register27:
@@ -63,3 +71,17 @@ register27:
docker exec master-stable27-1 sudo -u www-data php occ app_api:app:register ui_example manual_install --json-info \
"{\"appid\":\"ui_example\",\"name\":\"UI Example\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9035,\"scopes\":{\"required\":[],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
--force-scopes --wait-finish
+
+.PHONY: register28
+register28:
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:unregister ui_example --silent || true
+ docker exec master-stable28-1 sudo -u www-data php occ app_api:app:register ui_example manual_install --json-info \
+ "{\"appid\":\"ui_example\",\"name\":\"UI Example\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9035,\"scopes\":{\"required\":[],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
+ --force-scopes --wait-finish
+
+.PHONY: register
+register:
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:unregister ui_example --silent || true
+ docker exec master-nextcloud-1 sudo -u www-data php occ app_api:app:register ui_example manual_install --json-info \
+ "{\"appid\":\"ui_example\",\"name\":\"UI Example\",\"daemon_config_name\":\"manual_install\",\"version\":\"1.0.0\",\"secret\":\"12345\",\"host\":\"host.docker.internal\",\"port\":9035,\"scopes\":{\"required\":[],\"optional\":[]},\"protocol\":\"http\",\"system_app\":0}" \
+ --force-scopes --wait-finish
diff --git a/examples/as_app/ui_example/lib/main.py b/examples/as_app/ui_example/lib/main.py
index 66c02351..13d7d61d 100644
--- a/examples/as_app/ui_example/lib/main.py
+++ b/examples/as_app/ui_example/lib/main.py
@@ -44,5 +44,25 @@ async def verify_initial_value(
return responses.JSONResponse(content={"initial_value": str(random.randint(0, 100))}, status_code=200)
+class FileInfo(BaseModel):
+ getlastmodified: str
+ getetag: str
+ getcontenttype: str
+ fileid: int
+ permissions: str
+ size: int
+ getcontentlength: int
+ favorite: int
+
+
+@APP.post("/nextcloud_file")
+async def nextcloud_file(
+ _nc: typing.Annotated[NextcloudApp, Depends(nc_app)],
+ args: dict,
+):
+ print(args["file_info"])
+ return responses.Response()
+
+
if __name__ == "__main__":
run_app("main:APP", log_level="trace")
diff --git a/nc_py_api/ex_app/integration_fastapi.py b/nc_py_api/ex_app/integration_fastapi.py
index ddcae6f1..c64498a2 100644
--- a/nc_py_api/ex_app/integration_fastapi.py
+++ b/nc_py_api/ex_app/integration_fastapi.py
@@ -77,6 +77,8 @@ def set_handlers(
:param models_download_params: Parameters to pass to ``snapshot_download`` function from **huggingface_hub**.
:param map_app_static: Should be folders ``js``, ``css``, ``l10n``, ``img`` automatically mounted in FastAPI or not.
+
+ .. note:: First, presence of these directories in the current working dir is checked, then one directory higher.
"""
def fetch_models_task(nc: NextcloudApp, models: list[str]) -> None:
@@ -126,7 +128,14 @@ def init_callback(
return responses.JSONResponse(content={}, status_code=200)
if map_app_static:
- for mnt_dir in ("js", "l10n", "css", "img"):
- mnt_dir_path = os.path.join(os.getcwd(), mnt_dir)
- if os.path.exists(mnt_dir_path):
- fast_api_app.mount(f"/{mnt_dir}", staticfiles.StaticFiles(directory=mnt_dir_path), name=mnt_dir)
+ __map_app_static_folders(fast_api_app)
+
+
+def __map_app_static_folders(fast_api_app: FastAPI):
+ """Function to mount all necessary static folders to FastAPI."""
+ for mnt_dir in ("js", "l10n", "css", "img"):
+ mnt_dir_path = os.path.join(os.getcwd(), mnt_dir)
+ if not os.path.exists(mnt_dir_path):
+ mnt_dir_path = os.path.join(os.path.dirname(os.getcwd()), mnt_dir)
+ if os.path.exists(mnt_dir_path):
+ fast_api_app.mount(f"/{mnt_dir}", staticfiles.StaticFiles(directory=mnt_dir_path), name=mnt_dir)