src/pyams_i18n/schema.py
changeset 2 a44a73ee12f9
child 9 017ad36cc2ba
--- /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)