This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
collective.dms.mailcontent/src/collective/dms/mailcontent/dmsmail.py

282 lines
11 KiB
Python
Raw Normal View History

2013-01-18 12:33:18 +01:00
import datetime
2013-04-04 17:18:12 +02:00
from five import grok
from z3c.form import validator
2013-01-07 16:11:10 +01:00
from zope import schema
from zope.component import getUtility, getMultiAdapter
from zope.component.interfaces import ComponentLookupError
2013-04-04 17:18:12 +02:00
from zope.interface import Invalid
from zope.interface import implements
from zope.lifecycleevent.interfaces import IObjectAddedEvent
2013-04-04 17:18:12 +02:00
from Products.CMFPlone.utils import getToolByName
2013-04-04 17:18:12 +02:00
from plone.autoform import directives as form
2013-01-07 16:11:10 +01:00
from plone.dexterity.schema import DexteritySchemaPolicy
2013-04-04 17:18:12 +02:00
from plone.directives.form import default_value
2013-08-30 19:05:38 +02:00
from plone.formwidget.datetime.z3cform.widget import (DateFieldWidget,
DatetimeFieldWidget)
from plone.indexer import indexer
2013-04-04 17:18:12 +02:00
from plone.registry.interfaces import IRegistry
2013-01-07 16:11:10 +01:00
2013-04-04 17:18:12 +02:00
from collective.dms.basecontent.relateddocs import RelatedDocs
2013-01-07 16:11:10 +01:00
from collective.dms.basecontent.dmsdocument import IDmsDocument, DmsDocument
from collective.contact.core.schema import ContactList, ContactChoice
2013-01-07 16:11:10 +01:00
from . import _
2013-03-01 12:31:38 +01:00
def validateIndexValueUniqueness(context, portal_type, index_name, value):
"""
check at 'portal_type' 'context' creation if 'index' 'value' is uniqueness
"""
# if the value is empty, we don't check anything
if not value:
return
catalog = getToolByName(context, 'portal_catalog')
2013-03-01 12:31:38 +01:00
brains = catalog.searchResults(**{index_name: value})
if context.portal_type != portal_type:
# we create the dmsincomingmail, the context is the container
if brains:
raise Invalid(_(u"This value is already used"))
else:
# we edit the type, the context is itself
# if multiple brains (normally not possible), we are sure there are other objects with same index value
2013-03-01 12:31:38 +01:00
if len(brains) > 1 or (len(brains) == 1 and brains[0].UID != context.UID()):
raise Invalid(_(u"This value is already used"))
2013-03-01 12:31:38 +01:00
class InternalReferenceIncomingMailValidator(validator.SimpleFieldValidator):
def validate(self, value):
#we call the already defined validators
#super(InternalReferenceValidator, self).validate(value)
try:
validateIndexValueUniqueness(self.context, 'dmsincomingmail',
'internal_reference_number', value)
except Invalid:
raise Invalid(_(u"This value is already used. A good value would be: ${good_value}",
mapping={'good_value': internalReferenceIncomingMailDefaultValue(self)}))
2013-01-07 16:11:10 +01:00
class IDmsIncomingMail(IDmsDocument):
""" """
mail_date = schema.Date(title=_(u'Original Mail Date'), required=False)
form.widget(mail_date=DateFieldWidget)
2013-01-07 16:11:10 +01:00
2013-05-30 11:22:55 +02:00
reception_date = schema.Datetime(title=_(u'Reception Date'), required=False)
form.widget(reception_date=DatetimeFieldWidget)
2013-01-07 16:11:10 +01:00
external_reference_no = schema.TextLine(
title=_(u"External Reference Number"),
required=False,)
2013-01-07 16:11:10 +01:00
internal_reference_no = schema.TextLine(
title=_(u"Internal Reference Number"),
required=False,)
2013-01-07 16:11:10 +01:00
2013-01-08 14:32:46 +01:00
sender = ContactChoice(
title=_(u'Sender'),
required=True)
2013-10-09 11:32:09 +02:00
recipients = ContactList(
title=_(u'Recipients'),
required=False)
in_reply_to = RelatedDocs(
title=_(u"In Reply To"),
required=False,
portal_types=('dmsoutgoingmail',))
2013-01-09 15:36:43 +01:00
form.order_before(sender='treating_groups')
2013-10-09 11:32:09 +02:00
form.order_after(recipients='sender')
form.order_before(mail_date='treating_groups')
2013-01-09 15:36:43 +01:00
form.order_before(reception_date='treating_groups')
form.order_before(internal_reference_no='treating_groups')
form.order_before(external_reference_no='treating_groups')
form.order_before(in_reply_to='treating_groups')
form.order_after(related_docs='recipient_groups')
form.order_after(notes='related_docs')
2013-03-01 12:31:38 +01:00
validator.WidgetValidatorDiscriminators(InternalReferenceIncomingMailValidator,
field=IDmsIncomingMail['internal_reference_no'])
grok.global_adapter(InternalReferenceIncomingMailValidator)
2013-03-01 12:31:38 +01:00
2013-01-18 12:33:18 +01:00
@default_value(field=IDmsIncomingMail['reception_date'])
def receptionDateDefaultValue(data):
# return the day date
2013-05-30 11:22:55 +02:00
today = datetime.datetime.today()
hour = datetime.time(18, 0)
reception_date = datetime.datetime.combine(today, hour)
2013-05-30 11:22:55 +02:00
return reception_date
2013-01-07 16:11:10 +01:00
2013-03-01 12:31:38 +01:00
#@default_value(field=IDmsIncomingMail['mail_date'])
def originalMailDateDefaultValue(data):
# return 3 days before
2013-03-01 12:31:38 +01:00
return datetime.date.today() - datetime.timedelta(3)
def evaluateInternalReference(context, request, number_registry_name, talexpression_registry_name):
# return a generated internal reference number
registry = getUtility(IRegistry)
# we get the following mail number, stored in registry
number = registry.get(number_registry_name) or 1
# we get the portal
try:
portal_state = getMultiAdapter((context, request), name=u'plone_portal_state')
settings_view = getMultiAdapter((portal_state.portal(), request), name=u'dmsmailcontent-settings')
except ComponentLookupError:
return 'Error getting view...'
# we evaluate the expression
expression = registry.get(talexpression_registry_name)
value = settings_view.evaluateTalExpression(expression, portal_state.portal(), number)
return value
2013-03-01 12:31:38 +01:00
@default_value(field=IDmsIncomingMail['internal_reference_no'])
def internalReferenceIncomingMailDefaultValue(data):
"""
Default value of internal_reference_no for dmsincomingmail
"""
return evaluateInternalReference(data.context, data.request,
'collective.dms.mailcontent.browser.settings.IDmsMailConfig.incomingmail_number',
'collective.dms.mailcontent.browser.settings.IDmsMailConfig.incomingmail_talexpression')
2013-03-01 12:31:38 +01:00
@indexer(IDmsIncomingMail)
2013-03-12 13:36:40 +01:00
def internalReferenceNoIndexerForIncomingMail(obj):
"""
specific indexer method to avoid acquisition of dmsincomingmail contained elements.
2013-03-12 13:36:40 +01:00
internal_reference_number is a fake attribute name
"""
return obj.internal_reference_no
2013-03-12 13:36:40 +01:00
grok.global_adapter(internalReferenceNoIndexerForIncomingMail, name="internal_reference_number")
2013-01-07 16:11:10 +01:00
class DmsIncomingMail(DmsDocument):
""" """
implements(IDmsIncomingMail)
__ac_local_roles_block__ = False
2013-01-07 16:11:10 +01:00
2013-03-01 12:31:38 +01:00
@grok.subscribe(IDmsIncomingMail, IObjectAddedEvent)
def incrementIncomingMailNumber(incomingmail, event):
""" Increment the value in registry """
# if internal_reference_no is empty, we force the value.
# useless if the internal_reference_no field is hidden (in this case,
# default value must be empty to bypass validator)
# useless to manage automatically the internal_reference_no value without user action
if not incomingmail.internal_reference_no:
internal_reference_no = evaluateInternalReference(incomingmail, incomingmail.REQUEST,
'collective.dms.mailcontent.browser.settings.IDmsMailConfig.incomingmail_number',
'collective.dms.mailcontent.browser.settings.IDmsMailConfig.incomingmail_talexpression')
incomingmail.internal_reference_no = internal_reference_no
incomingmail.reindexObject(idxs=('Title', internal_reference_no))
registry = getUtility(IRegistry)
registry['collective.dms.mailcontent.browser.settings.IDmsMailConfig.incomingmail_number'] += 1
2013-01-07 16:11:10 +01:00
2013-01-07 16:11:10 +01:00
class IDmsOutgoingMail(IDmsDocument):
""" """
mail_date = schema.Date(title=_(u'Mail Date'), required=False)
internal_reference_no = schema.TextLine(
title=_(u"Internal Reference Number"),
required=False, )
2013-01-07 16:11:10 +01:00
2013-08-22 15:18:29 +02:00
sender = ContactChoice(
title=_(u'Sender'),
required=False)
2013-01-08 14:32:46 +01:00
recipients = ContactList(
title=_(u'Recipients'),
required=True)
in_reply_to = RelatedDocs(
title=_(u"In Reply To"),
required=False,
portal_types=('dmsincomingmail',))
2013-08-22 15:18:29 +02:00
form.order_before(sender='treating_groups')
2013-01-09 15:36:43 +01:00
form.order_before(recipients='treating_groups')
form.order_before(mail_date='treating_groups')
form.order_before(internal_reference_no='treating_groups')
form.order_before(in_reply_to='treating_groups')
form.order_after(related_docs='recipient_groups')
form.order_after(notes='related_docs')
2013-03-01 12:31:38 +01:00
@default_value(field=IDmsOutgoingMail['mail_date'])
def mailDateDefaultValue(data):
# return the day date
return datetime.date.today()
2013-03-01 12:31:38 +01:00
@default_value(field=IDmsOutgoingMail['internal_reference_no'])
def internalReferenceOutgoingMailDefaultValue(data):
"""
Default value of internal_reference_no for dmsoutgoingmail
"""
return evaluateInternalReference(data.context, data.request,
'collective.dms.mailcontent.browser.settings.IDmsMailConfig.outgoingmail_number',
'collective.dms.mailcontent.browser.settings.IDmsMailConfig.outgoingmail_talexpression')
2013-03-01 12:31:38 +01:00
class InternalReferenceOutgoingMailValidator(validator.SimpleFieldValidator):
def validate(self, value):
#we call the already defined validators
#super(InternalReferenceValidator, self).validate(value)
try:
validateIndexValueUniqueness(self.context, 'dmsoutgoingmail',
'internal_reference_number', value)
except Invalid:
raise Invalid(_(u"This value is already used. A good value would be: ${good_value}",
mapping={'good_value': internalReferenceOutgoingMailDefaultValue(self)}))
2013-03-01 12:31:38 +01:00
validator.WidgetValidatorDiscriminators(InternalReferenceOutgoingMailValidator,
field=IDmsOutgoingMail['internal_reference_no'])
grok.global_adapter(InternalReferenceOutgoingMailValidator)
2013-03-01 12:31:38 +01:00
@grok.subscribe(IDmsOutgoingMail, IObjectAddedEvent)
def incrementOutgoingMailNumber(outgoingmail, event):
""" Increment the value in registry """
registry = getUtility(IRegistry)
registry['collective.dms.mailcontent.browser.settings.IDmsMailConfig.outgoingmail_number'] += 1
2013-01-07 16:11:10 +01:00
class DmsOutgoingMail(DmsDocument):
""" """
implements(IDmsOutgoingMail)
2013-03-12 13:36:40 +01:00
@indexer(IDmsOutgoingMail)
def internalReferenceNoIndexerForOutgoingMail(obj):
"""
specific indexer method to avoid acquisition of dmsoutgoingmail contained elements.
internal_reference_number is a fake attribute name
"""
return obj.internal_reference_no
grok.global_adapter(internalReferenceNoIndexerForOutgoingMail, name="internal_reference_number")
2013-01-07 16:11:10 +01:00
class DmsIncomingMailSchemaPolicy(DexteritySchemaPolicy):
""" """
def bases(self, schemaName, tree):
return (IDmsIncomingMail, )
class DmsOutgoingMailSchemaPolicy(DexteritySchemaPolicy):
""" """
def bases(self, schemaName, tree):
return (IDmsOutgoingMail, )