Finish smart settings refactor
This commit is contained in:
@@ -5,7 +5,7 @@ import logging
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from .models import Index, IndexInstanceNode
|
||||
from .settings import AVAILABLE_INDEXING_FUNCTIONS
|
||||
from .settings import setting_available_indexing_functions
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -44,7 +44,7 @@ def cascade_eval(document, template_node, parent_index_instance=None):
|
||||
warnings = []
|
||||
if template_node.enabled:
|
||||
try:
|
||||
result = eval(template_node.expression, {'document': document}, AVAILABLE_INDEXING_FUNCTIONS)
|
||||
result = eval(template_node.expression, {'document': document}, setting_available_indexing_functions.value)
|
||||
except Exception as exception:
|
||||
error_message = _('Error indexing document: %(document)s; expression: %(expression)s; %(exception)s') % {
|
||||
'document': document, 'expression': template_node.expression, 'exception': exception}
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from smart_settings.api import register_settings
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from smart_settings import Namespace
|
||||
|
||||
available_indexing_functions = {
|
||||
}
|
||||
|
||||
register_settings(
|
||||
namespace='document_indexing',
|
||||
module='document_indexing.settings',
|
||||
settings=[
|
||||
# Definition
|
||||
{'name': 'AVAILABLE_INDEXING_FUNCTIONS', 'global_name': 'DOCUMENT_INDEXING_AVAILABLE_INDEXING_FUNCTIONS', 'default': available_indexing_functions},
|
||||
]
|
||||
)
|
||||
namespace = Namespace(name='document_indexing', label=_('Indexing'))
|
||||
setting_available_indexing_functions = namespace.add_setting(global_name='DOCUMENT_INDEXING_AVAILABLE_INDEXING_FUNCTIONS', default=available_indexing_functions)
|
||||
|
||||
@@ -6,7 +6,10 @@ from django.forms.formsets import formset_factory
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from .models import MetadataType
|
||||
from .settings import AVAILABLE_FUNCTIONS, AVAILABLE_MODELS, setting_available_validators
|
||||
from .settings import (
|
||||
setting_available_functions, setting_available_models,
|
||||
setting_available_validators
|
||||
)
|
||||
|
||||
|
||||
class MetadataForm(forms.Form):
|
||||
@@ -69,7 +72,7 @@ class MetadataForm(forms.Form):
|
||||
|
||||
if self.metadata_type.lookup:
|
||||
try:
|
||||
choices = eval(self.metadata_type.lookup, AVAILABLE_MODELS)
|
||||
choices = eval(self.metadata_type.lookup, setting_available_models.value)
|
||||
self.fields['value'] = forms.ChoiceField(label=self.fields['value'].label)
|
||||
choices = zip(choices, choices)
|
||||
if not required:
|
||||
@@ -82,7 +85,7 @@ class MetadataForm(forms.Form):
|
||||
|
||||
if self.metadata_type.default:
|
||||
try:
|
||||
self.fields['value'].initial = eval(self.metadata_type.default, AVAILABLE_FUNCTIONS)
|
||||
self.fields['value'].initial = eval(self.metadata_type.default, setting_available_functions.value)
|
||||
except Exception as exception:
|
||||
self.fields['value'].initial = exception
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ from django.utils.timezone import now
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from smart_settings import Namespace
|
||||
from smart_settings.api import register_settings
|
||||
|
||||
from .parsers import MetadataParser
|
||||
|
||||
@@ -19,17 +18,7 @@ default_available_models = {
|
||||
'User': User
|
||||
}
|
||||
|
||||
register_settings(
|
||||
namespace='metadata',
|
||||
module='metadata.settings',
|
||||
settings=[
|
||||
# Definition
|
||||
{'name': 'AVAILABLE_FUNCTIONS', 'global_name': 'METADATA_AVAILABLE_FUNCTIONS', 'default': default_available_functions},
|
||||
{'name': 'AVAILABLE_MODELS', 'global_name': 'METADATA_AVAILABLE_MODELS', 'default': default_available_models},
|
||||
]
|
||||
)
|
||||
|
||||
# TODO: remove classes, import by string, all settings must be simple serializable types
|
||||
|
||||
namespace = Namespace(name='metadata', label=_('Metadata'))
|
||||
setting_available_validators = namespace.add_setting(global_name='METADATA_AVAILABLE_VALIDATORS', default=MetadataParser.get_import_paths())
|
||||
setting_available_functions = namespace.add_setting(global_name='METADATA_AVAILABLE_FUNCTIONS', default=default_available_functions)
|
||||
setting_available_models = namespace.add_setting(global_name='METADATA_AVAILABLE_MODELS', default=default_available_models)
|
||||
|
||||
@@ -4,12 +4,12 @@ from django.core.exceptions import ObjectDoesNotExist
|
||||
|
||||
from .models import Role
|
||||
|
||||
from .settings import DEFAULT_ROLES
|
||||
from .settings import setting_default_roles
|
||||
|
||||
|
||||
def apply_default_roles(sender, instance, **kwargs):
|
||||
if kwargs.get('created', False):
|
||||
for default_role in DEFAULT_ROLES:
|
||||
for default_role in setting_default_roles.value:
|
||||
if isinstance(default_role, Role):
|
||||
# If a model is passed, execute method
|
||||
default_role.add_member(instance)
|
||||
|
||||
@@ -2,12 +2,7 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from smart_settings.api import register_settings
|
||||
from smart_settings import Namespace
|
||||
|
||||
register_settings(
|
||||
namespace='permissions',
|
||||
module='permissions.settings',
|
||||
settings=[
|
||||
{'name': 'DEFAULT_ROLES', 'global_name': 'ROLES_DEFAULT_ROLES', 'default': [], 'description': _('A list of existing roles that are automatically assigned to newly created users')},
|
||||
]
|
||||
)
|
||||
namespace = Namespace(name='permissions', label=_('Permissions'))
|
||||
setting_default_roles = namespace.add_setting(global_name='ROLES_DEFAULT_ROLES', default=[], help_text=_('A list of existing roles that are automatically assigned to newly created users.'))
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.conf import settings as django_settings
|
||||
from django.utils.importlib import import_module
|
||||
|
||||
settings = {}
|
||||
|
||||
|
||||
def register_setting(namespace, module, name, global_name, default, exists=False, description='', 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', ''),
|
||||
setting.get('hidden', False),
|
||||
)
|
||||
@@ -8,7 +8,7 @@ from common.widgets import exists_widget
|
||||
from navigation.api import register_model_list_columns
|
||||
|
||||
from .classes import Namespace, Setting
|
||||
from .links import link_check_settings, link_namespace_detail
|
||||
from .links import link_namespace_detail, link_namespace_list
|
||||
from .widgets import setting_widget
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ class SmartSettingsApp(MayanAppConfig):
|
||||
super(SmartSettingsApp, self).ready()
|
||||
|
||||
menu_object.bind_links(links=(link_namespace_detail,), sources=(Namespace,))
|
||||
menu_setup.bind_links(links=(link_check_settings,))
|
||||
menu_setup.bind_links(links=(link_namespace_list,))
|
||||
|
||||
register_model_list_columns(Namespace, [
|
||||
{
|
||||
|
||||
@@ -9,5 +9,5 @@ def is_superuser(context):
|
||||
return context['request'].user.is_staff or context['request'].user.is_superuser
|
||||
|
||||
|
||||
link_check_settings = Link(condition=is_superuser, icon='fa fa-sliders', text=_('Settings'), view='settings:setting_list')
|
||||
link_namespace_list = Link(condition=is_superuser, icon='fa fa-sliders', text=_('Settings'), view='settings:namespace_list')
|
||||
link_namespace_detail = Link(condition=is_superuser, text=_('Settings'), view='settings:namespace_detail', args='resolved_object.name')
|
||||
|
||||
@@ -5,8 +5,7 @@ from django.conf.urls import patterns, url
|
||||
from .views import NamespaceDetailView, NamespaceListView
|
||||
|
||||
urlpatterns = patterns(
|
||||
'smart_settings.views',
|
||||
url(r'^list/$', 'setting_list', name='setting_list'),
|
||||
'',
|
||||
url(r'^namespace/all/$', NamespaceListView.as_view(), name='namespace_list'),
|
||||
url(r'^namespace/(?P<namespace_name>\w+)/$', NamespaceDetailView.as_view(), name='namespace_detail'),
|
||||
)
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import types
|
||||
|
||||
|
||||
def return_type(value):
|
||||
if isinstance(value, types.FunctionType):
|
||||
return value.__doc__ if value.__doc__ else _('Function found')
|
||||
elif isinstance(value, types.ClassType):
|
||||
return '%s.%s' % (value.__class__.__module__, value.__class__.__name__)
|
||||
elif isinstance(value, types.TypeType):
|
||||
return '%s.%s' % (value.__module__, value.__name__)
|
||||
elif isinstance(value, types.DictType) or isinstance(value, types.DictionaryType):
|
||||
return ', '.join(list(value))
|
||||
else:
|
||||
return value
|
||||
@@ -9,9 +9,7 @@ from common.utils import encapsulate
|
||||
from common.widgets import exists_widget
|
||||
from common.views import SimpleView
|
||||
|
||||
from .api import settings
|
||||
from .classes import Namespace
|
||||
from .utils import return_type # TODO: remove return_type, all settings must be simple types
|
||||
|
||||
|
||||
class NamespaceListView(SimpleView):
|
||||
@@ -48,46 +46,3 @@ class NamespaceDetailView(SimpleView):
|
||||
)
|
||||
|
||||
return context
|
||||
|
||||
|
||||
def setting_list(request):
|
||||
new_settings = []
|
||||
for namespace, sub_settings in settings.items():
|
||||
for sub_setting in sub_settings:
|
||||
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': _('Settings'),
|
||||
'object_list': sorted(new_settings, key=lambda entry: entry['global_name']),
|
||||
'hide_link': True,
|
||||
'hide_object': True,
|
||||
'extra_columns': [
|
||||
{
|
||||
'name': _('Name'),
|
||||
'attribute': encapsulate(lambda x: mark_safe('<span style="font-weight: bold;">%s</span><br />%s' % (x.get('global_name'), x.get('description'))))
|
||||
},
|
||||
{
|
||||
'name': _('Value'),
|
||||
'attribute': encapsulate(
|
||||
lambda x: mark_safe(
|
||||
'<div class="nowrap">%s %s</div>' % (
|
||||
return_type(getattr(x['module'], x['name'])),
|
||||
exists_widget(getattr(x['module'], x['name'])) if x['exists'] else ''
|
||||
)
|
||||
)
|
||||
)
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
return render_to_response(
|
||||
'appearance/generic_list.html', context,
|
||||
context_instance=RequestContext(request)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user