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