diff --git a/apps/common/conf/settings.py b/apps/common/conf/settings.py
index e1ec67ada3..ebe0f44630 100644
--- a/apps/common/conf/settings.py
+++ b/apps/common/conf/settings.py
@@ -2,74 +2,69 @@
from django.utils.translation import ugettext_lazy as _
-from smart_settings.api import register_setting
+from smart_settings.api import Setting, SettingNamespace
from common.literals import PAGE_SIZE_LETTER, PAGE_ORIENTATION_PORTRAIT
-TEMPORARY_DIRECTORY = register_setting(
- namespace=u'common',
- module=u'common.conf.settings',
- name=u'TEMPORARY_DIRECTORY',
- global_name=u'COMMON_TEMPORARY_DIRECTORY',
+namespace = SettingNamespace('common', _(u'Common'), module=u'common.conf.settings')
+
+Setting(
+ namespace=namespace,
+ name='TEMPORARY_DIRECTORY',
+ global_name='COMMON_TEMPORARY_DIRECTORY',
default=u'/tmp',
- description=_(u'Temporary directory used site wide to store thumbnails, previews and temporary files. If none is specified, one will be created using tempfile.mkdtemp()'),
+ description=_(u'Temporary directory used site wide to store thumbnails, previews and temporary files. If none is specified, one will be created using tempfile.mkdtemp().'),
exists=True
)
-DEFAULT_PAPER_SIZE = register_setting(
- namespace=u'common',
- module=u'common.conf.settings',
+Setting(
+ namespace=namespace,
name=u'DEFAULT_PAPER_SIZE',
global_name=u'COMMON_DEFAULT_PAPER_SIZE',
default=PAGE_SIZE_LETTER,
)
-DEFAULT_PAGE_ORIENTATION = register_setting(
- namespace=u'common',
- module=u'common.conf.settings',
+Setting(
+ namespace=namespace,
name=u'DEFAULT_PAGE_ORIENTATION',
global_name=u'COMMON_DEFAULT_PAGE_ORIENTATION',
default=PAGE_ORIENTATION_PORTRAIT,
)
-register_setting(
- namespace=u'common',
- module=u'common.conf.settings',
+Setting(
+ namespace=namespace,
name=u'AUTO_CREATE_ADMIN',
global_name=u'COMMON_AUTO_CREATE_ADMIN',
default=True,
)
-register_setting(
- namespace=u'common',
- module=u'common.conf.settings',
+Setting(
+ namespace=namespace,
name=u'AUTO_ADMIN_USERNAME',
global_name=u'COMMON_AUTO_ADMIN_USERNAME',
default=u'admin',
)
-register_setting(
- namespace=u'common',
- module=u'common.conf.settings',
+Setting(
+ namespace=namespace,
name=u'AUTO_ADMIN_PASSWORD',
global_name=u'COMMON_AUTO_ADMIN_PASSWORD',
default=u'admin',
)
-register_setting(
- namespace=u'common',
- module=u'common.conf.settings',
+Setting(
+ namespace=namespace,
name=u'LOGIN_METHOD',
global_name=u'COMMON_LOGIN_METHOD',
default=u'username',
description=_(u'Controls the mechanism used to authenticated user. Options are: username, email'),
)
-register_setting(
- namespace=u'common',
- module=u'common.conf.settings',
+Setting(
+ namespace=namespace,
name=u'ALLOW_ANONYMOUS_ACCESS',
global_name=u'COMMON_ALLOW_ANONYMOUS_ACCESS',
default=False,
description=_(u'Allow non authenticated users, access to all views'),
)
+
diff --git a/apps/common/utils.py b/apps/common/utils.py
index 3905be558c..37188b5aec 100644
--- a/apps/common/utils.py
+++ b/apps/common/utils.py
@@ -15,6 +15,10 @@ from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import User
+from django.core.urlresolvers import reverse
+from django.utils.functional import lazy
+
+reverse_lazy = lazy(reverse, str)
def urlquote(link=None, get=None):
diff --git a/apps/converter/conf/settings.py b/apps/converter/conf/settings.py
index 1dbfe4d6bc..3d4b1e27f4 100644
--- a/apps/converter/conf/settings.py
+++ b/apps/converter/conf/settings.py
@@ -1,23 +1,80 @@
-'''Configuration options for the converter app'''
+"""Configuration options for the converter app"""
from django.utils.translation import ugettext_lazy as _
-from smart_settings.api import register_settings
+from smart_settings.api import Setting, SettingNamespace
-register_settings(
- namespace=u'converter',
- module=u'converter.conf.settings',
- settings=[
- {'name': u'IM_CONVERT_PATH', 'global_name': u'CONVERTER_IM_CONVERT_PATH', 'default': u'/usr/bin/convert', 'description': _(u'File path to imagemagick\'s convert program.'), 'exists': True},
- {'name': u'IM_IDENTIFY_PATH', 'global_name': u'CONVERTER_IM_IDENTIFY_PATH', 'default': u'/usr/bin/identify', 'description': _(u'File path to imagemagick\'s identify program.'), 'exists': True},
- {'name': u'GM_PATH', 'global_name': u'CONVERTER_GM_PATH', 'default': u'/usr/bin/gm', 'description': _(u'File path to graphicsmagick\'s program.'), 'exists': True},
- {'name': u'GM_SETTINGS', 'global_name': u'CONVERTER_GM_SETTINGS', 'default': u''},
- {'name': u'GRAPHICS_BACKEND', 'global_name': u'CONVERTER_GRAPHICS_BACKEND', 'default': u'converter.backends.python', 'description': _(u'Graphics conversion backend to use. Options are: converter.backends.imagemagick, converter.backends.graphicsmagick and converter.backends.python.')},
- {'name': u'UNOCONV_PATH', 'global_name': u'CONVERTER_UNOCONV_PATH', 'default': u'/usr/bin/unoconv', 'exists': True, 'description': _(u'Path to the unoconv program.')},
- {'name': u'UNOCONV_USE_PIPE', 'global_name': u'CONVERTER_UNOCONV_USE_PIPE', 'default': True, 'description': _(u'Use alternate method of connection to LibreOffice using a pipe, it is slower but less prone to segmentation faults.')},
-
- #{'name': u'OCR_OPTIONS', 'global_name': u'CONVERTER_OCR_OPTIONS', 'default': u'-colorspace Gray -depth 8 -resample 200x200'},
- #{'name': u'HIGH_QUALITY_OPTIONS', 'global_name': u'CONVERTER_HIGH_QUALITY_OPTIONS', 'default': u'-density 400'},
- #{'name': u'PRINT_QUALITY_OPTIONS', 'global_name': u'CONVERTER_PRINT_QUALITY_OPTIONS', 'default': u'-density 500'},
- ]
+namespace = SettingNamespace('converter', _(u'Converter'), module='converter.conf.settings')
+
+Setting(
+ namespace=namespace,
+ name='IM_CONVERT_PATH',
+ global_name='CONVERTER_IM_CONVERT_PATH',
+ default=u'/usr/bin/convert',
+ description=_(u'File path to imagemagick\'s convert program.'),
+ exists=True,
)
+
+Setting(
+ namespace=namespace,
+ name='IM_CONVERT_PATH',
+ global_name='CONVERTER_IM_CONVERT_PATH',
+ default=u'/usr/bin/convert',
+ description=_(u'File path to imagemagick\'s convert program.'),
+ exists=True,
+)
+
+Setting(
+ namespace=namespace,
+ name='IM_IDENTIFY_PATH',
+ global_name='CONVERTER_IM_IDENTIFY_PATH',
+ default=u'/usr/bin/identify',
+ description=_(u'File path to imagemagick\'s identify program.'),
+ exists=True,
+)
+
+Setting(
+ namespace=namespace,
+ name='GM_PATH',
+ global_name='CONVERTER_GM_PATH',
+ default=u'/usr/bin/gm',
+ description=_(u'File path to graphicsmagick\'s program.'),
+ exists=True,
+)
+
+Setting(
+ namespace=namespace,
+ name='GM_SETTINGS',
+ global_name='CONVERTER_GM_SETTINGS',
+ default=u'',
+ description=_(u'Set of configuration options to pass to the GraphicsMagick executable to fine tune it\'s functionality as explained in the GraphicsMagick documentation.'),
+)
+
+Setting(
+ namespace=namespace,
+ name='GRAPHICS_BACKEND',
+ global_name='CONVERTER_GRAPHICS_BACKEND',
+ default=u'converter.backends.python',
+ description=_(u'Graphics conversion backend to use. Options are: converter.backends.imagemagick, converter.backends.graphicsmagick and converter.backends.python.'),
+)
+
+Setting(
+ namespace=namespace,
+ name='UNOCONV_PATH',
+ global_name='CONVERTER_UNOCONV_PATH',
+ default=u'/usr/bin/unoconv',
+ description=_(u'Path to the unoconv program.'),
+ exists=True
+)
+
+Setting(
+ namespace=namespace,
+ name='UNOCONV_USE_PIPE',
+ global_name='CONVERTER_UNOCONV_USE_PIPE',
+ default=True,
+ description=_(u'Use alternate method of connection to LibreOffice using a pipe, it is slower but less prone to segmentation faults.'),
+)
+
+#{'name': u'OCR_OPTIONS', 'global_name': u'CONVERTER_OCR_OPTIONS', 'default': u'-colorspace Gray -depth 8 -resample 200x200'},
+#{'name': u'HIGH_QUALITY_OPTIONS', 'global_name': u'CONVERTER_HIGH_QUALITY_OPTIONS', 'default': u'-density 400'},
+#{'name': u'PRINT_QUALITY_OPTIONS', 'global_name': u'CONVERTER_PRINT_QUALITY_OPTIONS', 'default': u'-density 500'},
diff --git a/apps/django_gpg/conf/settings.py b/apps/django_gpg/conf/settings.py
index e1eed62938..db063c9426 100644
--- a/apps/django_gpg/conf/settings.py
+++ b/apps/django_gpg/conf/settings.py
@@ -6,13 +6,23 @@ import os
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
-from smart_settings.api import register_settings
+from smart_settings.api import Setting, SettingNamespace
-register_settings(
- namespace=u'django_gpg',
- module=u'django_gpg.conf.settings',
- settings=[
- {'name': u'KEYSERVERS', 'global_name': u'SIGNATURES_KEYSERVERS', 'default': ['pool.sks-keyservers.net'], 'description': _(u'List of keyservers to be queried for unknown keys.')},
- {'name': u'GPG_HOME', 'global_name': u'SIGNATURES_GPG_HOME', 'default': os.path.join(settings.PROJECT_ROOT, u'gpg_home'), 'description': _(u'Home directory used to store keys as well as configuration files.')},
- ]
+namespace = SettingNamespace('django_gpg', _(u'Signatures'), module='django_gpg.conf.settings')
+
+Setting(
+ namespace=namespace,
+ name='KEYSERVERS',
+ global_name='SIGNATURES_KEYSERVERS',
+ default=['pool.sks-keyservers.net'],
+ description=_(u'List of keyservers to be queried for unknown keys.'),
+)
+
+Setting(
+ namespace=namespace,
+ name='GPG_HOME',
+ global_name='SIGNATURES_GPG_HOME',
+ default=os.path.join(settings.PROJECT_ROOT, u'gpg_home'),
+ description=_(u'Home directory used to store keys as well as configuration files.'),
+ exists=True,
)
diff --git a/apps/document_indexing/conf/settings.py b/apps/document_indexing/conf/settings.py
index beb66ca3dd..7e49b7ce1f 100644
--- a/apps/document_indexing/conf/settings.py
+++ b/apps/document_indexing/conf/settings.py
@@ -3,22 +3,50 @@
from django.utils.translation import ugettext_lazy as _
from common.utils import proper_name
-from smart_settings.api import register_settings
+from smart_settings.api import Setting, SettingNamespace
available_indexing_functions = {
'proper_name': proper_name
}
-register_settings(
- namespace=u'document_indexing',
- module=u'document_indexing.conf.settings',
- settings=[
- # Definition
- {'name': u'AVAILABLE_INDEXING_FUNCTIONS', 'global_name': u'DOCUMENT_INDEXING_AVAILABLE_INDEXING_FUNCTIONS', 'default': available_indexing_functions},
- {'name': u'SUFFIX_SEPARATOR', 'global_name': u'DOCUMENT_INDEXING_SUFFIX_SEPARATOR', 'default': u'_'},
- # Filesystem serving
- {'name': u'SLUGIFY_PATHS', 'global_name': u'DOCUMENT_INDEXING_FILESYSTEM_SLUGIFY_PATHS', 'default': False},
- {'name': u'MAX_SUFFIX_COUNT', 'global_name': u'DOCUMENT_INDEXING_FILESYSTEM_MAX_SUFFIX_COUNT', 'default': 1000},
- {'name': u'FILESYSTEM_SERVING', 'global_name': u'DOCUMENT_INDEXING_FILESYSTEM_SERVING', 'default': {}, 'description': _(u'A dictionary that maps the index name and where on the filesystem that index will be mirrored.')}
- ]
+namespace = SettingNamespace('document_indexing', _(u'Indexing'), module='document_indexing.conf.settings')
+
+# Definition
+
+Setting(
+ namespace=namespace,
+ name='AVAILABLE_INDEXING_FUNCTIONS',
+ global_name='DOCUMENT_INDEXING_AVAILABLE_INDEXING_FUNCTIONS',
+ default=available_indexing_functions,
+)
+
+Setting(
+ namespace=namespace,
+ name='SUFFIX_SEPARATOR',
+ global_name='DOCUMENT_INDEXING_SUFFIX_SEPARATOR',
+ default=u'_',
+)
+
+# Filesystem serving
+
+Setting(
+ namespace=namespace,
+ name='SLUGIFY_PATHS',
+ global_name='DOCUMENT_INDEXING_FILESYSTEM_SLUGIFY_PATHS',
+ default=False,
+)
+
+Setting(
+ namespace=namespace,
+ name='MAX_SUFFIX_COUNT',
+ global_name='DOCUMENT_INDEXING_FILESYSTEM_MAX_SUFFIX_COUNT',
+ default=1000,
+)
+
+Setting(
+ namespace=namespace,
+ name='FILESYSTEM_SERVING',
+ global_name='DOCUMENT_INDEXING_FILESYSTEM_SERVING',
+ default={},
+ description=_(u'A dictionary that maps the index name and where on the filesystem that index will be mirrored.'),
)
diff --git a/apps/documents/conf/settings.py b/apps/documents/conf/settings.py
index 5da5542b94..86df5ab6b6 100644
--- a/apps/documents/conf/settings.py
+++ b/apps/documents/conf/settings.py
@@ -8,8 +8,7 @@ from django.utils.translation import ugettext_lazy as _
from django.conf import settings
from storage.backends.filebasedstorage import FileBasedStorage
-from smart_settings.api import register_settings
-
+from smart_settings.api import Setting, SettingNamespace
def default_checksum(x):
"""hashlib.sha256(x).hexdigest()"""
@@ -20,27 +19,115 @@ def default_uuid():
"""unicode(uuid.uuid4())"""
return unicode(uuid.uuid4())
-register_settings(
- namespace=u'documents',
- module=u'documents.conf.settings',
- settings=[
- # Saving
- {'name': u'CHECKSUM_FUNCTION', 'global_name': u'DOCUMENTS_CHECKSUM_FUNCTION', 'default': default_checksum},
- {'name': u'UUID_FUNCTION', 'global_name': u'DOCUMENTS_UUID_FUNCTION', 'default': default_uuid},
- # Storage
- {'name': u'STORAGE_BACKEND', 'global_name': u'DOCUMENTS_STORAGE_BACKEND', 'default': FileBasedStorage},
- # Usage
- {'name': u'PREVIEW_SIZE', 'global_name': u'DOCUMENTS_PREVIEW_SIZE', 'default': u'640x480'},
- {'name': u'PRINT_SIZE', 'global_name': u'DOCUMENTS_PRINT_SIZE', 'default': u'1400'},
- {'name': u'MULTIPAGE_PREVIEW_SIZE', 'global_name': u'DOCUMENTS_MULTIPAGE_PREVIEW_SIZE', 'default': u'160x120'},
- {'name': u'THUMBNAIL_SIZE', 'global_name': u'DOCUMENTS_THUMBNAIL_SIZE', 'default': u'50x50'},
- {'name': u'DISPLAY_SIZE', 'global_name': u'DOCUMENTS_DISPLAY_SIZE', 'default': u'1200'},
- {'name': u'RECENT_COUNT', 'global_name': u'DOCUMENTS_RECENT_COUNT', 'default': 40, 'description': _(u'Maximum number of recent (created, edited, viewed) documents to remember per user.')},
- {'name': u'ZOOM_PERCENT_STEP', 'global_name': u'DOCUMENTS_ZOOM_PERCENT_STEP', 'default': 50, 'description': _(u'Amount in percent zoom in or out a document page per user interaction.')},
- {'name': u'ZOOM_MAX_LEVEL', 'global_name': u'DOCUMENTS_ZOOM_MAX_LEVEL', 'default': 200, 'description': _(u'Maximum amount in percent (%) to allow user to zoom in a document page interactively.')},
- {'name': u'ZOOM_MIN_LEVEL', 'global_name': u'DOCUMENTS_ZOOM_MIN_LEVEL', 'default': 50, 'description': _(u'Minimum amount in percent (%) to allow user to zoom out a document page interactively.')},
- {'name': u'ROTATION_STEP', 'global_name': u'DOCUMENTS_ROTATION_STEP', 'default': 90, 'description': _(u'Amount in degrees to rotate a document page per user interaction.')},
- #
- {'name': u'CACHE_PATH', 'global_name': u'DOCUMENTS_CACHE_PATH', 'default': os.path.join(settings.PROJECT_ROOT, 'image_cache'), 'exists': True},
- ]
+
+namespace = SettingNamespace('documents', _(u'Documents'), module='documents.conf.settings')
+
+# Saving
+
+Setting(
+ namespace=namespace,
+ name='CHECKSUM_FUNCTION',
+ global_name='DOCUMENTS_CHECKSUM_FUNCTION',
+ default=default_checksum,
+)
+
+Setting(
+ namespace=namespace,
+ name='UUID_FUNCTION',
+ global_name='DOCUMENTS_UUID_FUNCTION',
+ default=default_uuid,
+)
+
+# Storage
+
+Setting(
+ namespace=namespace,
+ name='STORAGE_BACKEND',
+ global_name='DOCUMENTS_STORAGE_BACKEND',
+ default=FileBasedStorage,
+)
+
+# Usage
+
+Setting(
+ namespace=namespace,
+ name='PREVIEW_SIZE',
+ global_name='DOCUMENTS_PREVIEW_SIZE',
+ default=u'640x480',
+)
+
+Setting(
+ namespace=namespace,
+ name='PRINT_SIZE',
+ global_name='DOCUMENTS_PRINT_SIZE',
+ default=u'1400',
+)
+
+Setting(
+ namespace=namespace,
+ name='MULTIPAGE_PREVIEW_SIZE',
+ global_name='DOCUMENTS_MULTIPAGE_PREVIEW_SIZE',
+ default=u'160x120',
+)
+
+Setting(
+ namespace=namespace,
+ name='THUMBNAIL_SIZE',
+ global_name='DOCUMENTS_THUMBNAIL_SIZE',
+ default=u'50x50',
+)
+
+Setting(
+ namespace=namespace,
+ name='DISPLAY_SIZE',
+ global_name='DOCUMENTS_DISPLAY_SIZE',
+ default=u'1200',
+)
+
+Setting(
+ namespace=namespace,
+ name='RECENT_COUNT',
+ global_name='DOCUMENTS_RECENT_COUNT',
+ default=40,
+ description=_(u'Maximum number of recent (created, edited, viewed) documents to remember per user.'),
+)
+
+Setting(
+ namespace=namespace,
+ name='ZOOM_PERCENT_STEP',
+ global_name='DOCUMENTS_ZOOM_PERCENT_STEP',
+ default=50,
+ description=_(u'Amount in percent zoom in or out a document page per user interaction.'),
+)
+
+Setting(
+ namespace=namespace,
+ name='ZOOM_MAX_LEVEL',
+ global_name='DOCUMENTS_ZOOM_MAX_LEVEL',
+ default=200,
+ description=_(u'Maximum amount in percent (%) to allow user to zoom in a document page interactively.'),
+)
+
+Setting(
+ namespace=namespace,
+ name='ZOOM_MIN_LEVEL',
+ global_name='DOCUMENTS_ZOOM_MIN_LEVEL',
+ default=50,
+ description=_(u'Minimum amount in percent (%) to allow user to zoom out a document page interactively.'),
+)
+
+Setting(
+ namespace=namespace,
+ name='ROTATION_STEP',
+ global_name='DOCUMENTS_ROTATION_STEP',
+ default=90,
+ description=_(u'Amount in degrees to rotate a document page per user interaction.'),
+)
+
+Setting(
+ namespace=namespace,
+ name='CACHE_PATH',
+ global_name='DOCUMENTS_CACHE_PATH',
+ default=os.path.join(settings.PROJECT_ROOT, 'image_cache'),
+ exists=True
)
diff --git a/apps/dynamic_search/conf/settings.py b/apps/dynamic_search/conf/settings.py
index cc57a5cb1e..78ff433087 100644
--- a/apps/dynamic_search/conf/settings.py
+++ b/apps/dynamic_search/conf/settings.py
@@ -2,14 +2,30 @@
from django.utils.translation import ugettext_lazy as _
-from smart_settings.api import register_settings
+from smart_settings.api import Setting, SettingNamespace
-register_settings(
- namespace=u'dynamic_search',
- module=u'dynamic_search.conf.settings',
- settings=[
- {'name': u'SHOW_OBJECT_TYPE', 'global_name': u'SEARCH_SHOW_OBJECT_TYPE', 'default': True, 'hidden': True},
- {'name': u'LIMIT', 'global_name': u'SEARCH_LIMIT', 'default': 100, 'description': _(u'Maximum amount search hits to fetch and display.')},
- {'name': u'RECENT_COUNT', 'global_name': u'SEARCH_RECENT_COUNT', 'default': 5, 'description': _(u'Maximum number of search queries to remember per user.')},
- ]
+namespace = SettingNamespace('dynamic_search', _(u'Searching'), module='dynamic_search.conf.settings')
+
+Setting(
+ namespace=namespace,
+ name='SHOW_OBJECT_TYPE',
+ global_name='SEARCH_SHOW_OBJECT_TYPE',
+ default=True,
+ hidden=True
+)
+
+Setting(
+ namespace=namespace,
+ name='LIMIT',
+ global_name='SEARCH_LIMIT',
+ default=100,
+ description=_(u'Maximum amount search hits to fetch and display.')
+)
+
+Setting(
+ namespace=namespace,
+ name='RECENT_COUNT',
+ global_name='SEARCH_RECENT_COUNT',
+ default=5,
+ description=_(u'Maximum number of search queries to remember per user.')
)
diff --git a/apps/linking/conf/settings.py b/apps/linking/conf/settings.py
index cf0d855350..7c8f98fc8b 100644
--- a/apps/linking/conf/settings.py
+++ b/apps/linking/conf/settings.py
@@ -1,13 +1,15 @@
-'''Configuration options for the linking app'''
+"""Configuration options for the linking app"""
from django.utils.translation import ugettext_lazy as _
-from smart_settings.api import register_settings
+from smart_settings.api import Setting, SettingNamespace
-register_settings(
- namespace=u'linking',
- module=u'linking.conf.settings',
- settings=[
- {'name': u'SHOW_EMPTY_SMART_LINKS', 'global_name': u'LINKING_SHOW_EMPTY_SMART_LINKS', 'default': True, 'description': _(u'Show smart link that don\'t return any documents.')},
- ]
+namespace = SettingNamespace('linking', _(u'Linking'), module='linking.conf.settings')
+
+Setting(
+ namespace=namespace,
+ name='SHOW_EMPTY_SMART_LINKS',
+ global_name='LINKING_SHOW_EMPTY_SMART_LINKS',
+ default=True,
+ description=_(u'Show smart link that don\'t return any documents.')
)
diff --git a/apps/mailer/conf/settings.py b/apps/mailer/conf/settings.py
index 257f2d057d..ced2a33daf 100644
--- a/apps/mailer/conf/settings.py
+++ b/apps/mailer/conf/settings.py
@@ -2,17 +2,38 @@
from django.utils.translation import ugettext_lazy as _
-from smart_settings.api import register_settings
+from smart_settings.api import Setting, SettingNamespace
-register_settings(
- namespace=u'mailer',
- module=u'mailer.conf.settings',
- settings=[
- # Links
- {'name': u'LINK_SUBJECT_TEMPLATE', 'global_name': u'MAILER_LINK_SUBJECT_TEMPLATE', 'default': 'Link for document: {{ document }}', 'description': _(u'Template for the document link email form subject line.')},
- {'name': u'LINK_BODY_TEMPLATE', 'global_name': u'MAILER_LINK_BODY_TEMPLATE', 'default': 'To access this document click on the following link: {{ link }}
\n\n--------
\nThis email has been sent from Mayan EDMS (http://www.mayan-edms.com)', 'description': _(u'Template for the document link email form body line.')},
- # Attachment
- {'name': u'DOCUMENT_SUBJECT_TEMPLATE', 'global_name': u'MAILER_DOCUMENT_SUBJECT_TEMPLATE', 'default': 'Document: {{ document }}', 'description': _(u'Template for the document email form subject line.')},
- {'name': u'DOCUMENT_BODY_TEMPLATE', 'global_name': u'MAILER_DOCUMENT_BODY_TEMPLATE', 'default': 'Attached to this email is the document: {{ document }}
\n\n--------
\nThis email has been sent from Mayan EDMS (http://www.mayan-edms.com)', 'description': _(u'Template for the document email form body line.')},
- ]
+mailer_namespace = SettingNamespace('mailer', _(u'Mailer'), module='mailer.conf.settings')
+
+Setting(
+ namespace=mailer_namespace,
+ name='LINK_SUBJECT_TEMPLATE',
+ global_name='MAILER_LINK_SUBJECT_TEMPLATE',
+ default=_(u'Link for document: {{ document }}'),
+ description=_(u'Template for the document link email form subject line.')
+)
+
+Setting(
+ namespace=mailer_namespace,
+ name='LINK_BODY_TEMPLATE',
+ global_name='MAILER_LINK_BODY_TEMPLATE',
+ default=_(u'To access this document click on the following link: {{ link }}
\n\n--------
\nThis email has been sent from Mayan EDMS (http://www.mayan-edms.com)'),
+ description=_(u'Template for the document link email form body line.')
+)
+
+Setting(
+ namespace=mailer_namespace,
+ name='DOCUMENT_SUBJECT_TEMPLATE',
+ global_name='MAILER_DOCUMENT_SUBJECT_TEMPLATE',
+ default=_(u'Document: {{ document }}'),
+ description=_(u'Template for the document email form subject line.')
+)
+
+Setting(
+ namespace=mailer_namespace,
+ name='DOCUMENT_BODY_TEMPLATE',
+ global_name='MAILER_DOCUMENT_BODY_TEMPLATE',
+ default=_(u'Attached to this email is the document: {{ document }}
\n\n--------
\nThis email has been sent from Mayan EDMS (http://www.mayan-edms.com)'),
+ description=_(u'Template for the document email form body line.')
)
diff --git a/apps/main/api.py b/apps/main/api.py
index 8e3ae1f7a6..f8a48ce78e 100644
--- a/apps/main/api.py
+++ b/apps/main/api.py
@@ -1,9 +1,7 @@
-from django.core.urlresolvers import reverse
-from django.utils.functional import lazy
+from common.utils import reverse_lazy
diagnostics = {}
tools = {}
-reverse_lazy = lazy(reverse, str)
def register_diagnostic(namespace, title, link):
diff --git a/apps/main/conf/settings.py b/apps/main/conf/settings.py
index 7a82555ea0..0fb71dbc58 100644
--- a/apps/main/conf/settings.py
+++ b/apps/main/conf/settings.py
@@ -1,28 +1,27 @@
"""Configuration options for the main app"""
from django.utils.translation import ugettext_lazy as _
-from smart_settings.api import register_setting
+from smart_settings.api import Setting, SettingNamespace
-register_setting(
- namespace=u'main',
- module=u'main.conf.settings',
+namespace = SettingNamespace('main', _(u'Main'), module='main.conf.settings')
+
+Setting(
+ namespace=namespace,
name=u'SIDE_BAR_SEARCH',
global_name=u'MAIN_SIDE_BAR_SEARCH',
default=False,
description=_(u'Controls whether the search functionality is provided by a sidebar widget or by a menu entry.')
)
-register_setting(
- namespace=u'main',
- module=u'main.conf.settings',
+Setting(
+ namespace=namespace,
name=u'DISABLE_HOME_VIEW',
global_name=u'MAIN_DISABLE_HOME_VIEW',
default=False,
)
-register_setting(
- namespace=u'main',
- module=u'main.conf.settings',
+Setting(
+ namespace=namespace,
name=u'DISABLE_ICONS',
global_name=u'MAIN_DISABLE_ICONS',
default=False,
diff --git a/apps/metadata/conf/settings.py b/apps/metadata/conf/settings.py
index 359e079ed5..c3fda0bf84 100644
--- a/apps/metadata/conf/settings.py
+++ b/apps/metadata/conf/settings.py
@@ -3,9 +3,9 @@
import datetime
from django.contrib.auth.models import User
+from django.utils.translation import ugettext_lazy as _
-from smart_settings.api import register_settings
-
+from smart_settings.api import Setting, SettingNamespace
default_available_functions = {
'current_date': datetime.datetime.now().date,
@@ -15,12 +15,18 @@ default_available_models = {
'User': User
}
-register_settings(
- namespace=u'metadata',
- module=u'metadata.conf.settings',
- settings=[
- # Definition
- {'name': u'AVAILABLE_FUNCTIONS', 'global_name': u'METADATA_AVAILABLE_FUNCTIONS', 'default': default_available_functions},
- {'name': u'AVAILABLE_MODELS', 'global_name': u'METADATA_AVAILABLE_MODELS', 'default': default_available_models},
- ]
+namespace = SettingNamespace('metadata', _(u'Metadata'), module='metadata.conf.settings')
+
+Setting(
+ namespace=namespace,
+ name=u'AVAILABLE_FUNCTIONS',
+ global_name=u'METADATA_AVAILABLE_FUNCTIONS',
+ default=default_available_functions,
+)
+
+Setting(
+ namespace=namespace,
+ name=u'AVAILABLE_MODELS',
+ global_name=u'METADATA_AVAILABLE_MODELS',
+ default=default_available_models,
)
diff --git a/apps/ocr/conf/settings.py b/apps/ocr/conf/settings.py
index 31e2c908b8..67fad8653e 100644
--- a/apps/ocr/conf/settings.py
+++ b/apps/ocr/conf/settings.py
@@ -2,18 +2,62 @@
from django.utils.translation import ugettext_lazy as _
-from smart_settings.api import register_settings
+from smart_settings.api import Setting, SettingNamespace
-register_settings(
- namespace=u'ocr',
- module=u'ocr.conf.settings',
- settings=[
- {'name': u'TESSERACT_PATH', 'global_name': u'OCR_TESSERACT_PATH', 'default': u'/usr/bin/tesseract', 'exists': True},
- {'name': u'TESSERACT_LANGUAGE', 'global_name': u'OCR_TESSERACT_LANGUAGE', 'default': u'eng'},
- {'name': u'REPLICATION_DELAY', 'global_name': u'OCR_REPLICATION_DELAY', 'default': 0, 'description': _(u'Amount of seconds to delay OCR of documents to allow for the node\'s storage replication overhead.')},
- {'name': u'NODE_CONCURRENT_EXECUTION', 'global_name': u'OCR_NODE_CONCURRENT_EXECUTION', 'default': 1, 'description': _(u'Maximum amount of concurrent document OCRs a node can perform.')},
- {'name': u'AUTOMATIC_OCR', 'global_name': u'OCR_AUTOMATIC_OCR', 'default': False, 'description': _(u'Automatically queue newly created documents for OCR.')},
- {'name': u'QUEUE_PROCESSING_INTERVAL', 'global_name': u'OCR_QUEUE_PROCESSING_INTERVAL', 'default': 10},
- {'name': u'UNPAPER_PATH', 'global_name': u'OCR_UNPAPER_PATH', 'default': u'/usr/bin/unpaper', 'description': _(u'File path to unpaper program.'), 'exists': True},
- ]
+namespace = SettingNamespace('ocr', _(u'OCR'), module='ocr.conf.settings')
+
+Setting(
+ namespace=namespace,
+ name='TESSERACT_PATH',
+ global_name='OCR_TESSERACT_PATH',
+ default=u'/usr/bin/tesseract',
+ exists=True,
+)
+
+Setting(
+ namespace=namespace,
+ name='TESSERACT_LANGUAGE',
+ global_name='OCR_TESSERACT_LANGUAGE',
+ default=u'eng',
+)
+
+Setting(
+ namespace=namespace,
+ name='REPLICATION_DELAY',
+ global_name='OCR_REPLICATION_DELAY',
+ default=0,
+ description=_(u'Amount of seconds to delay OCR of documents to allow for the node\'s storage replication overhead.'),
+)
+
+Setting(
+ namespace=namespace,
+ name='NODE_CONCURRENT_EXECUTION',
+ global_name='OCR_NODE_CONCURRENT_EXECUTION',
+ default=1,
+ description=_(u'Maximum amount of concurrent document OCRs a node can perform.')
+)
+
+Setting(
+ namespace=namespace,
+ name='AUTOMATIC_OCR',
+ global_name='OCR_AUTOMATIC_OCR',
+ default=False,
+ description=_(u'Automatically queue newly created documents for OCR.')
+)
+
+Setting(
+ namespace=namespace,
+ name='QUEUE_PROCESSING_INTERVAL',
+ global_name='OCR_QUEUE_PROCESSING_INTERVAL',
+ default=10,
+ description=_(u'Automatically queue newly created documents for OCR.')
+)
+
+Setting(
+ namespace=namespace,
+ name='UNPAPER_PATH',
+ global_name='OCR_UNPAPER_PATH',
+ default=u'/usr/bin/unpaper',
+ description=_(u'File path to unpaper program.'),
+ exists=True
)
diff --git a/apps/permissions/conf/settings.py b/apps/permissions/conf/settings.py
index 6132219834..07b308b380 100644
--- a/apps/permissions/conf/settings.py
+++ b/apps/permissions/conf/settings.py
@@ -1,12 +1,14 @@
"""Configuration options for the permissions app"""
from django.utils.translation import ugettext_lazy as _
-from smart_settings.api import register_settings
+from smart_settings.api import Setting, SettingNamespace
-register_settings(
- namespace=u'permissions',
- module=u'permissions.conf.settings',
- settings=[
- {'name': u'DEFAULT_ROLES', 'global_name': u'ROLES_DEFAULT_ROLES', 'default': [], 'description': _('A list of existing roles that are automatically assigned to newly created users')},
- ]
+namespace = SettingNamespace('permissions', _(u'Permissions'), module='permissions.conf.settings')
+
+Setting(
+ namespace=namespace,
+ name='DEFAULT_ROLES',
+ global_name='ROLES_DEFAULT_ROLES',
+ default=[],
+ description=_(u'A list of existing roles that are automatically assigned to newly created users')
)
diff --git a/apps/smart_settings/api.py b/apps/smart_settings/api.py
index 51ff694320..154ad6d5a2 100644
--- a/apps/smart_settings/api.py
+++ b/apps/smart_settings/api.py
@@ -1,48 +1,56 @@
+from __future__ import absolute_import
+
from django.conf import settings as django_settings
from django.utils.importlib import import_module
+from django.utils.translation import ugettext_lazy as _
+from navigation.api import register_links
+
settings = {}
+settings_list = []
+namespace_list = []
-def register_setting(namespace, module, name, global_name, default, exists=False, description=u'', hidden=False):
- # Create namespace if it doesn't exists
- settings.setdefault(namespace, [])
-
- # If passed a string and not a module, import it
- if isinstance(module, basestring):
- module = import_module(module)
-
- setting = {
- 'module': module,
- 'name': name,
- 'global_name': global_name,
- 'exists': exists,
- 'description': description,
- 'default': default,
- 'hidden': hidden,
- }
-
- # Avoid multiple appends
- if setting not in settings[namespace]:
- settings[namespace].append(setting)
-
- # Get the global value
- value = getattr(django_settings, global_name, default)
-
- # Create the local entity
- setattr(module, name, value)
- return value
+def is_superuser(context):
+ return context['request'].user.is_staff or context['request'].user.is_superuser
-def register_settings(namespace, module, settings):
- for setting in settings:
- register_setting(
- namespace,
- module,
- setting['name'],
- setting['global_name'],
- setting['default'],
- setting.get('exists', False),
- setting.get('description', u''),
- setting.get('hidden', False),
- )
+class SettingNamespace(object):
+ def __init__(self, name, label, module):
+ self.name = name
+ self.label = label
+ self.module = module
+ link = {'text': 'LINK', 'view': 'settings_list', 'args': name, 'famfam': 'pencil_add'}#, 'permissions': [PERMISSION_SIGNATURE_UPLOAD], 'conditional_disable': has_embedded_signature}
+ register_links(['about_view'], [link], menu_name='sidebar')
+
+ namespace_list.append(self)
+
+ def __unicode__(self):
+ return unicode(self.label)
+
+ def settings(self):
+ return [setting for setting in settings_list if setting.namespace == self]
+
+
+class Setting(object):
+ def __init__(self, namespace, name, global_name, default, description=u'', hidden=False, exists=False):
+ self.namespace = namespace
+ self.name = name
+ self.global_name = global_name
+ self.default = default
+ self.description = description
+ self.hidden = hidden
+ self.exists = exists
+
+ # Get the global value
+ value = getattr(django_settings, global_name, default)
+
+ # Create the local entity
+ try:
+ self.module = namespace.module
+ setattr(self.module, name, value)
+ except AttributeError:
+ self.module = import_module(namespace.module)
+ setattr(self.module, name, value)
+
+ settings_list.append(self)
diff --git a/apps/smart_settings/views.py b/apps/smart_settings/views.py
index a08872d053..cb4d7f4912 100644
--- a/apps/smart_settings/views.py
+++ b/apps/smart_settings/views.py
@@ -8,36 +8,32 @@ from django.utils.safestring import mark_safe
from common.utils import return_type, encapsulate
from common.widgets import exists_with_famfam
-from .api import settings
+from .api import settings, settings_list, namespace_list
def setting_list(request):
- new_settings = []
- for namespace, sub_settings in settings.items():
- for sub_setting in sub_settings:
- if not sub_setting.get('hidden', False):
- new_settings.append({
- 'module': sub_setting['module'],
- 'name': sub_setting['name'],
- 'global_name': sub_setting['global_name'],
- 'description': sub_setting.get('description', None),
- 'exists': sub_setting.get('exists', False),
- 'default': sub_setting['default'],
- })
context = {
'title': _(u'settings'),
- 'object_list': new_settings,
+ 'object_list': [setting for setting in settings_list if setting.hidden==False],
'hide_link': True,
'hide_object': True,
'extra_columns': [
- {'name': _(u'name'), 'attribute': encapsulate(lambda x: mark_safe(u'%s
%s' % (x.get('global_name'), x.get('description'))))},
- {'name': _(u'default'), 'attribute': encapsulate(lambda x: return_type(x['default']))},
+ {'name': _(u'name'), 'attribute': encapsulate(lambda x: mark_safe(u'%s
%s' % (x.global_name, x.description)))},
+ {'name': _(u'default'), 'attribute': encapsulate(lambda x: return_type(x.default))},
{'name': _(u'value'), 'attribute': encapsulate(lambda x: mark_safe(u'