Skip to content

Commit 16203e0

Browse files
committed
Omail DMS file duplication
1 parent e3b7504 commit 16203e0

4 files changed

Lines changed: 269 additions & 227 deletions

File tree

imio/dms/mail/browser/views.py

Lines changed: 8 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from AccessControl import getSecurityManager
33
from Acquisition import aq_inner
44
from collective.ckeditortemplates.cktemplate import ICKTemplate
5-
from collective.dms.basecontent.dmsfile import IDmsAppendixFile
65
from datetime import datetime
76
from eea.faceted.vocabularies.autocomplete import IAutocompleteSuggest
87
from imio.dms.mail import _
@@ -18,7 +17,6 @@
1817
from imio.dms.mail.interfaces import IPersonnelContact
1918
from imio.dms.mail.utils import current_user_groups_ids
2019
from imio.dms.mail.utils import get_dms_config
21-
from imio.dms.mail.utils import sub_create
2220
from imio.esign import manage_session_perm
2321
from imio.esign.browser.actions import RemoveItemFromSessionView
2422
from imio.esign.browser.views import ExternalSessionCreateView
@@ -32,7 +30,6 @@
3230
from imio.helpers.emailer import get_mail_host
3331
from imio.helpers.emailer import send_email
3432
from imio.helpers.fancytree.views import BaseRenderFancyTree
35-
from imio.helpers.transmogrifier import get_correct_id
3633
from imio.helpers.workflow import do_transitions
3734
from imio.helpers.xhtml import object_link
3835
from imio.pyutils.utils import safe_encode
@@ -51,14 +48,11 @@
5148
from z3c.form import button
5249
from z3c.form.field import Fields
5350
from z3c.form.form import Form
54-
from z3c.relationfield import RelationValue
5551
from zope import schema
5652
from zope.annotation import IAnnotations
5753
from zope.component import getMultiAdapter
58-
from zope.component import getUtility
5954
from zope.i18n import translate
6055
from zope.interface import implements
61-
from zope.intid.interfaces import IIntIds
6256
from zope.lifecycleevent import modified
6357
from zope.pagetemplate.pagetemplate import PageTemplate
6458

@@ -147,55 +141,16 @@ def handleApply(self, action):
147141
return
148142

