diff --git a/HISTORY.rst b/HISTORY.rst index 3f6b76ef57..a1e0d9c15a 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -87,6 +87,10 @@ - Add support for the fillcolor argument to the rotate transformation. - Sort documents by label. +- Add recently added document list view. The setting + DOCUMENTS_RECENT_COUNT has been renamed to + DOCUMENTS_RECENT_ACCESS_COUNT. New setting + DOCUMENTS_RECENT_ADDED_COUNT added. 3.0.3 (2018-08-17) ================== diff --git a/mayan/apps/documents/apps.py b/mayan/apps/documents/apps.py index a213e9124f..981612ce5d 100644 --- a/mayan/apps/documents/apps.py +++ b/mayan/apps/documents/apps.py @@ -56,8 +56,9 @@ from .links import ( link_document_document_type_edit, link_document_duplicates_list, link_document_multiple_document_type_edit, link_document_download, link_document_edit, link_document_list, link_document_list_deleted, - link_document_list_recent, link_document_multiple_delete, - link_document_multiple_trash, link_document_multiple_clear_transformations, + link_document_list_recent_access, link_document_list_recent_added, + link_document_multiple_delete, link_document_multiple_trash, + link_document_multiple_clear_transformations, link_document_multiple_download, link_document_multiple_restore, link_document_multiple_update_page_count, link_document_page_navigation_first, link_document_page_navigation_last, @@ -393,7 +394,8 @@ class DocumentsApp(MayanAppConfig): menu_documents.bind_links( links=( - link_document_list_recent, link_document_list, + link_document_list_recent_access, + link_document_list_recent_added, link_document_list, link_document_list_deleted, link_duplicated_document_list ) ) diff --git a/mayan/apps/documents/icons.py b/mayan/apps/documents/icons.py index 396a95b9dc..882e5bf7ba 100644 --- a/mayan/apps/documents/icons.py +++ b/mayan/apps/documents/icons.py @@ -23,7 +23,12 @@ icon_document_duplicates_list = Icon( ) icon_document_list = Icon(driver_name='fontawesome', symbol='file') icon_document_list_deleted = Icon(driver_name='fontawesome', symbol='trash') -icon_document_list_recent = Icon(driver_name='fontawesome', symbol='clock') +icon_document_list_recent_access = Icon( + driver_name='fontawesome', symbol='clock' +) +icon_document_list_recent_added = Icon( + driver_name='fontawesome', symbol='asterisk' +) icon_document_page_navigation_first = Icon( driver_name='fontawesome', symbol='step-backward' ) diff --git a/mayan/apps/documents/links.py b/mayan/apps/documents/links.py index 63aa40db11..ea1cb8206e 100644 --- a/mayan/apps/documents/links.py +++ b/mayan/apps/documents/links.py @@ -9,16 +9,16 @@ from navigation import Link from .icons import ( icon_clear_image_cache, icon_document_duplicates_list, icon_document_list, - icon_document_list_deleted, icon_document_list_recent, - icon_document_page_navigation_first, icon_document_page_navigation_last, - icon_document_page_navigation_next, icon_document_page_navigation_previous, - icon_document_page_return, icon_document_page_rotate_left, - icon_document_page_rotate_right, icon_document_page_zoom_in, - icon_document_page_zoom_out, icon_document_pages, icon_document_preview, - icon_document_properties, icon_document_type_setup, - icon_document_version_list, icon_document_version_return_document, - icon_document_version_return_list, icon_duplicated_document_list, - icon_duplicated_document_scan + icon_document_list_deleted, icon_document_list_recent_access, + icon_document_list_recent_added, icon_document_page_navigation_first, + icon_document_page_navigation_last, icon_document_page_navigation_next, + icon_document_page_navigation_previous, icon_document_page_return, + icon_document_page_rotate_left, icon_document_page_rotate_right, + icon_document_page_zoom_in, icon_document_page_zoom_out, + icon_document_pages, icon_document_preview, icon_document_properties, + icon_document_type_setup, icon_document_version_list, + icon_document_version_return_document, icon_document_version_return_list, + icon_duplicated_document_list, icon_duplicated_document_scan ) from .permissions import ( permission_document_delete, permission_document_download, @@ -189,9 +189,13 @@ link_document_list = Link( icon_class=icon_document_list, text=_('All documents'), view='documents:document_list' ) -link_document_list_recent = Link( - icon_class=icon_document_list_recent, text=_('Recent documents'), - view='documents:document_list_recent' +link_document_list_recent_access = Link( + icon_class=icon_document_list_recent_access, text=_('Recently accessed'), + view='documents:document_list_recent_access' +) +link_document_list_recent_added = Link( + icon_class=icon_document_list_recent_added, text=_('Recently added'), + view='documents:document_list_recent_added' ) link_document_list_deleted = Link( icon_class=icon_document_list_deleted, text=_('Trash can'), diff --git a/mayan/apps/documents/managers.py b/mayan/apps/documents/managers.py index 593448b9fa..8bbaaa6c59 100644 --- a/mayan/apps/documents/managers.py +++ b/mayan/apps/documents/managers.py @@ -11,7 +11,7 @@ from django.utils.encoding import force_text from django.utils.timezone import now from .literals import STUB_EXPIRATION_INTERVAL -from .settings import setting_recent_count +from .settings import setting_recent_access_count logger = logging.getLogger(__name__) @@ -199,7 +199,7 @@ class RecentDocumentManager(models.Manager): # accessed date and time update new_recent.save() - recent_to_delete = self.filter(user=user).values_list('pk', flat=True)[setting_recent_count.value:] + recent_to_delete = self.filter(user=user).values_list('pk', flat=True)[setting_recent_access_count.value:] self.filter(pk__in=list(recent_to_delete)).delete() return new_recent diff --git a/mayan/apps/documents/settings.py b/mayan/apps/documents/settings.py index f0927f8892..27ecce1766 100644 --- a/mayan/apps/documents/settings.py +++ b/mayan/apps/documents/settings.py @@ -83,11 +83,17 @@ setting_print_height = namespace.add_setting( setting_print_width = namespace.add_setting( global_name='DOCUMENTS_PRINT_WIDTH', default='3600' ) -setting_recent_count = namespace.add_setting( - global_name='DOCUMENTS_RECENT_COUNT', default=40, +setting_recent_access_count = namespace.add_setting( + global_name='DOCUMENTS_RECENT_ACCESS_COUNT', default=40, help_text=_( - 'Maximum number of recent (created, edited, viewed) documents to ' - 'remember per user.' + 'Maximum number of recently accessed (created, edited, viewed) ' + 'documents to remember per user.' + ) +) +setting_recent_added_count = namespace.add_setting( + global_name='DOCUMENTS_RECENT_ADDED_COUNT', default=40, + help_text=_( + 'Maximum number of recently created documents to show.' ) ) setting_rotation_step = namespace.add_setting( diff --git a/mayan/apps/documents/urls.py b/mayan/apps/documents/urls.py index 6ae245f96e..55b66feb46 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -32,15 +32,20 @@ from .views import ( DocumentVersionDownloadFormView, DocumentVersionDownloadView, DocumentVersionListView, DocumentVersionRevertView, DocumentVersionView, DocumentView, DuplicatedDocumentListView, EmptyTrashCanView, - RecentDocumentListView, ScanDuplicatedDocuments + RecentAccessDocumentListView, RecentAddedDocumentListView, + ScanDuplicatedDocuments ) urlpatterns = [ url(r'^list/$', DocumentListView.as_view(), name='document_list'), url( - r'^list/recent/$', RecentDocumentListView.as_view(), - name='document_list_recent' + r'^list/recent_access/$', RecentAccessDocumentListView.as_view(), + name='document_list_recent_access' + ), + url( + r'^list/recent_added/$', RecentAddedDocumentListView.as_view(), + name='document_list_recent_added' ), url( r'^list/deleted/$', DeletedDocumentListView.as_view(), diff --git a/mayan/apps/documents/views/document_views.py b/mayan/apps/documents/views/document_views.py index d980aaa940..51ee22c817 100644 --- a/mayan/apps/documents/views/document_views.py +++ b/mayan/apps/documents/views/document_views.py @@ -41,7 +41,9 @@ from ..permissions import ( permission_document_trash, permission_document_view, permission_empty_trash ) -from ..settings import setting_print_width, setting_print_height +from ..settings import ( + setting_print_width, setting_print_height, setting_recent_added_count +) from ..tasks import task_delete_document, task_update_page_count from ..utils import parse_range @@ -50,6 +52,7 @@ logger = logging.getLogger(__name__) class DocumentListView(SingleObjectListView): object_permission = permission_document_view + queryset_slice = None def get_document_queryset(self): return Document.objects.defer( @@ -65,8 +68,11 @@ class DocumentListView(SingleObjectListView): } def get_object_list(self): - return self.get_document_queryset().filter(is_stub=False) - + queryset = self.get_document_queryset().filter(is_stub=False) + if self.queryset_slice: + return queryset.__getitem__(slice(*self.queryset_slice)) + else: + return queryset class DeletedDocumentDeleteView(ConfirmView): extra_context = { @@ -384,20 +390,6 @@ class EmptyTrashCanView(ConfirmView): messages.success(self.request, _('Trash emptied successfully')) -class RecentDocumentListView(DocumentListView): - def get_document_queryset(self): - return RecentDocument.objects.get_for_user(self.request.user) - - def get_extra_context(self): - context = super(RecentDocumentListView, self).get_extra_context() - context.update( - { - 'title': _('Recent documents'), - } - ) - return context - - class DocumentDownloadFormView(FormView): form_class = DocumentDownloadForm model = Document @@ -819,3 +811,33 @@ class DuplicatedDocumentListView(DocumentListView): } ) return context + + +class RecentAccessDocumentListView(DocumentListView): + def get_document_queryset(self): + return RecentDocument.objects.get_for_user(self.request.user) + + def get_extra_context(self): + context = super(RecentAccessDocumentListView, self).get_extra_context() + context.update( + { + 'title': _('Recently accessed'), + } + ) + return context + + +class RecentAddedDocumentListView(DocumentListView): + queryset_slice = (0, setting_recent_added_count.value) + + def get_document_queryset(self): + return Document.objects.order_by('-date_added') + + def get_extra_context(self): + context = super(RecentAddedDocumentListView, self).get_extra_context() + context.update( + { + 'title': _('Recently added'), + } + ) + return context