Skip to content

Commit 83eabbb

Browse files
committed
Omail DMS file duplication
1 parent 14e0edb commit 83eabbb

File tree

4 files changed

+270
-227
lines changed

4 files changed

+270
-227
lines changed

imio/dms/mail/browser/views.py

Lines changed: 8 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# -*- coding: utf-8 -*-
22
from AccessControl import getSecurityManager
33
from collective.ckeditortemplates.cktemplate import ICKTemplate
4-
from collective.dms.basecontent.dmsfile import IDmsAppendixFile
54
from datetime import datetime
65
from eea.faceted.vocabularies.autocomplete import IAutocompleteSuggest
76
from imio.dms.mail import _
@@ -13,15 +12,13 @@
1312
from imio.dms.mail.browser.table import PersonnelTable
1413
from imio.dms.mail.dmsfile import IImioDmsFile
1514
from imio.dms.mail.interfaces import IPersonnelContact
16-
from imio.dms.mail.utils import sub_create
1715
from imio.helpers.content import richtextval
1816
from imio.helpers.content import uuidToObject
1917
from imio.helpers.emailer import add_attachment
2018
from imio.helpers.emailer import create_html_email
2119
from imio.helpers.emailer import get_mail_host
2220
from imio.helpers.emailer import send_email
2321
from imio.helpers.fancytree.views import BaseRenderFancyTree
24-
from imio.helpers.transmogrifier import get_correct_id
2522
from imio.helpers.workflow import do_transitions
2623
from imio.helpers.xhtml import object_link
2724
from imio.pyutils.utils import safe_encode
@@ -33,14 +30,11 @@
3330
from z3c.form import button
3431
from z3c.form.field import Fields
3532
from z3c.form.form import Form
36-
from z3c.relationfield import RelationValue
3733
from zope import schema
3834
from zope.annotation import IAnnotations
3935
from zope.component import getMultiAdapter
40-
from zope.component import getUtility
4136
from zope.i18n import translate
4237
from zope.interface import implements
43-
from zope.intid.interfaces import IIntIds
4438
from zope.lifecycleevent import modified
4539
from zope.pagetemplate.pagetemplate import PageTemplate
4640

@@ -129,55 +123,16 @@ def handleApply(self, action):
129123
return
130124

131125
# Duplicate the mail
132-
original_mail = self.context
133-
pc = api.portal.get_tool("portal_catalog")
134-
import ipdb; ipdb.set_trace()
135-
duplicated_mail = sub_create(
136-
api.portal.get()["outgoing-mail"],
137-
"dmsoutgoingmail",
138-
datetime.now(),
139-
get_correct_id([om.getId for om in pc(portal_type="dmsoutgoingmail")], original_mail.getId()),
140-
title=original_mail.title,
141-
description=original_mail.description,
142-
recipients=original_mail.recipients[:] if original_mail.recipients else None,
143-
treating_groups=original_mail.treating_groups[:] if original_mail.treating_groups else None,
144-
assigned_user=original_mail.assigned_user,
145-
sender=original_mail.sender,
146-
recipient_groups=original_mail.recipient_groups[:] if original_mail.recipient_groups else None,
147-
send_modes=original_mail.send_modes[:] if original_mail.send_modes else None,
148-
task_description=original_mail.task_description,
126+
odm_utils = getMultiAdapter((self.context, self.request), name="odm-utils")
127+
duplicated_mail = odm_utils.duplicate(
128+
keep_category=data.get('category', False),
129+
keep_folder=data.get('folder', False),
130+
keep_reply_to=data.get('reply_to', False),
131+
keep_dms_files=data.get('dms_files', False),
132+
keep_annexes=data.get('annexes', False),
133+
link_to_duplicated=data.get('link_to_duplicated', False),
149134
)
150135

151-
if data.get('keep_category', False) and hasattr(original_mail, 'classification_categories') and original_mail.classification_categories:
152-
duplicated_mail.classification_categories = original_mail.classification_categories[:]
153-
154-
if data.get('keep_folder', False) and hasattr(original_mail, 'classification_folders') and original_mail.classification_folders:
155-
duplicated_mail.classification_folders = original_mail.classification_folders[:]
156-
157-
if data.get('keep_linked_mails', False) and hasattr(original_mail, 'reply_to') and original_mail.reply_to:
158-
duplicated_mail.reply_to = original_mail.reply_to[:]
159-
160-
if data.get('keep_dms_files', False):
161-
# FIXME do not use clipboard
162-
dms_files = [sub_content.getId() for sub_content in original_mail.values() if IImioDmsFile.providedBy(sub_content)]
163-
import ipdb; ipdb.set_trace()
164-
if dms_files:
165-
clipboard = original_mail.manage_copyObjects(dms_files)
166-
duplicated_mail.manage_pasteObjects(clipboard)
167-
168-
if data.get('keep_annexes', False):
169-
annexes = [sub_content.getId() for sub_content in original_mail.values() if IDmsAppendixFile.providedBy(sub_content)]
170-
if annexes:
171-
clipboard = original_mail.manage_copyObjects(annexes)
172-
duplicated_mail.manage_pasteObjects(clipboard)
173-
174-
if data.get('link_to_original', False):
175-
intids = getUtility(IIntIds)
176-
rel_id = intids.getId(original_mail)
177-
if duplicated_mail.reply_to is None:
178-
duplicated_mail.reply_to = []
179-
duplicated_mail.reply_to.append(RelationValue(rel_id))
180-
181136
self.request.response.redirect(duplicated_mail.absolute_url()+"/edit")
182137

183138

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

@@ -759,6 +761,182 @@ def test_IdmUtilsMethods_proposed_to_n_plus_col_cond0(self):
759761
self.assertFalse("searchfor_proposed_to_n_plus_1" in im_folder)
760762
self.assertTrue("See test_wfadaptations_imservicevalidation.py")
761763

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

0 commit comments

Comments
 (0)