149143
# Duplicate the mail
150-
original_mail = self.context
151-
pc = api.portal.get_tool("portal_catalog")
152-
import ipdb; ipdb.set_trace()
153-
duplicated_mail = sub_create(
154-
api.portal.get()["outgoing-mail"],
155-
"dmsoutgoingmail",
156-
datetime.now(),
157-
get_correct_id([om.getId for om in pc(portal_type="dmsoutgoingmail")], original_mail.getId()),
158-
title=original_mail.title,
159-
description=original_mail.description,
160-
recipients=original_mail.recipients[:] if original_mail.recipients else None,
161-
treating_groups=original_mail.treating_groups[:] if original_mail.treating_groups else None,
162-
assigned_user=original_mail.assigned_user,
163-
sender=original_mail.sender,
164-
recipient_groups=original_mail.recipient_groups[:] if original_mail.recipient_groups else None,
165-
send_modes=original_mail.send_modes[:] if original_mail.send_modes else None,
166-
task_description=original_mail.task_description,
144+
odm_utils = getMultiAdapter((self.context, self.request), name="odm-utils")
145+
duplicated_mail = odm_utils.duplicate(
146+
keep_category=data.get('category', False),
147+
keep_folder=data.get('folder', False),
148+
keep_reply_to=data.get('reply_to', False),
149+
keep_dms_files=data.get('dms_files', False),
150+
keep_annexes=data.get('annexes', False),
151+
link_to_duplicated=data.get('link_to_duplicated', False),
167152
)
168153

169-
if data.get('keep_category', False) and hasattr(original_mail, 'classification_categories') and original_mail.classification_categories:
170-
duplicated_mail.classification_categories = original_mail.classification_categories[:]
171-
172-
if data.get('keep_folder', False) and hasattr(original_mail, 'classification_folders') and original_mail.classification_folders:
173-
duplicated_mail.classification_folders = original_mail.classification_folders[:]
174-
175-
if data.get('keep_linked_mails', False) and hasattr(original_mail, 'reply_to') and original_mail.reply_to:
176-
duplicated_mail.reply_to = original_mail.reply_to[:]
177-
178-
if data.get('keep_dms_files', False):
179-
# FIXME do not use clipboard
180-
dms_files = [sub_content.getId() for sub_content in original_mail.values() if IImioDmsFile.providedBy(sub_content)]
181-
import ipdb; ipdb.set_trace()
182-
if dms_files:
183-
clipboard = original_mail.manage_copyObjects(dms_files)
184-
duplicated_mail.manage_pasteObjects(clipboard)
185-
186-
if data.get('keep_annexes', False):
187-
annexes = [sub_content.getId() for sub_content in original_mail.values() if IDmsAppendixFile.providedBy(sub_content)]
188-
if annexes:
189-
clipboard = original_mail.manage_copyObjects(annexes)
190-
duplicated_mail.manage_pasteObjects(clipboard)
191-
192-
if data.get('link_to_original', False):
193-
intids = getUtility(IIntIds)
194-
rel_id = intids.getId(original_mail)
195-
if duplicated_mail.reply_to is None:
196-
duplicated_mail.reply_to = []
197-
duplicated_mail.reply_to.append(RelationValue(rel_id))
198-
199154
self.request.response.redirect(duplicated_mail.absolute_url()+"/edit")
200155

201156

imio/dms/mail/tests/test_utils.py

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from imio.dms.mail.utils import IdmUtilsMethods
2626
from imio.dms.mail.utils import invalidate_users_groups
2727
from imio.dms.mail.utils import list_wf_states
28+
from imio.dms.mail.utils import OdmUtilsMethods
2829
from imio.dms.mail.utils import PREVIEW_DIR
2930
from imio.dms.mail.utils import set_dms_config
3031
from imio.dms.mail.utils import sub_create
@@ -44,6 +45,7 @@
4445
from Products.CMFPlone.utils import base_hasattr
4546
from z3c.relationfield.relation import RelationValue
4647
from zope.annotation.interfaces import IAnnotations
48+
from zope.component import getMultiAdapter
4749
from zope.component import getUtility
4850
from zope.intid.interfaces import IIntIds
4951

@@ -767,6 +769,182 @@ def test_IdmUtilsMethods_proposed_to_n_plus_col_cond0(self):
767769
self.assertFalse("searchfor_proposed_to_n_plus_1" in im_folder)
768770
self.assertTrue("See test_wfadaptations_imservicevalidation.py")
769771

772+
def test_OdmUtilsMethods_duplicate(self):
773+
intids = getUtility(IIntIds)
774+
775+
omail2 = sub_create(
776+
self.portal["outgoing-mail"],
777+
"dmsoutgoingmail",
778+
datetime.now(),
779+
"my-id2",
780+
title="My title",
781+
description="Description",
782+
send_modes=["post"],
783+
classification_folders=[self.portal.folders['ordre-public-reglement-general-de-police'].UID()],
784+
classification_categories=self.portal.folders['ordre-public-reglement-general-de-police'].classification_categories,
785+
)
786+
787+
omail = sub_create(
788+
self.portal["outgoing-mail"],
789+
"dmsoutgoingmail",
790+
datetime.now(),
791+
"my-id",
792+
title="My title",
793+
description="Description",
794+
treating_groups=self.pgof["direction-generale"]["secretariat"].UID(),
795+
send_modes=["post"],
796+
classification_folders=[self.portal.folders['ordre-public-reglement-general-de-police'].UID()],
797+
classification_categories=self.portal.folders['ordre-public-reglement-general-de-police'].classification_categories,
798+
reply_to=[RelationValue(intids.getId(omail2))],
799+
)
800+
createContentInContainer(omail, "dmsommainfile", title=u"D001", file=NamedBlobFile(filename=u"scanned.pdf"))
801+
createContentInContainer(
802+
omail, "dmsappendixfile", title=u"A001", file=NamedBlobFile(filename=u"appendix.odt")
803+
)
804+
view = OdmUtilsMethods(omail, omail.REQUEST)
805+
806+
duplicated_mail = view.duplicate(
807+
keep_category=True,
808+
keep_folder=True,
809+
keep_reply_to=True,
810+
keep_dms_files=True,
811+
keep_annexes=True,
812+
link_to_duplicated=True,
813+
)
814+
self.assertEqual(duplicated_mail.title, u"My title")
815+
self.assertEqual(duplicated_mail.description, u"Description")
816+
self.assertEqual(duplicated_mail.send_modes, ["post"])
817+
self.assertGreater(duplicated_mail.creation_date, omail.creation_date)
818+
self.assertNotEqual(duplicated_mail.internal_reference_no, omail.internal_reference_no)
819+
self.assertIsNone(duplicated_mail.mail_date)
820+
self.assertIsNone(duplicated_mail.due_date)
821+
self.assertIsNone(duplicated_mail.outgoing_date)
822+
823+
# Test keep_category
824+
self.assertEqual(duplicated_mail.classification_categories, self.portal.folders['ordre-public-reglement-general-de-police'].classification_categories)
825+
# Test keep_folder
826+
self.assertEqual(duplicated_mail.classification_folders, [self.portal.folders['ordre-public-reglement-general-de-police'].UID()])
827+
# Test keep_linked_mails
828+
self.assertEqual(len(duplicated_mail.reply_to), 2)
829+
self.assertEqual(omail2, duplicated_mail.reply_to[0].to_object)
830+
# Test keep_dms_files
831+
self.assertNotIn("d001", duplicated_mail) # By default, we never keep not generated main files
832+
# Test keep_annexes
833+
self.assertIn("a001", duplicated_mail)
834+
# Test link_to_original
835+
self.assertEqual(omail, duplicated_mail.reply_to[1].to_object)
836+
837+
# Test not keeping categories
838+
duplicated_mail = view.duplicate(
839+
keep_category=False,
840+
keep_folder=True,
841+
keep_reply_to=True,
842+
keep_dms_files=True,
843+
keep_annexes=True,
844+
link_to_duplicated=True,
845+
)
846+
self.assertIsNone(duplicated_mail.classification_categories)
847+
848+
# Test not keeping folders
849+
duplicated_mail = view.duplicate(
850+
keep_category=True,
851+
keep_folder=False,
852+
keep_reply_to=True,
853+
keep_dms_files=True,
854+
keep_annexes=True,
855+
link_to_duplicated=True,
856+
)
857+
self.assertIsNone(duplicated_mail.classification_folders)
858+
859+
# Test not keeping linked mails
860+
duplicated_mail = view.duplicate(
861+
keep_category=True,
862+
keep_folder=True,
863+
keep_reply_to=False,
864+
keep_dms_files=True,
865+
keep_annexes=True,
866+
link_to_duplicated=True,
867+
)
868+
self.assertEqual(len(duplicated_mail.reply_to), 1)
869+
self.assertNotEqual(omail2, duplicated_mail.reply_to[0].to_object)
870+
871+
# Test not keeping dms files
872+
duplicated_mail = view.duplicate(
873+
keep_category=True,
874+
keep_folder=True,
875+
keep_reply_to=True,
876+
keep_dms_files=False,
877+
keep_annexes=True,
878+
link_to_duplicated=True,
879+
)
880+
self.assertNotIn("d001", duplicated_mail)
881+
882+
# Test not keeping annexes
883+
duplicated_mail = view.duplicate(
884+
keep_category=True,
885+
keep_folder=True,
886+
keep_reply_to=True,
887+
keep_dms_files=True,
888+
keep_annexes=False,
889+
link_to_duplicated=True,
890+
)
891+
self.assertNotIn("a001", duplicated_mail)
892+
893+
# Test not linking to original
894+
duplicated_mail = view.duplicate(
895+
keep_category=True,
896+
keep_folder=True,
897+
keep_reply_to=True,
898+
keep_dms_files=True,
899+
keep_annexes=True,
900+
link_to_duplicated=False,
901+
)
902+
self.assertEqual(len(duplicated_mail.reply_to), 1)
903+
self.assertNotEqual(omail, duplicated_mail.reply_to[0].to_object)
904+
905+
# Test with generated main files
906+
generation_view = getMultiAdapter((omail, omail.REQUEST), name="persistent-document-generation")
907+
pod_template = self.portal.templates["om"]["main"]
908+
generation_view.pod_template = pod_template
909+
generation_view.output_format = 'odt'
910+
generation_view.generate_persistent_doc(pod_template, 'odt')
911+
duplicated_mail = view.duplicate(
912+
keep_category=True,
913+
keep_folder=True,
914+
keep_reply_to=True,
915+
keep_dms_files=True,
916+
keep_annexes=True,
917+
link_to_duplicated=True,
918+
)
919+
self.assertIn('012999900000002', duplicated_mail)
920+
dms_file = duplicated_mail['012999900000002']
921+
annot = IAnnotations(dms_file)['documentgenerator']
922+
self.assertEqual(annot['template_uid'], pod_template.UID())
923+
924+
# Test with mailings (publipostage)
925+
omail.recipients = [RelationValue(intids.getId(self.contacts["jeancourant"]["agent-electrabel"])), RelationValue(intids.getId(self.contacts["sergerobinet"]["agent-swde"]))]
926+
generation_view.generate_persistent_doc(pod_template, 'odt')
927+
mailing_loop_generation_view = getMultiAdapter((omail, omail.REQUEST), name="mailing-loop-persistent-document-generation")
928+
mailing_loop_pod_template = self.portal.templates["om"]["mailing"]
929+
mailing_loop_generation_view.orig_template = pod_template
930+
mailing_loop_generation_view.pod_template = mailing_loop_pod_template
931+
mailing_loop_generation_view.output_format = 'odt'
932+
mailing_loop_generation_view.document = omail['012999900000001']
933+
mailing_loop_generation_view.generate_persistent_doc(mailing_loop_pod_template, 'odt')
934+
duplicated_mail = view.duplicate(
935+
keep_category=True,
936+
keep_folder=True,
937+
keep_reply_to=True,
938+
keep_dms_files=True,
939+
keep_annexes=True,
940+
link_to_duplicated=True,
941+
)
942+
self.assertEqual(duplicated_mail.keys(), ['012999900000004', 'a001'])
943+
dms_file = duplicated_mail['012999900000004']
944+
annot = IAnnotations(dms_file)['documentgenerator']
945+
self.assertEqual(annot['template_uid'], pod_template.UID())
946+
self.assertTrue(annot['need_mailing'])
947+
770948
def test_create_period_folder(self):
771949
dte = datetime.now() - timedelta(days=7)
772950
foldername = dte.strftime("%Y%U") # week

0 commit comments

Comments
 (0)