Refactor register_model_columns into SourceColumn class

This commit is contained in:
Roberto Rosario
2015-06-23 04:12:13 -04:00
parent 383c7e62ab
commit b4efd4574e
18 changed files with 122 additions and 262 deletions

View File

@@ -51,8 +51,8 @@
<th>{% trans 'Identifier' %}</th> <th>{% trans 'Identifier' %}</th>
{% endif %} {% endif %}
{% for column in object_list|get_model_list_columns %} {% for column in object_list|get_source_columns %}
<th>{{ column.name }}</th> <th>{{ column.label }}</th>
{% endfor %} {% endfor %}
{% for column in extra_columns %} {% for column in extra_columns %}
@@ -86,7 +86,7 @@
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if not hide_columns %} {% if not hide_columns %}
{% for column in object|get_model_list_columns %} {% for column in object|get_source_columns %}
<td>{{ object|object_property:column.attribute }}</td> <td>{{ object|object_property:column.attribute }}</td>
{% endfor %} {% endfor %}
{% endif %} {% endif %}

View File

@@ -1,7 +1,6 @@
from django.template import Library from django.template import Library
from common.utils import return_attrib from common.utils import return_attrib
from navigation.api import model_list_columns
register = Library() register = Library()
@@ -9,30 +8,3 @@ register = Library()
@register.filter @register.filter
def object_property(value, arg): def object_property(value, arg):
return return_attrib(value, arg) return return_attrib(value, arg)
@register.filter
def get_model_list_columns(obj):
try:
# Is it a query set?
obj = obj.model
except AttributeError:
# Is not a query set
try:
# Is iterable?
obj = obj[0]
except TypeError:
# It is not
pass
except IndexError:
# It a list and it's empty
pass
except KeyError:
# It a list and it's empty
pass
for key, value in model_list_columns.items():
if key == obj or isinstance(obj, key):
return value
return []

View File

