Merge branch 'feature/class_based_settings' into development
This commit is contained in:
@@ -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'),
|
||||
)
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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'},
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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.'),
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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.')
|
||||
)
|
||||
|
||||
@@ -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.')
|
||||
)
|
||||
|
||||
@@ -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: <a href="{{ link }}">{{ link }}</a><br /><br />\n\n--------<br />\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 }}<br /><br />\n\n--------<br />\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: <a href="{{ link }}">{{ link }}</a><br /><br />\n\n--------<br />\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 }}<br /><br />\n\n--------<br />\nThis email has been sent from Mayan EDMS (http://www.mayan-edms.com)'),
|
||||
description=_(u'Template for the document email form body line.')
|
||||
)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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')
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'<span style="font-weight: bold;">%s</span><br />%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'<span style="font-weight: bold;">%s</span><br />%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'<div class="nowrap">%s %s</div>' % (
|
||||
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,
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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.')
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user