From a97c2ec6628752f530d35ef19cac3b72bdb21547 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 24 Apr 2019 00:46:33 -0400 Subject: [PATCH] Update TwoStateWidget to use a template Make it compatible with the SourceColumn class. Signed-off-by: Roberto Rosario --- HISTORY.rst | 2 ++ docs/releases/3.2.rst | 3 +- mayan/apps/common/html_widgets.py | 22 +++++++++++++++ .../templates/common/two_state_widget.html | 5 ++++ mayan/apps/common/widgets.py | 28 ------------------- mayan/apps/document_indexing/apps.py | 21 +++++--------- mayan/apps/document_states/apps.py | 14 ++++------ mayan/apps/documents/apps.py | 8 ++---- mayan/apps/events/apps.py | 8 ++---- mayan/apps/linking/apps.py | 14 ++++------ mayan/apps/mailer/apps.py | 14 ++++------ mayan/apps/metadata/apps.py | 8 ++---- mayan/apps/sources/apps.py | 18 ++++++++++++ mayan/apps/sources/views.py | 15 +--------- mayan/apps/task_manager/apps.py | 20 ++++--------- mayan/apps/user_management/apps.py | 14 ++++------ 16 files changed, 91 insertions(+), 123 deletions(-) create mode 100644 mayan/apps/common/html_widgets.py create mode 100644 mayan/apps/common/templates/common/two_state_widget.html diff --git a/HISTORY.rst b/HISTORY.rst index 14a359977e..3e1272f051 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -128,6 +128,8 @@ * Backport source column identifiable and sortable improvements. * Update the way the no-result template is shown. +* Improve TwoStateWidget to use a template. Make + it compatible with the SourceColumn. 3.1.11 (2019-04-XX) =================== diff --git a/docs/releases/3.2.rst b/docs/releases/3.2.rst index d9e37282c3..8bcc0bfc2f 100644 --- a/docs/releases/3.2.rst +++ b/docs/releases/3.2.rst @@ -160,7 +160,8 @@ Other changes * Backport source column identifiable and sortable improvements. * Update the way the no-result template is shown. - +* Improve TwoStateWidget to use a template. Make + it compatible with the SourceColumn. Removals -------- diff --git a/mayan/apps/common/html_widgets.py b/mayan/apps/common/html_widgets.py new file mode 100644 index 0000000000..702e39ea5d --- /dev/null +++ b/mayan/apps/common/html_widgets.py @@ -0,0 +1,22 @@ +from __future__ import unicode_literals + +from django.template.loader import render_to_string + +from .icons import icon_fail as default_icon_fail +from .icons import icon_ok as default_icon_ok + + +class TwoStateWidget(object): + template_name = 'common/two_state_widget.html' + + def __init__(self, center=False, icon_ok=None, icon_fail=None): + self.icon_ok = icon_ok or default_icon_ok + self.icon_fail = icon_fail or default_icon_fail + + def render(self, name=None, value=None): + return render_to_string( + template_name=self.template_name, context={ + 'icon_ok': self.icon_ok, 'icon_fail': self.icon_fail, + 'value': value + } + ) diff --git a/mayan/apps/common/templates/common/two_state_widget.html b/mayan/apps/common/templates/common/two_state_widget.html new file mode 100644 index 0000000000..0d118bb467 --- /dev/null +++ b/mayan/apps/common/templates/common/two_state_widget.html @@ -0,0 +1,5 @@ +{% if value %} +
{{ icon_ok.render }}
+{% else %} +
{{ icon_fail.render }}
+{% endif %} diff --git a/mayan/apps/common/widgets.py b/mayan/apps/common/widgets.py index 3438def495..94b94d17bb 100644 --- a/mayan/apps/common/widgets.py +++ b/mayan/apps/common/widgets.py @@ -5,8 +5,6 @@ from django.utils.encoding import force_text from django.utils.html import format_html from django.utils.safestring import mark_safe -from .icons import icon_fail as default_icon_fail, icon_ok as default_icon_ok - class DisableableSelectWidget(forms.SelectMultiple): allow_multiple_selected = True @@ -76,29 +74,3 @@ class TextAreaDiv(forms.widgets.Widget): if attrs: default_attrs.update(attrs) super(TextAreaDiv, self).__init__(default_attrs) - - -class TwoStateWidget(object): - def __init__(self, state, center=False, icon_ok=None, icon_fail=None): - self.state = state - self.icon_ok = icon_ok or default_icon_ok - self.icon_fail = icon_fail or default_icon_fail - self.center = center - - def render(self): - center_class = '' - if self.center: - center_class = 'text-center' - - if self.state: - return mark_safe( - '
{}
'.format( - center_class, self.icon_ok.render() - ) - ) - else: - return mark_safe( - '
{}
'.format( - center_class, self.icon_fail.render() - ) - ) diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index 1713e67933..142b8e4451 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -10,11 +10,11 @@ from mayan.apps.acls.classes import ModelPermission from mayan.apps.acls.links import link_acl_list from mayan.apps.acls.permissions import permission_acl_edit, permission_acl_view from mayan.apps.common.apps import MayanAppConfig +from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import ( menu_facet, menu_list_facet, menu_main, menu_object, menu_secondary, menu_setup, menu_tools ) -from mayan.apps.common.widgets import TwoStateWidget from mayan.apps.documents.signals import post_document_created, post_initial_document_type from mayan.apps.navigation import SourceColumn from mayan.celery import app @@ -86,10 +86,8 @@ class DocumentIndexingApp(MayanAppConfig): SourceColumn(source=Index, label=_('Label'), attribute='label') SourceColumn(source=Index, label=_('Slug'), attribute='slug') SourceColumn( - source=Index, label=_('Enabled'), - func=lambda context: TwoStateWidget( - state=context['object'].enabled - ).render() + attribute='enabled', label=_('Enabled'), source=Index, + widget=TwoStateWidget ) SourceColumn( @@ -112,18 +110,13 @@ class DocumentIndexingApp(MayanAppConfig): func=lambda context: node_level(context['object']) ) SourceColumn( - source=IndexTemplateNode, label=_('Enabled'), - func=lambda context: TwoStateWidget( - state=context['object'].enabled - ).render() + attribute='enabled', label=_('Enabled'), source=IndexTemplateNode, + widget=TwoStateWidget ) SourceColumn( - source=IndexTemplateNode, label=_('Has document links?'), - func=lambda context: TwoStateWidget( - state=context['object'].link_documents - ).render() + attribute='enabled', label=_('Has document links?'), + source=IndexTemplateNode, widget=TwoStateWidget ) - SourceColumn( source=IndexInstanceNode, label=_('Level'), func=lambda context: index_instance_item_link(context['object']) diff --git a/mayan/apps/document_states/apps.py b/mayan/apps/document_states/apps.py index ae6b8751e5..bcb1fb03cd 100644 --- a/mayan/apps/document_states/apps.py +++ b/mayan/apps/document_states/apps.py @@ -11,12 +11,12 @@ from mayan.apps.acls.links import link_acl_list from mayan.apps.common.apps import MayanAppConfig from mayan.apps.common.classes import ModelAttribute from mayan.apps.common.links import link_object_error_list +from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import ( menu_facet, menu_list_facet, menu_main, menu_object, menu_secondary, menu_setup, menu_tools ) from mayan.apps.common.permissions_runtime import permission_error_log_view -from mayan.apps.common.widgets import TwoStateWidget from mayan.apps.navigation import SourceColumn from mayan.celery import app @@ -200,10 +200,8 @@ class DocumentStatesApp(MayanAppConfig): ) SourceColumn( - source=WorkflowState, label=_('Is initial state?'), - func=lambda context: TwoStateWidget( - state=context['object'].initial - ).render() + attribute='initial', label=_('Is initial state?'), + source=WorkflowState, widget=TwoStateWidget ) SourceColumn( source=WorkflowState, label=_('Completion'), attribute='completion' @@ -213,10 +211,8 @@ class DocumentStatesApp(MayanAppConfig): source=WorkflowStateAction, label=_('Label'), attribute='label' ) SourceColumn( - source=WorkflowStateAction, label=_('Enabled?'), - func=lambda context: TwoStateWidget( - state=context['object'].enabled - ).render() + attribute='enabled', label=_('Enabled?'), + source=WorkflowStateAction, widget=TwoStateWidget ) SourceColumn( source=WorkflowStateAction, label=_('When?'), diff --git a/mayan/apps/documents/apps.py b/mayan/apps/documents/apps.py index b6d2825b55..5b60f58df7 100644 --- a/mayan/apps/documents/apps.py +++ b/mayan/apps/documents/apps.py @@ -12,12 +12,12 @@ from mayan.apps.acls.links import link_acl_list from mayan.apps.acls.permissions import permission_acl_edit, permission_acl_view from mayan.apps.common.apps import MayanAppConfig from mayan.apps.common.classes import MissingItem, ModelField, Template +from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import ( menu_facet, menu_list_facet, menu_main, menu_object, menu_secondary, menu_setup, menu_multi_item, menu_tools ) from mayan.apps.common.signals import post_initial_setup -from mayan.apps.common.widgets import TwoStateWidget from mayan.apps.dashboards.dashboards import dashboard_main from mayan.apps.converter.links import link_transformation_list from mayan.apps.converter.permissions import ( @@ -285,10 +285,8 @@ class DocumentsApp(MayanAppConfig): ) SourceColumn( - source=DocumentTypeFilename, label=_('Enabled'), - func=lambda context: TwoStateWidget( - state=context['object'].enabled - ).render() + attribute='enabled', label=_('Enabled'), + source=DocumentTypeFilename, widget=TwoStateWidget ) # DeletedDocument diff --git a/mayan/apps/events/apps.py b/mayan/apps/events/apps.py index 729650a443..21346a9dee 100644 --- a/mayan/apps/events/apps.py +++ b/mayan/apps/events/apps.py @@ -4,10 +4,10 @@ from django.apps import apps from django.utils.translation import ugettext_lazy as _ from mayan.apps.common.apps import MayanAppConfig +from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import ( menu_main, menu_object, menu_secondary, menu_tools, menu_user ) -from mayan.apps.common.widgets import TwoStateWidget from mayan.apps.navigation import SourceColumn from .html_widgets import ( @@ -79,10 +79,8 @@ class EventsApp(MayanAppConfig): ) SourceColumn( - source=Notification, label=_('Seen'), - func=lambda context: TwoStateWidget( - state=context['object'].read - ).render() + attribute='read', label=_('Seen'), source=Notification, + widget=TwoStateWidget ) menu_main.bind_links( diff --git a/mayan/apps/linking/apps.py b/mayan/apps/linking/apps.py index fc43abc70c..aaffed74c0 100644 --- a/mayan/apps/linking/apps.py +++ b/mayan/apps/linking/apps.py @@ -7,10 +7,10 @@ from mayan.apps.acls.classes import ModelPermission from mayan.apps.acls.links import link_acl_list from mayan.apps.acls.permissions import permission_acl_edit, permission_acl_view from mayan.apps.common.apps import MayanAppConfig +from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import ( menu_facet, menu_list_facet, menu_object, menu_secondary, menu_setup ) -from mayan.apps.common.widgets import TwoStateWidget from mayan.apps.navigation import SourceColumn from .links import ( @@ -66,17 +66,13 @@ class LinkingApp(MayanAppConfig): attribute='dynamic_label' ) SourceColumn( - source=SmartLink, label=_('Enabled'), - func=lambda context: TwoStateWidget( - state=context['object'].enabled - ).render() + attribute='enabled', label=_('Enabled'), source=SmartLink, + widget=TwoStateWidget ) SourceColumn( - source=SmartLinkCondition, label=_('Enabled'), - func=lambda context: TwoStateWidget( - state=context['object'].enabled - ).render() + attribute='enabled', label=_('Enabled'), source=SmartLinkCondition, + widget=TwoStateWidget ) menu_facet.bind_links( diff --git a/mayan/apps/mailer/apps.py b/mayan/apps/mailer/apps.py index 867c4f64ec..fee2a4ec24 100644 --- a/mayan/apps/mailer/apps.py +++ b/mayan/apps/mailer/apps.py @@ -9,11 +9,11 @@ from mayan.apps.acls.classes import ModelPermission from mayan.apps.acls.links import link_acl_list from mayan.apps.acls.permissions import permission_acl_edit, permission_acl_view from mayan.apps.common.apps import MayanAppConfig +from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import ( menu_list_facet, menu_multi_item, menu_object, menu_secondary, menu_setup, menu_tools ) -from mayan.apps.common.widgets import TwoStateWidget from mayan.apps.events import ModelEventType from mayan.apps.events.links import ( link_events_for_object, link_object_event_types_user_subcriptions_list @@ -72,16 +72,12 @@ class MailerApp(MayanAppConfig): source=UserMailer, label=_('Label'), attribute='label' ) SourceColumn( - source=UserMailer, label=_('Default?'), - func=lambda context: TwoStateWidget( - state=context['object'].default - ).render() + attribute='default', label=_('Default?'), source=UserMailer, + widget=TwoStateWidget ) SourceColumn( - source=UserMailer, label=_('Enabled?'), - func=lambda context: TwoStateWidget( - state=context['object'].enabled - ).render() + attribute='enabled', label=_('Enabled?'), source=UserMailer, + widget=TwoStateWidget ) SourceColumn( source=UserMailer, label=_('Label'), attribute='backend_label' diff --git a/mayan/apps/metadata/apps.py b/mayan/apps/metadata/apps.py index 6326797f9d..0a7969c55f 100644 --- a/mayan/apps/metadata/apps.py +++ b/mayan/apps/metadata/apps.py @@ -13,11 +13,11 @@ from mayan.apps.acls.links import link_acl_list from mayan.apps.acls.permissions import permission_acl_edit, permission_acl_view from mayan.apps.common.apps import MayanAppConfig from mayan.apps.common.classes import ModelAttribute, ModelField +from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import ( menu_facet, menu_list_facet, menu_multi_item, menu_object, menu_secondary, menu_setup ) -from mayan.apps.common.widgets import TwoStateWidget from mayan.apps.documents.search import document_page_search, document_search from mayan.apps.documents.signals import post_document_type_change from mayan.apps.events import ModelEventType @@ -166,10 +166,8 @@ class MetadataApp(MayanAppConfig): attribute='value' ) SourceColumn( - source=DocumentMetadata, label=_('Required'), - func=lambda context: TwoStateWidget( - state=context['object'].is_required - ).render() + attribute='is_required', label=_('Required'), + source=DocumentMetadata, widget=TwoStateWidget ) app.conf.CELERY_QUEUES.append( diff --git a/mayan/apps/sources/apps.py b/mayan/apps/sources/apps.py index a842a10cb5..ebfc58e358 100644 --- a/mayan/apps/sources/apps.py +++ b/mayan/apps/sources/apps.py @@ -6,6 +6,7 @@ from kombu import Exchange, Queue from mayan.apps.common.apps import MayanAppConfig from mayan.apps.common.classes import MissingItem +from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import ( menu_list_facet, menu_object, menu_secondary, menu_setup ) @@ -65,6 +66,23 @@ class SourcesApp(MayanAppConfig): view='sources:setup_source_list' ) + SourceColumn( + attribute='label', is_identifier=True, + source=Source + ) + SourceColumn( + attribute='class_fullname', label=_('Type'), source=Source + ) + SourceColumn( + attribute='enabled', source=Source, + widget=TwoStateWidget + ) + + SourceColumn( + attribute='enabled', is_sortable=True, source=Source, + widget=TwoStateWidget + ) + SourceColumn( source=StagingFile, label=_('Created'), diff --git a/mayan/apps/sources/views.py b/mayan/apps/sources/views.py index 64c9ec6ac9..ac396dd9dc 100644 --- a/mayan/apps/sources/views.py +++ b/mayan/apps/sources/views.py @@ -16,12 +16,10 @@ from mayan.apps.acls.models import AccessControlList from mayan.apps.checkouts.models import NewVersionBlock from mayan.apps.common.menus import menu_facet from mayan.apps.common.models import SharedUploadedFile -from mayan.apps.common.utils import encapsulate from mayan.apps.common.views import ( ConfirmView, MultiFormView, SingleObjectCreateView, SingleObjectDeleteView, SingleObjectEditView, SingleObjectListView ) -from mayan.apps.common.widgets import TwoStateWidget from mayan.apps.documents.models import DocumentType, Document from mayan.apps.documents.permissions import ( permission_document_create, permission_document_new_version @@ -605,19 +603,8 @@ class SetupSourceListView(SingleObjectListView): def get_extra_context(self): return { - 'extra_columns': ( - { - 'name': _('Type'), - 'attribute': encapsulate(lambda entry: entry.class_fullname()) - }, - { - 'name': _('Enabled'), - 'attribute': encapsulate( - lambda entry: TwoStateWidget(state=entry.enabled).render() - ) - }, - ), 'hide_link': True, + 'hide_object': True, 'no_results_icon': icon_setup_sources, 'no_results_secondary_links': [ link_setup_source_create_webform.resolve( diff --git a/mayan/apps/task_manager/apps.py b/mayan/apps/task_manager/apps.py index bcafe7b68b..551af25a5c 100644 --- a/mayan/apps/task_manager/apps.py +++ b/mayan/apps/task_manager/apps.py @@ -3,8 +3,8 @@ from __future__ import unicode_literals from django.utils.translation import ugettext_lazy as _ from mayan.apps.common.apps import MayanAppConfig +from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import menu_object, menu_secondary, menu_tools -from mayan.apps.common.widgets import TwoStateWidget from mayan.apps.navigation import SourceColumn from .classes import CeleryQueue, Task @@ -32,16 +32,12 @@ class TaskManagerApp(MayanAppConfig): source=CeleryQueue, label=_('Name'), attribute='name' ) SourceColumn( - source=CeleryQueue, label=_('Default queue?'), - func=lambda context: TwoStateWidget( - state=context['object'].is_default_queue - ).render() + attribute='is_default_queue', label=_('Default queue?'), + source=CeleryQueue, widget=TwoStateWidget ) SourceColumn( - source=CeleryQueue, label=_('Is transient?'), - func=lambda context: TwoStateWidget( - state=context['object'].is_transient - ).render() + attribute='is_transient', label=_('Is transient?'), + source=CeleryQueue, widget=TwoStateWidget ) SourceColumn( source=Task, label=_('Type'), attribute='task_type' @@ -53,12 +49,6 @@ class TaskManagerApp(MayanAppConfig): source=Task, label=_('Host'), func=lambda context: context['object'].kwargs['hostname'] ) - SourceColumn( - source=Task, label=_('Acknowledged'), - func=lambda context: TwoStateWidget( - state=context['object'].kwargs['acknowledged'] - ).render() - ) SourceColumn( source=Task, label=_('Arguments'), func=lambda context: context['object'].kwargs['args'] diff --git a/mayan/apps/user_management/apps.py b/mayan/apps/user_management/apps.py index 3736107d93..6898a3c3ef 100644 --- a/mayan/apps/user_management/apps.py +++ b/mayan/apps/user_management/apps.py @@ -9,11 +9,11 @@ from mayan.apps.acls.classes import ModelPermission from mayan.apps.acls.links import link_acl_list from mayan.apps.acls.permissions import permission_acl_edit, permission_acl_view from mayan.apps.common.apps import MayanAppConfig +from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import ( menu_list_facet, menu_multi_item, menu_object, menu_secondary, menu_setup, menu_user ) -from mayan.apps.common.widgets import TwoStateWidget from mayan.apps.events.classes import ModelEventType from mayan.apps.events.links import ( link_events_for_object, link_object_event_types_user_subcriptions_list @@ -131,16 +131,12 @@ class UserManagementApp(MayanAppConfig): source=User, label=_('Email'), attribute='email' ) SourceColumn( - source=User, label=_('Active'), - func=lambda context: TwoStateWidget( - state=context['object'].is_active - ).render() + attribute='is_active', label=_('Active'), source=User, + widget=TwoStateWidget ) SourceColumn( - source=User, label=_('Has usable password?'), - func=lambda context: TwoStateWidget( - state=context['object'].has_usable_password() - ).render() + attribute='has_usable_password', label=_('Has usable password?'), + source=User, widget=TwoStateWidget ) # Silence UnorderedObjectListWarning