@@ -9,7 +9,7 @@ from common import MayanAppConfig, menu_facet, menu_object, menu_sidebar
from common.classes import ModelAttribute from common.classes import ModelAttribute
from common.utils import encapsulate from common.utils import encapsulate
from documents.models import Document from documents.models import Document
from navigation.api import register_model_list_columns from navigation import SourceColumn
from .links import ( from .links import (
link_comment_add, link_comment_delete, link_comments_for_document link_comment_add, link_comment_delete, link_comments_for_document
@@ -40,27 +40,16 @@ class DocumentCommentsApp(MayanAppConfig):
ModelAttribute(Document, label=_('Comments'), name='comments', type_name='related') ModelAttribute(Document, label=_('Comments'), name='comments', type_name='related')
SourceColumn(source=Comment, label=_('Date'), attribute='submit_date')
SourceColumn(source=Comment, label=_('User'), attribute=encapsulate(lambda x: x.user.get_full_name() if x.user.get_full_name() else x.user))
SourceColumn(source=Comment, label=_('Comment'), attribute='comment')
class_permissions(Document, [ class_permissions(Document, [
PERMISSION_COMMENT_CREATE, PERMISSION_COMMENT_CREATE,
PERMISSION_COMMENT_DELETE, PERMISSION_COMMENT_DELETE,
PERMISSION_COMMENT_VIEW] PERMISSION_COMMENT_VIEW]
) )
register_model_list_columns(Comment, [
{
'name': _('Date'),
'attribute': 'submit_date'
},
{
'name': _('User'),
'attribute': encapsulate(lambda x: x.user.get_full_name() if x.user.get_full_name() else x.user)
},
{
'name': _('Comment'),
'attribute': 'comment'
}
])
menu_sidebar.bind_links(links=[link_comment_add], sources=['comments:comments_for_document', 'comments:comment_add', 'comments:comment_delete', 'comments:comment_multiple_delete']) menu_sidebar.bind_links(links=[link_comment_add], sources=['comments:comments_for_document', 'comments:comment_add', 'comments:comment_delete', 'comments:comment_multiple_delete'])
menu_object.bind_links(links=[link_comment_delete], sources=[Comment]) menu_object.bind_links(links=[link_comment_delete], sources=[Comment])
menu_facet.bind_links(links=[link_comments_for_document], sources=[Document]) menu_facet.bind_links(links=[link_comments_for_document], sources=[Document])

View File

@@ -9,7 +9,7 @@ from common import (
) )
from common.utils import encapsulate from common.utils import encapsulate
from documents.models import Document from documents.models import Document
from navigation.api import register_model_list_columns from navigation import SourceColumn
from .handlers import launch_workflow from .handlers import launch_workflow
from .models import ( from .models import (
@@ -35,6 +35,26 @@ class DocumentStatesApp(MayanAppConfig):
def ready(self): def ready(self):
super(DocumentStatesApp, self).ready() super(DocumentStatesApp, self).ready()
SourceColumn(source=Workflow, label=_('Initial state'), attribute=encapsulate(lambda workflow: workflow.get_initial_state() or _('None')))
SourceColumn(source=WorkflowInstance, label=_('Current state'), attribute='get_current_state')
SourceColumn(source=WorkflowInstance, label=_('User'), attribute=encapsulate(lambda workflow: getattr(workflow.get_last_log_entry(), 'user', _('None'))))
SourceColumn(source=WorkflowInstance, label=_('Last transition'), attribute='get_last_transition')
SourceColumn(source=WorkflowInstance, label=_('Date and time'), attribute=encapsulate(lambda workflow: getattr(workflow.get_last_log_entry(), 'datetime', _('None'))))
SourceColumn(source=WorkflowInstance, label=_('Completion'), attribute=encapsulate(lambda workflow: getattr(workflow.get_current_state(), 'completion', _('None'))))
SourceColumn(source=WorkflowInstanceLogEntry, label=_('Date and time'), attribute='datetime')
SourceColumn(source=WorkflowInstanceLogEntry, label=_('User'), attribute='user')
SourceColumn(source=WorkflowInstanceLogEntry, label=_('Transition'), attribute='transition')
SourceColumn(source=WorkflowInstanceLogEntry, label=_('Comment'), attribute='comment')
SourceColumn(source=WorkflowState, label=_('Is initial state?'), attribute='initial')
SourceColumn(source=WorkflowState, label=_('Completion'), attribute='completion')
SourceColumn(source=WorkflowTransition, label=_('Origin state'), attribute='origin_state')
SourceColumn(source=WorkflowTransition, label=_('Destination state'), attribute='destination_state')
menu_facet.bind_links(links=[link_document_workflow_instance_list], sources=[Document]) menu_facet.bind_links(links=[link_document_workflow_instance_list], sources=[Document])
menu_object.bind_links(links=[link_setup_workflow_states, link_setup_workflow_transitions, link_setup_workflow_document_types, link_setup_workflow_edit, link_setup_workflow_delete], sources=[Workflow]) menu_object.bind_links(links=[link_setup_workflow_states, link_setup_workflow_transitions, link_setup_workflow_document_types, link_setup_workflow_edit, link_setup_workflow_delete], sources=[Workflow])
menu_object.bind_links(links=[link_setup_workflow_state_edit, link_setup_workflow_state_delete], sources=[WorkflowState]) menu_object.bind_links(links=[link_setup_workflow_state_edit, link_setup_workflow_state_delete], sources=[WorkflowState])
@@ -44,75 +64,4 @@ class DocumentStatesApp(MayanAppConfig):
menu_setup.bind_links(links=[link_setup_workflow_list]) menu_setup.bind_links(links=[link_setup_workflow_list])
menu_sidebar.bind_links(links=[link_setup_workflow_state_create, link_setup_workflow_transition_create], sources=[Workflow]) menu_sidebar.bind_links(links=[link_setup_workflow_state_create, link_setup_workflow_transition_create], sources=[Workflow])
register_model_list_columns(Workflow, [
{
'name': _('Initial state'),
'attribute': encapsulate(lambda workflow: workflow.get_initial_state() or _('None'))
},
])
register_model_list_columns(WorkflowInstance, [
{
'name': _('Current state'),
'attribute': 'get_current_state'
},
{
'name': _('User'),
'attribute': encapsulate(lambda workflow: getattr(workflow.get_last_log_entry(), 'user', _('None')))
},
{
'name': _('Last transition'),
'attribute': 'get_last_transition'
},
{
'name': _('Date and time'),
'attribute': encapsulate(lambda workflow: getattr(workflow.get_last_log_entry(), 'datetime', _('None')))
},
{
'name': _('Completion'),
'attribute': encapsulate(lambda workflow: getattr(workflow.get_current_state(), 'completion', _('None')))
},
])
register_model_list_columns(WorkflowInstanceLogEntry, [
{
'name': _('Date and time'),
'attribute': 'datetime'
},
{
'name': _('User'),
'attribute': 'user'
},
{
'name': _('Transition'),
'attribute': 'transition'
},
{
'name': _('Comment'),
'attribute': 'comment'
},
])
register_model_list_columns(WorkflowState, [
{
'name': _('Is initial state?'),
'attribute': 'initial'
},
{
'name': _('Completion'),
'attribute': 'completion'
},
])
register_model_list_columns(WorkflowTransition, [
{
'name': _('Origin state'),
'attribute': 'origin_state'
},
{
'name': _('Destination state'),
'attribute': 'destination_state'
},
])
post_save.connect(launch_workflow, dispatch_uid='launch_workflow', sender=Document) post_save.connect(launch_workflow, dispatch_uid='launch_workflow', sender=Document)

View File

@@ -24,7 +24,7 @@ from converter.permissions import (
) )
from dynamic_search.classes import SearchModel from dynamic_search.classes import SearchModel
from events.permissions import PERMISSION_EVENTS_VIEW from events.permissions import PERMISSION_EVENTS_VIEW
from navigation.api import register_model_list_columns from navigation import SourceColumn
from rest_api.classes import APIEndPoint from rest_api.classes import APIEndPoint
from statistics.classes import StatisticNamespace from statistics.classes import StatisticNamespace
@@ -150,12 +150,6 @@ class DocumentsApp(MayanAppConfig):
registry.register(Document) registry.register(Document)
register_maintenance_links([link_clear_image_cache], namespace='documents', title=_('Documents')) register_maintenance_links([link_clear_image_cache], namespace='documents', title=_('Documents'))
register_model_list_columns(Document, [
{ SourceColumn(source=Document, label=_('Thumbnail'), attribute=encapsulate(lambda document: document_thumbnail(document, gallery_name='documents:document_list', title=getattr(document, 'label', None), size=setting_thumbnail_size.value)))
'name': _('Thumbnail'), 'attribute': SourceColumn(source=Document, label=_('type'), attribute='document_type')
encapsulate(lambda x: document_thumbnail(x, gallery_name='documents:document_list', title=getattr(x, 'label', None), size=setting_thumbnail_size.value))
},
{
'name': _('Type'), 'attribute': 'document_type'
}
])

View File

@@ -2,9 +2,14 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from actstream.models import Action
from common import MayanAppConfig, menu_tools from common import MayanAppConfig, menu_tools
from common.utils import encapsulate
from navigation import SourceColumn
from .links import link_events_list from .links import link_events_list
from .widgets import event_type_link
class EventsApp(MayanAppConfig): class EventsApp(MayanAppConfig):
@@ -14,4 +19,8 @@ class EventsApp(MayanAppConfig):
def ready(self): def ready(self):
super(EventsApp, self).ready() super(EventsApp, self).ready()
SourceColumn(source=Action, label=_('Timestamp'), attribute='timestamp')
SourceColumn(source=Action, label=_('Actor'), attribute='actor')
SourceColumn(source=Action, label=_('Verb'), attribute=encapsulate(lambda entry: event_type_link(entry)))
menu_tools.bind_links(links=[link_events_list]) menu_tools.bind_links(links=[link_events_list])

View File

@@ -4,13 +4,7 @@ from django.db import models
from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from actstream.models import Action
from common.utils import encapsulate
from navigation.api import register_model_list_columns
from .classes import Event from .classes import Event
from .widgets import event_type_link
@python_2_unicode_compatible @python_2_unicode_compatible
@@ -25,17 +19,3 @@ class EventType(models.Model):
verbose_name_plural = _('Event types') verbose_name_plural = _('Event types')
register_model_list_columns(Action, [
{
'name': _('Timestamp'),
'attribute': 'timestamp'
},
{
'name': _('Actor'),
'attribute': 'actor',
},
{
'name': _('Verb'),
'attribute': encapsulate(lambda entry: event_type_link(entry))
},
])

View File

@@ -10,8 +10,7 @@ from common import (
) )
from common.utils import encapsulate from common.utils import encapsulate
from documents.models import Document from documents.models import Document
from navigation.api import register_model_list_columns from navigation import CombinedSource, SourceColumn
from navigation import CombinedSource
from rest_api.classes import APIEndPoint from rest_api.classes import APIEndPoint
from .links import ( from .links import (
@@ -55,7 +54,5 @@ class FoldersApp(MayanAppConfig):
menu_secondary.bind_links(links=[link_folder_list, link_folder_create], sources=[Folder, 'folders:folder_list', 'folders:folder_create']) menu_secondary.bind_links(links=[link_folder_list, link_folder_create], sources=[Folder, 'folders:folder_list', 'folders:folder_create'])
menu_sidebar.bind_links(links=[link_folder_add_document], sources=['folders:document_folder_list', 'folders:folder_add_document']) menu_sidebar.bind_links(links=[link_folder_add_document], sources=['folders:document_folder_list', 'folders:folder_add_document'])
register_model_list_columns(Folder, [ SourceColumn(source=Folder, label=_('Created'), attribute='datetime_created')
{'name': _('Created'), 'attribute': 'datetime_created'}, SourceColumn(source=Folder, label=_('Document'), attribute=encapsulate(lambda x: x.documents.count()))
{'name': _('Documents'), 'attribute': encapsulate(lambda x: x.documents.count())},
])

View File

@@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _
from common import MayanAppConfig, menu_tools, menu_object, menu_secondary from common import MayanAppConfig, menu_tools, menu_object, menu_secondary
from common.utils import encapsulate from common.utils import encapsulate
from navigation.api import register_model_list_columns from navigation import SourceColumn
from .classes import Property, PropertyNamespace, PIPNotFound, VirtualEnv from .classes import Property, PropertyNamespace, PIPNotFound, VirtualEnv
from .links import link_menu_link, link_namespace_details, link_namespace_list from .links import link_menu_link, link_namespace_details, link_namespace_list
@@ -17,6 +17,12 @@ class InstallationApp(MayanAppConfig):
def ready(self): def ready(self):
super(InstallationApp, self).ready() super(InstallationApp, self).ready()
SourceColumn(source=PropertyNamespace, label=_('Label'), attribute='label')
SourceColumn(source=PropertyNamespace, label=_('Items'), attribute=encapsulate(lambda entry: len(entry.get_properties())))
SourceColumn(source=Property, label=_('Label'), attribute='label')
SourceColumn(source=Property, label=_('Value'), attribute='value')
menu_object.bind_links(links=[link_namespace_details], sources=[PropertyNamespace]) menu_object.bind_links(links=[link_namespace_details], sources=[PropertyNamespace])
menu_secondary.bind_links(links=[link_namespace_list], sources=['installation:namespace_list', PropertyNamespace]) menu_secondary.bind_links(links=[link_namespace_list], sources=['installation:namespace_list', PropertyNamespace])
menu_tools.bind_links(links=[link_menu_link]) menu_tools.bind_links(links=[link_menu_link])
@@ -29,25 +35,3 @@ class InstallationApp(MayanAppConfig):
else: else:
for item, version, result in venv.get_results(): for item, version, result in venv.get_results():
namespace.add_property(item, '%s (%s)' % (item, version), result, report=True) namespace.add_property(item, '%s (%s)' % (item, version), result, report=True)
register_model_list_columns(PropertyNamespace, [
{
'name': _('Label'),
'attribute': 'label'
},
{
'name': _('Items'),
'attribute': encapsulate(lambda entry: len(entry.get_properties()))
}
])
register_model_list_columns(Property, [
{
'name': _('Label'),
'attribute': 'label'
},
{
'name': _('Value'),
'attribute': 'value'
}
])

View File

@@ -14,7 +14,7 @@ from common.classes import ModelAttribute
from common.utils import encapsulate from common.utils import encapsulate
from documents.models import Document, DocumentType from documents.models import Document, DocumentType
from documents.signals import post_document_type_change from documents.signals import post_document_type_change
from navigation.api import register_model_list_columns from navigation import SourceColumn
from rest_api.classes import APIEndPoint from rest_api.classes import APIEndPoint
from .api import get_metadata_string from .api import get_metadata_string
@@ -57,6 +57,8 @@ class MetadataApp(MayanAppConfig):
ModelAttribute(Document, 'metadata__value', label=_('Metadata type value'), type_name='query') ModelAttribute(Document, 'metadata__value', label=_('Metadata type value'), type_name='query')
ModelAttribute(Document, 'metadata_value_of', label=_('Value of a metadata'), description=_('Return the value of a specific document metadata'), type_name=['property', 'indexing']) ModelAttribute(Document, 'metadata_value_of', label=_('Value of a metadata'), description=_('Return the value of a specific document metadata'), type_name=['property', 'indexing'])
SourceColumn(source=Document, label=_('Metadata'), attribute=encapsulate(lambda document: get_metadata_string(document)))
class_permissions(Document, [ class_permissions(Document, [
PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_EDIT, PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_REMOVE, PERMISSION_METADATA_DOCUMENT_VIEW, PERMISSION_METADATA_DOCUMENT_REMOVE, PERMISSION_METADATA_DOCUMENT_VIEW,
@@ -74,9 +76,3 @@ class MetadataApp(MayanAppConfig):
post_save.connect(post_document_type_metadata_type_add, dispatch_uid='post_document_type_metadata_type_add', sender=DocumentTypeMetadataType) post_save.connect(post_document_type_metadata_type_add, dispatch_uid='post_document_type_metadata_type_add', sender=DocumentTypeMetadataType)
post_delete.connect(post_document_type_metadata_type_delete, dispatch_uid='post_document_type_metadata_type_delete', sender=DocumentTypeMetadataType) post_delete.connect(post_document_type_metadata_type_delete, dispatch_uid='post_document_type_metadata_type_delete', sender=DocumentTypeMetadataType)
post_document_type_change.connect(post_post_document_type_change_metadata, dispatch_uid='post_post_document_type_change_metadata', sender=Document) post_document_type_change.connect(post_post_document_type_change_metadata, dispatch_uid='post_post_document_type_change_metadata', sender=Document)
register_model_list_columns(Document, [
{
'name': _('Metadata'), 'attribute': encapsulate(lambda x: get_metadata_string(x))
},
])

View File

@@ -1 +1 @@
from .classes import CombinedSource, Link, Menu # NOQA from .classes import CombinedSource, Link, Menu, SourceColumn # NOQA

View File

@@ -1,13 +0,0 @@
from __future__ import unicode_literals
model_list_columns = {}
def register_model_list_columns(model, columns):
"""
Define which columns will be displayed in the generic list template
for a given model
"""
model_list_columns.setdefault(model, [])
model_list_columns[model].extend(columns)

View File

@@ -248,6 +248,27 @@ class ModelListColumn(object):
self.__class__._model_list_columns[model].extend(columns) self.__class__._model_list_columns[model].extend(columns)
class SourceColumn(object):
_registry = {}
@classmethod
def get_for_source(cls, source):
try:
return cls._registry[source]
except KeyError:
try:
return cls._registry[source.model]
except AttributeError:
try:
return cls._registry[source.__class__]
except KeyError:
return ()
def __init__(self, source, label, attribute):
self.__class__._registry.setdefault(source, [])
self.__class__._registry[source].append({'label': label, 'attribute': attribute})
class CombinedSource(object): class CombinedSource(object):
""" """
Class that binds a link to a combination of an object and a view. Class that binds a link to a combination of an object and a view.

View File

@@ -2,7 +2,7 @@ from __future__ import unicode_literals
from django.template import Library from django.template import Library
from ..classes import Menu from ..classes import Menu, SourceColumn
from ..forms import MultiItemForm from ..forms import MultiItemForm
register = Library() register = Library()
@@ -35,3 +35,26 @@ def get_multi_item_links_form(context, object_list):
form = MultiItemForm(actions=actions) form = MultiItemForm(actions=actions)
context.update({'multi_item_form': form, 'multi_item_actions': actions}) context.update({'multi_item_form': form, 'multi_item_actions': actions})
return '' return ''
@register.filter
def get_source_columns(source):
try:
# Is it a query set?
source = source.model
except AttributeError:
# Is not a query set
try:
# Is iterable?
source = source[0]
except TypeError:
# It is not
pass
except IndexError:
# It a list and it's empty
pass
except KeyError:
# It a list and it's empty
pass
return SourceColumn.get_for_source(source)

View File

@@ -16,7 +16,7 @@ from documents.models import Document, DocumentVersion
from documents.signals import post_version_upload from documents.signals import post_version_upload
from documents.widgets import document_link from documents.widgets import document_link
from installation import PropertyNamespace from installation import PropertyNamespace
from navigation.api import register_model_list_columns from navigation import SourceColumn
from rest_api.classes import APIEndPoint from rest_api.classes import APIEndPoint
from .handlers import post_version_upload_ocr from .handlers import post_version_upload_ocr
@@ -54,6 +54,10 @@ class OCRApp(MayanAppConfig):
Document.add_to_class('submit_for_ocr', document_ocr_submit) Document.add_to_class('submit_for_ocr', document_ocr_submit)
DocumentVersion.add_to_class('submit_for_ocr', document_version_ocr_submit) DocumentVersion.add_to_class('submit_for_ocr', document_version_ocr_submit)
SourceColumn(source=DocumentVersionOCRError, label=_('Document'), attribute=encapsulate(lambda entry: document_link(entry.document_version.document)))
SourceColumn(source=DocumentVersionOCRError, label=_('Added'), attribute='datetime_submitted')
SourceColumn(source=DocumentVersionOCRError, label=_('Result'), attribute='result')
class_permissions( class_permissions(
Document, [ Document, [
PERMISSION_OCR_DOCUMENT, PERMISSION_OCR_CONTENT_VIEW PERMISSION_OCR_DOCUMENT, PERMISSION_OCR_CONTENT_VIEW
@@ -98,15 +102,3 @@ class OCRApp(MayanAppConfig):
namespace.add_property('unpaper', _('unpaper version'), _('error getting version'), report=True) namespace.add_property('unpaper', _('unpaper version'), _('error getting version'), report=True)
else: else:
namespace.add_property('unpaper', _('unpaper version'), unpaper('-V').stdout, report=True) namespace.add_property('unpaper', _('unpaper version'), unpaper('-V').stdout, report=True)
register_model_list_columns(DocumentVersionOCRError, [
{
'name': _('Document'), 'attribute': encapsulate(lambda entry: document_link(entry.document_version.document))
},
{
'name': _('Added'), 'attribute': 'datetime_submitted'
},
{
'name': _('Result'), 'attribute': 'result'
},
])

View File

@@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _
from common import MayanAppConfig, menu_setup, menu_object from common import MayanAppConfig, menu_setup, menu_object
from common.utils import encapsulate from common.utils import encapsulate
from common.widgets import exists_widget from common.widgets import exists_widget
from navigation.api import register_model_list_columns from navigation import SourceColumn
from .classes import Namespace, Setting from .classes import Namespace, Setting
from .links import link_namespace_detail, link_namespace_list from .links import link_namespace_detail, link_namespace_list
@@ -21,25 +21,10 @@ class SmartSettingsApp(MayanAppConfig):
def ready(self): def ready(self):
super(SmartSettingsApp, self).ready() super(SmartSettingsApp, self).ready()
SourceColumn(source=Namespace, label=_('Setting count'), attribute=encapsulate(lambda instance: len(instance.settings)))
SourceColumn(source=Setting, label=_('Name'), attribute=encapsulate(lambda instance: setting_widget(instance)))
SourceColumn(source=Setting, label=_('Value'), attribute='value')
SourceColumn(source=Setting, label=_('Found in path'), attribute=encapsulate(lambda instance: exists_widget(instance.value) if instance.is_path else _('n/a')))
menu_object.bind_links(links=(link_namespace_detail,), sources=(Namespace,)) menu_object.bind_links(links=(link_namespace_detail,), sources=(Namespace,))
menu_setup.bind_links(links=(link_namespace_list,)) menu_setup.bind_links(links=(link_namespace_list,))
register_model_list_columns(Namespace, [
{
'name': _('Setting count'),
'attribute': encapsulate(lambda instance: len(instance.settings))
},
])
register_model_list_columns(Setting, [
{
'name': _('Name'),
'attribute': encapsulate(lambda instance: setting_widget(instance))
},
{
'name': _('Value'), 'attribute': 'value'
},
{
'name': _('Found in path'), 'attribute': encapsulate(lambda instance: exists_widget(instance.value) if instance.is_path else _('n/a'))
},
])

View File

@@ -10,7 +10,7 @@ from common.signals import post_initial_setup
from common.utils import encapsulate from common.utils import encapsulate
from converter.links import link_transformation_list from converter.links import link_transformation_list
from documents.models import Document from documents.models import Document
from navigation.api import register_model_list_columns from navigation import SourceColumn
from rest_api.classes import APIEndPoint from rest_api.classes import APIEndPoint
from .classes import StagingFile from .classes import StagingFile
@@ -36,8 +36,11 @@ class SourcesApp(MayanAppConfig):
super(SourcesApp, self).ready() super(SourcesApp, self).ready()
APIEndPoint('sources') APIEndPoint('sources')
MissingItem(label=_('Create a document source'), description=_('Document sources are the way in which new documents are feed to Mayan EDMS, create at least a web form source to be able to upload documents from a browser.'), condition=lambda: not Source.objects.exists(), view='sources:setup_source_list') MissingItem(label=_('Create a document source'), description=_('Document sources are the way in which new documents are feed to Mayan EDMS, create at least a web form source to be able to upload documents from a browser.'), condition=lambda: not Source.objects.exists(), view='sources:setup_source_list')
SourceColumn(source=StagingFile, label=_('Thumbnail'), attribute=encapsulate(lambda staging_file: staging_file_thumbnail(staging_file, gallery_name='sources:staging_list', title=staging_file.filename, size='100')))
menu_front_page.bind_links(links=[link_document_create_multiple]) menu_front_page.bind_links(links=[link_document_create_multiple])
menu_object.bind_links(links=[link_document_create_siblings], sources=[Document]) menu_object.bind_links(links=[link_document_create_siblings], sources=[Document])
menu_object.bind_links(links=[link_setup_source_edit, link_setup_source_delete, link_transformation_list, link_setup_source_logs], sources=[Source]) menu_object.bind_links(links=[link_setup_source_edit, link_setup_source_delete, link_transformation_list, link_setup_source_logs], sources=[Source])
@@ -46,11 +49,4 @@ class SourcesApp(MayanAppConfig):
menu_setup.bind_links(links=[link_setup_sources]) menu_setup.bind_links(links=[link_setup_sources])
menu_sidebar.bind_links(links=[link_upload_version], sources=['documents:document_version_list', 'documents:upload_version', 'documents:document_version_revert']) menu_sidebar.bind_links(links=[link_upload_version], sources=['documents:document_version_list', 'documents:upload_version', 'documents:document_version_revert'])
register_model_list_columns(StagingFile, [
{
'name': _('Thumbnail'), 'attribute':
encapsulate(lambda x: staging_file_thumbnail(x, gallery_name='sources:staging_list', title=x.filename, size='100'))
},
])
post_initial_setup.connect(create_default_document_source, dispatch_uid='create_default_document_source') post_initial_setup.connect(create_default_document_source, dispatch_uid='create_default_document_source')

View File

@@ -9,8 +9,7 @@ from common import (
) )
from common.utils import encapsulate from common.utils import encapsulate
from documents.models import Document from documents.models import Document
from navigation import CombinedSource from navigation import CombinedSource, SourceColumn
from navigation.api import register_model_list_columns
from rest_api.classes import APIEndPoint from rest_api.classes import APIEndPoint
from .links import ( from .links import (
@@ -36,6 +35,11 @@ class TagsApp(MayanAppConfig):
APIEndPoint('tags') APIEndPoint('tags')
SourceColumn(source=Document, label=_('Tags'), attribute=encapsulate(lambda document: get_tags_inline_widget_simple(document)))
SourceColumn(source=Tag, label=_('Preview'), attribute=encapsulate(lambda tag: single_tag_widget(tag)))
SourceColumn(source=Tag, label=_('Tagged items'), attribute=encapsulate(lambda tag: tag.documents.count()))
class_permissions(Document, [ class_permissions(Document, [
PERMISSION_TAG_ATTACH, PERMISSION_TAG_REMOVE, PERMISSION_TAG_ATTACH, PERMISSION_TAG_REMOVE,
]) ])
@@ -51,21 +55,3 @@ class TagsApp(MayanAppConfig):
menu_object.bind_links(links=[link_tag_tagged_item_list, link_tag_edit, link_tag_acl_list, link_tag_delete], sources=[Tag]) menu_object.bind_links(links=[link_tag_tagged_item_list, link_tag_edit, link_tag_acl_list, link_tag_delete], sources=[Tag])
menu_secondary.bind_links(links=[link_tag_list, link_tag_create], sources=[Tag, 'tags:tag_list', 'tags:tag_create']) menu_secondary.bind_links(links=[link_tag_list, link_tag_create], sources=[Tag, 'tags:tag_list', 'tags:tag_create'])
menu_sidebar.bind_links(links=[link_tag_attach], sources=['tags:document_tags', 'tags:tag_remove', 'tags:tag_multiple_remove', 'tags:tag_attach']) menu_sidebar.bind_links(links=[link_tag_attach], sources=['tags:document_tags', 'tags:tag_remove', 'tags:tag_multiple_remove', 'tags:tag_attach'])
register_model_list_columns(Document, [
{
'name': _('Tags'), 'attribute':
encapsulate(lambda x: get_tags_inline_widget_simple(x))
},
])
register_model_list_columns(Tag, [
{
'name': _('Preview'),
'attribute': encapsulate(lambda x: single_tag_widget(x))
},
{
'name': _('Tagged items'),
'attribute': encapsulate(lambda x: x.documents.count())
}
])