diff --git a/HISTORY.rst b/HISTORY.rst index 1fe8606021..8e5842a27f 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,3 +1,7 @@ +2.6.1 (2017-07-18) +================== +- Fix issue when editing or removing metadata from multiple documents. + 2.6 (2017-07-18) ================ - Fix HTML mark up in window title. GitLab #397. diff --git a/docs/releases/2.6.1.rst b/docs/releases/2.6.1.rst new file mode 100644 index 0000000000..4b30dea283 --- /dev/null +++ b/docs/releases/2.6.1.rst @@ -0,0 +1,69 @@ +============================= +Mayan EDMS v2.6 release notes +============================= + +Released: July 18, 2017 + +What's new +========== + +Other Changes +------------- +- Fix issue when editing or removing metadata from multiple documents. + +Removals +-------- +* None + +Upgrading from a previous version +--------------------------------- + +Using PIP +~~~~~~~~~ + +Type in the console:: + + $ pip install -U mayan-edms + +the requirements will also be updated automatically. + +Using Git +~~~~~~~~~ + +If you installed Mayan EDMS by cloning the Git repository issue the commands:: + + $ git reset --hard HEAD + $ git pull + +otherwise download the compressed archived and uncompress it overriding the +existing installation. + +Next upgrade/add the new requirements:: + + $ pip install --upgrade -r requirements.txt + +Common steps +~~~~~~~~~~~~ + +Migrate existing database schema with:: + + $ mayan-edms.py performupgrade + +Add new static media:: + + $ mayan-edms.py collectstatic --noinput + +The upgrade procedure is now complete. + + +Backward incompatible changes +============================= + +* None + +Bugs fixed or issues closed +=========================== + +* None + +.. _PyPI: https://pypi.python.org/pypi/mayan-edms/ diff --git a/docs/releases/index.rst b/docs/releases/index.rst index 22b95f705e..b35ec751c2 100644 --- a/docs/releases/index.rst +++ b/docs/releases/index.rst @@ -22,6 +22,7 @@ versions of the documentation contain the release notes for any later releases. .. toctree:: :maxdepth: 1 + 2.6.1 2.6 2.5.2 2.5.1 diff --git a/mayan/__init__.py b/mayan/__init__.py index 75d2421db4..68a55375a2 100644 --- a/mayan/__init__.py +++ b/mayan/__init__.py @@ -1,8 +1,8 @@ from __future__ import unicode_literals __title__ = 'Mayan EDMS' -__version__ = '2.6' -__build__ = 0x020600 +__version__ = '2.6.1' +__build__ = 0x020601 __author__ = 'Roberto Rosario' __author_email__ = 'roberto.rosario@mayan-edms.com' __description__ = 'Free Open Source Electronic Document Management System' diff --git a/mayan/apps/metadata/tests/test_views.py b/mayan/apps/metadata/tests/test_views.py index 90cff18893..23c16d62bf 100644 --- a/mayan/apps/metadata/tests/test_views.py +++ b/mayan/apps/metadata/tests/test_views.py @@ -19,7 +19,7 @@ from ..permissions import ( from .literals import ( TEST_DOCUMENT_METADATA_VALUE_2, TEST_METADATA_TYPE_LABEL, TEST_METADATA_TYPE_LABEL_2, TEST_METADATA_TYPE_NAME, - TEST_METADATA_TYPE_NAME_2 + TEST_METADATA_TYPE_NAME_2, TEST_METADATA_VALUE_EDITED ) @@ -195,7 +195,9 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase): file_object=File(file_object) ) - self.document.metadata.create(metadata_type=self.metadata_type) + document_metadata = self.document.metadata.create( + metadata_type=self.metadata_type + ) document_2.metadata.create(metadata_type=self.metadata_type) response = self.get( @@ -206,6 +208,69 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase): self.assertContains(response, 'Edit', status_code=200) + # Test post to metadata removal view + response = self.post( + 'metadata:metadata_multiple_edit', data={ + 'id_list': '{},{}'.format(self.document.pk, document_2.pk), + 'form-0-id': document_metadata.pk, + 'form-0-value': TEST_METADATA_VALUE_EDITED, + 'form-0-update': True, + 'form-TOTAL_FORMS': '1', + 'form-INITIAL_FORMS': '0', + 'form-MAX_NUM_FORMS': '', + }, follow=True + ) + + self.assertEqual(response.status_code, 200) + + self.assertEqual( + self.document.metadata.first().value, TEST_METADATA_VALUE_EDITED + ) + self.assertEqual( + document_2.metadata.first().value, TEST_METADATA_VALUE_EDITED + ) + + def test_multiple_document_metadata_remove(self): + self.login_user() + + self.grant_permission(permission=permission_document_view) + self.grant_permission(permission=permission_metadata_document_remove) + + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + document_2 = self.document_type.new_document( + file_object=File(file_object) + ) + + document_metadata = self.document.metadata.create( + metadata_type=self.metadata_type + ) + document_2.metadata.create(metadata_type=self.metadata_type) + + response = self.get( + 'metadata:metadata_multiple_remove', data={ + 'id_list': '{},{}'.format(self.document.pk, document_2.pk) + } + ) + + self.assertEquals(response.status_code, 200) + + # Test post to metadata removal view + response = self.post( + 'metadata:metadata_multiple_remove', data={ + 'id_list': '{},{}'.format(self.document.pk, document_2.pk), + 'form-0-id': document_metadata.pk, + 'form-0-update': True, + 'form-TOTAL_FORMS': '1', + 'form-INITIAL_FORMS': '0', + 'form-MAX_NUM_FORMS': '', + }, follow=True + ) + + self.assertEqual(response.status_code, 200) + + self.assertEqual(self.document.metadata.count(), 0) + self.assertEqual(document_2.metadata.count(), 0) + def test_multiple_document_metadata_add(self): self.login_user() diff --git a/mayan/apps/metadata/views.py b/mayan/apps/metadata/views.py index f42253180b..feaf3b552b 100644 --- a/mayan/apps/metadata/views.py +++ b/mayan/apps/metadata/views.py @@ -234,7 +234,11 @@ class DocumentMetadataEditView(MultipleObjectFormActionView): urlencode( { 'id_list': ','.join( - queryset.value_list('pk', flat=True) + map( + force_text, queryset.values_list( + 'pk', flat=True + ) + ) ) } ) @@ -404,7 +408,10 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView): urlencode( { 'id_list': ','.join( - queryset.value_list('pk', flat=True) + map( + force_text, + queryset.values_list('pk', flat=True) + ) ) } ) @@ -446,13 +453,15 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView): for document in queryset: document.add_as_recent_document_for_user(self.request.user) - for item in document.metadata.all(): - value = item.value - if item.metadata_type in metadata: - if value not in metadata[item.metadata_type]: - metadata[item.metadata_type].append(value) + for document_metadata in document.metadata.all(): + # Metadata value cannot be None here, fallback to an empty + # string + value = document_metadata.value or '' + if document_metadata.metadata_type in metadata: + if value not in metadata[document_metadata.metadata_type]: + metadata[document_metadata.metadata_type].append(value) else: - metadata[item.metadata_type] = [value] if value else '' + metadata[document_metadata.metadata_type] = [value] if value else '' initial = [] for key, value in metadata.items():