17 |
17 |
18 # import interfaces |
18 # import interfaces |
19 from pyams_file.interfaces import DELETED_FILE |
19 from pyams_file.interfaces import DELETED_FILE |
20 from pyams_i18n.interfaces.schema import II18nField, II18nTextLineField, II18nTextField, II18nHTMLField, \ |
20 from pyams_i18n.interfaces.schema import II18nField, II18nTextLineField, II18nTextField, II18nHTMLField, \ |
21 II18nFileField, II18nMediaField, II18nImageField, II18nThumbnailImageField, II18nVideoField, II18nAudioField |
21 II18nFileField, II18nMediaField, II18nImageField, II18nThumbnailImageField, II18nVideoField, II18nAudioField |
22 from z3c.form.interfaces import NOT_CHANGED |
22 from z3c.form.interfaces import NOT_CHANGED, IDataManager |
23 from zope.schema.interfaces import RequiredMissing, WrongType |
23 from zope.schema.interfaces import RequiredMissing, WrongType |
24 |
24 |
25 # import packages |
25 # import packages |
26 from persistent.mapping import PersistentMapping |
26 from persistent.mapping import PersistentMapping |
27 from pyams_file.schema import FileField, MediaField, ImageField, ThumbnailImageField, VideoField, AudioField |
27 from pyams_file.schema import FileField, MediaField, ImageField, ThumbnailImageField, VideoField, AudioField |
28 from pyams_utils.schema import HTMLField |
28 from pyams_utils.schema import HTMLField |
|
29 from zope.component import getMultiAdapter |
29 from zope.interface import implementer |
30 from zope.interface import implementer |
30 from zope.schema import Dict, TextLine, Text |
31 from zope.schema import Dict, TextLine, Text |
31 |
32 |
32 |
33 |
33 _marker = object() |
34 _marker = object() |
134 if self.required: |
135 if self.required: |
135 if self.default: |
136 if self.default: |
136 return |
137 return |
137 if not value: |
138 if not value: |
138 raise RequiredMissing |
139 raise RequiredMissing |
139 for lang_value in value.values(): |
140 has_value = False |
140 if lang_value and (lang_value is not DELETED_FILE): |
141 for lang, lang_value in value.items(): |
|
142 # check for NOT_CHANGED value |
|
143 if lang_value is NOT_CHANGED: # check for empty file value |
|
144 adapter = getMultiAdapter((self.context, self), IDataManager) |
|
145 try: |
|
146 old_value = adapter.query() or {} |
|
147 except TypeError: # can't adapt field context => new content? |
|
148 old_value = None |
|
149 else: |
|
150 old_value = old_value.get(lang) |
|
151 has_value = has_value or bool(old_value) |
|
152 if has_value: |
|
153 break |
|
154 elif lang_value is not DELETED_FILE: |
|
155 has_value = True |
141 break |
156 break |
|
157 if not has_value: |
142 raise RequiredMissing |
158 raise RequiredMissing |
143 for lang_value in value.values(): |
159 for lang_value in value.values(): |
144 if (lang_value is NOT_CHANGED) or (lang_value is DELETED_FILE): |
160 if lang_value in (NOT_CHANGED, DELETED_FILE): |
145 return |
161 return |
146 elif isinstance(lang_value, tuple): |
162 elif isinstance(lang_value, tuple): |
147 try: |
163 try: |
148 filename, stream = lang_value |
164 filename, stream = lang_value |
149 if not isinstance(filename, str): |
165 if not isinstance(filename, str): |