Skip to content

Commit 0ee1081

Browse files
committed
Add duplicate action for outgoing mails WIP
1 parent 9e10366 commit 0ee1081

File tree

9 files changed

+372
-42
lines changed

9 files changed

+372
-42
lines changed

imio/dms/mail/browser/actionspanel.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ def __init__(self, context, request):
184184
self.ACCEPTABLE_ACTIONS = ["delete"]
185185
self.SECTIONS_TO_RENDER += (
186186
"render_create_from_template_button",
187+
"render_duplicate_button",
187188
"render_create_new_message",
188189
"render_send_email",
189190
)
@@ -207,6 +208,18 @@ def render_create_from_template_button(self):
207208
return ViewPageTemplateFile("templates/actions_panel_create_from_template.pt")(self)
208209
return ""
209210

211+
def may_duplicate(self):
212+
"""
213+
Method that check if special 'duplicate' action has to be displayed.
214+
"""
215+
# TODO define permissions for duplicate
216+
return True
217+
218+
def render_duplicate_button(self):
219+
if self.may_duplicate():
220+
return ViewPageTemplateFile("templates/actions_panel_duplicate.pt")(self)
221+
return ""
222+
210223
def may_create_new_message(self):
211224
if (
212225
self.context.is_email()

imio/dms/mail/browser/configure.zcml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
class=".views.CreateFromTemplateForm"
1919
/>
2020

21+
<browser:page
22+
name="duplicate"
23+
for="imio.dms.mail.dmsmail.IImioDmsOutgoingMail"
24+
permission="zope2.View"
25+
class=".views.DuplicateForm"
26+
/>
27+
2128
<browser:page
2229
name="imiodmsmail-settings"
2330
for="Products.CMFPlone.interfaces.IPloneSiteRoot"

imio/dms/mail/browser/settings.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,12 @@ class IImioDmsMailConfig(model.Schema):
453453
"omail_post_mailing",
454454
"omail_fields",
455455
"omail_group_encoder",
456+
"omail_duplicate_default_keep_category",
457+
"omail_duplicate_default_keep_folder",
458+
"omail_duplicate_default_keep_linked_mails",
459+
"omail_duplicate_default_keep_dms_files",
460+
"omail_duplicate_default_keep_annexes",
461+
"omail_duplicate_default_link_to_original",
456462
],
457463
)
458464

@@ -533,6 +539,32 @@ class IImioDmsMailConfig(model.Schema):
533539
default=False,
534540
)
535541

