src/pyams_i18n/schema.py
changeset 47 3a4769b6dbcd
parent 42 a024de987b59
child 51 2be95c766ed0
equal deleted inserted replaced
46:e34a8c7760ea 47:3a4769b6dbcd
    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):