Пример #1
0
def iterFields(ob):
    # noinspection PyUnresolvedReferences
    ob = Acquisition.aq_base(ob)
    primary = ob.getPrimaryField()
    if primary:
        clone = cloneField(primary, primary=True)
        yield clone.__name__, clone

    for name in ob.schema.getSchemataNames():
        for field in ob.schema.getSchemataFields(name):
            if primary and primary.__name__ == field.__name__:
                continue

            # Mark 'primary fields', which get marshaled into payload
            if (bool(getattr(field, 'primary', None)) is True
                    or IBlobField.providedBy(field)
                    or (IFileField.providedBy(field)
                        and not ITextField.providedBy(field))
                    or getattr(field, 'widget', None) == RichWidget
                    or isinstance(field, ZPTField)):
                clone = cloneField(field, primary=True)
            else:
                clone = cloneField(field, primary=False)

            yield clone.__name__, clone
Пример #2
0
 def _ce_fields(self):
     ce_fields = [
         field for field in self.context.schema.fields()
         if (IStringField.providedBy(field) or ITextField.providedBy(field))
         and field.schemata == 'default' and field.getName() != 'id'
     ]
     return ce_fields
Пример #3
0
def iterFields(ob):
    # noinspection PyUnresolvedReferences
    ob = Acquisition.aq_base(ob)
    primary = ob.getPrimaryField()
    if primary:
        clone = cloneField(primary, primary=True)
        yield clone.__name__, clone

    for name in ob.schema.getSchemataNames():
        for field in ob.schema.getSchemataFields(name):
            if primary and primary.__name__ == field.__name__:
                continue

            # Mark 'primary fields', which get marshaled into payload
            if (bool(getattr(field, 'primary', None)) is True
                    or IBlobField.providedBy(field)
                    or (IFileField.providedBy(field)
                        and not ITextField.providedBy(field))
                    or getattr(field, 'widget', None) == RichWidget
                    or isinstance(field, ZPTField)):
                clone = cloneField(field, primary=True)
            else:
                clone = cloneField(field, primary=False)

            yield clone.__name__, clone
Пример #4
0
 def _getTextFields(self, obj):
     # Get all text fields, except ones that are handled separately.
     text_fields = []
     if getattr(aq_base(obj), 'Schema', None):
         # Archetypes
         for field in obj.Schema().values():
             if field.__name__ in CUSTOM_HANDLED_TEXT_FIELDS:
                 continue
             if not ITextField.providedBy(field):
                 continue
             text_fields.append(field)
     elif HAS_DEXTERITY:
         # Dexterity
         for schemata in iterSchemata(obj):
             fields = getFieldsInOrder(schemata)
             for name, field in fields:
                 if name in CUSTOM_HANDLED_TEXT_FIELDS:
                     continue
                 if IRichText.providedBy(field):
                     text_fields.append(field)
                     continue
                 # ITextLine inherits from IText.
                 # We want to replace in texts, but not textlines.
                 # Maybe this can be made configurable.
                 if ITextLine.providedBy(field):
                     continue
                 if not IText.providedBy(field):
                     continue
                 text_fields.append(field)
     return text_fields
 def _ce_fields(self):
     ce_fields = [field
                  for field in self.context.schema.fields()
                  if (IStringField.providedBy(field)
                      or ITextField.providedBy(field))
                     and field.schemata=='default'
                     and field.getName()!='id']
     return ce_fields
Пример #6
0
 def fieldFilter(field):
     return (
         (
             IBlobField.providedBy(field) or
             IFileField.providedBy(field) or
             IImageField.providedBy(field)
         ) and
         not ITextField.providedBy(field)
     )
Пример #7
0
    def _expand_binary_data(self, obj, data):
        max_size = es_config.max_blobsize
        is_archetype = False
        if HAS_ARCHETYPES and IBaseContent.providedBy(obj):
            is_archetype = True
            schema = obj.Schema()
        for fieldname in self._iterate_binary_fields(obj, data):
            if fieldname not in data:
                data[fieldname] = None
                continue
            if is_archetype:
                field = schema[fieldname]
                value = field.get(obj)
                if value is None:
                    data[fieldname] = None
                    continue
                data[fieldname + '_meta'] = data[fieldname]
                if IBlobWrapper.providedBy(value):
                    if max_size and value.get_size() > max_size:
                        data[fieldname] = None
                        del data[fieldname + '_meta']
                        msg = 'File too big for ElasticSearch Indexing: {0}'
                        logger.info(msg.format(obj.absolute_url(), ), )
                        continue

                    with value.getBlob().open() as fh:
                        data[fieldname] = base64.b64encode(fh.read())
                elif ITextField.providedBy(field):
                    data[fieldname] = base64.b64encode(
                        data[fieldname + '_meta']['data'].encode('utf8'))
            else:
                field = getattr(obj, fieldname, None)
                if field is None:
                    data[fieldname] = None
                    continue
                data[fieldname + '_meta'] = data[fieldname]
                if IBlobby.providedBy(field):
                    if max_size and field.getSize() > max_size:
                        data[fieldname] = None
                        del data[fieldname + '_meta']
                        msg = 'File too big for ElasticSearch Indexing: {0}'
                        logger.info(msg.format(obj.absolute_url(), ), )
                        continue
                    with field.open() as fh:
                        data[fieldname] = base64.b64encode(fh.read())
                elif IRichTextValue.providedBy(field):
                    data[fieldname] = base64.b64encode(
                        data[fieldname + '_meta']['data'].encode('utf8'), )
            if max_size and len(data[fieldname]) > max_size:
                data[fieldname] = None
                del data[fieldname + '_meta']
                logger.info(
                    'File too big for ElasticSearch Indexing: {0}'.format(
                        obj.absolute_url(), ), )
def getTextFields(obj):
    include_textline_fields = settings().include_textline_fields
    include_lines_fields = settings().include_lines_fields
    text_fields = []
    if HAS_ARCHETYPES and getattr(aq_base(obj), "Schema", None):
        # Archetypes
        for field in obj.Schema().values():
            if field.__name__ in CUSTOM_HANDLED_TEXT_FIELDS:
                continue
            if include_textline_fields and IStringField.providedBy(field):
                text_fields.append(field)
                continue
            if ITextField.providedBy(field):
                text_fields.append(field)
            if include_lines_fields and ILinesField.providedBy(field):
                text_fields.append(field)
    elif HAS_DEXTERITY:
        # Dexterity
        for schemata in iterSchemata(obj):
            fields = getFieldsInOrder(schemata)
            for name, field in fields:
                if name in CUSTOM_HANDLED_TEXT_FIELDS:
                    continue
                if IRichText.providedBy(field):
                    text_fields.append(field)
                    continue
                # ITextLine inherits from IText.
                # That we want to replace in texts, but not textlines
                # is by configuration.
                if not include_textline_fields and ITextLine.providedBy(field):
                    continue
                if IText.providedBy(field):
                    text_fields.append(field)
                if (include_lines_fields and ITuple.providedBy(field)
                        and ITextLine.providedBy(field.value_type)):
                    text_fields.append(field)
    return text_fields
Пример #9
0
 def fieldFilter(field):
     return ((IBlobField.providedBy(field)
              or IFileField.providedBy(field)
              or IImageField.providedBy(field))
             and not ITextField.providedBy(field))