1 | from zope import schema |
---|
2 | from zope.component import getMultiAdapter |
---|
3 | from zope.formlib import form |
---|
4 | from zope.interface import implements |
---|
5 | |
---|
6 | from plone.app.portlets.portlets import base |
---|
7 | from plone.memoize.compress import xhtml_compress |
---|
8 | from plone.portlets.interfaces import IPortletDataProvider |
---|
9 | |
---|
10 | from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile |
---|
11 | from Products.CMFPlone import PloneMessageFactory as _ |
---|
12 | from Products.CMFCore.utils import getToolByName |
---|
13 | |
---|
14 | from Products.PloneFormGen.interfaces import IPloneFormGenForm |
---|
15 | from plone.app.vocabularies.catalog import SearchableTextSourceBinder |
---|
16 | from plone.app.form.widgets.uberselectionwidget import UberSelectionWidget |
---|
17 | |
---|
18 | class IPFGPortlet(IPortletDataProvider): |
---|
19 | |
---|
20 | target_form = schema.Choice( |
---|
21 | title=_(u"Target form"), |
---|
22 | description=_(u"Find the form which you want to be", |
---|
23 | "displayed in portlet."), |
---|
24 | required=True, |
---|
25 | source=SearchableTextSourceBinder( |
---|
26 | {'object_provides':IPloneFormGenForm.__identifier__}, |
---|
27 | default_query='path:')) |
---|
28 | |
---|
29 | class Assignment(base.Assignment): |
---|
30 | implements(IPFGPortlet) |
---|
31 | |
---|
32 | def __init__(self, target_form=''): |
---|
33 | self.target_form = target_form |
---|
34 | |
---|
35 | @property |
---|
36 | def title(self): |
---|
37 | return _(u"PFG Portlet") |
---|
38 | |
---|
39 | class Renderer(base.Renderer): |
---|
40 | |
---|
41 | _template = ViewPageTemplateFile('pfg.pt') |
---|
42 | |
---|
43 | def __init__(self, *args): |
---|
44 | base.Renderer.__init__(self, *args) |
---|
45 | self.portal_state = getMultiAdapter((self.context, self.request), |
---|
46 | name=u'plone_portal_state') |
---|
47 | self.portal = self.portal_state.portal() |
---|
48 | |
---|
49 | |
---|
50 | def render(self): |
---|
51 | return xhtml_compress(self._template()) |
---|
52 | |
---|
53 | def pfg_object(self): |
---|
54 | pfg_path = self.data.target_form |
---|
55 | if pfg_path.startswith('/'): |
---|
56 | pfg_path = pfg_path[1:] |
---|
57 | |
---|
58 | return self.portal.restrictedTraverse(pfg_path, default=None) |
---|
59 | |
---|
60 | def pfgTitle(self): |
---|
61 | form = self.pfg_object() |
---|
62 | if form is not None: |
---|
63 | return form.Title() |
---|
64 | |
---|
65 | def available(self): |
---|
66 | return self.pfg_object() and True or False |
---|
67 | |
---|
68 | def render_form(self): |
---|
69 | form = self.pfg_object() |
---|
70 | if form is not None: |
---|
71 | form_path = '/'.join(form.getPhysicalPath()[2:]) |
---|
72 | form_view = self.portal.restrictedTraverse('%s/@@embedded' % form_path) |
---|
73 | form_view.prefix = 'pfgportlet' |
---|
74 | return form_view() |
---|
75 | |
---|
76 | class AddForm(base.AddForm): |
---|
77 | |
---|
78 | form_fields = form.Fields(IPFGPortlet) |
---|
79 | form_fields['target_form'].custom_widget = UberSelectionWidget |
---|
80 | |
---|
81 | label = _(u"Add PFG Portlet") |
---|
82 | description = _(u"This portlet displays pfg content.") |
---|
83 | |
---|
84 | def create(self, data): |
---|
85 | return Assignment(target_form=data.get('target_form', '')) |
---|
86 | |
---|
87 | class EditForm(base.EditForm): |
---|
88 | |
---|
89 | form_fields = form.Fields(IPFGPortlet) |
---|
90 | form_fields['target_form'].custom_widget = UberSelectionWidget |
---|
91 | |
---|
92 | label = _(u"Edit PFG Portlet") |
---|
93 | description = _(u"This portlet displays pfg content.") |
---|