From 22e8a10bf97c6bee54ec09a3dbdfb55913fb09b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 7 Jun 2011 21:56:13 +0200 Subject: [PATCH] initial commit --- .gitignore | 1 + setup.cfg | 3 + setup.py | 26 ++++++++ themis.fields.egg-info/PKG-INFO | 10 +++ themis.fields.egg-info/SOURCES.txt | 14 +++++ themis.fields.egg-info/dependency_links.txt | 1 + themis.fields.egg-info/entry_points.txt | 3 + themis.fields.egg-info/not-zip-safe | 1 + themis.fields.egg-info/top_level.txt | 1 + themisfields/__init__.py | 35 +++++++++++ themisfields/configure.zcml | 40 ++++++++++++ themisfields/editors.py | 10 +++ themisfields/editors.zcml | 10 +++ themisfields/handlers.py | 18 ++++++ themisfields/handlers.zcml | 12 ++++ themisfields/interfaces.py | 8 +++ themisfields/vocabs.py | 69 +++++++++++++++++++++ themisfields/widgets.py | 28 +++++++++ themisfields/widgets.zcml | 12 ++++ 19 files changed, 302 insertions(+) create mode 100644 .gitignore create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 themis.fields.egg-info/PKG-INFO create mode 100644 themis.fields.egg-info/SOURCES.txt create mode 100644 themis.fields.egg-info/dependency_links.txt create mode 100644 themis.fields.egg-info/entry_points.txt create mode 100644 themis.fields.egg-info/not-zip-safe create mode 100644 themis.fields.egg-info/top_level.txt create mode 100644 themisfields/__init__.py create mode 100644 themisfields/configure.zcml create mode 100644 themisfields/editors.py create mode 100644 themisfields/editors.zcml create mode 100644 themisfields/handlers.py create mode 100644 themisfields/handlers.zcml create mode 100644 themisfields/interfaces.py create mode 100644 themisfields/vocabs.py create mode 100644 themisfields/widgets.py create mode 100644 themisfields/widgets.zcml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..01bb954 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,3 @@ +[egg_info] +tag_build = dev +tag_svn_revision = true diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..c2a27ca --- /dev/null +++ b/setup.py @@ -0,0 +1,26 @@ +from setuptools import setup, find_packages +import sys, os + +version = '0.1' + +setup(name='themis.fields', + version=version, + description="", + long_description="""\ +""", + classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers + keywords='', + author="Entr'ouvert", + author_email='', + url='', + license='AGPL', + packages=find_packages(exclude=['ez_setup', 'examples', 'tests']), + include_package_data=True, + zip_safe=False, + install_requires=[ + # -*- Extra requirements: -*- + ], + entry_points=""" + # -*- Entry points: -*- + """, + ) diff --git a/themis.fields.egg-info/PKG-INFO b/themis.fields.egg-info/PKG-INFO new file mode 100644 index 0000000..306f4a3 --- /dev/null +++ b/themis.fields.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: themis.fields +Version: 0.1dev +Summary: UNKNOWN +Home-page: UNKNOWN +Author: Entr'ouvert +Author-email: UNKNOWN +License: AGPL +Description: UNKNOWN +Platform: UNKNOWN diff --git a/themis.fields.egg-info/SOURCES.txt b/themis.fields.egg-info/SOURCES.txt new file mode 100644 index 0000000..3ea6a13 --- /dev/null +++ b/themis.fields.egg-info/SOURCES.txt @@ -0,0 +1,14 @@ +setup.cfg +setup.py +themis.fields.egg-info/PKG-INFO +themis.fields.egg-info/SOURCES.txt +themis.fields.egg-info/dependency_links.txt +themis.fields.egg-info/entry_points.txt +themis.fields.egg-info/not-zip-safe +themis.fields.egg-info/top_level.txt +themisfields/__init__.py +themisfields/editor.py +themisfields/handler.py +themisfields/interfaces.py +themisfields/value.py +themisfields/widget.py \ No newline at end of file diff --git a/themis.fields.egg-info/dependency_links.txt b/themis.fields.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/themis.fields.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/themis.fields.egg-info/entry_points.txt b/themis.fields.egg-info/entry_points.txt new file mode 100644 index 0000000..5d3e5f6 --- /dev/null +++ b/themis.fields.egg-info/entry_points.txt @@ -0,0 +1,3 @@ + + # -*- Entry points: -*- + \ No newline at end of file diff --git a/themis.fields.egg-info/not-zip-safe b/themis.fields.egg-info/not-zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/themis.fields.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/themis.fields.egg-info/top_level.txt b/themis.fields.egg-info/top_level.txt new file mode 100644 index 0000000..9c48c49 --- /dev/null +++ b/themis.fields.egg-info/top_level.txt @@ -0,0 +1 @@ +themisfields diff --git a/themisfields/__init__.py b/themisfields/__init__.py new file mode 100644 index 0000000..8c0e13f --- /dev/null +++ b/themisfields/__init__.py @@ -0,0 +1,35 @@ +from zope.interface import implements +from zope.schema import Choice, Field + +from zope.schema.interfaces import IFromUnicode +from zope.schema.interfaces import WrongType + +from themisfields.interfaces import ICommission +from themisfields.vocabs import CommissionsSource + + +class Commission(Field): + implements(ICommission, IFromUnicode) + + def __init__(self, **kw): + self.vocabulary = CommissionsSource + super(Commission, self).__init__(**kw) + + source = property(lambda self: self.vocabulary) + + def bind(self, object): + """See zope.schema._bootstrapinterfaces.IField.""" + clone = super(Commission, self).bind(object) + clone.vocabulary = self.vocabulary(object) + return clone + + def _validate(self, value): + super(Commission, self)._validate(value) + vocabulary = self.vocabulary + if value not in vocabulary: + raise ConstraintNotSatisfied(value) + + def fromUnicode(self, str): + self.validate(str) + return str + diff --git a/themisfields/configure.zcml b/themisfields/configure.zcml new file mode 100644 index 0000000..bf2fdb7 --- /dev/null +++ b/themisfields/configure.zcml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + diff --git a/themisfields/editors.py b/themisfields/editors.py new file mode 100644 index 0000000..d948955 --- /dev/null +++ b/themisfields/editors.py @@ -0,0 +1,10 @@ +from zope.schema import interfaces as schema_ifaces + +from themisfields import interfaces +from themisfields import Commission +from plone.schemaeditor.fields import FieldFactory + +class ICommission(interfaces.ICommission, schema_ifaces.IFromUnicode): + pass + +CommissionFactory = FieldFactory(Commission, u'Commission') diff --git a/themisfields/editors.zcml b/themisfields/editors.zcml new file mode 100644 index 0000000..db09191 --- /dev/null +++ b/themisfields/editors.zcml @@ -0,0 +1,10 @@ + + + + + diff --git a/themisfields/handlers.py b/themisfields/handlers.py new file mode 100644 index 0000000..3908d9f --- /dev/null +++ b/themisfields/handlers.py @@ -0,0 +1,18 @@ +try: + from plone.supermodel.exportimport import BaseHandler, ChoiceHandler + HAVE_SUPERMODEL = True +except ImportError: + HAVE_SUPERMODEL = False + +if HAVE_SUPERMODEL: + + from zope.interface import implements + from zope.component import adapts + from themisfields import Commission + from plone.supermodel.interfaces import IToUnicode + from themisfields.interfaces import ICommission + + class CommissionHandler_(BaseHandler): + pass + + CommissionHandler = CommissionHandler_(Commission) diff --git a/themisfields/handlers.zcml b/themisfields/handlers.zcml new file mode 100644 index 0000000..0f4adf0 --- /dev/null +++ b/themisfields/handlers.zcml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/themisfields/interfaces.py b/themisfields/interfaces.py new file mode 100644 index 0000000..f9c0761 --- /dev/null +++ b/themisfields/interfaces.py @@ -0,0 +1,8 @@ +from zope.interface import Interface + +from zope.schema.interfaces import IChoice, IField +from zope import schema + +class ICommission(IField): + '''Field containing a unicode string without newlines that is a commission.''' + diff --git a/themisfields/vocabs.py b/themisfields/vocabs.py new file mode 100644 index 0000000..0fb108f --- /dev/null +++ b/themisfields/vocabs.py @@ -0,0 +1,69 @@ +from zope.browser.interfaces import ITerms +from zope.interface import implements, classProvides +from zope.schema.interfaces import ISource, IContextSourceBinder + +from zope.app.form.browser.interfaces import ISourceQueryView + +from zope.schema.interfaces import IVocabularyFactory +from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm + +class CommissionsSource(object): + implements(ISource) + classProvides(IContextSourceBinder) + + def __init__(self, context=None): + self.terms = ['pomme', 'poire', 'peche', 'abricot'] + + def __contains__(self, value): + if self.get(value) is None: + return False + return True + + def search(self, query): + return [SimpleTerm(x, x, x) for x in self.terms if x.startswith(query)] + + def get(self, value): + if value in self.terms: + return value + return None + +class CommissionsSourceQueryView(object): + implements(ITerms, ISourceQueryView) + + def __init__(self, context, request): + self.context = context + self.request = request + + def getTerm(self, value): + commission = self.context.get(value) + token = value + title = value + return SimpleTerm(value, token=user, title=user) + + def getValue(self, token): + if token not in self.context: + raise LookupError(token) + return token + + def render(self, name): + return name + + def results(self, name): + # check whether the normal search button was pressed + if name+".search" in self.request.form: + query_fieldname = name+".query" + if query_fieldname in self.request.form: + query = self.request.form[query_fieldname] + if query != '': + return self.context.search(query) + + + +#class CommissionsVocabulary(object): +# implements(IVocabularyFactory) +# +# def __call__(self, context): +# terms = [SimpleVocabulary.createTerm(x, x, x) for x in ['pomme', 'poire', 'peche', 'abricot']] +# return SimpleVocabulary(terms) +# +#CommissionsVocabularyFactory = CommissionsVocabulary() diff --git a/themisfields/widgets.py b/themisfields/widgets.py new file mode 100644 index 0000000..1aa25bc --- /dev/null +++ b/themisfields/widgets.py @@ -0,0 +1,28 @@ +from Acquisition import ImplicitAcquisitionWrapper + +from zope.interface import implementsOnly, implementer +from zope.component import adapts, adapter + +from z3c.form.interfaces import IFormLayer, IFieldWidget +from z3c.form.widget import FieldWidget + +from themisfields.interfaces import ICommission + +from plone.formwidget.autocomplete.interfaces import IAutocompleteWidget +from plone.formwidget.autocomplete.widget import AutocompleteSelectionWidget +from plone.formwidget.autocomplete import AutocompleteFieldWidget + +class ICommissionWidget(IAutocompleteWidget): + pass + +class CommissionWidget(AutocompleteSelectionWidget): + implementsOnly(ICommissionWidget) + klass = u'commissionWidget' + + +@adapter(ICommission, IFormLayer) +@implementer(IFieldWidget) +def CommissionFieldWidget(field, request): + """IFieldWidget factory for CommissionWidget.""" + return FieldWidget(field, AutocompleteSelectionWidget(request)) + diff --git a/themisfields/widgets.zcml b/themisfields/widgets.zcml new file mode 100644 index 0000000..b080588 --- /dev/null +++ b/themisfields/widgets.zcml @@ -0,0 +1,12 @@ + + + + + + + +