summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askbot/management/commands/askbot_clear_index.py87
-rw-r--r--askbot/management/commands/askbot_rebuild_index.py76
-rw-r--r--askbot/management/commands/askbot_update_index.py86
3 files changed, 244 insertions, 5 deletions
diff --git a/askbot/management/commands/askbot_clear_index.py b/askbot/management/commands/askbot_clear_index.py
new file mode 100644
index 00000000..bb3b04b9
--- /dev/null
+++ b/askbot/management/commands/askbot_clear_index.py
@@ -0,0 +1,87 @@
+import sys
+from optparse import make_option
+
+from django.core.management import get_commands, load_command_class
+from django.utils.translation import activate as activate_language
+from django.core.management.base import BaseCommand, CommandError
+from django.conf import settings
+
+try:
+ from haystack.management.commands.clear_index import Command as ClearCommand
+ haystack_option_list = [option for option in ClearCommand.base_options if not option.get_opt_string() != '--verbosity']
+except ImportError:
+ haystack_option_list = []
+
+class Command(BaseCommand):
+ help = "Completely rebuilds the search index by removing the old data and then updating."
+ base_options = [make_option("-l", "--language", action="store", type="string", dest="language",
+ help='Language to user, in language code format'),]
+ option_list = list(BaseCommand.option_list) + haystack_option_list + base_options
+
+ def handle(self, **options):
+ lang_code = options.get('language', settings.LANGUAGE_CODE.lower())
+ options['using'] = ['default_%s' % lang_code[:2],]
+ activate_language(lang_code)
+
+ klass = self._get_command_class('clear_index')
+ klass.handle(*args, **options)
+
+ def _get_command_class(self, name):
+ try:
+ app_name = get_commands()[name]
+ if isinstance(app_name, BaseCommand):
+ # If the command is already loaded, use it directly.
+ klass = app_name
+ else:
+ klass = load_command_class(app_name, name)
+ except KeyError:
+ raise CommandError("Unknown command: %r" % name)
+ return klass
+
+
+ def execute(self, *args, **options):
+ """
+ Try to execute this command, performing model validation if
+ needed (as controlled by the attribute
+ ``self.requires_model_validation``). If the command raises a
+ ``CommandError``, intercept it and print it sensibly to
+ stderr.
+ """
+ show_traceback = options.get('traceback', False)
+
+ if self.can_import_settings:
+ try:
+ #language part used to be here
+ pass
+ except ImportError, e:
+ # If settings should be available, but aren't,
+ # raise the error and quit.
+ if show_traceback:
+ traceback.print_exc()
+ else:
+ sys.stderr.write(smart_str(self.style.ERROR('Error: %s\n' % e)))
+ sys.exit(1)
+
+ try:
+ self.stdout = options.get('stdout', sys.stdout)
+ self.stderr = options.get('stderr', sys.stderr)
+ if self.requires_model_validation:
+ self.validate()
+ output = self.handle(*args, **options)
+ if output:
+ if self.output_transaction:
+ # This needs to be imported here, because it relies on
+ # settings.
+ from django.db import connections, DEFAULT_DB_ALIAS
+ connection = connections[options.get('database', DEFAULT_DB_ALIAS)]
+ if connection.ops.start_transaction_sql():
+ self.stdout.write(self.style.SQL_KEYWORD(connection.ops.start_transaction_sql()) + '\n')
+ self.stdout.write(output)
+ if self.output_transaction:
+ self.stdout.write('\n' + self.style.SQL_KEYWORD("COMMIT;") + '\n')
+ except CommandError, e:
+ if show_traceback:
+ traceback.print_exc()
+ else:
+ self.stderr.write(smart_str(self.style.ERROR('Error: %s\n' % e)))
+ sys.exit(1)
diff --git a/askbot/management/commands/askbot_rebuild_index.py b/askbot/management/commands/askbot_rebuild_index.py
index 204f3b56..366bad53 100644
--- a/askbot/management/commands/askbot_rebuild_index.py
+++ b/askbot/management/commands/askbot_rebuild_index.py
@@ -1,8 +1,9 @@
+import sys
from optparse import make_option
-from django.core.management import call_command
+from django.core.management import get_commands, load_command_class
from django.utils.translation import activate as activate_language
-from django.core.management.base import BaseCommand
+from django.core.management.base import BaseCommand, CommandError
from django.conf import settings
try:
@@ -19,8 +20,73 @@ class Command(BaseCommand):
help='Language to user, in language code format'),]
option_list = list(BaseCommand.option_list) + haystack_option_list + base_options
- def handle(self, **options):
+ def handle(self, *args, **options):
lang_code = options.get('language', settings.LANGUAGE_CODE.lower())
- activate_language(lang_code)
options['using'] = ['default_%s' % lang_code[:2],]
- call_command('rebuild_index', **options)
+ activate_language(lang_code)
+
+ klass = self._get_command_class('clear_index')
+ klass.handle(*args, **options)
+
+ klass = self._get_command_class('update_index')
+ klass.handle(*args, **options)
+
+ def _get_command_class(self, name):
+ try:
+ app_name = get_commands()[name]
+ if isinstance(app_name, BaseCommand):
+ # If the command is already loaded, use it directly.
+ klass = app_name
+ else:
+ klass = load_command_class(app_name, name)
+ except KeyError:
+ raise CommandError("Unknown command: %r" % name)
+ return klass
+
+
+ def execute(self, *args, **options):
+ """
+ Try to execute this command, performing model validation if
+ needed (as controlled by the attribute
+ ``self.requires_model_validation``). If the command raises a
+ ``CommandError``, intercept it and print it sensibly to
+ stderr.
+ """
+ show_traceback = options.get('traceback', False)
+
+ if self.can_import_settings:
+ try:
+ #language part used to be here
+ pass
+ except ImportError, e:
+ # If settings should be available, but aren't,
+ # raise the error and quit.
+ if show_traceback:
+ traceback.print_exc()
+ else:
+ sys.stderr.write(smart_str(self.style.ERROR('Error: %s\n' % e)))
+ sys.exit(1)
+
+ try:
+ self.stdout = options.get('stdout', sys.stdout)
+ self.stderr = options.get('stderr', sys.stderr)
+ if self.requires_model_validation:
+ self.validate()
+ output = self.handle(*args, **options)
+ if output:
+ if self.output_transaction:
+ # This needs to be imported here, because it relies on
+ # settings.
+ from django.db import connections, DEFAULT_DB_ALIAS
+ connection = connections[options.get('database', DEFAULT_DB_ALIAS)]
+ if connection.ops.start_transaction_sql():
+ self.stdout.write(self.style.SQL_KEYWORD(connection.ops.start_transaction_sql()) + '\n')
+ self.stdout.write(output)
+ if self.output_transaction:
+ self.stdout.write('\n' + self.style.SQL_KEYWORD("COMMIT;") + '\n')
+ except CommandError, e:
+ if show_traceback:
+ traceback.print_exc()
+ else:
+ self.stderr.write(smart_str(self.style.ERROR('Error: %s\n' % e)))
+ sys.exit(1)
diff --git a/askbot/management/commands/askbot_update_index.py b/askbot/management/commands/askbot_update_index.py
new file mode 100644
index 00000000..2499878d
--- /dev/null
+++ b/askbot/management/commands/askbot_update_index.py
@@ -0,0 +1,86 @@
+import sys
+from optparse import make_option
+
+from django.core.management import get_commands, load_command_class
+from django.utils.translation import activate as activate_language
+from django.core.management.base import BaseCommand, CommandError
+from django.conf import settings
+
+try:
+ from haystack.management.commands.update_index import Command as UpdateCommand
+ haystack_option_list = [option for option in UpdateCommand.base_options if option.get_opt_string() != '--verbosity']
+except ImportError:
+ haystack_option_list = []
+
+class Command(BaseCommand):
+ help = "Completely rebuilds the search index by removing the old data and then updating."
+ base_options = [make_option("-l", "--language", action="store", type="string", dest="language",
+ help='Language to user, in language code format'),]
+ option_list = list(BaseCommand.option_list) + haystack_option_list + base_options
+
+ def handle(self, **options):
+ lang_code = options.get('language', settings.LANGUAGE_CODE.lower())
+ activate_language(lang_code)
+ options['using'] = ['default_%s' % lang_code[:2],]
+ klass = self._get_command_class('update_index')
+ klass.handle(*args, **options)
+
+ def _get_command_class(self, name):
+ try:
+ app_name = get_commands()[name]
+ if isinstance(app_name, BaseCommand):
+ # If the command is already loaded, use it directly.
+ klass = app_name
+ else:
+ klass = load_command_class(app_name, name)
+ except KeyError:
+ raise CommandError("Unknown command: %r" % name)
+ return klass
+
+
+ def execute(self, *args, **options):
+ """
+ Try to execute this command, performing model validation if
+ needed (as controlled by the attribute
+ ``self.requires_model_validation``). If the command raises a
+ ``CommandError``, intercept it and print it sensibly to
+ stderr.
+ """
+ show_traceback = options.get('traceback', False)
+
+ if self.can_import_settings:
+ try:
+ #language part used to be here
+ pass
+ except ImportError, e:
+ # If settings should be available, but aren't,
+ # raise the error and quit.
+ if show_traceback:
+ traceback.print_exc()
+ else:
+ sys.stderr.write(smart_str(self.style.ERROR('Error: %s\n' % e)))
+ sys.exit(1)
+
+ try:
+ self.stdout = options.get('stdout', sys.stdout)
+ self.stderr = options.get('stderr', sys.stderr)
+ if self.requires_model_validation:
+ self.validate()
+ output = self.handle(*args, **options)
+ if output:
+ if self.output_transaction:
+ # This needs to be imported here, because it relies on
+ # settings.
+ from django.db import connections, DEFAULT_DB_ALIAS
+ connection = connections[options.get('database', DEFAULT_DB_ALIAS)]
+ if connection.ops.start_transaction_sql():
+ self.stdout.write(self.style.SQL_KEYWORD(connection.ops.start_transaction_sql()) + '\n')
+ self.stdout.write(output)
+ if self.output_transaction:
+ self.stdout.write('\n' + self.style.SQL_KEYWORD("COMMIT;") + '\n')
+ except CommandError, e:
+ if show_traceback:
+ traceback.print_exc()
+ else:
+ self.stderr.write(smart_str(self.style.ERROR('Error: %s\n' % e)))
+ sys.exit(1)