Skip to content

Commit a6f2f97

Browse files
committed
Added duplicate omail and folder features WIP
1 parent d2554fa commit a6f2f97

13 files changed

Lines changed: 465 additions & 3 deletions

File tree

imio/dms/mail/browser/actionspanel.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from plone.memoize import ram
88
from Products.CMFPlone.interfaces import IHideFromBreadcrumbs
99
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
10+
from zope.component import getMultiAdapter
1011

1112

1213
def actionspanelview_cachekey(
@@ -54,6 +55,21 @@ def render_multiple_annexes_button(self):
5455
return ""
5556

5657

58+
class DuplicateMixin(object):
59+
"""Mixin class for duplicate action"""
60+
duplicate_view = None
61+
62+
def may_duplicate(self):
63+
raise NotImplementedError
64+
65+
def render_duplicate_button(self):
66+
if not self.duplicate_view:
67+
raise NotImplementedError("duplicate_view is not defined")
68+
if self.may_duplicate():
69+
return ViewPageTemplateFile("templates/actions_panel_duplicate.pt")(self)
70+
return ""
71+
72+
5773
class DmsIMActionsPanelView(MultipleAnnexesMixin, ActionsPanelView):
5874

5975
typeupload = "dmsappendixfile"
@@ -179,9 +195,10 @@ class DmsActionsPanelViewlet(ActionsPanelViewlet):
179195
}
180196

181197

182-
class DmsOMActionsPanelView(MultipleAnnexesMixin, ActionsPanelView):
198+
class DmsOMActionsPanelView(MultipleAnnexesMixin, DuplicateMixin, ActionsPanelView):
183199

184200
typeupload = "dmsappendixfile"
201+
duplicate_view = "@@om-duplicate"
185202
transitions = [
186203
"back_to_agent",
187204
"back_to_creation",
@@ -203,6 +220,10 @@ class DmsOMActionsPanelView(MultipleAnnexesMixin, ActionsPanelView):
203220
]
204221
tr_order = dict((val, i) for (i, val) in enumerate(transitions))
205222

223+
def may_duplicate(self):
224+
odm_utils = getMultiAdapter((self.context, self.request), name='odm-utils')
225+
return not self.isInFacetedNavigation() and odm_utils.may_duplicate()
226+
206227
def __init__(self, context, request):
207228
super(DmsOMActionsPanelView, self).__init__(context, request)
208229
# portal_actions.object_buttons action ids to keep
@@ -213,6 +234,7 @@ def __init__(self, context, request):
213234
"render_create_new_message",
214235
"render_send_email",
215236
"render_multiple_annexes_button",
237+
"render_duplicate_button",
216238
)
217239

218240
def sortTransitions(self, lst):
@@ -373,14 +395,19 @@ def DmsTaskActionsPanelView__call__(
373395
__call__ = DmsTaskActionsPanelView__call__
374396

375397

376-
class ClassificationFolderActionsPanelView(MultipleAnnexesMixin, ActionsPanelView):
398+
class ClassificationFolderActionsPanelView(MultipleAnnexesMixin, DuplicateMixin, ActionsPanelView):
377399

378400
typeupload = "annex"
401+
duplicate_view = "@@folder-duplicate"
402+
403+
def may_duplicate(self):
404+
folder_utils = getMultiAdapter((self.context, self.request), name='folder-utils')
405+
return not self.isInFacetedNavigation() and folder_utils.may_duplicate()
379406

380407
def __init__(self, context, request):
381408
super(ClassificationFolderActionsPanelView, self).__init__(context, request)
382409
self.ACCEPTABLE_ACTIONS = ["cut", "copy", "paste", "delete"]
383-
self.SECTIONS_TO_RENDER += ("render_multiple_annexes_button",)
410+
self.SECTIONS_TO_RENDER += ("render_multiple_annexes_button", "render_duplicate_button")
384411

385412
@ram.cache(actionspanelview_cachekey)
386413
def ClassificationFolderActionsPanelView__call__(self, **kwargs):

imio/dms/mail/browser/configure.zcml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,42 @@
1919
class=".views.CreateFromTemplateForm"
2020
/>
2121

22+
<browser:page
23+
name="om-duplicate"
24+
for="imio.dms.mail.dmsmail.IImioDmsOutgoingMail"
25+
permission="zope2.View"
26+
class=".views.OMDuplicateForm"
27+
/>
28+
29+
<browser:page
30+
name="folder-duplicate"
31+
for="collective.classification.folder.content.classification_folder.IClassificationFolder"
32+
permission="zope2.View"
33+
class=".views.FolderDuplicateForm"
34+
/>
35+
2236
<browser:page
2337
name="imiodmsmail-settings"
2438
for="Products.CMFPlone.interfaces.IPloneSiteRoot"
2539
permission="plone.app.controlpanel.Site"
2640
class=".settings.SettingsView"
2741
/>
2842

43+
<unconfigure package="collective.classification.folder">
44+
<browser:page
45+
name="collectiveclassificationfolder-settings"
46+
for="Products.CMFCore.interfaces.ISiteRoot"
47+
permission="plone.app.controlpanel.Site"
48+
class="collective.classification.folder.browser.settings.SettingsView"
49+
/>
50+
</unconfigure>
51+
<browser:page
52+
name="collectiveclassificationfolder-settings"
53+
for="Products.CMFCore.interfaces.ISiteRoot"
54+
permission="plone.app.controlpanel.Site"
55+
class=".settings.ImioClassificationSettingsView"
56+
/>
57+
2958
<browser:page
3059
name="im-listing"
3160
class=".listing.ListingView"

imio/dms/mail/browser/settings.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
# -*- coding: utf-8 -*-
2+
from collective.classification.folder.browser.settings import IClassificationConfig
3+
from collective.classification.folder.browser.settings import SettingsEditForm as CFSettingsEditForm
4+
from collective.classification.folder.browser.settings import SettingsView as CFSettingsView
25
from collective.contact.plonegroup.config import get_registry_functions
36
from collective.contact.plonegroup.config import get_registry_organizations
47
from collective.contact.plonegroup.config import set_registry_functions
@@ -37,6 +40,7 @@
3740
from plone.dexterity.fti import ftiModified
3841
from plone.dexterity.interfaces import IDexterityFTI
3942
from plone.registry.interfaces import IRecordModifiedEvent
43+
from plone.registry.interfaces import IRegistry
4044
from plone.registry.recordsproxy import RecordsProxy
4145
from plone.supermodel import model
4246
from plone.z3cform import layout
@@ -449,6 +453,25 @@ class ISignerRuleSchema(Interface):
449453
]
450454
)
451455

