Ejemplo n.º 1
0
    def dump_record(record):
        """Dump a single record."""
        rec = E.record()

        leader = record.get("leader")
        if leader:
            rec.append(E.leader(leader))

        if isinstance(record, GroupableOrderedDict):
            items = record.iteritems(with_order=False, repeated=True)
        else:
            items = iteritems(record)

        for df, subfields in items:
            # Control fields
            if len(df) == 3:
                if isinstance(subfields, string_types):
                    controlfield = E.controlfield(subfields)
                    controlfield.attrib["tag"] = df[0:3]
                    rec.append(controlfield)
                elif isinstance(subfields, (list, tuple, set)):
                    for subfield in subfields:
                        controlfield = E.controlfield(subfield)
                        controlfield.attrib["tag"] = df[0:3]
                        rec.append(controlfield)
            else:
                # Skip leader.
                if df == "leader":
                    continue

                if not isinstance(subfields, (list, tuple, set)):
                    subfields = (subfields, )

                df = df.replace("_", " ")
                for subfield in subfields:
                    if not isinstance(subfield, (list, tuple, set)):
                        subfield = [subfield]

                    for s in subfield:
                        datafield = E.datafield()
                        datafield.attrib["tag"] = df[0:3]
                        datafield.attrib["ind1"] = df[3]
                        datafield.attrib["ind2"] = df[4]

                        if isinstance(s, GroupableOrderedDict):
                            items = s.iteritems(with_order=False,
                                                repeated=True)
                        elif isinstance(s, dict):
                            items = iteritems(s)
                        else:
                            datafield.append(E.subfield(s))

                            items = tuple()

                        for code, value in items:
                            if not isinstance(value, string_types):
                                for v in value:
                                    datafield.append(E.subfield(v, code=code))
                            else:
                                datafield.append(E.subfield(value, code=code))

                        rec.append(datafield)
        return rec
Ejemplo n.º 2
0
        def dump_record(record):
            """Dump a single record."""
            rec_element = ElementMaker(namespace=self.MARC21_NS,
                                       nsmap={prefix: self.MARC21_NS})
            rec = element.record()
            rec.append(element.recordPacking('xml'))
            rec.append(element.recordSchema('marcxml'))
            rec_record_data = element.recordData()

            rec_data = rec_element.record()
            rec_data.attrib['xmlns'] = self.MARC21_NS
            rec_data.attrib['type'] = "Bibliographic"

            leader = record.get('leader')
            if leader:
                rec_data.append(element.leader(leader))

            if isinstance(record, GroupableOrderedDict):
                items = record.iteritems(with_order=False, repeated=True)
            else:
                items = iteritems(record)

            for df, subfields in items:
                # Control fields
                if len(df) == 3:
                    if isinstance(subfields, string_types):
                        controlfield = element.controlfield(subfields)
                        controlfield.attrib['tag'] = df[0:3]
                        rec_data.append(controlfield)
                    elif isinstance(subfields, (list, tuple, set)):
                        for subfield in subfields:
                            controlfield = element.controlfield(subfield)
                            controlfield.attrib['tag'] = df[0:3]
                            rec_data.append(controlfield)
                else:
                    # Skip leader.
                    if df == 'leader':
                        continue

                    if not isinstance(subfields, (list, tuple, set)):
                        subfields = (subfields, )

                    df = df.replace('_', ' ')
                    for subfield in subfields:
                        if not isinstance(subfield, (list, tuple, set)):
                            subfield = [subfield]

                        for s in subfield:
                            datafield = element.datafield()
                            datafield.attrib['tag'] = df[0:3]
                            datafield.attrib['ind1'] = df[3]
                            datafield.attrib['ind2'] = df[4]

                            if isinstance(s, GroupableOrderedDict):
                                items = s.iteritems(with_order=False,
                                                    repeated=True)
                            elif isinstance(s, dict):
                                items = iteritems(s)
                            else:
                                datafield.append(element.subfield(s))

                                items = tuple()

                            for code, value in items:
                                if not isinstance(value, string_types):
                                    if value:
                                        for v in value:
                                            datafield.append(
                                                element.subfield(v, code=code))
                                else:
                                    datafield.append(
                                        element.subfield(value, code=code))

                            rec_data.append(datafield)
                rec_record_data.append(rec_data)
                rec.append(rec_record_data)
            return rec
Ejemplo n.º 3
0
Archivo: model.py Proyecto: N03/invenio
    def do(self, blob, ignore_missing=True, exception_handlers=None):
        """Translate blob values and instantiate new model instance.

        Takes out the indicators, if any, from the returned dictionary and puts
        them into the key.

        :param blob: ``dict``-like object on which the matching rules are
                     going to be applied.
        :param ignore_missing: Set to ``False`` if you prefer to raise
                               an exception ``MissingRule`` for the first
                               key that it is not matching any rule.
        :param exception_handlers: Give custom exception handlers to take care
                                   of non-standard names that are installation
                                   specific.

        .. versionadded:: 1.0.0

           ``ignore_missing`` allows to specify if the function should raise
           an exception.

        .. versionadded:: 1.1.0

           ``exception_handlers`` allows unknown keys to treated in a custom
           fashion.
        """
        handlers = {IgnoreKey: None}
        handlers.update(exception_handlers or {})

        if ignore_missing:
            handlers.setdefault(MissingRule, None)

        output = []

        if self.index is None:
            self.build()

        if '__order__' in blob and not isinstance(blob, GroupableOrderedDict):
            blob = GroupableOrderedDict(blob)

        if '__order__' in blob:
            items = blob.iteritems(repeated=True)
        else:
            items = iteritems(blob)

        for key, value in items:
            try:
                result = self.index.query(key)
                if not result:
                    raise MissingRule(key)

                name, creator = result
                item = creator(output, key, value)
                if isinstance(item, MutableMapping):
                    field = '{0}{1}{2}'.format(name, item.pop('$ind1', '_'),
                                               item.pop('$ind2', '_'))
                    if '__order__' in item:
                        item = GroupableOrderedDict(item)
                    output.append((field, item))
                elif isinstance(item, MutableSequence):
                    for v in item:
                        try:
                            field = '{0}{1}{2}'.format(name,
                                                       v.pop('$ind1', '_'),
                                                       v.pop('$ind2', '_'))
                        except AttributeError:
                            field = name
                        output.append((field, v))
                else:
                    output.append((name, item))
            except Exception as exc:
                if exc.__class__ in handlers:
                    handler = handlers[exc.__class__]
                    if handler is not None:
                        handler(exc, output, key, value)
                else:
                    raise

        return GroupableOrderedDict(output)
Ejemplo n.º 4
0
    def do(
        self,
        blob,
        ignore_missing=True,
        exception_handlers=None,
        init_fields=None,
    ):
        """Translate blob values and instantiate new model instance.

        Raises ``MissingRule`` when no rule matched and ``ignore_missing``
        is ``False``.

        :param blob: ``dict``-like object on which the matching rules are
                     going to be applied.
        :param ignore_missing: Set to ``False`` if you prefer to raise
                               an exception ``MissingRule`` for the first
                               key that it is not matching any rule.
        :param exception_handlers: Give custom exception handlers to take care
                                   of non-standard codes that are installation
                                   specific.
        """
        handlers = {IgnoreKey: None}
        handlers.update(exception_handlers or {})

        def clean_missing(exc, output, key, value, rectype=None):
            order = output.get("__order__")
            if order:
                order.remove(key)

        if ignore_missing:
            handlers.setdefault(MissingRule, clean_missing)

        output = {}

        if init_fields:
            output.update(**init_fields)

        if self.index is None:
            self.build()

        if isinstance(blob, GroupableOrderedDict):
            items = blob.iteritems(repeated=True, with_order=False)
        else:
            items = iteritems(blob)

        for key, value in items:
            try:
                result = self.index.query(key)
                if not result:
                    raise MissingRule(key)

                name, creator = result
                data = creator(output, key, value)
                if getattr(creator, "__extend__", False):
                    existing = output.get(name, [])
                    existing.extend(data)
                    output[name] = existing
                else:
                    output[name] = data
            except Exception as exc:
                if exc.__class__ in handlers:
                    handler = handlers[exc.__class__]
                    if handler is not None:
                        handler(exc, output, key, value, rectype=self.rectype)
                else:
                    raise
        return output
