--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_i18n/schema.py Fri Mar 20 17:28:43 2015 +0100
@@ -0,0 +1,136 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_i18n.interfaces.schema import II18nField, II18nTextLineField, II18nTextField, II18nFileField, II18nImageField, \
+ II18nThumbnailImageField
+from zope.schema.interfaces import RequiredMissing
+
+# import packages
+from persistent.mapping import PersistentMapping
+from pyams_file.schema import FileField, ImageField, ThumbnailImageField
+from zope.interface import implementer
+from zope.schema import Dict, TextLine, Text
+
+
+_marker = object()
+
+
+class DefaultValueDict(PersistentMapping):
+ """Persistent mapping with default value"""
+
+ def __init__(self, default=None, *args, **kwargs):
+ super(DefaultValueDict, self).__init__(*args, **kwargs)
+ self._default = default
+
+ def __missing__(self, key):
+ return self._default
+
+ def get(self, key, default=None):
+ result = super(DefaultValueDict, self).get(key, _marker)
+ if result is _marker:
+ if default is not None:
+ return default
+ else:
+ return self._default
+ else:
+ return result
+
+ def copy(self):
+ return DefaultValueDict(default=self._default, **self)
+
+
+@implementer(II18nField)
+class I18nField(Dict):
+ """I18n base field class"""
+
+ def __init__(self, key_type=None, value_type=None, **kwargs):
+ # DefaultValueDict.__init__(self, default)
+ Dict.__init__(self, key_type=TextLine(), value_type=value_type, **kwargs)
+
+ def _validate(self, value):
+ super(I18nField, self)._validate(value)
+ if self.required:
+ if self.default:
+ return
+ if not value:
+ raise RequiredMissing
+ for lang in value.values():
+ if lang:
+ return
+ raise RequiredMissing
+
+
+@implementer(II18nTextLineField)
+class I18nTextLineField(I18nField):
+ """I18n text line field"""
+
+ def __init__(self, key_type=None, value_type=None, default=None,
+ value_constraint=None, value_min_length=0, value_max_length=None, **kwargs):
+ super(I18nTextLineField, self).__init__(value_type=TextLine(constraint=value_constraint,
+ min_length=value_min_length,
+ max_length=value_max_length,
+ default=default,
+ required=False),
+ **kwargs)
+
+
+@implementer(II18nTextField)
+class I18nTextField(I18nField):
+ """I18n text field"""
+
+ def __init__(self, key_type=None, value_type=None, default=None,
+ value_constraint=None, value_min_length=0, value_max_length=None, **kwargs):
+ super(I18nTextField, self).__init__(value_type=Text(constraint=value_constraint,
+ min_length=value_min_length,
+ max_length=value_max_length,
+ default=default,
+ required=False),
+ **kwargs)
+
+
+@implementer(II18nFileField)
+class I18nFileField(I18nField):
+ """I18n file field"""
+
+ def __init__(self, key_type=None, value_type=None, value_min_length=None, value_max_length=None, **kwargs):
+ super(I18nFileField, self).__init__(value_type=FileField(min_length=value_min_length,
+ max_length=value_max_length,
+ required=False),
+ **kwargs)
+
+
+@implementer(II18nImageField)
+class I18nImageField(I18nField):
+ """I18n image field"""
+
+ def __init__(self, key_type=None, value_type=None, value_min_length=None, value_max_length=None, **kwargs):
+ super(I18nImageField, self).__init__(value_type=ImageField(min_length=value_min_length,
+ max_length=value_max_length,
+ required=False),
+ **kwargs)
+
+
+@implementer(II18nThumbnailImageField)
+class I18nThumbnailImageField(I18nField):
+ """I18n thumbnail image field"""
+
+ def __init__(self, key_type=None, value_type=None, value_min_length=None, value_max_length=None, **kwargs):
+ super(I18nThumbnailImageField, self).__init__(value_type=ThumbnailImageField(min_length=value_min_length,
+ max_length=value_max_length,
+ required=False),
+ **kwargs)