456+
omail_duplicate_fields = SimpleVocabulary(
457+
[
458+
SimpleTerm(value=u"category", title=_(u"Keep classification category")),
459+
SimpleTerm(value=u"folder", title=_(u"Keep classification folder")),
460+
SimpleTerm(value=u"reply_to", title=_(u"Keep reply_to mails")),
461+
SimpleTerm(value=u"dms_files", title=_(u"Keep DMS files")),
462+
SimpleTerm(value=u"annexes", title=_(u"Keep annexes")),
463+
SimpleTerm(value=u"link_to_duplicated", title=_(u"Link to duplicated mail")),
464+
]
465+
)
466+
467+
folder_duplicate_fields = SimpleVocabulary(
468+
[
469+
SimpleTerm(value=u"subfolders", title=_(u"Keep subfolders")),
470+
SimpleTerm(value=u"linked_mails", title=_(u"Keep linked mails")),
471+
SimpleTerm(value=u"annexes", title=_(u"Keep annexes")),
472+
]
473+
)
474+
452475

453476
class ITableListSchema(Interface):
454477
value = schema.TextLine(title=_("Stored value/id"), required=True, constraint=is_valid_identifier)
@@ -594,6 +617,8 @@ class IImioDmsMailConfig(model.Schema):
594617
"omail_send_modes",
595618
"omail_post_mailing",
596619
"omail_signer_rules",
620+
"omail_duplicate_display_fields",
621+
"omail_duplicate_true_default_values",
597622
"omail_fields",
598623
"omail_group_encoder",
599624
],
@@ -678,6 +703,21 @@ class IImioDmsMailConfig(model.Schema):
678703
auto_append=False,
679704
)
680705

706+
omail_duplicate_display_fields = schema.List(
707+
title=_(u"Fields to display when duplicating an outgoing mail"),
708+
required=False,
709+
value_type=schema.Choice(vocabulary=omail_duplicate_fields),
710+
default=[u"category", u"folder", u"reply_to", u"dms_files", u"annexes", u"link_to_duplicated"],
711+
)
712+
713+
omail_duplicate_true_default_values = schema.List(
714+
title=_(u"Default values to True when duplicating an outgoing mail"),
715+
description=_(u"If checked, the default value will be True."),
716+
required=False,
717+
value_type=schema.Choice(vocabulary=omail_duplicate_fields),
718+
default=[u"category", u"folder", u"annexes"],
719+
)
720+
681721
omail_fields = schema.List(
682722
title=_(u"${type} fields display", mapping={"type": _("Outgoing mail")}),
683723
description=_(u"Configure this carefully. You can order with arrows."),
@@ -1473,3 +1513,40 @@ class IImioDmsMailConfig2(Interface):
14731513
product_version = schema.TextLine(
14741514
title=_(u"Current product version"),
14751515
)
1516+
1517+
1518+
# --- Classification folder settings
1519+
1520+
class IImioClassificationConfig(IClassificationConfig):
1521+
1522+
folder_duplicate_display_fields = schema.List(
1523+
title=_(u"Fields to display when duplicating a folder"),
1524+
required=False,
1525+
value_type=schema.Choice(vocabulary=folder_duplicate_fields),
1526+
default=[u"subfolders", u"linked_mails", u"annexes"],
1527+
)
1528+
1529+
folder_duplicate_true_default_values = schema.List(
1530+
title=_(u"Default values to True when duplicating a folder"),
1531+
description=_(u"If checked, the default value will be True."),
1532+
required=False,
1533+
value_type=schema.Choice(vocabulary=folder_duplicate_fields),
1534+
default=[u"subfolders", u"linked_mails", u"annexes"],
1535+
)
1536+
1537+
1538+
class ImioClassificationSettingsEditForm(CFSettingsEditForm):
1539+
schema = IImioClassificationConfig
1540+
label = _(u"Classification Config")
1541+
1542+
def getContent(self):
1543+
registry = getUtility(IRegistry)
1544+
return registry.forInterface(
1545+
self.schema,
1546+
prefix='collective.classification.folder.browser.settings.IClassificationConfig',
1547+
check=False
1548+
)
1549+
1550+
1551+
class ImioClassificationSettingsView(CFSettingsView):
1552+
form = ImioClassificationSettingsEditForm
Lines changed: 3 additions & 0 deletions
Loading
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<td class="noPadding" i18n:domain="imio.dms.mail">
2+
<a tal:attributes="href string:${context/absolute_url}/${view/duplicate_view}"
3+
target="_parent"
4+
class="overlay overlay-ajax overlay-duplicate"
5+
tal:define="dummy view/saveHasActions;">
6+
<input type="button" value="Duplicate" i18n:attributes="value"
7+
class="apButton apButtonAction apButtonAction_duplicate"/>
8+
</a>
9+
</td>
10+
<td class="noPadding">
11+
</td>

0 commit comments

Comments
 (0)