diff --git a/apps/common/conf/settings.py b/apps/common/conf/settings.py index 2ebac90201..d97cad6b06 100644 --- a/apps/common/conf/settings.py +++ b/apps/common/conf/settings.py @@ -1,14 +1,33 @@ -from django.conf import settings +"""Configuration options for the common app""" + from django.utils.translation import ugettext_lazy as _ +from main.api import register_setting + from common.literals import PAGE_SIZE_LETTER, PAGE_ORIENTATION_PORTRAIT -TEMPORARY_DIRECTORY = getattr(settings, 'COMMON_TEMPORARY_DIRECTORY', u'/tmp') +TEMPORARY_DIRECTORY = register_setting( + namespace=u'common', + module=u'common.conf.settings', + name=u'TEMPORARY_DIRECTORY', + global_name=u'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()'), + exists=True +) -setting_description = { - 'COMMON_TEMPORARY_DIRECTORY': _(u'Temporary directory used site wide to store thumbnails, previews and temporary files. If none is specified, one will be created using tempfile.mkdtemp()') -} +DEFAULT_PAPER_SIZE = register_setting( + namespace=u'common', + module=u'common.conf.settings', + name=u'DEFAULT_PAPER_SIZE', + global_name=u'COMMON_DEFAULT_PAPER_SIZE', + default=PAGE_SIZE_LETTER, +) -# Printing -DEFAULT_PAPER_SIZE = getattr(settings, 'COMMON_DEFAULT_PAPER_SIZE', PAGE_SIZE_LETTER) -DEFAULT_PAGE_ORIENTATION = getattr(settings, 'COMMON_DEFAULT_PAGE_ORIENTATION', PAGE_ORIENTATION_PORTRAIT) +DEFAULT_PAGE_ORIENTATION = register_setting( + namespace=u'common', + module=u'common.conf.settings', + name=u'DEFAULT_PAGE_ORIENTATION', + global_name=u'COMMON_DEFAULT_PAGE_ORIENTATION', + default=PAGE_ORIENTATION_PORTRAIT, +) diff --git a/apps/converter/conf/settings.py b/apps/converter/conf/settings.py index 7b23e72243..bdfe8a9b31 100644 --- a/apps/converter/conf/settings.py +++ b/apps/converter/conf/settings.py @@ -1,26 +1,23 @@ -from django.conf import settings +"""Configuration options for the converter app""" from django.utils.translation import ugettext_lazy as _ +from main.api import register_settings -IM_CONVERT_PATH = getattr(settings, 'CONVERTER_IM_ONVERT_PATH', u'/usr/bin/convert') -IM_IDENTIFY_PATH = getattr(settings, 'CONVERTER_IM_IDENTIFY_PATH', u'/usr/bin/identify') -UNPAPER_PATH = getattr(settings, 'CONVERTER_UNPAPER_PATH', u'/usr/bin/unpaper') -GM_PATH = getattr(settings, 'CONVERTER_GM_PATH', u'/usr/bin/gm') -GM_SETTINGS = getattr(settings, 'CONVERTER_GM_SETTINGS', u'') -GRAPHICS_BACKEND = getattr(settings, 'CONVERTER_GRAPHICS_BACKEND', u'converter.backends.imagemagick') -UNOCONV_PATH = getattr(settings, 'CONVERTER_UNOCONV_PATH', u'/usr/bin/unoconv') - -OCR_OPTIONS = getattr(settings, 'CONVERTER_OCR_OPTIONS', u'-colorspace Gray -depth 8 -resample 200x200') -DEFAULT_OPTIONS = getattr(settings, 'CONVERTER_DEFAULT_OPTIONS', u'') -LOW_QUALITY_OPTIONS = getattr(settings, 'CONVERTER_LOW_QUALITY_OPTIONS', u'') -HIGH_QUALITY_OPTIONS = getattr(settings, 'CONVERTER_HIGH_QUALITY_OPTIONS', u'-density 400') -PRINT_QUALITY_OPTIONS = getattr(settings, 'CONVERTER_HIGH_QUALITY_OPTIONS', u'-density 500') - - -setting_description = { - 'CONVERTER_IM_CONVERT_PATH': _(u'File path to imagemagick\'s convert program.'), - 'CONVERTER_IM_IDENTIFY_PATH': _(u'File path to imagemagick\'s identify program.'), - 'CONVERTER_GM_PATH': _(u'File path to graphicsmagick\'s program.'), - 'CONVERTER_UNPAPER_PATH': _(u'File path to unpaper program.'), - 'CONVERTER_GRAPHICS_BACKEND': _(u'Graphics conversion backend to use. Options are: converter.backends.imagemagick and converter.backends.graphicsmagick.'), -} +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'UNPAPER_PATH', 'global_name': u'CONVERTER_UNPAPER_PATH', 'default': u'/usr/bin/unpaper', 'description': _(u'File path to unpaper 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.imagemagick', 'description': _(u'Graphics conversion backend to use. Options are: converter.backends.imagemagick and converter.backends.graphicsmagick.')}, + {'name': u'UNOCONV_PATH', 'global_name': u'CONVERTER_UNOCONV_PATH', 'default': u'/usr/bin/unoconv', 'exists': True}, + {'name': u'OCR_OPTIONS', 'global_name': u'CONVERTER_OCR_OPTIONS', 'default': u'-colorspace Gray -depth 8 -resample 200x200'}, + {'name': u'DEFAULT_OPTIONS', 'global_name': u'CONVERTER_DEFAULT_OPTIONS', 'default': u''}, + {'name': u'LOW_QUALITY_OPTIONS', 'global_name': u'CONVERTER_LOW_QUALITY_OPTIONS', 'default': u''}, + {'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_HIGH_QUALITY_OPTIONS', 'default': u'-density 500'}, + ] +) diff --git a/apps/documents/conf/settings.py b/apps/documents/conf/settings.py index 6ea4c16070..50dbd06ccc 100644 --- a/apps/documents/conf/settings.py +++ b/apps/documents/conf/settings.py @@ -1,14 +1,15 @@ +"""Configuration options for the documents app""" + import datetime import hashlib import uuid -from django.conf import settings -from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ +from django.contrib.auth.models import User from common.utils import proper_name - from storage.backends.filebasedstorage import FileBasedStorage +from main.api import register_settings def default_checksum(x): @@ -36,45 +37,42 @@ available_indexing_functions = { 'proper_name': proper_name } -# Definition -AVAILABLE_FUNCTIONS = getattr(settings, 'DOCUMENTS_METADATA_AVAILABLE_FUNCTIONS', default_available_functions) -AVAILABLE_MODELS = getattr(settings, 'DOCUMENTS_METADATA_AVAILABLE_MODELS', default_available_models) -AVAILABLE_INDEXING_FUNCTIONS = getattr(settings, 'DOCUMENTS_INDEXING_AVAILABLE_FUNCTIONS', available_indexing_functions) - -# Upload -USE_STAGING_DIRECTORY = getattr(settings, 'DOCUMENTS_USE_STAGING_DIRECTORY', False) -STAGING_DIRECTORY = getattr(settings, 'DOCUMENTS_STAGING_DIRECTORY', u'/tmp/mayan/staging') -DELETE_STAGING_FILE_AFTER_UPLOAD = getattr(settings, 'DOCUMENTS_DELETE_STAGING_FILE_AFTER_UPLOAD', False) -STAGING_FILES_PREVIEW_SIZE = getattr(settings, 'DOCUMENTS_STAGING_FILES_PREVIEW_SIZE', '640x480') -ENABLE_SINGLE_DOCUMENT_UPLOAD = getattr(settings, 'DOCUMENTS_ENABLE_SINGLE_DOCUMENT_UPLOAD', True) -UNCOMPRESS_COMPRESSED_LOCAL_FILES = getattr(settings, 'DOCUMENTS_UNCOMPRESS_COMPRESSED_LOCAL_FILES', True) -UNCOMPRESS_COMPRESSED_STAGING_FILES = getattr(settings, 'DOCUMENTS_UNCOMPRESS_COMPRESSED_STAGING_FILES', True) - -# Saving -CHECKSUM_FUNCTION = getattr(settings, 'DOCUMENTS_CHECKSUM_FUNCTION', default_checksum) -UUID_FUNCTION = getattr(settings, 'DOCUMENTS_UUID_FUNCTION', default_uuid) - -# Storage -STORAGE_BACKEND = getattr(settings, 'DOCUMENTS_STORAGE_BACKEND', FileBasedStorage) - -# Usage -PREVIEW_SIZE = getattr(settings, 'DOCUMENTS_PREVIEW_SIZE', '640x480') -PRINT_SIZE = getattr(settings, 'DOCUMENTS_PREVIEW_SIZE', '1400') -MULTIPAGE_PREVIEW_SIZE = getattr(settings, 'DOCUMENTS_MULTIPAGE_PREVIEW_SIZE', '160x120') -THUMBNAIL_SIZE = getattr(settings, 'DOCUMENTS_THUMBNAIL_SIZE', '50x50') -DISPLAY_SIZE = getattr(settings, 'DOCUMENTS_DISPLAY_SIZE', '1200') -RECENT_COUNT = getattr(settings, 'DOCUMENTS_RECENT_COUNT', 40) -ZOOM_PERCENT_STEP = getattr(settings, 'DOCUMENTS_ZOOM_PERCENT_STEP', 50) -ZOOM_MAX_LEVEL = getattr(settings, 'DOCUMENTS_ZOOM_MAX_LEVEL', 200) -ZOOM_MIN_LEVEL = getattr(settings, 'DOCUMENTS_ZOOM_MIN_LEVEL', 50) -ROTATION_STEP = getattr(settings, 'DOCUMENTS_ROTATION_STEP', 90) - -# Transformations -AVAILABLE_TRANSFORMATIONS = getattr(settings, 'DOCUMENTS_AVAILABLE_TRANSFORMATIONS', available_transformations) -DEFAULT_TRANSFORMATIONS = getattr(settings, 'DOCUMENTS_DEFAULT_TRANSFORMATIONS', []) - -#Groups -GROUP_SHOW_EMPTY = getattr(settings, 'DOCUMENTS_GROUP_SHOW_EMPTY', True) - -setting_description = { -} +register_settings( + namespace=u'documents', + module=u'documents.conf.settings', + settings=[ + # Definition + {'name': u'AVAILABLE_FUNCTIONS', 'global_name': u'DOCUMENTS_METADATA_AVAILABLE_FUNCTIONS', 'default': default_available_functions}, + {'name': u'AVAILABLE_MODELS', 'global_name': u'DOCUMENTS_METADATA_AVAILABLE_MODELS', 'default': default_available_models}, + {'name': u'AVAILABLE_INDEXING_FUNCTIONS', 'global_name': u'DOCUMENTS_INDEXING_AVAILABLE_FUNCTIONS', 'default': available_indexing_functions}, + # Upload + {'name': u'USE_STAGING_DIRECTORY', 'global_name': u'DOCUMENTS_USE_STAGING_DIRECTORY', 'default': False}, + {'name': u'STAGING_DIRECTORY', 'global_name': u'DOCUMENTS_STAGING_DIRECTORY', 'default': u'/tmp/mayan/staging', 'exists': True}, + {'name': u'DELETE_STAGING_FILE_AFTER_UPLOAD', 'global_name': u'DOCUMENTS_DELETE_STAGING_FILE_AFTER_UPLOAD', 'default': False}, + {'name': u'STAGING_FILES_PREVIEW_SIZE', 'global_name': u'DOCUMENTS_STAGING_FILES_PREVIEW_SIZE', 'default': u'640x480'}, + {'name': u'ENABLE_SINGLE_DOCUMENT_UPLOAD', 'global_name': u'DOCUMENTS_ENABLE_SINGLE_DOCUMENT_UPLOAD', 'default': True}, + {'name': u'UNCOMPRESS_COMPRESSED_LOCAL_FILES', 'global_name': u'DOCUMENTS_UNCOMPRESS_COMPRESSED_LOCAL_FILES', 'default': True}, + {'name': u'UNCOMPRESS_COMPRESSED_STAGING_FILES', 'global_name': u'DOCUMENTS_UNCOMPRESS_COMPRESSED_STAGING_FILES', 'default': True}, + # 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}, + # Transformations + {'name': u'AVAILABLE_TRANSFORMATIONS', 'global_name': u'DOCUMENTS_AVAILABLE_TRANSFORMATIONS', 'default': available_transformations}, + {'name': u'DEFAULT_TRANSFORMATIONS', 'global_name': u'DOCUMENTS_DEFAULT_TRANSFORMATIONS', 'default': []}, + # 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.')}, + #Groups + {'name': u'GROUP_SHOW_EMPTY', 'global_name': u'DOCUMENTS_GROUP_SHOW_EMPTY', 'default': True}, + ] +) diff --git a/apps/dynamic_search/conf/settings.py b/apps/dynamic_search/conf/settings.py index abaa481659..d710be81d6 100644 --- a/apps/dynamic_search/conf/settings.py +++ b/apps/dynamic_search/conf/settings.py @@ -1,4 +1,15 @@ -from django.conf import settings +"""Configuration options for the dynamic_search app""" + +from django.utils.translation import ugettext_lazy as _ + +from main.api import register_settings + +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.')}, + ] +) -SHOW_OBJECT_TYPE = getattr(settings, 'SEARCH_SHOW_OBJECT_TYPE', True) -LIMIT = getattr(settings, 'SEARCH_LIMIT', 100) diff --git a/apps/dynamic_search/views.py b/apps/dynamic_search/views.py index 11896180d2..b7b935a29f 100644 --- a/apps/dynamic_search/views.py +++ b/apps/dynamic_search/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render_to_response from django.template import RequestContext -from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy as _ from django.contrib import messages from django.conf import settings diff --git a/apps/filesystem_serving/conf/settings.py b/apps/filesystem_serving/conf/settings.py index 2e9e3c340c..91bee7fece 100644 --- a/apps/filesystem_serving/conf/settings.py +++ b/apps/filesystem_serving/conf/settings.py @@ -1,11 +1,15 @@ -'''Configuration options for the filesystem_serving app -''' +"""Configuration options for the filesystem_serving app""" -from django.conf import settings +from main.api import register_settings +register_settings( + namespace=u'filesystem_serving', + module=u'filesystem_serving.conf.settings', + settings=[ + {'name': u'SLUGIFY_PATHS', 'global_name': u'FILESYSTEM_SLUGIFY_PATHS', 'default': False}, + {'name': u'MAX_RENAME_COUNT', 'global_name': u'FILESYSTEM_MAX_RENAME_COUNT', 'default': 200}, + {'name': u'FILESERVING_PATH', 'global_name': u'FILESYSTEM_FILESERVING_PATH', 'default': u'/tmp/mayan/documents', 'exists': True}, + {'name': u'FILESERVING_ENABLE', 'global_name': u'FILESYSTEM_FILESERVING_ENABLE', 'default': True} + ] +) -# Serving -FILESERVING_ENABLE = getattr(settings, 'FILESYSTEM_FILESERVING_ENABLE', True) -FILESERVING_PATH = getattr(settings, 'FILESYSTEM_FILESERVING_PATH', u'/tmp/mayan/documents') -SLUGIFY_PATHS = getattr(settings, 'FILESYSTEM_SLUGIFY_PATHS', False) -MAX_RENAME_COUNT = getattr(settings, 'FILESYSTEM_MAX_RENAME_COUNT', 200) diff --git a/apps/main/__init__.py b/apps/main/__init__.py index ffec7d64b1..dd2c85ca39 100644 --- a/apps/main/__init__.py +++ b/apps/main/__init__.py @@ -5,6 +5,8 @@ from permissions import role_list from user_management import user_list from main.conf.settings import SIDE_BAR_SEARCH +from main.conf import settings as main_settings +from main.api import register_setting def is_superuser(context): @@ -58,3 +60,6 @@ def get_version(): return ''.join(vers) __version__ = get_version() + + +#register_setting(u'main', main_settings, u'SIDE_BAR_SEARCH', u'MAIN_SIDE_BAR_SEARCH') diff --git a/apps/main/api.py b/apps/main/api.py index 81678000e5..9fd56a64d0 100644 --- a/apps/main/api.py +++ b/apps/main/api.py @@ -1,9 +1,12 @@ from django.core.urlresolvers import reverse from django.utils.functional import lazy +from django.conf import settings as django_settings +from django.utils.importlib import import_module diagnostics = {} tools = {} reverse_lazy = lazy(reverse, str) +settings = {} def register_diagnostic(namespace, title, link): @@ -20,3 +23,47 @@ def register_tool(link, title=None, namespace=None): link['url'] = link.get('url', reverse_lazy(link['view'])) namespace_dict['links'].append(link) tools[namespace] = namespace_dict + + +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 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), + ) diff --git a/apps/main/conf/settings.py b/apps/main/conf/settings.py index 8a7cf11bfd..1285a1cb56 100644 --- a/apps/main/conf/settings.py +++ b/apps/main/conf/settings.py @@ -1,12 +1,13 @@ -'''Configuration options for the main app -''' +"""Configuration options for the main app""" -from django.conf import settings from django.utils.translation import ugettext_lazy as _ +from main.api import register_setting -SIDE_BAR_SEARCH = getattr(settings, 'MAIN_SIDE_BAR_SEARCH', False) - -setting_description = { - 'MAIN_SIDE_BAR_SEARCH': _(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', + 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.') +) diff --git a/apps/main/views.py b/apps/main/views.py index f2ff510bb7..9d342456dd 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -4,18 +4,18 @@ from django.utils.translation import ugettext_lazy as _ from django.core.exceptions import PermissionDenied from common.utils import exists_with_famfam, return_type -from common.conf import settings as common_settings -from documents.conf import settings as documents_settings -from documents.statistics import get_statistics as documents_statistics -from converter.conf import settings as converter_settings -from ocr.conf import settings as ocr_settings -from ocr.statistics import get_statistics as ocr_statistics -from filesystem_serving.conf import settings as filesystem_serving_settings -from dynamic_search.conf import settings as search_settings +#from common.conf import settings as common_settings +#from documents.conf import settings as documents_settings +#from documents.statistics import get_statistics as documents_statistics +#from converter.conf import settings as converter_settings +#from ocr.conf import settings as ocr_settings +#from ocr.statistics import get_statistics as ocr_statistics +#from filesystem_serving.conf import settings as filesystem_serving_settings +#from dynamic_search.conf import settings as search_settings from permissions.api import check_permissions from main.conf import settings as main_settings -from main.api import diagnostics, tools +from main.api import diagnostics, tools, settings def home(request): @@ -24,11 +24,9 @@ def home(request): def check_settings(request): + """ settings = [ - {'name': 'MAIN_SIDE_BAR_SEARCH', - 'value': main_settings.SIDE_BAR_SEARCH, - 'description': main_settings.setting_description}, - + {'name': 'DOCUMENTS_METADATA_AVAILABLE_FUNCTIONS', 'value': documents_settings.AVAILABLE_FUNCTIONS}, {'name': 'DOCUMENTS_METADATA_AVAILABLE_MODELS', 'value': documents_settings.AVAILABLE_MODELS}, {'name': 'DOCUMENTS_INDEXING_AVAILABLE_INDEXING_FUNCTIONS', 'value': documents_settings.AVAILABLE_INDEXING_FUNCTIONS}, @@ -106,17 +104,30 @@ def check_settings(request): # Search {'name': 'SEARCH_LIMIT', 'value': search_settings.LIMIT}, ] - + """ + 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': settings, + 'object_list': new_settings, 'hide_link': True, 'hide_object': True, 'extra_columns': [ - {'name': _(u'name'), 'attribute': 'name'}, - {'name': _(u'value'), 'attribute': lambda x: return_type(x['value'])}, - {'name': _(u'description'), 'attribute': lambda x: x.get('description', {}).get(x['name'], '')}, - {'name': _(u'exists'), 'attribute': lambda x: exists_with_famfam(x['value']) if 'exists' in x else ''}, + {'name': _(u'name'), 'attribute': 'global_name'}, + {'name': _(u'default'), 'attribute': lambda x: return_type(x['default'])}, + {'name': _(u'value'), 'attribute': lambda x: return_type(getattr(x['module'], x['name']))}, + {'name': _(u'description'), 'attribute': 'description'}, + {'name': _(u'exists'), 'attribute': lambda x: exists_with_famfam(getattr(x['module'], x['name'])) if x['exists'] else ''}, ] } diff --git a/apps/ocr/conf/settings.py b/apps/ocr/conf/settings.py index c1a745443d..309d68ac04 100644 --- a/apps/ocr/conf/settings.py +++ b/apps/ocr/conf/settings.py @@ -1,11 +1,21 @@ -from django.conf import settings +"""Configuration options for the ocr app""" +from django.utils.translation import ugettext_lazy as _ + +from main.api import register_settings + +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': 10, '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'PDFTOTEXT_PATH', 'global_name': u'OCR_PDFTOTEXT_PATH', 'default': u'/usr/bin/pdftotext', 'exists': True}, + {'name': u'QUEUE_PROCESSING_INTERVAL', 'global_name': u'OCR_QUEUE_PROCESSING_INTERVAL', 'default': 10}, + {'name': u'CACHE_URI', 'global_name': u'OCR_CACHE_URI', 'default': None, 'description': _(u'URI in the form: "memcached://127.0.0.1:11211/" to specify a cache backend to use for locking. Multiple hosts can be specified separated by a semicolon.')} + ] +) -TESSERACT_PATH = getattr(settings, 'OCR_TESSERACT_PATH', u'/usr/bin/tesseract') -TESSERACT_LANGUAGE = getattr(settings, 'OCR_TESSERACT_LANGUAGE', u'eng') -REPLICATION_DELAY = getattr(settings, 'OCR_REPLICATION_DELAY', 10) # In seconds -NODE_CONCURRENT_EXECUTION = getattr(settings, 'OCR_NODE_CONCURRENT_EXECUTION', 1) -AUTOMATIC_OCR = getattr(settings, 'OCR_AUTOMATIC_OCR', False) -PDFTOTEXT_PATH = getattr(settings, 'OCR_PDFTOTEXT_PATH', u'/usr/bin/pdftotext') -QUEUE_PROCESSING_INTERVAL = getattr(settings, 'OCR_QUEUE_PROCESSING_INTERVAL', 10) # In seconds -CACHE_URI = getattr(settings, 'OCR_CACHE_URI', None) diff --git a/apps/ocr/views.py b/apps/ocr/views.py index 87026f1d0a..c689e00060 100644 --- a/apps/ocr/views.py +++ b/apps/ocr/views.py @@ -7,7 +7,7 @@ from django.template import RequestContext from django.contrib import messages from django.views.generic.list_detail import object_list from django.core.urlresolvers import reverse -from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy as _ from django.conf import settings from celery.task.control import inspect diff --git a/apps/permissions/conf/settings.py b/apps/permissions/conf/settings.py index af5146cc0f..16ec61ae15 100644 --- a/apps/permissions/conf/settings.py +++ b/apps/permissions/conf/settings.py @@ -1,3 +1,12 @@ -from django.conf import settings +"""Configuration options for the permissions app""" +from django.utils.translation import ugettext_lazy as _ -DEFAULT_ROLES = getattr(settings, 'ROLES_DEFAULT_ROLES', []) +from main.api import register_settings + +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')}, + ] +) diff --git a/apps/storage/conf/settings.py b/apps/storage/conf/settings.py index 958144d38e..7ef087d111 100644 --- a/apps/storage/conf/settings.py +++ b/apps/storage/conf/settings.py @@ -1,8 +1,15 @@ -from django.conf import settings +"""Configuration options for the storage app""" +from django.utils.translation import ugettext_lazy as _ +from main.api import register_settings -GRIDFS_HOST = getattr(settings, 'STORAGE_GRIDFS_HOST', u'localhost') -GRIDFS_PORT = getattr(settings, 'STORAGE_GRIDFS_PORT', 27017) -GRIDFS_DATABASE_NAME = getattr(settings, 'STORAGE_GRIDFS_DATABASE_NAME', u'document_storage') - -FILESTORAGE_LOCATION = getattr(settings, 'STORAGE_FILESTORAGE_LOCATION', u'document_storage') +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': u'document_storage', 'exists': True}, + ] +) diff --git a/apps/web_theme/conf/settings.py b/apps/web_theme/conf/settings.py index 31f2b6045a..8370914cb6 100644 --- a/apps/web_theme/conf/settings.py +++ b/apps/web_theme/conf/settings.py @@ -1,8 +1,13 @@ -from django.conf import settings +"""Configuration options for the web_theme app""" +from django.utils.translation import ugettext_lazy as _ -#Theme options are: -#amro, bec, bec-green, blue, default, djime-cerulean, drastic-dark, -#kathleene, olive, orange, red, reidb-greenish, warehouse +from main.api import register_settings -THEME = getattr(settings, 'WEB_THEME', 'default') -ENABLE_SCROLL_JS = getattr(settings, 'WEB_THEME_ENABLE_SCROLL_JS', True) +register_settings( + namespace=u'web_theme', + module=u'web_theme.conf.settings', + settings=[ + {'name': u'THEME', 'global_name': u'WEB_THEME_THEME', 'default': u'default', '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}, + ] +) diff --git a/settings.py b/settings.py index 77f94d3d46..383ace3c2c 100644 --- a/settings.py +++ b/settings.py @@ -197,6 +197,7 @@ TEMPLATE_CONTEXT_PROCESSORS = ( # Usage #DOCUMENTS_PREVIEW_SIZE = '640x480' +#DOCUMENTS_PRINT_SIZE = '640x480' #DOCUMENTS_THUMBNAIL_SIZE = '50x50' #DOCUMENTS_DISPLAY_SIZE = '1200' #DOCUMENTS_MULTIPAGE_PREVIEW_SIZE = '160x120'