From 34f788e099636e86fcbc2f83f9af5f632793392d Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Tue, 3 Mar 2020 12:20:13 +0100 Subject: [PATCH] Reorganize package structure This commit reorganizes the package structure. The gvaldap.settings modules have been merged. The gvaldap.ldaptasks module has been move up one level to have task names without the gvaldap prefix. isort control instructions have been added to setup.cfg. --- gvaldap/gvaldap/__init__.py | 4 + gvaldap/gvaldap/celery.py | 23 -- gvaldap/gvaldap/settings.py | 315 ++++++++++++++++++ gvaldap/gvaldap/settings/__init__.py | 3 - gvaldap/gvaldap/settings/base.py | 278 ---------------- gvaldap/gvaldap/settings/local.py | 64 ---- gvaldap/gvaldap/settings/production.py | 35 -- gvaldap/gvaldap/settings/test.py | 35 -- gvaldap/gvaldap/tests/test_celery.py | 14 - gvaldap/gvaldap/wsgi.py | 11 +- gvaldap/{gvaldap => }/ldaptasks/__init__.py | 0 gvaldap/ldaptasks/celery.py | 17 + gvaldap/{gvaldap => }/ldaptasks/tasks.py | 145 ++++---- .../{gvaldap => }/ldaptasks/tests/__init__.py | 0 .../ldaptasks/tests/test_tasks.py | 7 +- gvaldap/manage.py | 2 +- gvaldap/setup.cfg | 13 +- 17 files changed, 434 insertions(+), 532 deletions(-) delete mode 100644 gvaldap/gvaldap/celery.py create mode 100644 gvaldap/gvaldap/settings.py delete mode 100644 gvaldap/gvaldap/settings/__init__.py delete mode 100644 gvaldap/gvaldap/settings/base.py delete mode 100644 gvaldap/gvaldap/settings/local.py delete mode 100644 gvaldap/gvaldap/settings/production.py delete mode 100644 gvaldap/gvaldap/settings/test.py delete mode 100644 gvaldap/gvaldap/tests/test_celery.py rename gvaldap/{gvaldap => }/ldaptasks/__init__.py (100%) create mode 100644 gvaldap/ldaptasks/celery.py rename gvaldap/{gvaldap => }/ldaptasks/tasks.py (72%) rename gvaldap/{gvaldap => }/ldaptasks/tests/__init__.py (100%) rename gvaldap/{gvaldap => }/ldaptasks/tests/test_tasks.py (99%) diff --git a/gvaldap/gvaldap/__init__.py b/gvaldap/gvaldap/__init__.py index 613629e..1c758d0 100644 --- a/gvaldap/gvaldap/__init__.py +++ b/gvaldap/gvaldap/__init__.py @@ -2,3 +2,7 @@ This is the gvaldap project module. """ __version__ = "0.6.0.dev1" + +from ldaptasks.celery import app as celery_app + +__all__ = ("celery_app",) diff --git a/gvaldap/gvaldap/celery.py b/gvaldap/gvaldap/celery.py deleted file mode 100644 index 7544110..0000000 --- a/gvaldap/gvaldap/celery.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -This module defines the Celery_ app for gvaldap. - -.. _Celery: http://www.celeryproject.org/ - -""" -import os -from celery import Celery - -from django.conf import settings - -os.environ.setdefault('DJANGO_SETTINGS_MODULE', - 'gvaldap.settings.production') - -app = Celery('gvaldap') - - -def get_installed_apps(): - return settings.INSTALLED_APPS - - -app.config_from_object('django.conf:settings') -app.autodiscover_tasks(get_installed_apps) diff --git a/gvaldap/gvaldap/settings.py b/gvaldap/gvaldap/settings.py new file mode 100644 index 0000000..648c190 --- /dev/null +++ b/gvaldap/gvaldap/settings.py @@ -0,0 +1,315 @@ +# -*- coding: utf-8 -*- +# pymode:lint_ignore=E501 +""" +Common settings and globals. + +""" + +from os.path import abspath, basename, dirname, join, normpath +from sys import path + +from gvacommon.settings_utils import get_env_variable + +# ######### PATH CONFIGURATION +# Absolute filesystem path to the Django project directory: +DJANGO_ROOT = dirname(dirname(abspath(__file__))) + +# Absolute filesystem path to the top-level project folder: +SITE_ROOT = dirname(DJANGO_ROOT) + +# Site name: +SITE_NAME = basename(DJANGO_ROOT) + +# Add our project to our pythonpath, this way we don't need to type our project +# name in our dotted import paths: +path.append(DJANGO_ROOT) +# ######### END PATH CONFIGURATION + + +# ######### DEBUG CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#debug +DEBUG = get_env_variable("GVALDAP_DEBUG", bool, False) + +# ######### MANAGER CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#admins +ADMINS = ( + (get_env_variable("GVALDAP_ADMIN_NAME"), get_env_variable("GVALDAP_ADMIN_EMAIL")), +) + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#managers +MANAGERS = ADMINS +# ######### END MANAGER CONFIGURATION + + +# ######### DATABASE CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#databases +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": normpath(join(DJANGO_ROOT, "default.db")), + "USER": "", + "PASSWORD": "", + "HOST": "", + "PORT": "", + }, + "ldap": { + "ENGINE": "ldapdb.backends.ldap", + "NAME": get_env_variable("GVALDAP_LDAP_URL"), + "USER": get_env_variable("GVALDAP_LDAP_USER"), + "PASSWORD": get_env_variable("GVALDAP_LDAP_PASSWORD"), + }, +} +DATABASE_ROUTERS = ["ldapdb.router.Router"] +# ######### END DATABASE CONFIGURATION + + +# ######### GENERAL CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#time-zone +TIME_ZONE = "Europe/Berlin" + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#language-code +LANGUAGE_CODE = "en-us" + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#site-id +SITE_ID = 1 + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-i18n +USE_I18N = True + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-l10n +USE_L10N = True + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-tz +USE_TZ = True +# ######### END GENERAL CONFIGURATION + + +# ######### MEDIA CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-root +MEDIA_ROOT = normpath(join(SITE_ROOT, "media")) + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-url +MEDIA_URL = "/media/" +# ######### END MEDIA CONFIGURATION + + +# ######### STATIC FILE CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-url +STATIC_URL = "/static/" + +# See: +# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders # noqa +STATICFILES_FINDERS = ("django.contrib.staticfiles.finders.AppDirectoriesFinder",) +# ######### END STATIC FILE CONFIGURATION + + +# ######### SECRET CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key +# Note: This key should only be used for development and testing. +SECRET_KEY = get_env_variable("GVALDAP_SECRETKEY") +# ######### END SECRET CONFIGURATION + + +# ######### FIXTURE CONFIGURATION +# See: +# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-FIXTURE_DIRS # noqa +FIXTURE_DIRS = (normpath(join(SITE_ROOT, "fixtures")),) +# ######### END FIXTURE CONFIGURATION + + +# ######### TEMPLATE CONFIGURATION +# See: https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-TEMPLATES # noqa +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [normpath(join(SITE_ROOT, "templates"))], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.contrib.auth.context_processors.auth", + "django.template.context_processors.debug", + "django.template.context_processors.i18n", + "django.template.context_processors.media", + "django.template.context_processors.static", + "django.template.context_processors.tz", + "django.contrib.messages.context_processors.messages", + "django.template.context_processors.request", + ] + }, + } +] + +# ######### END TEMPLATE CONFIGURATION + + +# ######### MIDDLEWARE CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#middleware-classes +MIDDLEWARE = ( + # Default Django middleware. + "django.middleware.common.CommonMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.locale.LocaleMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", +) +# ######### END MIDDLEWARE CONFIGURATION + + +# ######### URL CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#root-urlconf +ROOT_URLCONF = "%s.urls" % SITE_NAME +# ######### END URL CONFIGURATION + + +# ######### TEST RUNNER CONFIGURATION +TEST_RUNNER = "django.test.runner.DiscoverRunner" +# ######### END TEST RUNNER CONFIGURATION + + +# ######### APP CONFIGURATION +DJANGO_APPS = ( + # Default Django apps: + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.sites", + "django.contrib.messages", + "django.contrib.staticfiles", + # Admin panel and documentation: + "django.contrib.admin", +) + +# Apps specific for this project go here. +LOCAL_APPS = ("ldapentities", "ldaptasks") + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps +INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS +# ######### END APP CONFIGURATION + + +# ######### LOGGING CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#logging +# A sample logging configuration. The only tangible logging +# performed by this configuration is to send an email to +# the site admins on every HTTP 500 error when DEBUG=False. +# See http://docs.djangoproject.com/en/dev/topics/logging for +# more details on how to customize your logging configuration. +LOGGING = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "verbose": { + "format": "%(levelname)s %(asctime)s %(name)s " + "%(module)s:%(lineno)d %(process)d %(thread)d %(message)s" + }, + "simple": {"format": "%(levelname)s %(name)s:%(lineno)d %(message)s"}, + }, + "filters": {"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}}, + "handlers": { + "mail_admins": { + "level": "ERROR", + "filters": ["require_debug_false"], + "class": "django.utils.log.AdminEmailHandler", + } + }, + "loggers": { + "django.request": { + "handlers": ["mail_admins"], + "level": "ERROR", + "propagate": True, + } + }, +} +# ######### END LOGGING CONFIGURATION + + +# ######### WSGI CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#wsgi-application +WSGI_APPLICATION = "%s.wsgi.application" % SITE_NAME +# ######### END WSGI CONFIGURATION + + +# ######### LDAP SETTINGS +GROUP_BASE_DN = get_env_variable("GVALDAP_BASEDN_GROUP") +USER_BASE_DN = get_env_variable("GVALDAP_BASEDN_USER") +# ######### END LDAP SETTINGS + + +# ######### CELERY CONFIGURATION +CELERY_BROKER_URL = get_env_variable("GVALDAP_BROKER_URL") +CELERY_RESULT_BACKEND = get_env_variable("GVALDAP_RESULTS_REDIS_URL") +CELERY_TASK_RESULT_EXPIRES = None +CELERY_ROUTES = ("gvacommon.celeryrouters.GvaRouter",) +CELERY_TIMEZONE = "Europe/Berlin" +CELERY_ENABLE_UTC = True +CELERY_ACCEPT_CONTENT = ["json"] +CELERY_TASK_SERIALIZER = "json" +CELERY_RESULT_SERIALIZER = "json" +# ######### END CELERY CONFIGURATION + +if DEBUG: + TEMPLATES[0]["OPTIONS"]["debug"] = DEBUG + EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" + CACHES = {"default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}} + INSTALLED_APPS += ("debug_toolbar",) + + MIDDLEWARE += ("debug_toolbar.middleware.DebugToolbarMiddleware",) + + LOGGING["handlers"].update( + { + "console": { + "level": "DEBUG", + "class": "logging.StreamHandler", + "formatter": "simple", + } + } + ) + LOGGING["loggers"].update( + dict( + [ + (key, {"handlers": ["console"], "level": "DEBUG", "propagate": True}) + for key in ["ldapentities", "ldaptasks"] + ] + ) + ) + INTERNAL_IPS = get_env_variable("GVALDAP_INTERNAL_IPS", str, "127.0.0.1").split(",") +else: + ALLOWED_HOSTS = get_env_variable("GVALDAP_ALLOWED_HOSTS").split(",") + EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" + EMAIL_SUBJECT_PREFIX = "[%s] " % SITE_NAME + DEFAULT_FROM_EMAIL = get_env_variable("GVALDAP_ADMIN_EMAIL") + SERVER_EMAIL = get_env_variable("GVALDAP_SERVER_EMAIL") + +if get_env_variable("GVALDAP_TEST", bool, False): + PASSWORD_HASHERS = ("django.contrib.auth.hashers.MD5PasswordHasher",) + # ######### IN-MEMORY TEST DATABASE + DATABASES["default"] = { + "ENGINE": "django.db.backends.sqlite3", + "NAME": ":memory:", + "USER": "", + "PASSWORD": "", + "HOST": "", + "PORT": "", + } + + LOGGING["handlers"].update( + { + "console": { + "level": "ERROR", + "class": "logging.StreamHandler", + "formatter": "simple", + } + } + ) + LOGGING["loggers"].update( + dict( + [ + (key, {"handlers": ["console"], "level": "ERROR", "propagate": True}) + for key in ["ldapentities", "ldaptasks"] + ] + ) + ) + CELERY_BROKER_URL = CELERY_BROKER_URL + "_test" + CELERY_RESULT_PERSISTENT = False diff --git a/gvaldap/gvaldap/settings/__init__.py b/gvaldap/gvaldap/settings/__init__.py deleted file mode 100644 index 4f53a5e..0000000 --- a/gvaldap/gvaldap/settings/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -This module contains settings for various environments. -""" diff --git a/gvaldap/gvaldap/settings/base.py b/gvaldap/gvaldap/settings/base.py deleted file mode 100644 index 632322d..0000000 --- a/gvaldap/gvaldap/settings/base.py +++ /dev/null @@ -1,278 +0,0 @@ -# -*- coding: utf-8 -*- -# pymode:lint_ignore=E501 -""" -Common settings and globals. - -""" - -from os.path import abspath, basename, dirname, join, normpath -from sys import path - -from gvacommon.settings_utils import get_env_variable - - -# ######### PATH CONFIGURATION -# Absolute filesystem path to the Django project directory: -DJANGO_ROOT = dirname(dirname(abspath(__file__))) - -# Absolute filesystem path to the top-level project folder: -SITE_ROOT = dirname(DJANGO_ROOT) - -# Site name: -SITE_NAME = basename(DJANGO_ROOT) - -# Add our project to our pythonpath, this way we don't need to type our project -# name in our dotted import paths: -path.append(DJANGO_ROOT) -# ######### END PATH CONFIGURATION - - -# ######### DEBUG CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#debug -DEBUG = False - - -# ######### MANAGER CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#admins -ADMINS = ( - (get_env_variable('GVALDAP_ADMIN_NAME'), - get_env_variable('GVALDAP_ADMIN_EMAIL')), -) - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#managers -MANAGERS = ADMINS -# ######### END MANAGER CONFIGURATION - - -# ######### DATABASE CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#databases -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': normpath(join(DJANGO_ROOT, 'default.db')), - 'USER': '', - 'PASSWORD': '', - 'HOST': '', - 'PORT': '', - }, - 'ldap': { - 'ENGINE': 'ldapdb.backends.ldap', - 'NAME': get_env_variable('GVALDAP_LDAP_URL'), - 'USER': get_env_variable('GVALDAP_LDAP_USER'), - 'PASSWORD': get_env_variable('GVALDAP_LDAP_PASSWORD'), - } -} -DATABASE_ROUTERS = ['ldapdb.router.Router'] -# ######### END DATABASE CONFIGURATION - - -# ######### GENERAL CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#time-zone -TIME_ZONE = 'Europe/Berlin' - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#language-code -LANGUAGE_CODE = 'en-us' - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#site-id -SITE_ID = 1 - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-i18n -USE_I18N = True - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-l10n -USE_L10N = True - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-tz -USE_TZ = True -# ######### END GENERAL CONFIGURATION - - -# ######### MEDIA CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-root -MEDIA_ROOT = normpath(join(SITE_ROOT, 'media')) - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-url -MEDIA_URL = '/media/' -# ######### END MEDIA CONFIGURATION - - -# ######### STATIC FILE CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-url -STATIC_URL = '/static/' - -# See: -# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders # noqa -STATICFILES_FINDERS = ( - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', -) -# ######### END STATIC FILE CONFIGURATION - - -# ######### SECRET CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key -# Note: This key should only be used for development and testing. -SECRET_KEY = get_env_variable('GVALDAP_SECRETKEY') -# ######### END SECRET CONFIGURATION - - -# ######### SITE CONFIGURATION -# Hosts/domain names that are valid for this site -# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts -ALLOWED_HOSTS = [] -# ######### END SITE CONFIGURATION - - -# ######### FIXTURE CONFIGURATION -# See: -# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-FIXTURE_DIRS # noqa -FIXTURE_DIRS = ( - normpath(join(SITE_ROOT, 'fixtures')), -) -# ######### END FIXTURE CONFIGURATION - - -# ######### TEMPLATE CONFIGURATION -# See: https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-TEMPLATES # noqa -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [ - normpath(join(SITE_ROOT, 'templates')), - ], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.contrib.auth.context_processors.auth', - 'django.template.context_processors.debug', - 'django.template.context_processors.i18n', - 'django.template.context_processors.media', - 'django.template.context_processors.static', - 'django.template.context_processors.tz', - 'django.contrib.messages.context_processors.messages', - 'django.template.context_processors.request', - ], - }, - }, -] - -# ######### END TEMPLATE CONFIGURATION - - -# ######### MIDDLEWARE CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#middleware-classes -MIDDLEWARE = ( - # Default Django middleware. - 'django.middleware.common.CommonMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.locale.LocaleMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -) -# ######### END MIDDLEWARE CONFIGURATION - - -# ######### URL CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#root-urlconf -ROOT_URLCONF = '%s.urls' % SITE_NAME -# ######### END URL CONFIGURATION - - -# ######### TEST RUNNER CONFIGURATION -TEST_RUNNER = 'django.test.runner.DiscoverRunner' -# ######### END TEST RUNNER CONFIGURATION - - -# ######### APP CONFIGURATION -DJANGO_APPS = ( - # Default Django apps: - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.sites', - 'django.contrib.messages', - 'django.contrib.staticfiles', - - # Admin panel and documentation: - 'django.contrib.admin', -) - -# Apps specific for this project go here. -LOCAL_APPS = ( - 'ldapentities', - 'gvaldap.ldaptasks', -) - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps -INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS -# ######### END APP CONFIGURATION - - -# ######### LOGGING CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#logging -# A sample logging configuration. The only tangible logging -# performed by this configuration is to send an email to -# the site admins on every HTTP 500 error when DEBUG=False. -# See http://docs.djangoproject.com/en/dev/topics/logging for -# more details on how to customize your logging configuration. -LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'formatters': { - 'verbose': { - 'format': '%(levelname)s %(asctime)s %(name)s ' - '%(module)s:%(lineno)d %(process)d %(thread)d %(message)s', - }, - 'simple': { - 'format': '%(levelname)s %(name)s:%(lineno)d %(message)s', - }, - }, - 'filters': { - 'require_debug_false': { - '()': 'django.utils.log.RequireDebugFalse' - } - }, - 'handlers': { - 'mail_admins': { - 'level': 'ERROR', - 'filters': ['require_debug_false'], - 'class': 'django.utils.log.AdminEmailHandler' - } - }, - 'loggers': { - 'django.request': { - 'handlers': ['mail_admins'], - 'level': 'ERROR', - 'propagate': True, - }, - } -} -# ######### END LOGGING CONFIGURATION - - -# ######### WSGI CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#wsgi-application -WSGI_APPLICATION = '%s.wsgi.application' % SITE_NAME -# ######### END WSGI CONFIGURATION - - -# ######### LDAP SETTINGS -GROUP_BASE_DN = get_env_variable('GVALDAP_BASEDN_GROUP') -USER_BASE_DN = get_env_variable('GVALDAP_BASEDN_USER') -# ######### END LDAP SETTINGS - - -# ######### CELERY CONFIGURATION -BROKER_URL = get_env_variable('GVALDAP_BROKER_URL') -CELERY_RESULT_BACKEND = get_env_variable('GVALDAP_RESULTS_REDIS_URL') -CELERY_TASK_RESULT_EXPIRES = None -CELERY_ROUTES = ( - 'gvacommon.celeryrouters.GvaRouter', -) -CELERY_TIMEZONE = 'Europe/Berlin' -CELERY_ENABLE_UTC = True -CELERY_ACCEPT_CONTENT = ['json'] -CELERY_TASK_SERIALIZER = 'json' -CELERY_RESULT_SERIALIZER = 'json' -# ######### END CELERY CONFIGURATION diff --git a/gvaldap/gvaldap/settings/local.py b/gvaldap/gvaldap/settings/local.py deleted file mode 100644 index 08e2b91..0000000 --- a/gvaldap/gvaldap/settings/local.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- python -*- -# pymode:lint_ignore=W0401,E501 -""" -Development settings and globals based on :py:mod:`gvaldap.settings.base`. - -""" - -from __future__ import absolute_import - -# use import * to import all settings from base -from .base import * # NOQA - - -# ######### DEBUG CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#debug -DEBUG = True - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-debug -TEMPLATES[0]['OPTIONS']['debug'] = DEBUG -# ######### END DEBUG CONFIGURATION - - -# ######### EMAIL CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-backend -EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' -# ######### END EMAIL CONFIGURATION - - -# ######### CACHE CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#caches -CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - } -} -# ######### END CACHE CONFIGURATION - - -# ######### TOOLBAR CONFIGURATION -# See: http://django-debug-toolbar.readthedocs.org/en/latest/installation.html#explicit-setup # noqa -INSTALLED_APPS += ( - 'debug_toolbar', -) - -MIDDLEWARE += ( - 'debug_toolbar.middleware.DebugToolbarMiddleware', -) - -LOGGING['handlers'].update({ - 'console': { - 'level': 'DEBUG', - 'class': 'logging.StreamHandler', - 'formatter': 'simple', - } -}) -LOGGING['loggers'].update(dict( - [(key, {'handlers': ['console'], 'level': 'DEBUG', 'propagate': True, }) - for key in ['ldapentities', 'ldaptasks']])) - -DEBUG_TOOLBAR_PATCH_SETTINGS = False - -# http://django-debug-toolbar.readthedocs.org/en/latest/installation.html -INTERNAL_IPS = ('127.0.0.1', '10.0.2.2') -# ######### END TOOLBAR CONFIGURATION diff --git a/gvaldap/gvaldap/settings/production.py b/gvaldap/gvaldap/settings/production.py deleted file mode 100644 index 03d35a2..0000000 --- a/gvaldap/gvaldap/settings/production.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- python -*- -# pymode:lint_ignore=W0401,E501 -""" -Production settings and globals based on :py:mod:`gvaldap.settings.base`. - -""" - -from __future__ import absolute_import - -# use import * to import all settings from base -from .base import * # NOQA - -# ######### HOST CONFIGURATION -# See: https://docs.djangoproject.com/en/1.5/releases/1.5/#allowed-hosts-required-in-production # noqa -ALLOWED_HOSTS = get_env_variable('GVALDAP_ALLOWED_HOSTS').split(',') -# ######### END HOST CONFIGURATION - -# ######### EMAIL CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-backend -EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-subject-prefix -EMAIL_SUBJECT_PREFIX = '[%s] ' % SITE_NAME - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#default-from-email -DEFAULT_FROM_EMAIL = get_env_variable('GVALDAP_ADMIN_EMAIL') - -# See: https://docs.djangoproject.com/en/dev/ref/settings/#server-email -SERVER_EMAIL = get_env_variable('GVALDAP_SERVER_EMAIL') -# ######### END EMAIL CONFIGURATION - -# ######### CACHE CONFIGURATION -# See: https://docs.djangoproject.com/en/dev/ref/settings/#caches -# CACHES = {} -# ######### END CACHE CONFIGURATION diff --git a/gvaldap/gvaldap/settings/test.py b/gvaldap/gvaldap/settings/test.py deleted file mode 100644 index f52f224..0000000 --- a/gvaldap/gvaldap/settings/test.py +++ /dev/null @@ -1,35 +0,0 @@ -# pymode:lint_ignore=W0401 -""" -Test settings based on :py:mod:`gvaldap.settings.base`. - -""" -from __future__ import absolute_import - -# use import * to import all settings from base -from .base import * # NOQA - -PASSWORD_HASHERS = ( - 'django.contrib.auth.hashers.MD5PasswordHasher', -) -# ######### IN-MEMORY TEST DATABASE -DATABASES['default'] = { - "ENGINE": "django.db.backends.sqlite3", - "NAME": ":memory:", - "USER": "", - "PASSWORD": "", - "HOST": "", - "PORT": "", -} - -LOGGING['handlers'].update({ - 'console': { - 'level': 'ERROR', - 'class': 'logging.StreamHandler', - 'formatter': 'simple', - } -}) -LOGGING['loggers'].update(dict( - [(key, {'handlers': ['console'], 'level': 'ERROR', 'propagate': True, }) - for key in ['ldapentities', 'ldaptasks']])) -BROKER_URL = BROKER_URL + '_test' -CELERY_RESULT_PERSISTENT = False diff --git a/gvaldap/gvaldap/tests/test_celery.py b/gvaldap/gvaldap/tests/test_celery.py deleted file mode 100644 index b74f16d..0000000 --- a/gvaldap/gvaldap/tests/test_celery.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -This module implements tests for :py:mod:`gvaldap.celery`. - -""" -from unittest import TestCase - -from gvaldap.celery import get_installed_apps -from django.conf import settings - - -class GetInstalledAppsTest(TestCase): - - def test_get_installed_apps(self): - self.assertEqual(get_installed_apps(), settings.INSTALLED_APPS) diff --git a/gvaldap/gvaldap/wsgi.py b/gvaldap/gvaldap/wsgi.py index b297d4d..a02e98b 100644 --- a/gvaldap/gvaldap/wsgi.py +++ b/gvaldap/gvaldap/wsgi.py @@ -17,6 +17,11 @@ import os from os.path import abspath, dirname from sys import path +# This application object is used by any WSGI server configured to use this +# file. This includes Django's development server, if the WSGI_APPLICATION +# setting points here. +from django.core.wsgi import get_wsgi_application # noqa + SITE_ROOT = dirname(dirname(abspath(__file__))) path.append(SITE_ROOT) @@ -24,12 +29,8 @@ path.append(SITE_ROOT) # if running multiple sites in the same mod_wsgi process. To fix this, use # mod_wsgi daemon mode with each site in its own daemon process, or use # os.environ["DJANGO_SETTINGS_MODULE"] = "jajaja.settings" -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gvaldap.settings.production") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gvaldap.settings") -# This application object is used by any WSGI server configured to use this -# file. This includes Django's development server, if the WSGI_APPLICATION -# setting points here. -from django.core.wsgi import get_wsgi_application # noqa application = get_wsgi_application() # Apply WSGI middleware here. diff --git a/gvaldap/gvaldap/ldaptasks/__init__.py b/gvaldap/ldaptasks/__init__.py similarity index 100% rename from gvaldap/gvaldap/ldaptasks/__init__.py rename to gvaldap/ldaptasks/__init__.py diff --git a/gvaldap/ldaptasks/celery.py b/gvaldap/ldaptasks/celery.py new file mode 100644 index 0000000..437b4e8 --- /dev/null +++ b/gvaldap/ldaptasks/celery.py @@ -0,0 +1,17 @@ +""" +This module defines the Celery_ app for gvaldap. + +.. _Celery: http://www.celeryproject.org/ + +""" +import os + +from celery import Celery + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gvaldap.settings") + +app = Celery("ldaptasks") + +app.config_from_object("django.conf:settings", namespace="CELERY") + +app.autodiscover_tasks() diff --git a/gvaldap/gvaldap/ldaptasks/tasks.py b/gvaldap/ldaptasks/tasks.py similarity index 72% rename from gvaldap/gvaldap/ldaptasks/tasks.py rename to gvaldap/ldaptasks/tasks.py index 50c0324..db41f0f 100644 --- a/gvaldap/gvaldap/ldaptasks/tasks.py +++ b/gvaldap/ldaptasks/tasks.py @@ -8,16 +8,14 @@ This module defines `Celery`_ tasks to manage LDAP entities. from __future__ import absolute_import from copy import deepcopy -from django.core.exceptions import ObjectDoesNotExist + from celery import shared_task -from celery.utils.log import get_task_logger from celery.exceptions import Reject +from celery.utils.log import get_task_logger -from ldapentities.models import ( - LdapGroup, - LdapUser, -) +from django.core.exceptions import ObjectDoesNotExist +from ldapentities.models import LdapGroup, LdapUser _LOGGER = get_task_logger(__name__) @@ -43,20 +41,20 @@ def create_ldap_group(groupname, gid, description): try: ldapgroup = LdapGroup.objects.get(name=groupname) _LOGGER.info( - 'LDAP group %s with groupname %s already exists', - ldapgroup.dn, groupname) + "LDAP group %s with groupname %s already exists", ldapgroup.dn, groupname + ) ldapgroup.gid = gid except LdapGroup.DoesNotExist: ldapgroup = LdapGroup(gid=gid, name=groupname) - _LOGGER.info('created LDAP group %s', ldapgroup.dn) + _LOGGER.info("created LDAP group %s", ldapgroup.dn) ldapgroup.description = description ldapgroup.save() - _LOGGER.info('set description of LDAP group %s', ldapgroup.dn) + _LOGGER.info("set description of LDAP group %s", ldapgroup.dn) return { - 'groupname': groupname, - 'gid': gid, - 'description': description, - 'group_dn': ldapgroup.dn, + "groupname": groupname, + "gid": gid, + "description": description, + "group_dn": ldapgroup.dn, } @@ -89,14 +87,14 @@ def create_ldap_user(username, uid, gid, gecos, homedir, shell, password): try: ldapuser = LdapUser.objects.get(username=username) _LOGGER.info( - 'LDAP user %s with username %s already exists', - ldapuser.dn, username) + "LDAP user %s with username %s already exists", ldapuser.dn, username + ) except LdapUser.DoesNotExist: ldapuser = LdapUser(username=username) try: ldapgroup = LdapGroup.objects.get(gid=gid) except ObjectDoesNotExist as exc: - _LOGGER.error('LDAP group with gid %d does not exist', gid) + _LOGGER.error("LDAP group with gid %d does not exist", gid) raise Reject(exc, requeue=False) ldapuser.uid = uid ldapuser.group = gid @@ -107,27 +105,27 @@ def create_ldap_user(username, uid, gid, gecos, homedir, shell, password): ldapuser.common_name = username if password is not None: ldapuser.set_password(password) - _LOGGER.info('set password for LDAP user %s', ldapuser.dn) + _LOGGER.info("set password for LDAP user %s", ldapuser.dn) ldapuser.save() - _LOGGER.info('LDAP user %s created', ldapuser.dn) + _LOGGER.info("LDAP user %s created", ldapuser.dn) if ldapuser.username in ldapgroup.members: _LOGGER.info( - 'LDAP user %s is already member of LDAP group %s', - ldapuser.dn, ldapgroup.dn) + "LDAP user %s is already member of LDAP group %s", ldapuser.dn, ldapgroup.dn + ) else: ldapgroup.members.append(ldapuser.username) ldapgroup.save() _LOGGER.info( - 'LDAP user %s has been added to LDAP group %s', - ldapuser.dn, ldapgroup.dn) + "LDAP user %s has been added to LDAP group %s", ldapuser.dn, ldapgroup.dn + ) return { - 'username': username, - 'uid': uid, - 'gid': gid, - 'gecos': gecos, - 'homedir': homedir, - 'shell': shell, - 'user_dn': ldapuser.dn, + "username": username, + "uid": uid, + "gid": gid, + "gecos": gecos, + "homedir": homedir, + "shell": shell, + "user_dn": ldapuser.dn, } @@ -145,16 +143,16 @@ def set_ldap_user_password(username, password): :rtype: dict """ - retval = {'username': username, 'password_set': False} + retval = {"username": username, "password_set": False} try: ldapuser = LdapUser.objects.get(username=username) except LdapUser.DoesNotExist: - _LOGGER.info('there is no LDAP user with username %s', username) + _LOGGER.info("there is no LDAP user with username %s", username) return retval ldapuser.set_password(password) ldapuser.save() _LOGGER.info("set new password for LDAP user %s", ldapuser.dn) - retval['password_set'] = True + retval["password_set"] = True return retval @@ -175,27 +173,31 @@ def add_ldap_user_to_group(self, username, groupname): :rtype: dict """ - retval = {'username': username, 'groupname': groupname, 'added': False} + retval = {"username": username, "groupname": groupname, "added": False} try: ldapgroup = LdapGroup.objects.get(name=groupname) ldapuser = LdapUser.objects.get(username=username) except LdapGroup.DoesNotExist: - _LOGGER.error('LDAP group with groupname %s does not exist', groupname) + _LOGGER.error("LDAP group with groupname %s does not exist", groupname) except LdapUser.DoesNotExist as exc: - _LOGGER.error('LDAP user with username %s does not exist', username) + _LOGGER.error("LDAP user with username %s does not exist", username) self.retry(exc=exc, time_limit=5) else: if ldapuser.username not in ldapgroup.members: ldapgroup.members.append(ldapuser.username) ldapgroup.save() _LOGGER.info( - 'LDAP user %s has been added to LDAP group %s', - ldapuser.username, ldapgroup.dn) + "LDAP user %s has been added to LDAP group %s", + ldapuser.username, + ldapgroup.dn, + ) else: _LOGGER.info( - 'LDAP user %s is already in LDAP group %s', - ldapuser.username, ldapgroup.dn) - retval['added'] = True + "LDAP user %s is already in LDAP group %s", + ldapuser.username, + ldapgroup.dn, + ) + retval["added"] = True return retval @@ -212,26 +214,28 @@ def remove_ldap_user_from_group(username, groupname): :rtype: dict """ - retval = {'username': username, 'groupname': groupname, 'removed': False} + retval = {"username": username, "groupname": groupname, "removed": False} try: ldapgroup = LdapGroup.objects.get(name=groupname) ldapuser = LdapUser.objects.get(username=username) except LdapGroup.DoesNotExist: - _LOGGER.error('LDAP group with groupname %s does not exist', groupname) + _LOGGER.error("LDAP group with groupname %s does not exist", groupname) except LdapUser.DoesNotExist: - _LOGGER.error('LDAP user with username %s does not exist', username) + _LOGGER.error("LDAP user with username %s does not exist", username) else: if ldapuser.username in ldapgroup.members: ldapgroup.members.remove(ldapuser.username) _LOGGER.info( - 'removed LDAP user %s from LDAP group %s', - ldapuser.dn, ldapgroup.dn) + "removed LDAP user %s from LDAP group %s", ldapuser.dn, ldapgroup.dn + ) ldapgroup.save() - retval['removed'] = True + retval["removed"] = True else: _LOGGER.info( - 'LDAP user %s is not a member of LDAP group %s', - ldapuser.dn, ldapgroup.dn) + "LDAP user %s is not a member of LDAP group %s", + ldapuser.dn, + ldapgroup.dn, + ) return retval @@ -255,29 +259,31 @@ def delete_ldap_user(username, *args, **kwargs): positions in the task chain """ - retval = {'username': username, 'deleted': False} + retval = {"username": username, "deleted": False} try: ldapuser = LdapUser.objects.get(username=username) except LdapUser.DoesNotExist: - _LOGGER.info('there is no LDAP user with username %s', username) + _LOGGER.info("there is no LDAP user with username %s", username) else: try: ldapgroup = LdapGroup.objects.get(gid=ldapuser.group) except LdapGroup.DoesNotExist: _LOGGER.info( - 'LDAP group %s of LDAP user %s does not exist', - ldapuser.group, ldapuser.dn) + "LDAP group %s of LDAP user %s does not exist", + ldapuser.group, + ldapuser.dn, + ) else: if ldapuser.username in ldapgroup.members: ldapgroup.members.remove(ldapuser.username) ldapgroup.save() _LOGGER.info( - 'removed LDAP user %s from LDAP group %s', - ldapuser.dn, ldapgroup.dn) + "removed LDAP user %s from LDAP group %s", ldapuser.dn, ldapgroup.dn + ) userdn = ldapuser.dn ldapuser.delete() - _LOGGER.info('deleted LDAP user %s', userdn) - retval['deleted'] = True + _LOGGER.info("deleted LDAP user %s", userdn) + retval["deleted"] = True return retval @@ -295,7 +301,7 @@ def delete_ldap_user_chained(previous_result, *args, **kwargs): :rtype: dict """ - username = previous_result['username'] + username = previous_result["username"] retval = deepcopy(previous_result) retval.update(delete_ldap_user(username)) return retval @@ -313,22 +319,23 @@ def delete_ldap_group_if_empty(groupname): :rtype: dict """ - retval = {'groupname': groupname, 'deleted': False} + retval = {"groupname": groupname, "deleted": False} try: ldapgroup = LdapGroup.objects.get(name=groupname) except LdapGroup.DoesNotExist: - _LOGGER.info('LDAP group with groupname %s does not exist', groupname) + _LOGGER.info("LDAP group with groupname %s does not exist", groupname) else: if len(ldapgroup.members) == 0: groupdn = ldapgroup.dn ldapgroup.delete() - _LOGGER.info( - 'deleted LDAP group %s', groupdn) - retval['deleted'] = True + _LOGGER.info("deleted LDAP group %s", groupdn) + retval["deleted"] = True else: _LOGGER.info( - 'LDAP group %s has not been deleted. It still has %d members', - ldapgroup.dn, len(ldapgroup.members)) + "LDAP group %s has not been deleted. It still has %d members", + ldapgroup.dn, + len(ldapgroup.members), + ) return retval @@ -344,14 +351,14 @@ def delete_ldap_group(groupname): :rtype: dict """ - retval = {'groupname': groupname, 'deleted': False} + retval = {"groupname": groupname, "deleted": False} try: ldapgroup = LdapGroup.objects.get(name=groupname) except LdapGroup.DoesNotExist: - _LOGGER.info('LDAP group with name %s does not exist', groupname) + _LOGGER.info("LDAP group with name %s does not exist", groupname) else: groupdn = ldapgroup.dn ldapgroup.delete() - _LOGGER.info('deleted LDAP group %s', groupdn) - retval['deleted'] = True + _LOGGER.info("deleted LDAP group %s", groupdn) + retval["deleted"] = True return retval diff --git a/gvaldap/gvaldap/ldaptasks/tests/__init__.py b/gvaldap/ldaptasks/tests/__init__.py similarity index 100% rename from gvaldap/gvaldap/ldaptasks/tests/__init__.py rename to gvaldap/ldaptasks/tests/__init__.py diff --git a/gvaldap/gvaldap/ldaptasks/tests/test_tasks.py b/gvaldap/ldaptasks/tests/test_tasks.py similarity index 99% rename from gvaldap/gvaldap/ldaptasks/tests/test_tasks.py rename to gvaldap/ldaptasks/tests/test_tasks.py index b0c1ce8..42d2a48 100644 --- a/gvaldap/gvaldap/ldaptasks/tests/test_tasks.py +++ b/gvaldap/ldaptasks/tests/test_tasks.py @@ -3,12 +3,13 @@ This module provides tests for :py:mod:`ldaptasks.tasks`. """ import volatildap -from django.conf import settings -from django.test import TestCase from celery.exceptions import Reject +from django.conf import settings +from django.test import TestCase + from ldapentities.models import LdapUser -from gvaldap.ldaptasks.tasks import ( +from ldaptasks.tasks import ( add_ldap_user_to_group, create_ldap_group, create_ldap_user, diff --git a/gvaldap/manage.py b/gvaldap/manage.py index c9b1eb2..e271baa 100644 --- a/gvaldap/manage.py +++ b/gvaldap/manage.py @@ -3,7 +3,7 @@ import os import sys if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gvaldap.settings.local") + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gvaldap.settings") from django.core.management import execute_from_command_line diff --git a/gvaldap/setup.cfg b/gvaldap/setup.cfg index 3776715..e41483d 100644 --- a/gvaldap/setup.cfg +++ b/gvaldap/setup.cfg @@ -5,12 +5,21 @@ exclude = migrations exclude = migrations [coverage:run] -source = gvaldap,ldapentities,gvaldap.ldaptasks +source = gvaldap,ldapentities,ldaptasks branch = True +omit = */migrations/*,*/tests/*.py,*/tests.py,gvaldap.py +relative_files = True [coverage:report] -omit = */migrations/*,*/tests/*.py,*/tests.py,gvaldap/settings/local.py,gvaldap/settings/production.py show_missing = True [coverage:html] directory = ../coverage-report + +[isort] +multi_line_output = 3 +line_length = 88 +known_django = django +known_third_party = celery,volatildap +include_trailing_comma = True +sections = FUTURE,STDLIB,THIRDPARTY,DJANGO,FIRSTPARTY,LOCALFOLDER