From: Kim C. L. <svn...@pl...> - 2010-08-26 15:42:18
|
Author: kcleong Date: Thu Aug 26 15:42:08 2010 New Revision: 39039 Added: plone.formwidget.querystring/trunk/plone/formwidget/querystring/profiles/ plone.formwidget.querystring/trunk/plone/formwidget/querystring/profiles/default/ plone.formwidget.querystring/trunk/plone/formwidget/querystring/profiles/default/jsregistry.xml Modified: plone.formwidget.querystring/trunk/plone/formwidget/querystring/__init__.py plone.formwidget.querystring/trunk/plone/formwidget/querystring/configure.zcml plone.formwidget.querystring/trunk/plone/formwidget/querystring/display.pt plone.formwidget.querystring/trunk/plone/formwidget/querystring/input.pt plone.formwidget.querystring/trunk/plone/formwidget/querystring/interfaces.py plone.formwidget.querystring/trunk/plone/formwidget/querystring/widget.py plone.formwidget.querystring/trunk/setup.py sandbox/plone.app.standardtiles/trunk/plone/app/standardtiles/contentlisting.py sandbox/plone.app.standardtiles/trunk/plone/app/standardtiles/templates/content_listing.pt Log: work in progress for content listing tile Modified: plone.formwidget.querystring/trunk/plone/formwidget/querystring/__init__.py ============================================================================== --- plone.formwidget.querystring/trunk/plone/formwidget/querystring/__init__.py (original) +++ plone.formwidget.querystring/trunk/plone/formwidget/querystring/__init__.py Thu Aug 26 15:42:08 2010 @@ -0,0 +1,4 @@ +from zope.i18nmessageid import MessageFactory +MessageFactory = MessageFactory('plone.formwidget.querystring') + +from plone.formwidget.querystring.widget import QueryStringFieldWidget Modified: plone.formwidget.querystring/trunk/plone/formwidget/querystring/configure.zcml ============================================================================== --- plone.formwidget.querystring/trunk/plone/formwidget/querystring/configure.zcml (original) +++ plone.formwidget.querystring/trunk/plone/formwidget/querystring/configure.zcml Thu Aug 26 15:42:08 2010 @@ -1,5 +1,6 @@ <configure xmlns="http://namespaces.zope.org/zope" + xmlns:zope="http://namespaces.zope.org/zope" xmlns:browser="http://namespaces.zope.org/browser" xmlns:i18n="http://namespaces.zope.org/i18n" xmlns:gs="http://namespaces.zope.org/genericsetup" @@ -8,4 +9,20 @@ <include package="plone.z3cform" /> + <zope:view + type="zope.publisher.interfaces.browser.IBrowserRequest" + for=".interfaces.IQueryStringWidget" + provides="zope.app.form.interfaces.IInputWidget" + factory=".widget.QueryStringWidget" + permission="zope.Public" + /> + + <gs:registerProfile + name="default" + title="Query string formwidget" + directory="profiles/default" + for="Products.CMFPlone.interfaces.IPloneSiteRoot" + provides="Products.GenericSetup.interfaces.EXTENSION" + /> + </configure> Modified: plone.formwidget.querystring/trunk/plone/formwidget/querystring/display.pt ============================================================================== --- plone.formwidget.querystring/trunk/plone/formwidget/querystring/display.pt (original) +++ plone.formwidget.querystring/trunk/plone/formwidget/querystring/display.pt Thu Aug 26 15:42:08 2010 @@ -1 +1,2 @@ -<tal:block tal:content="structure view/value" /> \ No newline at end of file +<tal:block tal:content="structure view/value" /> +widget display.pt \ No newline at end of file Modified: plone.formwidget.querystring/trunk/plone/formwidget/querystring/input.pt ============================================================================== --- plone.formwidget.querystring/trunk/plone/formwidget/querystring/input.pt (original) +++ plone.formwidget.querystring/trunk/plone/formwidget/querystring/input.pt Thu Aug 26 15:42:08 2010 @@ -1,7 +1,208 @@ -<textarea - id="" name="" class="" cols="" rows="" - tabindex="" disabled="" readonly="" accesskey="" - tal:attributes="id view/id; - name view/name; - class view/klass;" - tal:content="view/value" /> \ No newline at end of file +<div class="ArchetypesQueryWidget" + tal:define="fieldName string:; + widget nocall:view; + accessor nocall:view/fakeAccessor"> + +<!-- <metal:widget-macro use-macro="field_macro | here/widgets/field/macros/edit"> + <div metal:define-slot="widget_body"/> + + </metal:widget-macro>--> + + <!-- backwards compatiblity with querywidget.js.... --> + <div tal:define="config widget/getConfig; + indexes config/indexes; + rows python:request.get('query',accessor(raw=True)); + sortable_indexes config/sortable_indexes; + addindexselected python:request.has_key('addindex') and request.addindex != ''; + addoperatorselected python:request.has_key('addoperator') and request.addoperator != ''"> + + <tal:counter tal:define="dummy python:request.set('querystringwidgetcounter', 0)"/> + <tal:row repeat="row rows"> + <div class="criteria" + tal:condition="python:not request.has_key('removecriteria.%s' % repeat['row'].index)"> + <div class="queryindex"> + <input type="hidden" name="query.i:records" + tal:attributes="name python:str(fieldName)+'.i:records'; value row/i" /> + <span tal:content="python:indexes[row.i]['title']"/> + </div> + + <div class="queryoperator"> + <input type="hidden" name="query.o:records" + tal:attributes="name python:str(fieldName)+'.o:records'; value row/o" /> + <span tal:content="python:indexes[row.i]['operators'][row.o]['title']"/> + </div> + + <input class="querywidget queryvalue stringWidget" + autocomplete="off" type="text" name="query.v:records" + tal:attributes="name python:str(fieldName)+'.v:records'; value python:row['v']" + tal:condition="python:indexes[row.i]['operators'][row.o]['widget'] == 'StringWidget'"/> + + <dl class="querywidget queryvalue multipleSelectionWidget" + tal:condition="python:indexes[row.i]['operators'][row.o]['widget'] == 'MultipleSelectionWidget'"> + <dt class="hiddenStructure"><span class="arrowDownAlternative">▼</span><span class="multipleSelectionWidgetTitle">Select…</span></dt> + <dd> + <tal:values repeat="index python:indexes[row.i]['values'].keys()"> + <label> + <input type="checkbox" name="query.v:records:list" + tal:attributes="name python:str(fieldName)+'.v:records:list'; value index; + checked python: row.has_key('v') and index in row.v and 'checked' or nothing"/> + <span tal:content="python:indexes[row.i]['values'][index]['title']"/> + </label> + </tal:values> + </dd> + </dl> + + <dl class="querywidget referenceWidget" + tal:condition="python:indexes[row.i]['operators'][row.o]['widget'] == 'ReferenceWidget'"> + <dt class="hiddenStructure">Select…</dt> + <dd> + <input class="queryvalue" autocomplete="off" type="text" name="query.v:records" tal:attributes="name python:str(fieldName)+'.v:records'; value python:row['v']" /> + </dd> + </dl> + + <input class="querywidget queryvalue dateWidget" + autocomplete="off" type="text" class="queryvalue" name="query.v:records" + tal:attributes="name python:str(fieldName)+'.v:records'; value python:row['v']" + tal:condition="python:indexes[row.i]['operators'][row.o]['widget'] == 'DateWidget'"/> + + <div class="querywidget queryvalue dateRangeWidget" + tal:condition="python:indexes[row.i]['operators'][row.o]['widget'] == 'DateRangeWidget'"> + <input autocomplete="off" type="text" name="query.v:records:list" + tal:attributes="name python:str(fieldName)+'.v:records:list'; value python:row['v'][0]"/> + <span> and </span> + <input autocomplete="off" type="text" name="query.v:records:list" + tal:attributes="name python:str(fieldName)+'.v:records:list'; value python:row['v'][1]"/> + </div> + + <input class="querywidget queryvalue relativePathWidget" + autocomplete="off" type="text" class="queryvalue" name="query.v:records" + tal:attributes="name python:str(fieldName)+'.v:records'; value python:row['v']" + tal:condition="python:indexes[row.i]['operators'][row.o]['widget'] == 'RelativePathWidget'"/> + + <div class="querywidget queryvalue emptyWidget" + tal:condition="python:indexes[row.i]['operators'][row.o]['widget'] == None"> + + </div> + + <input type="submit" class="removecriteria discreet" value="Remove line" + i18n:translate="removeline" + tal:attributes="name python:'removecriteria.%s' % request.get('querystringwidgetcounter')"/> + <tal:counter tal:define="dummy python:request.set('querystringwidgetcounter', request.get('querystringwidgetcounter') + 1)"/> + </div> + </tal:row> + + <div class="criteria" tal:condition="python: addindexselected and addoperatorselected"> + + <div class="queryindex"> + <input type="hidden" name="query.i:records" + tal:attributes="name python:str(fieldName)+'.i:records'; value context/REQUEST/form/addindex" /> + <span tal:content="python:indexes[request.form['addindex']]['title']"/> + </div> + + <div class="queryoperator"> + <input type="hidden" name="query.o:records" + tal:attributes="name python:str(fieldName)+'.o:records';value context/REQUEST/form/addoperator" /> + <span tal:content="python:indexes[request.form['addindex']]['operators'][request.form['addoperator']]['title']"/> + </div> + + <input class="querywidget queryvalue stringWidget" + autocomplete="off" type="text" name="query.v:records" value="" + tal:attributes="name python:str(fieldName)+'.v:records'" + tal:condition="python:indexes[request.form['addindex']]['operators'][request.form['addoperator']]['widget'] == 'StringWidget'"/> + + <dl class="querywidget queryvalue multipleSelectionWidget" + tal:condition="python:indexes[request.form['addindex']]['operators'][request.form['addoperator']]['widget'] == 'MultipleSelectionWidget'"> + <dt class="hiddenStructure">Select…</dt> + <dd> + <tal:values repeat="index python:indexes[request.form['addindex']]['values'].keys()"> + <label> + <input type="checkbox" name="query.v:records:list" tal:attributes="name python:str(fieldName)+'.v:records:list'; value index"/> + <span tal:content="python:indexes[request.form['addindex']]['values'][index]['title']"/> + </label> + </tal:values> + </dd> + </dl> + + <div class="querywidget referenceWidget" + tal:condition="python:indexes[request.form['addindex']]['operators'][request.form['addoperator']]['widget'] == 'ReferenceWidget'"> + <dl> + <dt class="hiddenStructure">Select…</dt> + <dd><input class="queryvalue" autocomplete="off" tal:attributes="name python:str(fieldName)+'.v:records';" type="text" name="query.v:records"/></dd> + </dl> + </div> + + <div class="querywidget queryvalue dateWidget" + tal:condition="python:indexes[request.form['addindex']]['operators'][request.form['addoperator']]['widget'] == 'DateWidget'"> + <input autocomplete="off" type="text" class="queryvalue" tal:attributes="name python:str(fieldName)+'.v:records';" name="query.v:records"/> + </div> + + <div class="querywidget queryvalue dateRangeWidget" + tal:condition="python:indexes[request.form['addindex']]['operators'][request.form['addoperator']]['widget'] == 'DateRangeWidget'"> + <input autocomplete="off" type="text" tal:attributes="name python:str(fieldName)+'.v:records:list';" name="query.v:records:list"/> + <span> and </span> + <input autocomplete="off" type="text" tal:attributes="name python:str(fieldName)+'.v:records:list';" name="query.v:records:list"/> + </div> + + <input class="querywidget queryvalue relativePathWidget" + autocomplete="off" type="text" name="query.v:records" tal:attributes="name python:str(fieldName)+'.v:records';" value="" + tal:condition="python:indexes[request.form['addindex']]['operators'][request.form['addoperator']]['widget'] == 'RelativePathWidget'"/> + + <input type="submit" name="removecriteria" class="removecriteria discreet" + i18n:translate="removeline" + value="Remove line"> + </div> + + <div class="criteria"> + <label for="addindex" class="hiddenStructure">Add criterion</label> + + <select class="addIndex" name="addindex" tal:condition="python: not(addindexselected) or addoperatorselected"> + <option value="" selected="selected">Select…</option> + <tal:index repeat="groupName python:config['groupedIndexes'].keys()"> + <optgroup tal:attributes="label python:groupName"> + <option tal:repeat="index python:config['groupedIndexes'][groupName]" + tal:content="python:index[0]" + tal:attributes="value python:index[1]"/> + </optgroup> + </tal:index> + </select> + + <div class="addIndex" tal:condition="python: addindexselected and not(addoperatorselected)"> + <input type="hidden" name="addindex" + tal:attributes="value context/REQUEST/form/addindex"/> + + <span tal:content="python:indexes[request.form['addindex']]['title']"/> + </div> + + <select class="addOperator" name="addoperator" tal:condition="python: addindexselected and not(addoperatorselected)"> + <option value="" selected="selected">Select…</option> + <tal:index repeat="index python:indexes[request.form['addindex']]['operators'].keys()"> + <option tal:attributes="value index;" + tal:content="python:indexes[request.form['addindex']]['operators'][index]['title']">Index</option> + </tal:index> + </select> + + <input type="submit" value="Add" i18n:translate="addterm" name="form.button.addcriteria" class="context addIndexButton"/> + </div> + + <div class="sortingField"> + <div class="formHelp"><!-- --></div> + <label for="sort_on"> + Sort on + </label> + <select name="sort_on" id="sort_on"> + <tal:index repeat="index python:sortable_indexes.keys()"> + <option tal:attributes="value index; selected python:(request.has_key('sort_on') and request.sort_on == index) and 'selected' or nothing" + tal:content="python:sortable_indexes[index]['title']">Index</option> + </tal:index> + </select> + + <input type="checkbox" name="sort_order" value="reverse" checked="checked" id="sort_order"/> + <label for="sort_order">Reversed order</label> + </div> + + <label class="previewresultsLabel">Preview</label> + <div class="previewresults" tal:content="structure python:widget.SearchResults(request, context, accessor)"> + </div> + </div> + +</div> \ No newline at end of file Modified: plone.formwidget.querystring/trunk/plone/formwidget/querystring/interfaces.py ============================================================================== --- plone.formwidget.querystring/trunk/plone/formwidget/querystring/interfaces.py (original) +++ plone.formwidget.querystring/trunk/plone/formwidget/querystring/interfaces.py Thu Aug 26 15:42:08 2010 @@ -1,5 +1,10 @@ from zope.interface import Interface +from zope.schema.interfaces import IText +3 class IQueryStringWidget(Interface): """Marker interface for the layout widget - """ \ No newline at end of file + """ + +class IQueryString(IText): + """QueryField for storing query""" \ No newline at end of file Added: plone.formwidget.querystring/trunk/plone/formwidget/querystring/profiles/default/jsregistry.xml ============================================================================== --- (empty file) +++ plone.formwidget.querystring/trunk/plone/formwidget/querystring/profiles/default/jsregistry.xml Thu Aug 26 15:42:08 2010 @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<object name="portal_javascripts"> + + <javascript id="++resource++plone.app.collection.javascripts/querywidget.js" + cacheable="True" compression="none" cookable="True" enabled="True" + expression="" inline="False" /> + +</object> \ No newline at end of file Modified: plone.formwidget.querystring/trunk/plone/formwidget/querystring/widget.py ============================================================================== --- plone.formwidget.querystring/trunk/plone/formwidget/querystring/widget.py (original) +++ plone.formwidget.querystring/trunk/plone/formwidget/querystring/widget.py Thu Aug 26 15:42:08 2010 @@ -1,29 +1,74 @@ +from zope.component import getUtility +from zope.component import getMultiAdapter from zope.interface import implements, implementer +from plone.app.collection import queryparser +from plone.app.contentlisting.interfaces import IContentListing +from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile import z3c.form.interfaces -import z3c.form.widget import z3c.form.util -from z3c.form.browser.textarea import TextAreaWidget +from z3c.form.widget import FieldWidget +from z3c.form.widget import Widget +from plone.app.collection.interfaces import ICollectionRegistryReader from plone.formwidget.querystring.interfaces import IQueryStringWidget +from plone.registry.interfaces import IRegistry + -from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile -class QueryStringWidget(TextAreaWidget): +class QueryStringWidget(Widget): implements(IQueryStringWidget) - klass = u'layout-widget' + klass = u'querystring-widget' input_template = ViewPageTemplateFile('input.pt') display_template = ViewPageTemplateFile('display.pt') + def render(self): - if self.mode == z3c.form.interfaces.DISPLAY_MODE: - return self.display_template(self) - else: - return self.input_template(self) + #if self.mode == z3c.form.interfaces.DISPLAY_MODE: + # return self.display_template(self) + #else: + return self.input_template(self) + + def getConfig(self): + """get the config""" + registry = getUtility(IRegistry) + registryreader = ICollectionRegistryReader(registry) + config = registryreader() + + # Group indices by "group", order alphabetically + groupedIndexes = {} + for indexName in config['indexes']: + index = config['indexes'][indexName] + if index['enabled']: + group = index['group'] + if group not in groupedIndexes: + groupedIndexes[group] = [] + groupedIndexes[group].append((index['title'], indexName)) + + # Sort each index list + [a.sort() for a in groupedIndexes.values()] + + config['groupedIndexes'] = groupedIndexes + return config + + def SearchResults(self, request, context, accessor): + """search results""" + parsedquery = queryparser.parseFormquery(self.context, self.value) + accessor = getMultiAdapter((self.context, self.request), name='searchResults')(query=parsedquery) + + return getMultiAdapter((accessor, request), name='display_query_results')() + + def fakeAccessor(self, raw=None): +# parsedquery = queryparser.parseFormquery(self.context, self.value) +# if not parsedquery: +# return IContentListing([]) +# return getMultiAdapter((self.context, self.request), name='searchResults')(query=parsedquery) + return self.value or [] + @implementer(z3c.form.interfaces.IFieldWidget) -def QueryStringWidgetFieldWidget(field, request): - return z3c.form.widget.FieldWidget(field, QueryWidget(request)) +def QueryStringFieldWidget(field, request): + return FieldWidget(field, QueryStringWidget(request)) Modified: plone.formwidget.querystring/trunk/setup.py ============================================================================== --- plone.formwidget.querystring/trunk/setup.py (original) +++ plone.formwidget.querystring/trunk/setup.py Thu Aug 26 15:42:08 2010 @@ -23,6 +23,7 @@ zip_safe=False, install_requires=[ 'setuptools', + 'plone.app.collection', # -*- Extra requirements: -*- ], entry_points=""" Modified: sandbox/plone.app.standardtiles/trunk/plone/app/standardtiles/contentlisting.py ============================================================================== --- sandbox/plone.app.standardtiles/trunk/plone/app/standardtiles/contentlisting.py (original) +++ sandbox/plone.app.standardtiles/trunk/plone/app/standardtiles/contentlisting.py Thu Aug 26 15:42:08 2010 @@ -1,19 +1,25 @@ from zope import schema +from zope.app.component.hooks import getSite +from zope.component import getMultiAdapter from plone.directives import form as directivesform from plone.tiles import PersistentTile -from plone.formwidget.querystring.widget import QueryStringWidgetFieldWidget +from plone.app.collection.browser.querybuilder import QueryBuilder + +from plone.formwidget.querystring.widget import QueryStringFieldWidget +from plone.formwidget.querystring import field class IContentListingTile(directivesform.Schema): - """Video tile - """ - directivesform.widget(search_terms=QueryStringWidgetFieldWidget) - search_terms = schema.TextLine(title=u'Search terms', - description=u'Define the search terms for the items ' - 'you want to list by choosing what to match on. The ' - 'list of results will be dynamically updated') + """ A tile that displays the content in a folderish item """ + directivesform.widget(query=QueryStringFieldWidget) + query = schema.List(title=u'Search terms', + value_type=schema.Dict(value_type=schema.TextLine(), key_type=schema.TextLine()), + description=u'Define the search terms for the items ' + 'you want to list by choosing what to match on. The ' + 'list of results will be dynamically updated', + required=False) view_template = schema.Choice(title=u"Display mode", values=('tabular', 'summary'), required=True) @@ -24,8 +30,12 @@ def __call__(self): self.update() - #return self.folderlisting.render() return self.index() def update(self): - self.folderlisting = self.context.restrictedTraverse('@@folderListing')() + self.query = self.data.get('query') + + def SearchResults(self): + """search results""" + + return getMultiAdapter((self.query, self.request), name='display_query_results')() Modified: sandbox/plone.app.standardtiles/trunk/plone/app/standardtiles/templates/content_listing.pt ============================================================================== --- sandbox/plone.app.standardtiles/trunk/plone/app/standardtiles/templates/content_listing.pt (original) +++ sandbox/plone.app.standardtiles/trunk/plone/app/standardtiles/templates/content_listing.pt Thu Aug 26 15:42:08 2010 @@ -2,13 +2,10 @@ <html xmlns="http://www.w3.org/1999/xhtml" i18n:domain="plone"> <body> - <h2>Content listing</h2> - - <ul> - <li tal:repeat="item view/folderlisting" > - <a tal:content="item/Title" tal:attributes="href item/getURL"/> - </li> - </ul> - -</body> + <h2>Content listing</h2> + <span tal:content="view/data"/> +<!-- + <div class="previewresults" tal:content="structure python:view.SearchResults()"> + </div>--> + </body> </html> \ No newline at end of file |