-
Notifications
You must be signed in to change notification settings - Fork 1
/
utils.py
134 lines (123 loc) · 5.96 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# -*- coding: utf-8 -*-
from collective.behavior.talcondition.behavior import ITALCondition
from collective.messagesviewlet import HAS_PLONE_5_AND_MORE
from collective.messagesviewlet.message import add_timezone
from collective.messagesviewlet.message import generate_uid
from datetime import datetime
from plone import api
try:
from plone.app.layout.navigation.defaultpage import isDefaultPage
except ImportError as error:
from Products.CMFPlone.defaultpage import is_default_page as isDefaultPage
from plone.app.layout.navigation.interfaces import INavigationRoot
from plone.app.textfield.value import RichTextValue
from six import text_type
from zope.annotation import IAnnotations
from zope.component import queryUtility
from zope.globalrequest import getRequest
from zope.i18n.interfaces import ITranslationDomain
def _(msgid, context, domain='collective.messagesviewlet', mapping=None):
translation_domain = queryUtility(ITranslationDomain, domain)
return translation_domain.translate(msgid, context=context.REQUEST, mapping=mapping)
def _richtextval(text):
""" Return a RichTextValue """
if not isinstance(text, text_type):
text = text.decode('utf8')
return RichTextValue(raw=text, mimeType='text/html', outputMimeType='text/html', encoding='utf-8')
def add_message(id, title, text, msg_type='info', can_hide=False, start=datetime.now(), end='', req_roles=[],
location='fullsite', tal_condition='', roles_byp_talcond=[], use_local_roles=False, activate=False, container='default'):
"""
Add a message in the configuration folder
msg_type: info, significant, warning
start: default now
end: default empty, or use pattern YYYYMMDD-HHMM
location: fullsite, homepage
"""
site = api.portal.get()
if container == 'default':
container = site['messages-config']
# We pass if id already exists
if id in container:
return None
rich_text = _richtextval(text)
# Add TZ when using Plone5
if HAS_PLONE_5_AND_MORE:
start = add_timezone(start, force=True)
try:
end_date = datetime.strptime(end, '%Y%m%d-%H%M')
end_date = add_timezone(end_date, force=True)
except ValueError:
end_date = None
message = api.content.create(container=container, type='Message', id=id, title=title,
**{'msg_type': msg_type, 'text': rich_text, 'can_hide': can_hide,
'start': start, 'end': end_date, 'required_roles': req_roles,
'location': location, 'hidden_uid': generate_uid(),
'tal_condition': tal_condition, 'roles_bypassing_talcondition': roles_byp_talcond,
'use_local_roles': use_local_roles})
if activate:
api.content.transition(message, 'activate')
return message
def get_messages_to_show(context, caching=True):
"""
Returns every message to be displayed for current context.
"""
messages = None
if caching:
request = getRequest()
if request:
key = 'messagesviewlet-utils-get_messages_to_show-{0}'.format(
'_'.join(context.getPhysicalPath()))
cache = IAnnotations(request)
messages = cache.get(key, None)
else:
caching = False
if messages is None:
messages = []
portal = api.portal.get()
catalog = api.portal.get_tool(name='portal_catalog')
# Getting user roles on context
if api.user.is_anonymous():
mb_roles = set(['Anonymous'])
else:
mb_roles = set(api.user.get_roles(obj=context))
now = datetime.now()
brains = catalog.unrestrictedSearchResults(portal_type=['Message'],
start={'query': now, 'range': 'max'},
end={'query': now, 'range': 'min'},
review_state=('activated'),
sort_on='getObjPositionInParent')
for brain in brains:
message = brain._unrestrictedGetObject()
if message.location == 'homepage':
# Test if context is PloneSite or its default page
if not INavigationRoot.providedBy(context) and \
not isDefaultPage(portal, context):
continue
elif message.location == 'justhere':
abs_url = context.absolute_url()
if not INavigationRoot.providedBy(context) and getattr(context.aq_parent, "deault_page", False) and context.aq_parent.default_page == context.id:
abs_url = context.aq_parent.absolute_url()
if abs_url != message.aq_parent.absolute_url():
continue
elif message.location == 'fromhere':
if message.aq_parent.absolute_url() not in context.absolute_url():
continue
# check in the cookie if message is marked as read
if message.can_hide:
m_uids = context.REQUEST.get('messagesviewlet', '')
if message.hidden_uid in m_uids.split('|'):
continue
# check if member has a required role on the context
if message.required_roles:
if mb_roles.intersection(message.required_roles) == set():
continue
# We define obj.context to viewlet context to evaluate expression on viewlet context display.
if not ITALCondition(message).evaluate(extra_expr_ctx={'context': context}):
continue
# We check the local roles
if message.use_local_roles and not api.user.is_anonymous() and 'Reader' not in api.user.get_roles(obj=message):
continue
messages.append(message)
if caching:
cache[key] = messages
return messages