Compare commits
	
		
			4 commits
		
	
	
		
			11c04df074
			...
			5b04c476c9
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 5b04c476c9 | |||
| 38b120b03e | |||
| f3ef40df0b | |||
| a3feb92503 | 
					 9 changed files with 822 additions and 628 deletions
				
			
		|  | @ -6,9 +6,12 @@ Common settings and globals. | |||
| """ | ||||
| 
 | ||||
| from os.path import abspath, basename, dirname, join, normpath | ||||
| from environs import Env | ||||
| 
 | ||||
| from django.contrib.messages import constants as messages | ||||
| from gvacommon.settings_utils import get_env_variable | ||||
| 
 | ||||
| env = Env() | ||||
| env.read_env() | ||||
| 
 | ||||
| # ######### PATH CONFIGURATION | ||||
| # Absolute filesystem path to the Django project directory: | ||||
|  | @ -17,12 +20,14 @@ DJANGO_ROOT = dirname(dirname(abspath(__file__))) | |||
| # Absolute filesystem path to the top-level project folder: | ||||
| SITE_ROOT = dirname(DJANGO_ROOT) | ||||
| 
 | ||||
| ROOT_DIR = dirname(DJANGO_ROOT) | ||||
| 
 | ||||
| # Site name: | ||||
| SITE_NAME = basename(DJANGO_ROOT) | ||||
| 
 | ||||
| # ######### END PATH CONFIGURATION | ||||
| 
 | ||||
| GVA_ENVIRONMENT = get_env_variable("GVA_ENVIRONMENT", default="prod") | ||||
| GVA_ENVIRONMENT = env.str("GVA_ENVIRONMENT", default="prod") | ||||
| 
 | ||||
| # ######### DEBUG CONFIGURATION | ||||
| # See: https://docs.djangoproject.com/en/dev/ref/settings/#debug | ||||
|  | @ -34,8 +39,8 @@ DEBUG = GVA_ENVIRONMENT == "local" | |||
| # See: https://docs.djangoproject.com/en/dev/ref/settings/#admins | ||||
| ADMINS = ( | ||||
|     ( | ||||
|         get_env_variable("GVA_ADMIN_NAME", default="Admin"), | ||||
|         get_env_variable("GVA_ADMIN_EMAIL", default="admin@example.org"), | ||||
|         env.str("GVA_ADMIN_NAME", default="Admin"), | ||||
|         env.str("GVA_ADMIN_EMAIL", default="admin@example.org"), | ||||
|     ), | ||||
| ) | ||||
| 
 | ||||
|  | @ -47,14 +52,7 @@ MANAGERS = ADMINS | |||
| # ######### DATABASE CONFIGURATION | ||||
| # See: https://docs.djangoproject.com/en/dev/ref/settings/#databases | ||||
| DATABASES = { | ||||
|     "default": { | ||||
|         "ENGINE": "django.db.backends.postgresql", | ||||
|         "NAME": get_env_variable("GVA_PGSQL_DATABASE", default="gnuviechadmin"), | ||||
|         "USER": get_env_variable("GVA_PGSQL_USER", default="gnuviechadmin"), | ||||
|         "PASSWORD": get_env_variable("GVA_PGSQL_PASSWORD"), | ||||
|         "HOST": get_env_variable("GVA_PGSQL_HOSTNAME", default="db"), | ||||
|         "PORT": get_env_variable("GVA_PGSQL_PORT", int, default=5432), | ||||
|     } | ||||
|     "default": env.dj_db_url("GVA_DATABASE_URL"), | ||||
| } | ||||
| 
 | ||||
| DEFAULT_AUTO_FIELD = "django.db.models.AutoField" | ||||
|  | @ -70,8 +68,8 @@ LANGUAGE_CODE = "en-us" | |||
| 
 | ||||
| # See: https://docs.djangoproject.com/en/dev/ref/settings/#site-id | ||||
| SITE_ID = 1 | ||||
| SITES_DOMAIN_NAME = get_env_variable("GVA_DOMAIN_NAME") | ||||
| SITES_SITE_NAME = get_env_variable("GVA_SITE_NAME") | ||||
| SITES_DOMAIN_NAME = env.str("GVA_DOMAIN_NAME") | ||||
| SITES_SITE_NAME = env.str("GVA_SITE_NAME") | ||||
| 
 | ||||
| # See: https://docs.djangoproject.com/en/dev/ref/settings/#use-i18n | ||||
| USE_I18N = True | ||||
|  | @ -109,7 +107,7 @@ STATICFILES_FINDERS = ( | |||
| # ######### 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("GVA_SITE_SECRET") | ||||
| SECRET_KEY = env.str("GVA_SITE_SECRET") | ||||
| # ######### END SECRET CONFIGURATION | ||||
| 
 | ||||
| 
 | ||||
|  | @ -164,7 +162,6 @@ MIDDLEWARE = [ | |||
|     "allauth.account.middleware.AccountMiddleware", | ||||
|     "django.middleware.locale.LocaleMiddleware", | ||||
|     "django.contrib.messages.middleware.MessageMiddleware", | ||||
|     # uncomment next line to enable translation to browser locale | ||||
|     "django.middleware.clickjacking.XFrameOptionsMiddleware", | ||||
| ] | ||||
| # ######### END MIDDLEWARE CONFIGURATION | ||||
|  | @ -236,6 +233,7 @@ LOCAL_APPS = ( | |||
|     "help", | ||||
|     "invoices", | ||||
|     "contact_form", | ||||
|     "exit", | ||||
| ) | ||||
| 
 | ||||
| # See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps | ||||
|  | @ -309,7 +307,7 @@ LOGGING = { | |||
|         "logfile": { | ||||
|             "level": "INFO", | ||||
|             "class": "logging.FileHandler", | ||||
|             "filename": get_env_variable("GVA_LOG_FILE", default="gva.log"), | ||||
|             "filename": env.str("GVA_LOG_FILE", default="gva.log"), | ||||
|             "formatter": "verbose", | ||||
|         }, | ||||
|         "mail_admins": { | ||||
|  | @ -352,7 +350,7 @@ WSGI_APPLICATION = "%s.wsgi.application" % SITE_NAME | |||
| 
 | ||||
| 
 | ||||
| # ######### CELERY CONFIGURATION | ||||
| BROKER_URL = get_env_variable( | ||||
| BROKER_URL = env.str( | ||||
|     "GVA_BROKER_URL", default="amqp://gnuviechadmin:gnuviechadmin@mq/gnuviechadmin" | ||||
| ) | ||||
| BROKER_TRANSPORT_OPTIONS = { | ||||
|  | @ -361,7 +359,7 @@ BROKER_TRANSPORT_OPTIONS = { | |||
|     "interval_step": 0.2, | ||||
|     "interval_max": 0.2, | ||||
| } | ||||
| CELERY_RESULT_BACKEND = get_env_variable( | ||||
| CELERY_RESULT_BACKEND = env.str( | ||||
|     "GVA_RESULTS_REDIS_URL", default="redis://:gnuviechadmin@redis:6379/0" | ||||
| ) | ||||
| CELERY_TASK_RESULT_EXPIRES = None | ||||
|  | @ -375,32 +373,32 @@ CELERY_RESULT_SERIALIZER = "json" | |||
| 
 | ||||
| 
 | ||||
| # ######### CUSTOM APP CONFIGURATION | ||||
| OSUSER_MINUID = get_env_variable("GVA_MIN_OS_UID", int, default=10000) | ||||
| OSUSER_MINGID = get_env_variable("GVA_MIN_OS_GID", int, default=10000) | ||||
| OSUSER_USERNAME_PREFIX = get_env_variable("GVA_OSUSER_PREFIX", default="usr") | ||||
| OSUSER_HOME_BASEPATH = get_env_variable("GVA_OSUSER_HOME_BASEPATH", default="/home") | ||||
| OSUSER_DEFAULT_SHELL = get_env_variable( | ||||
| OSUSER_MINUID = env.int("GVA_MIN_OS_UID", default=10000) | ||||
| OSUSER_MINGID = env.int("GVA_MIN_OS_GID", default=10000) | ||||
| OSUSER_USERNAME_PREFIX = env.str("GVA_OSUSER_PREFIX", default="usr") | ||||
| OSUSER_HOME_BASEPATH = env.str("GVA_OSUSER_HOME_BASEPATH", default="/home") | ||||
| OSUSER_DEFAULT_SHELL = env.str( | ||||
|     "GVA_OSUSER_DEFAULT_SHELL", default="/usr/bin/rssh" | ||||
| ) | ||||
| OSUSER_SFTP_GROUP = "sftponly" | ||||
| OSUSER_SSH_GROUP = "sshusers" | ||||
| OSUSER_DEFAULT_GROUPS = [OSUSER_SFTP_GROUP] | ||||
| OSUSER_UPLOAD_SERVER = get_env_variable("GVA_OSUSER_UPLOADSERVER", default="file") | ||||
| OSUSER_UPLOAD_SERVER = env.str("GVA_OSUSER_UPLOADSERVER", default="file") | ||||
| 
 | ||||
| GVA_LINK_WEBMAIL = get_env_variable( | ||||
| GVA_LINK_WEBMAIL = env.str( | ||||
|     "GVA_WEBMAIL_URL", default="https://webmail.example.org/" | ||||
| ) | ||||
| GVA_LINK_PHPMYADMIN = get_env_variable( | ||||
| GVA_LINK_PHPMYADMIN = env.str( | ||||
|     "GVA_PHPMYADMIN_URL", default="https://phpmyadmin.example.org/" | ||||
| ) | ||||
| GVA_LINK_PHPPGADMIN = get_env_variable( | ||||
| GVA_LINK_PHPPGADMIN = env.str( | ||||
|     "GVA_PHPPGADMIN_URL", default="https://phppgadmin.example.org/" | ||||
| ) | ||||
| # ######### END CUSTOM APP CONFIGURATION | ||||
| 
 | ||||
| # ######### STATIC FILE CONFIGURATION | ||||
| # See: https://docs.djangoproject.com/en/dev/ref/settings/#static-root | ||||
| STATIC_ROOT = "/srv/gva/static/" | ||||
| STATIC_ROOT = env.str("GVA_STATIC_PATH", default=normpath(join(ROOT_DIR, "static"))) | ||||
| 
 | ||||
| 
 | ||||
| def show_debug_toolbar(request): | ||||
|  | @ -495,12 +493,12 @@ else: | |||
|     EMAIL_SUBJECT_PREFIX = "[%s] " % SITE_NAME | ||||
| 
 | ||||
|     # See: https://docs.djangoproject.com/en/dev/ref/settings/#default-from-email | ||||
|     DEFAULT_FROM_EMAIL = get_env_variable( | ||||
|     DEFAULT_FROM_EMAIL = env.str( | ||||
|         "GVA_SITE_ADMINMAIL", default="admin@example.org" | ||||
|     ) | ||||
| 
 | ||||
|     # See: https://docs.djangoproject.com/en/dev/ref/settings/#server-email | ||||
|     SERVER_EMAIL = get_env_variable("GVA_SITE_ADMINMAIL", default="admin@example.org") | ||||
|     SERVER_EMAIL = env.str("GVA_SITE_ADMINMAIL", default="admin@example.org") | ||||
|     # ######### END EMAIL CONFIGURATION | ||||
| 
 | ||||
|     # ######### CACHE CONFIGURATION | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ PASSWORD_MISMATCH_ERROR = _("Passwords don't match") | |||
| 
 | ||||
| 
 | ||||
| class ReadOnlyPasswordHashWidget(forms.Widget): | ||||
|     def render(self, name, value, attrs): | ||||
|     def render(self, name, value, attrs, renderer=None): | ||||
|         final_attrs = self.build_attrs(attrs) | ||||
|         summary = format_html("<strong>{0}</strong>: {1} ", _("Hash"), value) | ||||
|         return format_html("<div{0}>{1}</div>", flatatt(final_attrs), summary) | ||||
|  |  | |||
|  | @ -119,13 +119,13 @@ class ActivationChangeMixinTest(TestCase): | |||
|         querysetmock = Mock() | ||||
|         activationchange = ActivationChangeMixin() | ||||
|         activationchange.activate(Mock(), querysetmock) | ||||
|         querysetmock.update.called_with(active=True) | ||||
|         querysetmock.update.assert_called_with(active=True) | ||||
| 
 | ||||
|     def test_deactivate(self): | ||||
|         querysetmock = Mock() | ||||
|         activationchange = ActivationChangeMixin() | ||||
|         activationchange.deactivate(Mock(), querysetmock) | ||||
|         querysetmock.update.called_with(active=False) | ||||
|         querysetmock.update.assert_called_with(active=False) | ||||
| 
 | ||||
| 
 | ||||
| class MailBoxAdminTest(CustomerTestCase): | ||||
|  |  | |||
|  | @ -35,8 +35,8 @@ class FetchTaskResultsCommandTest(TestCase): | |||
|         Command().handle(verbosity=0) | ||||
| 
 | ||||
|         tr = TaskResult.objects.get(task_id=TEST_TASK_UUID) | ||||
|         self.assertTrue(asyncresult.called_with(TEST_TASK_UUID)) | ||||
|         self.assertTrue(aresult.ready.called_with()) | ||||
|         asyncresult.assert_called_with(TEST_TASK_UUID) | ||||
|         aresult.ready.assert_called_with() | ||||
|         self.assertFalse(tr.finished) | ||||
|         self.assertEqual(tr.result, "") | ||||
|         self.assertEqual(tr.state, "PENDING") | ||||
|  | @ -58,9 +58,9 @@ class FetchTaskResultsCommandTest(TestCase): | |||
|         Command().handle(verbosity=0) | ||||
| 
 | ||||
|         tr = TaskResult.objects.get(task_id=TEST_TASK_UUID) | ||||
|         self.assertTrue(asyncresult.called_with(TEST_TASK_UUID)) | ||||
|         self.assertTrue(aresult.ready.called_with()) | ||||
|         self.assertTrue(aresult.get.called_with()) | ||||
|         asyncresult.assert_called_with(TEST_TASK_UUID) | ||||
|         aresult.ready.assert_called_with() | ||||
|         aresult.get.assert_called_with(propagate=False, timeout=5) | ||||
|         self.assertTrue(tr.finished) | ||||
|         self.assertEqual(tr.result, TEST_TASK_RESULT) | ||||
|         self.assertEqual(tr.state, "SUCCESS") | ||||
|  |  | |||
|  | @ -41,7 +41,7 @@ class TaskResultTest(TestCase): | |||
|         aresult.ready.return_value = True | ||||
|         aresult.get.return_value = TEST_TASK_RESULT | ||||
|         tr.fetch_result() | ||||
|         self.assertTrue(aresult.get.called_with()) | ||||
|         aresult.get.assert_called_with(propagate=False, timeout=5) | ||||
|         self.assertEqual(aresult.get.call_count, 1) | ||||
|         self.assertTrue(tr.finished) | ||||
|         self.assertEqual(tr.result, str(TEST_TASK_RESULT)) | ||||
|  |  | |||
|  | @ -24,11 +24,9 @@ class DatabaseUserCreationFormTest(TestCase): | |||
|         mockuser = Mock(name="osuser") | ||||
|         form.cleaned_data = {"osuser": mockuser, "db_type": DB_TYPES.pgsql} | ||||
|         retval = form.save() | ||||
|         self.assertTrue( | ||||
|             create_database_user.called_with( | ||||
|         create_database_user.assert_called_with( | ||||
|             osuser=mockuser, db_type=DB_TYPES.pgsql, commit=True | ||||
|         ) | ||||
|         ) | ||||
|         self.assertEqual(retval, create_database_user.return_value) | ||||
| 
 | ||||
|     def test_save_m2m_returns_none(self): | ||||
|  | @ -44,7 +42,7 @@ class UserDatabaseCreationFormTest(TestCase): | |||
|         mockuser = Mock(name="mockuser") | ||||
|         form.cleaned_data = {"db_user": mockuser} | ||||
|         retval = form.save() | ||||
|         self.assertTrue(create_userdatabase.called_with(db_user=mockuser, commit=True)) | ||||
|         create_userdatabase.assert_called_with(db_user=mockuser, commit=True) | ||||
|         self.assertEqual(retval, create_userdatabase.return_value) | ||||
| 
 | ||||
|     def test_save_m2m_returns_none(self): | ||||
|  | @ -79,20 +77,20 @@ class DatabaseUserAdminTest(TestCase): | |||
|     def test_save_model_change(self): | ||||
|         objmock = Mock() | ||||
|         self.dbuadmin.save_model(Mock(name="request"), objmock, Mock(), True) | ||||
|         self.assertTrue(objmock.create_in_database.not_called()) | ||||
|         objmock.create_in_database.assert_not_called() | ||||
| 
 | ||||
|     def test_save_model_no_change(self): | ||||
|         objmock = Mock() | ||||
|         self.dbuadmin.save_model(Mock(name="request"), objmock, Mock(), False) | ||||
|         self.assertTrue(objmock.create_in_database.called_with()) | ||||
|         objmock.create_in_database.assert_called_with() | ||||
| 
 | ||||
|     def test_perform_delete_selected(self): | ||||
|         usermock = Mock() | ||||
|         selected = Mock() | ||||
|         selected.all.return_value = [usermock] | ||||
|         self.dbuadmin.perform_delete_selected(Mock(name="request"), selected) | ||||
|         self.assertTrue(selected.all.called_with()) | ||||
|         self.assertTrue(usermock.delete.called_with()) | ||||
|         selected.all.assert_called_with() | ||||
|         usermock.delete.assert_called_with() | ||||
| 
 | ||||
|     def test_get_actions(self): | ||||
|         requestmock = MagicMock(name="request") | ||||
|  | @ -127,20 +125,20 @@ class UserDatabaseAdminTest(TestCase): | |||
|     def test_save_model_change(self): | ||||
|         objmock = Mock() | ||||
|         self.udbadmin.save_model(Mock(name="request"), objmock, Mock(), True) | ||||
|         self.assertTrue(objmock.create_in_database.not_called()) | ||||
|         objmock.create_in_database.assert_not_called() | ||||
| 
 | ||||
|     def test_save_model_no_change(self): | ||||
|         objmock = Mock() | ||||
|         self.udbadmin.save_model(Mock(name="request"), objmock, Mock(), False) | ||||
|         self.assertTrue(objmock.create_in_database.called_with()) | ||||
|         objmock.create_in_database.assert_called_with() | ||||
| 
 | ||||
|     def test_perform_delete_selected(self): | ||||
|         userdbmock = Mock() | ||||
|         selected = Mock() | ||||
|         selected.all.return_value = [userdbmock] | ||||
|         self.udbadmin.perform_delete_selected(Mock(name="request"), selected) | ||||
|         self.assertTrue(selected.all.called_with()) | ||||
|         self.assertTrue(userdbmock.delete.called_with()) | ||||
|         selected.all.assert_called_with() | ||||
|         userdbmock.delete.assert_called_with() | ||||
| 
 | ||||
|     def test_get_actions(self): | ||||
|         requestmock = MagicMock(name="request") | ||||
|  |  | |||
|  | @ -82,14 +82,12 @@ class AddUserDatabaseFormTest(TestCase): | |||
|         ) | ||||
|         form.cleaned_data = {"db_type": DB_TYPES.pgsql, "password1": "secret"} | ||||
|         form.save() | ||||
|         self.assertTrue( | ||||
|             create_userdatabase_with_user.called_with( | ||||
|         create_userdatabase_with_user.assert_called_with( | ||||
|             DB_TYPES.pgsql, | ||||
|             self.hostingpackage.osuser, | ||||
|             password="secret", | ||||
|             commit=True, | ||||
|         ) | ||||
|         ) | ||||
| 
 | ||||
| 
 | ||||
| class ChangeDatabaseUserPasswordFormTest(TestCase): | ||||
|  | @ -131,4 +129,4 @@ class ChangeDatabaseUserPasswordFormTest(TestCase): | |||
|         ) | ||||
|         form.cleaned_data = {"password1": "secret"} | ||||
|         form.save() | ||||
|         self.assertTrue(instance.set_password.called_with("secret")) | ||||
|         instance.set_password.assert_called_with("secret") | ||||
|  |  | |||
							
								
								
									
										1332
									
								
								poetry.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										1332
									
								
								poetry.lock
									
										
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -5,6 +5,7 @@ description = "gnuviechadmin web interface" | |||
| authors = ["Jan Dittberner <jan@dittberner.info>"] | ||||
| license = "AGPL-3+" | ||||
| readme = "README.rst" | ||||
| package-mode = false | ||||
| 
 | ||||
| [tool.poetry.dependencies] | ||||
| python = "^3.8" | ||||
|  | @ -26,6 +27,7 @@ django-filter = "^23.1" | |||
| crispy-bootstrap5 = "^2023.10" | ||||
| python-magic = "^0.4.27" | ||||
| isort = "^5.12.0" | ||||
| environs = {extras = ["django"], version = "^11.0.0"} | ||||
| 
 | ||||
| 
 | ||||
| [tool.poetry.group.dev.dependencies] | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue