Skip to content

Commit c2cc8ae

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

File tree

5 files changed

+128
-0
lines changed

5 files changed

+128
-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"
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: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
# -*- coding: utf-8 -*-
22
from AccessControl import getSecurityManager
33
from collective.ckeditortemplates.cktemplate import ICKTemplate
4+
from collective.dms.basecontent.dmsfile import IDmsAppendixFile
45
from datetime import datetime
6+
from DateTime import DateTime
57
from eea.faceted.vocabularies.autocomplete import IAutocompleteSuggest
68
from imio.dms.mail import _
79
from imio.dms.mail import _tr
@@ -20,14 +22,22 @@
2022
from imio.helpers.workflow import do_transitions
2123
from imio.helpers.xhtml import object_link
2224
from plone import api
25+
from plone.supermodel import model
2326
from Products.CMFPlone.utils import safe_unicode
2427
from Products.Five import BrowserView
2528
from Products.PageTemplates.Expressions import SecureModuleImporter
2629
from unidecode import unidecode # unidecode_expect_nonascii not yet available in used version
30+
from z3c.form import button
31+
from z3c.form.field import Fields
32+
from z3c.form.form import Form
33+
from z3c.relationfield import RelationValue
34+
from zope import schema
2735
from zope.annotation import IAnnotations
2836
from zope.component import getMultiAdapter
37+
from zope.component import getUtility
2938
from zope.i18n import translate
3039
from zope.interface import implements
40+
from zope.intid.interfaces import IIntIds
3141
from zope.lifecycleevent import modified
3242
from zope.pagetemplate.pagetemplate import PageTemplate
3343

@@ -70,6 +80,90 @@ def redirect_url(self, uid):
7080
return "{}/persistent-document-generation?{}".format(url, "&".join(params))
7181

7282

83+
class IDuplicateFormSchema(model.Schema):
84+
85+
keep_category = schema.Bool(
86+
title=u"Keep classification category",
87+
description=u'',
88+
)
89+
90+
keep_folder = schema.Bool(
91+
title=u"Keep classification folder",
92+
description=u'',
93+
)
94+
95+
keep_linked_mails = schema.Bool(
96+
title=u"Keep linked mails",
97+
description=u'',
98+
)
99+
100+
keep_dms_files = schema.Bool(
101+
title=u"Keep DMS files",
102+
description=u'',
103+
)
104+
105+
keep_annexes = schema.Bool(
106+
title=u"Keep annexes",
107+
description=u'',
108+
)
109+
110+
link_to_original = schema.Bool(
111+
title=u"Link to original",
112+
description=u'',
113+
)
114+
115+
116+
class DuplicateForm(Form):
117+
118+
"""Duplicate an outgoing mail."""
119+
label = _(u"Duplicate mail")
120+
fields = Fields(IDuplicateFormSchema)
121+
ignoreContext = True
122+
123+
@button.buttonAndHandler(_('Duplicate'), name='duplicate')
124+
def handleApply(self, action):
125+
data, errors = self.extractData()
126+
127+
if errors:
128+
self.status = self.formErrorsMessage
129+
return
130+
131+
# Duplicate the mail
132+
parent = self.context.aq_parent
133+
clipboard = parent.manage_copyObjects([self.context.getId()])
134+
result = parent.manage_pasteObjects(clipboard)
135+
duplicated_mail = parent[result[0]['new_id']]
136+
duplicated_mail.creation_date = DateTime()
137+
duplicated_mail.reindexObject(idxs=['created'])
138+
# TODO fix internal reference
139+
140+
if not data['keep_category']:
141+
pass
142+
143+
if not data['keep_folder']:
144+
pass
145+
146+
if not data['keep_linked_mails']:
147+
pass
148+
149+
if not data['keep_dms_files']:
150+
dms_files = [sub_content.getId() for sub_content in duplicated_mail.values() if IImioDmsFile.providedBy(sub_content)]
151+
if dms_files:
152+
duplicated_mail.manage_delObjects(dms_files)
153+
154+
if not data['keep_annexes']:
155+
annexes = [sub_content.getId() for sub_content in duplicated_mail.values() if IDmsAppendixFile.providedBy(sub_content)]
156+
if annexes:
157+
duplicated_mail.manage_delObjects(annexes)
158+
159+
if data['link_to_original']:
160+
intids = getUtility(IIntIds)
161+
rel_id = intids.getId(self.context)
162+
duplicated_mail.reply_to.append(RelationValue(rel_id))
163+
164+
self.request.response.redirect(duplicated_mail.absolute_url())
165+
166+
73167
def parse_query(text):
74168
"""Copied from plone.app.vocabularies.catalog.parse_query but cleaned."""
75169
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)