diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index a83156b979..f44b9b95aa 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -84,81 +84,75 @@ class DocumentIndexingApp(MayanAppConfig): ) ) - SourceColumn(source=Index, label=_('Label'), attribute='label') - SourceColumn(source=Index, label=_('Slug'), attribute='slug') + SourceColumn(attribute='label', is_identifier=True, source=Index) + SourceColumn(attribute='slug', source=Index) SourceColumn( - source=Index, label=_('Enabled'), func=lambda context: TwoStateWidget( state=context['object'].enabled - ).render() + ).render(), label=_('Enabled'), source=Index ) SourceColumn( - source=IndexInstance, label=_('Total levels'), func=lambda context: context[ 'object' - ].instance_root.get_descendants_count() + ].instance_root.get_descendants_count(), label=_('Total levels'), + source=IndexInstance, ) SourceColumn( - source=IndexInstance, label=_('Total documents'), func=lambda context: context[ 'object' ].instance_root.get_descendants_document_count( user=context['request'].user - ) + ), label=_('Total documents'), source=IndexInstance ) SourceColumn( - source=IndexTemplateNode, label=_('Level'), - func=lambda context: node_level(context['object']) + func=lambda context: node_level(context['object']), + label=_('Level'), source=IndexTemplateNode ) SourceColumn( - source=IndexTemplateNode, label=_('Enabled'), func=lambda context: TwoStateWidget( state=context['object'].enabled - ).render() + ).render(), label=_('Enabled'), source=IndexTemplateNode ) SourceColumn( - source=IndexTemplateNode, label=_('Has document links?'), func=lambda context: TwoStateWidget( state=context['object'].link_documents - ).render() + ).render(), label=_('Has document links?'), + source=IndexTemplateNode, ) SourceColumn( - source=IndexInstanceNode, label=_('Level'), - func=lambda context: index_instance_item_link(context['object']) + func=lambda context: index_instance_item_link(context['object']), + label=_('Level'), source=IndexInstanceNode ) SourceColumn( - source=IndexInstanceNode, label=_('Levels'), - func=lambda context: context['object'].get_descendants_count() + func=lambda context: context['object'].get_descendants_count(), + label=_('Levels'), source=IndexInstanceNode ) SourceColumn( - source=IndexInstanceNode, label=_('Documents'), func=lambda context: context[ 'object' ].get_descendants_document_count( user=context['request'].user - ) + ), label=_('Documents'), source=IndexInstanceNode ) SourceColumn( - source=DocumentIndexInstanceNode, label=_('Level'), func=lambda context: get_instance_link( index_instance_node=context['object'], - ) + ), label=_('Level'), source=DocumentIndexInstanceNode ) SourceColumn( - source=DocumentIndexInstanceNode, label=_('Levels'), - func=lambda context: context['object'].get_descendants_count() + func=lambda context: context['object'].get_descendants_count(), + label=_('Levels'), source=DocumentIndexInstanceNode ) SourceColumn( - source=DocumentIndexInstanceNode, label=_('Documents'), func=lambda context: context[ 'object' ].get_descendants_document_count( user=context['request'].user - ) + ), label=_('Documents'), source=DocumentIndexInstanceNode ) app.conf.task_queues.append( diff --git a/mayan/apps/document_states/apps.py b/mayan/apps/document_states/apps.py index bd7e61f4fd..a4cf5544df 100644 --- a/mayan/apps/document_states/apps.py +++ b/mayan/apps/document_states/apps.py @@ -133,58 +133,44 @@ class DocumentStatesApp(MayanAppConfig): ) SourceColumn( - source=Workflow, label=_('Label'), attribute='label' + attribute='label', is_identifier=True, source=Workflow ) SourceColumn( - source=Workflow, label=_('Internal name'), - attribute='internal_name' + attribute='internal_name', source=Workflow ) SourceColumn( - source=Workflow, label=_('Initial state'), - func=lambda context: context['object'].get_initial_state() or _('None') + attribute='get_initial_state', source=Workflow, ) SourceColumn( - source=WorkflowInstance, label=_('Current state'), - attribute='get_current_state' + attribute='get_current_state', source=WorkflowInstance ) SourceColumn( - source=WorkflowInstance, label=_('User'), - func=lambda context: getattr( - context['object'].get_last_log_entry(), 'user', _('None') - ) + attribute='get_last_transition_user', source=WorkflowInstance ) SourceColumn( - source=WorkflowInstance, label=_('Last transition'), - attribute='get_last_transition' + attribute='get_last_transition', source=WorkflowInstance ) SourceColumn( - source=WorkflowInstance, label=_('Date and time'), - func=lambda context: getattr( - context['object'].get_last_log_entry(), 'datetime', _('None') - ) + attribute='get_last_transition_datetime', kwargs={ + 'formatted': True + }, source=WorkflowInstance ) SourceColumn( - source=WorkflowInstance, label=_('Completion'), - func=lambda context: getattr( - context['object'].get_current_state(), 'completion', _('None') - ) + attribute='get_current_completion', source=WorkflowInstance ) SourceColumn( - source=WorkflowInstanceLogEntry, label=_('Date and time'), - attribute='datetime' + attribute='get_rendered_datetime', source=WorkflowInstanceLogEntry ) SourceColumn( - source=WorkflowInstanceLogEntry, label=_('User'), attribute='user' + attribute='user', source=WorkflowInstanceLogEntry ) SourceColumn( - source=WorkflowInstanceLogEntry, label=_('Transition'), - attribute='transition' + attribute='transition', source=WorkflowInstanceLogEntry ) SourceColumn( - source=WorkflowInstanceLogEntry, label=_('Comment'), - attribute='comment' + attribute='comment', source=WorkflowInstanceLogEntry ) SourceColumn( diff --git a/mayan/apps/document_states/models.py b/mayan/apps/document_states/models.py index e354b287f5..293f919398 100644 --- a/mayan/apps/document_states/models.py +++ b/mayan/apps/document_states/models.py @@ -13,6 +13,7 @@ from django.core.exceptions import PermissionDenied, ValidationError from django.core.files.base import ContentFile from django.db import IntegrityError, models from django.db.models import F, Max, Q +from django.template import Context, Template from django.urls import reverse from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.module_loading import import_string @@ -113,6 +114,8 @@ class Workflow(models.Model): except self.states.model.DoesNotExist: return None + get_initial_state.short_description = _('Initial state') + def launch_for(self, document): try: logger.info( @@ -408,6 +411,10 @@ class WorkflowInstance(models.Model): 'workflow_instance': self, } + def get_current_completion(self): + return self.get_current_state().completion + get_current_completion.short_description = _('Completion') + def get_current_state(self): """ Actual State - The current state of the workflow. If there are @@ -420,6 +427,8 @@ class WorkflowInstance(models.Model): except AttributeError: return self.workflow.get_initial_state() + get_current_state.short_description = _('Current state') + def get_last_log_entry(self): try: return self.log_entries.order_by('datetime').last() @@ -436,6 +445,28 @@ class WorkflowInstance(models.Model): except AttributeError: return None + get_last_transition.short_description = _('Last transition') + + def get_last_transition_datetime(self, formatted=False): + entry = self.get_last_log_entry() + if not entry: + return _('None') + else: + if formatted: + return entry.get_rendered_datetime() + else: + return entry.datetime + + get_last_transition_datetime.short_description = _('Date and time') + + def get_last_transition_user(self): + try: + return self.get_last_log_entry().user + except AttributeError: + return _('None') + + get_last_transition_user.short_description = _('User') + def get_transition_choices(self, _user=None): current_state = self.get_current_state() @@ -509,6 +540,13 @@ class WorkflowInstanceLogEntry(models.Model): if self.transition not in self.workflow_instance.get_transition_choices(_user=self.user): raise ValidationError(_('Not a valid transition choice.')) + def get_rendered_datetime(self): + return Template('{{ instance.datetime }}').render( + context=Context({'instance': self}) + ) + + get_rendered_datetime.short_description = _('Date and time') + def save(self, *args, **kwargs): result = super(WorkflowInstanceLogEntry, self).save(*args, **kwargs) context = self.workflow_instance.get_context() diff --git a/mayan/apps/documents/apps.py b/mayan/apps/documents/apps.py index 34bf7e17a0..06a0a9c4c2 100644 --- a/mayan/apps/documents/apps.py +++ b/mayan/apps/documents/apps.py @@ -237,107 +237,94 @@ class DocumentsApp(MayanAppConfig): # Document SourceColumn( - source=Document, label=_('Thumbnail'), func=lambda context: document_page_thumbnail_widget.render( instance=context['object'] - ) + ), label=_('Thumbnail'), source=Document ) SourceColumn( - source=Document, attribute='document_type' + attribute='document_type', label=_('Type'), source=Document ) SourceColumn( - source=Document, label=_('Pages'), - func=lambda context: widget_document_page_number( - document=context['object'] - ) + func=widget_document_page_number, label=_('Pages'), source=Document ) # DocumentPage SourceColumn( - source=DocumentPage, label=_('Thumbnail'), func=lambda context: document_page_thumbnail_widget.render( instance=context['object'] - ) + ), label=_('Thumbnail'), source=DocumentPage ) SourceColumn( - source=DocumentPageSearchResult, label=_('Thumbnail'), func=lambda context: document_page_thumbnail_widget.render( instance=context['object'] - ) + ), label=_('Thumbnail'), source=DocumentPageSearchResult ) SourceColumn( - source=DocumentPageSearchResult, label=_('Type'), - attribute='document_version.document.document_type' + attribute='document_version.document.document_type', + label=_('Type'), source=DocumentPageSearchResult ) # DocumentType SourceColumn( - source=DocumentType, label=_('Documents'), func=lambda context: context['object'].get_document_count( user=context['request'].user - ) + ), label=_('Documents'), source=DocumentType ) SourceColumn( - source=DocumentTypeFilename, label=_('Enabled'), func=lambda context: TwoStateWidget( state=context['object'].enabled - ).render() + ).render(), label=_('Enabled'), source=DocumentTypeFilename ) # DeletedDocument SourceColumn( - source=DeletedDocument, label=_('Thumbnail'), func=lambda context: document_page_thumbnail_widget.render( instance=context['object'] - ) + ), label=_('Thumbnail'), source=DeletedDocument ) SourceColumn( - source=DeletedDocument, attribute='document_type' + attribute='document_type', source=DeletedDocument ) SourceColumn( - source=DeletedDocument, attribute='deleted_date_time' + attribute='deleted_date_time', source=DeletedDocument ) # DocumentVersion SourceColumn( - source=DocumentVersion, label=_('Thumbnail'), func=lambda context: document_page_thumbnail_widget.render( instance=context['object'] - ) + ), label=_('Thumbnail'), source=DocumentVersion ) SourceColumn( - source=DocumentVersion, attribute='timestamp' + attribute='timestamp', source=DocumentVersion ) SourceColumn( - source=DocumentVersion, label=_('Pages'), - func=lambda context: widget_document_version_page_number( - document_version=context['object'] - ) + func=widget_document_version_page_number, label=_('Pages'), + source=DocumentVersion ) SourceColumn( - source=DocumentVersion, attribute='mimetype' + attribute='mimetype', source=DocumentVersion ) SourceColumn( - source=DocumentVersion, attribute='encoding' + attribute='encoding', source=DocumentVersion ) SourceColumn( - source=DocumentVersion, attribute='comment' + attribute='comment', source=DocumentVersion ) # DuplicatedDocument SourceColumn( - source=DuplicatedDocument, label=_('Thumbnail'), func=lambda context: document_page_thumbnail_widget.render( instance=context['object'].document - ) + ), label=_('Thumbnail'), source=DuplicatedDocument ) SourceColumn( - source=DuplicatedDocument, label=_('Duplicates'), - func=lambda context: context['object'].documents.count() + func=lambda context: context['object'].documents.count(), + label=_('Duplicates'), source=DuplicatedDocument ) app.conf.beat_schedule.update( diff --git a/mayan/apps/documents/widgets.py b/mayan/apps/documents/widgets.py index a1b7d5573a..1335b61c9e 100644 --- a/mayan/apps/documents/widgets.py +++ b/mayan/apps/documents/widgets.py @@ -77,9 +77,9 @@ def document_link(document): ) -def widget_document_page_number(document): - return mark_safe(s=_('Pages: %d') % document.pages.count()) +def widget_document_page_number(context): + return context['object'].pages.count() -def widget_document_version_page_number(document_version): - return mark_safe(s=_('Pages: %d') % document_version.pages.count()) +def widget_document_version_page_number(context): + return context['object'].pages.count() diff --git a/mayan/apps/tags/apps.py b/mayan/apps/tags/apps.py index 43f0e53c32..ba403298e4 100644 --- a/mayan/apps/tags/apps.py +++ b/mayan/apps/tags/apps.py @@ -101,38 +101,35 @@ class TagsApp(MayanAppConfig): ) SourceColumn( - source=DocumentTag, attribute='label' + attribute='label', source=DocumentTag, ) SourceColumn( - source=DocumentTag, attribute='get_preview_widget' + attribute='get_preview_widget', source=DocumentTag ) SourceColumn( - source=Document, label=_('Tags'), func=lambda context: widget_document_tags( document=context['object'], user=context['request'].user - ) + ), label=_('Tags'), source=Document ) SourceColumn( - source=DocumentPageSearchResult, label=_('Tags'), func=lambda context: widget_document_tags( document=context['object'].document, user=context['request'].user - ) + ), label=_('Tags'), source=DocumentPageSearchResult ) SourceColumn( - source=Tag, attribute='label' + attribute='label', is_identifier=True, source=Tag ) SourceColumn( - source=Tag, attribute='get_preview_widget' + attribute='get_preview_widget', source=Tag ) SourceColumn( - source=Tag, label=_('Documents'), func=lambda context: context['object'].get_document_count( user=context['request'].user - ) + ), label=_('Documents'), source=Tag ) document_page_search.add_model_field( diff --git a/mayan/apps/tags/widgets.py b/mayan/apps/tags/widgets.py index c9c622665d..4dc95af64e 100644 --- a/mayan/apps/tags/widgets.py +++ b/mayan/apps/tags/widgets.py @@ -46,7 +46,10 @@ def widget_document_tags(document, user): result.append('') - return mark_safe(''.join(result)) + if tags: + return mark_safe(''.join(result)) + else: + return '' def widget_single_tag(tag):