Ejemplo n.º 5
0
    def dump_record(record):
        """Dump a single record."""
        rec = E.record()

        leader = record.get('leader')
        if leader:
            rec.append(E.leader(leader))

        if isinstance(record, GroupableOrderedDict):
            items = record.iteritems(with_order=False, repeated=True)
        else:
            items = iteritems(record)

        for df, subfields in items:
            # Control fields
            if len(df) == 3:
                if isinstance(subfields, string_types):
                    controlfield = E.controlfield(subfields)
                    controlfield.attrib['tag'] = df[0:3]
                    rec.append(controlfield)
                elif isinstance(subfields, (list, tuple, set)):
                    for subfield in subfields:
                        controlfield = E.controlfield(subfield)
                        controlfield.attrib['tag'] = df[0:3]
                        rec.append(controlfield)
            else:
                # Skip leader.
                if df == 'leader':
                    continue

                if not isinstance(subfields, (list, tuple, set)):
                    subfields = (subfields,)

                df = df.replace('_', ' ')
                for subfield in subfields:
                    if not isinstance(subfield, (list, tuple, set)):
                        subfield = [subfield]

                    for s in subfield:
                        datafield = E.datafield()
                        datafield.attrib['tag'] = df[0:3]
                        datafield.attrib['ind1'] = df[3]
                        datafield.attrib['ind2'] = df[4]

                        if isinstance(s, GroupableOrderedDict):
                            items = s.iteritems(with_order=False, repeated=True)
                        elif isinstance(s, dict):
                            items = iteritems(s)
                        else:
                            datafield.append(E.subfield(s))

                            items = tuple()

                        for code, value in items:
                            if not isinstance(value, string_types):
                                for v in value:
                                    datafield.append(E.subfield(v, code=code))
                            else:
                                datafield.append(E.subfield(value, code=code))

                        rec.append(datafield)
        return rec
Ejemplo n.º 6
0
    def do(self, blob, ignore_missing=True, exception_handlers=None):
        """Translate blob values and instantiate new model instance.

        Takes out the indicators, if any, from the returned dictionary and puts
        them into the key.

        :param blob: ``dict``-like object on which the matching rules are
                     going to be applied.
        :param ignore_missing: Set to ``False`` if you prefer to raise
                               an exception ``MissingRule`` for the first
                               key that it is not matching any rule.
        :param exception_handlers: Give custom exception handlers to take care
                                   of non-standard names that are installation
                                   specific.

        .. versionadded:: 1.0.0

           ``ignore_missing`` allows to specify if the function should raise
           an exception.

        .. versionadded:: 1.1.0

           ``exception_handlers`` allows unknown keys to treated in a custom
           fashion.
        """
        handlers = {IgnoreKey: None}
        handlers.update(exception_handlers or {})

        if ignore_missing:
            handlers.setdefault(MissingRule, None)

        output = []

        if self.index is None:
            self.build()

        if '__order__' in blob and not isinstance(blob, GroupableOrderedDict):
            blob = GroupableOrderedDict(blob)

        if '__order__' in blob:
            items = blob.iteritems(repeated=True)
        else:
            items = iteritems(blob)

        for key, value in items:
            try:
                result = self.index.query(key)
                if not result:
                    raise MissingRule(key)

                name, creator = result
                item = creator(output, key, value)
                if isinstance(item, MutableMapping):
                    field = '{0}{1}{2}'.format(
                        name, item.pop('$ind1', '_'),
                        item.pop('$ind2', '_'))
                    if '__order__' in item:
                        item = GroupableOrderedDict(item)
                    output.append((field, item))
                elif isinstance(item, MutableSequence):
                    for v in item:
                        try:
                            field = '{0}{1}{2}'.format(
                                name, v.pop('$ind1', '_'),
                                v.pop('$ind2', '_'))
                        except AttributeError:
                            field = name
                        output.append((field, v))
                else:
                    output.append((name, item))
            except Exception as exc:
                if exc.__class__ in handlers:
                    handler = handlers[exc.__class__]
                    if handler is not None:
                        handler(exc, output, key, value)
                else:
                    raise

        return GroupableOrderedDict(output)