From 103dfaa2a57e1d1f5a635ed128d0b0725c90d709 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Fri, 7 Jan 2022 17:11:53 +1100 Subject: [PATCH] try/catch for operational error - Database might not yet be ready to load models --- .../plugin/builtin/integration/mixins.py | 50 +++++++++++-------- InvenTree/plugin/registry.py | 23 +++++---- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/InvenTree/plugin/builtin/integration/mixins.py b/InvenTree/plugin/builtin/integration/mixins.py index 54f739d04d..cd757edc9f 100644 --- a/InvenTree/plugin/builtin/integration/mixins.py +++ b/InvenTree/plugin/builtin/integration/mixins.py @@ -135,41 +135,49 @@ class ScheduleMixin: Register the tasks with the database """ - from django_q.models import Schedule + try: + from django_q.models import Schedule - for key, task in self.scheduled_tasks.items(): + for key, task in self.scheduled_tasks.items(): - task_name = self.get_task_name(key) + task_name = self.get_task_name(key) - # If a matching scheduled task does not exist, create it! - if not Schedule.objects.filter(name=task_name).exists(): + # If a matching scheduled task does not exist, create it! + if not Schedule.objects.filter(name=task_name).exists(): - logger.info(f"Adding scheduled task '{task_name}'") + logger.info(f"Adding scheduled task '{task_name}'") - Schedule.objects.create( - name=task_name, - func=task['func'], - schedule_type=task['schedule'], - minutes=task.get('minutes', None), - repeats=task.get('repeats', -1), - ) + Schedule.objects.create( + name=task_name, + func=task['func'], + schedule_type=task['schedule'], + minutes=task.get('minutes', None), + repeats=task.get('repeats', -1), + ) + except OperationalError: + # Database might not yet be ready + pass def unregister_tasks(self): """ Deregister the tasks with the database """ - from django_q.models import Schedule + try: + from django_q.models import Schedule - for key, task in self.scheduled_tasks.items(): + for key, task in self.scheduled_tasks.items(): - task_name = self.get_task_name(key) + task_name = self.get_task_name(key) - try: - scheduled_task = Schedule.objects.get(name=task_name) - scheduled_task.delete() - except Schedule.DoesNotExist: - pass + try: + scheduled_task = Schedule.objects.get(name=task_name) + scheduled_task.delete() + except Schedule.DoesNotExist: + pass + except OperationalError: + # Database might not yet be ready + pass class UrlsMixin: diff --git a/InvenTree/plugin/registry.py b/InvenTree/plugin/registry.py index 12dfc9d43e..37196d7e54 100644 --- a/InvenTree/plugin/registry.py +++ b/InvenTree/plugin/registry.py @@ -301,7 +301,6 @@ class PluginsRegistry: logger.info('Activating plugin tasks') from common.models import InvenTreeSetting - from django_q.models import Schedule # List of tasks we have activated task_keys = [] @@ -323,17 +322,23 @@ class PluginsRegistry: # Remove any scheduled tasks which do not match # This stops 'old' plugin tasks from accumulating - scheduled_plugin_tasks = Schedule.objects.filter(name__istartswith="plugin.") + try: + from django_q.models import Schedule - deleted_count = 0 + scheduled_plugin_tasks = Schedule.objects.filter(name__istartswith="plugin.") - for task in scheduled_plugin_tasks: - if task.name not in task_keys: - task.delete() - deleted_count += 1 + deleted_count = 0 - if deleted_count > 0: - logger.info(f"Removed {deleted_count} old scheduled tasks") + for task in scheduled_plugin_tasks: + if task.name not in task_keys: + task.delete() + deleted_count += 1 + + if deleted_count > 0: + logger.info(f"Removed {deleted_count} old scheduled tasks") + except OperationalError: + # Database might not yet be ready + pass def deactivate_integration_schedule(self): pass