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 | |
---|
13 | from Products.PloneFormGen.interfaces import IPloneFormGenForm |
---|
14 | from plone.app.vocabularies.catalog import SearchableTextSourceBinder |
---|
15 | from plone.app.form.widgets.uberselectionwidget import UberSelectionWidget |
---|
16 | |
---|
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 | |
---|
30 | class Assignment(base.Assignment): |
---|
31 | implements(IPFGPortlet) |
---|
32 | |
---|
33 | def __init__(self, target_form=''): |
---|
34 | self.target_form = target_form |
---|
35 | |
---|
36 | @property |
---|
37 | def title(self): |
---|
38 | return _(u"PFG Portlet") |
---|
39 | |
---|
40 | |
---|
41 | class Renderer(base.Renderer): |
---|
42 | |
---|
43 | _template = ViewPageTemplateFile('pfg.pt') |
---|
44 | |
---|
45 | def __init__(self, *args): |
---|
46 | base.Renderer.__init__(self, *args) |
---|
47 | self.portal_state = getMultiAdapter((self.context, self.request), |
---|
48 | name=u'plone_portal_state') |
---|
49 | self.portal = self.portal_state.portal() |
---|
50 | |
---|
51 | def render(self): |
---|
52 | return xhtml_compress(self._template()) |
---|
53 | |
---|
54 | def pfg_object(self): |
---|
55 | pfg_path = self.data.target_form |
---|
56 | if pfg_path.startswith('/'): |
---|
57 | pfg_path = pfg_path[1:] |
---|
58 | |
---|
59 | return self.portal.restrictedTraverse(pfg_path, default=None) |
---|
60 | |
---|
61 | def pfgTitle(self): |
---|
62 | form = self.pfg_object() |
---|
63 | if form is not None: |
---|
64 | return form.Title() |
---|
65 | |
---|
66 | def available(self): |
---|
67 | return self.pfg_object() and True or False |
---|
68 | |
---|
69 | def render_form(self): |
---|
70 | form = self.pfg_object() |
---|
71 | if form is not None: |
---|
72 | form_path = '/'.join(form.getPhysicalPath()[2:]) |
---|
73 | form_view = self.portal.restrictedTraverse( |
---|
74 | '%s/@@embedded' % form_path) |
---|
75 | form_view.prefix = 'pfgportlet' |
---|
76 | return form_view() |
---|
77 | |
---|
78 | |
---|
79 | class AddForm(base.AddForm): |
---|
80 | |
---|
81 | form_fields = form.Fields(IPFGPortlet) |
---|
82 | form_fields['target_form'].custom_widget = UberSelectionWidget |
---|
83 | |
---|
84 | label = _(u"Add PFG Portlet") |
---|
85 | description = _(u"This portlet displays pfg content.") |
---|
86 | |
---|
87 | def create(self, data): |
---|
88 | return Assignment(target_form=data.get('target_form', '')) |
---|
89 | |
---|
90 | |
---|
91 | class EditForm(base.EditForm): |
---|
92 | |
---|
93 | form_fields = form.Fields(IPFGPortlet) |
---|
94 | form_fields['target_form'].custom_widget = UberSelectionWidget |
---|
95 | |
---|
96 | label = _(u"Edit PFG Portlet") |
---|
97 | description = _(u"This portlet displays pfg content.") |
---|