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'
%s %s
' % ( - return_type(getattr(x['module'], x['name'])), - exists_with_famfam(getattr(x['module'], x['name'])) if x['exists'] else '' + return_type(getattr(x.module, x.name)), + exists_with_famfam(getattr(x.module, x.name)) if x.exists else '' ))) }, - ] + ], + #'temporary_navigation_links': { + # 'sidebar': { + # 'links': links, + # 'upload_interactive': { + # 'links': links + # } + # } + #}, } return render_to_response('generic_list.html', context, diff --git a/apps/storage/conf/settings.py b/apps/storage/conf/settings.py index a410692e9e..2e65534236 100644 --- a/apps/storage/conf/settings.py +++ b/apps/storage/conf/settings.py @@ -4,15 +4,35 @@ 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'storage', - module=u'storage.conf.settings', - settings=[ - {'name': u'GRIDFS_HOST', 'global_name': u'STORAGE_GRIDFS_HOST', 'default': u'localhost'}, - {'name': u'GRIDFS_PORT', 'global_name': u'STORAGE_GRIDFS_PORT', 'default': 27017}, - {'name': u'GRIDFS_DATABASE_NAME', 'global_name': u'STORAGE_GRIDFS_DATABASE_NAME', 'default': u'document_storage'}, - {'name': u'FILESTORAGE_LOCATION', 'global_name': u'STORAGE_FILESTORAGE_LOCATION', 'default': os.path.join(settings.PROJECT_ROOT, u'document_storage'), 'exists': True}, - ] +namespace = SettingNamespace('storage', _(u'Storage'), module='storage.conf.settings') + +Setting( + namespace=namespace, + name='GRIDFS_HOST', + global_name='STORAGE_GRIDFS_HOST', + default=u'localhost', +) + +Setting( + namespace=namespace, + name='GRIDFS_PORT', + global_name='STORAGE_GRIDFS_PORT', + default=27017, +) + +Setting( + namespace=namespace, + name='GRIDFS_DATABASE_NAME', + global_name='STORAGE_GRIDFS_DATABASE_NAME', + default='document_storage', +) + +Setting( + namespace=namespace, + name='FILESTORAGE_LOCATION', + global_name='STORAGE_FILESTORAGE_LOCATION', + default=os.path.join(settings.PROJECT_ROOT, u'document_storage'), + exists=True ) diff --git a/apps/web_theme/conf/settings.py b/apps/web_theme/conf/settings.py index 405b2814fc..8d5e3922e6 100644 --- a/apps/web_theme/conf/settings.py +++ b/apps/web_theme/conf/settings.py @@ -1,14 +1,30 @@ """Configuration options for the web_theme 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'web_theme', - module=u'web_theme.conf.settings', - settings=[ - {'name': u'THEME', 'global_name': u'WEB_THEME_THEME', 'default': u'activo', 'description': _(u'CSS theme to apply, options are: amro, bec, bec-green, blue, default, djime-cerulean, drastic-dark, kathleene, olive, orange, red, reidb-greenish and warehouse.')}, - {'name': u'ENABLE_SCROLL_JS', 'global_name': u'WEB_THEME_ENABLE_SCROLL_JS', 'default': True, 'hidden': True}, - {'name': u'VERBOSE_LOGIN', 'global_name': u'WEB_THEME_VERBOSE_LOGIN', 'default': True, 'description': _(u'Display extra information in the login screen.')}, - ] +namespace = SettingNamespace('web_theme', _(u'Interface'), module='web_theme.conf.settings') + +Setting( + namespace=namespace, + name='THEME', + global_name='WEB_THEME_THEME', + default=u'activo', + description=_(u'CSS theme to apply, options are: amro, bec, bec-green, blue, default, djime-cerulean, drastic-dark, kathleene, olive, orange, red, reidb-greenish and warehouse.') +) + +Setting( + namespace=namespace, + name='ENABLE_SCROLL_JS', + global_name='WEB_THEME_ENABLE_SCROLL_JS', + default=True, + hidden=True +) + +Setting( + namespace=namespace, + name='VERBOSE_LOGIN', + global_name='WEB_THEME_VERBOSE_LOGIN', + default=True, + description=_(u'Display extra information in the login screen.') )