diff --git a/apps/app_registry/__init__.py b/apps/app_registry/__init__.py index f167c96d04..73b5c7ac73 100644 --- a/apps/app_registry/__init__.py +++ b/apps/app_registry/__init__.py @@ -1,7 +1,5 @@ from __future__ import absolute_import -import inspect - from django.conf import settings from django.utils.translation import ugettext_lazy as _ from django.utils.importlib import import_module @@ -14,13 +12,8 @@ def register_apps(): App.register(app_name) try: post_init = import_module('%s.post_init' % app_name) - except ImportError: + except ImportError as exception: pass - else: - if post_init: - for name, value in inspect.getmembers(post_init): - if hasattr(value, '__call__') and name.startswith('init'): - value() register_apps() diff --git a/apps/app_registry/models.py b/apps/app_registry/models.py index 33ede63663..c1666faebe 100644 --- a/apps/app_registry/models.py +++ b/apps/app_registry/models.py @@ -60,52 +60,56 @@ class App(TranslatableLabelMixin, LiveObjectMixin, models.Model): app, created = App.objects.get_or_create(name=app_name) except DatabaseError: transaction.rollback() - raise cls.UnableToRegister + # If database is not ready create a memory only app instance + app = App() + app.label = getattr(registration, 'label', app_name) + app.description = getattr(registration, 'description', u'') else: + # If there are not error go ahead with the stored app instance app.label = getattr(registration, 'label', app_name) app.description = getattr(registration, 'description', u'') app.dependencies.clear() app.save() - app.icon = getattr(registration, 'icon', None) - for dependency_name in getattr(registration, 'dependencies', []): dependency, created = App.objects.get_or_create(name=dependency_name) app.dependencies.add(dependency) - - settings = getattr(registration, 'settings', None) - - if settings: - logger.debug('settings: %s' % settings) - settings_module = imp.new_module('settings') - setattr(app_module, 'settings', settings_module) - sys.modules['%s.settings' % app_name] = settings_module - settings_namespace = SettingsNamespace(app_name, app.label, '%s.settings' % app_name) - for setting in settings: - settings_namespace.add_setting(**setting) - - for link in getattr(registration, 'setup_links', []): - logger.debug('setup link: %s' % link) - register_setup(link) - - for link in getattr(registration, 'tool_links', []): - logger.debug('tool link: %s' % link) - register_tool(link) - - for statistic in getattr(registration, 'statistics', []): - logger.debug('statistic: %s' % statistic) - register_statistics(statistic) - for index, link in enumerate(getattr(registration, 'menu_links', [])): - logger.debug('menu_link: %s' % link) - register_top_menu(name='%s.%s' % (app_name, index), link=link) - for cleanup_function in getattr(registration, 'cleanup_functions', []): - logger.debug('cleanup_function: %s' % cleanup_function) - Cleanup(cleanup_function) + app.icon = getattr(registration, 'icon', None) + settings = getattr(registration, 'settings', None) - for bootstrap_model in getattr(registration, 'bootstrap_models', []): - logger.debug('bootstrap_model: %s' % bootstrap_model) - BootstrapModel(model_name=bootstrap_model, app_name=app_name) + if settings: + logger.debug('settings: %s' % settings) + settings_module = imp.new_module('settings') + setattr(app_module, 'settings', settings_module) + sys.modules['%s.settings' % app_name] = settings_module + settings_namespace = SettingsNamespace(app_name, app.label, '%s.settings' % app_name) + for setting in settings: + settings_namespace.add_setting(**setting) + + for link in getattr(registration, 'setup_links', []): + logger.debug('setup link: %s' % link) + register_setup(link) + + for link in getattr(registration, 'tool_links', []): + logger.debug('tool link: %s' % link) + register_tool(link) + + for statistic in getattr(registration, 'statistics', []): + logger.debug('statistic: %s' % statistic) + register_statistics(statistic) + + for index, link in enumerate(getattr(registration, 'menu_links', [])): + logger.debug('menu_link: %s' % link) + register_top_menu(name='%s.%s' % (app_name, index), link=link) + + for cleanup_function in getattr(registration, 'cleanup_functions', []): + logger.debug('cleanup_function: %s' % cleanup_function) + Cleanup(cleanup_function) + + for bootstrap_model in getattr(registration, 'bootstrap_models', []): + logger.debug('bootstrap_model: %s' % bootstrap_model) + BootstrapModel(model_name=bootstrap_model, app_name=app_name) #def set_backup(self, *args, **kwargs): diff --git a/apps/clustering/post_init.py b/apps/clustering/post_init.py index ef9f67f291..da15f353c7 100644 --- a/apps/clustering/post_init.py +++ b/apps/clustering/post_init.py @@ -11,6 +11,7 @@ from .links import tool_link, node_list from .models import Node from .settings import NODE_HEARTBEAT_INTERVAL, DEAD_NODE_REMOVAL_INTERVAL + @transaction.commit_on_success def add_clustering_jobs(): clustering_scheduler = LocalScheduler('clustering', _(u'Clustering')) @@ -23,6 +24,5 @@ def add_clustering_jobs(): clustering_scheduler.start() -def init_clustering(): - add_clustering_jobs() - bind_links([Node, 'node_list'], [node_list], menu_name='secondary_menu') +add_clustering_jobs() +bind_links([Node, 'node_list'], [node_list], menu_name='secondary_menu') diff --git a/apps/common/post_init.py b/apps/common/post_init.py index 78c2179ecb..904f311078 100644 --- a/apps/common/post_init.py +++ b/apps/common/post_init.py @@ -5,7 +5,7 @@ import tempfile from .utils import validate_path import common.settings as common_settings +from .settings import TEMPORARY_DIRECTORY -def init_validate_temp_path(): - if (validate_path(common_settings.TEMPORARY_DIRECTORY) == False) or (not common_settings.TEMPORARY_DIRECTORY): - setattr(common_settings, 'TEMPORARY_DIRECTORY', tempfile.mkdtemp()) +if (validate_path(getattr(common_settings, 'TEMPORARY_DIRECTORY')) == False) or (not getattr(common_settings, 'TEMPORARY_DIRECTORY')): + setattr(common_settings, 'TEMPORARY_DIRECTORY', tempfile.mkdtemp()) diff --git a/apps/document_signatures/post_init.py b/apps/document_signatures/post_init.py index 404363cf57..297fad2908 100644 --- a/apps/document_signatures/post_init.py +++ b/apps/document_signatures/post_init.py @@ -73,17 +73,15 @@ def document_post_save_hook(instance): # if kwargs.get('created', False): # DocumentVersionSignature.objects.signature_state(instance.document) -def init_app(): - bind_links([Document], [document_verify], menu_name='form_header') - bind_links(['document_verify', 'document_signature_upload', 'document_signature_download', 'document_signature_delete'], [document_signature_upload, document_signature_download, document_signature_delete], menu_name='sidebar') +bind_links([Document], [document_verify], menu_name='form_header') +bind_links(['document_verify', 'document_signature_upload', 'document_signature_download', 'document_signature_delete'], [document_signature_upload, document_signature_download, document_signature_delete], menu_name='sidebar') - DocumentVersion.register_pre_open_hook(1, document_pre_open_hook) - DocumentVersion.register_post_save_hook(1, document_post_save_hook) +DocumentVersion.register_pre_open_hook(1, document_pre_open_hook) +DocumentVersion.register_post_save_hook(1, document_post_save_hook) - class_permissions(Document, [ - PERMISSION_DOCUMENT_VERIFY, PERMISSION_SIGNATURE_UPLOAD, - PERMISSION_SIGNATURE_DOWNLOAD, PERMISSION_SIGNATURE_DELETE - ]) - - DocumentVersionSignature._meta.get_field('signature_file').storage=STORAGE_BACKEND() +class_permissions(Document, [ + PERMISSION_DOCUMENT_VERIFY, PERMISSION_SIGNATURE_UPLOAD, + PERMISSION_SIGNATURE_DOWNLOAD, PERMISSION_SIGNATURE_DELETE +]) +DocumentVersionSignature._meta.get_field('signature_file').storage=STORAGE_BACKEND() diff --git a/apps/documents/post_init.py b/apps/documents/post_init.py index 98c9b0ab92..0af6de3cd7 100644 --- a/apps/documents/post_init.py +++ b/apps/documents/post_init.py @@ -11,9 +11,8 @@ from .models import DocumentVersion, get_filename_from_uuid from .settings import STORAGE_BACKEND, CACHE_PATH -def init_validate_cache_path(): - if (validate_path(CACHE_PATH) == False) or (not CACHE_PATH): - setattr(document_settings, 'CACHE_PATH', tempfile.mkdtemp()) +#TODO: fix with method to set a settings value +if (validate_path(CACHE_PATH) == False) or (not CACHE_PATH): + setattr(document_settings, 'CACHE_PATH', tempfile.mkdtemp()) -def init_set_storage_backend(): - DocumentVersion._meta.get_field('file').storage=STORAGE_BACKEND() +DocumentVersion._meta.get_field('file').storage=STORAGE_BACKEND() diff --git a/apps/dynamic_search/post_init.py b/apps/dynamic_search/post_init.py index 1ef83842b9..6c9b9501cc 100644 --- a/apps/dynamic_search/post_init.py +++ b/apps/dynamic_search/post_init.py @@ -8,7 +8,6 @@ from .settings import INDEX_UPDATE_INTERVAL from .jobs import search_index_update -def init_start_indexing_job(): - dynamic_search_scheduler = LocalScheduler('search', _(u'Search')) - dynamic_search_scheduler.add_interval_job('search_index_update', _(u'Update the search index with the most recent modified documents.'), search_index_update, seconds=INDEX_UPDATE_INTERVAL) - dynamic_search_scheduler.start() +dynamic_search_scheduler = LocalScheduler('search', _(u'Search')) +dynamic_search_scheduler.add_interval_job('search_index_update', _(u'Update the search index with the most recent modified documents.'), search_index_update, seconds=INDEX_UPDATE_INTERVAL) +dynamic_search_scheduler.start() diff --git a/apps/job_processor/post_init.py b/apps/job_processor/post_init.py index 99b73ea50e..b92682c0b2 100644 --- a/apps/job_processor/post_init.py +++ b/apps/job_processor/post_init.py @@ -65,22 +65,17 @@ def kill_all_node_processes(): process.join() -def init_job_processor(): - atexit.register(kill_all_node_processes) - - add_job_queue_jobs() - bind_links([JobQueue, 'job_queues'], [job_queues], menu_name='secondary_menu') - bind_links([JobQueue], [job_queue_start, job_queue_stop, job_queue_items_pending, job_queue_items_active, job_queue_items_error]) - bind_links([Node], [node_workers]) - bind_links([JobQueueItem], [job_requeue, job_delete]) - bind_links([Worker], [worker_terminate]) - - Node.add_to_class('workers', lambda node: node.worker_set) - - register_model_list_columns(Node, [ - { - 'name': _(u'active workers'), - 'attribute': encapsulate(lambda x: x.workers().all().count()) - }, - ]) - +#atexit.register(kill_all_node_processes) +add_job_queue_jobs() +Node.add_to_class('workers', lambda node: node.worker_set) +register_model_list_columns(Node, [ + { + 'name': _(u'active workers'), + 'attribute': encapsulate(lambda x: x.workers().all().count()) + }, +]) +bind_links([JobQueue, 'job_queues'], [job_queues], menu_name='secondary_menu') +bind_links([JobQueue], [job_queue_start, job_queue_stop, job_queue_items_pending, job_queue_items_active, job_queue_items_error]) +bind_links([Node], [node_workers]) +bind_links([JobQueueItem], [job_requeue, job_delete]) +bind_links([Worker], [worker_terminate]) diff --git a/apps/metadata/post_init.py b/apps/metadata/post_init.py index 6c4b8fbb80..f4a8576aa1 100644 --- a/apps/metadata/post_init.py +++ b/apps/metadata/post_init.py @@ -8,6 +8,5 @@ from .models import MetadataType available_models_string = (_(u' Available models: %s') % u','.join([name for name, model in AVAILABLE_MODELS.items()])) if AVAILABLE_MODELS else u'' available_functions_string = (_(u' Available functions: %s') % u','.join([u'%s()' % name for name, function in AVAILABLE_FUNCTIONS.items()])) if AVAILABLE_FUNCTIONS else u'' -def init_set_metadata_type_help_texts(): - MetadataType._meta.get_field('default').help_text=_(u'Enter a string to be evaluated.%s') % available_functions_string - MetadataType._meta.get_field('lookup').help_text=_(u'Enter a string to be evaluated. Example: [user.get_full_name() for user in User.objects.all()].%s') % available_models_string +MetadataType._meta.get_field('default').help_text=_(u'Enter a string to be evaluated.%s') % available_functions_string +MetadataType._meta.get_field('lookup').help_text=_(u'Enter a string to be evaluated. Example: [user.get_full_name() for user in User.objects.all()].%s') % available_models_string diff --git a/apps/permissions/post_init.py b/apps/permissions/post_init.py index 67d472d840..21318a403c 100644 --- a/apps/permissions/post_init.py +++ b/apps/permissions/post_init.py @@ -3,24 +3,18 @@ from __future__ import absolute_import from django.contrib.auth.models import User from django.db.models.signals import post_save from django.core.exceptions import ObjectDoesNotExist +from django.dispatch import receiver + +from .settings import DEFAULT_ROLES -def user_post_save(sender, instance, **kwargs): - from .settings import DEFAULT_ROLES +@receiver(post_save, dispatch_uid='set_default_roles', sender=User) +def set_default_roles(sender, instance, **kwargs): if kwargs.get('created', False): - for default_role in SETTING_DEFAULT_ROLES: - if isinstance(default_role, Role): - #If a model is passed, execute method - default_role.add_member(instance) - else: - #If a role name is passed, lookup the corresponding model - try: - role = Role.objects.get(name=default_role) - role.add_member(instance) - except ObjectDoesNotExist: - pass - - -def init_signal_handler(): - post_save.connect(user_post_save, sender=User) + for default_role in DEFAULT_ROLES: + try: + role = Role.objects.get(name=default_role) + role.add_member(instance) + except ObjectDoesNotExist: + pass diff --git a/apps/user_management/post_init.py b/apps/user_management/post_init.py new file mode 100644 index 0000000000..5a18611d8d --- /dev/null +++ b/apps/user_management/post_init.py @@ -0,0 +1,71 @@ +from __future__ import absolute_import + +from south.signals import post_migrate + +from django.utils.translation import ugettext_lazy as _ +from django.contrib.auth import models as auth_models +from django.contrib.auth.models import User +from django.dispatch import receiver +from django.conf import settings +from django.db.models.signals import post_save +from django.contrib.auth.models import User, Group +from django.utils.translation import ugettext_lazy as _ + +from navigation.api import bind_links, register_multi_item_links + +from .links import (user_list, user_edit, user_add, user_delete, + user_multiple_delete, user_set_password, user_multiple_set_password, + group_list, group_edit, group_add, group_delete, + group_multiple_delete, group_members) +from .models import AutoAdminSingleton +from .settings import (AUTO_CREATE_ADMIN, AUTO_ADMIN_USERNAME, + AUTO_ADMIN_PASSWORD) + + +@receiver(post_migrate, dispatch_uid='create_superuser') +def create_superuser(sender, **kwargs): + """ + From https://github.com/lambdalisue/django-qwert/blob/master/qwert/autoscript/__init__.py + From http://stackoverflow.com/questions/1466827/ -- + + Prevent interactive question about wanting a superuser created. (This code + has to go in this otherwise empty "models" module so that it gets processed by + the "syncdb" command during database creation.) + + Create our own admin super user automatically. + """ + + if AUTO_CREATE_ADMIN and kwargs['app'] == 'user_management': + try: + auth_models.User.objects.get(username=AUTO_ADMIN_USERNAME) + except auth_models.User.DoesNotExist: + print '*' * 80 + print 'Creating super admin user -- login: %s, password: %s' % (AUTO_ADMIN_USERNAME, AUTO_ADMIN_PASSWORD) + print '*' * 80 + assert auth_models.User.objects.create_superuser(AUTO_ADMIN_USERNAME, 'autoadmin@autoadmin.com', AUTO_ADMIN_PASSWORD) + admin = auth_models.User.objects.get(username=AUTO_ADMIN_USERNAME) + # Store the auto admin password properties to display the first login message + auto_admin_properties = AutoAdminSingleton.get() + auto_admin_properties.account = admin + auto_admin_properties.password = AUTO_ADMIN_PASSWORD + auto_admin_properties.password_hash = admin.password + auto_admin_properties.save() + else: + print 'Super admin user already exists. -- login: %s' % AUTO_ADMIN_USERNAME + + +@receiver(post_save, dispatch_uid='auto_admin_account_passwd_change', sender=User) +def auto_admin_account_passwd_change(sender, instance, **kwargs): + auto_admin_properties = AutoAdminSingleton.get() + if instance == auto_admin_properties.account and instance.password != auto_admin_properties.password_hash: + # Only delete the auto admin properties when the password has been changed + auto_admin_properties.delete(force=True) + + +bind_links([User], [user_edit, user_set_password, user_delete]) +bind_links(['user_multiple_set_password', 'user_set_password', 'user_multiple_delete', 'user_delete', 'user_edit', 'user_list', 'user_add'], [user_list, user_add], menu_name=u'secondary_menu') +register_multi_item_links(['user_list'], [user_multiple_set_password, user_multiple_delete]) + +bind_links([Group], [group_edit, group_members, group_delete]) +bind_links(['group_multiple_delete', 'group_delete', 'group_edit', 'group_list', 'group_add', 'group_members'], [group_list, group_add], menu_name=u'secondary_menu') +register_multi_item_links(['group_list'], [group_multiple_delete]) diff --git a/apps/common/templatetags/autoadmin_tags.py b/apps/user_management/templatetags/autoadmin_tags.py similarity index 100% rename from apps/common/templatetags/autoadmin_tags.py rename to apps/user_management/templatetags/autoadmin_tags.py