root/qPloneComments/tags/3.1/utils.py

Revision 1147 (checked in by deo, 6 months ago)

Fixed getParent to works also when called directly from the object with was commented. Made sure to always use the title from the commented object. Updated to always use MessageFactory?.

  • Property svn:eol-style set to native
Line 
1 from Products.CMFPlone import MessageFactory
2 from Products.CMFCore.utils import getToolByName
3
4 # Get apropriate property from (propery_sheeet) configlet
5 def getProp(self, prop_name, marker=None):
6     result = marker
7     pp = getToolByName(self, 'portal_properties')
8     config_ps = getattr(pp, 'qPloneComments', None)
9     if config_ps:
10         result =  getattr(config_ps, prop_name, marker)
11     return result
12
13 def publishDiscussion(self):
14     roles = ['Anonymous']
15     self.review_state = "published"
16     self.manage_permission('View', roles, acquire=1)
17     self._p_changed = 1
18     self.reindexObject()
19
20 def setAnonymCommenting(context, allow=False):
21     portal = getToolByName(context, 'portal_url').getPortalObject()
22     if allow:
23         portal.manage_permission('Reply to item', ['Anonymous','Manager','Member'], 1)
24     else:
25         portal.manage_permission('Reply to item', ['Manager','Member'], 1)
26
27 def manage_mails(reply, context, action):
28     def sendMails(props, actions, key):
29         for p in props:
30             if p in actions[key]:
31                 send_email(reply, context, p)
32
33     prop_sheet = context.portal_properties['qPloneComments']
34     props = filter(lambda x: prop_sheet.getProperty(x), prop_sheet.propertyIds())
35
36     actions = { 'onPublish': ('enable_approve_user_notification',
37                               'enable_reply_user_notification',
38                               'enable_published_notification'),
39                 'onDelete' :  ('enable_rejected_user_notification',),
40                 'onApprove': ('enable_approve_notification',)}
41
42     if action == 'publishing':
43         sendMails(props, actions, 'onPublish')
44
45     elif action == 'deleting':
46         sendMails(props, actions, 'onDelete')
47
48     elif action == 'aproving':
49         sendMails(props, actions, 'onApprove')
50
51 def getMsg(context, template, args):
52     return getattr(context, template)(**args)
53
54 def allowEmail(context, reply, state, creator):
55     condition = getattr(context, 'emailCommentNotification', True)
56     if callable(condition):
57         condition = condition(reply=reply, state=state, creator=creator)
58     return condition
59
60 def send_email(reply, context, state):
61     def getEmail(obj, context):
62         email = obj.getProperty('email', None)
63         if email is None:
64             creators = hasattr(obj, 'listCreators') and obj.listCreators() or [obj.Creator(),]
65             userid = creators and creators[0] or ""
66             creator = getToolByName(context, 'portal_membership').getMemberById(userid)
67             if creator and allowEmail(context, reply, state, creator):
68                 return creator.getProperty('email', '')
69         else:
70             return email
71         return ''
72
73     def getParent(reply):
74         if reply.meta_type == 'Discussion Item':
75             reply = reply.inReplyTo()
76             return getParent(reply)
77         return reply
78
79     def getDIParent(reply):
80         r = reply.inReplyTo()
81         return r.meta_type == 'Discussion Item' and r or None
82
83     def getParentOwnerEmail(reply, context):
84         creator_id = getParent(reply).getOwnerTuple()[1]
85         creator = getToolByName(context, 'portal_membership').getMemberById(creator_id)
86         if creator and allowEmail(context, reply, state, creator):
87             return creator.getProperty('email', '')
88         return ''
89
90     args = {}
91     if reply:
92         user_email = getEmail(reply, context)
93         reply_parent = getParent(reply)
94
95     organization_name = getProp(context, 'email_subject_prefix', '')
96     creator_name = reply.getOwnerTuple()[1]
97     admin_email = context.portal_url.getPortalObject().getProperty('email_from_address')
98
99     subject = ''
100     if state == 'enable_approve_user_notification':
101         subject = 'Your comment on "%s" is now published' % getParent(context).Title()
102         if user_email:
103             template = 'notify_comment_template'
104             args={'mto': user_email,
105                   'mfrom': admin_email,
106                   'obj': reply_parent,
107                   'organization_name': organization_name,
108                   'name': creator_name}
109         else:
110             args = {}
111
112     elif state == 'enable_rejected_user_notification':
113         subject = 'Your comment on "%s" was not approved' % getParent(context).Title()
114         if user_email:
115             template = 'rejected_comment_template'
116             args={'mto': user_email,
117                   'mfrom': admin_email,
118                   'obj': reply_parent,
119                   'organization_name': organization_name,
120                   'name': creator_name}
121         else:
122             args = {}
123
124     elif state == 'enable_reply_user_notification':
125         template = 'reply_notify_template'
126         subject = 'Someone replied to your comment on "%s"' % getParent(context).Title()
127         di_parrent = getDIParent(reply)
128         if di_parrent:
129             user_email = getEmail(di_parrent, context)
130             if user_email:
131                 args={'mto': user_email,
132                       'mfrom': admin_email,
133                       'obj': reply_parent,
134                       'organization_name': organization_name,
135                       'name': di_parrent.getOwnerTuple()[1]}
136             else:
137                 args = {}
138         else:
139             args = {}
140
141     elif state == 'enable_published_notification':
142         template = 'published_comment_template'
143         user_email = getParentOwnerEmail(reply, context)
144         if user_email:
145             args={'mto':user_email,
146                   'mfrom':admin_email,
147                   'obj':reply_parent,
148                   'organization_name':organization_name}
149             subject = '[%s] New comment added' % organization_name
150         else:
151             args = {}
152
153     elif state == 'enable_approve_notification':
154         template = 'approve_comment_template'
155         user_email = getProp(context, "email_discussion_manager", None)
156         if user_email:
157             args={'mto':user_email,
158                   'mfrom':admin_email,
159                   'obj':reply_parent,
160                   'organization_name':organization_name}
161             subject = '[%s] New comment awaits moderation' % organization_name
162         else:
163             args = {}
164
165     if args:
166         msg = getMsg(context, template, args)
167         p_utils = context.plone_utils
168         site_props = context.portal_properties.site_properties
169         host = p_utils.getMailHost()
170         host.secureSend(msg, user_email, admin_email,
171                         subject = subject,
172                         subtype = 'plain',
173                         debug = False,
174                         charset = site_props.getProperty('default_charset', 'utf-8'),
175                         From = admin_email)
176
177 def getTranslFunction(context):
178     return MessageFactory('plonecomments')
179
180 def setStatusMsg(state, context, msg):
181     transl = getTranslFunction(context)
182     context.plone_utils.addPortalMessage(transl(msg))
Note: See TracBrowser for help on using the browser.