from odoo.addons.documents.tests.test_documents_sharing import TestDocumentsSharingCommon from odoo.tests import Form, users class TestSpreadsheetDocumentsSharing(TestDocumentsSharingCommon): @classmethod def setUpClass(cls): super().setUpClass() cls.folder = cls.env["documents.document"].create({ "name": "Test folder", "type": "folder", "access_internal": "view", "access_via_link": "view", }) cls.frozen_spreadsheets = cls.env['documents.document'].create([ {'name': f'Frozen spreadsheet_{i}', 'handler': 'frozen_spreadsheet', 'folder_id': cls.folder.id, 'owner_id': cls.document_manager.id} for i in range(2) ]) cls.spreadsheet = cls.env['documents.document'].create([ {'name': f'Spreadsheet_{i}', 'handler': 'spreadsheet', 'folder_id': cls.folder.id, 'owner_id': cls.document_manager.id} for i in range(2) ]) cls.non_spreadsheet = cls.env['documents.document'].create([ {'name': f'Non_spreadsheet_{i}', 'folder_id': cls.folder.id, 'owner_id': cls.document_manager.id} for i in range(2) ]) cls.docs = cls.frozen_spreadsheets | cls.spreadsheet | cls.non_spreadsheet (cls.frozen_spreadsheets | cls.spreadsheet | cls.non_spreadsheet).action_update_access_rights( partners={cls.doc_user.partner_id: ('view', False), cls.portal_user.partner_id: ('view', False)}) cls.partners = cls.frozen_spreadsheets[0].access_ids.partner_id @staticmethod def get_display_names(records): return ', '.join(records.sorted('display_name').mapped('display_name')) @users("dtdm") def test_invite_frozen_edit_error(self): with Form(self.create_documents_sharing(self.docs)) as form: self.assertFalse(form.error_message_spreadsheet) form.invite_partner_ids = self.doc_user.partner_id form.invite_role = 'edit' self.assertIn("Read only spreadsheet(s):", form.error_message_spreadsheet) self.assertIn(self.get_display_names(self.frozen_spreadsheets), form.error_message_spreadsheet) @users("dtdm") def test_invite_to_non_internal_user_edit_error(self): with Form(self.create_documents_sharing(self.spreadsheet | self.non_spreadsheet)) as form: self.assertFalse(form.error_message_spreadsheet) form.invite_partner_ids = (self.doc_user | self.portal_user).partner_id form.invite_role = 'edit' self.assertIn("You can not share spreadsheet(s) in edit mode", form.error_message_spreadsheet) self.assertIn("to non-internal users.", form.error_message_spreadsheet) self.assertIn(self.get_display_names(self.spreadsheet), form.error_message_spreadsheet) self.assertIn(self.portal_user.partner_id.name, form.error_message_spreadsheet) @users("dtdm") def test_share_frozen_edit_error(self): for operation, expected_partners in ( ('set_doc_user_edit', self.doc_user.partner_id), ('set_access_internal_edit', self.env['res.partner']), ('set_access_via_link_edit', self.env['res.partner']), ): with self.subTest(operation=operation), Form(self.create_documents_sharing(self.docs)) as form: self.assertFalse(form.error_message_spreadsheet) if operation == 'set_doc_user_edit': with self.form_get_access_edit(form, self.doc_user.partner_id) as access_edit_form: access_edit_form.role = 'edit' elif operation == 'set_access_internal_edit': form.access_internal = 'edit' elif operation == 'set_access_via_link_edit': form.access_via_link = 'edit' self.assertIn('Read only spreadsheet(s):', form.error_message_spreadsheet) self.assertIn(self.get_display_names(self.frozen_spreadsheets), form.error_message_spreadsheet) self.assertIn(self.get_display_names(expected_partners), form.error_message_spreadsheet) self.assertFalse(form.has_warning_link_with_more_rights) @users("dtdm") def test_share_to_non_internal_user_edit_error(self): for operation, expected_errors, expected_partner_error in [ ('set_portal_user_edit', ["You can not share spreadsheet(s) in edit mode", "to non-internal users"], self.portal_user.partner_id), ('set_access_via_link_edit', ["You cannot share spreadsheet(s) via link in edit mode"], self.env['res.partner']), ]: with (self.subTest(operation=operation), Form(self.create_documents_sharing(self.spreadsheet | self.non_spreadsheet)) as form): self.assertFalse(form.error_message_spreadsheet) if operation == 'set_portal_user_edit': with self.form_get_access_edit(form, self.portal_user.partner_id) as access_form: access_form.role = 'edit' elif operation == 'set_access_via_link_edit': form.access_via_link = 'edit' for expected_error in expected_errors: self.assertIn(expected_error, form.error_message_spreadsheet) self.assertIn(self.get_display_names(self.spreadsheet), form.error_message_spreadsheet) self.assertIn(self.get_display_names(expected_partner_error), form.error_message_spreadsheet) @users("dtdm") def test_removing_illegal_access_after_user_deactivation(self): action = self.env["documents.sharing"].action_open(self.spreadsheet.ids) doc_sharing = self.assert_open_wizard(action, self.spreadsheet) with Form(doc_sharing) as form: form.invite_partner_ids = (self.doc_user).partner_id form.invite_role = "edit" doc_sharing.action_invite_members() self.doc_user.action_archive() with Form(self.create_documents_sharing(self.spreadsheet)) as form: self.assertIn( "You can not share spreadsheet(s) in edit mode", form.error_message_spreadsheet, ) self.assertIn("to non-internal users.", form.error_message_spreadsheet) self.assertIn( self.get_display_names(self.spreadsheet), form.error_message_spreadsheet ) self.assertIn(self.doc_user.partner_id.name, form.error_message_spreadsheet) with self.form_get_access_edit( form, self.doc_user.partner_id ) as access_edit_form: access_edit_form.is_deleted = True self.assertFalse(form.error_message_spreadsheet) self.assertFalse(form.has_warning_partners_without_access)