542+
# the duplicate-form default fields
543+
omail_duplicate_default_keep_category = schema.Bool(
544+
title=_(u"Default value when duplicating an outgoing mail for 'Keep classification category'"),
545+
default=True,
546+
)
547+
omail_duplicate_default_keep_folder = schema.Bool(
548+
title=_(u"Default value when duplicating an outgoing mail for 'Keep classification folder'"),
549+
default=True,
550+
)
551+
omail_duplicate_default_keep_linked_mails = schema.Bool(
552+
title=_(u"Default value when duplicating an outgoing mail for 'Keep linked mails'"),
553+
default=True,
554+
)
555+
omail_duplicate_default_keep_dms_files = schema.Bool(
556+
title=_(u"Default value when duplicating an outgoing mail for 'Keep DMS files'"),
557+
default=True,
558+
)
559+
omail_duplicate_default_keep_annexes = schema.Bool(
560+
title=_(u"Default value when duplicating an outgoing mail for 'Keep annexes'"),
561+
default=True,
562+
)
563+
omail_duplicate_default_link_to_original = schema.Bool(
564+
title=_(u"Default value when duplicating an outgoing mail for 'Link to original'"),
565+
default=True,
566+
)
567+
536568
# FIELDSET OEM
537569
model.fieldset(
538570
"outgoing_email",
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<td class="noPadding" i18n:domain="imio.dms.mail">
2+
<a tal:attributes="href string:${context/absolute_url}/@@duplicate"
3+
target="_parent"
4+
class="overlay overlay-ajax overlay-template-selection"
5+
tal:define="dummy view/saveHasActions;">
6+
<input type="button" value="Duplicate" class="apButton apButtonAction apButtonAction_duplicate" i18n:attributes="value" />
7+
</a>
8+
</td>
9+
<td class="noPadding">

imio/dms/mail/browser/views.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
# -*- coding: utf-8 -*-
22
from AccessControl import getSecurityManager
33
from collective.ckeditortemplates.cktemplate import ICKTemplate
4+
from collective.dms.basecontent.dmsfile import IDmsAppendixFile
5+
from collective.dms.mailcontent.dmsmail import internalReferenceOutgoingMailDefaultValue
46
from datetime import datetime
7+
from DateTime import DateTime
58
from eea.faceted.vocabularies.autocomplete import IAutocompleteSuggest
69
from imio.dms.mail import _
710
from imio.dms.mail import _tr
@@ -20,14 +23,22 @@
2023
from imio.helpers.workflow import do_transitions
2124
from imio.helpers.xhtml import object_link
2225
from plone import api
26+
from plone.supermodel import model
2327
from Products.CMFPlone.utils import safe_unicode
2428
from Products.Five import BrowserView
2529
from Products.PageTemplates.Expressions import SecureModuleImporter
2630
from unidecode import unidecode # unidecode_expect_nonascii not yet available in used version
31+
from z3c.form import button
32+
from z3c.form.field import Fields
33+
from z3c.form.form import Form
34+
from z3c.relationfield import RelationValue
35+
from zope import schema
2736
from zope.annotation import IAnnotations
2837
from zope.component import getMultiAdapter
38+
from zope.component import getUtility
2939
from zope.i18n import translate
3040
from zope.interface import implements
41+
from zope.intid.interfaces import IIntIds
3142
from zope.lifecycleevent import modified
3243
from zope.pagetemplate.pagetemplate import PageTemplate
3344

@@ -70,6 +81,106 @@ def redirect_url(self, uid):
7081
return "{}/persistent-document-generation?{}".format(url, "&".join(params))
7182

7283

84+
class IDuplicateFormSchema(model.Schema):
85+
86+
keep_category = schema.Bool(
87+
title=_(u"Keep classification category"),
88+
description=u'',
89+
# default=api.portal.get_registry_record("imio.dms.mail.browser.settings.IImioDmsMailConfig.omail_duplicate_default_keep_category", True),
90+
default=True,
91+
)
92+
93+
keep_folder = schema.Bool(
94+
title=_(u"Keep classification folder"),
95+
description=u'',
96+
# default=api.portal.get_registry_record(u"imio.dms.mail.browser.settings.IImioDmsMailConfig.omail_duplicate_default_keep_folder", True),
97+
default=True,
98+
)
99+
100+
keep_linked_mails = schema.Bool(
101+
title=_(u"Keep linked mails"),
102+
description=u'',
103+
# default=api.portal.get_registry_record(u"imio.dms.mail.browser.settings.IImioDmsMailConfig.omail_duplicate_default_keep_linked_mails", True),
104+
default=True,
105+
)
106+
107+
keep_dms_files = schema.Bool(
108+
title=_(u"Keep DMS files"),
109+
description=u'',
110+
# default=api.portal.get_registry_record(u"imio.dms.mail.browser.settings.IImioDmsMailConfig.omail_duplicate_default_keep_dms_files", True),
111+
default=True,
112+
)
113+
114+
keep_annexes = schema.Bool(
115+
title=_(u"Keep annexes"),
116+
description=u'',
117+
# default=api.portal.get_registry_record(u"imio.dms.mail.browser.settings.IImioDmsMailConfig.omail_duplicate_default_keep_annexes", True),
118+
default=True,
119+
)
120+
121+
link_to_original = schema.Bool(
122+
title=_(u"Link to original"),
123+
description=u'',
124+
# default=api.portal.get_registry_record(u"imio.dms.mail.browser.settings.IImioDmsMailConfig.omail_duplicate_default_link_to_original", True),
125+
default=True,
126+
)
127+
128+
129+
class DuplicateForm(Form):
130+
131+
"""Duplicate an outgoing mail."""
132+
label = _(u"Duplicate mail")
133+
fields = Fields(IDuplicateFormSchema)
134+
ignoreContext = True
135+
136+
@button.buttonAndHandler(_('Duplicate'), name='duplicate')
137+
def handleApply(self, action):
138+
data, errors = self.extractData()
139+
140+
if errors:
141+
self.status = self.formErrorsMessage
142+
return
143+
144+
# Duplicate the mail
145+
parent = self.context.aq_parent
146+
clipboard = parent.manage_copyObjects([self.context.getId()])
147+
result = parent.manage_pasteObjects(clipboard)
148+
duplicated_mail = parent[result[0]['new_id']]
149+
duplicated_mail.creation_date = DateTime()
150+
duplicated_mail.reindexObject(idxs=['created'])
151+
duplicated_mail.internal_reference_no = internalReferenceOutgoingMailDefaultValue(self)
152+
duplicated_mail.due_date = None
153+
duplicated_mail.outgoing_date = None
154+
duplicated_mail.mail_date = datetime.today()
155+
156+
# TODO hide category and folder fields if not enabled
157+
if not data['keep_category']:
158+
duplicated_mail.classification_categories = []
159+
160+
if not data['keep_folder']:
161+
duplicated_mail.classification_folders = []
162+
163+
if not data['keep_linked_mails']:
164+
duplicated_mail.reply_to = []
165+
166+
if not data['keep_dms_files']:
167+
dms_files = [sub_content.getId() for sub_content in duplicated_mail.values() if IImioDmsFile.providedBy(sub_content)]
168+
if dms_files:
169+
duplicated_mail.manage_delObjects(dms_files)
170+
171+
if not data['keep_annexes']:
172+
annexes = [sub_content.getId() for sub_content in duplicated_mail.values() if IDmsAppendixFile.providedBy(sub_content)]
173+
if annexes:
174+
duplicated_mail.manage_delObjects(annexes)
175+
176+
if data['link_to_original']:
177+
intids = getUtility(IIntIds)
178+
rel_id = intids.getId(self.context)
179+
duplicated_mail.reply_to.append(RelationValue(rel_id))
180+
181+
self.request.response.redirect(duplicated_mail.absolute_url()+"/edit")
182+
183+
73184
def parse_query(text):
74185
"""Copied from plone.app.vocabularies.catalog.parse_query but cleaned."""
75186
for char in "?-+*()":

imio/dms/mail/locales/en/LC_MESSAGES/imio.dms.mail.po

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,3 +1330,51 @@ msgstr "Templates"
13301330
#: ./browser/viewlets.py:107
13311331
msgid "zip_code"
13321332
msgstr ""
1333+
1334+
#: ./browser/settings.py:556
1335+
msgid "Default value when duplicating an outgoing mail for 'Keep DMS files'"
1336+
msgstr ""
1337+
1338+
#: ./browser/settings.py:560
1339+
msgid "Default value when duplicating an outgoing mail for 'Keep annexes'"
1340+
msgstr ""
1341+
1342+
#: ./browser/settings.py:544
1343+
msgid "Default value when duplicating an outgoing mail for 'Keep classification category'"
1344+
msgstr ""
1345+
1346+
#: ./browser/settings.py:548
1347+
msgid "Default value when duplicating an outgoing mail for 'Keep classification folder'"
1348+
msgstr ""
1349+
1350+
#: ./browser/settings.py:552
1351+
msgid "Default value when duplicating an outgoing mail for 'Keep linked mails'"
1352+
msgstr ""
1353+
1354+
#: ./browser/settings.py:564
1355+
msgid "Default value when duplicating an outgoing mail for 'Link to original'"
1356+
msgstr ""
1357+
1358+
#: ./browser/views.py:108
1359+
msgid "Keep DMS files"
1360+
msgstr ""
1361+
1362+
#: ./browser/views.py:115
1363+
msgid "Keep annexes"
1364+
msgstr ""
1365+
1366+
#: ./browser/views.py:87
1367+
msgid "Keep classification category"
1368+
msgstr ""
1369+
1370+
#: ./browser/views.py:94
1371+
msgid "Keep classification folder"
1372+
msgstr ""
1373+
1374+
#: ./browser/views.py:101
1375+
msgid "Keep linked mails"
1376+
msgstr ""
1377+
1378+
#: ./browser/views.py:122
1379+
msgid "Link to original"
1380+
msgstr ""

imio/dms/mail/locales/fr/LC_MESSAGES/imio.dms.mail.po

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,3 +1332,51 @@ msgstr "Modèles"
13321332
#: ./browser/viewlets.py:107
13331333
msgid "zip_code"
13341334
msgstr "Code postal"
1335+
1336+
#: ./browser/settings.py:556
1337+
msgid "Default value when duplicating an outgoing mail for 'Keep DMS files'"
1338+
msgstr "Valeur par défault pour le champ 'Keep DMS files' lorsqu'on duplique un courrier sortant"
1339+
1340+
#: ./browser/settings.py:560
1341+
msgid "Default value when duplicating an outgoing mail for 'Keep annexes'"
1342+
msgstr "Valeur par défault pour le champ 'Keep annexes' lorsqu'on duplique un courrier sortant"
1343+
1344+
#: ./browser/settings.py:544
1345+
msgid "Default value when duplicating an outgoing mail for 'Keep classification category'"
1346+
msgstr "Valeur par défault pour le champ 'Keep classification category' lorsqu'on duplique un courrier sortant"
1347+
1348+
#: ./browser/settings.py:548
1349+
msgid "Default value when duplicating an outgoing mail for 'Keep classification folder'"
1350+
msgstr "Valeur par défault pour le champ 'Keep classification folder' lorsqu'on duplique un courrier sortant"
1351+
1352+
#: ./browser/settings.py:552
1353+
msgid "Default value when duplicating an outgoing mail for 'Keep linked mails'"
1354+
msgstr "Valeur par défault pour le champ 'Keep linked mails' lorsqu'on duplique un courrier sortant"
1355+
1356+
#: ./browser/settings.py:564
1357+
msgid "Default value when duplicating an outgoing mail for 'Link to original'"
1358+
msgstr "Valeur par défault pour le champ 'Link to original' lorsqu'on duplique un courrier sortant"
1359+
1360+
#: ./browser/views.py:108
1361+
msgid "Keep DMS files"
1362+
msgstr "Garder les fichiers GED"
1363+
1364+
#: ./browser/views.py:115
1365+
msgid "Keep annexes"
1366+
msgstr "Garder les annexes"
1367+
1368+
#: ./browser/views.py:87
1369+
msgid "Keep classification category"
1370+
msgstr "Garder les catégories"
1371+
1372+
#: ./browser/views.py:94
1373+
msgid "Keep classification folder"
1374+
msgstr "Garder les dossiers"
1375+
1376+
#: ./browser/views.py:101
1377+
msgid "Keep linked mails"
1378+
msgstr "Garder les courrier liés"
1379+
1380+
#: ./browser/views.py:122
1381+
msgid "Link to original"
1382+
msgstr "Lier le courrier dupliqué à l'original"

0 commit comments

Comments
 (0)