diff --git a/ffplayout/api_player/__init__.py b/ffplayout/apps/api_player/__init__.py similarity index 100% rename from ffplayout/api_player/__init__.py rename to ffplayout/apps/api_player/__init__.py diff --git a/ffplayout/api_player/admin.py b/ffplayout/apps/api_player/admin.py similarity index 86% rename from ffplayout/api_player/admin.py rename to ffplayout/apps/api_player/admin.py index 4901cceb..707b4e99 100644 --- a/ffplayout/api_player/admin.py +++ b/ffplayout/apps/api_player/admin.py @@ -1,4 +1,4 @@ -from api_player.models import GuiSettings, MessengePresets +from apps.api_player.models import GuiSettings, MessengePresets from django.contrib import admin diff --git a/ffplayout/api_player/apps.py b/ffplayout/apps/api_player/apps.py similarity index 100% rename from ffplayout/api_player/apps.py rename to ffplayout/apps/api_player/apps.py diff --git a/ffplayout/apps/api_player/db.py b/ffplayout/apps/api_player/db.py new file mode 100644 index 00000000..346cd26b --- /dev/null +++ b/ffplayout/apps/api_player/db.py @@ -0,0 +1,11 @@ +import os + +BASE_DIR = os.path.dirname(os.path.abspath(os.path.join(__file__))) + +class Connector: + config = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } + } diff --git a/ffplayout/api_player/migrations/__init__.py b/ffplayout/apps/api_player/migrations/__init__.py similarity index 100% rename from ffplayout/api_player/migrations/__init__.py rename to ffplayout/apps/api_player/migrations/__init__.py diff --git a/ffplayout/api_player/models.py b/ffplayout/apps/api_player/models.py similarity index 100% rename from ffplayout/api_player/models.py rename to ffplayout/apps/api_player/models.py diff --git a/ffplayout/api_player/serializers.py b/ffplayout/apps/api_player/serializers.py similarity index 97% rename from ffplayout/api_player/serializers.py rename to ffplayout/apps/api_player/serializers.py index bd3b4cb1..adab453e 100644 --- a/ffplayout/api_player/serializers.py +++ b/ffplayout/apps/api_player/serializers.py @@ -1,4 +1,4 @@ -from api_player.models import GuiSettings, MessengePresets +from apps.api_player.models import GuiSettings, MessengePresets from django.contrib.auth.models import User from rest_framework import serializers diff --git a/ffplayout/api_player/tests.py b/ffplayout/apps/api_player/tests.py similarity index 100% rename from ffplayout/api_player/tests.py rename to ffplayout/apps/api_player/tests.py diff --git a/ffplayout/api_player/urls.py b/ffplayout/apps/api_player/urls.py similarity index 100% rename from ffplayout/api_player/urls.py rename to ffplayout/apps/api_player/urls.py diff --git a/ffplayout/api_player/utils.py b/ffplayout/apps/api_player/utils.py similarity index 99% rename from ffplayout/api_player/utils.py rename to ffplayout/apps/api_player/utils.py index 61857083..191f1c01 100644 --- a/ffplayout/api_player/utils.py +++ b/ffplayout/apps/api_player/utils.py @@ -8,7 +8,7 @@ import psutil import yaml import zmq -from api_player.models import GuiSettings +from apps.api_player.models import GuiSettings from django.conf import settings from natsort import natsorted from pymediainfo import MediaInfo diff --git a/ffplayout/api_player/views.py b/ffplayout/apps/api_player/views.py similarity index 98% rename from ffplayout/api_player/views.py rename to ffplayout/apps/api_player/views.py index 920a9d0e..52440a8e 100644 --- a/ffplayout/api_player/views.py +++ b/ffplayout/apps/api_player/views.py @@ -2,8 +2,8 @@ import os import shutil from urllib.parse import unquote -from api_player.models import GuiSettings, MessengePresets -from api_player.serializers import (GuiSettingsSerializer, MessengerSerializer, +from apps.api_player.models import GuiSettings, MessengePresets +from apps.api_player.serializers import (GuiSettingsSerializer, MessengerSerializer, UserSerializer) from django.contrib.auth.models import User from django_filters import rest_framework as filters diff --git a/ffplayout/ffplayout/settings/common.py b/ffplayout/ffplayout/settings/common.py index 42468ab9..ae115741 100644 --- a/ffplayout/ffplayout/settings/common.py +++ b/ffplayout/ffplayout/settings/common.py @@ -12,6 +12,7 @@ https://docs.djangoproject.com/en/3.0/ref/settings/ import os from datetime import timedelta +from pydoc import locate # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname( @@ -28,8 +29,7 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'django_filters', 'rest_framework', - 'corsheaders', - 'api_player' + 'corsheaders' ] MIDDLEWARE = [ @@ -67,12 +67,7 @@ WSGI_APPLICATION = 'ffplayout.wsgi.application' # Database # https://docs.djangoproject.com/en/3.0/ref/settings/#databases -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), - } -} +DATABASES = {} # Password validation @@ -114,6 +109,24 @@ USE_L10N = True USE_TZ = True +# dynamic app loader +APPS_DIR = os.path.join(BASE_DIR, 'apps/') + +for dir in os.listdir(APPS_DIR): + if os.path.isdir(os.path.join(APPS_DIR, dir)): + app_name = 'apps.{}'.format(dir) + + if app_name not in INSTALLED_APPS: + # add app to installed apps + INSTALLED_APPS += (app_name, ) + + if os.path.isfile(os.path.join(APPS_DIR, dir, 'db.py')): + db_conn = locate('{}.db.Connector.config'.format(app_name)) + + if list(db_conn.keys())[0] not in DATABASES: + # add app db to DATABASES + DATABASES.update(db_conn) + # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.0/howto/static-files/ diff --git a/ffplayout/ffplayout/urls.py b/ffplayout/ffplayout/urls.py index 4f563404..b56c566c 100644 --- a/ffplayout/ffplayout/urls.py +++ b/ffplayout/ffplayout/urls.py @@ -13,14 +13,15 @@ Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ +import os from django.contrib import admin +from django.conf import settings from django.urls import include, path from rest_framework_simplejwt.views import (TokenObtainPairView, TokenRefreshView) urlpatterns = [ path('admin/', admin.site.urls), - path('api/', include('api_player.urls', namespace='api_player')), path('api-auth/', include( 'rest_framework.urls', namespace='rest_framework')), path('auth/token/', TokenObtainPairView.as_view(), @@ -28,3 +29,16 @@ urlpatterns = [ path('auth/token/refresh/', TokenRefreshView.as_view(), name='token_refresh') ] + + +# dynamic url loader +for dir in os.listdir(settings.APPS_DIR): + if os.path.isdir(os.path.join(settings.APPS_DIR, dir)): + app_name = 'apps.{}'.format(dir) + + _path = path('api/', include( + '{}.urls'.format(app_name), + namespace='{}'.format(app_name.split('.')[1]))) + + if _path not in urlpatterns: + urlpatterns += (_path, )