diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..af4486b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Verwendet IntelliSense zum Ermitteln möglicher Attribute. + // Zeigen Sie auf vorhandene Attribute, um die zugehörigen Beschreibungen anzuzeigen. + // Weitere Informationen finden Sie unter https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Main File execution", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/manage.py", + "args": ["runserver"], + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..211360c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "python.defaultInterpreterPath": "./venv/bin/python", + "autopep8.args": ["--max-line-length=150"], + "python.formatting.provider": "none", + "[python]": { + "editor.defaultFormatter": "ms-python.python", + "editor.formatOnSave": true + }, + "editor.formatOnSave": true, + "editor.fontSize": 14, + "emmet.includeLanguages": { "django-html": "html" }, + "python.testing.pytestArgs": ["-v", "--cov", "--cov-report=xml", "__test__"], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/config_example/config.py b/config_example/config.py index ae76abd..8abf2c9 100644 --- a/config_example/config.py +++ b/config_example/config.py @@ -1,48 +1,55 @@ import os BASE_DIR = os.path.dirname(os.path.abspath(__file__)) - +####################################################################### +# Configuration of your django application +####################################################################### # -# General settings +# PyGal Setting # +# The root for searching for items +ITEM_ROOT = os.path.join(BASE_DIR, 'data', 'example_data') +# Set this to True to ensure, that unauthenticated users have no permission (With False they get permiisions to the +# structure. You can set public in the item (folde) to make the items visible) +#SUSPEND_PUBLIC = False -# APP_NAME is used for logging -APP_NAME = 'pygal' - -# SECURITY WARNING: don't run with debug turned on in production! -# DEBUG = False - -# SECURITY WARNING: don't run with a dummy secret in production! -# SECRET_KEY = 'define a secret key' - -# SECURITY WARNING: don't run with '0.0.0.0' in in production, unless you know what you are doing! -# ALLOWED_HOSTS = ['127.0.0.1', ] - -# -# ITEM_ROOT = os.path.join(BASE_DIR, 'data', 'example_data') - -# -# Access Right settings -# - -# Set this to True to ensure, that unauthenticated users have no permission -# SUSPEND_PUBLIC = True - -# -# Style settings -# - -# DEFAULT_THEME = 'clear-red' # THUMBNAIL_SIZES = [137, 175, 250] # WEBNAIL_SIZES = [450, 1100, 1750] - -# -# Content settings -# - -# Sorting by name if False -# SORT_BY_DATE = True +# SORT_BY_DATE = True # Sorting by name if False # SHOW_IMAGE = True # SHOW_VIDEO = True # SHOW_AUDIO = False # SHOW_OTHER = False + +# Access Right settings + + +# +# Users library +# +# This enables or disables the self registration +USERS_SELF_REGISTRATION = False + +# +# Themes library +# +# This defines the default theme, if no theme is set in the django parameters +DEFAULT_THEME = 'clear-red' + +# +# Django +# +# This defines the mode of the running server +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = False + +# This a the secret key for your application. +# SECURITY WARNING: don't run with a dummy secret in production! And don't let others read this key! +SECRET_KEY = None + +# This defines the listener hostnames for your django server +# SECURITY WARNING: don't run with '0.0.0.0' in in production, unless you know what you are doing! +# ALLOWED_HOSTS = ['', ] + +# This might be needed for usage in a docker environment +# CSRF_TRUSTED_ORIGINS = ['', ] diff --git a/fstools b/fstools index f5da43b..c10e879 160000 --- a/fstools +++ b/fstools @@ -1 +1 @@ -Subproject commit f5da43b01631147dace87242a94227acfb3e9bc5 +Subproject commit c10e8792abb05671dab6de51cdadda3bf8ead50f diff --git a/main/settings.py b/main/settings.py index f3a2b73..22b840d 100644 --- a/main/settings.py +++ b/main/settings.py @@ -1,82 +1,34 @@ """ -Django settings for this project. +Django settings for pygal project. -Generated by 'django-admin startproject' using Django 3.0.3. +Generated by 'django-admin startproject' using Django 5.1.1. For more information on this file, see -https://docs.djangoproject.com/en/3.0/topics/settings/ +https://docs.djangoproject.com/en/5.1/topics/settings/ For the full list of settings and their values, see -https://docs.djangoproject.com/en/3.0/ref/settings/ +https://docs.djangoproject.com/en/5.1/ref/settings/ """ +from pathlib import Path + import config from logging.handlers import SocketHandler as _SocketHandler import os +import random import stat import sys -import random -try: - from config import APP_NAME as ROOT_LOGGER_NAME -except ImportError: - ROOT_LOGGER_NAME = 'root' +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -# -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - -# Check permission of config.py -# -if sys.platform == 'linux' or sys.platform == 'linux2': - st = os.stat(os.path.join(BASE_DIR, 'config.py')) - if st.st_mode & stat.S_IRGRP or st.st_mode & stat.S_IROTH: - raise PermissionError("conig.py is readable by group or others.") - -# Default values, if not defined in config.py -# -USER_CONFIG_DEFAULTS = { - 'DEBUG': False, - 'SECRET_KEY': None, - 'ALLOWED_HOSTS': ['127.0.0.1', ], - 'CSRF_TRUSTED_ORIGINS': [], - 'DEFAULT_THEME': 'clear-red', - 'ITEM_ROOT': os.path.join(BASE_DIR, 'data', 'example_data'), - 'THUMBNAIL_SIZES': [137, 175, 250], - 'WEBNAIL_SIZES': [450, 1100, 1750], - 'SUSPEND_PUBLIC': True, - 'SORT_BY_DATE': True, - 'SHOW_IMAGE': True, - 'SHOW_VIDEO': True, - 'SHOW_AUDIO': False, - 'SHOW_OTHER': False, -} - -# Set configuration parameters -# -thismodule = sys.modules[__name__] -for property_name in USER_CONFIG_DEFAULTS: - try: - value = getattr(config, property_name) - except AttributeError: - value = USER_CONFIG_DEFAULTS[property_name] - setattr(thismodule, property_name, value) - # Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -# -if SECRET_KEY is None: - chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)' - s_key = ''.join([random.choice(chars) for n in range(50)]) - secret_key_warning = "You need to create a config.py file including at least a SECRET_KEY definition (e.g.: --> %s <--)." % repr(s_key) - raise KeyError(secret_key_warning) +# See https://docs.djangoproject.com/en/5.1/howto/deployment/checklist/ # Application definition -# + INSTALLED_APPS = [ 'pygal.apps.PygalConfig', 'themes.apps.ThemesConfig', @@ -124,19 +76,19 @@ WSGI_APPLICATION = 'main.wsgi.application' # Database -# https://docs.djangoproject.com/en/3.0/ref/settings/#databases -# +# https://docs.djangoproject.com/en/5.1/ref/settings/#databases + DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + 'NAME': BASE_DIR / 'db.sqlite3', } } # Password validation -# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators -# +# https://docs.djangoproject.com/en/5.1/ref/settings/#auth-password-validators + AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', @@ -153,14 +105,9 @@ AUTH_PASSWORD_VALIDATORS = [ ] -# Search Engine -# -WHOOSH_PATH = os.path.join(BASE_DIR, 'data', 'whoosh_index') - - # Internationalization -# https://docs.djangoproject.com/en/3.0/topics/i18n/ -# +# https://docs.djangoproject.com/en/5.1/topics/i18n/ + LANGUAGE_CODE = 'en-us' LANGUAGES = [ ('en', 'English'), @@ -182,25 +129,90 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/3.0/howto/static-files/ -# +# https://docs.djangoproject.com/en/5.1/howto/static-files/ STATIC_ROOT = os.path.join(BASE_DIR, 'data', 'static') -STATIC_URL = '/static/' +STATIC_URL = 'static/' MEDIA_ROOT = os.path.join(BASE_DIR, 'data', 'media') MEDIA_URL = '/media/' +WHOOSH_PATH = os.path.join(BASE_DIR, 'data', 'whoosh') + +# Default primary key field type +# https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + + + +# Other Configuration issues +# +DATA_UPLOAD_MAX_NUMBER_FIELDS = 30000 + +LOGIN_URL = 'users-login' + +XNAIL_ROOT = os.path.join(BASE_DIR, 'data', 'xnails') +TEMP_ROOT = os.path.join(BASE_DIR, 'data', 'temp') + # Session parameters # - SESSION_KEY_THUMBNAIL_SIZE = 'thumbnail_size' SESSION_KEY_WEBNAIL_SIZE = 'webnail_size' PERSISTENT_SESSION_VARIABLES = [SESSION_KEY_THUMBNAIL_SIZE, SESSION_KEY_WEBNAIL_SIZE] +# Check permission of config.py +# +if sys.platform == 'linux' or sys.platform == 'linux2': + st = os.stat(os.path.join(BASE_DIR, 'config.py')) + if st.st_mode & stat.S_IRGRP or st.st_mode & stat.S_IROTH: + raise PermissionError("conig.py is readable by group or others.") + +# Default values, if not defined in config.py +# +USER_CONFIG_DEFAULTS = { + 'ITEM_ROOT': os.path.join(BASE_DIR, 'data', 'example_data'), + 'SUSPEND_PUBLIC': True, + 'DEBUG': False, + 'SECRET_KEY': None, + 'DEFAULT_THEME': 'clear-red', + 'ALLOWED_HOSTS': ['127.0.0.1', 'localhost', ], + 'CSRF_TRUSTED_ORIGINS': [], + 'THUMBNAIL_SIZES': [137, 175, 250], + 'WEBNAIL_SIZES': [450, 1100, 1750], + 'SORT_BY_DATE': True, + 'SHOW_IMAGE': True, + 'SHOW_VIDEO': True, + 'SHOW_AUDIO': False, + 'SHOW_OTHER': False, +} + +# Set configuration parameters +# +thismodule = sys.modules[__name__] +for property_name in USER_CONFIG_DEFAULTS: + try: + value = getattr(config, property_name) + except AttributeError: + value = USER_CONFIG_DEFAULTS[property_name] + setattr(thismodule, property_name, value) + +# SECURITY WARNING: keep the secret key used in production secret! +# +if SECRET_KEY is None: + chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)' + s_key = ''.join([random.choice(chars) for n in range(50)]) + secret_key_warning = "You need to create a config.py file including at least a SECRET_KEY definition (e.g.: --> %s <--)." % repr(s_key) + raise KeyError(secret_key_warning) + + # Logging Configuration # +ROOT_LOGGER_NAME = os.path.basename(os.path.dirname(__file__)) +default_handler = ['socket', 'console'] if DEBUG else ['console'] + + class DjangoSocketHandler(_SocketHandler): def emit(self, record): if hasattr(record, 'request'): @@ -208,8 +220,6 @@ class DjangoSocketHandler(_SocketHandler): return super().emit(record) -default_handler = ['socket'] if DEBUG else ['console'] -# LOGGING = { 'version': 1, 'disable_existing_loggers': False, @@ -233,7 +243,7 @@ File "%(pathname)s", line %(lineno)d, in %(funcName)s }, 'socket': { 'level': 'DEBUG', - 'class': 'main.settings.DjangoSocketHandler', + 'class': f'{ROOT_LOGGER_NAME}.settings.DjangoSocketHandler', 'host': '127.0.0.1', 'port': 19996, }, @@ -251,14 +261,3 @@ File "%(pathname)s", line %(lineno)d, in %(funcName)s }, }, } - - -# Other Configuration issues -# - -DATA_UPLOAD_MAX_NUMBER_FIELDS = 30000 - -LOGIN_URL = 'users-login' - -XNAIL_ROOT = os.path.join(BASE_DIR, 'data', 'xnails') -TEMP_ROOT = os.path.join(BASE_DIR, 'data', 'temp') diff --git a/manage.py b/manage.py old mode 100755 new mode 100644 diff --git a/media b/media index abcf63d..402e837 160000 --- a/media +++ b/media @@ -1 +1 @@ -Subproject commit abcf63d02e866c3832d014c54f2a95acdfb7d304 +Subproject commit 402e8375511470c61021956edad72e1080f51c8e diff --git a/mycreole b/mycreole index 5f30383..997594e 160000 --- a/mycreole +++ b/mycreole @@ -1 +1 @@ -Subproject commit 5f30383c83b0ea94341b999c489a34f2e7d57f80 +Subproject commit 997594e37149b55e598f7dedfefed3c2998a2c87 diff --git a/pygal b/pygal index 114a82e..5f1420a 160000 --- a/pygal +++ b/pygal @@ -1 +1 @@ -Subproject commit 114a82e1768d3fbf8a83afb61b2f19c271b8868b +Subproject commit 5f1420a0a9de7cd5b47cdf99bd9d86bee01a6ec7 diff --git a/requirements.txt b/requirements.txt index 4c515d8..13e94e1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,6 @@ -Django>=2.0.5 -Pillow>=5.4.1 -python-creole>=1.0.0 -Whoosh>=2.4.0 +Django +Pillow +disc-id +pytz +python-creole +Whoosh diff --git a/stringtools b/stringtools index c1d9cf4..e1f76d9 160000 --- a/stringtools +++ b/stringtools @@ -1 +1 @@ -Subproject commit c1d9cf49c34cc6c97cfb372eec4a30f0188181f9 +Subproject commit e1f76d96312e540544b2328d0937b0aa41126aa9 diff --git a/themes b/themes index d3b38d9..261ef50 160000 --- a/themes +++ b/themes @@ -1 +1 @@ -Subproject commit d3b38d9e7a5d01708380dd9632b0ca7a544a5cef +Subproject commit 261ef5048efb4bd204a4ddbe56a90f96cd767ba1 diff --git a/users b/users index 0827a53..c9532aa 160000 --- a/users +++ b/users @@ -1 +1 @@ -Subproject commit 0827a5311fdbbef689365c6db5762881e048ba9c +Subproject commit c9532aaf37cc785583d7ffc89d1d2f738985171d