27 from pyams_mail.interfaces import IPrincipalMailInfo |
27 from pyams_mail.interfaces import IPrincipalMailInfo |
28 from pyams_security.interfaces import ISecurityManager, IProtectedObject |
28 from pyams_security.interfaces import ISecurityManager, IProtectedObject |
29 from pyams_security.interfaces.notification import INotificationSettings |
29 from pyams_security.interfaces.notification import INotificationSettings |
30 from pyramid_chameleon.interfaces import IChameleonTranslate |
30 from pyramid_chameleon.interfaces import IChameleonTranslate |
31 from pyramid_mailer.interfaces import IMailer |
31 from pyramid_mailer.interfaces import IMailer |
32 from zope.annotation.interfaces import IAnnotations |
|
33 from zope.location.interfaces import ISublocations |
32 from zope.location.interfaces import ISublocations |
34 from zope.traversing.interfaces import ITraversable |
33 from zope.traversing.interfaces import ITraversable |
35 |
34 |
36 # import packages |
35 # import packages |
37 from persistent import Persistent |
36 from persistent import Persistent |
38 from pyams_mail.message import HTMLMessage |
37 from pyams_mail.message import HTMLMessage |
39 from pyams_security.principal import MissingPrincipal |
38 from pyams_security.principal import MissingPrincipal |
40 from pyams_utils.adapter import adapter_config, ContextAdapter |
39 from pyams_utils.adapter import adapter_config, ContextAdapter, get_annotation_adapter |
41 from pyams_utils.container import BTreeOrderedContainer |
40 from pyams_utils.container import BTreeOrderedContainer |
42 from pyams_utils.registry import query_utility, get_utility |
41 from pyams_utils.registry import query_utility, get_utility |
43 from pyams_utils.request import check_request, query_request |
42 from pyams_utils.request import check_request, query_request |
44 from pyams_utils.url import absolute_url |
43 from pyams_utils.url import absolute_url |
45 from pyramid.events import subscriber |
44 from pyramid.events import subscriber |
46 from pyramid.threadlocal import get_current_registry |
45 from pyramid.threadlocal import get_current_registry |
47 from pyramid_chameleon.zpt import PageTemplateFile |
46 from pyramid_chameleon.zpt import PageTemplateFile |
48 from zope.container.contained import Contained |
47 from zope.container.contained import Contained |
49 from zope.interface import implementer |
48 from zope.interface import implementer |
50 from zope.location import locate |
|
51 from zope.schema.fieldproperty import FieldProperty |
49 from zope.schema.fieldproperty import FieldProperty |
52 |
50 |
53 from pyams_content import _ |
51 from pyams_content import _ |
54 |
52 |
55 |
53 |
95 |
93 |
96 |
94 |
97 @adapter_config(context=IReviewTarget, provides=IReviewComments) |
95 @adapter_config(context=IReviewTarget, provides=IReviewComments) |
98 def shared_content_review_comments_factory(context): |
96 def shared_content_review_comments_factory(context): |
99 """Shared content review comments factory""" |
97 """Shared content review comments factory""" |
100 annotations = IAnnotations(context) |
98 return get_annotation_adapter(context, REVIEW_COMMENTS_ANNOTATION_KEY, ReviewCommentsContainer, |
101 comments = annotations.get(REVIEW_COMMENTS_ANNOTATION_KEY) |
99 name='++review-comments++') |
102 if comments is None: |
|
103 comments = annotations[REVIEW_COMMENTS_ANNOTATION_KEY] = ReviewCommentsContainer() |
|
104 locate(comments, context, '++review-comments++') |
|
105 return comments |
|
106 |
100 |
107 |
101 |
108 @adapter_config(name='review-comments', context=IReviewTarget, provides=ITraversable) |
102 @adapter_config(name='review-comments', context=IReviewTarget, provides=ITraversable) |
109 class SharedContentReviewCommentsNamespace(ContextAdapter): |
103 class SharedContentReviewCommentsNamespace(ContextAdapter): |
110 """++review-comments++ namespace traverser""" |
104 """++review-comments++ namespace traverser""" |