From 395fe0cb98e2068960012cbbee795e9e21521f6f Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 30 May 2016 06:10:08 -0400 Subject: [PATCH] Finish conversion of the documents app to support organizations. --- mayan/apps/documents/api_views.py | 20 ++-- mayan/apps/documents/apps.py | 2 +- mayan/apps/documents/handlers.py | 2 +- mayan/apps/documents/managers.py | 33 ++++++- mayan/apps/documents/models.py | 9 ++ mayan/apps/documents/serializers.py | 2 +- mayan/apps/documents/tasks.py | 12 +-- mayan/apps/documents/tests/test_api.py | 5 +- mayan/apps/documents/tests/test_links.py | 4 +- mayan/apps/documents/tests/test_models.py | 22 ++--- .../tests/test_organization_views.py | 2 +- mayan/apps/documents/tests/test_views.py | 92 +++++++++---------- mayan/apps/documents/views.py | 28 ++++-- 13 files changed, 142 insertions(+), 91 deletions(-) diff --git a/mayan/apps/documents/api_views.py b/mayan/apps/documents/api_views.py index 644c804f22..51cb23ea51 100644 --- a/mayan/apps/documents/api_views.py +++ b/mayan/apps/documents/api_views.py @@ -103,7 +103,7 @@ class APIDocumentDownloadView(generics.RetrieveAPIView): 'GET': (permission_document_download,) } permission_classes = (MayanPermission,) - queryset = Document.objects.all() + queryset = Document.on_organization.all() def get_serializer_class(self): return None @@ -127,7 +127,7 @@ class APIDocumentListView(generics.ListCreateAPIView): mayan_object_permissions = {'GET': (permission_document_view,)} mayan_view_permissions = {'POST': (permission_document_create,)} permission_classes = (MayanPermission,) - queryset = Document.objects.all() + queryset = Document.on_organization.all() def get_serializer_class(self): if self.request.method == 'GET': @@ -162,7 +162,7 @@ class APIDocumentVersionDownloadView(generics.RetrieveAPIView): 'GET': (permission_document_download,) } permission_classes = (MayanPermission,) - queryset = DocumentVersion.objects.all() + queryset = DocumentVersion.on_organization.all() def get_serializer_class(self): return None @@ -189,7 +189,7 @@ class APIDocumentView(generics.RetrieveUpdateDestroyAPIView): 'DELETE': (permission_document_trash,) } permission_classes = (MayanPermission,) - queryset = Document.objects.all() + queryset = Document.on_organization.all() serializer_class = DocumentSerializer def delete(self, *args, **kwargs): @@ -233,7 +233,7 @@ class APIDocumentPageImageView(generics.RetrieveAPIView): } mayan_permission_attribute_check = 'document' permission_classes = (MayanPermission,) - queryset = DocumentPage.objects.all() + queryset = DocumentPage.on_organization.all() serializer_class = DocumentPageImageSerializer @@ -249,7 +249,7 @@ class APIDocumentPageView(generics.RetrieveUpdateAPIView): } mayan_permission_attribute_check = 'document' permission_classes = (MayanPermission,) - queryset = DocumentPage.objects.all() + queryset = DocumentPage.on_organization.all() serializer_class = DocumentPageSerializer def get(self, *args, **kwargs): @@ -279,7 +279,7 @@ class APIDocumentTypeListView(generics.ListCreateAPIView): mayan_object_permissions = {'GET': (permission_document_type_view,)} mayan_view_permissions = {'POST': (permission_document_type_create,)} permission_classes = (MayanPermission,) - queryset = DocumentType.objects.all() + queryset = DocumentType.on_organization.all() serializer_class = DocumentTypeSerializer def get(self, *args, **kwargs): @@ -309,7 +309,7 @@ class APIDocumentTypeView(generics.RetrieveUpdateDestroyAPIView): 'DELETE': (permission_document_type_delete,) } permission_classes = (MayanPermission,) - queryset = DocumentType.objects.all() + queryset = DocumentType.on_organization.all() serializer_class = DocumentTypeSerializer def delete(self, *args, **kwargs): @@ -435,7 +435,7 @@ class APIDocumentVersionView(generics.RetrieveUpdateAPIView): } mayan_permission_attribute_check = 'document' permission_classes = (MayanPermission,) - queryset = DocumentVersion.objects.all() + queryset = DocumentVersion.on_organization.all() serializer_class = DocumentVersionSerializer def patch(self, *args, **kwargs): @@ -463,7 +463,7 @@ class APIDocumentVersionRevertView(generics.GenericAPIView): } mayan_permission_attribute_check = 'document' permission_classes = (MayanPermission,) - queryset = DocumentVersion.objects.all() + queryset = DocumentVersion.on_organization.all() serializer_class = DocumentVersionRevertSerializer def post(self, *args, **kwargs): diff --git a/mayan/apps/documents/apps.py b/mayan/apps/documents/apps.py index 2d4c6abda5..53528219bb 100644 --- a/mayan/apps/documents/apps.py +++ b/mayan/apps/documents/apps.py @@ -99,7 +99,7 @@ class DocumentsApp(MayanAppConfig): description=_( 'Every uploaded document must be assigned a document type, ' 'it is the basic way Mayan EDMS categorizes documents.' - ), condition=lambda: not DocumentType.objects.exists(), + ), condition=lambda: not DocumentType.on_organization.exists(), view='documents:document_type_list' ) diff --git a/mayan/apps/documents/handlers.py b/mayan/apps/documents/handlers.py index d4c82f861b..c28a56f45a 100644 --- a/mayan/apps/documents/handlers.py +++ b/mayan/apps/documents/handlers.py @@ -11,7 +11,7 @@ def create_default_document_type(sender, **kwargs): app_label='documents', model_name='DocumentType' ) - if not DocumentType.objects.count(): + if not DocumentType.on_organization.count(): document_type = DocumentType.objects.create( label=DEFAULT_DOCUMENT_TYPE_LABEL ) diff --git a/mayan/apps/documents/managers.py b/mayan/apps/documents/managers.py index 73c7097e42..d5e24671fb 100644 --- a/mayan/apps/documents/managers.py +++ b/mayan/apps/documents/managers.py @@ -132,6 +132,28 @@ class OrganizationDocumentVersionManager(models.Manager): ) +class OrganizationDocumentTypeFilenameManager(models.Manager): + def get_queryset(self): + DocumentType = apps.get_model('documents', 'DocumentType') + + return super( + OrganizationDocumentTypeFilenameManager, self + ).get_queryset().filter( + document_type__in=DocumentType.on_organization.all() + ) + + +class OrganizationDocumentPage(models.Manager): + def get_queryset(self): + DocumentType = apps.get_model('documents', 'DocumentType') + + return super( + OrganizationDocumentPage, self + ).get_queryset().filter( + document_version__document__document_type__in=DocumentType.on_organization.all() + ) + + class RecentDocumentManager(models.Manager): def add_document_for_user(self, user, document): if user.is_authenticated(): @@ -155,7 +177,7 @@ class RecentDocumentManager(models.Manager): recentdocument__user=user, ).order_by('-recentdocument__datetime_accessed') else: - return document_model.objects.none() + return Document.objects.none() class TrashedDocumentManager(models.Manager): @@ -164,6 +186,15 @@ class TrashedDocumentManager(models.Manager): return super( TrashedDocumentManager, self + ).get_queryset().filter(in_trash=True) + + +class OrganizationTrashedDocumentManager(models.Manager): + def get_queryset(self): + DocumentType = apps.get_model('documents', 'DocumentType') + + return super( + OrganizationTrashedDocumentManager, self ).get_queryset().filter(in_trash=True).filter( document_type__in=DocumentType.on_organization.all() ) diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index e04cc34894..58d14716a8 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -38,6 +38,8 @@ from .literals import DEFAULT_DELETE_PERIOD, DEFAULT_DELETE_TIME_UNIT from .managers import ( DocumentManager, DocumentTypeManager, NewVersionBlockManager, OrganizationDocumentManager, OrganizationDocumentVersionManager, + OrganizationTrashedDocumentManager, + OrganizationDocumentTypeFilenameManager, OrganizationDocumentPage, RecentDocumentManager, TrashedDocumentManager ) from .permissions import permission_document_view @@ -339,6 +341,7 @@ class Document(models.Model): class TrashedDocument(Document): objects = TrashedDocumentManager() + on_organization = OrganizationTrashedDocumentManager() class Meta: proxy = True @@ -643,6 +646,9 @@ class DocumentTypeFilename(models.Model): ) enabled = models.BooleanField(default=True, verbose_name=_('Enabled')) + objects = models.Manager() + on_organization = OrganizationDocumentTypeFilenameManager() + class Meta: ordering = ('filename',) unique_together = ('document_type', 'filename') @@ -667,6 +673,9 @@ class DocumentPage(models.Model): verbose_name=_('Page number') ) + objects = models.Manager() + on_organization = OrganizationDocumentPage() + def __str__(self): return _( 'Page %(page_num)d out of %(total_pages)d of %(document)s' diff --git a/mayan/apps/documents/serializers.py b/mayan/apps/documents/serializers.py index bf6294944c..77db0f3253 100644 --- a/mayan/apps/documents/serializers.py +++ b/mayan/apps/documents/serializers.py @@ -130,7 +130,7 @@ class NewDocumentSerializer(serializers.ModelSerializer): file = serializers.FileField(write_only=True) def save(self, _user): - document = Document.objects.create( + document = Document.on_organization.create( description=self.validated_data.get('description', ''), document_type=self.validated_data['document_type'], label=self.validated_data.get( diff --git a/mayan/apps/documents/tasks.py b/mayan/apps/documents/tasks.py index 49f00c8fde..f5cfa1888b 100644 --- a/mayan/apps/documents/tasks.py +++ b/mayan/apps/documents/tasks.py @@ -62,7 +62,7 @@ def task_get_document_page_image(document_page_id, *args, **kwargs): app_label='documents', model_name='DocumentPage' ) - document_page = DocumentPage.objects.get(pk=document_page_id) + document_page = DocumentPage.on_organization.get(pk=document_page_id) return document_page.get_image(*args, **kwargs) @@ -72,7 +72,7 @@ def task_update_page_count(self, version_id): app_label='documents', model_name='DocumentVersion' ) - document_version = DocumentVersion.objects.get(pk=version_id) + document_version = DocumentVersion.on_organization.get(pk=version_id) try: document_version.update_page_count() except OperationalError as exception: @@ -95,12 +95,12 @@ def task_upload_new_document(self, document_type_id, shared_uploaded_file_id, de ) try: - document_type = DocumentType.objects.get(pk=document_type_id) + document_type = DocumentType.on_organization.get(pk=document_type_id) shared_file = SharedUploadedFile.objects.get( pk=shared_uploaded_file_id ) if user_id: - user = get_user_model().objects.get(pk=user_id) + user = get_user_model().on_organization.get(pk=user_id) else: user = None @@ -149,12 +149,12 @@ def task_upload_new_version(self, document_id, shared_uploaded_file_id, user_id, ) try: - document = Document.objects.get(pk=document_id) + document = Document.on_organization.get(pk=document_id) shared_file = SharedUploadedFile.objects.get( pk=shared_uploaded_file_id ) if user_id: - user = get_user_model().objects.get(pk=user_id) + user = get_user_model().on_organization.get(pk=user_id) else: user = None diff --git a/mayan/apps/documents/tests/test_api.py b/mayan/apps/documents/tests/test_api.py index ce7fadc6aa..571c9b7eb0 100644 --- a/mayan/apps/documents/tests/test_api.py +++ b/mayan/apps/documents/tests/test_api.py @@ -35,7 +35,7 @@ class DocumentTypeAPITestCase(APITestCase): def setUp(self): create_default_organization() - self.admin_user = get_user_model().create_superuser( + self.admin_user = get_user_model().objects.create_superuser( username=TEST_ADMIN_USERNAME, email=TEST_ADMIN_EMAIL, password=TEST_ADMIN_PASSWORD ) @@ -58,7 +58,8 @@ class DocumentTypeAPITestCase(APITestCase): self.assertEqual(DocumentType.on_organization.all().count(), 1) self.assertEqual( - DocumentType.objects.all().first().label, TEST_DOCUMENT_TYPE + DocumentType.on_organization.all().first().label, + TEST_DOCUMENT_TYPE ) def test_document_type_edit_via_put(self): diff --git a/mayan/apps/documents/tests/test_links.py b/mayan/apps/documents/tests/test_links.py index 3cf8e04445..a09b2bec2f 100644 --- a/mayan/apps/documents/tests/test_links.py +++ b/mayan/apps/documents/tests/test_links.py @@ -49,7 +49,7 @@ class DocumentsLinksTestCase(GenericDocumentViewTestCase): self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) - acl = AccessControlList.objects.create( + acl = AccessControlList.on_organization.create( content_object=self.document, role=self.role ) acl.permissions.add( @@ -81,7 +81,7 @@ class DocumentsLinksTestCase(GenericDocumentViewTestCase): def test_document_version_download_link_with_permission(self): self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) - acl = AccessControlList.objects.create( + acl = AccessControlList.on_organization.create( content_object=self.document, role=self.role ) acl.permissions.add(permission_document_download.stored_permission) diff --git a/mayan/apps/documents/tests/test_models.py b/mayan/apps/documents/tests/test_models.py index 2fce77f470..7a65db7c11 100644 --- a/mayan/apps/documents/tests/test_models.py +++ b/mayan/apps/documents/tests/test_models.py @@ -64,12 +64,12 @@ class DocumentTestCase(TestCase): # Trash the document self.document.delete() - self.assertEqual(TrashedDocument.objects.count(), 1) + self.assertEqual(TrashedDocument.on_organization.count(), 1) self.assertEqual(Document.on_organization.count(), 0) # Restore the document self.document.restore() - self.assertEqual(TrashedDocument.objects.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 0) self.assertEqual(Document.on_organization.count(), 1) def test_trashing_documents(self): @@ -77,12 +77,12 @@ class DocumentTestCase(TestCase): # Trash the document self.document.delete() - self.assertEqual(TrashedDocument.objects.count(), 1) + self.assertEqual(TrashedDocument.on_organization.count(), 1) self.assertEqual(Document.on_organization.count(), 0) # Delete the document self.document.delete() - self.assertEqual(TrashedDocument.objects.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 0) self.assertEqual(Document.on_organization.count(), 0) def test_auto_trashing(self): @@ -101,12 +101,12 @@ class DocumentTestCase(TestCase): time.sleep(2) self.assertEqual(Document.on_organization.count(), 1) - self.assertEqual(TrashedDocument.objects.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 0) DocumentType.objects.check_trash_periods() self.assertEqual(Document.on_organization.count(), 0) - self.assertEqual(TrashedDocument.objects.count(), 1) + self.assertEqual(TrashedDocument.on_organization.count(), 1) def test_auto_delete(self): """ @@ -120,12 +120,12 @@ class DocumentTestCase(TestCase): self.document_type.save() self.assertEqual(Document.on_organization.count(), 1) - self.assertEqual(TrashedDocument.objects.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 0) self.document.delete() self.assertEqual(Document.on_organization.count(), 0) - self.assertEqual(TrashedDocument.objects.count(), 1) + self.assertEqual(TrashedDocument.on_organization.count(), 1) # Needed by MySQL as milliseconds value is not store in timestamp # field @@ -134,7 +134,7 @@ class DocumentTestCase(TestCase): DocumentType.objects.check_delete_periods() self.assertEqual(Document.on_organization.count(), 0) - self.assertEqual(TrashedDocument.objects.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 0) @override_settings(OCR_AUTO_OCR=False) @@ -259,7 +259,7 @@ class DocumentManagerTestCase(TestCase): Document.objects.delete_stubs() - self.assertEqual(Document.objects.count(), 1) + self.assertEqual(Document.on_organization.count(), 1) document_stub.date_added = document_stub.date_added - timedelta( seconds=STUB_EXPIRATION_INTERVAL + 1 @@ -268,7 +268,7 @@ class DocumentManagerTestCase(TestCase): Document.objects.delete_stubs() - self.assertEqual(Document.objects.count(), 0) + self.assertEqual(Document.on_organization.count(), 0) @override_settings(OCR_AUTO_OCR=False) diff --git a/mayan/apps/documents/tests/test_organization_views.py b/mayan/apps/documents/tests/test_organization_views.py index 3aa5aed7c5..982fd22525 100644 --- a/mayan/apps/documents/tests/test_organization_views.py +++ b/mayan/apps/documents/tests/test_organization_views.py @@ -49,7 +49,7 @@ class DocumentOrganizationViewTestCase(OrganizationViewTestCase): def test_document_document_type_change_view(self): with self.settings(ORGANIZATION_ID=self.organization_b.pk): - document_type = DocumentType.objects.create( + document_type = DocumentType.on_organization.create( label=TEST_DOCUMENT_TYPE_2_LABEL ) diff --git a/mayan/apps/documents/tests/test_views.py b/mayan/apps/documents/tests/test_views.py index 592f21ce28..8d52c76c48 100644 --- a/mayan/apps/documents/tests/test_views.py +++ b/mayan/apps/documents/tests/test_views.py @@ -39,7 +39,7 @@ from .literals import ( class GenericDocumentViewTestCase(GenericViewTestCase): def setUp(self): super(GenericDocumentViewTestCase, self).setUp() - self.document_type = DocumentType.objects.create( + self.document_type = DocumentType.on_organization.create( label=TEST_DOCUMENT_TYPE ) @@ -111,7 +111,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.document.document_type, self.document_type ) - document_type = DocumentType.objects.create( + document_type = DocumentType.on_organization.create( label=TEST_DOCUMENT_TYPE_2_LABEL ) @@ -124,7 +124,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 403) self.assertEqual( - Document.objects.get(pk=self.document.pk).document_type, + Document.on_organization.get(pk=self.document.pk).document_type, self.document_type ) @@ -137,7 +137,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.document.document_type, self.document_type ) - document_type = DocumentType.objects.create( + document_type = DocumentType.on_organization.create( label=TEST_DOCUMENT_TYPE_2_LABEL ) @@ -156,7 +156,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertContains(response, text='success', status_code=200) self.assertEqual( - Document.objects.get(pk=self.document.pk).document_type, + Document.on_organization.get(pk=self.document.pk).document_type, document_type ) @@ -166,10 +166,10 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): ) self.assertEqual( - Document.objects.first().document_type, self.document_type + Document.on_organization.first().document_type, self.document_type ) - document_type = DocumentType.objects.create( + document_type = DocumentType.on_organization.create( label=TEST_DOCUMENT_TYPE_2_LABEL ) @@ -184,7 +184,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 302) self.assertEqual( - Document.objects.first().document_type, self.document_type + Document.on_organization.first().document_type, self.document_type ) def test_document_multiple_document_type_change_view_with_permission(self): @@ -193,10 +193,10 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): ) self.assertEqual( - Document.objects.first().document_type, self.document_type + Document.on_organization.first().document_type, self.document_type ) - document_type = DocumentType.objects.create( + document_type = DocumentType.on_organization.create( label=TEST_DOCUMENT_TYPE_2_LABEL ) @@ -218,7 +218,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 200) self.assertEqual( - Document.objects.first().document_type, document_type + Document.on_organization.first().document_type, document_type ) def test_document_download_user_view(self): @@ -226,7 +226,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD ) - self.assertEqual(Document.objects.count(), 1) + self.assertEqual(Document.on_organization.count(), 1) response = self.post( 'documents:document_download', args=(self.document.pk,) @@ -258,7 +258,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD ) - self.assertEqual(Document.objects.count(), 1) + self.assertEqual(Document.on_organization.count(), 1) response = self.post( 'documents:document_multiple_download', @@ -292,7 +292,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD ) - self.assertEqual(Document.objects.count(), 1) + self.assertEqual(Document.on_organization.count(), 1) response = self.post( 'documents:document_version_download', args=( @@ -482,20 +482,20 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): def test_trash_can_empty_view_no_permissions(self): self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) self.document.delete() - self.assertEqual(TrashedDocument.objects.count(), 1) + self.assertEqual(TrashedDocument.on_organization.count(), 1) response = self.post('documents:trash_can_empty') self.assertEqual(response.status_code, 403) - self.assertEqual(TrashedDocument.objects.count(), 1) + self.assertEqual(TrashedDocument.on_organization.count(), 1) def test_trash_can_empty_view_with_permission(self): self.login( username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD ) self.document.delete() - self.assertEqual(TrashedDocument.objects.count(), 1) + self.assertEqual(TrashedDocument.on_organization.count(), 1) self.role.permissions.add( permission_empty_trash.stored_permission @@ -505,8 +505,8 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertContains( response, text='emptied successfully', status_code=200 ) - self.assertEqual(TrashedDocument.objects.count(), 0) - self.assertEqual(Document.objects.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 0) + self.assertEqual(Document.on_organization.count(), 0) def test_document_version_revert_no_permission(self): first_version = self.document.latest_version @@ -556,7 +556,7 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): self.document_type.delete() - self.assertEqual(Document.objects.count(), 0) + self.assertEqual(Document.on_organization.count(), 0) response = self.post( 'documents:document_type_create', @@ -569,7 +569,7 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 403) - self.assertEqual(DocumentType.objects.count(), 0) + self.assertEqual(DocumentType.on_organization.count(), 0) def test_document_type_create_view_with_permission(self): self.login( @@ -578,7 +578,7 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): self.document_type.delete() - self.assertEqual(Document.objects.count(), 0) + self.assertEqual(Document.on_organization.count(), 0) self.role.permissions.add( permission_document_type_create.stored_permission @@ -598,9 +598,9 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): self.assertContains(response, text='successfully', status_code=200) - self.assertEqual(DocumentType.objects.count(), 1) + self.assertEqual(DocumentType.on_organization.count(), 1) self.assertEqual( - DocumentType.objects.first().label, TEST_DOCUMENT_TYPE + DocumentType.on_organization.first().label, TEST_DOCUMENT_TYPE ) def test_document_type_delete_view_no_permission(self): @@ -614,7 +614,7 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): ) self.assertEqual(response.status_code, 403) - self.assertEqual(DocumentType.objects.count(), 1) + self.assertEqual(DocumentType.on_organization.count(), 1) def test_document_type_delete_view_with_permission(self): self.login( @@ -634,7 +634,7 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): ) self.assertContains(response, 'successfully', status_code=200) - self.assertEqual(DocumentType.objects.count(), 0) + self.assertEqual(DocumentType.on_organization.count(), 0) def test_document_type_edit_view_no_permission(self): self.login( @@ -654,7 +654,7 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 403) self.assertEqual( - DocumentType.objects.get(pk=self.document_type.pk).label, + DocumentType.on_organization.get(pk=self.document_type.pk).label, TEST_DOCUMENT_TYPE ) @@ -683,7 +683,7 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): self.assertContains(response, 'successfully', status_code=200) self.assertEqual( - DocumentType.objects.get(pk=self.document_type.pk).label, + DocumentType.on_organization.get(pk=self.document_type.pk).label, TEST_DOCUMENT_TYPE_EDITED_LABEL ) @@ -730,21 +730,21 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD ) self.document.delete() - self.assertEqual(Document.objects.count(), 0) + self.assertEqual(Document.on_organization.count(), 0) response = self.post( 'documents:document_restore', args=(self.document.pk,) ) self.assertEqual(response.status_code, 403) - self.assertEqual(TrashedDocument.objects.count(), 1) - self.assertEqual(Document.objects.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 1) + self.assertEqual(Document.on_organization.count(), 0) def test_document_restore_view_with_permission(self): self.login( username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD ) self.document.delete() - self.assertEqual(Document.objects.count(), 0) + self.assertEqual(Document.on_organization.count(), 0) self.role.permissions.add( permission_document_restore.stored_permission ) @@ -753,8 +753,8 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): follow=True ) self.assertContains(response, text='restored', status_code=200) - self.assertEqual(TrashedDocument.objects.count(), 0) - self.assertEqual(Document.objects.count(), 1) + self.assertEqual(TrashedDocument.on_organization.count(), 0) + self.assertEqual(Document.on_organization.count(), 1) def test_document_trash_no_permissions(self): self.login( @@ -766,8 +766,8 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): ) self.assertEqual(response.status_code, 403) - self.assertEqual(TrashedDocument.objects.count(), 0) - self.assertEqual(Document.objects.count(), 1) + self.assertEqual(TrashedDocument.on_organization.count(), 0) + self.assertEqual(Document.on_organization.count(), 1) def test_document_trash_with_permissions(self): self.login( @@ -784,8 +784,8 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): ) self.assertContains(response, text='success', status_code=200) - self.assertEqual(TrashedDocument.objects.count(), 1) - self.assertEqual(Document.objects.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 1) + self.assertEqual(Document.on_organization.count(), 0) def test_document_delete_no_permissions(self): self.login( @@ -793,15 +793,15 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): ) self.document.delete() - self.assertEqual(Document.objects.count(), 0) - self.assertEqual(TrashedDocument.objects.count(), 1) + self.assertEqual(Document.on_organization.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 1) response = self.post( 'documents:document_delete', args=(self.document.pk,), ) self.assertEqual(response.status_code, 403) - self.assertEqual(Document.objects.count(), 0) - self.assertEqual(TrashedDocument.objects.count(), 1) + self.assertEqual(Document.on_organization.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 1) def test_document_delete_with_permissions(self): self.login( @@ -809,8 +809,8 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): ) self.document.delete() - self.assertEqual(Document.objects.count(), 0) - self.assertEqual(TrashedDocument.objects.count(), 1) + self.assertEqual(Document.on_organization.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 1) self.role.permissions.add( permission_document_delete.stored_permission @@ -822,8 +822,8 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): ) self.assertContains(response, text='success', status_code=200) - self.assertEqual(TrashedDocument.objects.count(), 0) - self.assertEqual(Document.objects.count(), 0) + self.assertEqual(TrashedDocument.on_organization.count(), 0) + self.assertEqual(Document.on_organization.count(), 0) def test_deleted_document_list_view_no_permissions(self): self.document.delete() diff --git a/mayan/apps/documents/views.py b/mayan/apps/documents/views.py index 9c5ccd0567..244d325be8 100644 --- a/mayan/apps/documents/views.py +++ b/mayan/apps/documents/views.py @@ -162,10 +162,12 @@ class DocumentRestoreManyView(MultipleInstanceActionMixin, DocumentRestoreView): extra_context = { 'title': _('Restore the selected documents?') } - model = TrashedDocument success_message = '%(count)d document restored.' success_message_plural = '%(count)d documents restored.' + def get_queryset(self): + return TrashedDocument.on_organization.all() + class DocumentPageListView(SingleObjectListView): def dispatch(self, request, *args, **kwargs): @@ -614,7 +616,7 @@ class EmptyTrashCanView(ConfirmView): view_permission = permission_empty_trash def view_action(self): - for deleted_document in TrashedDocument.objects.all(): + for deleted_document in TrashedDocument.on_organization.all(): deleted_document.delete() messages.success(self.request, _('Trash emptied successfully')) @@ -649,7 +651,7 @@ class TrashedDocumentListView(DocumentListView): permission_document_view, self.request.user, queryset ) - return TrashedDocument.objects.filter( + return TrashedDocument.on_organization.filter( pk__in=queryset.values_list('pk', flat=True) ) @@ -660,8 +662,11 @@ class TrashedDocumentDeleteView(ConfirmView): } def object_action(self, instance): + # Special case, we need to check the original document for the delete + # permission. Don't use .on_organization manager as it filters + # trashed documents and we don't want that. source_document = get_object_or_404( - Document.on_organization, pk=instance.pk + Document, pk=instance.pk ) try: @@ -676,7 +681,9 @@ class TrashedDocumentDeleteView(ConfirmView): instance.delete() def view_action(self): - instance = get_object_or_404(TrashedDocument, pk=self.kwargs['pk']) + instance = get_object_or_404( + TrashedDocument.on_organization, pk=self.kwargs['pk'] + ) self.object_action(instance=instance) messages.success( self.request, _('Document: %(document)s deleted.') % { @@ -689,10 +696,12 @@ class TrashedDocumentDeleteManyView(MultipleInstanceActionMixin, TrashedDocument extra_context = { 'title': _('Delete the selected documents?') } - model = TrashedDocument success_message = '%(count)d document deleted.' success_message_plural = '%(count)d documents deleted.' + def get_queryset(self): + return TrashedDocument.on_organization.all() + def document_document_type_edit(request, document_id=None, document_id_list=None): post_action_redirect = None @@ -847,11 +856,12 @@ def document_download(request, document_id=None, document_id_list=None, document ) ) - # TODO: check organization if document_version_pk: - queryset = DocumentVersion.objects.filter(pk=document_version_pk) + queryset = DocumentVersion.on_organization.filter( + pk=document_version_pk + ) else: - queryset = DocumentVersion.objects.filter( + queryset = DocumentVersion.on_organization.filter( pk__in=[document.latest_version.pk for document in documents] )