Author: tom_gross Date: Fri Sep 26 12:02:43 2008 New Revision: 10074 Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/branches/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/tags/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/README.txt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/docs/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/docs/HISTORY.txt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/docs/INSTALL.txt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/setup.cfg MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/setup.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/PKG-INFO MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/SOURCES.txt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/dependency_links.txt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/entry_points.txt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/namespace_packages.txt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/not-zip-safe MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/requires.txt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/top_level.txt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/__init__.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/__init__.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/adapter.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser.txt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/__init__.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/configure.zcml MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/popup.pt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/view.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/config.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/configure.zcml MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/demo.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/interfaces.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/import_steps.xml MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/import_various_refbrowser.txt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/metadata.xml MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/skins.xml MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/sample_types/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/sample_types/archetype_tool.xml MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/sample_types/types/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/sample_types/types.xml MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/sample_types/types/RefBrowserDemo.xml MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/skins/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/skins/referencebrowser/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/skins/referencebrowser/referencebrowser.js MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/skins/referencebrowser/referencebrowser.js.metadata MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/skins/referencebrowser/referencebrowser.pt (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/tests/ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/tests/__init__.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/tests/base.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/tests/test_doctests.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/tests/test_product.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/tests/test_utils.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/utils.py (contents, props changed) MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/widget.py (contents, props changed) Log: importing package Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/README.txt ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/README.txt Fri Sep 26 12:02:43 2008 @@ -0,0 +1,4 @@ +Introduction +============ + + Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/docs/HISTORY.txt ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/docs/HISTORY.txt Fri Sep 26 12:02:43 2008 @@ -0,0 +1,8 @@ +Changelog +========= + +1.0 - Unreleased +---------------- + +* Initial release + Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/docs/INSTALL.txt ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/docs/INSTALL.txt Fri Sep 26 12:02:43 2008 @@ -0,0 +1,52 @@ +fhnw.widget.referencebrowser Installation +========================== + +To install fhnw.widget.referencebrowser into the global Python environment (or a workingenv), +using a traditional Zope 2 instance, you can do this: + + * When you're reading this you have probably already run + ``easy_install fhnw.widget.referencebrowser``. Find out how to install setuptools + (and EasyInstall) here: + http://peak.telecommunity.com/DevCenter/EasyInstall + + * If you are using Zope 2.9 (not 2.10), get `pythonproducts`_ and install it + via:: + + python setup.py install --home /path/to/instance + + into your Zope instance. + + * Create a file called ``fhnw.widget.referencebrowser-configure.zcml`` in the + ``/path/to/instance/etc/package-includes`` directory. The file + should only contain this:: + + <include package="fhnw.widget" /> + +.. _pythonproducts: http://plone.org/products/pythonproducts + + +Alternatively, if you are using zc.buildout and the plone.recipe.zope2instance +recipe to manage your project, you can do this: + + * Add ``fhnw.widget.referencebrowser`` to the list of eggs to install, e.g.: + + [buildout] + ... + eggs = + ... + fhnw.widget.referencebrowser + + * Tell the plone.recipe.zope2instance recipe to install a ZCML slug: + + [instance] + recipe = plone.recipe.zope2instance + ... + zcml = + fhnw.widget.referencebrowser + + * Re-run buildout, e.g. with: + + $ ./bin/buildout + +You can skip the ZCML slug if you are going to explicitly include the package +from another package's configure.zcml file. Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/setup.cfg ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/setup.cfg Fri Sep 26 12:02:43 2008 @@ -0,0 +1,3 @@ +[egg_info] +tag_build = dev +tag_svn_revision = true Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/setup.py ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/setup.py Fri Sep 26 12:02:43 2008 @@ -0,0 +1,33 @@ +from setuptools import setup, find_packages +import os + +version = '1.0' + +setup(name='archetypes.referencebrowserwidget', + version=version, + description="An alternate atreferencebrowser implementation", + long_description=open("README.txt").read() + "\n" + + open(os.path.join("docs", "HISTORY.txt")).read(), + classifiers=[ + "Framework :: Plone", + "Programming Language :: Python", + "Topic :: Software Development :: Libraries :: Python Modules", + ], + keywords='Relation Widget', + author='Tom Gross', + author_email='itc...@gm...', + url='http://pypi.python.org/archetypes.referencebrowserwidget', + license='ZPL 2.1', + namespace_packages=['archetypes'], + packages=find_packages('src'), + package_dir = {'': 'src'}, + include_package_data=True, + zip_safe=False, + install_requires=[ + 'setuptools', + # -*- Extra requirements: -*- + ], + entry_points=""" + # -*- Entry points: -*- + """, + ) Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/PKG-INFO ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/PKG-INFO Fri Sep 26 12:02:43 2008 @@ -0,0 +1,27 @@ +Metadata-Version: 1.0 +Name: archetypes.referencebrowserwidget +Version: 1.0dev-r0 +Summary: An alternate atreferencebrowser implementation +Home-page: http://pypi.python.org/archetypes.referencebrowserwidget +Author: Tom Gross +Author-email: itc...@gm... +License: ZPL 2.1 +Description: Introduction + ============ + + + + Changelog + ========= + + 1.0 - Unreleased + ---------------- + + * Initial release + + +Keywords: Relation Widget +Platform: UNKNOWN +Classifier: Framework :: Plone +Classifier: Programming Language :: Python +Classifier: Topic :: Software Development :: Libraries :: Python Modules Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/SOURCES.txt ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/SOURCES.txt Fri Sep 26 12:02:43 2008 @@ -0,0 +1,26 @@ +README.txt +setup.cfg +setup.py +docs/HISTORY.txt +docs/INSTALL.txt +src/archetypes/__init__.py +src/archetypes.referencebrowserwidget.egg-info/PKG-INFO +src/archetypes.referencebrowserwidget.egg-info/SOURCES.txt +src/archetypes.referencebrowserwidget.egg-info/dependency_links.txt +src/archetypes.referencebrowserwidget.egg-info/entry_points.txt +src/archetypes.referencebrowserwidget.egg-info/namespace_packages.txt +src/archetypes.referencebrowserwidget.egg-info/not-zip-safe +src/archetypes.referencebrowserwidget.egg-info/requires.txt +src/archetypes.referencebrowserwidget.egg-info/top_level.txt +src/archetypes/referencebrowserwidget/__init__.py +src/archetypes/referencebrowserwidget/adapter.py +src/archetypes/referencebrowserwidget/interfaces.py +src/archetypes/referencebrowserwidget/utils.py +src/archetypes/referencebrowserwidget/widget.py +src/archetypes/referencebrowserwidget/browser/__init__.py +src/archetypes/referencebrowserwidget/browser/view.py +src/archetypes/referencebrowserwidget/tests/__init__.py +src/archetypes/referencebrowserwidget/tests/base.py +src/archetypes/referencebrowserwidget/tests/test_doctests.py +src/archetypes/referencebrowserwidget/tests/test_product.py +src/archetypes/referencebrowserwidget/tests/test_utils.py \ No newline at end of file Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/dependency_links.txt ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/dependency_links.txt Fri Sep 26 12:02:43 2008 @@ -0,0 +1 @@ + Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/entry_points.txt ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/entry_points.txt Fri Sep 26 12:02:43 2008 @@ -0,0 +1,3 @@ + + # -*- Entry points: -*- + \ No newline at end of file Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/namespace_packages.txt ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/namespace_packages.txt Fri Sep 26 12:02:43 2008 @@ -0,0 +1 @@ +archetypes Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/not-zip-safe ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/not-zip-safe Fri Sep 26 12:02:43 2008 @@ -0,0 +1 @@ + Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/requires.txt ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/requires.txt Fri Sep 26 12:02:43 2008 @@ -0,0 +1 @@ +setuptools \ No newline at end of file Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/top_level.txt ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes.referencebrowserwidget.egg-info/top_level.txt Fri Sep 26 12:02:43 2008 @@ -0,0 +1 @@ +archetypes Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/__init__.py ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/__init__.py Fri Sep 26 12:02:43 2008 @@ -0,0 +1,6 @@ +# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages +try: + __import__('pkg_resources').declare_namespace(__name__) +except ImportError: + from pkgutil import extend_path + __path__ = extend_path(__path__, __name__) Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/__init__.py ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/__init__.py Fri Sep 26 12:02:43 2008 @@ -0,0 +1,17 @@ +from Products.CMFCore.utils import ContentInit +from Products.Archetypes.atapi import process_types, listTypes +from Products.CMFCore.permissions import AddPortalContent +from archetypes.referencebrowserwidget.config import PROJECTNAME + +def initialize(context): + import demo + content_types, constructors, ftis = process_types( + listTypes(PROJECTNAME), + PROJECTNAME) + + ContentInit( + PROJECTNAME + ' Content', + content_types = content_types, + permission = AddPortalContent, + extra_constructors = constructors, + ).initialize(context) Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/adapter.py ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/adapter.py Fri Sep 26 12:02:43 2008 @@ -0,0 +1,22 @@ + +def ATReferenceAdapter(context, field): + relationship = field.relationship + return [item.getTargetObject() + for item in context.getReferenceImpl(relationship)] + +def ATBackReferenceAdapter(context, field): + relationship = field.relationship + return [item.getTargetObject() + for item in context.getBackReferenceImpl(relationship)] + +def PloneRelationsAdapter(context, field): + relationship = field.relationship + from plone.app.relations.interfaces import IRelationshipSource + return IRelationshipSource(context).getTargets(relation=relationship) + + +def PloneRelationsRevAdapter(context, field): + relationship = field.relationship + from plone.app.relations.interfaces import IRelationshipTarget + return IRelationshipTarget(context).getSources(relation=relationship) + Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser.txt ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser.txt Fri Sep 26 12:02:43 2008 @@ -0,0 +1,100 @@ +ATReferenceBrowserWidget +======================== + + + >>> self.setRoles(['Manager']) + >>> self.portal.portal_types.invokeFactory('RefBrowserDemo', 'demo1') + 'demo1' + + >>> demo1_url = self.portal.demo1.absolute_url(1) + >>> popup_url = '%s/refbrowser_popup' % demo1_url + +Let's see if the Widget Base is here. + + >>> response = self.publish('%s/base_edit' % demo1_url, self.basic_auth) + >>> f = open('/tmp/result.html', 'w') + >>> f.write(response.getBody()) + >>> f.close() + >>> print response.getBody() # doctest: +ELLIPSIS + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ... + + <script type="text/javascript" charset="iso-8859-1" + src="http://nohost/plone/referencebrowser.js"> + </script>... + + <div class="field ArchetypesReferenceBrowserWidget kssattr-atfieldname-singleRef" + id="archetypes-fieldname-singleRef"> + <span></span> + <label for="singleRef">SingleRef</label>... + + <input id="singleRef_label" size="50" type="text" + readonly="readonly" + value="No reference set. Click the add button to select." /> + <input type="hidden" name="singleRef" id="singleRef" />... + + <div style="clear: both"> + <input type="button" class="searchButton" + value="Add..." + onclick="javascript:referencebrowser_openBrowser('http://nohost/plone/demo1','singleRef', '/plone/demo1', 'singleRef')" /> + <input type="button" class="destructive" + value="Remove reference" + onclick="javascript:referencebrowser_removeReference('singleRef', 0)" /> + </div>... + +Now check the popup. + + >>> resp = self.publish( + ... '%s?fieldName=singleRef&fieldRealName=singleRef&at_url=%s' + ... % (popup_url, demo1_url), self.basic_auth) + + >>> body = resp.getBody() + >>> print body + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ... + <head> + <title>demo1</title> + <meta http-equiv="Content-Type" + content="text/html;charset=utf-8" />... + + <body class="popup atrefbrowser" + onload="focus();self.name='referencebrowser_popup'"... + + <h2 class="documentFirstHeading">SingleRef</h2>... + + <input type="hidden" name="fieldName" + value="singleRef" /> + <input type="hidden" name="fieldRealName" + value="singleRef" /> + <input type="hidden" name="at_url" + value="plone/demo1" /> + + ... + + >>> import re + >>> INSERTLINK = re.compile( + ... r"onclick=\"window.opener.referencebrowser_setReference[(]'singleRef'") + + >>> ROWS = re.compile(r'<tr.*?>(.*?)</tr>', re.MULTILINE|re.DOTALL) + >>> len(ROWS.findall(body)) + 5 + + >>> len(INSERTLINK.findall(body)) + 1 + + Now add a news item. We see it, but we shouldn't be able to add it. + + >>> self.portal.portal_types.invokeFactory('News Item', 'newsitem') + 'newsitem' + + >>> resp = self.publish( + ... '%s?fieldName=singleRef&fieldRealName=singleRef&at_url=%s' + ... % (popup_url, demo1_url), self.basic_auth) + >>> body = resp.getBody() + + >>> len(ROWS.findall(body)) + 6 + + >>> len(INSERTLINK.findall(body)) + 1 + + + XXX Test more Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/__init__.py ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/__init__.py Fri Sep 26 12:02:43 2008 @@ -0,0 +1 @@ +# Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/configure.zcml ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/configure.zcml Fri Sep 26 12:02:43 2008 @@ -0,0 +1,35 @@ +<configure + xmlns="http://namespaces.zope.org/browser" + xmlns:zope="http://namespaces.zope.org/zope" + i18n_domain="atreferencebrowserwidget"> + + <page + name="refbrowserhelper" + permission="zope2.Public" + for="Products.Archetypes.interfaces.IReferenceable" + allowed_attributes="getFieldRelations getStartupDirectory" + class=".view.ReferenceBrowserHelperView" + /> + + <page + name="refbrowser_popup" + permission="zope2.Public" + for="*" + class=".view.ReferenceBrowserPopup" + /> + + <page + name="refbrowser_querycatalog" + permission="zope2.Public" + for="*" + class=".view.QueryCatalogView" + /> + + <zope:adapter + for="Products.Five.BrowserView" + factory=".view.default_popup_template" + name="popup" + provides="zope.formlib.namedtemplate.INamedTemplate" + /> + +</configure> Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/popup.pt ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/popup.pt Fri Sep 26 12:02:43 2008 @@ -0,0 +1,302 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html + xmlns:tal="http://xml.zope.org/namespaces/tal" + xmlns:metal="http://xml.zope.org/namespaces/metal" + i18n:domain="atreferencebrowserwidget"> + <head> + <title tal:content="here/title_or_id">Title or Id</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" + tal:attributes="content string:text/html;;charset=${view/charset}" /> + <tal:styles define="view context/@@plone|nothing" + replace="structure provider:plone.resourceregistries.styles" /> + <script language="javascript" type="text/javascript"> + function showMessage(message) { + element = document.getElementById('message'); + element.style.display='block'; + inner = document.getElementById('messageTitle'); + inner.innerHTML = message; + } + function submitHistoryForm() { + var form = document.history; + var path = form.path.options[form.path.selectedIndex].value; + form.action = path; + form.submit(); + } + </script> + </head> + <body class="popup atrefbrowser" + onload="focus();self.name='referencebrowser_popup'" + style="margin: 4px;padding:0.5em;" + tal:define=" + border_color here/base_properties/globalBorderColor; + fieldName view/fieldName; + multiValued view/multiValued; + fieldRealName view/fieldRealName; + at_obj nocall:view/at_obj; + widget nocall:view/widget; + title python:widget.Label(at_obj); + search_index view/search_index; + search_text view/search_text; + available_indexes widget/available_indexes; + allow_browse widget/allow_browse; + image_portal_types widget/image_portal_types; + image_method widget/image_method|string:; + "> + + <div style="text-align:right; + position: absolute; + top: 1.4em; + right: 1.0em;"> + <a href="javascript:history.back()" + i18n:translate="referencebrowser_back">Back</a> + | + <a href="javascript:window.close()" + i18n:translate="referencebrowser_close">Close window</a> + </div> + <div style="text-align:right;margin-bottom:1.5em; margin-top: 2.5em;"> + <div tal:condition="python:widget.history_length > 0 " + tal:define="history python:request.SESSION.get('atrefbrowserwidget_history', [])[:]"> + <form tal:condition="history" + action="referencebrowser_popup" + method="GET" name="history" id="history"> + <input type="hidden" name="fieldRealName" + tal:attributes="value fieldRealName" /> + <input type="hidden" name="fieldName" + tal:attributes="value fieldName" /> + <input type="hidden" name="at_url" + tal:attributes="value view/at_url" /> + <input type="hidden" name="clear:int" value="1" /> + <label for="path" + i18n:translate="referencebrowser_history">History</label> + <select name="path" size="1"> + <option value="" i18n:translate="" /> + <option tal:repeat="tp history" + tal:content="python: tp[1]" + tal:attributes="value python: tp[0]" + /> + </select> + <input class="context" type="button" value="Go" + onclick="submitHistoryForm()" + i18n:attributes="value label_go;" /> + </form> + <div tal:condition="history"> + <a tal:attributes="href view/history_url" + i18n:translate="referencebrowser_clearhistory">Clear history</a> + </div> + </div> + </div> + + <h2 class="documentFirstHeading" tal:content="title" /> + <p class="formHelp" + tal:content="structure python:widget.Description(at_obj)" /> + + <!-- Search form --> + <form action="search" method="post" name="search" + style="padding-bottom:0em;" + tal:condition="widget/allow_search" + tal:attributes="action request/getURL"> + + <div class="field" tal:condition="widget/show_indexes"> + <label i18n:translate="referencebrowser_search_index_label"> + Search index + </label> + <br/> + <select name="search_index" style="" id="indexSelector" + tal:attributes="style string:font-family:${here/base_properties/fontFamily};;font-size:100%;"> + <tal:indexes tal:repeat="index view/filtered_indexes"> + <option value="" selected="" + tal:attributes=" + value index; + selected python:index==search_index and 'selected' or ''" + tal:content="python:available_indexes[index]" + tal:condition="python:available_indexes.has_key(index)" + /> + + <option value="" selected="" + tal:attributes=" + value index; + selected python:index==search_index and 'selected' or ''" + tal:content="index" + tal:condition="python:not available_indexes.has_key(index)" + /> + </tal:indexes> + </select> + </div> + <div class="field"> + <label i18n:translate="referencebrowser_search_term"> + Search terms + </label> + <br/> + <input type="text" + id="searchGadget" + name="searchValue" + size="25" + value="" + tal:attributes="value search_text;" + /> + <input class="searchButton" + type="submit" + name="submit" + value="Search" + i18n:domain="plone" + i18n:attributes="value label_search;" + /> + </div> + <!-- add these to make sure that after a search result, we still have + these paremeters --> + <input type="hidden" name="fieldName" value="" + tal:attributes="value fieldName" /> + <input type="hidden" name="fieldRealName" value="" + tal:attributes="value fieldRealName" /> + <input type="hidden" name="at_url" value="" + tal:attributes="value view/at_url" /> + </form> + <div id="message" class="portalMessage" + style="display:none;margin-top:0px;"> + <span i18n:translate="referencebrowser_text_added_reference" + >Added reference to:</span> + <span id="messageTitle"></span> + </div> + <!-- actual list of objects, either searchresults or folder contents --> + <tal:block tal:define="batch view/getResult;"> + <div style="border-top:1px solid black;border-bottom:1px solid black;" + tal:attributes="style string:border-top:1px solid ${border_color};; + border-bottom:1px solid ${border_color};; + margin-bottom:1em;;padding:0.2em 0 0.1em 0;; + margin-top:1.5em;;" + tal:condition="view/has_queryresults"> + <span i18n:translate="referencebrowser_heading_search_results" + >Search results</span> + </div> + <!-- breadcrums --> + <div style="border-top:1px solid black;border-bottom:1px solid black;" + tal:attributes=" + style string:border-top:1px solid ${border_color};; + border-bottom:1px solid ${border_color};; + margin-bottom:1em;;padding:0.2em 0 0.1em 0;;margin-top:1.5em;" + tal:condition= "python:search_text=='' and allow_browse" + tal:define="isRTL here/@@plone_portal_state/is_rtl;"> + + <img tal:attributes="src string:${here/portal_url}/logoIcon.gif" /> + <tal:crums tal:repeat=" + crumb python:view.breadcrumbs(widget.startup_directory)"> + + <a tal:attributes="href crumb/absolute_url"> + <span tal:content="string:${crumb/Title}"> + Breadcrumb Title + </span> + </a> + + <span tal:condition="not: repeat/crumb/end" + class="breadcrumbSeparator"> + <tal:ltr condition="not: isRTL">→</tal:ltr> + <tal:rtl condition="isRTL">←</tal:rtl> + </span> + + </tal:crums> + + </div> + + <!-- object list --> + <p tal:condition="not:view/has_queryresults" + i18n:translate="referencebrowser_no_items_found">No items found.</p> + + <table class="group" width="100%" cellspacing="0" cellpadding="2" + tal:condition="batch"> + <tbody> + <tal:results tal:repeat="item batch"> + <tal:row + tal:define=" + uid python:view.getUid(item); + isNotSelf python:view.isNotSelf(item); + referenceable python:view.isReferencable(item); + title_or_id item/sortable_title|item/Title|item/getId; + color here/base_properties/discreetColor;"> + + <tr tal:define="oddrow repeat/item/odd" + tal:attributes="class python:oddrow and 'even' or 'odd'"> + <td tal:condition="image_portal_types"> + <img tal:condition="python: item.Type in image_portal_types" + tal:attributes="src string:${item/getURL}/$image_method" + /> + </td> + <td width="50%"> + <img src="#" + tal:attributes="src string:${here/portal_url}/${item/getIcon};alt item/Title" /> + <a tal:condition="python: item.is_folderish and allow_browse" + tal:attributes=" + href python:view.genRefBrowserUrl(item.getURL())"> + <strong tal:condition="referenceable" + tal:content="title_or_id">Title</strong> + <span style="" + tal:condition="not: referenceable" + tal:content="title_or_id"/> + </a> + <tal:foldercheck tal:condition=" + python:not((item.is_folderish and allow_browse) and isNotSelf)" > + <strong tal:condition="referenceable" + tal:content="title_or_id">Title + </strong> + <span style="" + tal:condition="python:not referenceable" + tal:content="title_or_id" + tal:attributes="style string:color:${color}" /> + </tal:foldercheck> + + <div tal:condition="widget/show_review_state"> + <span tal:define="state item/review_state" + tal:attributes="class string:state-$state" + i18n:translate="" i18n:domain="plone" + tal:content="state" + /> + </div> + + <div class="additionalInfo" + tal:content=" + structure item/additionalReferenceInfo | nothing" + /> + </td> + + <td width="25%" style="" + i18n:domain="plone" + i18n:translate="" + tal:attributes=" + style python:referenceable and '' or 'color:' + color" + tal:content="item/Type"> + Title + </td> + + <td width="25%" nowrap="nowrap" + style="text-align:right" + tal:define="title python:title_or_id.replace('\'', '\\\'')"> + <tal:referenceable tal:condition="referenceable"> + <a href="#" onclick="" + tal:attributes="onclick string:window.opener.referencebrowser_setReference('${fieldName}', '${uid}', '${title}', ${multiValued});; if (0==${view/close_window}) {window.close()} else {showMessage('${title}')};; ;"> + <strong i18n:translate="referencebrowser_insert_reference">Insert</strong> + </a> + | + <a href="" target="_blank" + tal:attributes="href item/getURL"> + <strong i18n:translate="referencebrowser_browse">Browse</strong> + </a> + </tal:referenceable> + </td> + </tr> + </tal:row> + </tal:results> + </tbody> + </table> + + <tal:var tal:define="template_id view/__name__"> + <div metal:use-macro="here/batch_macros/macros/navigation" /> + </tal:var> + + </tal:block> + <div style="text-align:right;margin-top:1em;margin-bottom:2em;"> + <a href="javascript:history.back()" + i18n:translate="referencebrowser_back">Back</a> + | + <a href="javascript:window.close()" + i18n:translate="referencebrowser_close">Close window</a> + </div> + </body> +</html> Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/view.py ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/browser/view.py Fri Sep 26 12:02:43 2008 @@ -0,0 +1,289 @@ +from zope.component import getMultiAdapter +from zope.formlib import namedtemplate + +from Acquisition import aq_inner +from Acquisition import aq_base + +from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile +from Products.Five import BrowserView +from Products.ZCTextIndex.ParseTree import ParseError + +from plone.app.form._named import named_template_adapter +from plone.memoize import view + +from Products.CMFCore.utils import getToolByName +from Products.CMFPlone import Batch + +from archetypes.referencebrowserwidget import utils +from archetypes.referencebrowserwidget.interfaces import IFieldRelation + +default_popup_template = named_template_adapter( + ViewPageTemplateFile('popup.pt')) + +class ReferenceBrowserHelperView(BrowserView): + + def getFieldRelations(self, field): + relations = getMultiAdapter((self.context, field), + interface=IFieldRelation) + # XXX sorting !? + return relations + + def getStartupDirectory(self, field): + """ Return the path to the startup directory. """ + widget = field.widget + directory = widget.startup_directory + if widget.startup_directory_method: + if getattr(aq_base(self.context), widget.startup_directory_method, False): + method = getattr(self.context, widget.startup_directory_method) + if callable(method): + directory = method() + else: + directory = method + return method + return utils.getStartupDirectory(self.context, directory) + +class QueryCatalogView(BrowserView): + + def __call__(self, show_all=0, + quote_logic=0, + quote_logic_indexes=['SearchableText'], + search_catalog=None): + + results=[] + catalog = utils.getSearchCatalog(aq_inner(self.context), + search_catalog) + indexes = catalog.indexes() + query = {} + show_query = show_all + second_pass = {} + + for k, v in self.request.items(): + if v and k in indexes: + if quote_logic and k in quote_logic_indexes: + v = utils.quotequery(v) + query.update({k:v}) + show_query=1 + elif k.endswith('_usage'): + key = k[:-6] + param, value = v.split(':') + second_pass[key] = {param:value} + elif k in ('sort_on', 'sort_order', 'sort_limit'): + query.update({k:v}) + + for k, v in second_pass.items(): + qs = query.get(k) + if qs is None: + continue + query[k] = q = {'query':qs} + q.update(v) + +# doesn't normal call catalog unless some field has been queried +# against. if you want to call the catalog _regardless_ of whether +# any items were found, then you can pass show_all=1. + + if show_query: + try: + results=catalog(**query) + except ParseError: + pass + + return results + + + +class ReferenceBrowserPopup(BrowserView): + """ View class of Popup window """ + + template = namedtemplate.NamedTemplate('popup') + has_queryresults = False + has_brain = False + brainuid = None + _updated = False + + def __init__(self, context, request): + super(ReferenceBrowserPopup, self).__init__(context, request) + + portal_props = getToolByName(aq_inner(context), 'portal_properties') + self.charset = portal_props.site_properties.default_charset + self.request.response.setHeader('Content-Type', + 'text/html;;charset=%s' % self.charset) + if self.request.get('clearHistory', None): + self.request.SESSION.set('atrefbrowserwidget_history', []) + + self.at_url = request.get('at_url'); + self.fieldName = request.get('fieldName'); + self.fieldRealName = request.get('fieldRealName'); + self.search_text = request.get('searchValue', ''); + + def __call__(self): + self.update() + return self.template() + + def update(self): + context = aq_inner(self.context) + + catalog = getToolByName(context, 'portal_catalog') + + at_result = catalog.searchResults(dict(path=self.at_url)); + at_brain = at_result and at_result[0] or None; + if at_brain: + self.at_obj = at_brain.getObject() + self.has_brain = True + self.brainuid = at_brain.UID + else: + self.at_obj = context.restrictedTraverse(self.at_url); + self.field = self.at_obj.Schema()[self.fieldRealName]; + self.widget = self.field.widget + self.multiValued = int(self.field.multiValued) + self.search_index = self.request.get('search_index', + self.widget.default_search_index) + self.request.set(self.search_index, self.search_text) + + base_query = self.widget.getBaseQuery(self.at_obj, self.field) + self.allowed_types = base_query.get('portal_type', '') + if not self.allowed_types: + base_query.pop('portal_type') + + if base_query.keys(): + self.request.form.update(base_query) + + # close_window needs to be int, since it is used + # with javascript + self.close_window = int(not self.field.multiValued or + self.widget.force_close_on_insert) + if self.widget.history_length > 0: + self.insertHistory(self.request, self.widget.history_length) + self._updated = True + + @view.memoize + @property + def search_catalog(self): + if not self._updated: + self.update() + return utils.getSearchCatalog(aq_inner(self.context), + self.widget.search_catalog) + + @property + def filered_indexes(self): + if not self._updated: + self.update() + indexes = self.search_catalog.indexes() + avail = self.widget.available_indexes + return [index for index in indexes if not avail or index in avail] + + @property + def history_url(self): + return "%s?%s&clearHistory=1" % ( + self.request.get('ACTUAL_URL', ''), + self.request.get('QUERY_STRING', '')) + + def insertHistory(self, history_length=20): + """ Keep url history in session + + Insert 'at_url' into the list of visited path in front. + The history is stored as list of tuples + (relative path to Zope root, relative_path to Plone portal root) + """ + path = self.request.get('PATH_TRANSLATED') + history = self.request.SESSION.get('atrefbrowserwidget_history', []) + portal_path = self.context.portal_url.getPortalObject().absolute_url(1) + + # remove existing entries + for i, tp in enumerate(history): + if path == tp[0]: + del history[i] + break + + # generate a friendly path for UI representation + visible_path = self.context.absolute_url(1) + visible_path = visible_path.replace(portal_path, '') + + # insert at the head of the history list + history.insert(0, (path, visible_path)) + + # cut off oversized history + history = history[:history_length] + + # put it back into the session + history = self.request.SESSION.set('atrefbrowserwidget_history', + history) + + def getResult(self): + if self.widget.show_results_without_query or self.search_text: + + qc = getMultiAdapter((self.context, self.request), + name='refbrowser_querycatalog') + + # XXX do batching with query + result = (self.widget.show_results_without_query or \ + self.search_text) and \ + qc(search_catalog=self.widget.search_catalog) + + if self.search_text or not self.widget.allow_browse: + self.has_queryresults = (not self.search_text or not \ + self.widget.allow_browse) and bool(len(result)) + + elif self.widget.allow_browse: + ploneview = getMultiAdapter((self.context, self.request), + name="plone") + folder = ploneview.getCurrentFolder() + result = folder.getFolderContents( + contentFilter={'sort_on': 'sortable_title'}) + else: + result = [] + b_size = int(self.request.get('b_size', 20)) + b_start = int(self.request.get('b_start', 0)) + + return Batch(result, b_size, b_start, orphan=1) + + def breadcrumbs(self, startup_directory): + context = aq_inner(self.context) + +# XXX get tool the right cached way + putils = getToolByName(context, 'plone_utils') + portal = context.portal_url.getPortalObject() + crumbs = putils.createBreadCrumbs(context) + + server_url = self.request.SERVER_URL + if startup_directory.startswith('/'): + startup_directory = startup_directory[1:] + + startup_folder = portal.restrictedTraverse(startup_directory) + startup_folder_url = startup_folder.absolute_url() + + newcrumbs = [] + for c in crumbs: + if c['absolute_url'].startswith(startup_folder_url): + c['absolute_url'] = self.genRefBrowserUrl(c['absolute_url']) + newcrumbs.append(c) + + if not self.widget.restrict_browsing_to_startup_directory: + newcrumbs.insert(0, + {'Title': 'Home', + 'absolute_url': self.genRefBrowserUrl(portal.absolute_url())}) + return newcrumbs + + def genRefBrowserUrl(self, urlbase): + return "%s/%s?fieldName=%s&fieldRealName=%s&at_url=%s" % ( + urlbase, self.__name__, self.fieldName, self.fieldRealName, self.at_url) + + + def getUid(self, item): + return (self.has_brain and item.UID or item.aq_explicit.UID) or None + + + def isNotSelf(self, item): + return self.has_brain and self.getUid(item) != self.brainuid or \ + item.getObject() != self.at_obj + + def isReferencable(self, item): + item_referenceable = not self.allowed_types or \ + item.portal_type in self.allowed_types + filter_review_states = self.widget.only_for_review_states is not None + review_state_allows = filter_review_states and \ + item.review_state in (self.widget.only_for_review_states or ()) or \ + True + return self.getUid(item) and item_referenceable and \ + review_state_allows and self.isNotSelf(item) + + Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/config.py ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/config.py Fri Sep 26 12:02:43 2008 @@ -0,0 +1 @@ +PROJECTNAME = "referencebrowserwidget" Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/configure.zcml ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/configure.zcml Fri Sep 26 12:02:43 2008 @@ -0,0 +1,69 @@ +<configure + xmlns="http://namespaces.zope.org/zope" + xmlns:five="http://namespaces.zope.org/five" + xmlns:zcml="http://namespaces.zope.org/zcml" + xmlns:cmf="http://namespaces.zope.org/cmf" + xmlns:genericsetup="http://namespaces.zope.org/genericsetup" + i18n_domain="atreferencebrowserwidget"> + + <five:registerPackage package="." initialize=".initialize" /> + <cmf:registerDirectory name="referencebrowser" /> + + <genericsetup:registerProfile + name="default" + title="Referencebrowser widget" + directory="profiles/default" + description="An alternate referencebrowser implementation" + provides="Products.GenericSetup.interfaces.EXTENSION" + /> + + <include package=".browser" /> + +<!-- <class class="Products.ATBackRef.BackReferenceField" + zcml:condition="installed Products.ATBackRef.BackReferenceField"> + <implements interface=".interfaces.IATBackRefereneceField" /> + </class> --> + + <class class="Products.Archetypes.Field.ReferenceField"> + <implements interface=".interfaces.IATReferenceField" /> + </class> + + <class class="plonerelations.ATField.ploneRelationsATField.PloneRelationsATField" + zcml:condition="installed plonerelations.ATField.ploneRelationsATField.PloneRelationsATField"> + <implements interface=".interfaces.IPloneRelationsRefField" /> + </class> + + <class class="plonerelations.ATField.ploneRelationsATField.ReversePloneRelationsATField" + zcml:condition="installed plonerelations.ATField.ploneRelationsATField.PloneRelationsATField"> + <implements interface=".interfaces.IPloneRelationsRevRefField" /> + </class> + + <adapter + for="Products.Archetypes.interfaces.IReferenceable + .interfaces.IATReferenceField" + factory=".adapter.ATReferenceAdapter" + provides=".interfaces.IFieldRelation" + /> + + <adapter + for="Products.Archetypes.interfaces.IReferenceable + .interfaces.IATBackRefereneceField" + factory=".adapter.ATBackReferenceAdapter" + provides=".interfaces.IFieldRelation" + /> + + <adapter + for="Products.Archetypes.interfaces.IReferenceable + .interfaces.IPloneRelationsRefField" + factory=".adapter.PloneRelationsAdapter" + provides=".interfaces.IFieldRelation" + /> + + <adapter + for="Products.Archetypes.interfaces.IReferenceable + .interfaces.IPloneRelationsRevRefField" + factory=".adapter.PloneRelationsRevAdapter" + provides=".interfaces.IFieldRelation" + /> + +</configure> Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/demo.py ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/demo.py Fri Sep 26 12:02:43 2008 @@ -0,0 +1,89 @@ +""" demonstrates the use of archetypes.referencebrowserwidget """ + +from Products.Archetypes.atapi import ReferenceField +from Products.Archetypes.atapi import BaseSchema +from Products.Archetypes.atapi import Schema +from Products.Archetypes.atapi import BaseContent +from Products.Archetypes.atapi import registerType +from DateTime import DateTime + +from archetypes.referencebrowserwidget.config import PROJECTNAME +from archetypes.referencebrowserwidget.widget import ReferenceBrowserWidget + +schema = BaseSchema.copy() + Schema(( + + ReferenceField('singleRef', + multiValued=0, + allowed_types=('Document','File', 'RefBrowserDemo'), + relationship='Rel1', + widget=ReferenceBrowserWidget( + default_search_index='SearchableText', + description='This is the first field. Pick an object.')), + + ReferenceField('multiRef', + multiValued=1, + relationship='Rel2', + widget=ReferenceBrowserWidget( + show_indexes=1, + description=('And here is another field with a longer ' + 'description text to explain the user better what ' + 'to do with this field.'))), + + ReferenceField('multiRef2', + multiValued=1, + relationship='Rel3', + widget=ReferenceBrowserWidget( + allow_search=1, + allow_browse=0, + force_close_on_insert=1, + show_indexes=1, + available_indexes={'SearchableText':'Free text search', + 'Description': "Object's description"}, + description='And here is another field.')), + + ReferenceField('multiRef3', + multiValued=1, + relationship='Rel3', + widget=ReferenceBrowserWidget( + show_indexes=1, + description='And here is another field.', + startup_directory='/Members')), + + ReferenceField('multiRef4', + multiValued=1, + relationship='Rel4', + widget=ReferenceBrowserWidget( + show_indexes=1, + allow_browse=0, + description=('And here is another field with a fixed query ' + 'restriction (only published objects will appear).'), + base_query={'review_state':'published'})), + + ReferenceField('multiRef5', + multiValued=1, + relationship='Rel5', + widget=ReferenceBrowserWidget( + show_indexes=1, + allow_browse=0, + description=('And here is another field with some dynamic ' + 'query restrictions (only objects with "start" ' + 'withing one week of the current date will appear).'), + base_query='dynamicBaseQuery')), + )) + +class RefBrowserDemo(BaseContent): + """ + Demo from archetypes.referencebrowserwidget + """ + content_icon = "document_icon.gif" + schema = schema + + def dynamicBaseQuery(self): + """ This example function generates a base query which ensures that + only objects whose start property is within one week of the + current day + """ + current_week = [DateTime()-7,DateTime()+7] + return {'start': {'query':current_week, 'range':'minmax'}} + +registerType(RefBrowserDemo, PROJECTNAME) Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/interfaces.py ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/interfaces.py Fri Sep 26 12:02:43 2008 @@ -0,0 +1,22 @@ + +from zope.interface import Interface +from Products.Archetypes.interfaces import IObjectField + +class IFieldRelation(Interface): + """ """ + + +class IATReferenceField(IObjectField): + """ Missing marker for Products.Archetypes.Fiele.ReferenceField """ + +class IATBackRefereneceField(IObjectField): + """ Missing marker for Products.ATBackRef.BackReferenceField """ + + +class IPloneRelationsRefField(IObjectField): + """ Missing marker for plone.relations.PloneRelationsATField """ + +class IPloneRelationsRevRefField(IObjectField): + """ Missing marker for plone.relations.ReversePloneRelationsATField """ + + Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/import_steps.xml ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/import_steps.xml Fri Sep 26 12:02:43 2008 @@ -0,0 +1,14 @@ +<?xml version="1.0"?> +<import-steps> + + <import-step + id="referencebrowser_various" + version="20080924-01" + handler="archetypes.referencebrowserwidget.setuphandlers.setupVarious" + title="archetypes.referencebrowserwidget: miscellaneous import steps"> + <dependency step="typeinfo"/> + Various import steps that are not handled by GS import/export + handlers. + </import-step> + +</import-steps> Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/import_various_refbrowser.txt ============================================================================== Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/metadata.xml ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/metadata.xml Fri Sep 26 12:02:43 2008 @@ -0,0 +1,4 @@ +<?xml version="1.0"?> +<metadata> + <version>1.0</version> +</metadata> Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/skins.xml ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/default/skins.xml Fri Sep 26 12:02:43 2008 @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<object name="portal_skins"> + <object + name="referencebrowser" + meta_type="Filesystem Directory View" + directory="archetypes.referencebrowserwidget:skins/referencebrowser" /> + <skin-path name="*"> + <layer + name="referencebrowser" + insert-after="custom" /> + </skin-path> +</object> Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/sample_types/archetype_tool.xml ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/sample_types/archetype_tool.xml Fri Sep 26 12:02:43 2008 @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<archetypetool> + <catalogmap> + <type portal_type="RefBrowserDemo"> + <catalog value="portal_catalog" /> + </type> + </catalogmap> +</archetypetool> Added: MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/sample_types/types.xml ============================================================================== --- (empty file) +++ MoreFieldsAndWidgets/archetypes.referencebrowserwidget/trunk/src/archetypes/referencebrowserwidget/profiles/... [truncated message content] |