diff --git a/mayan/apps/common/apps.py b/mayan/apps/common/apps.py index b3380e3d8a..7fb9ee8ee1 100644 --- a/mayan/apps/common/apps.py +++ b/mayan/apps/common/apps.py @@ -26,10 +26,14 @@ from .links import ( link_about, link_check_version, link_code, link_current_user_details, link_current_user_edit, link_current_user_locale_profile_edit, link_documentation, link_filters, link_forum, link_license, - link_packages_licenses, link_setup, link_support, link_tools + link_object_error_list_clear, link_packages_licenses, link_setup, + link_support, link_tools ) + from .literals import DELETE_STALE_UPLOADS_INTERVAL -from .menus import menu_about, menu_main, menu_tools, menu_user +from .menus import ( + menu_about, menu_main, menu_secondary, menu_tools, menu_user +) from .licenses import * # NOQA from .queues import * # NOQA - Force queues registration from .settings import setting_auto_logging, setting_production_error_log_path @@ -90,23 +94,6 @@ class CommonApp(MayanAppConfig): APIEndPoint(app=self, version_string='1') - SourceColumn( - source=ErrorLogEntry, label=_('Namespace'), - attribute='namespace' - ) - SourceColumn( - source=ErrorLogEntry, label=_('Object'), - attribute='content_object' - ) - SourceColumn( - source=ErrorLogEntry, label=_('Date and time'), - attribute='datetime' - ) - SourceColumn( - source=ErrorLogEntry, label=_('Result'), - attribute='result' - ) - app.conf.CELERYBEAT_SCHEDULE.update( { 'task_delete_stale_uploads': { @@ -156,7 +143,11 @@ class CommonApp(MayanAppConfig): ) menu_main.bind_links(links=(menu_about, menu_user,), position=99) - + menu_secondary.bind_links( + links=(link_object_error_list_clear,), sources=( + 'common:object_error_list', + ) + ) menu_tools.bind_links( links=(link_filters,) ) diff --git a/mayan/apps/common/classes.py b/mayan/apps/common/classes.py index cf67c62256..1cc2a2c94f 100644 --- a/mayan/apps/common/classes.py +++ b/mayan/apps/common/classes.py @@ -109,6 +109,9 @@ class ErrorLogNamespace(object): def __str__(self): return force_text(self.label) + def create(self, obj, result): + obj.error_logs.create(namespace=self.name, result=result) + def all(self): ErrorLogEntry = apps.get_model( app_label='common', model_name='ErrorLogEntry' diff --git a/mayan/apps/common/links.py b/mayan/apps/common/links.py index f576a2cde7..01c3ca85b6 100644 --- a/mayan/apps/common/links.py +++ b/mayan/apps/common/links.py @@ -56,14 +56,20 @@ link_documentation = Link( icon='fa fa-book', tags='new_window', text=_('Documentation'), url='https://mayan.readthedocs.io/en/stable/' ) -link_error_list = Link( +link_object_error_list = Link( + kwargs=get_kwargs_factory('resolved_object'), permissions=(permission_error_log_view,), text=_('Errors'), - view='common:error_list', kwargs=get_kwargs_factory('resolved_object') + view='common:object_error_list', ) -link_error_list_with_icon = Link( - icon='fa fa-lock', permissions=(permission_error_log_view,), - text=_('Errors'), view='common:error_list', - kwargs=get_kwargs_factory('resolved_object') +link_object_error_list_clear = Link( + kwargs=get_kwargs_factory('resolved_object'), + permissions=(permission_error_log_view,), text=_('Clear all'), + view='common:object_error_list_clear', +) +link_object_error_list_with_icon = Link( + kwargs=get_kwargs_factory('resolved_object'), icon='fa fa-lock', + permissions=(permission_error_log_view,), text=_('Errors'), + view='common:error_list', ) link_filters = Link( icon='fa fa-filter', text=_('Data filters'), diff --git a/mayan/apps/common/urls.py b/mayan/apps/common/urls.py index f8a3bfb87e..8b16038f09 100644 --- a/mayan/apps/common/urls.py +++ b/mayan/apps/common/urls.py @@ -7,9 +7,10 @@ from .api_views import APIContentTypeList from .views import ( AboutView, CheckVersionView, CurrentUserDetailsView, CurrentUserEditView, CurrentUserLocaleProfileDetailsView, CurrentUserLocaleProfileEditView, - ErrorLogEntryListView, FaviconRedirectView, FilterResultListView, - FilterSelectView, HomeView, LicenseView, PackagesLicensesView, - SetupListView, ToolsListView, multi_object_action_view + FaviconRedirectView, FilterResultListView, FilterSelectView, HomeView, + LicenseView, ObjectErrorLogEntryListClearView, ObjectErrorLogEntryListView, + PackagesLicensesView, SetupListView, ToolsListView, + multi_object_action_view ) urlpatterns = [ @@ -55,8 +56,13 @@ urlpatterns = [ name='filter_results' ), url( - r'^(?P[-\w]+)/(?P[-\w]+)/(?P\d+)/errors/$', - ErrorLogEntryListView.as_view(), name='error_list' + r'^object/(?P[-\w]+)/(?P[-\w]+)/(?P\d+)/errors/$', + ObjectErrorLogEntryListView.as_view(), name='object_error_list' + ), + url( + r'^object/(?P[-\w]+)/(?P[-\w]+)/(?P\d+)/errors/clear/$', + ObjectErrorLogEntryListClearView.as_view(), + name='object_error_list_clear' ), ] diff --git a/mayan/apps/common/views.py b/mayan/apps/common/views.py index d97f5b951a..73397c6841 100644 --- a/mayan/apps/common/views.py +++ b/mayan/apps/common/views.py @@ -135,43 +135,6 @@ class CurrentUserLocaleProfileEditView(SingleObjectEditView): return self.request.user.locale_profile -class ErrorLogEntryListView(SingleObjectListView): - def dispatch(self, request, *args, **kwargs): - self.object_content_type = get_object_or_404( - ContentType, app_label=self.kwargs['app_label'], - model=self.kwargs['model'] - ) - - try: - self.content_object = self.object_content_type.get_object_for_this_type( - pk=self.kwargs['object_id'] - ) - except self.object_content_type.model_class().DoesNotExist: - raise Http404 - - AccessControlList.objects.check_access( - obj=self.content_object, permissions=permission_error_log_view, - user=request.user - ) - - return super(ErrorLogEntryListView, self).dispatch( - request, *args, **kwargs - ) - - def get_extra_context(self): - return { - 'hide_object': True, - 'object': self.content_object, - 'title': _('Error log entries for: %s' % self.content_object), - } - - def get_object_list(self): - return ErrorLogEntry.objects.filter( - content_type=self.object_content_type, - object_id=self.content_object.pk - ) - - class FaviconRedirectView(RedirectView): permanent = True @@ -236,6 +199,67 @@ class LicenseView(SimpleView): template_name = 'appearance/generic_form.html' +class ObjectErrorLogEntryListClearView(ConfirmView): + def get_extra_context(self): + return { + 'object': self.get_object(), + 'title': _('Clear error log entries for: %s' % self.get_object()), + } + + def get_object(self): + content_type = get_object_or_404( + klass=ContentType, app_label=self.kwargs['app_label'], + model=self.kwargs['model'] + ) + + return get_object_or_404( + klass=content_type.model_class(), + pk=self.kwargs['object_id'] + ) + + def view_action(self): + self.get_object().error_logs.all().delete() + messages.success( + self.request, _('Object error log cleared successfully') + ) + + +class ObjectErrorLogEntryListView(SingleObjectListView): + def dispatch(self, request, *args, **kwargs): + AccessControlList.objects.check_access( + obj=self.get_object(), permissions=permission_error_log_view, + user=request.user + ) + + return super(ObjectErrorLogEntryListView, self).dispatch( + request, *args, **kwargs + ) + + def get_extra_context(self): + return { + 'extra_columns': ( + {'name': _('Date and time'), 'attribute': 'datetime'}, + {'name': _('Result'), 'attribute': 'result'}, + ), + 'hide_object': True, + 'object': self.get_object(), + 'title': _('Error log entries for: %s' % self.get_object()), + } + + def get_object(self): + content_type = get_object_or_404( + klass=ContentType, app_label=self.kwargs['app_label'], + model=self.kwargs['model'] + ) + + return get_object_or_404( + klass=content_type.model_class(), pk=self.kwargs['object_id'] + ) + + def get_object_list(self): + return self.get_object().error_logs.all() + + class PackagesLicensesView(SimpleView): template_name = 'appearance/generic_form.html'