openlp/openlp/core/common/mixins.py

249 lines
8.7 KiB
Python
Raw Normal View History

2013-12-13 19:44:17 +00:00
# -*- coding: utf-8 -*-
2019-04-13 13:00:22 +00:00
##########################################################################
# OpenLP - Open Source Lyrics Projection #
# ---------------------------------------------------------------------- #
2022-02-01 10:10:57 +00:00
# Copyright (c) 2008-2022 OpenLP Developers #
2019-04-13 13:00:22 +00:00
# ---------------------------------------------------------------------- #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
##########################################################################
2013-12-13 19:44:17 +00:00
"""
Provide Error Handling and login Services
2013-12-13 19:44:17 +00:00
"""
import inspect
2017-12-28 08:27:44 +00:00
import logging
2013-12-13 19:44:17 +00:00
2017-10-23 22:09:57 +00:00
from openlp.core.common import is_win, trace_error_handler
2017-10-07 07:05:07 +00:00
from openlp.core.common.registry import Registry
2018-10-02 04:39:42 +00:00
2014-01-11 17:52:01 +00:00
DO_NOT_TRACE_EVENTS = ['timerEvent', 'paintEvent', 'drag_enter_event', 'drop_event', 'on_controller_size_changed',
2020-10-04 19:20:10 +00:00
'preview_size_changed', 'resizeEvent', 'eventFilter', 'tick']
2013-12-13 19:44:17 +00:00
2017-10-23 22:09:57 +00:00
class LogMixin(object):
2013-12-13 19:44:17 +00:00
"""
Base Calling object for OpenLP classes.
"""
2017-10-23 22:09:57 +00:00
@property
def logger(self):
if hasattr(self, '_logger') and self._logger:
return self._logger
else:
self._logger = logging.getLogger("%s.%s" % (self.__module__, self.__class__.__name__))
if self._logger.getEffectiveLevel() == logging.DEBUG:
for name, m in inspect.getmembers(self, inspect.ismethod):
if name not in DO_NOT_TRACE_EVENTS:
if not name.startswith("_") and not name.startswith("log"):
setattr(self, name, self.logging_wrapper(m, self))
return self._logger
@staticmethod
def logging_wrapper(func, parent):
"""
Code to added debug wrapper to work on called functions within a decorated class.
"""
def wrapped(*args, **kwargs):
parent.logger.debug("Entering {function}".format(function=func.__name__))
try:
if len(inspect.signature(func).parameters.values()):
return func(*args, **kwargs)
else:
return func(*args)
except Exception as e:
if parent.logger.getEffectiveLevel() <= logging.ERROR:
parent.logger.error('Exception in {function} : {error}'.format(function=func.__name__,
error=e))
raise e
return wrapped
def log_debug(self, message):
"""
Common log debug handler
"""
self.logger.debug(message)
def log_info(self, message):
"""
Common log info handler
"""
self.logger.info(message)
2013-12-13 19:44:17 +00:00
def log_warning(self, message):
"""
Common log warning handler
"""
self.logger.warning(message)
2013-12-13 19:44:17 +00:00
def log_error(self, message):
"""
Common log error handler which prints the calling path
"""
trace_error_handler(self.logger)
self.logger.error(message)
2013-12-13 19:44:17 +00:00
def log_critical(self, message):
"""
Common log critical handler which prints the calling path
"""
trace_error_handler(self.logger)
self.logger.critical(message)
2013-12-13 19:44:17 +00:00
def log_exception(self, message):
"""
Common log exception handler which prints the calling path
"""
trace_error_handler(self.logger)
2014-03-20 19:10:31 +00:00
self.logger.exception(message)
2017-10-07 07:05:07 +00:00
2017-10-23 22:09:57 +00:00
class RegistryProperties(object):
2017-10-07 07:05:07 +00:00
"""
This adds registry components to classes to use at run time.
"""
_application = None
_plugin_manager = None
_media_controller = None
_service_manager = None
_preview_controller = None
_live_controller = None
_main_window = None
_renderer = None
_theme_manager = None
_settings_form = None
_alerts_manager = None
_projector_manager = None
_settings = None
2017-10-23 22:09:57 +00:00
@property
def application(self):
"""
Adds the openlp to the class dynamically.
Windows needs to access the application in a dynamic manner.
"""
if is_win():
return Registry().get('application')
else:
if not hasattr(self, '_application') or not self._application:
self._application = Registry().get('application')
return self._application
@property
def plugin_manager(self):
"""
Adds the plugin manager to the class dynamically
"""
if not hasattr(self, '_plugin_manager') or not self._plugin_manager:
self._plugin_manager = Registry().get('plugin_manager')
return self._plugin_manager
@property
def media_controller(self):
"""
Adds the media controller to the class dynamically
"""
if not hasattr(self, '_media_controller') or not self._media_controller:
self._media_controller = Registry().get('media_controller')
return self._media_controller
@property
def service_manager(self):
"""
Adds the service manager to the class dynamically
"""
if not hasattr(self, '_service_manager') or not self._service_manager:
self._service_manager = Registry().get('service_manager')
return self._service_manager
@property
def preview_controller(self):
"""
Adds the preview controller to the class dynamically
"""
if not hasattr(self, '_preview_controller') or not self._preview_controller:
self._preview_controller = Registry().get('preview_controller')
return self._preview_controller
@property
def live_controller(self):
"""
Adds the live controller to the class dynamically
"""
if not hasattr(self, '_live_controller') or not self._live_controller:
self._live_controller = Registry().get('live_controller')
return self._live_controller
@property
def main_window(self):
"""
Adds the main window to the class dynamically
"""
if not hasattr(self, '_main_window') or not self._main_window:
self._main_window = Registry().get('main_window')
return self._main_window
@property
def renderer(self):
"""
Adds the Renderer to the class dynamically
"""
if not hasattr(self, '_renderer') or not self._renderer:
self._renderer = Registry().get('renderer')
return self._renderer
@property
def theme_manager(self):
"""
Adds the theme manager to the class dynamically
"""
if not hasattr(self, '_theme_manager') or not self._theme_manager:
self._theme_manager = Registry().get('theme_manager')
return self._theme_manager
@property
def settings_form(self):
2017-10-07 07:05:07 +00:00
"""
2017-10-23 22:09:57 +00:00
Adds the settings form to the class dynamically
2017-10-07 07:05:07 +00:00
"""
2017-10-23 22:09:57 +00:00
if not hasattr(self, '_settings_form') or not self._settings_form:
self._settings_form = Registry().get('settings_form')
return self._settings_form
2017-10-07 07:05:07 +00:00
2017-10-23 22:09:57 +00:00
@property
def alerts_manager(self):
2017-10-07 07:05:07 +00:00
"""
2017-10-23 22:09:57 +00:00
Adds the alerts manager to the class dynamically
2017-10-07 07:05:07 +00:00
"""
2017-10-23 22:09:57 +00:00
if not hasattr(self, '_alerts_manager') or not self._alerts_manager:
self._alerts_manager = Registry().get('alerts_manager')
return self._alerts_manager
2017-10-07 07:05:07 +00:00
2017-10-23 22:09:57 +00:00
@property
def projector_manager(self):
2017-10-07 07:05:07 +00:00
"""
2017-10-23 22:09:57 +00:00
Adds the projector manager to the class dynamically
2017-10-07 07:05:07 +00:00
"""
2017-10-23 22:09:57 +00:00
if not hasattr(self, '_projector_manager') or not self._projector_manager:
self._projector_manager = Registry().get('projector_manager')
return self._projector_manager
@property
def settings(self):
"""
Adds the settings object to the class dynamically
"""
if not hasattr(self, '_settings') or not self._settings:
self._settings = Registry().get('settings')
return self._settings