Skip to content

Commit 62464cd

Browse files
committed
Add duplicate action for outgoing mails WIP
1 parent 608adf2 commit 62464cd

File tree

6 files changed

+177
-0
lines changed

6 files changed

+177
-0
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/skins/imio_dms_mail/imiodmsmail.css.dtml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,11 @@ dl.portletWidgetCollection div.portlet_add_icons a {
471471
background-image: url('&dtml-portal_url;/++resource++imio.dms.mail/models_icon.png');
472472
}
473473

474+
<!-- TODO Add an icon -->
475+
.apButtonAction_duplicate {
476+
background-image: url('&dtml-portal_url;/++resource++imio.dms.mail/models_icon.png');
477+
}
478+
474479
.apButtonAction_sendemail {
475480
background-image: url('&dtml-portal_url;/++resource++imio.dms.mail/send_email.svg');
476481
background-size: 18px 18px;

0 commit comments

Comments
 (0)